Merge branch 'dev_qinhongzhanWMS' into wms_dev
This commit is contained in:
+135
-12
@@ -1485,9 +1485,49 @@ public class StockInOrderApplicationService {
|
||||
|
||||
// 如果货主ID为空,尝试根据货主名称或编号查找
|
||||
if (shipperId == null) {
|
||||
if (StringUtils.isNotEmpty(shipperName) || StringUtils.isNotEmpty(shipperCode)) {
|
||||
// 尝试从货主列表中查找
|
||||
// 优先尝试:如果名称是纯数字,可能是误传的ID,直接按ID查询
|
||||
if (StringUtils.isNotEmpty(shipperName) && shipperName.matches("\\d+")) {
|
||||
try {
|
||||
Long possibleId = Long.valueOf(shipperName);
|
||||
AjaxResult ajaxResult = userServiceFeign.getInfo(possibleId);
|
||||
if ("200".equals(String.valueOf(ajaxResult.get("code"))) && ajaxResult.get("data") != null) {
|
||||
UserPo userPo = JSON.parseObject(JSONObject.toJSONString(ajaxResult.get("data")), UserPo.class);
|
||||
if (userPo != null) {
|
||||
shipperId = userPo.getUserId();
|
||||
log.info("根据货主名称(实际为ID)找到货主ID:{}", shipperId);
|
||||
}
|
||||
}
|
||||
} catch (Exception e) {
|
||||
log.warn("尝试将货主名称作为ID查询失败,货主名称:{},错误:{}", shipperName, e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
// 如果仍未找到,尝试根据名称查询(使用 getInfoByName 接口,更高效)
|
||||
// 注意:如果接口返回404,说明接口可能未实现,继续尝试从列表中查找
|
||||
if (shipperId == null && StringUtils.isNotEmpty(shipperName) && !shipperName.matches("\\d+")) {
|
||||
try {
|
||||
AjaxResult ajaxResult = userServiceFeign.getInfoByName(shipperName);
|
||||
String code = String.valueOf(ajaxResult.get("code"));
|
||||
if ("200".equals(code) && ajaxResult.get("data") != null) {
|
||||
UserPo userPo = JSON.parseObject(JSONObject.toJSONString(ajaxResult.get("data")), UserPo.class);
|
||||
if (userPo != null) {
|
||||
shipperId = userPo.getUserId();
|
||||
log.info("根据货主名称找到货主ID,货主名称:{},货主ID:{}", shipperName, shipperId);
|
||||
}
|
||||
} else {
|
||||
// 接口返回非200(可能是404),记录日志但继续尝试其他方式
|
||||
log.debug("getInfoByName接口返回非200,货主名称:{},返回码:{},将继续尝试从列表中查找", shipperName, code);
|
||||
}
|
||||
} catch (Exception e) {
|
||||
// 接口调用异常(包括404),记录日志但继续尝试其他方式
|
||||
log.debug("根据货主名称查询失败(可能是接口未实现),货主名称:{},错误:{},将继续尝试从列表中查找", shipperName, e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
// 如果仍未找到,尝试从货主列表中根据编号或名称查找(兜底方案)
|
||||
if (shipperId == null && (StringUtils.isNotEmpty(shipperName) || StringUtils.isNotEmpty(shipperCode))) {
|
||||
try {
|
||||
log.debug("开始从货主列表中查找,货主名称:{},货主编号:{}", shipperName, shipperCode);
|
||||
AjaxResult shipperListResult = userServiceFeign.userShipperListAll();
|
||||
if ("200".equals(String.valueOf(shipperListResult.get("code"))) && shipperListResult.get("data") != null) {
|
||||
Object data = shipperListResult.get("data");
|
||||
@@ -1514,38 +1554,121 @@ public class StockInOrderApplicationService {
|
||||
shipperList = JSON.parseObject(jsonStr, new com.alibaba.fastjson.TypeReference<List<Map<String, Object>>>(){});
|
||||
}
|
||||
if (shipperList != null && !shipperList.isEmpty()) {
|
||||
log.debug("货主列表大小:{},开始匹配查找,查找货主名称:{},货主编号:{}",
|
||||
shipperList.size(), shipperName, shipperCode);
|
||||
|
||||
// 输出前3个货主的详细信息,用于调试
|
||||
if (log.isDebugEnabled() && shipperList.size() > 0) {
|
||||
int debugCount = Math.min(3, shipperList.size());
|
||||
for (int i = 0; i < debugCount; i++) {
|
||||
Map<String, Object> debugShipper = shipperList.get(i);
|
||||
log.debug("货主列表示例[{}]:所有字段={}", i, debugShipper.keySet());
|
||||
log.debug("货主列表示例[{}]:userId={}, userName={}, userCode={}, userMemberCode={}, name={}, shipperName={}",
|
||||
i,
|
||||
debugShipper.get("userId"),
|
||||
debugShipper.get("userName"),
|
||||
debugShipper.get("userCode"),
|
||||
debugShipper.get("userMemberCode"),
|
||||
debugShipper.get("name"),
|
||||
debugShipper.get("shipperName"));
|
||||
}
|
||||
}
|
||||
|
||||
// 标准化输入的货主名称和编号(去除空格,用于匹配)
|
||||
String normalizedShipperName = shipperName != null ? shipperName.trim() : "";
|
||||
String normalizedShipperCode = shipperCode != null ? shipperCode.trim() : "";
|
||||
|
||||
for (Map<String, Object> shipper : shipperList) {
|
||||
Object userId = shipper.get("userId");
|
||||
Object userName = shipper.get("userName");
|
||||
Object userCode = shipper.get("userCode");
|
||||
Object userMemberCode = shipper.get("userMemberCode");
|
||||
|
||||
// 尝试多个可能的字段名(按优先级顺序)
|
||||
if (userName == null) {
|
||||
userName = shipper.get("name");
|
||||
}
|
||||
if (userName == null) {
|
||||
userName = shipper.get("shipperName");
|
||||
}
|
||||
if (userName == null) {
|
||||
userName = shipper.get("userName");
|
||||
}
|
||||
// 尝试其他可能的字段名
|
||||
if (userName == null) {
|
||||
userName = shipper.get("customerName");
|
||||
}
|
||||
if (userName == null) {
|
||||
userName = shipper.get("companyName");
|
||||
}
|
||||
|
||||
boolean matched = false;
|
||||
// 优先根据编号匹配(更准确)
|
||||
if (StringUtils.isNotEmpty(shipperCode)) {
|
||||
if ((userCode != null && shipperCode.equals(String.valueOf(userCode))) ||
|
||||
(userMemberCode != null && shipperCode.equals(String.valueOf(userMemberCode)))) {
|
||||
if (StringUtils.isNotEmpty(normalizedShipperCode)) {
|
||||
String normalizedUserCode = userCode != null ? String.valueOf(userCode).trim() : "";
|
||||
String normalizedUserMemberCode = userMemberCode != null ? String.valueOf(userMemberCode).trim() : "";
|
||||
if (normalizedShipperCode.equals(normalizedUserCode) ||
|
||||
normalizedShipperCode.equals(normalizedUserMemberCode)) {
|
||||
matched = true;
|
||||
log.debug("通过编号匹配成功,货主编号:{},货主ID:{}", normalizedShipperCode, userId);
|
||||
}
|
||||
}
|
||||
// 如果编号不匹配,再根据名称匹配
|
||||
if (!matched && StringUtils.isNotEmpty(shipperName) &&
|
||||
userName != null &&
|
||||
shipperName.equals(String.valueOf(userName))) {
|
||||
matched = true;
|
||||
// 如果编号不匹配,再根据名称匹配(支持去除空格后匹配)
|
||||
if (!matched && StringUtils.isNotEmpty(normalizedShipperName) && userName != null) {
|
||||
String normalizedUserName = String.valueOf(userName).trim();
|
||||
// 精确匹配
|
||||
if (normalizedShipperName.equals(normalizedUserName)) {
|
||||
matched = true;
|
||||
log.debug("通过名称精确匹配成功,货主名称:{},货主ID:{}", normalizedShipperName, userId);
|
||||
}
|
||||
// 如果精确匹配失败,尝试包含匹配(支持部分匹配)
|
||||
if (!matched && normalizedUserName.contains(normalizedShipperName)) {
|
||||
matched = true;
|
||||
log.debug("通过名称包含匹配成功,货主名称:{},列表中的名称:{},货主ID:{}",
|
||||
normalizedShipperName, normalizedUserName, userId);
|
||||
}
|
||||
// 如果包含匹配也失败,尝试反向包含匹配
|
||||
if (!matched && normalizedShipperName.contains(normalizedUserName)) {
|
||||
matched = true;
|
||||
log.debug("通过名称反向包含匹配成功,货主名称:{},列表中的名称:{},货主ID:{}",
|
||||
normalizedShipperName, normalizedUserName, userId);
|
||||
}
|
||||
}
|
||||
|
||||
if (matched && userId != null) {
|
||||
shipperId = Long.valueOf(String.valueOf(userId));
|
||||
log.info("根据货主信息找到货主ID,货主名称:{},货主编号:{},货主ID:{}",
|
||||
log.info("从货主列表中找到货主ID,货主名称:{},货主编号:{},货主ID:{}",
|
||||
shipperName, shipperCode, shipperId);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (shipperId == null) {
|
||||
// 输出所有货主名称,帮助排查
|
||||
List<String> allShipperNames = new ArrayList<>();
|
||||
for (Map<String, Object> shipper : shipperList) {
|
||||
Object name = shipper.get("userName");
|
||||
if (name == null) {
|
||||
name = shipper.get("name");
|
||||
}
|
||||
if (name == null) {
|
||||
name = shipper.get("shipperName");
|
||||
}
|
||||
if (name != null) {
|
||||
allShipperNames.add(String.valueOf(name));
|
||||
}
|
||||
}
|
||||
log.warn("从货主列表中未找到匹配的货主,货主名称:{},货主编号:{},列表大小:{},所有货主名称:{}",
|
||||
shipperName, shipperCode, shipperList.size(), allShipperNames);
|
||||
}
|
||||
} else {
|
||||
log.warn("货主列表为空或解析失败");
|
||||
}
|
||||
} else {
|
||||
log.warn("获取货主列表失败,返回码:{}", shipperListResult.get("code"));
|
||||
}
|
||||
} catch (Exception e) {
|
||||
log.warn("根据货主名称查找货主ID失败,货主名称:{},错误:{}", shipperName, e.getMessage());
|
||||
log.error("从货主列表中查找货主ID失败,货主名称:{},货主编号:{},错误:{}", shipperName, shipperCode, e.getMessage(), e);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+51
@@ -28,6 +28,7 @@ import com.mhd.wms.domain.materialGoodsRule.repository.facade.IMaterialGoodsRule
|
||||
import com.mhd.wms.domain.materialGoodsRule.repository.po.MaterialGoodsRulePO;
|
||||
import com.mhd.wms.domain.materialWarehouseControl.repository.facade.IMaterialWarehouseControlService;
|
||||
import com.mhd.wms.domain.materialWarehouseControl.repository.po.MaterialWarehouseControlPO;
|
||||
import com.mhd.wms.domain.materialMoreDetail.repository.po.MaterialMoreDetailPO;
|
||||
import com.mhd.wms.domain.receiptMaterialDetail.repository.po.ReceiptMaterialDetailPO;
|
||||
import com.mhd.wms.domain.receiptMaterialDetail.repository.todo.ReceiptMaterialDetailDO;
|
||||
import com.mhd.wms.domain.receiptMaterialDetail.service.ReceiptMaterialDetailDomainService;
|
||||
@@ -134,9 +135,59 @@ public class StockReceiptOrderApplicationService {
|
||||
ReceiptMaterialDetailDO receiptMaterialDetailDO = new ReceiptMaterialDetailDO();
|
||||
receiptMaterialDetailDO.setReceiptOrderNumber(stockReceiptOrderPO.getReceiptOrderNumber());
|
||||
List<ReceiptMaterialDetailPO> receiptMaterialDetailPOList = receiptMaterialDetailDomainService.queryListChildren(receiptMaterialDetailDO);
|
||||
|
||||
// 为每个物料明细设置更多属性(根据物料绑定的批次属性,过滤isDisplay=1的属性)
|
||||
receiptMaterialDetailPOList.forEach(receiptMaterialDetailPO -> {
|
||||
List<MaterialMoreDetailPO> materialMoreDetailList =
|
||||
getMaterialMoreDetailByBatch(receiptMaterialDetailPO.getMaterialBaseInfoId());
|
||||
receiptMaterialDetailPO.setMaterialMoreDetailList(materialMoreDetailList);
|
||||
});
|
||||
|
||||
stockReceiptOrderPO.setMaterialDetailList(receiptMaterialDetailPOList);
|
||||
return stockReceiptOrderPO;
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据物料基础信息ID获取批次属性(更多属性),只返回isDisplay=1的属性
|
||||
* @param materialBaseInfoId 物料基础信息ID
|
||||
* @return 更多属性列表
|
||||
*/
|
||||
private List<MaterialMoreDetailPO> getMaterialMoreDetailByBatch(Long materialBaseInfoId) {
|
||||
List<MaterialMoreDetailPO> materialMoreDetailPOList = new ArrayList<>();
|
||||
if (materialBaseInfoId == null) {
|
||||
return materialMoreDetailPOList;
|
||||
}
|
||||
|
||||
try {
|
||||
// 根据物料基础信息ID获取批次属性列表
|
||||
AjaxResult ajaxResult = systemServiceFeign.getBatchDetailListByMaterialBaseInfoId(materialBaseInfoId);
|
||||
if (ajaxResult != null && "200".equals(String.valueOf(ajaxResult.get("code")))) {
|
||||
List<BatchDetailFeignPO> batchDetailFeignPOList = JSON.parseArray(
|
||||
JSONObject.toJSONString(ajaxResult.get("data")), BatchDetailFeignPO.class);
|
||||
|
||||
if (!CollectionUtils.isEmpty(batchDetailFeignPOList)) {
|
||||
// 过滤isDisplay=1的属性
|
||||
batchDetailFeignPOList.stream()
|
||||
.filter(batchDetail -> batchDetail.getIsDisplay() != null && batchDetail.getIsDisplay() == 1)
|
||||
.forEach(batchDetailFeignPO -> {
|
||||
MaterialMoreDetailPO 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());
|
||||
materialMoreDetailPOList.add(materialMoreDetailPO);
|
||||
});
|
||||
}
|
||||
}
|
||||
} catch (Exception e) {
|
||||
log.warn("获取物料批次属性失败,物料基础信息ID:{},错误:{}", materialBaseInfoId, e.getMessage());
|
||||
}
|
||||
|
||||
return materialMoreDetailPOList;
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取收货单详细信息
|
||||
|
||||
+1
@@ -54,6 +54,7 @@ public class MaterialMoreDetailDO extends BaseVOEntity {
|
||||
@Excel(name = "批次标签")
|
||||
private String batchLabels;
|
||||
|
||||
|
||||
@ApiModelProperty("输入控制: 1-必填 2-可选")
|
||||
@Excel(name = "输入控制: 1-必填 2-可选")
|
||||
private String inputControl;
|
||||
|
||||
+9
@@ -37,6 +37,15 @@ public class StockInOrderAssembler {
|
||||
* 转换实体
|
||||
*/
|
||||
public StockInOrderDO toDOByEdit(StockInOrderDTO stockInOrderDTO) {
|
||||
// 兼容前端传 userName 作为货主名称字段的情况:
|
||||
// 如果 shipperName 为空但 userName 有值,则优先回填到 shipperName,
|
||||
// 以保证后续 shipperParam 能根据名称正确找到货主ID。
|
||||
if (ObjectUtil.isNull(stockInOrderDTO.getShipperId())
|
||||
&& (stockInOrderDTO.getShipperName() == null || stockInOrderDTO.getShipperName().trim().length() == 0)
|
||||
&& stockInOrderDTO.getUserName() != null && stockInOrderDTO.getUserName().trim().length() > 0) {
|
||||
stockInOrderDTO.setShipperName(stockInOrderDTO.getUserName().trim());
|
||||
}
|
||||
|
||||
StockInOrderDO stockInOrderDO = JSONUtil.toBean(JSONUtil.toJsonStr(stockInOrderDTO), StockInOrderDO.class);
|
||||
LoginUser loginUser = SecurityUtils.getLoginUser();
|
||||
if (ObjectUtil.isNull(loginUser)) {
|
||||
|
||||
@@ -51,6 +51,13 @@ public class StockInOrderBaseDTO extends BaseVOEntity {
|
||||
@Excel(name = "货主名称")
|
||||
private String shipperName;
|
||||
|
||||
/**
|
||||
* 兼容前端使用 userName 作为货主名称字段:
|
||||
* 如果请求体中只传了 userName,将在组装器中自动回填到 shipperName。
|
||||
*/
|
||||
@ApiModelProperty("货主名称(兼容字段:userName)")
|
||||
private String userName;
|
||||
|
||||
@ApiModelProperty("入库单类型编码")
|
||||
@Excel(name = "入库单类型编码")
|
||||
private String orderTypeCode;
|
||||
|
||||
Reference in New Issue
Block a user