opt:新增ERP接口
This commit is contained in:
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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";
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user