no message

main
HUOJIN\92525 2024-04-26 18:27:58 +08:00
parent a5d73dc89f
commit b9ef72ea63
8 changed files with 260 additions and 140 deletions

View File

@ -213,6 +213,18 @@ public class Item extends BaseEntity implements Serializable {
@ApiModelProperty(value = "agv场景") @ApiModelProperty(value = "agv场景")
private AgvScene agvScene; private AgvScene agvScene;
public Item() {
}
public Item(String code, String name, String unit,Dept dept,String sourceName,Long sourceId) {
this.code = code;
this.name = name;
this.unit = unit;
this.dept = dept;
this.sourceName = sourceName;
this.sourceId = sourceId;
}
public void copy(Item source){ public void copy(Item source){
BeanUtil.copyProperties(source,this, CopyOptions.create().setIgnoreNullValue(true)); BeanUtil.copyProperties(source,this, CopyOptions.create().setIgnoreNullValue(true));
} }

View File

@ -28,6 +28,7 @@ import org.springframework.web.multipart.MultipartFile;
import java.util.Map; import java.util.Map;
import java.util.List; import java.util.List;
import java.io.IOException; import java.io.IOException;
import java.util.Set;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
/** /**
@ -112,4 +113,11 @@ public interface ItemService {
*/ */
Item existItem(String itemCode); Item existItem(String itemCode);
/**
*
* @param itemCodes
* @return
*/
Map<String,Item> findByItemCodes(Set itemCodes);
} }

View File

@ -32,21 +32,19 @@ import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import org.springframework.data.domain.Page; import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Pageable;
import java.util.List;
import java.util.Map; import java.util.*;
import java.io.IOException; import java.io.IOException;
import javax.persistence.EntityManager; import javax.persistence.EntityManager;
import javax.persistence.Query; import javax.persistence.Query;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import org.springframework.data.domain.Example; import org.springframework.data.domain.Example;
import java.util.Optional;
/** /**
* @author houjianlan
* @website https://eladmin.vip * @website https://eladmin.vip
* @description * @description
* @author houjianlan
* @date 2023-08-07 * @date 2023-08-07
**/ **/
@Service @Service
@ -82,6 +80,7 @@ public class ItemServiceImpl implements ItemService {
Item item = itemRepository.findById(id).orElseGet(Item::new); Item item = itemRepository.findById(id).orElseGet(Item::new);
return item; return item;
} }
@Override @Override
@Transactional @Transactional
public ItemDto findByCode(String itemCode) { public ItemDto findByCode(String itemCode) {
@ -173,4 +172,17 @@ public class ItemServiceImpl implements ItemService {
return null; return null;
} }
@Override
public Map<String, Item> findByItemCodes(Set itemCodes) {
String hql = " from Item it where it.code in (:itemCodes) ";
Query query = entityMapper.createQuery(hql);
query.setParameter("itemCodes", itemCodes);
List<Item> its = query.getResultList();
Map<String, Item> itemMap = new HashMap<>();
for (Item item : its) {
itemMap.put(item.getCode(), item);
}
return itemMap;
}
} }

View File

@ -19,9 +19,12 @@ import com.youchain.businessdata.domain.Mo;
import com.youchain.businessdata.service.dto.MoDto; import com.youchain.businessdata.service.dto.MoDto;
import com.youchain.businessdata.service.dto.MoQueryCriteria; import com.youchain.businessdata.service.dto.MoQueryCriteria;
import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Pageable;
import org.springframework.scheduling.annotation.Async;
import java.util.Map; import java.util.Map;
import java.util.List; import java.util.List;
import java.io.IOException; import java.io.IOException;
import java.util.Set;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
/** /**
@ -95,4 +98,25 @@ public interface MoService {
* @param mo MO * @param mo MO
*/ */
void scanMo(String mo); void scanMo(String mo);
/**
* labelNosMO
* @param labelNos labelNos
* @return Map<String,Mo>
*/
Map<String,Mo> findBylabelNos(Set labelNos);
/**
* MO
* @param mos MO
*/
@Async
void batchCreateMos(List<Mo> mos);
/**
* MO
* @param mos MO
*/
@Async
void batchUpdateMos(List<Mo> mos);
} }

View File

@ -19,10 +19,7 @@ import com.youchain.exception.handler.ApiResult;
import com.youchain.modules.system.domain.Dept; import com.youchain.modules.system.domain.Dept;
import com.youchain.modules.system.service.DeptService; import com.youchain.modules.system.service.DeptService;
import com.youchain.modules.system.service.dto.DeptDto; import com.youchain.modules.system.service.dto.DeptDto;
import com.youchain.utils.BizStatus; import com.youchain.utils.*;
import com.youchain.utils.HttpPostUtil;
import com.youchain.utils.StringUtils;
import com.youchain.utils.UrlApi;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
@ -265,24 +262,102 @@ public class MlsServiceImpl implements MlsService {
if (details == null || details.size() == 0) { if (details == null || details.size() == 0) {
throw new RuntimeException("没有获取到MO票数据!"); throw new RuntimeException("没有获取到MO票数据!");
} }
List<Mo> mosToCreate = new ArrayList<>();//新增Mo集合
List<Mo> mosToUpdate = new ArrayList<>();//修改Mo集合
//获取所有物料编码
Set<String> itemCodes = details.stream()
.map(detail -> ((JSONObject) detail).getString("itemCode"))
.collect(Collectors.toSet());
//获取已存在的物料
Map<String, Item> existingItems = itemService.findByItemCodes(itemCodes);
//获取所有MO票
Set<String> labelNos = details.stream()
.map(detail -> ((JSONObject) detail).getString("labelNo"))
.collect(Collectors.toSet());
//获取已存在的MO票
Map<String, Mo> existingMos = moService.findBylabelNos(labelNos);
//循环处理每个MO票 //循环处理每个MO票
for (int i = 0; i < details.size(); i++) { for (int i = 0; i < details.size(); i++) {
JSONObject detail = details.getJSONObject(i); JSONObject detail = details.getJSONObject(i);
String labelState = detail.getString("labelState");//标签状态
if ("PRINTED".equals(labelState)) {
//物料编码
String itemCode = detail.getString("itemCode");
Item item = null;
if (existingItems.containsKey(itemCode)) {
item = existingItems.get(itemCode);
} else {
//新增物料
item = createItem(detail);
}
//MO票
String labelNo = detail.getString("labelNo");
//判断是否已存在MO票
if (existingMos.containsKey(labelNo)) {
Mo existingMo = existingMos.get(labelNo);
//更新MO票信息
mosToUpdate.add(updateMo(existingMo, detail));
} else {
//新增MO票
mosToCreate.add(createMo(detail, item));
}
}
}
//批量新增Mo票
if (!mosToCreate.isEmpty()) {
moService.batchCreateMos(mosToCreate);
}
//批量更新Mo票
if (!mosToUpdate.isEmpty()) {
moService.batchUpdateMos(mosToUpdate);
}
}
/**
*
*
* @param detail
* @return
*/
private Item createItem(JSONObject detail) {
String itemCode = detail.getString("itemCode");//物料编码
String itemDesc = detail.getString("itemDesc");//物料描述
String uom = detail.getString("uom");//单位
String sourceSystem = detail.getString("sourceSystem");//来源系统
Long itemId = detail.getLong("itemId");//物料id
//创建
Item Item = new Item(itemCode, itemDesc, uom, UserUtils.getDept(), sourceSystem, itemId);
itemService.create(Item);
return Item;
}
/**
* Mo
*
* @param detail
*/
private Mo createMo(JSONObject detail, Item item) {
Integer selfWorkOrderId = detail.getInteger("selfWorkOrderId");//自制件工单id Integer selfWorkOrderId = detail.getInteger("selfWorkOrderId");//自制件工单id
String sourceSystem = detail.getString("sourceSystem");//来源系统 String sourceSystem = detail.getString("sourceSystem");//来源系统
String selfWorkOrderName = detail.getString("selfWorkOrderName");//自制件工单编号 String selfWorkOrderName = detail.getString("selfWorkOrderName");//自制件工单编号
String itemCode = detail.getString("itemCode");//物料编码
String labelType = detail.getString("labelType");//标签类型 String labelType = detail.getString("labelType");//标签类型
String goodsAreaCode = detail.getString("goodsAreaCode");//MLS货区 String goodsAreaCode = detail.getString("goodsAreaCode");//MLS货区
String checkResult = detail.getString("checkResult");//检验状态 String checkResult = detail.getString("checkResult");//检验状态
String datetimeStockIn = detail.getString("datetimeStockin");//入库时间 String datetimeStockIn = detail.getString("datetimeStockin");//入库时间
String deleteFlag = detail.getString("deleteFlag");//数据有效性有效0无效1 String deleteFlag = detail.getString("deleteFlag");//数据有效性有效0无效1
String uom = detail.getString("uom");//单位
String createUserCode = detail.getString("createUserCode");//创建人 String createUserCode = detail.getString("createUserCode");//创建人
String mlsUpdateTime = detail.getString("updateTime");//修改时间 String mlsUpdateTime = detail.getString("updateTime");//修改时间
String itemDesc = detail.getString("itemDesc");//物料描述
String labelNo = detail.getString("labelNo");//MO票 String labelNo = detail.getString("labelNo");//MO票
Long itemId = detail.getLong("itemId");//物料id
String updateUserCode = detail.getString("updateUserCode");//修改人 String updateUserCode = detail.getString("updateUserCode");//修改人
String mlsCreateTime = detail.getString("createTime");//创建时间 String mlsCreateTime = detail.getString("createTime");//创建时间
Double qty = detail.getDouble("qty") == null ? 0 : detail.getDouble("qty");//可用数量 Double qty = detail.getDouble("qty") == null ? 0 : detail.getDouble("qty");//可用数量
@ -293,25 +368,6 @@ public class MlsServiceImpl implements MlsService {
String goodsLocationCode = detail.getString("goodsLocationCode");//MLS货位 String goodsLocationCode = detail.getString("goodsLocationCode");//MLS货位
String invCode = detail.getString("invCode");//MLS子库 String invCode = detail.getString("invCode");//MLS子库
if ("PRINTED".equals(labelState)) {
//判断物料是否存在;不存在新增;
ItemDto itemDto = itemService.findByCode(itemCode);
Item item = itemService.toEntity(itemDto);
if (item == null) {
item = new Item();
item.setCode(itemCode);
item.setName(itemDesc);
item.setUnit(uom);
DeptDto deptDto = deptService.findById(7L);
Dept dept = deptService.toEntity(deptDto);
item.setDept(dept);
item.setSourceName(sourceSystem);
item.setSourceId(itemId);
itemService.create(item);
}
MoDto moDto = moService.findByLabelNo(labelNo);
if (moDto == null) {
Mo mo = new Mo(labelNo, labelType, labelState, deliveryHeaderId, sourceSystem, qty, Mo mo = new Mo(labelNo, labelType, labelState, deliveryHeaderId, sourceSystem, qty,
workOrderId, workOrderName, selfWorkOrderId, selfWorkOrderName, null, item, workOrderId, workOrderName, selfWorkOrderId, selfWorkOrderName, null, item,
checkResult, Boolean.parseBoolean(deleteFlag), null, null, null, null, invCode, goodsAreaCode, goodsLocationCode, checkResult, Boolean.parseBoolean(deleteFlag), null, null, null, null, invCode, goodsAreaCode, goodsLocationCode,
@ -320,33 +376,16 @@ public class MlsServiceImpl implements MlsService {
mlsUpdateTime == null ? null : DateUtil.parse(mlsUpdateTime).toTimestamp(), mlsUpdateTime == null ? null : DateUtil.parse(mlsUpdateTime).toTimestamp(),
createUserCode, updateUserCode createUserCode, updateUserCode
); );
moService.create(mo);
} else { return mo;
Mo mo = moService.toEntity(moDto);
mo.setLabelType(labelType);
mo.setLabelState(labelState);
mo.setDeliveryHeaderId(deliveryHeaderId);
mo.setSourceSystem(sourceSystem);
mo.setQty(qty);
mo.setWorkOrderId(workOrderId);
mo.setWorkOrderName(workOrderName);
mo.setSelfWorkOrderId(selfWorkOrderId);
mo.setSelfWorkOrderName(selfWorkOrderName);
mo.setDatetimeStockIn(datetimeStockIn == null ? null : DateUtil.parse(datetimeStockIn).toTimestamp());
mo.setItem(item);
mo.setCheckResult(checkResult);
mo.setDeleteFlag(Boolean.parseBoolean(deleteFlag));
mo.setInvCode(invCode);
mo.setGoodsAreaCode(goodsAreaCode);
mo.setGoodsLocationCode(goodsLocationCode);
mo.setMlsUpdateTime(mlsUpdateTime == null ? null : DateUtil.parse(mlsUpdateTime).toTimestamp());
mo.setUpdateUserCode(updateUserCode);
moService.update(mo);
}
} }
private Mo updateMo(Mo mo, JSONObject detail) {
} mo.setCheckResult(detail.getString("checkResult"));
mo.setDeleteFlag(Boolean.parseBoolean(detail.getString("deleteFlag")));
mo.setMlsUpdateTime(detail.getString("updateTime") == null ? null : DateUtil.parse(detail.getString("updateTime")).toTimestamp());
mo.setUpdateUserCode(detail.getString("updateUserCode"));
return mo;
} }
@Override @Override

View File

@ -15,9 +15,6 @@
*/ */
package com.youchain.businessdata.service.impl; package com.youchain.businessdata.service.impl;
import cn.hutool.core.date.DateUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.youchain.basicdata.domain.Item; import com.youchain.basicdata.domain.Item;
import com.youchain.basicdata.domain.Point; import com.youchain.basicdata.domain.Point;
import com.youchain.basicdata.domain.Stock; import com.youchain.basicdata.domain.Stock;
@ -27,8 +24,6 @@ import com.youchain.basicdata.service.StockService;
import com.youchain.businessdata.domain.*; import com.youchain.businessdata.domain.*;
import com.youchain.businessdata.service.*; import com.youchain.businessdata.service.*;
import com.youchain.businessdata.service.dto.OrderDto; import com.youchain.businessdata.service.dto.OrderDto;
import com.youchain.exception.EntityExistException;
import com.youchain.exception.handler.ApiResult;
import com.youchain.modules.system.service.DictService; import com.youchain.modules.system.service.DictService;
import com.youchain.utils.*; import com.youchain.utils.*;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
@ -36,21 +31,16 @@ import com.youchain.businessdata.repository.MoRepository;
import com.youchain.businessdata.service.dto.MoDto; import com.youchain.businessdata.service.dto.MoDto;
import com.youchain.businessdata.service.dto.MoQueryCriteria; import com.youchain.businessdata.service.dto.MoQueryCriteria;
import com.youchain.businessdata.service.mapstruct.MoMapper; import com.youchain.businessdata.service.mapstruct.MoMapper;
import org.springframework.data.domain.Example;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
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.data.domain.Page; import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Pageable;
import java.util.*; import java.util.*;
import java.io.IOException; import java.io.IOException;
import javax.persistence.EntityManager; import javax.persistence.EntityManager;
import javax.persistence.Query; import javax.persistence.Query;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import static org.springframework.http.HttpStatus.BAD_REQUEST;
/** /**
* @author huojin * @author huojin
@ -68,13 +58,11 @@ public class MoServiceImpl implements MoService {
private final OrderService orderService; private final OrderService orderService;
private final ItemService itemService; private final ItemService itemService;
private final StockService stockService; private final StockService stockService;
private final InventoryService inventoryService;
private final PointService pointService; private final PointService pointService;
private final AgvTaskService agvTaskService; private final AgvTaskService agvTaskService;
private final TaskService taskService; private final TaskService taskService;
private final AsnDetailService asnDetailService; private final AsnDetailService asnDetailService;
private final ItemKeyService itemKeyService; private final ItemKeyService itemKeyService;
private final DictService dictService;
@Override @Override
public Map<String, Object> queryAll(MoQueryCriteria criteria, Pageable pageable) { public Map<String, Object> queryAll(MoQueryCriteria criteria, Pageable pageable) {
@ -232,6 +220,50 @@ public class MoServiceImpl implements MoService {
} }
@Override
public Map<String, Mo> findBylabelNos(Set labelNos) {
String hql = "from Mo where labelNo in (:labelNos) ";
Query query = entityManager.createQuery(hql);
query.setParameter("labelNos", labelNos);
List<Mo> list = query.getResultList();
Map<String, Mo> map = new HashMap<>();
for (Mo mo : list) {
map.put(mo.getLabelNo(), mo);
}
return map;
}
@Override
@Transactional(rollbackFor = Exception.class)
public void batchCreateMos(List<Mo> mos) {
int batchSize = 50; // 根据需求调整批处理大小
for (int i = 0; i < mos.size(); i++) {
entityManager.persist(mos.get(i));
if (i % batchSize == 0 && i > 0) {
entityManager.flush(); // 批量提交
entityManager.clear(); // 清理缓存
}
}
entityManager.flush(); // 最后确保所有剩余的实体也被flush到数据库
entityManager.clear();
}
@Override
@Transactional(rollbackFor = Exception.class)
public void batchUpdateMos(List<Mo> mos) {
int batchSize = 50; // 根据需求调整批处理大小
for (int i = 0; i < mos.size(); i++) {
Mo mo = mos.get(i);
entityManager.merge(mo); // 更新实体
if (i % batchSize == 0 && i > 0) { // 每处理50个实体执行一次flush和clear
entityManager.flush();
entityManager.clear();
}
}
entityManager.flush(); // 确保最后的更改也被写入数据库
entityManager.clear(); // 清理持久化上下文以释放内存
}
public void createTasks(Item item, Stock stock, Point srcPoint, Point endPoint, String propC1, MoDto moDto, OrderDto orderDto) { public void createTasks(Item item, Stock stock, Point srcPoint, Point endPoint, String propC1, MoDto moDto, OrderDto orderDto) {
// 生成AGV任务 // 生成AGV任务
AgvTask agvTask = new AgvTask(BizStatus.ASN, stock.getCode(), srcPoint.getCode(), endPoint.getCode(), BizStatus.OPEN, "RACK_MOVE_FULL"); AgvTask agvTask = new AgvTask(BizStatus.ASN, stock.getCode(), srcPoint.getCode(), endPoint.getCode(), BizStatus.OPEN, "RACK_MOVE_FULL");

View File

@ -139,7 +139,7 @@ public class OrderServiceImpl implements OrderService {
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public void batchUpdateOrders(List<Order> orders) { public void batchUpdateOrders(List<Order> orders) {
int batchSize = 100; // 根据需求调整批处理大小 int batchSize = 50; // 根据需求调整批处理大小
for (int i = 0; i < orders.size(); i++) { for (int i = 0; i < orders.size(); i++) {
Order order = orders.get(i); Order order = orders.get(i);
entityManager.merge(order); // 更新实体 entityManager.merge(order); // 更新实体

View File

@ -23,16 +23,9 @@ public class moTask {
public MlsService mlsService; public MlsService mlsService;
public void moTask() { public void moTask() {
try {
log.info("获取mo信息");
MoInfo moInfo = getMoInfo(); MoInfo moInfo = getMoInfo();
String moJson = mlsService.getMoJson(moInfo); String moJson = mlsService.getMoJson(moInfo);
mlsService.getMoInfo(moJson); mlsService.getMoInfo(moJson);
} catch (Exception e) {
throw new RuntimeException("MLS异常信息:" + e);
}
} }
public MoInfo getMoInfo() { public MoInfo getMoInfo() {