出库导入修改

This commit is contained in:
秦鸿展
2026-04-15 17:47:48 +08:00
parent 2a4c4b835a
commit 551c618820
@@ -7,6 +7,7 @@ import com.alibaba.excel.read.builder.ExcelReaderBuilder;
import com.alibaba.excel.read.metadata.ReadSheet;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.TypeReference;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.mhd.common.core.domain.po.SysDictDataVo;
import com.mhd.common.core.domain.po.UserPo;
@@ -35,6 +36,7 @@ import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
@@ -155,10 +157,20 @@ public class ExcelParseService {
}
private void initParam(StockOutOrderDO stockOutOrderDO) {
//设置货主信息
shipperParam(stockOutOrderDO);
//设置客户信息
customerParam(stockOutOrderDO);
String customerName = stockOutOrderDO.getCustomerName();
if (StringUtils.isEmpty(customerName)) {
return;
}
UserPo userPo = resolveCustomerShipperUserPoForImport(customerName);
if (userPo == null) {
throw new ServiceException("获取客户信息失败:未在名称与货主列表中匹配到当前组织下的客户,请核对名称或改用客户编号/ID");
}
stockOutOrderDO.setShipperId(userPo.getUserId());
stockOutOrderDO.setShipperCode(userPo.getUserMemberCode());
stockOutOrderDO.setShipperName(userPo.getUserName());
stockOutOrderDO.setCustomerId(userPo.getUserId());
stockOutOrderDO.setCustomerCode(userPo.getUserMemberCode());
stockOutOrderDO.setCustomerName(userPo.getUserName());
}
/**
@@ -168,88 +180,6 @@ public class ExcelParseService {
return stockOutOrderDomainService.insert(stockOutOrderDO);
}
/**
* @description 封装货主信息
* @author ZhouGY
* @date 2024/5/9 20:43
* @param stockOutOrderDO
*/
private void shipperParam(StockOutOrderDO stockOutOrderDO){
String customerName = stockOutOrderDO.getCustomerName();
if (StringUtils.isEmpty(customerName)) return;
Long loginOrganizationId = null;
LoginUser loginUser = SecurityUtils.getLoginUser();
if (loginUser != null && loginUser.getUserPo() != null) {
loginOrganizationId = loginUser.getUserPo().getOrganizationId();
}
if (!customerName.matches("\\d+")) {
AjaxResult ajaxResult = userServiceFeign.getInfoByName(customerName);
if(!"200".equals(String.valueOf(ajaxResult.get("code")))){
throw new ServiceException("获取客户信息失败");
}
UserPo userPo = JSON.parseObject(com.alibaba.fastjson2.JSONObject.toJSONString(ajaxResult.get("data")), UserPo.class);
if (!shipperMatchesImporterOrganization(userPo, loginOrganizationId)) {
throw new ServiceException("当前登录用户组织下不存在该货主信息或客户名称与组织不匹配");
}
stockOutOrderDO.setShipperId(userPo.getUserId());
stockOutOrderDO.setShipperCode(userPo.getUserMemberCode());
stockOutOrderDO.setShipperName(userPo.getUserName());
} else {
AjaxResult ajaxResult = userServiceFeign.getInfo(Long.valueOf(customerName));
if(!"200".equals(String.valueOf(ajaxResult.get("code")))){
throw new ServiceException("获取货主信息失败");
}
UserPo userPo = JSON.parseObject(com.alibaba.fastjson2.JSONObject.toJSONString(ajaxResult.get("data")), UserPo.class);
if (!shipperMatchesImporterOrganization(userPo, loginOrganizationId)) {
throw new ServiceException("当前登录用户组织下不存在该货主信息或客户名称与组织不匹配");
}
stockOutOrderDO.setShipperId(userPo.getUserId());
stockOutOrderDO.setShipperCode(userPo.getUserMemberCode());
stockOutOrderDO.setShipperName(userPo.getUserName());
}
}
/**
* @description 封装客户信息
* @author ZhouGY
* @date 2024/5/9 20:43
* @param stockOutOrderDO
*/
private void customerParam(StockOutOrderDO stockOutOrderDO){
String customerName = stockOutOrderDO.getCustomerName();
if (StringUtils.isEmpty(customerName)) return;
Long loginOrganizationId = null;
LoginUser loginUser = SecurityUtils.getLoginUser();
if (loginUser != null && loginUser.getUserPo() != null) {
loginOrganizationId = loginUser.getUserPo().getOrganizationId();
}
if (!customerName.matches("\\d+")) {
AjaxResult ajaxResult = userServiceFeign.getInfoByName(customerName);
if(!"200".equals(String.valueOf(ajaxResult.get("code")))){
throw new ServiceException("获取客户信息失败");
}
UserPo userPo = JSON.parseObject(com.alibaba.fastjson2.JSONObject.toJSONString(ajaxResult.get("data")), UserPo.class);
if (!shipperMatchesImporterOrganization(userPo, loginOrganizationId)) {
throw new ServiceException("当前登录用户组织下不存在该客户信息或客户名称与组织不匹配");
}
stockOutOrderDO.setCustomerId(userPo.getUserId());
stockOutOrderDO.setCustomerCode(userPo.getUserMemberCode());
stockOutOrderDO.setCustomerName(userPo.getUserName());
} else {
AjaxResult ajaxResult = userServiceFeign.getInfo(Long.valueOf(customerName));
if(!"200".equals(String.valueOf(ajaxResult.get("code")))){
throw new ServiceException("获取客户信息失败");
}
UserPo userPo = JSON.parseObject(com.alibaba.fastjson2.JSONObject.toJSONString(ajaxResult.get("data")), UserPo.class);
if (!shipperMatchesImporterOrganization(userPo, loginOrganizationId)) {
throw new ServiceException("当前登录用户组织下不存在该客户信息或客户名称与组织不匹配");
}
stockOutOrderDO.setCustomerId(userPo.getUserId());
stockOutOrderDO.setCustomerCode(userPo.getUserMemberCode());
stockOutOrderDO.setCustomerName(userPo.getUserName());
}
}
/**
* 校验导入明细是否已在当前货主下维护物料基础信息
*/
@@ -324,11 +254,6 @@ public class ExcelParseService {
return errorMsg;
}
/**
* @description 根据客户名称获取货主ID(用于导入时提前获取货主ID)
* @param customerName 客户名称(在出库单中,客户名称就是货主名称)
* @return 货主ID,如果找不到则返回null
*/
/**
* 导入出库单:解析出的货主用户是否属于当前登录用户同一组织(organizationId)。
* 仅当登录用户带有 organizationId 时启用过滤;否则保持与旧行为一致。
@@ -344,44 +269,126 @@ public class ExcelParseService {
return oid != null && loginOrganizationId.equals(oid);
}
private Long getShipperIdByCustomerName(String customerName) {
/**
* 按客户名称或数字ID解析货主用户,逻辑与入库单导入一致:getInfoByName → 货主列表兜底,均做 organizationId 校验。
*/
private UserPo resolveCustomerShipperUserPoForImport(String customerName) {
if (StringUtils.isEmpty(customerName)) {
return null;
}
Long loginOrganizationId = null;
LoginUser loginUser = SecurityUtils.getLoginUser();
if (loginUser != null && loginUser.getUserPo() != null) {
loginOrganizationId = loginUser.getUserPo().getOrganizationId();
}
String shipperName = customerName.trim();
if (StringUtils.isEmpty(shipperName)) {
return null;
}
try {
if (!customerName.matches("\\d+")) {
// 按名称查询
AjaxResult ajaxResult = userServiceFeign.getInfoByName(customerName);
if ("200".equals(String.valueOf(ajaxResult.get("code")))) {
// 纯数字:按用户ID查询
if (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(com.alibaba.fastjson2.JSONObject.toJSONString(ajaxResult.get("data")), UserPo.class);
if (userPo != null && shipperMatchesImporterOrganization(userPo, loginOrganizationId)) {
return userPo.getUserId();
return userPo;
}
}
} else {
// 按ID查询
AjaxResult ajaxResult = userServiceFeign.getInfo(Long.valueOf(customerName));
if ("200".equals(String.valueOf(ajaxResult.get("code")))) {
UserPo userPo = JSON.parseObject(com.alibaba.fastjson2.JSONObject.toJSONString(ajaxResult.get("data")), UserPo.class);
if (userPo != null && shipperMatchesImporterOrganization(userPo, loginOrganizationId)) {
return userPo.getUserId();
} catch (Exception e) {
// ignore
}
return null;
}
// 按名称查询(用户中心)
try {
AjaxResult ajaxResult = userServiceFeign.getInfoByName(shipperName);
if ("200".equals(String.valueOf(ajaxResult.get("code"))) && ajaxResult.get("data") != null) {
UserPo userPo = JSON.parseObject(com.alibaba.fastjson2.JSONObject.toJSONString(ajaxResult.get("data")), UserPo.class);
if (userPo != null && shipperMatchesImporterOrganization(userPo, loginOrganizationId)) {
return userPo;
}
}
} catch (Exception e) {
// 继续货主列表兜底
}
// 货主列表兜底(与入库单 getShipperIdByNameOrCode 一致)
try {
AjaxResult shipperListResult = userServiceFeign.userShipperListAll();
if ("200".equals(String.valueOf(shipperListResult.get("code"))) && shipperListResult.get("data") != null) {
Object data = shipperListResult.get("data");
List<Map<String, Object>> shipperList = null;
if (data instanceof List) {
@SuppressWarnings("unchecked")
List<Object> rawList = (List<Object>) data;
shipperList = new ArrayList<>();
for (Object item : rawList) {
if (item instanceof Map) {
@SuppressWarnings("unchecked")
Map<String, Object> mapItem = (Map<String, Object>) item;
shipperList.add(mapItem);
} else {
Map<String, Object> mapItem = JSON.parseObject(JSONObject.toJSONString(item), Map.class);
shipperList.add(mapItem);
}
}
} else {
String jsonStr = JSONObject.toJSONString(data);
shipperList = JSON.parseObject(jsonStr, new TypeReference<List<Map<String, Object>>>(){});
}
if (shipperList != null && !shipperList.isEmpty()) {
String normalizedShipperName = shipperName;
for (Map<String, Object> shipper : shipperList) {
Object userId = shipper.get("userId");
Object userName = shipper.get("userName");
if (userName == null) {
userName = shipper.get("name");
}
if (userName == null) {
userName = shipper.get("shipperName");
}
boolean matched = false;
if (StringUtils.isNotEmpty(normalizedShipperName) && userName != null) {
String normalizedUserName = String.valueOf(userName).trim();
if (normalizedShipperName.equals(normalizedUserName)
|| normalizedUserName.contains(normalizedShipperName)) {
matched = true;
}
}
if (matched && userId != null) {
Long candidateId = Long.valueOf(String.valueOf(userId));
AjaxResult infoRes = userServiceFeign.getInfo(candidateId);
if ("200".equals(String.valueOf(infoRes.get("code"))) && infoRes.get("data") != null) {
UserPo up = JSON.parseObject(com.alibaba.fastjson2.JSONObject.toJSONString(infoRes.get("data")), UserPo.class);
if (shipperMatchesImporterOrganization(up, loginOrganizationId)) {
return up;
}
}
}
}
}
}
} catch (Exception e) {
// 如果查询失败,返回null,后续在shipperParam方法中会再次尝试
// ignore
}
return null;
}
/**
* @description 根据客户名称获取货主ID(用于导入时提前获取货主ID)
* @param customerName 客户名称(在出库单中,客户名称就是货主名称)
* @return 货主ID,如果找不到则返回null
*/
private Long getShipperIdByCustomerName(String customerName) {
UserPo userPo = resolveCustomerShipperUserPoForImport(customerName);
return userPo != null ? userPo.getUserId() : null;
}
/**
* @description 初始化物料明细列表,查询物料基础信息并设置物料基础信息ID(改为与入库单相同的逻辑)
* @param outMaterialDetailDOList 出库物料明细列表