复核查询详情修改
This commit is contained in:
+254
-70
@@ -20,16 +20,19 @@ import com.mhd.wms.domain.reviewOrder.repository.mapper.ReviewOrderMapper;
|
|||||||
import com.mhd.wms.domain.reviewOrder.repository.po.ReviewMaterialDetailPO;
|
import com.mhd.wms.domain.reviewOrder.repository.po.ReviewMaterialDetailPO;
|
||||||
import com.mhd.wms.domain.reviewOrder.repository.po.ReviewOrderPO;
|
import com.mhd.wms.domain.reviewOrder.repository.po.ReviewOrderPO;
|
||||||
import com.mhd.wms.domain.reviewOrder.repository.todo.ReviewOrderDO;
|
import com.mhd.wms.domain.reviewOrder.repository.todo.ReviewOrderDO;
|
||||||
import com.mhd.wms.interfaces.dto.reviewOrder.ReviewOrderDetailDTO;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
import org.springframework.transaction.annotation.Transactional;
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
import org.springframework.util.CollectionUtils;
|
import org.springframework.util.CollectionUtils;
|
||||||
|
|
||||||
|
import java.lang.reflect.Field;
|
||||||
import java.math.BigDecimal;
|
import java.math.BigDecimal;
|
||||||
|
import java.text.SimpleDateFormat;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
|
import java.util.HashSet;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
@@ -38,6 +41,7 @@ import java.util.stream.Collectors;
|
|||||||
/**
|
/**
|
||||||
* 复核单应用服务:列表、详情
|
* 复核单应用服务:列表、详情
|
||||||
*/
|
*/
|
||||||
|
@Slf4j
|
||||||
@Service
|
@Service
|
||||||
public class ReviewOrderApplicationService {
|
public class ReviewOrderApplicationService {
|
||||||
|
|
||||||
@@ -64,7 +68,7 @@ public class ReviewOrderApplicationService {
|
|||||||
return reviewOrderMapper.queryList(query);
|
return reviewOrderMapper.queryList(query);
|
||||||
}
|
}
|
||||||
|
|
||||||
public ReviewOrderDetailDTO getDetailByReviewOrderId(Long reviewOrderId) {
|
public ReviewOrderPO getDetailByReviewOrderId(Long reviewOrderId) {
|
||||||
if (reviewOrderId == null) {
|
if (reviewOrderId == null) {
|
||||||
throw new ServiceException("复核单ID不能为空");
|
throw new ServiceException("复核单ID不能为空");
|
||||||
}
|
}
|
||||||
@@ -73,14 +77,14 @@ public class ReviewOrderApplicationService {
|
|||||||
throw new ServiceException("复核单不存在或已删除");
|
throw new ServiceException("复核单不存在或已删除");
|
||||||
}
|
}
|
||||||
List<ReviewMaterialDetailPO> details = reviewOrderMapper.queryDetailByReviewOrderId(reviewOrderId);
|
List<ReviewMaterialDetailPO> details = reviewOrderMapper.queryDetailByReviewOrderId(reviewOrderId);
|
||||||
fillDynamicBatchDisplayFields(details);
|
Map<Long, List<BatchDetailFeignPO>> batchDetailMap = loadDisplayBatchDetailMap(details);
|
||||||
ReviewOrderDetailDTO result = new ReviewOrderDetailDTO();
|
fillDynamicBatchDisplayFields(details, batchDetailMap);
|
||||||
result.setHeader(header);
|
buildReviewMaterialMoreDetailListLikeShelf(details, batchDetailMap);
|
||||||
result.setDetails(details);
|
header.setMaterialDetailList(details);
|
||||||
return result;
|
return header;
|
||||||
}
|
}
|
||||||
|
|
||||||
public ReviewOrderDetailDTO getDetailByReviewOrderNumber(String reviewOrderNumber) {
|
public ReviewOrderPO getDetailByReviewOrderNumber(String reviewOrderNumber) {
|
||||||
if (StringUtils.isEmpty(reviewOrderNumber)) {
|
if (StringUtils.isEmpty(reviewOrderNumber)) {
|
||||||
throw new ServiceException("复核单号不能为空");
|
throw new ServiceException("复核单号不能为空");
|
||||||
}
|
}
|
||||||
@@ -89,11 +93,11 @@ public class ReviewOrderApplicationService {
|
|||||||
throw new ServiceException("复核单不存在或已删除");
|
throw new ServiceException("复核单不存在或已删除");
|
||||||
}
|
}
|
||||||
List<ReviewMaterialDetailPO> details = reviewOrderMapper.queryDetailByReviewOrderNumber(reviewOrderNumber);
|
List<ReviewMaterialDetailPO> details = reviewOrderMapper.queryDetailByReviewOrderNumber(reviewOrderNumber);
|
||||||
fillDynamicBatchDisplayFields(details);
|
Map<Long, List<BatchDetailFeignPO>> batchDetailMap = loadDisplayBatchDetailMap(details);
|
||||||
ReviewOrderDetailDTO result = new ReviewOrderDetailDTO();
|
fillDynamicBatchDisplayFields(details, batchDetailMap);
|
||||||
result.setHeader(header);
|
buildReviewMaterialMoreDetailListLikeShelf(details, batchDetailMap);
|
||||||
result.setDetails(details);
|
header.setMaterialDetailList(details);
|
||||||
return result;
|
return header;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Transactional(rollbackFor = Exception.class)
|
@Transactional(rollbackFor = Exception.class)
|
||||||
@@ -266,22 +270,17 @@ public class ReviewOrderApplicationService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 复核单详情:动态批次属性反显(参考收货详情)
|
* 批次配置(isDisplay=1),上架单详情同款缓存。
|
||||||
* - 批次管理维护 isDisplay=1 的属性才参与显示
|
|
||||||
* - 每行按 outUniqueId 作为 material_detail_unique_id 去 material_more_detail 取 attribute_value
|
|
||||||
* - 将属性值映射到 productionDate/expiryDate/inventoryDate/batchRefNo/sheetRefNo/boxPalletNo/extAttr1-4
|
|
||||||
*/
|
*/
|
||||||
private void fillDynamicBatchDisplayFields(List<ReviewMaterialDetailPO> details) {
|
private Map<Long, List<BatchDetailFeignPO>> loadDisplayBatchDetailMap(List<ReviewMaterialDetailPO> details) {
|
||||||
|
Map<Long, List<BatchDetailFeignPO>> batchDetailMap = new HashMap<>();
|
||||||
if (CollectionUtils.isEmpty(details)) {
|
if (CollectionUtils.isEmpty(details)) {
|
||||||
return;
|
return batchDetailMap;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 1) 批量获取“批次管理”配置(只取 isDisplay=1)
|
|
||||||
Set<Long> materialBaseInfoIdSet = details.stream()
|
Set<Long> materialBaseInfoIdSet = details.stream()
|
||||||
.map(ReviewMaterialDetailPO::getMaterialBaseInfoId)
|
.map(ReviewMaterialDetailPO::getMaterialBaseInfoId)
|
||||||
.filter(v -> v != null)
|
.filter(v -> v != null)
|
||||||
.collect(Collectors.toSet());
|
.collect(Collectors.toSet());
|
||||||
Map<Long, List<BatchDetailFeignPO>> batchDetailMap = new HashMap<>();
|
|
||||||
for (Long materialBaseInfoId : materialBaseInfoIdSet) {
|
for (Long materialBaseInfoId : materialBaseInfoIdSet) {
|
||||||
try {
|
try {
|
||||||
AjaxResult ajaxResult = systemServiceFeign.getBatchDetailListByMaterialBaseInfoId(materialBaseInfoId);
|
AjaxResult ajaxResult = systemServiceFeign.getBatchDetailListByMaterialBaseInfoId(materialBaseInfoId);
|
||||||
@@ -296,11 +295,20 @@ public class ReviewOrderApplicationService {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
// 配置拉取失败不影响详情主流程
|
log.debug("复核详情拉取批次配置失败 materialBaseInfoId={}", materialBaseInfoId, e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
return batchDetailMap;
|
||||||
|
}
|
||||||
|
|
||||||
// 2) 每行按 outUniqueId + batchDetailId 到 material_more_detail 取值并映射回字段
|
/**
|
||||||
|
* 将 material_more_detail 的值回落到明细行平铺字段(与原先逻辑一致)
|
||||||
|
*/
|
||||||
|
private void fillDynamicBatchDisplayFields(List<ReviewMaterialDetailPO> details,
|
||||||
|
Map<Long, List<BatchDetailFeignPO>> batchDetailMap) {
|
||||||
|
if (CollectionUtils.isEmpty(details) || batchDetailMap.isEmpty()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
for (ReviewMaterialDetailPO d : details) {
|
for (ReviewMaterialDetailPO d : details) {
|
||||||
if (d == null || d.getMaterialBaseInfoId() == null) {
|
if (d == null || d.getMaterialBaseInfoId() == null) {
|
||||||
continue;
|
continue;
|
||||||
@@ -317,18 +325,16 @@ public class ReviewOrderApplicationService {
|
|||||||
if (batchDetail == null || batchDetail.getBatchDetailId() == null) {
|
if (batchDetail == null || batchDetail.getBatchDetailId() == null) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
String targetField = null;
|
String targetField = null;
|
||||||
if (StringUtils.isNotBlank(batchDetail.getFieldName())) {
|
if (StringUtils.isNotBlank(batchDetail.getFieldName())) {
|
||||||
targetField = normalizeFieldName(batchDetail.getFieldName());
|
targetField = normalizeFieldName(batchDetail.getFieldName());
|
||||||
}
|
}
|
||||||
if (targetField == null && StringUtils.isNotBlank(batchDetail.getBatchLabels())) {
|
if (targetField == null && StringUtils.isNotBlank(batchDetail.getBatchLabels())) {
|
||||||
targetField = getFieldNameByBatchLabel(batchDetail.getBatchLabels());
|
targetField = shelfLikeBatchLabelToFieldName(batchDetail.getBatchLabels());
|
||||||
}
|
}
|
||||||
if (targetField == null) {
|
if (targetField == null) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
String attrValue = getAttributeValueFromMaterialMoreDetail(uniqueId, batchDetail.getBatchDetailId());
|
String attrValue = getAttributeValueFromMaterialMoreDetail(uniqueId, batchDetail.getBatchDetailId());
|
||||||
if (StringUtils.isBlank(attrValue)) {
|
if (StringUtils.isBlank(attrValue)) {
|
||||||
continue;
|
continue;
|
||||||
@@ -338,6 +344,224 @@ public class ReviewOrderApplicationService {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 上架单 {@code setMaterialMoreDetailListRecursively} 同款:明细行上组装 materialMoreDetailList(含 attributeValue)。
|
||||||
|
*/
|
||||||
|
private void buildReviewMaterialMoreDetailListLikeShelf(List<ReviewMaterialDetailPO> details,
|
||||||
|
Map<Long, List<BatchDetailFeignPO>> batchDetailMap) {
|
||||||
|
if (CollectionUtils.isEmpty(details)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
for (ReviewMaterialDetailPO reviewLine : details) {
|
||||||
|
if (reviewLine == null) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
Long materialBaseInfoId = reviewLine.getMaterialBaseInfoId();
|
||||||
|
List<MaterialMoreDetailPO> materialMoreDetailList = new ArrayList<>();
|
||||||
|
Map<Long, MaterialMoreDetailPO> batchDetailIdToMaterialMoreDetailMap = new HashMap<>();
|
||||||
|
List<MaterialMoreDetailPO> existingList = reviewLine.getMaterialMoreDetailList();
|
||||||
|
if (!CollectionUtils.isEmpty(existingList)) {
|
||||||
|
for (MaterialMoreDetailPO existing : existingList) {
|
||||||
|
if (existing.getBatchDetailId() != null) {
|
||||||
|
batchDetailIdToMaterialMoreDetailMap.put(existing.getBatchDetailId(), existing);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (materialBaseInfoId != null && batchDetailMap.containsKey(materialBaseInfoId)) {
|
||||||
|
List<BatchDetailFeignPO> batchDetailFeignPOList = batchDetailMap.get(materialBaseInfoId);
|
||||||
|
Set<Long> addedBatchDetailIds = new HashSet<>();
|
||||||
|
for (BatchDetailFeignPO batchDetailFeignPO : batchDetailFeignPOList) {
|
||||||
|
if (batchDetailFeignPO == null) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
MaterialMoreDetailPO materialMoreDetailPO = batchDetailIdToMaterialMoreDetailMap
|
||||||
|
.get(batchDetailFeignPO.getBatchDetailId());
|
||||||
|
if (materialMoreDetailPO == null) {
|
||||||
|
materialMoreDetailPO = new MaterialMoreDetailPO();
|
||||||
|
materialMoreDetailPO.setBatchId(batchDetailFeignPO.getBatchId());
|
||||||
|
materialMoreDetailPO.setBatchDetailId(batchDetailFeignPO.getBatchDetailId());
|
||||||
|
materialMoreDetailPO.setBatchLabels(batchDetailFeignPO.getBatchLabels());
|
||||||
|
materialMoreDetailPO.setInputControl(batchDetailFeignPO.getInputControl());
|
||||||
|
materialMoreDetailPO.setAttributeFormat(batchDetailFeignPO.getAttributeFormat());
|
||||||
|
materialMoreDetailPO.setAttributeOption(batchDetailFeignPO.getAttributeOption());
|
||||||
|
materialMoreDetailPO.setRemark(batchDetailFeignPO.getRemark());
|
||||||
|
} else {
|
||||||
|
materialMoreDetailPO.setBatchId(batchDetailFeignPO.getBatchId());
|
||||||
|
materialMoreDetailPO.setBatchLabels(batchDetailFeignPO.getBatchLabels());
|
||||||
|
materialMoreDetailPO.setInputControl(batchDetailFeignPO.getInputControl());
|
||||||
|
materialMoreDetailPO.setAttributeFormat(batchDetailFeignPO.getAttributeFormat());
|
||||||
|
materialMoreDetailPO.setAttributeOption(batchDetailFeignPO.getAttributeOption());
|
||||||
|
materialMoreDetailPO.setRemark(batchDetailFeignPO.getRemark());
|
||||||
|
}
|
||||||
|
Long batchDetailId = batchDetailFeignPO.getBatchDetailId();
|
||||||
|
if (batchDetailId != null && !addedBatchDetailIds.contains(batchDetailId)) {
|
||||||
|
materialMoreDetailList.add(materialMoreDetailPO);
|
||||||
|
addedBatchDetailIds.add(batchDetailId);
|
||||||
|
}
|
||||||
|
String fieldValue = null;
|
||||||
|
if (StringUtils.isNotBlank(batchDetailFeignPO.getFieldName())) {
|
||||||
|
fieldValue = getFieldValueByFieldName(reviewLine, batchDetailFeignPO.getFieldName());
|
||||||
|
} else if (StringUtils.isNotBlank(batchDetailFeignPO.getBatchLabels())) {
|
||||||
|
String fieldNameByLabel = shelfLikeBatchLabelToFieldName(batchDetailFeignPO.getBatchLabels());
|
||||||
|
if (StringUtils.isNotBlank(fieldNameByLabel)) {
|
||||||
|
fieldValue = getFieldValueByFieldName(reviewLine, fieldNameByLabel);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (fieldValue != null) {
|
||||||
|
materialMoreDetailPO.setAttributeValue(fieldValue);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
reviewLine.setMaterialMoreDetailList(materialMoreDetailList);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 与 {@link com.mhd.wms.application.service.stockShelfOrder.StockShelfOrderApplicationService#getFieldValueByFieldName} 一致
|
||||||
|
*/
|
||||||
|
private String getFieldValueByFieldName(Object obj, String fieldName) {
|
||||||
|
if (obj == null || StringUtils.isBlank(fieldName)) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
String normalizedFieldName = fieldName;
|
||||||
|
if (normalizedFieldName.contains("_")) {
|
||||||
|
normalizedFieldName = snakeToCamel(normalizedFieldName);
|
||||||
|
}
|
||||||
|
Class<?> clazz = obj.getClass();
|
||||||
|
Field field = null;
|
||||||
|
Class<?> currentClass = clazz;
|
||||||
|
while (currentClass != null && field == null) {
|
||||||
|
try {
|
||||||
|
field = currentClass.getDeclaredField(normalizedFieldName);
|
||||||
|
} catch (NoSuchFieldException e) {
|
||||||
|
currentClass = currentClass.getSuperclass();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (field == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
field.setAccessible(true);
|
||||||
|
Object value = field.get(obj);
|
||||||
|
if (value == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
if (value instanceof Date) {
|
||||||
|
return new SimpleDateFormat("yyyy-MM-dd").format((Date) value);
|
||||||
|
}
|
||||||
|
return value.toString();
|
||||||
|
} catch (Exception e) {
|
||||||
|
log.debug("复核详情反射取批次字段失败 fieldName={}", fieldName, e);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static String snakeToCamel(String snake) {
|
||||||
|
if (StringUtils.isBlank(snake)) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
String s = snake.trim().toLowerCase();
|
||||||
|
StringBuilder sb = new StringBuilder();
|
||||||
|
boolean upperNext = false;
|
||||||
|
for (int i = 0; i < s.length(); i++) {
|
||||||
|
char c = s.charAt(i);
|
||||||
|
if (c == '_') {
|
||||||
|
upperNext = true;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (upperNext) {
|
||||||
|
sb.append(Character.toUpperCase(c));
|
||||||
|
upperNext = false;
|
||||||
|
} else {
|
||||||
|
sb.append(c);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return sb.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 与上架单批次标签映射表一致(见 StockShelfOrderApplicationService#getFieldNameByBatchLabel)
|
||||||
|
*/
|
||||||
|
private static String shelfLikeBatchLabelToFieldName(String batchLabel) {
|
||||||
|
if (StringUtils.isBlank(batchLabel)) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
Map<String, String> labelToFieldNameMap = new HashMap<>();
|
||||||
|
labelToFieldNameMap.put("Invoice No.", "invoiceNo");
|
||||||
|
labelToFieldNameMap.put("Invoice No", "invoiceNo");
|
||||||
|
labelToFieldNameMap.put("发票号", "invoiceNo");
|
||||||
|
labelToFieldNameMap.put("Batch Ref NO's", "batchRefNo");
|
||||||
|
labelToFieldNameMap.put("Batch Ref NO", "batchRefNo");
|
||||||
|
labelToFieldNameMap.put("批次参考号", "batchRefNo");
|
||||||
|
labelToFieldNameMap.put("Sheet Ref NO's", "sheetRefNo");
|
||||||
|
labelToFieldNameMap.put("Sheet Ref NO", "sheetRefNo");
|
||||||
|
labelToFieldNameMap.put("单据参考号", "sheetRefNo");
|
||||||
|
labelToFieldNameMap.put("箱号/卡板号", "boxPalletNo");
|
||||||
|
labelToFieldNameMap.put("箱号", "boxPalletNo");
|
||||||
|
labelToFieldNameMap.put("卡板号", "boxPalletNo");
|
||||||
|
labelToFieldNameMap.put("申报数量", "declaredQuantity");
|
||||||
|
labelToFieldNameMap.put("申报单位", "declarationUnit");
|
||||||
|
labelToFieldNameMap.put("原产国", "originCountry");
|
||||||
|
labelToFieldNameMap.put("币制", "currency");
|
||||||
|
labelToFieldNameMap.put("单位", "unit");
|
||||||
|
labelToFieldNameMap.put("升", "liter");
|
||||||
|
labelToFieldNameMap.put("尺寸", "dimensions");
|
||||||
|
labelToFieldNameMap.put("箱数", "boxCount");
|
||||||
|
labelToFieldNameMap.put("件数", "pieceCount");
|
||||||
|
labelToFieldNameMap.put("入库数量", "inboundQuantity");
|
||||||
|
labelToFieldNameMap.put("总净重", "totalNetWeight");
|
||||||
|
labelToFieldNameMap.put("总毛重", "totalGrossWeight");
|
||||||
|
labelToFieldNameMap.put("总体积", "totalVolume");
|
||||||
|
labelToFieldNameMap.put("总面积", "totalArea");
|
||||||
|
labelToFieldNameMap.put("总价", "totalPrice");
|
||||||
|
labelToFieldNameMap.put("扩展属性1", "extAttr1");
|
||||||
|
labelToFieldNameMap.put("扩展字段1", "extAttr1");
|
||||||
|
labelToFieldNameMap.put("扩展属性2", "extAttr2");
|
||||||
|
labelToFieldNameMap.put("扩展字段2", "extAttr2");
|
||||||
|
labelToFieldNameMap.put("扩展属性3", "extAttr3");
|
||||||
|
labelToFieldNameMap.put("扩展字段3", "extAttr3");
|
||||||
|
labelToFieldNameMap.put("扩展属性4", "extAttr4");
|
||||||
|
labelToFieldNameMap.put("扩展字段4", "extAttr4");
|
||||||
|
labelToFieldNameMap.put("生产日期", "productionDate");
|
||||||
|
labelToFieldNameMap.put("过期日期", "expiryDate");
|
||||||
|
labelToFieldNameMap.put("存货日期", "inventoryDate");
|
||||||
|
|
||||||
|
String trimmed = batchLabel.trim();
|
||||||
|
String fieldName = labelToFieldNameMap.get(trimmed);
|
||||||
|
if (StringUtils.isNotBlank(fieldName)) {
|
||||||
|
return fieldName;
|
||||||
|
}
|
||||||
|
for (Map.Entry<String, String> entry : labelToFieldNameMap.entrySet()) {
|
||||||
|
if (batchLabel.contains(entry.getKey()) || entry.getKey().contains(trimmed)) {
|
||||||
|
return entry.getValue();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return convertShelfLikeLabelToFieldName(trimmed);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static String convertShelfLikeLabelToFieldName(String label) {
|
||||||
|
if (StringUtils.isBlank(label)) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
String cleaned = label.replaceAll("[^a-zA-Z0-9\\u4e00-\\u9fa5\\s]", " ")
|
||||||
|
.trim()
|
||||||
|
.toLowerCase();
|
||||||
|
if (cleaned.matches(".*[\\u4e00-\\u9fa5].*")) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
String[] words = cleaned.split("\\s+");
|
||||||
|
if (words.length == 0) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
StringBuilder fieldName = new StringBuilder(words[0]);
|
||||||
|
for (int i = 1; i < words.length; i++) {
|
||||||
|
if (words[i].length() > 0) {
|
||||||
|
fieldName.append(words[i].substring(0, 1).toUpperCase()).append(words[i].substring(1));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return fieldName.toString();
|
||||||
|
}
|
||||||
|
|
||||||
private String getAttributeValueFromMaterialMoreDetail(Long materialDetailUniqueId, Long batchDetailId) {
|
private String getAttributeValueFromMaterialMoreDetail(Long materialDetailUniqueId, Long batchDetailId) {
|
||||||
if (materialDetailUniqueId == null || batchDetailId == null) {
|
if (materialDetailUniqueId == null || batchDetailId == null) {
|
||||||
return null;
|
return null;
|
||||||
@@ -391,44 +615,6 @@ public class ReviewOrderApplicationService {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* 批次属性标签 -> 目标字段名(仅覆盖需要反显的字段)
|
|
||||||
*/
|
|
||||||
private static String getFieldNameByBatchLabel(String batchLabels) {
|
|
||||||
if (StringUtils.isBlank(batchLabels)) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
String label = batchLabels.trim();
|
|
||||||
switch (label) {
|
|
||||||
case "生产日期":
|
|
||||||
return "productionDate";
|
|
||||||
case "过期日期":
|
|
||||||
return "expiryDate";
|
|
||||||
case "存货日期":
|
|
||||||
return "inventoryDate";
|
|
||||||
case "Batch Ref NO's":
|
|
||||||
return "batchRefNo";
|
|
||||||
case "Sheet Ref NO's":
|
|
||||||
return "sheetRefNo";
|
|
||||||
case "箱号/卡板号":
|
|
||||||
return "boxPalletNo";
|
|
||||||
case "扩展字段1":
|
|
||||||
case "扩展属性1":
|
|
||||||
return "extAttr1";
|
|
||||||
case "扩展字段2":
|
|
||||||
case "扩展属性2":
|
|
||||||
return "extAttr2";
|
|
||||||
case "扩展字段3":
|
|
||||||
case "扩展属性3":
|
|
||||||
return "extAttr3";
|
|
||||||
case "扩展字段4":
|
|
||||||
case "扩展属性4":
|
|
||||||
return "extAttr4";
|
|
||||||
default:
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void applyAttrValueToDetail(ReviewMaterialDetailPO d, String fieldName, String value) {
|
private static void applyAttrValueToDetail(ReviewMaterialDetailPO d, String fieldName, String value) {
|
||||||
if (d == null || fieldName == null || value == null) {
|
if (d == null || fieldName == null || value == null) {
|
||||||
return;
|
return;
|
||||||
@@ -477,11 +663,9 @@ public class ReviewOrderApplicationService {
|
|||||||
if (setter == null || StringUtils.isBlank(v)) {
|
if (setter == null || StringUtils.isBlank(v)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
try {
|
Date parsed = DateUtils.parseDate(v.trim());
|
||||||
if (v.matches("\\d{4}-\\d{2}-\\d{2}.*")) {
|
if (parsed != null) {
|
||||||
setter.accept(DateUtils.parseDate(v));
|
setter.accept(parsed);
|
||||||
}
|
|
||||||
} catch (Exception ignored) {
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+6
@@ -2,6 +2,7 @@ package com.mhd.wms.domain.reviewOrder.repository.po;
|
|||||||
|
|
||||||
import com.mhd.common.core.web.domain.BaseVOEntity;
|
import com.mhd.common.core.web.domain.BaseVOEntity;
|
||||||
import com.fasterxml.jackson.annotation.JsonFormat;
|
import com.fasterxml.jackson.annotation.JsonFormat;
|
||||||
|
import com.mhd.wms.domain.materialMoreDetail.repository.po.MaterialMoreDetailPO;
|
||||||
import io.swagger.annotations.ApiModel;
|
import io.swagger.annotations.ApiModel;
|
||||||
import io.swagger.annotations.ApiModelProperty;
|
import io.swagger.annotations.ApiModelProperty;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
@@ -9,6 +10,7 @@ import org.springframework.format.annotation.DateTimeFormat;
|
|||||||
|
|
||||||
import java.math.BigDecimal;
|
import java.math.BigDecimal;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 复核单明细(review_material_detail)
|
* 复核单明细(review_material_detail)
|
||||||
@@ -128,4 +130,8 @@ public class ReviewMaterialDetailPO extends BaseVOEntity {
|
|||||||
|
|
||||||
@ApiModelProperty("备注")
|
@ApiModelProperty("备注")
|
||||||
private String remark;
|
private String remark;
|
||||||
|
|
||||||
|
/** 与上架单明细一致:批次属性列表(isDisplay=1 项 + attributeValue) */
|
||||||
|
@ApiModelProperty("更多属性")
|
||||||
|
private List<MaterialMoreDetailPO> materialMoreDetailList;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ import lombok.Data;
|
|||||||
import org.springframework.format.annotation.DateTimeFormat;
|
import org.springframework.format.annotation.DateTimeFormat;
|
||||||
|
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 复核单主表列表/详情头(review_order)
|
* 复核单主表列表/详情头(review_order)
|
||||||
@@ -73,4 +74,8 @@ public class ReviewOrderPO extends BaseVOEntity {
|
|||||||
|
|
||||||
@ApiModelProperty("备注")
|
@ApiModelProperty("备注")
|
||||||
private String remark;
|
private String remark;
|
||||||
|
|
||||||
|
/** 详情与上架单一致:头字段扁平 + 明细列表 */
|
||||||
|
@ApiModelProperty("复核明细")
|
||||||
|
private List<ReviewMaterialDetailPO> materialDetailList;
|
||||||
}
|
}
|
||||||
|
|||||||
-26
@@ -1,26 +0,0 @@
|
|||||||
package com.mhd.wms.interfaces.dto.reviewOrder;
|
|
||||||
|
|
||||||
import com.mhd.wms.domain.reviewOrder.repository.po.ReviewMaterialDetailPO;
|
|
||||||
import com.mhd.wms.domain.reviewOrder.repository.po.ReviewOrderPO;
|
|
||||||
import io.swagger.annotations.ApiModel;
|
|
||||||
import io.swagger.annotations.ApiModelProperty;
|
|
||||||
import lombok.Data;
|
|
||||||
|
|
||||||
import java.io.Serializable;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 复核单详情:主表 + 明细行
|
|
||||||
*/
|
|
||||||
@Data
|
|
||||||
@ApiModel("复核单详情")
|
|
||||||
public class ReviewOrderDetailDTO implements Serializable {
|
|
||||||
|
|
||||||
private static final long serialVersionUID = 1L;
|
|
||||||
|
|
||||||
@ApiModelProperty("复核单头")
|
|
||||||
private ReviewOrderPO header;
|
|
||||||
|
|
||||||
@ApiModelProperty("复核明细列表")
|
|
||||||
private List<ReviewMaterialDetailPO> details;
|
|
||||||
}
|
|
||||||
+2
-21
@@ -43,37 +43,18 @@ public class ReviewOrderApi extends BaseController {
|
|||||||
return getDataTable(list);
|
return getDataTable(list);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
@ApiOperation("获取复核单详情")
|
||||||
* 参考出库单详情接口命名:/getInfo/{id}
|
|
||||||
*/
|
|
||||||
@ApiOperation("获取复核单详情(按主键,含明细)")
|
|
||||||
@GetMapping(value = "/getInfo/{reviewOrderId}")
|
@GetMapping(value = "/getInfo/{reviewOrderId}")
|
||||||
public AjaxResult getInfo(@PathVariable("reviewOrderId") Long reviewOrderId) {
|
public AjaxResult getInfo(@PathVariable("reviewOrderId") Long reviewOrderId) {
|
||||||
return AjaxResult.success(reviewOrderApplicationService.getDetailByReviewOrderId(reviewOrderId));
|
return AjaxResult.success(reviewOrderApplicationService.getDetailByReviewOrderId(reviewOrderId));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
@ApiOperation("根据复核单号获取复核单详情")
|
||||||
* 参考出库单按单号查询:用请求参数而非 PathVariable
|
|
||||||
*/
|
|
||||||
@ApiOperation("根据复核单号获取复核单详情(含明细)")
|
|
||||||
@GetMapping(value = "/getInfoReviewOrderNumber")
|
@GetMapping(value = "/getInfoReviewOrderNumber")
|
||||||
public AjaxResult getInfoReviewOrderNumber(@RequestParam("reviewOrderNumber") String reviewOrderNumber) {
|
public AjaxResult getInfoReviewOrderNumber(@RequestParam("reviewOrderNumber") String reviewOrderNumber) {
|
||||||
return AjaxResult.success(reviewOrderApplicationService.getDetailByReviewOrderNumber(reviewOrderNumber));
|
return AjaxResult.success(reviewOrderApplicationService.getDetailByReviewOrderNumber(reviewOrderNumber));
|
||||||
}
|
}
|
||||||
|
|
||||||
// 兼容旧接口(前端如仍在调用可继续使用)
|
|
||||||
@ApiOperation("复核单详情(按主键,含明细)")
|
|
||||||
@GetMapping("/detail/{reviewOrderId}")
|
|
||||||
public AjaxResult detail(@PathVariable("reviewOrderId") Long reviewOrderId) {
|
|
||||||
return AjaxResult.success(reviewOrderApplicationService.getDetailByReviewOrderId(reviewOrderId));
|
|
||||||
}
|
|
||||||
|
|
||||||
@ApiOperation("复核单详情(按复核单号,含明细)")
|
|
||||||
@GetMapping("/detailByNumber/{reviewOrderNumber}")
|
|
||||||
public AjaxResult detailByNumber(@PathVariable("reviewOrderNumber") String reviewOrderNumber) {
|
|
||||||
return AjaxResult.success(reviewOrderApplicationService.getDetailByReviewOrderNumber(reviewOrderNumber));
|
|
||||||
}
|
|
||||||
|
|
||||||
@ApiOperation("批量复核")
|
@ApiOperation("批量复核")
|
||||||
@PostMapping("/batchCheck")
|
@PostMapping("/batchCheck")
|
||||||
public AjaxResult batchCheck(@RequestBody ReviewOrderDTO reviewOrderDTO) {
|
public AjaxResult batchCheck(@RequestBody ReviewOrderDTO reviewOrderDTO) {
|
||||||
|
|||||||
Reference in New Issue
Block a user