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场景")
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){
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.List;
import java.io.IOException;
import java.util.Set;
import javax.servlet.http.HttpServletResponse;
/**
@ -111,5 +112,12 @@ public interface ItemService {
* @return
*/
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.data.domain.Page;
import org.springframework.data.domain.Pageable;
import java.util.List;
import java.util.Map;
import java.util.*;
import java.io.IOException;
import javax.persistence.EntityManager;
import javax.persistence.Query;
import javax.servlet.http.HttpServletResponse;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import org.springframework.data.domain.Example;
import java.util.Optional;
/**
* @author houjianlan
* @website https://eladmin.vip
* @description
* @author houjianlan
* @date 2023-08-07
**/
@Service
@ -58,21 +56,21 @@ public class ItemServiceImpl implements ItemService {
private final EntityManager entityMapper;
@Override
public Map<String,Object> queryAll(ItemQueryCriteria criteria, Pageable pageable){
Page<Item> page = itemRepository.findAll((root, criteriaQuery, criteriaBuilder) -> QueryHelp.getPredicate(root,criteria,criteriaBuilder),pageable);
public Map<String, Object> queryAll(ItemQueryCriteria criteria, Pageable pageable) {
Page<Item> page = itemRepository.findAll((root, criteriaQuery, criteriaBuilder) -> QueryHelp.getPredicate(root, criteria, criteriaBuilder), pageable);
return PageUtil.toPage(page.map(itemMapper::toDto));
}
@Override
public List<ItemDto> queryAll(ItemQueryCriteria criteria){
return itemMapper.toDto(itemRepository.findAll((root, criteriaQuery, criteriaBuilder) -> QueryHelp.getPredicate(root,criteria,criteriaBuilder)));
public List<ItemDto> queryAll(ItemQueryCriteria criteria) {
return itemMapper.toDto(itemRepository.findAll((root, criteriaQuery, criteriaBuilder) -> QueryHelp.getPredicate(root, criteria, criteriaBuilder)));
}
@Override
@Transactional
public ItemDto findById(Long id) {
Item item = itemRepository.findById(id).orElseGet(Item::new);
ValidationUtil.isNull(item.getId(),"Item","id",id);
ValidationUtil.isNull(item.getId(), "Item", "id", id);
return itemMapper.toDto(item);
}
@ -82,16 +80,17 @@ public class ItemServiceImpl implements ItemService {
Item item = itemRepository.findById(id).orElseGet(Item::new);
return item;
}
@Override
@Transactional
public ItemDto findByCode(String itemCode) {
Item itemExample = new Item();
itemExample.setCode(itemCode);
Example<Item> example = Example.of(itemExample);
List<Item> its=itemRepository.findAll(example);
if(its.size()>0){
List<Item> its = itemRepository.findAll(example);
if (its.size() > 0) {
return itemMapper.toDto(its.get(0));
}else {
} else {
return null;
}
}
@ -106,7 +105,7 @@ public class ItemServiceImpl implements ItemService {
@Transactional(rollbackFor = Exception.class)
public void update(Item resources) {
Item item = itemRepository.findById(resources.getId()).orElseGet(Item::new);
ValidationUtil.isNull( item.getId(),"Item","id",resources.getId());
ValidationUtil.isNull(item.getId(), "Item", "id", resources.getId());
item.copy(resources);
itemRepository.save(item);
}
@ -122,7 +121,7 @@ public class ItemServiceImpl implements ItemService {
public void download(List<ItemDto> all, HttpServletResponse response) throws IOException {
List<Map<String, Object>> list = new ArrayList<>();
for (ItemDto item : all) {
Map<String,Object> map = new LinkedHashMap<>();
Map<String, Object> map = new LinkedHashMap<>();
map.put("代码", item.getCode());
map.put("名称", item.getName());
map.put("规格", item.getSpecs());
@ -163,14 +162,27 @@ public class ItemServiceImpl implements ItemService {
@Override
public Item existItem(String itemCode){
String hql=" from Item it where it.code='"+itemCode+"' and it.enabled=true ";
Query query=entityMapper.createQuery(hql);
List<Item> its=query.getResultList();
if(its.size()>0){
public Item existItem(String itemCode) {
String hql = " from Item it where it.code='" + itemCode + "' and it.enabled=true ";
Query query = entityMapper.createQuery(hql);
List<Item> its = query.getResultList();
if (its.size() > 0) {
return its.get(0);
}
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.MoQueryCriteria;
import org.springframework.data.domain.Pageable;
import org.springframework.scheduling.annotation.Async;
import java.util.Map;
import java.util.List;
import java.io.IOException;
import java.util.Set;
import javax.servlet.http.HttpServletResponse;
/**
@ -95,4 +98,25 @@ public interface MoService {
* @param mo 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.service.DeptService;
import com.youchain.modules.system.service.dto.DeptDto;
import com.youchain.utils.BizStatus;
import com.youchain.utils.HttpPostUtil;
import com.youchain.utils.StringUtils;
import com.youchain.utils.UrlApi;
import com.youchain.utils.*;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
@ -265,88 +262,130 @@ public class MlsServiceImpl implements MlsService {
if (details == null || details.size() == 0) {
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票
for (int i = 0; i < details.size(); i++) {
JSONObject detail = details.getJSONObject(i);
Integer selfWorkOrderId = detail.getInteger("selfWorkOrderId");//自制件工单id
String sourceSystem = detail.getString("sourceSystem");//来源系统
String selfWorkOrderName = detail.getString("selfWorkOrderName");//自制件工单编号
String itemCode = detail.getString("itemCode");//物料编码
String labelType = detail.getString("labelType");//标签类型
String goodsAreaCode = detail.getString("goodsAreaCode");//MLS货区
String checkResult = detail.getString("checkResult");//检验状态
String datetimeStockIn = detail.getString("datetimeStockin");//入库时间
String deleteFlag = detail.getString("deleteFlag");//数据有效性有效0无效1
String uom = detail.getString("uom");//单位
String createUserCode = detail.getString("createUserCode");//创建人
String mlsUpdateTime = detail.getString("updateTime");//修改时间
String itemDesc = detail.getString("itemDesc");//物料描述
String labelNo = detail.getString("labelNo");//MO票
Long itemId = detail.getLong("itemId");//物料id
String updateUserCode = detail.getString("updateUserCode");//修改人
String mlsCreateTime = detail.getString("createTime");//创建时间
Double qty = detail.getDouble("qty") == null ? 0 : detail.getDouble("qty");//可用数量
String labelState = detail.getString("labelState");//标签状态
Integer deliveryHeaderId = detail.getInteger("deliveryHeaderId");//送货单头ID通过该字段能找到002接口送货单
String workOrderName = detail.getString("workOrderName");//工单编号
Integer workOrderId = detail.getInteger("workOrderId");//工单Id
String goodsLocationCode = detail.getString("goodsLocationCode");//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);
//物料编码
String itemCode = detail.getString("itemCode");
Item item = null;
if (existingItems.containsKey(itemCode)) {
item = existingItems.get(itemCode);
} else {
//新增物料
item = createItem(detail);
}
MoDto moDto = moService.findByLabelNo(labelNo);
if (moDto == null) {
Mo mo = new Mo(labelNo, labelType, labelState, deliveryHeaderId, sourceSystem, qty,
workOrderId, workOrderName, selfWorkOrderId, selfWorkOrderName, null, item,
checkResult, Boolean.parseBoolean(deleteFlag), null, null, null, null, invCode, goodsAreaCode, goodsLocationCode,
datetimeStockIn == null ? null : DateUtil.parse(datetimeStockIn).toTimestamp(),
mlsCreateTime == null ? null : DateUtil.parse(mlsCreateTime).toTimestamp(),
mlsUpdateTime == null ? null : DateUtil.parse(mlsUpdateTime).toTimestamp(),
createUserCode, updateUserCode
);
moService.create(mo);
//MO票
String labelNo = detail.getString("labelNo");
//判断是否已存在MO票
if (existingMos.containsKey(labelNo)) {
Mo existingMo = existingMos.get(labelNo);
//更新MO票信息
mosToUpdate.add(updateMo(existingMo, detail));
} else {
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);
//新增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
String sourceSystem = detail.getString("sourceSystem");//来源系统
String selfWorkOrderName = detail.getString("selfWorkOrderName");//自制件工单编号
String labelType = detail.getString("labelType");//标签类型
String goodsAreaCode = detail.getString("goodsAreaCode");//MLS货区
String checkResult = detail.getString("checkResult");//检验状态
String datetimeStockIn = detail.getString("datetimeStockin");//入库时间
String deleteFlag = detail.getString("deleteFlag");//数据有效性有效0无效1
String createUserCode = detail.getString("createUserCode");//创建人
String mlsUpdateTime = detail.getString("updateTime");//修改时间
String labelNo = detail.getString("labelNo");//MO票
String updateUserCode = detail.getString("updateUserCode");//修改人
String mlsCreateTime = detail.getString("createTime");//创建时间
Double qty = detail.getDouble("qty") == null ? 0 : detail.getDouble("qty");//可用数量
String labelState = detail.getString("labelState");//标签状态
Integer deliveryHeaderId = detail.getInteger("deliveryHeaderId");//送货单头ID通过该字段能找到002接口送货单
String workOrderName = detail.getString("workOrderName");//工单编号
Integer workOrderId = detail.getInteger("workOrderId");//工单Id
String goodsLocationCode = detail.getString("goodsLocationCode");//MLS货位
String invCode = detail.getString("invCode");//MLS子库
Mo mo = new Mo(labelNo, labelType, labelState, deliveryHeaderId, sourceSystem, qty,
workOrderId, workOrderName, selfWorkOrderId, selfWorkOrderName, null, item,
checkResult, Boolean.parseBoolean(deleteFlag), null, null, null, null, invCode, goodsAreaCode, goodsLocationCode,
datetimeStockIn == null ? null : DateUtil.parse(datetimeStockIn).toTimestamp(),
mlsCreateTime == null ? null : DateUtil.parse(mlsCreateTime).toTimestamp(),
mlsUpdateTime == null ? null : DateUtil.parse(mlsUpdateTime).toTimestamp(),
createUserCode, updateUserCode
);
return 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

View File

@ -15,9 +15,6 @@
*/
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.Point;
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.service.*;
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.utils.*;
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.MoQueryCriteria;
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.transaction.annotation.Transactional;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import java.util.*;
import java.io.IOException;
import javax.persistence.EntityManager;
import javax.persistence.Query;
import javax.servlet.http.HttpServletResponse;
import static org.springframework.http.HttpStatus.BAD_REQUEST;
/**
* @author huojin
@ -68,13 +58,11 @@ public class MoServiceImpl implements MoService {
private final OrderService orderService;
private final ItemService itemService;
private final StockService stockService;
private final InventoryService inventoryService;
private final PointService pointService;
private final AgvTaskService agvTaskService;
private final TaskService taskService;
private final AsnDetailService asnDetailService;
private final ItemKeyService itemKeyService;
private final DictService dictService;
@Override
public Map<String, Object> queryAll(MoQueryCriteria criteria, Pageable pageable) {
@ -136,20 +124,20 @@ public class MoServiceImpl implements MoService {
for (MoDto mo : all) {
Map<String, Object> map = new LinkedHashMap<>();
map.put("送货单头ID", mo.getDeliveryHeaderId());
map.put("MO票",mo.getLabelNo());
map.put("物料编码",mo.getItem().getCode());
map.put("物料描述",mo.getItem().getName());
map.put("可用数量",mo.getQty());
map.put("标签类型",mo.getLabelType());
map.put("是否有效",mo.getDeleteFlag());
map.put("标签状态",mo.getLabelState());
map.put("检验状态",mo.getCheckResult());
map.put("mls子库",mo.getInvCode());
map.put("mls入库时间",mo.getDatetimeStockIn());
map.put("mls修改时间",mo.getMlsUpdateTime());
map.put("mls创建时间",mo.getMlsCreateTime());
map.put("wms接收时间",mo.getCreateTime());
map.put("wms修改时间",mo.getUpdateTime());
map.put("MO票", mo.getLabelNo());
map.put("物料编码", mo.getItem().getCode());
map.put("物料描述", mo.getItem().getName());
map.put("可用数量", mo.getQty());
map.put("标签类型", mo.getLabelType());
map.put("是否有效", mo.getDeleteFlag());
map.put("标签状态", mo.getLabelState());
map.put("检验状态", mo.getCheckResult());
map.put("mls子库", mo.getInvCode());
map.put("mls入库时间", mo.getDatetimeStockIn());
map.put("mls修改时间", mo.getMlsUpdateTime());
map.put("mls创建时间", mo.getMlsCreateTime());
map.put("wms接收时间", mo.getCreateTime());
map.put("wms修改时间", mo.getUpdateTime());
list.add(map);
}
FileUtil.downloadExcel(list, response);
@ -162,7 +150,7 @@ public class MoServiceImpl implements MoService {
@Override
@Transactional(rollbackFor = Exception.class)
public void scanMo(String mo) {
public void scanMo(String mo) {
//条码格式12227000016951-qth1847-240411422924
String[] arr = mo.split("-");
@ -227,12 +215,56 @@ public class MoServiceImpl implements MoService {
createTasks(item, stock, srcPoint, endPoint, moDto.getLabelNo(), moDto, orderDto);
// 更新容器状态和目标点位状态
updateStockAndEndPoint(stock,endPoint);
updateStockAndEndPoint(stock, endPoint);
}
public void createTasks(Item item, Stock stock, Point srcPoint, Point endPoint, String propC1, MoDto moDto, OrderDto orderDto) {
@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) {
// 生成AGV任务
AgvTask agvTask = new AgvTask(BizStatus.ASN, stock.getCode(), srcPoint.getCode(), endPoint.getCode(), BizStatus.OPEN, "RACK_MOVE_FULL");
agvTaskService.create(agvTask);
@ -253,7 +285,7 @@ public class MoServiceImpl implements MoService {
}
// 提取更新容器状态和目标点位状态的逻辑到单独方法
private void updateStockAndEndPoint(Stock stock,Point point) {
private void updateStockAndEndPoint(Stock stock, Point point) {
stock.setStatus(BaseStatus.USED);
stock.setPoint(point);
stockService.update(stock);

View File

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

View File

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