Commit 6fca78d8 zshaohui

1.PartNumber管理,回库报表开发

2.工单明细下载为txt文件
3.定时通信,出库任务不结束
4.移动库位信息修改
5.工单出库逻辑修改
6.流水线,客户端 接口提交
1 个父辈 ad334e30
正在显示 45 个修改的文件 包含 1018 行增加43 行删除
......@@ -183,6 +183,7 @@ public class MenuInit {
//档案管理:元器件
Menu pMenuWl = Menu.CreatePMenu("档案管理", 6, "materiel ", "BOM",null);
addDefaultFunctionMenu(41, pMenuWl,"元器件","componentParts", "parts/component/index","server",DEFAULT_SHOW_MENU);
addDefaultFunctionMenu(42, pMenuWl,"PartNumber管理","partNumberManager", "partNumberManager/index","partNumberManager");
//条形码:条码管理,条码设置
Menu pMenuBarcode = Menu.CreatePMenu("条形码", 7, "barcodes ", "barcodeMenu",null);
......@@ -204,6 +205,7 @@ public class MenuInit {
addDefaultFunctionMenu(72, pMenuReport,"库存", "inventory", "neolight/inventory/index", "inventory");
addDefaultFunctionMenu(73, pMenuReport,"温湿度", "humiture", "humiture/humitureReport/index", "humiture");
addDefaultFunctionMenu(73, pMenuReport,"温湿度", "spHumiture", "humiture/spHumitureReport/index", "humiture");
addDefaultFunctionMenu(74, pMenuReport,"回库", "returnStorage", "neolight/returnExport/index", "returnExport");
//可观测性:物料追踪
Menu guanceMenu = Menu.CreatePMenu("可观测性", 10, "observability", "scanKey",null);
......
......@@ -29,7 +29,6 @@ import com.neotel.smfcore.common.base.IExcelDownLoad;
import com.neotel.smfcore.common.config.file.CustomCellWriteHeightConfig;
import com.neotel.smfcore.common.config.file.CustomCellWriteWeightConfig;
import com.neotel.smfcore.common.exception.ValidateException;
import com.neotel.smfcore.core.language.util.MessageUtils;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.poi.util.IOUtils;
import org.apache.poi.xssf.streaming.SXSSFSheet;
......@@ -48,6 +47,7 @@ import java.net.URLEncoder;
import java.security.MessageDigest;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
......@@ -396,6 +396,35 @@ public class FileUtil extends cn.hutool.core.io.FileUtil {
.doWrite(datas);
}
public static void downloadTxtByConfig(String fileName, List<List<String>> headers, List<List<Object>> datas, HttpServletResponse response) throws IOException {
// 设置响应内容类型为文本
response.setContentType("text/plain; charset=UTF-8");
// 设置文件名,并进行URL编码以防止中文乱码
fileName = URLEncoder.encode(fileName, "UTF-8").replaceAll("\\+", "%20");
// 设置响应头,提示浏览器以下载文件的形式处理响应内容
response.setHeader("Content-Disposition", "attachment; filename*=utf-8''" + fileName + ".txt");
// 假设这是您要导出的数据
List<String> dataToExport = new ArrayList<>();
//for (List<String> header : headers) {
dataToExport.add(org.apache.logging.log4j.util.Strings.join( headers, ','));
//}
for (List<Object> data : datas) {
dataToExport.add(org.apache.logging.log4j.util.Strings.join( data, ','));
}
// 使用BufferedWriter将数据写入响应输出流
try (BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(response.getOutputStream(), "UTF-8"))) {
for (String line : dataToExport) {
writer.write(line);
writer.newLine(); // 写入换行符
}
writer.flush(); // 刷新缓冲区,确保所有数据都被写入
} catch (IOException e) {
e.printStackTrace();
log.error("导出数据到TXT文件时发生错误", e);
}
}
/**
* 设置Header
*
......
......@@ -432,6 +432,8 @@ public class BaseDeviceHandler implements IDeviceHandler {
if (pos != null) {
Storage storage = dataCache.getStorageById(pos.getStorageId());
log.info("出库已在库位中的物料[" + barcodeSave.getBarcode() + "]");
taskService.checkout(storage,pos,true,true,"","",barcodeSave.getBarcode()+"已存在库位:"+pos.getPosName());
throw new ValidateException("smfcore.error.barcode.inStorage", "[ " + barcodeSave.getBarcode() + "]已在" + storage.getName() + "[" + pos.getPosName() + "]中", new String[]{barcodeSave.getBarcode(), storage.getName(), pos.getPosName()});
}
......@@ -468,9 +470,9 @@ public class BaseDeviceHandler implements IDeviceHandler {
} else if (BOX_STATUS.IN_FAILED == status) {//入库失败
//暂不处理
} else if (BOX_STATUS.OUT_FINISHED == status) {//出仓完成
finishedOutPos(statusBean.getCid(),posName,barcode,executeTime);
//finishedOutPos(statusBean.getCid(),posName,barcode,executeTime);
} else if (BOX_STATUS.OUT_END == status) {//出库完成(放到仓门口
endOutTask(statusBean.getCid(),posName,barcode);
//endOutTask(statusBean.getCid(),posName,barcode);
}
// else if (BOX_STATUS.REWARM_TAKING_END == status) {
// //回温取料完成, 将库位清空
......
......@@ -4,6 +4,7 @@ import cn.hutool.core.util.ObjectUtil;
import com.google.common.base.Strings;
import com.neotel.smfcore.common.exception.ValidateException;
import com.neotel.smfcore.common.utils.Constants;
import com.neotel.smfcore.common.utils.StringUtils;
import com.neotel.smfcore.core.barcode.service.po.Barcode;
import com.neotel.smfcore.core.device.bean.BoxStatusBean;
import com.neotel.smfcore.core.device.bean.StatusBean;
......@@ -15,6 +16,9 @@ import com.neotel.smfcore.core.storage.service.po.Storage;
import com.neotel.smfcore.core.storage.service.po.StoragePos;
import com.neotel.smfcore.core.system.service.po.DataLog;
import com.neotel.smfcore.core.system.util.DevicesStatusUtil;
import com.neotel.smfcore.custom.Jkem21481.bean.StorageExport;
import com.neotel.smfcore.custom.Jkem21481.util.StorageExportUtil;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
......@@ -75,10 +79,10 @@ public class XLRBoxHandler extends BaseDeviceHandler {
if (BOX_STATUS.IN_FINISHED == status) {//入仓完成
finishedPutIn(statusBean.getCid(),posName,barcode,executeTime);
} else if (BOX_STATUS.OUT_FINISHED == status) {//出仓完成
finishedOutPos(statusBean.getCid(),posName,barcode,executeTime,OP_STATUS.OUT_BOX);
//finishedOutPos(statusBean.getCid(),posName,barcode,executeTime,OP_STATUS.OUT_BOX);
} else if (BOX_STATUS.OUT_END == status) {//出库完成(放到仓门口
log.info(statusBean.getCid() +"将物料从库位["+posName+"]出库到门口/料串完成");
reelOnShelf(statusBean.getCid(),posName);
//reelOnShelf(statusBean.getCid(),posName);
}
}
} catch (ValidateException e) {
......@@ -152,6 +156,7 @@ public class XLRBoxHandler extends BaseDeviceHandler {
isNg=true;
}
statusBean.addPosInfo(task.getBarcode(), posName, plateW, plateH, isSingleOut,isNg,NgMsg,0,task.getSourceName());
statusBean.addData("export",task.getExport());
log.info("出库" + storage.getName() + "[" + posName + "]物料[" + task.getBarcode() + "]" + isSingleOut + "["+NgMsg+"]发送到客户端" + cid);
}
}
......@@ -181,7 +186,7 @@ public class XLRBoxHandler extends BaseDeviceHandler {
List<DataLog> dataLogList = new ArrayList<>();
for (DataLog dataLog : allTasks) {
for (StoragePos pos : usedPosList.values()) {
if (pos.getPosName().equals(dataLog.getPosName())){
if (pos.getPosName().equals(dataLog.getPosName())) {
dataLog.setPriority(pos.getPriority());
}
}
......@@ -198,8 +203,8 @@ public class XLRBoxHandler extends BaseDeviceHandler {
if (task.isPutInTask()) {
log.error("cid[" + cid + "]已有入库任务,不可再分配出库任务");
return null;
} else if (task.needReSendToClient() && task.isCheckOutTask()) {//超过30秒仍未完成的出库再次发送到客户端
log.error("cid[" + cid + "]的出库任务[" + task.getPosName() + "]"+task.getBarcode()+"超过60秒仍未完成,重新发送到客户端!");
} else if (task.needReSendToClient() && task.isCheckOutTask()) {//超过180秒仍未完成的出库再次发送到客户端
log.error("cid[" + cid + "]的出库任务[" + task.getPosName() + "]" + task.getBarcode() + "超过180秒仍未完成,重新发送到客户端!");
task.setUpdateDate(new Date());
return task;
}
......@@ -217,9 +222,7 @@ public class XLRBoxHandler extends BaseDeviceHandler {
//指定紧急单盘出库的优先出库,否则按批量出库处理
DataLog singleOutTask = null;
DataLog outTask = null;
for (DataLog task : dataLogList) {//优先分配单盘任务和没有工单的任务
if (cid.equals(task.getCid()) && task.isCheckOutTask() && task.isWait()) {
String posName = task.getPosName();
......@@ -229,10 +232,6 @@ public class XLRBoxHandler extends BaseDeviceHandler {
if (singleOutTask == null || task.getCreateDate().before(singleOutTask.getCreateDate())) {
singleOutTask = task;
}
} else {
if (outTask == null || task.getPriority() < outTask.getPriority()) {
outTask = task;
}
}
}
}
......@@ -242,7 +241,66 @@ public class XLRBoxHandler extends BaseDeviceHandler {
return singleOutTask;
}
return outTask;
//出料口为空的
DataLog outTask = null;
for (DataLog task : dataLogList) {
if (cid.equals(task.getCid()) && task.isCheckOutTask() && task.isWait()) {
String posName = task.getPosName();
if (!Strings.isNullOrEmpty(posName)) {//有库位号
String export = task.getExport();
if (StringUtils.isEmpty(export)) {
//单盘优先出库
if (outTask == null || task.getCreateDate().before(outTask.getCreateDate())) {
outTask = task;
}
}
}
}
}
if (outTask != null) {
log.info("分配优先(单盘或无工单)出库任务" + outTask.getBarcode() + "[" + outTask.getPosName() + "]到 " + cid);
}
//分配出料口不为空的
DataLog orderTask = null;
//先提取出料口不为空的
List<DataLog> notEmptyExportList = new ArrayList<>();
for (DataLog dataLog : dataLogList) {
if (dataLog.isCheckOutTask() && dataLog.isWait()) {
String export = dataLog.getExport();
if (StringUtils.isNotEmpty(export)) {
notEmptyExportList.add(dataLog);
}
}
}
//按出料口进行分组
Map<String, List<DataLog>> map = notEmptyExportList.stream().collect(Collectors.groupingBy(DataLog::getExport));
for (String key : map.keySet()) {
List<DataLog> groupByList = map.get(key);
Collections.sort(groupByList, new Comparator<DataLog>() {
@Override
public int compare(DataLog o1, DataLog o2) {
String feederInfo1 = o1.getAppendData("feederInfo");
String feederInfo2 = o2.getAppendData("feederInfo");
return feederInfo1.compareTo(feederInfo2);
}
});
if (groupByList != null && !groupByList.isEmpty()) {
DataLog dataLog = groupByList.get(0);
if (cid.equals(dataLog.getCid())) {
//判断出料口信息是否相同
String feederInfo = dataLog.getAppendData("feederInfo");
StorageExport export = StorageExportUtil.getExport(key);
if (feederInfo.startsWith(export.getFeeder())) {
log.info("分配出库任务,站位号为:" + dataLog.getAppendData("feederInfo") + ",出料口为:" + key + ",barcode为:" + dataLog.getBarcode());
orderTask = dataLog;
break;
}
}
}
}
return orderTask;
}
@Override
......
package com.neotel.smfcore.core.device.handler.impl;
import com.neotel.smfcore.core.storage.enums.DeviceType;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
@Service
@Slf4j
public class XLROneBoxHandler extends XLRBoxHandler{
@Override
public DeviceType getDeviceType() {
return DeviceType.SMD_ONE;
}
}
......@@ -893,10 +893,10 @@ public class DeviceController {
//如果是以S结尾的,则判断不带S的有没有料
posName = pos.getPosName();
String wPosName="";
if (posName.endsWith("S") || posName.endsWith("s")){
log.info(posName+"以S结尾,需要判断外层有没有物料");
if (posName.endsWith("B") || posName.endsWith("b")){
log.info(posName+"以B结尾,需要判断外层有没有物料");
wPosName = posName.substring(0,posName.length()-1);
wPosName= wPosName +"F";
StoragePos storagePos = storagePosManager.getByPosName(wPosName);
if (storagePos != null){
if (storagePos.getBarcode() != null){
......@@ -1039,12 +1039,12 @@ public class DeviceController {
if ( lock == null) {
if (needMovePosName.endsWith("S") || needMovePosName.endsWith("s")) {
if (needMovePosName.endsWith("F") || needMovePosName.endsWith("f")) {
log.info("需要移动的库位为:" + needMovePosName + "是内侧库位,不需要锁定库位");
} else {
String sPosname = needMovePosName + "S";
needMovePosName = needMovePosName.substring(0,needMovePosName.length()-1);
String sPosname = needMovePosName + "B";
StoragePos sPos = storagePosManager.getByPosName(sPosname);
if (sPos != null) {
String cid = dataCache.getStorageById(sPos.getStorageId()).getCid();
......
......@@ -806,6 +806,7 @@ public class DataCache {
if (bean == null || bean.timeOut() || !bean.isAvailable()) {
continue;
}
log.info("获取到可用料仓为:"+storage.getName());
availableStorageIds.add(storage.getId());
}
return availableStorageIds;
......
......@@ -22,6 +22,7 @@ import java.io.File;
import java.nio.charset.Charset;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.stream.Collectors;
/**
* Created by sunke on 2021/7/12.
......@@ -66,6 +67,8 @@ public class DefaultOrderFileListener implements IOrderFileListener {
if (liteOrderItems.size() <= 0) {
continue;
}
//按站位进行排序
liteOrderItems = liteOrderItems.stream().sorted(Comparator.comparing(LiteOrderItem::getFeederInfo)).collect(Collectors.toList());
LiteOrder liteOrder = new LiteOrder(so, liteOrderItems);
liteOrder.setSource(fileName);
......
......@@ -171,7 +171,7 @@ public class OrderController {
if (liteOrder == null) {
throw new ValidateException("smfcore.valueNotFind", "未找到{0}[{1}]", new String[]{"orderNo", orderNo});
}
String result = liteOrderCache.checkOutLiteOrder(liteOrder.getOrderNo(), false);
String result = liteOrderCache.checkOutJkemLiteOrder(liteOrder.getOrderNo());
if (ObjectUtil.isEmpty(result)) {
return ResultBean.newOkResult(result);
} else {
......@@ -383,6 +383,7 @@ public class OrderController {
header.add(Lists.newArrayList(MessageUtils.getText("smfcore.order.needNum",locale,"需求数量")));
header.add(Lists.newArrayList(MessageUtils.getText("smfcore.order.outNum",locale,"已出数量")));
header.add(Lists.newArrayList(MessageUtils.getText("smfcore.order.out.barcode",locale,"出库物料详情")));
header.add(Lists.newArrayList(MessageUtils.getText("smfcore.order.outLet",locale,"出料口")));
//附加字段
OrderSetting orderSetting=dataCache.getOrderSetting();
......@@ -412,6 +413,18 @@ public class OrderController {
data.add(orderItem.getNeedNum());
data.add(orderItem.getOutNum());
data.add(orderItem.getBarcodeStr());
String export = "";
List<Barcode> outBarcodeList = orderItem.getOutBarcodeList();
for (Barcode barcode : outBarcodeList) {
String outLet = barcode.getAppendData("export");
if (StringUtils.isNotEmpty(outLet)){
export = outLet;
break;
}
}
data.add(export);
//附加字段
if(orderSetting.getAppendData()!=null&&orderSetting.getAppendData().size()>0){
for (String key :
......@@ -432,7 +445,7 @@ public class OrderController {
data.add(exception);
dataList.add(data);
}
FileUtil.downloadExcelByConfig(liteOrder.getOrderNo(), header,dataList,response);
FileUtil.downloadTxtByConfig(liteOrder.getOrderNo(), header,dataList,response);
}
}
......
package com.neotel.smfcore.core.order.rest.bean.dto;
import com.neotel.smfcore.core.barcode.service.po.Barcode;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import org.springframework.data.annotation.Transient;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Getter
......@@ -77,4 +80,9 @@ public class OrderItemDto {
@ApiModelProperty("自定义的附加字段,key=字段名,value=值")
public Map<String,String> appendData = new HashMap<>();
/**
* 出库清单列表
*/
private List<Barcode> outBarcodeList = new ArrayList<>();
}
......@@ -2,9 +2,12 @@ package com.neotel.smfcore.core.order.service.manager;
import com.neotel.smfcore.common.base.IBaseManager;
import com.neotel.smfcore.core.order.service.po.LiteOrderItem;
import org.springframework.data.mongodb.core.query.Query;
import java.util.List;
public interface ILiteOrderItemManager extends IBaseManager<LiteOrderItem> {
List<LiteOrderItem> findOrderItems(String orderId);
LiteOrderItem findOne(Query createDate);
}
......@@ -27,6 +27,11 @@ public class LiteOrderItemManagerImpl implements ILiteOrderItemManager {
}
@Override
public LiteOrderItem findOne(Query query) {
return liteOrderItemDao.findOne(query);
}
@Override
public LiteOrderItem get(String id) {
return liteOrderItemDao.findOneById(id);
}
......
......@@ -2,14 +2,14 @@ package com.neotel.smfcore.core.order.service.po;
import com.neotel.smfcore.common.base.BasePo;
import com.neotel.smfcore.common.utils.StringUtils;
import com.neotel.smfcore.core.barcode.service.po.Barcode;
import lombok.Data;
import org.springframework.data.annotation.Transient;
import org.springframework.data.mongodb.core.index.Indexed;
import org.springframework.data.mongodb.core.mapping.Document;
import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;
import java.util.*;
@Data
@Document
......@@ -99,6 +99,11 @@ public class LiteOrderItem extends BasePo implements Serializable ,Comparable<Li
private String barcodeStr = "";
/**
* 出库清单列表
*/
private List<Barcode> outBarcodeList = new ArrayList<>();
/**
* 自定义的附加字段,key=字段名,value=值
*/
public Map<String,String> appendData = new HashMap<>();
......@@ -143,4 +148,14 @@ public class LiteOrderItem extends BasePo implements Serializable ,Comparable<Li
this.barcodeStr = barcodeStr + " (" + amount+")";
}
}
public void setOutBarcodeList(String barcode,String partNumber, String export) {
this.outBarcodeList.removeIf(t -> t.getBarcode().equals(barcode));
Barcode newBarcode = new Barcode();
newBarcode.setBarcode(barcode);
newBarcode.setPartNumber(partNumber);
newBarcode.updateAppendData("export", export);
newBarcode.setCreateDate(new Date());
this.outBarcodeList.add(newBarcode);
}
}
......@@ -89,6 +89,11 @@ public class StoragePosFindCriteria {
@ApiModelProperty("呆滞天数")
private Integer sluggishDay;
@ApiModelProperty("小于库存数量")
@QueryCondition(type = QueryCondition.Type.LT,propName = "barcode.amount")
private Integer lteSpecifiedAmount;
public int getComponentType(){
int componentType = getType();
if (componentType != -1) {
......
......@@ -8,7 +8,9 @@ import lombok.Setter;
import java.io.Serializable;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Getter
@Setter
......@@ -150,4 +152,10 @@ public class TaskDto implements Serializable {
}
@ApiModelProperty("位置信息,如料架编号,托盘编号,移栽编号,皮带线编号,机器人编号等")
private String locInfo = "";
@ApiModelProperty("出料口")
private String export = "";
@ApiModelProperty("附加信息")
private Map<String,Object> appendData = new HashMap<>();
}
......@@ -152,6 +152,11 @@ public class DataLog extends BasePo implements Serializable ,Comparable<DataLog>
private String status;
/**
* 上一次任务状态
*/
private String lastStatus;
/**
* 指定批次Id
*/
private String batchId;
......@@ -376,11 +381,11 @@ public class DataLog extends BasePo implements Serializable ,Comparable<DataLog>
}
/**
* 正在执行的出库任务,如果60秒还未完成,再次发送到客户端
* 正在执行的出库任务,如果180秒还未完成,再次发送到客户端
*/
public boolean needReSendToClient(){
if(isCheckOutTask() && isExecuting()){
return System.currentTimeMillis() - super.getUpdateDate().getTime() >= 60 * 1000;
return System.currentTimeMillis() - super.getUpdateDate().getTime() >= 60 * 1000 * 3;
}
return false;
}
......
......@@ -29,6 +29,7 @@ import com.neotel.smfcore.core.storage.service.po.StoragePos;
import com.neotel.smfcore.core.system.bean.MSDAppendInfo;
import com.neotel.smfcore.core.system.service.dao.IDataLogDao;
import com.neotel.smfcore.core.system.service.po.DataLog;
import com.neotel.smfcore.custom.Jkem21481.util.StorageExportUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
......@@ -165,6 +166,13 @@ public class TaskService {
liteOrderCache.onTaskStatusChange(task);
smfApi.onTaskStatusChange(task);
selfAuditUtil.onTaskStatusChange(task);
//修改出料口信息
if (task.isCheckOutTask()) {
String export = task.getExport();
if (StringUtils.isNotEmpty(export)) {
StorageExportUtil.updateExportData(export, task.getBarcode(), task.getAppendData("feederInfo"), task.getSourceName(), task.getStatus());
}
}
}
/**
......@@ -564,7 +572,7 @@ public class TaskService {
}
statusBean.addPosInfo(task.getBarcode(), posName, plateW, plateH, isSingleOut,isNg,NgMsg,0,task.getSourceName());
statusBean.addData("export",task.getExport());
log.info("出库" + storage.getName() + "[" + posName + "]物料[" + task.getBarcode() + "]" + isSingleOut + "["+NgMsg+"]发送到客户端" + cid);
log.info("出库" + storage.getName() + "[" + posName + "]物料[" + task.getBarcode() + "]" + isSingleOut + "["+NgMsg+"]发送到客户端" + cid+",出料口为:"+task.getExport());
}
}
String posId = statusBean.getData().get("posId");
......
package com.neotel.smfcore.custom.Jkem21481.bean;
import com.neotel.smfcore.common.base.BasePo;
import lombok.Data;
@Data
public class MJPartNumber extends BasePo {
private String makerPartNumber; // 供应商部品号
private String jkemPartNumber;//JKEM 部品号;
private int pitch;
private int msd; //MSD (1 = need control; 0 = no need control)
}
package com.neotel.smfcore.custom.Jkem21481.bean;
import com.neotel.smfcore.common.base.BasePo;
import lombok.Data;
@Data
public class ReturnStorage extends BasePo {
private String orderNo;
private String pn;
private String feederInfo;
private int needNum;
private int outNum;
private String returnBarcode;
private String lastExport;
private String orderItemId;
}
......@@ -4,6 +4,8 @@ import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import java.util.List;
@Getter
@Setter
@NoArgsConstructor
......@@ -13,24 +15,18 @@ public class StorageExport {
*/
private String hSerial = "";
/**
* 目的地(线体)
*/
private String line = "";
/**
* 当前料仓剩余未出的需求单数量
/*
*feeder号
*/
private int remainTaskCount = 0;
private String feeder = "-1";
/**
* 是否禁用
* 出料口名称
*/
private boolean disable = false;
private String exportName;
/**
* 料串信息
* 要出库的物料信息
*/
private String material = "";
private List<StorageExportOutDetail> detailList;
}
package com.neotel.smfcore.custom.Jkem21481.bean;
import lombok.Data;
@Data
public class StorageExportOutDetail {
private String barcode;
private String feederInfo;
private String status;
private String lastStatus;
}
package com.neotel.smfcore.custom.Jkem21481.bean.dto;
import com.neotel.smfcore.custom.Jkem21481.bean.StorageExport;
import lombok.Data;
import java.util.List;
@Data
public class StorageExportDto {
private String exportName;
private String feederInfo;
private String hSerial; //工单号
private List<StorageExport> outDetailList;
}
package com.neotel.smfcore.custom.Jkem21481.bean.query;
import com.neotel.smfcore.common.annotation.QueryCondition;
import com.neotel.smfcore.common.bean.BetweenData;
import lombok.Data;
import java.util.Date;
@Data
public class MjPartNumberQueryCondition {
@QueryCondition(blurry = "makerPartNumber,jkemPartNumber")
private String bluuy;
@QueryCondition(type = QueryCondition.Type.BETWEEN)
private BetweenData<Date> createDate;
}
package com.neotel.smfcore.custom.Jkem21481.bean.query;
import com.neotel.smfcore.common.annotation.QueryCondition;
import com.neotel.smfcore.common.bean.BetweenData;
import lombok.Data;
import java.util.Date;
@Data
public class ReturnStorageQueryCondition {
@QueryCondition(blurry = "orderNo,pn,returnBarcode,feederInfo")
private String blurry;
@QueryCondition(type = QueryCondition.Type.BETWEEN)
private BetweenData<Date> createDate;
}
package com.neotel.smfcore.custom.Jkem21481.controller;
import com.neotel.smfcore.common.bean.PageData;
import com.neotel.smfcore.common.bean.ResultBean;
import com.neotel.smfcore.common.excel.ExcelReader;
import com.neotel.smfcore.common.exception.ValidateException;
import com.neotel.smfcore.common.utils.FileUtil;
import com.neotel.smfcore.common.utils.QueryHelp;
import com.neotel.smfcore.common.utils.StringUtils;
import com.neotel.smfcore.custom.Jkem21481.bean.MJPartNumber;
import com.neotel.smfcore.custom.Jkem21481.bean.query.MjPartNumberQueryCondition;
import com.neotel.smfcore.custom.Jkem21481.manager.IPartNumberManager;
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 io.swagger.models.auth.In;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Pageable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Slf4j
@RequiredArgsConstructor
@RequestMapping("/jkemPartNumber")
@RestController
public class PartNumberController {
@Autowired
private IPartNumberManager partNumberManager;
@Autowired
private final FileProperties properties;
@ApiOperation("文件上传")
@RequestMapping("/uploadFile")
@AnonymousAccess
public ResultBean uploadFile(@RequestParam("file") MultipartFile uploadFile) {
//判断是否为xlsx文件
String xlsx = "xlsx";
String fileType = FileUtil.getExtensionName(uploadFile.getOriginalFilename());
if (fileType != null && !xlsx.contains(fileType)) {
throw new ValidateException("smfcore.feleFormatError", "文件格式错误!, 仅支持{0}格式", new String[]{xlsx});
}
File folder = new File(properties.getPath(), "pos");
File file = FileUtil.upload(uploadFile, folder.getAbsolutePath());
List<MJPartNumber> partNumberList = handleMakerPnAndJkemPn(file.getAbsolutePath());
if (partNumberList == null || partNumberList.isEmpty()){
//throw new ValidateException("smfcore.fileError", "文件解析失败");
return ResultBean.newErrorResult(-1,"smfcore.fileError","文件解析失败");
}
//根据供应商的pn,查询是否存在,修改
for (MJPartNumber mjPartNumber : partNumberList) {
MJPartNumber daMjPartNumber = partNumberManager.findByMakerPartNumber(mjPartNumber.getMakerPartNumber());
if (daMjPartNumber == null){
partNumberManager.save(mjPartNumber);
} else {
if (!mjPartNumber.getMakerPartNumber().equals(daMjPartNumber.getMakerPartNumber())
|| !mjPartNumber.getJkemPartNumber().equals(daMjPartNumber.getJkemPartNumber())
|| mjPartNumber.getMsd() != daMjPartNumber.getMsd()
|| mjPartNumber.getPitch() != daMjPartNumber.getPitch()
) {
daMjPartNumber.setJkemPartNumber(mjPartNumber.getJkemPartNumber());
daMjPartNumber.setMakerPartNumber(mjPartNumber.getMakerPartNumber());
daMjPartNumber.setMsd(mjPartNumber.getMsd());
daMjPartNumber.setPitch(mjPartNumber.getPitch());
}
}
}
return ResultBean.newOkResult("");
}
@ApiOperation("获取列表")
@RequestMapping("/list")
//@AnonymousAccess
public PageData<MJPartNumber> list(MjPartNumberQueryCondition queryCondition, Pageable pageable){
return partNumberManager.findByPage(QueryHelp.getQuery(queryCondition),pageable);
}
@ApiOperation("获取所有给客户端使用")
@RequestMapping("/getALlMakerPnAndJkemPn")
@AnonymousAccess
public List<MJPartNumber> getALlMakerPnAndJkemPn(){
return partNumberManager.findAll();
}
@ApiOperation("批量删除")
@RequestMapping("/batchDelete")
@AnonymousAccess
public ResultBean batchDelete(@RequestBody Map<String,List<String>> paramMap){
List<String> idList = paramMap.get("ids");
if (idList == null || idList.isEmpty()){
return ResultBean.newErrorResult(-1,"smfcore.valueCanotNull","{0}不能为空",new String[]{"ids"});
}
partNumberManager.batchDelete(idList);
return ResultBean.newOkResult("");
}
@ApiOperation("修改")
@RequestMapping("/update")
@AnonymousAccess
public ResultBean update(@RequestBody MJPartNumber mjPartNumber){
String jkemPartNumber = mjPartNumber.getJkemPartNumber();
String makerPartNumber = mjPartNumber.getMakerPartNumber();
int pitch = mjPartNumber.getPitch();
int msd = mjPartNumber.getMsd();
String id = mjPartNumber.getId();
log.info("修改PartNumber维护信息,jkemPartNumber:"+jkemPartNumber+",makerPartNumber:"+makerPartNumber+",pitch:"+pitch+",msd:"+msd+",id:"+id);
partNumberManager.save(mjPartNumber);
return ResultBean.newOkResult("");
}
@ApiOperation("新增")
@RequestMapping("/save")
@AnonymousAccess
public ResultBean save(@RequestBody MJPartNumber mjPartNumber){
String jkemPartNumber = mjPartNumber.getJkemPartNumber();
String makerPartNumber = mjPartNumber.getMakerPartNumber();
int pitch = mjPartNumber.getPitch();
int msd = mjPartNumber.getMsd();
String id = mjPartNumber.getId();
log.info("新增PartNumber维护信息,jkemPartNumber:"+jkemPartNumber+",makerPartNumber:"+makerPartNumber+",pitch:"+pitch+",msd:"+msd+",id为:"+id);
if (StringUtils.isEmpty(jkemPartNumber)){
return ResultBean.newErrorResult(-1,"smfcore.valueCanotNull","{0}不能为空",new String[]{"JKEM Part Number"});
}
if (StringUtils.isEmpty(makerPartNumber)){
return ResultBean.newErrorResult(-1,"smfcore.valueCanotNull","{0}不能为空",new String[]{"Maker Part Number"});
}
partNumberManager.save(mjPartNumber);
return ResultBean.newOkResult("");
}
private List<MJPartNumber> handleMakerPnAndJkemPn(String absolutePath) {
List<MJPartNumber> partNumberList = new ArrayList<>();
List<Map<Integer, String>> dataMapList = ExcelReader.noModelRead(absolutePath);
if (dataMapList != null && dataMapList.size() > 2) {
//获取对应的标题,value为坐标
Map<String, Integer> headerMap = new HashMap<>();
Map<Integer, String> dataHeader = dataMapList.get(0);
for (Integer key : dataHeader.keySet()) {
if (key == null)
continue;
String header = dataHeader.get(key);
if (StringUtils.isEmpty(header))
continue;
headerMap.put(header, key);
}
//获取对应的坐标
int makerPartNumberIndex = -1;
int jkemPartNumberIndex = -1;
int pitchIndex = -1;
int msdIndex = -1;
for (String header : headerMap.keySet()) {
if (header.contains("Maker Part Number")) {
makerPartNumberIndex = headerMap.get(header);
} else if (header.contains("JKEM Part Number")) {
jkemPartNumberIndex = headerMap.get(header);
} else if (header.contains("Pitch")) {
pitchIndex = headerMap.get(header);
} else if (header.contains("MSD")) {
msdIndex = headerMap.get(header);
}
}
for (int i = 1; i < dataMapList.size(); i++) {
Map<Integer, String> dataMap = dataMapList.get(i);
MJPartNumber mjPartNumber = new MJPartNumber();
mjPartNumber.setJkemPartNumber(dataMap.get(jkemPartNumberIndex));
mjPartNumber.setMakerPartNumber(dataMap.get(makerPartNumberIndex));
//-1代表解析失败
mjPartNumber.setPitch(-1);
String pitchStr = dataMap.get(pitchIndex);
if (StringUtils.isNotEmpty(pitchStr)) {
try {
Integer pitch = Integer.valueOf(pitchStr);
mjPartNumber.setPitch(pitch);
} catch (Exception e) {
log.error("解析pitch 失败:", e);
}
}
mjPartNumber.setMsd(-1);
String msdStr = dataMap.get(msdIndex);
if (StringUtils.isNotEmpty(msdStr)) {
try {
Integer msd = Integer.valueOf(msdStr);
mjPartNumber.setMsd(msd);
} catch (Exception e) {
log.error("解析msd 失败:", e);
}
}
partNumberList.add(mjPartNumber);
}
}
return partNumberList;
}
}
package com.neotel.smfcore.custom.Jkem21481.controller;
import com.neotel.smfcore.common.bean.PageData;
import com.neotel.smfcore.common.utils.QueryHelp;
import com.neotel.smfcore.custom.Jkem21481.bean.ReturnStorage;
import com.neotel.smfcore.custom.Jkem21481.bean.query.ReturnStorageQueryCondition;
import com.neotel.smfcore.custom.Jkem21481.manager.IReturnStorageManager;
import com.neotel.smfcore.security.annotation.AnonymousAccess;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Pageable;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@Slf4j
@RestController
@RequestMapping("/returnStorage")
public class ReturnStorageController {
@Autowired
private IReturnStorageManager returnStorageManager;
@ApiOperation("回库列表")
@RequestMapping("/list")
@AnonymousAccess
public PageData<ReturnStorage> list(ReturnStorageQueryCondition queryCondition, Pageable pageable) {
Query query = QueryHelp.getQuery(queryCondition);
return returnStorageManager.findByPage(query, pageable);
}
}
package com.neotel.smfcore.custom.Jkem21481.controller;
import com.neotel.smfcore.common.bean.ResultBean;
import com.neotel.smfcore.common.utils.StringUtils;
import com.neotel.smfcore.core.device.enums.OP_STATUS;
import com.neotel.smfcore.core.device.util.DataCache;
import com.neotel.smfcore.core.system.service.po.DataLog;
import com.neotel.smfcore.core.system.util.TaskService;
import com.neotel.smfcore.custom.Jkem21481.bean.StorageExport;
import com.neotel.smfcore.custom.Jkem21481.bean.dto.StorageExportDto;
import com.neotel.smfcore.custom.Jkem21481.util.StorageExportUtil;
import com.neotel.smfcore.security.annotation.AnonymousAccess;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
@Slf4j
@RestController
@RequestMapping("/storageExport")
public class StorageExportController {
@Autowired
private DataCache dataCache;
@Autowired
private TaskService taskService;
@ApiOperation("获取出料口详情")
@RequestMapping("/getDetailByExport")
@AnonymousAccess
public ResultBean getDetailByExport(String export) {
StorageExportDto dto = getStorageExportDto(export);
return ResultBean.newOkResult(dto);
}
@ApiOperation("清空出料口")
@RequestMapping("/clearExport")
@AnonymousAccess
public ResultBean clearExport(String export, String feeder) {
log.info("收到清空出料口信息:" + export + ",feeder为:" + feeder);
List<DataLog> needCancelTask = new ArrayList<>();
List<DataLog> allTasks = taskService.getAllTasks();
for (DataLog dataLog : allTasks) {
if (dataLog.isCancel() || dataLog.isFinished()){
continue;
}
String feederInfo = dataLog.getAppendData("feederInfo");
String taskExport = dataLog.getExport();
if (StringUtils.isNotEmpty(taskExport) && StringUtils.isNotEmpty(feederInfo)) {
if (taskExport.startsWith(export) && feederInfo.startsWith(feeder)) {
log.info("清空出料口:" + export + ",feeder为:" + feeder + ",任务需要取消,barcode为:" + dataLog.getBarcode() + ",状态为:" + dataLog.getStatus());
needCancelTask.add(dataLog);
}
}
}
String orderNo = "";
if (needCancelTask != null && !needCancelTask.isEmpty()) {
for (DataLog dataLog : needCancelTask) {
if (StringUtils.isEmpty(orderNo)) {
orderNo = dataLog.getSourceName();
}
dataLog.setStatus(OP_STATUS.CANCEL.name());
taskService.moveTaskToFinished(dataLog);
taskService.updateFinishedTask(dataLog);
//StorageExportUtil.updateExportData(dataLog.getExport(), dataLog.getBarcode(), dataLog.getAppendData("feederInfo"), dataLog.getSourceName(), OP_STATUS.CANCEL.name());
}
}
//判断是否要出下一个工单
String needFeeder = "";
if ("1".equals(feeder)) {
needFeeder = "5";
} else if ("2".equals(feeder)) {
needFeeder = "6";
} else if ("3".equals(feeder)) {
needFeeder = "7";
} else if ("4".equals(feeder)) {
needFeeder = "8";
} else if ("5".equals(feeder)) {
needFeeder = "-1";
} else if ("6".equals(feeder)) {
needFeeder = "-1";
} else if ("7".equals(feeder)) {
needFeeder = "-1";
} else if ("8".equals(feeder)) {
needFeeder = "-1";
}
//更新信息
List<StorageExport> exportList = StorageExportUtil.getSimpleExport(export);
for (StorageExport storageExport : exportList) {
if ("-1".equals(needFeeder)) {
StorageExportUtil.clearExport(storageExport.getExportName());
} else {
StorageExportUtil.updateExport(storageExport.getExportName(), needFeeder);
}
}
return ResultBean.newOkResult(getStorageExportDto(export));
}
private StorageExportDto getStorageExportDto(String export) {
StorageExportDto dto = new StorageExportDto();
dto.setExportName(export);
List<StorageExport> outDetailList = new ArrayList<>();
Map<String, StorageExport> exportMap = StorageExportUtil.exportMap;
for (String key : exportMap.keySet()) {
if (key.contains(export)) {
StorageExport storageExport = exportMap.get(key);
String feeder = storageExport.getFeeder();
if (StringUtils.isEmpty(dto.getFeederInfo())||"-1".equals(dto.getFeederInfo())) {
dto.setFeederInfo(feeder);
}
dto.setHSerial(storageExport.getHSerial());
outDetailList.add(storageExport);
}
}
outDetailList = outDetailList.stream().sorted(Comparator.comparing(StorageExport::getExportName)).collect(Collectors.toList());
dto.setOutDetailList(outDetailList);
return dto;
}
}
package com.neotel.smfcore.custom.Jkem21481.dao;
import com.neotel.smfcore.common.base.IBaseDao;
public interface IPartNumberDao extends IBaseDao {
}
package com.neotel.smfcore.custom.Jkem21481.dao;
import com.neotel.smfcore.common.base.IBaseDao;
public interface IReturnStorageDao extends IBaseDao {
}
package com.neotel.smfcore.custom.Jkem21481.dao.impl;
import com.neotel.smfcore.common.base.AbstractBaseDao;
import com.neotel.smfcore.custom.Jkem21481.bean.MJPartNumber;
import com.neotel.smfcore.custom.Jkem21481.dao.IPartNumberDao;
import org.springframework.stereotype.Service;
@Service
public class PartNumberDaoImpl extends AbstractBaseDao implements IPartNumberDao {
@Override
public Class getEntityClass() {
return MJPartNumber.class;
}
}
package com.neotel.smfcore.custom.Jkem21481.dao.impl;
import com.neotel.smfcore.common.base.AbstractBaseDao;
import com.neotel.smfcore.custom.Jkem21481.bean.ReturnStorage;
import com.neotel.smfcore.custom.Jkem21481.dao.IReturnStorageDao;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
@Slf4j
@Service
public class ReturnStorageDaoImpl extends AbstractBaseDao implements IReturnStorageDao {
@Override
public Class getEntityClass() {
return ReturnStorage.class;
}
}
package com.neotel.smfcore.custom.Jkem21481.manager;
import com.neotel.smfcore.common.base.IBaseManager;
import com.neotel.smfcore.custom.Jkem21481.bean.MJPartNumber;
import java.util.List;
public interface IPartNumberManager extends IBaseManager<MJPartNumber> {
MJPartNumber findByMakerPartNumber(String makerPartNumber);
List<MJPartNumber> findAll();
int getPitchByJkemPartNumber(String pn);
void batchDelete(List<String> idList);
}
package com.neotel.smfcore.custom.Jkem21481.manager;
import com.neotel.smfcore.common.base.IBaseManager;
import com.neotel.smfcore.custom.Jkem21481.bean.ReturnStorage;
public interface IReturnStorageManager extends IBaseManager<ReturnStorage> {
void saveOrUpdateReturnStorage(String barcode);
}
package com.neotel.smfcore.custom.Jkem21481.manager.impl;
import com.neotel.smfcore.common.base.BasePo;
import com.neotel.smfcore.common.bean.PageData;
import com.neotel.smfcore.common.exception.ValidateException;
import com.neotel.smfcore.custom.Jkem21481.bean.MJPartNumber;
import com.neotel.smfcore.custom.Jkem21481.dao.IPartNumberDao;
import com.neotel.smfcore.custom.Jkem21481.manager.IPartNumberManager;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Pageable;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
@Slf4j
public class PartNumberManagerImpl implements IPartNumberManager {
@Autowired
private IPartNumberDao partNumberDao;
@Override
public MJPartNumber get(String id) {
return partNumberDao.findOneById(id);
}
@Override
public MJPartNumber save(MJPartNumber object) throws ValidateException {
return partNumberDao.save(object);
}
@Override
public void delete(MJPartNumber object) throws ValidateException {
partNumberDao.removeOne(object);
}
@Override
public PageData<MJPartNumber> findByPage(Query query, Pageable pageable) {
int count = partNumberDao.countByQuery(query);
List list = partNumberDao.findByQuery(query, pageable);
return new PageData<MJPartNumber>(list,count);
}
@Override
public List<MJPartNumber> findByQuery(Query query) {
return partNumberDao.findByQuery(query);
}
@Override
public MJPartNumber findByMakerPartNumber(String makerPartNumber) {
return partNumberDao.findOne(new Query(Criteria.where("makerPartNumber").is(makerPartNumber)));
}
@Override
public List<MJPartNumber> findAll() {
return partNumberDao.findAll();
}
@Override
public int getPitchByJkemPartNumber(String pn) {
MJPartNumber mjPartNumber = partNumberDao.findOne(new Query(Criteria.where("jkemPartNumber").is(pn)));
if (mjPartNumber == null){
return 0;
} else {
int pitch = mjPartNumber.getPitch();
if (pitch > 0){
return pitch;
}
}
return 0;
}
@Override
public void batchDelete(List<String> idList) {
for (String id : idList) {
partNumberDao.removeOneById(id);
}
}
}
package com.neotel.smfcore.custom.Jkem21481.manager.impl;
import com.neotel.smfcore.common.bean.PageData;
import com.neotel.smfcore.common.exception.ValidateException;
import com.neotel.smfcore.core.barcode.service.po.Barcode;
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.custom.Jkem21481.bean.ReturnStorage;
import com.neotel.smfcore.custom.Jkem21481.dao.IReturnStorageDao;
import com.neotel.smfcore.custom.Jkem21481.manager.IReturnStorageManager;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.stereotype.Service;
import java.util.Date;
import java.util.List;
@Slf4j
@Service
public class ReturnStorageManagerImpl implements IReturnStorageManager {
@Autowired
private IReturnStorageDao returnStorageDao;
@Autowired
private ILiteOrderItemManager liteOrderItemManager;
@Autowired
private ILiteOrderManager liteOrderManager;
@Override
public ReturnStorage get(String id) {
return returnStorageDao.findOneById(id);
}
@Override
public ReturnStorage save(ReturnStorage object) throws ValidateException {
return returnStorageDao.save(object);
}
@Override
public void delete(ReturnStorage object) throws ValidateException {
returnStorageDao.removeOne(object);
}
@Override
public PageData<ReturnStorage> findByPage(Query query, Pageable pageable) {
int count = returnStorageDao.countByQuery(query);
List list = returnStorageDao.findByQuery(query, pageable);
return new PageData<>(list,count);
}
@Override
public List<ReturnStorage> findByQuery(Query query) {
return returnStorageDao.findByQuery(query);
}
@Override
public void saveOrUpdateReturnStorage(String barcode) {
LiteOrderItem item = liteOrderItemManager.findOne(new Query(Criteria.where("outBarcodeList.barcode").is(barcode)).with(Sort.by(Sort.Direction.DESC,"createDate")));
if (item != null) {
List<Barcode> outBarcodeList = item.getOutBarcodeList();
if (outBarcodeList != null && !outBarcodeList.isEmpty()){
for (Barcode subCode : outBarcodeList) {
if (barcode.equals(subCode.getBarcode())){
Date createDate = subCode.getCreateDate();
//超过48小时,就不统计
if (System.currentTimeMillis()-createDate.getTime() < 1000 * 60 * 60 * 48){
ReturnStorage returnStorage = new ReturnStorage();
returnStorage.setReturnBarcode(barcode);
returnStorage.setFeederInfo(item.getFeederInfo());
returnStorage.setLastExport(subCode.getAppendData("export"));
returnStorage.setNeedNum(item.getNeedNum());
returnStorage.setOutNum(item.getOutNum());
returnStorage.setPn(item.getPn());
LiteOrder liteOrder = liteOrderManager.get(item.getOrderId());
if (liteOrder != null) {
returnStorage.setOrderNo(liteOrder.getOrderNo());
}
returnStorage.setOrderItemId(item.getId());
returnStorageDao.save(returnStorage);
}
}
}
}
}
}
}
package com.neotel.smfcore.custom.Jkem21481.menu;
import com.neotel.smfcore.common.init.MenuInit;
import com.neotel.smfcore.core.api.SmfApi;
import com.neotel.smfcore.security.service.po.Menu;
import org.apache.logging.log4j.util.Strings;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
@Component
public class JkemMenu {
@Autowired
MenuInit menuInit;
@Autowired
SmfApi smfApi;
String menuLabel = "21481";
@PostConstruct
public void init() {
Menu menu = Menu.CreatePMenu("出料口", 10, "export", "um", null);
//Report菜单
MenuInit.addMenu(menuLabel, menu, 1, "UM1", "UM1", "neolight/um/index", "um");
MenuInit.addMenu(menuLabel, menu, 2, "UM2", "UM2", "neolight/um/index", "um");
MenuInit.addMenu(menuLabel, menu, 3, "UM3", "UM3", "neolight/um/index", "um");
MenuInit.addMenu(menuLabel, menu, 4, "UM4", "UM4", "neolight/um/index", "um");
MenuInit.addMenu(menuLabel, menu, 5, "UM5", "UM5", "neolight/um/index", "um");
MenuInit.addMenu(menuLabel, menu, 6, "UM6", "UM6", "neolight/um/index", "um");
MenuInit.addMenu(menuLabel, menu, 7, "UM7", "UM7", "neolight/um/index", "um");
MenuInit.addMenu(menuLabel, menu, 8, "UM8", "UM8", "neolight/um/index", "um");
String apiName = smfApi.getApiName();
if (Strings.isNotBlank(apiName) && apiName.equals(menuLabel)) {
menuInit.showMenu(apiName);
}
}
}
......@@ -2,7 +2,7 @@ server:
port: 8800
api:
name:
name: 21481
inCheckUrl:
outNotifyUrl:
inNotifyUrl:
......@@ -47,7 +47,7 @@ app:
type: ""
menu:
show:
show: partNumberManager,translation,returnStorage
hide:
smd:
......
......@@ -388,3 +388,8 @@ smfcore.msg.op.fail=\u64CD\u4F5C\u5931\u8D25
smfcore.equip.notExist=\u8BBE\u5907\u4E0D\u5B58\u5728
smfcore.order.finished=\u5DE5\u5355[{0}]\u7684\u4EFB\u52A1\u5DF2\u5168\u90E8\u5B8C\u6210
smfcore.spkanban=SP\u4EEA\u8868\u76D8
smfcore.order.noEmptyExport=\u6CA1\u6709\u7A7A\u95F2\u7684\u51FA\u6599\u53E3
smfcore.export=\u51FA\u6599\u53E3
smfcore.partNumberManager=PartNumber\u7BA1\u7406
smfcore.returnStorage=\u56DE\u5E93
smf.barcode.msd.validate=\u8BE5\u7269\u6599\u9700\u8981MSD\u7BA1\u63A7\u4E0D\u80FD\u5728\u672C\u6599\u4ED3\u5165\u5E93
\ No newline at end of file
......@@ -379,3 +379,8 @@ smfcore.msg.op.fail=failure of an operation
smfcore.equip.notExist=Device does not exist
smfcore.order.finished=workorder[{0}] has completed all of its tasks
smfcore.spkanban=SP Dash Board
smfcore.order.noEmptyExport=No available discharge outlet
smfcore.export=Outlet
smfcore.partNumberManager=PartNumber Management
smfcore.returnStorage=Return to Inventory
smf.barcode.msd.validate=This material requires MSD control and cannot be stored in this warehouse
\ No newline at end of file
......@@ -375,3 +375,8 @@ smfcore.msg.op.fail=\u64CD\u4F5C\u5931\u8D25
smfcore.equip.notExist=\u8BBE\u5907\u4E0D\u5B58\u5728
smfcore.order.finished=\u30EF\u30FC\u30AF\u30AA\u30FC\u30C0\u30FC[{0}]\u306E\u30BF\u30B9\u30AF\u306F\u3059\u3079\u3066\u5B8C\u4E86\u3057\u307E\u3057\u305F
smfcore.spkanban=\u30C0\u30C3\u30B7\u30E5\u30DC\u30FC\u30C9
smfcore.order.noEmptyExport=\u7A7A\u304D\u306E\u6392\u51FA\u53E3\u304C\u3042\u308A\u307E\u305B\u3093
smfcore.export=\u306F\u3044\u3058\u3085\u3064\u3053\u3046
smfcore.partNumberManager=PartNumber \u304B\u3093\u308A
smfcore.returnStorage=\u305D\u3046\u3053\u306B\u3082\u3069\u308B
smf.barcode.msd.validate=\u3053\u306E\u6750\u6599\u306FMSD\u7BA1\u7406\u304C\u5FC5\u8981\u3067\u3001\u672C\u5009\u5EAB\u306B\u5165\u5EAB\u3067\u304D\u307E\u305B\u3093\u3002
\ No newline at end of file
......@@ -375,3 +375,8 @@ smfcore.msg.op.fail=\u64CD\u4F5C\u5931\u8D25
smfcore.equip.notExist=\u8BBE\u5907\u4E0D\u5B58\u5728
smfcore.order.finished=\u5DE5\u5355[{0}]\u7684\u4EFB\u52A1\u5DF2\u5168\u90E8\u5B8C\u6210
smfcore.spkanban=SP\u4EEA\u8868\u76D8
smfcore.order.noEmptyExport=\u6CA1\u6709\u7A7A\u95F2\u7684\u51FA\u6599\u53E3
smfcore.export=\u51FA\u6599\u53E3
smfcore.partNumberManager=PartNumber\u7BA1\u7406
smfcore.returnStorage=\u56DE\u5E93
smf.barcode.msd.validate=\u8BE5\u7269\u6599\u9700\u8981MSD\u7BA1\u63A7\u4E0D\u80FD\u5728\u672C\u6599\u4ED3\u5165\u5E93
\ No newline at end of file
......@@ -375,3 +375,8 @@ smfcore.msg.op.fail=\u64CD\u4F5C\u5931\u6557
smfcore.equip.notExist=\u8A2D\u5099\u4E0D\u5B58\u5728
smfcore.order.finished=\u5DE5\u55AE[{0}]\u7684\u4EFB\u52D9\u5DF2\u5168\u90E8\u5B8C\u6210
smfcore.spkanban=SP\u5100\u9336\u76E4
smfcore.order.noEmptyExport=\u6C92\u6709\u7A7A\u9592\u7684\u51FA\u6599\u53E3
smfcore.export=\u51FA\u6599\u53E3
smfcore.partNumberManager=PartNumber\u7BA1\u7406
smfcore.returnStorage=\u56DE\u5EAB
smf.barcode.msd.validate=\u8A72\u7269\u6599\u9700\u9032\u884CMSD\u7BA1\u63A7\uFF0C\u4E0D\u53EF\u5728\u672C\u6599\u5009\u5165\u5EAB
\ No newline at end of file
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!