Commit ee164710 LN

增加dispatch接口

1 个父辈 6dbd7ddf
......@@ -14,6 +14,8 @@ import com.neotel.smfcore.core.system.bean.OrderSetting;
import lombok.extern.slf4j.Slf4j;
import org.apache.logging.log4j.util.Strings;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.stereotype.Service;
import java.io.File;
......@@ -100,6 +102,82 @@ public class DefaultOrderFileListener implements IOrderFileListener {
}
@Override
public boolean handleOrderFile(File orderFile, String mode, String reason) {
String fileName = orderFile.getName();
//String backupFileName = fileName +"_" + System.currentTimeMillis();
//看数据库是否已有此工单
// if(!fileName.endsWith(".process") && fileName.endsWith("_result.txt")){
//
// }
if (isFileType(fileName, "csv") || isFileType(fileName, "xlsx")) {
LiteOrder fileNameOrder = liteOrderManager.findBySource(fileName);
if (fileNameOrder == null) {
try {
Map<String, List<LiteOrderItem>> itemMap = null;
if (isFileType(fileName, "csv")) {
itemMap = readCsvFile(fileName, orderFile.getAbsolutePath());
} else if (isFileType(fileName, "xlsx")) {
itemMap = readExcelFile(fileName, orderFile.getAbsolutePath());
}
//新增为一个工单
String orderName = reason;
if(ObjectUtil.isEmpty(reason)) {
List<LiteOrder> orders = liteOrderManager.findByQuery(new Query(Criteria.where("mode").is(mode)));
orderName = mode + (orders.size() + 1);
}
LiteOrder dbOrder = liteOrderManager.findByOrderNo(orderName);
if (dbOrder != null) {
SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmmss");
//把名字改为带时间的
String newOrderNo = orderName + "-" + format.format(new Date());
dbOrder = liteOrderManager.findByOrderNo(newOrderNo);
if (dbOrder == null) {
} else {
log.info("watchOrderDir,mode=[" + mode + "],reason=[" + reason + "]:数据库中已存在工单号为[" + orderName + "],忽略文件:" + orderFile.getAbsolutePath());
//resultFile = new File(localDir+File.separator + "error",backupFileName);
return false;
}
}
List<LiteOrderItem> allItems = new ArrayList<>();
if (itemMap != null && itemMap.size() > 0) {
for (String so : itemMap.keySet()) {
List<LiteOrderItem> liteOrderItems = itemMap.get(so);
if (liteOrderItems.size() <= 0) {
continue;
}
allItems.addAll(liteOrderItems);
}
}
if (allItems.size() <= 0) {
return false;
}
LiteOrder liteOrder = new LiteOrder(orderName, allItems);
liteOrder.setMode(mode);
log.info("watchOrderDir,mode=[" + mode + "],reason=[" + reason + "]:新增加订单:" + liteOrder.getOrderNo() + ",共" + allItems.size() + "条工单详情");
liteOrder = liteOrderManager.createWithItems(liteOrder);
liteOrderCache.addOrderToMap(liteOrder);
return true;
} catch (Exception e) {
log.error("read order from file [" + orderFile.getAbsolutePath() + "] :", e);
}
}
}
return false;
}
public Map<String , List<LiteOrderItem>> readCsvFile(String fileName, String fileURL) {
CsvReader csvRead = null;
try {
......
......@@ -9,4 +9,6 @@ public interface IOrderFileListener {
boolean handleOrderFile(File orderFile);
boolean handleOrderFile(File orderFile,String mode,String reason);
}
......@@ -126,7 +126,22 @@ public class OrderFileWatch {
return false;
}
/**
* 解析工单文件
* @param orderFile
* @return
*/
public boolean handleOrderFile(File orderFile,String mode,String reason){
log.info("开始处理Order文件:" + orderFile.getAbsolutePath());
for (IOrderFileListener orderFileListener : orderFileListenerList) {
boolean result = orderFileListener.handleOrderFile(orderFile,mode,reason);
if(result){
return true;
}
}
return false;
}
private String getLocalDir(String orderDir){
//String[] fileTypes=new String[]{"csv","xml","txt"};
......
package com.neotel.smfcore.custom.micron1053.task;
import com.neotel.smfcore.common.bean.ResultBean;
import com.neotel.smfcore.common.exception.ValidateException;
import com.neotel.smfcore.common.utils.FileUtil;
import com.neotel.smfcore.core.order.LiteOrderCache;
import com.neotel.smfcore.core.order.enums.LITEORDER_STATUS;
import com.neotel.smfcore.core.order.service.manager.ILiteOrderItemManager;
import com.neotel.smfcore.core.order.service.manager.ILiteOrderManager;
import com.neotel.smfcore.core.order.service.po.LiteOrder;
import com.neotel.smfcore.core.order.service.po.LiteOrderItem;
import com.neotel.smfcore.core.order.util.OrderFileWatch;
import com.neotel.smfcore.core.storage.rest.dto.TacticsOutDto;
import com.neotel.smfcore.core.system.service.manager.IDataLogManager;
import com.neotel.smfcore.core.system.service.po.DataLog;
import com.neotel.smfcore.core.system.util.TaskService;
import com.neotel.smfcore.custom.micron1053.api.MicronApi;
import com.neotel.smfcore.custom.micron1053.task.bean.DispatchItemMapper;
import com.neotel.smfcore.custom.micron1053.task.bean.dto.DispatchItemDto;
import com.neotel.smfcore.custom.micron1053.task.enums.OrderItemStatus;
import com.neotel.smfcore.security.annotation.AnonymousAccess;
import com.neotel.smfcore.security.bean.FileProperties;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import java.io.File;
import java.text.SimpleDateFormat;
import java.util.*;
@Slf4j
@RestController
@Api(tags = "1053:OutSide Shelf Dispatch Controlled Dispatch")
@RequestMapping("/rest/micron/dispatch")
@RequiredArgsConstructor
public class MicronDispatchController {
//
// @ApiOperation("上传工单")
// @PostMapping(value = "/upload")
// @AnonymousAccess
// public ResultBean updateAvatar(@RequestParam MultipartFile orderFile) {
//
// String csv = "csv";
// String excel="xlsx";
// String fileType = FileUtil.getExtensionName(orderFile.getOriginalFilename());
// String fileName = FileUtil.getFileNameNoEx(orderFile.getOriginalFilename());
// if (fileType != null &&(!csv.contains(fileType))&&(!excel.contains(fileType)) ) {
// throw new ValidateException("smfcore.feleFormatError", "文件格式错误!, 仅支持{0}格式", new String[]{csv+","+excel});
// }
// File folder = new File(properties.getPath(), "pos");
// File localFile = FileUtil.upload(orderFile, folder.getAbsolutePath());
// boolean result = orderFileWatch.handleOrderFile(localFile);
// if (result) {
// return ResultBean.newOkResult("smfcore.order.uploadOK", "工单上传成功");
// } else {
// return ResultBean.newErrorResult(-1,"smfcore.order.uploadFailure","上传失败");
// }
// }
@Autowired
private ILiteOrderManager liteOrderManager;
@Autowired
private IDataLogManager dataLogManager;
@Autowired
private ILiteOrderItemManager liteOrderItemManager;
@Autowired
private final FileProperties properties;
@Autowired
private LiteOrderCache liteOrderCache;
@Autowired
private DispatchItemMapper dispatchItemMapper;
@Autowired
private OrderFileWatch orderFileWatch;
@Autowired
private TaskService taskService;
@ApiOperation("获取出库页详情")
@AnonymousAccess
@GetMapping("/getList")
public ResultBean list(String mode) {
//判断是否验证
if (!MicronApi.isEnable()) {
return ResultBean.newErrorResult(9, "smfcore.micron.apiClose", " Not yet open");
}
//获取是否有此类型的工单信息
//code=0,,如果已经存在,直接返回列表页面
//code=1,没有数据,进入上传工单页面
List<LiteOrderItem> itemList = getLiteOrderItemList(mode);
if (itemList != null && !itemList.isEmpty()) {
//已存在,直接返回列表页面
List<DispatchItemDto> list = dispatchItemMapper.toDto(itemList);
return ResultBean.newOkResult(list);
} else {
//需要进入上传工单页面
return ResultBean.newErrorResult(1, "", "");
}
}
@ApiOperation("Submit")
@AnonymousAccess
@GetMapping("/outSideSubmit")
public ResultBean outSideSubmit(String mode,String reason) {
@PostMapping("/submit")
public ResultBean outSideSubmit(@RequestBody String mode,@RequestBody String reason ,@RequestBody MultipartFile orderFile) {
//判断是否验证
if (!MicronApi.isEnable()) {
return ResultBean.newErrorResult(9, "smfcore.micron.apiClose", " Not yet open");
}
String csv = "csv";
String excel = "xlsx";
String fileType = FileUtil.getExtensionName(orderFile.getOriginalFilename());
String fileName = FileUtil.getFileNameNoEx(orderFile.getOriginalFilename());
if (fileType != null && (!csv.contains(fileType)) && (!excel.contains(fileType))) {
throw new ValidateException("smfcore.feleFormatError", "文件格式错误!, 仅支持{0}格式", new String[]{csv + "," + excel});
}
File folder = new File(properties.getPath(), "pos");
File localFile = FileUtil.upload(orderFile, folder.getAbsolutePath());
boolean result = orderFileWatch.handleOrderFile(localFile, mode, reason);
if (result) {
// return ResultBean.newOkResult("smfcore.order.uploadOK", "工单上传成功");
//返回详情
List<LiteOrderItem> itemList = getLiteOrderItemList(mode);
//已存在,直接返回列表页面
List<DispatchItemDto> list = dispatchItemMapper.toDto(itemList);
return ResultBean.newOkResult(list);
} else {
return ResultBean.newErrorResult(-1, "smfcore.micron.operationFailure", "操作失败");
}
}
@ApiOperation("Pn出库提交")
@AnonymousAccess
@PostMapping("/pnSubmit")
public ResultBean pnSubmit(@RequestBody Set< TacticsOutDto > outDtoSet) {
//判断是否验证
if (!MicronApi.isEnable()) {
return ResultBean.newErrorResult(9, "smfcore.micron.apiClose", " Not yet open");
}
if (outDtoSet == null) {
throw new ValidateException("smfcore.valueCanotNull", "{0}不能为空", new String[]{"PN"});
}
for (TacticsOutDto dto :
outDtoSet) {
if (dto.getPartNumber() == null) {
throw new ValidateException("smfcore.valueCanotNull", "{0}不能为空", new String[]{"PN"});
} else if (dto.getPlateNumber() == null) {
throw new ValidateException("smfcore.valueCanotNull", "{0}不能为空", new String[]{"Num"});
}
}
//生成工单
String mode="CTRLDISPATCH ";
//新增为一个工单
String orderName = "";
List<LiteOrder> orders = liteOrderManager.findByQuery(new Query(Criteria.where("mode").is(mode)));
orderName = mode + (orders.size() + 1);
LiteOrder dbOrder = liteOrderManager.findByOrderNo(orderName);
if (dbOrder != null) {
SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmmss");
//把名字改为带时间的
String newOrderNo = orderName + "-" + format.format(new Date());
dbOrder = liteOrderManager.findByOrderNo(newOrderNo);
if (dbOrder != null) {
//工单名重复,直接返回
return ResultBean.newErrorResult(-1, "smfcore.micron.operationFailure", "操作失败");
}
}
List<LiteOrderItem> items=new ArrayList<>();
for (TacticsOutDto dto :
outDtoSet) {
LiteOrderItem item = new LiteOrderItem();
item.setPn(dto.getPartNumber());
item.setNeedReelCount(dto.getPlateNumber());
item.setNeedNum(dto.getNeedNum());
items.add(item);
}
LiteOrder liteOrder = new LiteOrder(orderName, items);
liteOrder.setMode(mode);
log.info("pnSubmit,mode=[" + mode + "], 新增加订单:" + liteOrder.getOrderNo() + ",共" + items.size() + "条工单详情");
liteOrder = liteOrderManager.createWithItems(liteOrder);
liteOrderCache.addOrderToMap(liteOrder);
// taskService.tacticsCheckOut(outDtoSet);
return ResultBean.newOkResult("ok");
}
@ApiOperation("重试")
@PostMapping("/retry")
@AnonymousAccess
public ResultBean retry(@RequestBody String mode) {
log.info(" retry :mode=" + mode + ",入库完成发送失败的,重新发送,其他状态暂不处理");
//判断有没有生成任务
LiteOrder order=getOrderByMode(mode);
if (order == null) {
return ResultBean.newErrorResult(-1, "smfcore.micron.operationFailure", "操作失败");
}
List<LiteOrderItem> liteOrderItemList=order.getOrderItems();
List<LiteOrderItem> orderItems = new ArrayList<>();
boolean canClose=true;
for (LiteOrderItem orderItem :
liteOrderItemList) {
if (orderItem.getStatus() == OrderItemStatus.notify_fail) {
String id = orderItem.getId();
List<DataLog> dataLogList = dataLogManager.findByQuery(new Query(Criteria.where("subSourceId").is(id)));
if (dataLogList != null && !dataLogList.isEmpty()) {
log.info("retry: [" + order.getOrderNo() + "] [" + orderItem.getRi() + "] 重发API007 ");
boolean isSuccess = MicronApi.Api007(order.getOrderNo(), order.getId(), dataLogList);
if (isSuccess) {
orderItem.setStatus(OrderItemStatus.notify_success);
} else {
orderItem.setStatus(OrderItemStatus.notify_fail);
canClose=false;
}
liteOrderItemManager.save(orderItem);
}
}else if(orderItem.getStatus()==OrderItemStatus.executing){
canClose=false;
}
orderItems.add(orderItem);
}
order.setOrderItems(orderItems);
if(canClose){
//可以关闭工单
CloseOrder(order);
}else{
liteOrderCache.addOrderToMap(order);
}
return ResultBean.newOkResult("");
}
private void CloseOrder(LiteOrder order){
order.setStatus(LITEORDER_STATUS.CLOSED);
order.setClosed(true);
liteOrderManager.save(order);
liteOrderCache.addOrderToMap(order);
return ResultBean.newOkResult("dto");
log.info(" mode="+order.getMode()+"工单关闭");
}
@ApiOperation("放弃出库")
@PostMapping("/abort")
@AnonymousAccess
public ResultBean abort(@RequestBody String mode) {
log.info(" abort :mode=" + mode);
LiteOrder order = getOrderByMode(mode);
if (order == null) {
return ResultBean.newErrorResult(-1, "smfcore.micron.operationFailure", "操作失败");
}
List<LiteOrderItem> liteOrderItemList = order.getOrderItems();
List<LiteOrderItem> newList = new ArrayList<>();
for (LiteOrderItem orderItem :
liteOrderItemList) {
if (orderItem.getStatus() == OrderItemStatus.notify_fail) {
List<DataLog> dataLogList = dataLogManager.findByQuery(new Query(Criteria.where("subSourceId").is(orderItem.getId())));
//如果任务未结束,结束任务
for (DataLog dataLog : dataLogList
) {
if (dataLog.isExecuting()) {
taskService.cancelTask(dataLog.getId());
log.info("abort 终止出库,mode=" + mode + ",取消正在执行的出库任务:barcode=" + dataLog.getBarcode() + ",posName=" + dataLog.getPosName());
}
}
orderItem.setStatus(OrderItemStatus.cancel);
orderItem = liteOrderItemManager.save(orderItem);
newList.add(orderItem);
log.info(" abort :barcode=[" + orderItem.getPn() + "] 取消出库任务");
}
}
log.info("abort 终止出库,mode=" + mode + ",取消正在执行的出库任务:关闭工单=" + order.getOrderNo());
CloseOrder(order);
return ResultBean.newOkResult("");
}
public LiteOrder getOrderByMode(String mode) {
List<LiteOrderItem> itemList = new ArrayList<>();
Collection<LiteOrder> liteOrder = liteOrderCache.getAllLiteOrder();
for (LiteOrder order : liteOrder) {
if (mode.equals(order.getMode()) && !order.isClosed()) {
return order;
}
}
return null;
}
public List<LiteOrderItem> getLiteOrderItemList(String mode) {
List<LiteOrderItem> itemList = new ArrayList<>();
Collection<LiteOrder> liteOrder = liteOrderCache.getAllLiteOrder();
for (LiteOrder order : liteOrder) {
if (mode.equals(order.getMode()) && !order.isClosed()) {
itemList = order.getOrderItems();
break;
}
}
return itemList;
}
}
package com.neotel.smfcore.custom.micron1053.task.bean;
import com.neotel.smfcore.common.base.BaseMapper;
import com.neotel.smfcore.core.order.service.po.LiteOrderItem;
import com.neotel.smfcore.custom.micron1053.task.bean.dto.DispatchItemDto;
import org.mapstruct.Mapper;
import org.mapstruct.ReportingPolicy;
@Mapper(componentModel = "spring",unmappedTargetPolicy = ReportingPolicy.IGNORE)
public interface DispatchItemMapper extends BaseMapper<DispatchItemDto, LiteOrderItem> {
}
package com.neotel.smfcore.custom.micron1053.task.bean.dto;
import io.swagger.annotations.ApiModelProperty;
import java.util.HashMap;
import java.util.Map;
public class DispatchItemDto {
@ApiModelProperty(value = "ID")
private String id;
@ApiModelProperty("物料编号")
private String pn;
@ApiModelProperty("唯一码")
private String ri;
@ApiModelProperty("需求数量")
private int needNum = 0;
@ApiModelProperty("需求料盘数")
private int needReelCount = 0;
@ApiModelProperty("已出数量")
private int outNum = 0;
@ApiModelProperty("已出盘数")
private int outReelCount = 0;
@ApiModelProperty("订单信息")
private String orderNo = "";
@ApiModelProperty("站位信息")
private String feederInfo = "";
/**
* 台车号
*/
@ApiModelProperty("台车号")
private String tableNo = "";
/**
* 面别
*/
@ApiModelProperty("面别")
private String side = "";
@ApiModelProperty("制造商物料编号")
private String mpn = "";
/**
* 库存数量
*/
private int inventoryQty = 0;
/**
* 库存盘数
*/
private int inventoryReelCount = 0;
@ApiModelProperty("自定义的附加字段,key=字段名,value=值")
public Map<String,String> appendData = new HashMap<>();
}
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!