opt:新增ERP接口

This commit is contained in:
2025-09-23 16:03:07 +08:00
parent 812200115b
commit ffcecbde64
19 changed files with 302 additions and 14 deletions

View File

@@ -7,6 +7,7 @@ import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.nl.common.logging.annotation.Log;
import org.nl.wms.ext_manage.dto.ErpGroupplateDto;
import org.nl.wms.ext_manage.dto.ErpMaterInfoDto;
import org.nl.wms.ext_manage.service.ErpToWmsService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
@@ -28,7 +29,7 @@ import java.util.List;
*/
@RestController
@RequiredArgsConstructor
@RequestMapping("/api/lms")
@RequestMapping("/api/towms")
@Slf4j
public class ErpToWmsController {
@@ -48,4 +49,11 @@ public class ErpToWmsController {
public ResponseEntity<Object> usematerinfo(@RequestBody JSONObject whereJson) {
return new ResponseEntity<>(erpToWmsService.usematerinfo(whereJson),HttpStatus.OK);
}
@PostMapping("/materialinfo")
@Log("接收物料信息")
@SaIgnore
public ResponseEntity<Object> materialinfo(@RequestBody ErpMaterInfoDto erpMaterInfoDto) {
return new ResponseEntity<>(erpToWmsService.materialinfo(erpMaterInfoDto),HttpStatus.OK);
}
}

View File

@@ -0,0 +1,11 @@
package org.nl.wms.ext_manage.dto;
import lombok.Data;
@Data
public class ErpMaterInfoDataDto {
private String material_code;
private String material_name;
private String material_spec;
private String base_unit;
}

View File

@@ -0,0 +1,13 @@
package org.nl.wms.ext_manage.dto;
import lombok.Data;
import java.math.BigDecimal;
import java.util.List;
@Data
public class ErpMaterInfoDto {
private String status;
private String message;
private List<ErpMaterInfoDataDto> data;
}

View File

@@ -31,4 +31,9 @@ public class EXTConstant {
* ACS下发任务接口地址
*/
public final static String SEND_TASK_ACS_API = "api/wms/task";
/**
* ERP获取物料详情请求地址
*/
public final static String GET_MATERIAL_INFO_ERP_API = "api/lms/materialinfo";
}

View File

@@ -2,6 +2,7 @@ package org.nl.wms.ext_manage.service;
import com.alibaba.fastjson.JSONObject;
import org.nl.wms.ext_manage.dto.ErpGroupplateDto;
import org.nl.wms.ext_manage.dto.ErpMaterInfoDto;
import org.nl.wms.ext_manage.service.util.ErpResponse;
import java.util.List;
@@ -56,4 +57,24 @@ public interface ErpToWmsService {
* @return ErpResponse
*/
ErpResponse usematerinfo(JSONObject whereJson);
/**
* 获取物料信息
* @param whereJson {
* data : [
* {
* mater_code物料编码
* mater_name物料名称
* qty数量
* unit_code计量单位
* order_code单据号
* order_type单据类型,
* "floor_code": "楼层数"
* "hoist_code": "提升机编号"
* }
* ]
* }
* @return ErpResponse
*/
ErpResponse materialinfo(ErpMaterInfoDto erpMaterInfoDto);
}

View File

@@ -14,6 +14,8 @@ import org.nl.wms.basedata_manage.service.dao.BsrealStorattr;
import org.nl.wms.basedata_manage.service.dao.MdMeMaterialbase;
import org.nl.wms.basedata_manage.service.dao.MdPbMeasureunit;
import org.nl.wms.ext_manage.dto.ErpGroupplateDto;
import org.nl.wms.ext_manage.dto.ErpMaterInfoDataDto;
import org.nl.wms.ext_manage.dto.ErpMaterInfoDto;
import org.nl.wms.ext_manage.service.ErpToWmsService;
import org.nl.wms.ext_manage.service.util.ErpResponse;
import org.nl.wms.pm_manage.service.IPmFormDataService;
@@ -24,14 +26,13 @@ import org.nl.wms.warehouse_manage.service.IMdPbGroupplateService;
import org.nl.wms.warehouse_manage.service.dao.GroupPlate;
import org.nl.wms.warehouse_manage.service.dao.GroupPlateDtl;
import org.nl.wms.warehouse_manage.service.dao.mapper.MdPbGroupplateDtlMapper;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.*;
import java.util.stream.Collectors;
/**
@@ -332,4 +333,125 @@ public class ErpToWmsServiceImpl implements ErpToWmsService {
log.info("usematerinfo输出参数为-------------------" + ErpResponse.requestOk().toString());
return ErpResponse.requestOk();
}
/**
* 更新物料信息(存在则更新,不存在则新增,批量数据量比较多)
* @param erpMaterInfoDto
* @return
*/
@Override
@Transactional(rollbackFor = Exception.class)
public ErpResponse materialinfo(ErpMaterInfoDto erpMaterInfoDto) {
if(!"S".equals(erpMaterInfoDto.getStatus())){
return ErpResponse.requestError("报文异常");
}
if(CollectionUtil.isEmpty(erpMaterInfoDto.getData())) {
log.warn("接收到空的物料信息请求");
return ErpResponse.requestError("请求数据为空");
}
int insertCount = 0;
int updateCount = 0;
List<String> materialCodes = erpMaterInfoDto.getData().stream()
.map(ErpMaterInfoDataDto::getMaterial_code)
.collect(Collectors.toList());
//查询所有存在的数据
// 批量查询数据库中已存在的记录
List<MdMeMaterialbase> existingMaterial = iMdMeMaterialbaseService.list(new QueryWrapper<MdMeMaterialbase>().lambda()
.in(MdMeMaterialbase::getMaterial_code, materialCodes
));
// 将已存在的记录按code分组便于查找
Map<String, MdMeMaterialbase> existingDataMap = existingMaterial.stream()
.collect(Collectors.toMap(MdMeMaterialbase::getMaterial_code, entity -> entity));
// 分离需要新增和更新的数据
List<MdMeMaterialbase> toInsert = new ArrayList<>();
List<MdMeMaterialbase> toUpdate = new ArrayList<>();
//查询所有单位
List<MdPbMeasureunit> unitDaoList = iMdPbMeasureunitService.list(
new QueryWrapper<MdPbMeasureunit>().lambda()
.in(MdPbMeasureunit::getUnit_name, erpMaterInfoDto.getData().stream()
.map(ErpMaterInfoDataDto::getBase_unit)
.collect(Collectors.toList()))
);
Map<String, String> unitMap = unitDaoList.stream()
.collect(Collectors.toMap(
MdPbMeasureunit::getUnit_name, // 提取作为key
MdPbMeasureunit::getMeasure_unit_id, // 提取作为value
(oldValue, newValue) -> newValue, // 解决key冲突的策略这里保留新值
HashMap::new // 指定创建的Map类型
));
for (ErpMaterInfoDataDto data : erpMaterInfoDto.getData()) {
String materialCode = data.getMaterial_code();
if (existingDataMap.containsKey(materialCode)) {
// 存在则更新复制ID和需要更新的字段
MdMeMaterialbase existing = existingDataMap.get(materialCode);
existing.setUpdate_time(DateUtil.now());
existing.setUpdate_optname("erp");
existing.setMaterial_name(data.getMaterial_name());
existing.setMaterial_spec(data.getMaterial_spec());
existing.setBase_unit_id(unitMap.get(data.getBase_unit()));
// 设置其他需要更新的字段
toUpdate.add(existing);
updateCount++;
} else {
// 不存在则新增
MdMeMaterialbase insertEntity = new MdMeMaterialbase();
BeanUtils.copyProperties(data,insertEntity);
insertEntity.setBase_unit_id(unitMap.get(data.getBase_unit()));
insertEntity.setUpdate_time(DateUtil.now());
insertEntity.setUpdate_optname("erp");
insertEntity.setMaterial_id(IdUtil.getStringId());
insertEntity.setCreate_time(DateUtil.now());
insertEntity.setCreate_name("erp");
toInsert.add(insertEntity);
insertCount++;
}
}
// 批量执行操作
if (!toInsert.isEmpty()) {
// 可以分批处理避免SQL过长
batchInsert(toInsert, 500); // 每500条一批
}
if (!toUpdate.isEmpty()) {
// 批量更新
batchUpdate(toUpdate, 500); // 每500条一批
}
return ErpResponse.requestOk();
}
/**
* 分批插入
*/
private void batchInsert(List<MdMeMaterialbase> list, int batchSize) {
int total = list.size();
for (int i = 0; i < total; i += batchSize) {
int end = Math.min(i + batchSize, total);
iMdMeMaterialbaseService.saveBatch(list.subList(i, end));
}
}
/**
* 分批更新
* 这里使用save方法对于已有ID的实体会执行更新操作
*/
private void batchUpdate(List<MdMeMaterialbase> list, int batchSize) {
int total = list.size();
for (int i = 0; i < total; i += batchSize) {
int end = Math.min(i + batchSize, total);
iMdMeMaterialbaseService.saveOrUpdateBatch(list.subList(i, end));
}
}
}

View File

@@ -0,0 +1,80 @@
package org.nl.wms.sch_manage.service.util;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.http.HttpRequest;
import com.alibaba.fastjson.JSONObject;
import lombok.RequiredArgsConstructor;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.nl.wms.ext_manage.service.util.AcsResponse;
import org.nl.wms.system_manage.enums.SysParamConstant;
import org.nl.wms.system_manage.service.param.ISysParamService;
import org.nl.wms.system_manage.service.param.dao.Param;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.Date;
import static org.nl.wms.ext_manage.enums.EXTConstant.GET_MATERIAL_INFO_ERP_API;
@Slf4j
@Component
@RequiredArgsConstructor
public class GetMaterialInfoTask {
@Autowired
private ISysParamService paramService;
//定时任务
@SneakyThrows
public void run(String params) {
log.info("定时器正在执行下发任务调度...");
requestErp(params);
log.info("定时器执行下发任务调度结束...");
}
/**
* 定时下发任务
*/
private void requestErp(String params) {
Param erpUrlParam = paramService.findByCode(SysParamConstant.ERP_URL);
if (ObjectUtil.isEmpty(erpUrlParam)) {
log.error("系统参数表中:" + SysParamConstant.ERP_URL + "不存在");
return;
}
String url = erpUrlParam.getValue() + GET_MATERIAL_INFO_ERP_API;
try {
MaterialInfoRequestDto requestDto = JSONObject.parseObject(params,MaterialInfoRequestDto.class);
if(StringUtils.isBlank(requestDto.getStart_time())){
requestDto.setStart_time(DateUtil.formatDate(new Date()));
}
if(StringUtils.isBlank(requestDto.getEnd_time())){
requestDto.setEnd_time(DateUtil.formatDate(DateUtil.offsetDay(new Date(),1)));
}
if(null == requestDto.getFull_flag()){
requestDto.setFull_flag(false);
}
String resultMsg = HttpRequest.post(url)
.body(JSONObject.toJSONString(requestDto))
.execute().body();
log.info("请求ERP下发物料信息入参=【{}】",JSONObject.toJSONString(requestDto));
// 格式转换
JSONObject result = JSONObject.parseObject(resultMsg);
MaterialInfoRespondDto respondDto = JSONObject.toJavaObject(result, MaterialInfoRespondDto.class);
log.info("请求ERP下发物料信息返回参=【{}】",JSONObject.toJSONString(respondDto));
} catch (Exception e) {
//网络不通
String msg = e.getMessage();
log.error("连接失败:{}", msg);
}
}
}

View File

@@ -0,0 +1,16 @@
package org.nl.wms.sch_manage.service.util;
import lombok.Data;
import java.util.Map;
/**
* @Author: zhengxuming
*/
@Data
public class MaterialInfoRequestDto {
private String start_time;
private String end_time;
private Boolean full_flag;
private String material_code;
}

View File

@@ -0,0 +1,12 @@
package org.nl.wms.sch_manage.service.util;
import lombok.Data;
/**
* @Author: zhengxuming
*/
@Data
public class MaterialInfoRespondDto {
private String status;
private String message;
}

View File

@@ -7,7 +7,7 @@ import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import org.nl.common.exception.BadRequestException;
import org.nl.common.utils.CodeUtil;
import org.nl.common.utils.SecurityUtils;
import org.nl.common.utils.IdUtil;;
import org.nl.common.utils.IdUtil;
import org.nl.wms.basedata_manage.service.IStructattrService;
import org.nl.wms.basedata_manage.service.dao.Structattr;
import org.nl.wms.sch_manage.enums.TaskStatus;

View File

@@ -7,7 +7,7 @@ import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import org.nl.common.exception.BadRequestException;
import org.nl.common.utils.CodeUtil;
import org.nl.common.utils.SecurityUtils;
import org.nl.common.utils.IdUtil;;
import org.nl.common.utils.IdUtil;
import org.nl.wms.basedata_manage.service.IStructattrService;
import org.nl.wms.basedata_manage.service.dao.Structattr;
import org.nl.wms.sch_manage.enums.TaskStatus;

View File

@@ -6,7 +6,7 @@ import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import org.nl.common.exception.BadRequestException;
import org.nl.common.utils.SecurityUtils;
import org.nl.common.utils.IdUtil;;
import org.nl.common.utils.IdUtil;
import org.nl.wms.basedata_manage.enums.BaseDataEnum;
import org.nl.wms.sch_manage.enums.TaskStatus;
import org.nl.wms.sch_manage.service.ISchBaseTaskService;

View File

@@ -6,7 +6,7 @@ import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import org.nl.common.exception.BadRequestException;
import org.nl.common.utils.SecurityUtils;
import org.nl.common.utils.IdUtil;;
import org.nl.common.utils.IdUtil;
import org.nl.wms.basedata_manage.enums.BaseDataEnum;
import org.nl.wms.sch_manage.enums.TaskStatus;
import org.nl.wms.sch_manage.service.ISchBaseTaskService;

View File

@@ -7,7 +7,7 @@ import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import org.nl.common.exception.BadRequestException;
import org.nl.common.utils.CodeUtil;
import org.nl.common.utils.SecurityUtils;
import org.nl.common.utils.IdUtil;;
import org.nl.common.utils.IdUtil;
import org.nl.wms.basedata_manage.service.IStructattrService;
import org.nl.wms.basedata_manage.service.dao.Structattr;
import org.nl.wms.sch_manage.enums.TaskStatus;

View File

@@ -6,7 +6,7 @@ import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import org.nl.common.exception.BadRequestException;
import org.nl.common.utils.SecurityUtils;
import org.nl.common.utils.IdUtil;;
import org.nl.common.utils.IdUtil;
import org.nl.wms.basedata_manage.enums.BaseDataEnum;
import org.nl.wms.sch_manage.enums.TaskStatus;
import org.nl.wms.sch_manage.service.ISchBaseTaskService;

View File

@@ -13,7 +13,7 @@ import org.nl.common.domain.vo.DeptVo;
import org.nl.config.language.LangProcess;
import org.nl.wms.system_manage.service.dept.dto.DeptTree;
import org.nl.common.utils.CopyUtil;
import org.nl.common.utils.IdUtil;;
import org.nl.common.utils.IdUtil;
import org.nl.wms.system_manage.service.dept.ISysDeptService;
import org.nl.wms.system_manage.service.dept.dao.SysDept;
import org.nl.wms.system_manage.service.dept.dao.mapper.SysDeptMapper;

View File

@@ -19,7 +19,7 @@ import org.nl.common.utils.SecurityUtils;
import org.nl.common.domain.vo.MenuMetaVo;
import org.nl.common.domain.vo.MenuVo;
import org.nl.common.utils.CopyUtil;
import org.nl.common.utils.IdUtil;;
import org.nl.common.utils.IdUtil;
import org.nl.config.language.LangProcess;
import org.nl.wms.system_manage.service.dict.dao.Dict;
import org.nl.wms.system_manage.service.dict.dao.mapper.SysDictMapper;

View File

@@ -19,7 +19,7 @@ import org.nl.common.utils.dto.CurrentUser;
import org.nl.config.FileProperties;
import org.nl.common.utils.FileUtil;
import org.nl.common.utils.SecurityUtils;
import org.nl.common.utils.IdUtil;;
import org.nl.common.utils.IdUtil;
import org.nl.wms.system_manage.service.dept.ISysDeptService;
import org.nl.wms.system_manage.service.role.ISysRoleService;
import org.nl.wms.system_manage.service.secutiry.dto.AuthUserDto;

View File

@@ -16,7 +16,7 @@ import org.nl.common.domain.query.PageQuery;
import org.nl.common.exception.BadRequestException;
import org.nl.common.utils.CodeUtil;
import org.nl.common.utils.SecurityUtils;
import org.nl.common.utils.IdUtil;;
import org.nl.common.utils.IdUtil;
import org.nl.config.SpringContextHolder;
import org.nl.wms.basedata_manage.enums.BaseDataEnum;
import org.nl.wms.basedata_manage.service.IBsrealStorattrService;