Commit a28c2ecc zshaohui

立臻接口优化

1 个父辈 889be16a
......@@ -135,4 +135,8 @@ public class Constants {
*/
public static final String CACHE_languageType="CACHE_languageType";
/**
* 缺料预警配置
*/
public static final String CACHE_preWarningItem = "preWarningItem";
}
......@@ -147,6 +147,11 @@ public class Barcode extends BasePo implements Serializable {
private Date checkOutDate;
/**
* 日期编码(供应商)
*/
private String dateCode;
/**
* 关联条码,夹具时关联相关的物料,用于入库完成时插入相关物料
*/
@Transient
......
......@@ -144,6 +144,6 @@ public enum DeviceType {
}
public static List<DeviceType> availableTypeList(){
return Lists.newArrayList(AUTO,LINE,BATCH,SOLDERPASTE,VERTICALBOX,SMD_XL,SMD_DUO,SMD_XLC,VIRTUAL,NL,NLP,NLM,AGV_BOX);
return Lists.newArrayList(AUTO,LINE,BATCH,SOLDERPASTE,VERTICALBOX,SMD_XL,SMD_DUO,SMD_XLC,SMD_XLR,VIRTUAL,NL,NLP,NLM,AGV_BOX);
}
}
......@@ -27,6 +27,30 @@ public class LizhenApi extends BaseSmfApiListener {
try {
String result = HttpHelper.postJson(reelNumUrl, reelId);
log.info("获取MES物料数量出参为:" + result);
Map<String, Object> resultMap = JsonUtil.toMap(result);
Object status = resultMap.get("status");
if (status != null){
if (status.equals(200)){
Map<String, Object> dataMap = JsonUtil.toMap(resultMap.get("data").toString());
String reelID = dataMap.get("reelID") == null ? "" : dataMap.get("reelID").toString();
String partNum = dataMap.get("partNum") == null ? "" : dataMap.get("partNum").toString();
String partSpec = dataMap.get("partSpec") == null ? "" : dataMap.get("partSpec").toString();
int qty = dataMap.get("qty") == null ? 0 : Integer.valueOf(dataMap.get("qty").toString());
String vendor = dataMap.get("vendor") == null ? "" : dataMap.get("vendor").toString();
String vendorNum = dataMap.get("vendorNum") == null ? "" : dataMap.get("vendorNum").toString();
String dataCode = dataMap.get("dataCode") == null ? "" : dataMap.get("dataCode").toString();
String lotCode = dataMap.get("lotCode") == null ? "" : dataMap.get("lotCode").toString();
Barcode barcode = new Barcode();
barcode.setBarcode(reelID);
barcode.setPartNumber(partNum);
barcode.setAmount(qty);
barcode.setProvider(vendor);
barcode.setProviderNumber(vendorNum);
barcode.setDateCode(dataCode);
barcode.setBatch(lotCode);
return barcode;
}
}
} catch (ApiException e) {
e.printStackTrace();
}
......@@ -66,22 +90,35 @@ public class LizhenApi extends BaseSmfApiListener {
//2.禁用料接口MES提供外围系统调用
public void wmsCheckReelfob(String checkReelfobUrl, Barcode barcode) {
public static String wmsCheckReelfob(String checkReelfobUrl, Barcode barcode) {
String resultStr = "false";
Map<String, Object> paramMap = new HashMap<>();
paramMap.put("ipn", barcode.getPartNumber());
paramMap.put("reelId", barcode.getBarcode());
paramMap.put("wo", "");
paramMap.put("datecode", new SimpleDateFormat("yyyyMMdd").format(barcode.getProduceDate()));
paramMap.put("datecode", barcode.getDateCode());
paramMap.put("lot", barcode.getPosName());
paramMap.put("vendor", barcode.getProviderNumber());
String param = JsonUtil.toJsonStr(paramMap);
log.info("禁用料接口wmsCheckReelfob入参为:" + param);
try {
String result = HttpHelper.postJson(checkReelfobUrl, paramMap);
Map<String, Object> resultMap = JsonUtil.toMap(result);
if (resultMap != null) {
if (resultMap.get("data") != null) {
Map<String, Object> dataMap = JsonUtil.toMap(resultMap.get("data").toString());
if (dataMap.get("result") != null && dataMap.get("result").equals(true)) {
resultStr = "";
} else {
resultStr = dataMap.get("message").toString();
}
}
}
log.info("禁用料接口wmsCheckReelfob出参为:" + result);
} catch (ApiException e) {
e.printStackTrace();
}
return resultStr;
}
@Override
......
......@@ -7,10 +7,14 @@ import com.neotel.smfcore.core.order.LiteOrderCache;
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.lizhen.innerBox.bean.PreWarningItem;
import com.neotel.smfcore.custom.lizhen.innerBox.util.PreWarningItemCache;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.ArrayList;
......@@ -20,6 +24,7 @@ import java.util.Map;
@Slf4j
@RestController
@RequestMapping("/api/Mes")
public class LizhenController {
@Autowired
......@@ -29,7 +34,7 @@ public class LizhenController {
private LiteOrderCache liteOrderCache;
//1.发料明细
@PostMapping("/api/Mes/EPickingList")
@PostMapping("/EPickingList")
public ResultBean EPickingList(@RequestBody List<Map<String, Object>> params) {
if (params == null || params.isEmpty()) {
return ResultBean.newErrorResult(-1, "smfcore.valueCanotNull", "参数不能为空");
......@@ -103,59 +108,28 @@ public class LizhenController {
return ResultBean.newOkResult("");
}
//5.缺料预警
@PostMapping("/api/Mes/MpickingList")
public ResultBean MpickingList(@RequestBody Map<String,Object> paramMap) {
if (paramMap.get("data") == null){
return ResultBean.newErrorResult(-1, "smfcore.valueCanotNull", "参数不能为空");
@ApiOperation("5.缺料预警")
@PostMapping("/mPickingList")
public ResultBean mPickingList(@RequestBody Map<String, List<Map<String, String>>> paramMap) {
List<Map<String, String>> datas = paramMap.get("data");
if (datas == null || datas.isEmpty()) {
return ResultBean.newErrorResult(-1, "", "data不能为空");
}
String data = JsonUtil.toJsonStr(paramMap.get("data"));
List<Map> params = JsonUtil.toList(data, Map.class);
if (params == null || params.isEmpty()) {
return ResultBean.newErrorResult(-1, "smfcore.valueCanotNull", "参数不能为空");
List<PreWarningItem> items = new ArrayList<>();
for (Map<String, String> data : datas) {
PreWarningItem item = new PreWarningItem();
item.setMachinename(data.get("machinename"));
item.setStation(data.get("station"));
item.setSide(data.get("side"));
item.setSlot(data.get("slot"));
item.setSubslot(data.get("subslot"));
item.setPartnumber(data.get("partnumber"));
item.setLine(data.get("line"));
items.add(item);
}
//全部必填的 进行校验
for (Map<String, Object> param : params) {
for (Map.Entry<String, Object> par : param.entrySet()) {
String parValue = par.getValue() == null ? "" : par.getValue().toString();
if (StringUtils.isBlank(parValue)){
return ResultBean.newErrorResult(-1, "smfcore.valueCanotNull", "{}不能为空", new String[]{par.getKey()});
}
}
}
for (Map<String, Object> param : params) {
String id = param.get("id") == null ? "" : param.get("id").toString();
String workorderno = param.get("workorderno") == null ? "" : param.get("workorderno").toString();
String line = param.get("line") == null ? "" : param.get("line").toString();
String machinename = param.get("machinename") == null ? "" : param.get("machinename").toString();
String station = param.get("station") == null ? "" : param.get("station").toString();
String side = param.get("side") == null ? "" : param.get("side").toString();
String subslot = param.get("subslot") == null ? "" : param.get("subslot").toString();
String partnumber = param.get("partnumber") == null ? "" : param.get("partnumber").toString();
String leftqty = param.get("leftqty") == null ? "" : param.get("leftqty").toString();
String leftpcbs = param.get("leftpcbs") == null ? "" : param.get("leftpcbs").toString();
String lefttimes = param.get("lefttimes") == null ? "" : param.get("lefttimes").toString();
String priority = param.get("priority") == null ? "" : param.get("priority").toString();
String op = param.get("op") == null ? "" : param.get("op").toString();
String productboards = param.get("productboards") == null ? "" : param.get("productboards").toString();
String reel = param.get("reel") == null ? "" : param.get("reel").toString();
LiteOrder liteOrder = new LiteOrder();
liteOrder.setSo(id);
liteOrder.setOrderNo(workorderno);
liteOrder.setLine(line);
LiteOrderItem liteOrderItem = new LiteOrderItem();
liteOrderItem.setSide(side);
liteOrderItem.setFeederInfo(station);
liteOrderItem.setPn(partnumber);
liteOrderItem.setNeedNum(Integer.valueOf(leftqty));
liteOrderItem.setRi(reel);
liteOrder.setOrderItems(Arrays.asList(liteOrderItem));
liteOrder = liteOrderManager.createWithItems(liteOrder);
liteOrderCache.addOrderToMap(liteOrder);
if (items != null && !items.isEmpty()) {
PreWarningItemCache.addItems(items);
}
return ResultBean.newOkResult("");
}
......
......@@ -89,6 +89,7 @@ public class WarehouseController {
station.setName(name);
station.setGrLabel(grLabel);
station.setReelNum(Integer.valueOf(num));
station.setReelCurrentNum(0);
StationCacheUtil.updateStation(station);
return ResultBean.newOkResult("");
}
......@@ -197,14 +198,14 @@ public class WarehouseController {
return ResultBean.newErrorResult(-1, "", "请先扫描料箱,再扫描条码");
}
StationCacheUtil.saveReelToBoxCode(station);
String boxBarcode = lastScanBoxCode.substring(0, code.indexOf("-")); //获取到料箱条码
String boxBarcode = lastScanBoxCode.substring(0, lastScanBoxCode.indexOf("-")); //获取到料箱条码
Barcode pidBarcode = barcodeManager.findByBarcode(boxBarcode);
barcode.setHostBarcodeId(pidBarcode.getId());
barcode.setPosName(lastScanBoxCode);
finishTask(pidBarcode, 1, null, barcode, 1);
}
}
return ResultBean.newOkResult(station.getLastScanBoxCode());
return ResultBean.newOkResult(StationCacheUtil.getStation(name));
}
......
package com.neotel.smfcore.custom.lizhen.innerBox.rest;
import com.neotel.smfcore.common.bean.ResultBean;
import com.neotel.smfcore.core.device.enums.OP_STATUS;
import com.neotel.smfcore.core.system.service.po.DataLog;
import com.neotel.smfcore.core.system.util.TaskService;
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 javax.servlet.http.HttpServletRequest;
import java.util.Collection;
/**
* @author sunke
* @date 2022/10/9 3:20 PM
*/
@Slf4j
@RestController
@RequestMapping("/service/store/innerBox")
public class InnerBoxRestController {
@Autowired
private TaskService taskService;
@ApiOperation("IA 出库更新任务状态")
@RequestMapping("/updateLocInfo")
public ResultBean updateLocInfo(HttpServletRequest request) {
String barcode = request.getHeader("barcode");
String status = request.getHeader("status");
String loc = request.getHeader("loc");
log.info("IA 出库更新任务状态--barcode:{},status:{},loc:{}", barcode, status, loc);
//获取到当前执行的任务
DataLog opTask = null;
Collection<DataLog> allTasks = taskService.getAllTasks();
for (DataLog task : allTasks) {
if (barcode.startsWith(task.getBarcode())) {
if (!task.isCancel() && !task.isFinished()) {
opTask = task;
}
break;
}
}
if (opTask == null) {
return ResultBean.newErrorResult(303, "smfcore.task.notExist", "任务不存在");
}
status = status.toUpperCase();
log.info("更新任务状态:{}-->{}",opTask.getStatus(),status);
OP_STATUS updateStatus = OP_STATUS.valueOf(status);
if (updateStatus != null){
opTask.setStatus(status);
if (OP_STATUS.EXECUTING.name().equals(status)){
taskService.updateQueueTask(opTask);
}
}
return null;
}
@ApiOperation("IB 获取料箱状态信息")
@RequestMapping("/getBoxStatus")
public ResultBean getBoxStatus(HttpServletRequest request){
return null;
}
@ApiOperation("IC 获取料架标签打印信息")
@RequestMapping("/getPrintLabel")
public ResultBean getPrintLabel(HttpServletRequest request){
return null;
}
@ApiOperation("ID 料架标签打印完成通知")
@RequestMapping("/finishPrintLabel")
public ResultBean finishPrintLabel(HttpServletRequest request){
return null;
}
@ApiOperation("IE 贴标前获取站位信息")
@RequestMapping("/getFeederInfo")
public ResultBean getFeederInfo(HttpServletRequest request){
return null;
}
}
package com.neotel.smfcore.custom.lizhen.innerBox.util;
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.util.DataCache;
import com.neotel.smfcore.core.order.LiteOrderCache;
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.storage.enums.DeviceType;
import com.neotel.smfcore.core.storage.service.manager.IStoragePosManager;
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.TaskService;
import com.neotel.smfcore.custom.lizhen.LizhenApi;
import com.neotel.smfcore.custom.lizhen.innerBox.bean.PreWarningItem;
import lombok.extern.slf4j.Slf4j;
import org.apache.logging.log4j.util.Strings;
import org.springframework.beans.factory.annotation.Autowired;
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.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.*;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.atomic.AtomicLong;
import java.util.stream.Collectors;
/**
* 机台预警信息缓存
......@@ -22,6 +35,7 @@ import java.util.concurrent.CopyOnWriteArrayList;
* @date 2022/10/9 3:31 PM
*/
@Slf4j
@Service
public class PreWarningItemCache {
/**
......@@ -35,6 +49,11 @@ public class PreWarningItemCache {
private static DataCache dataCache;
private static ILiteOrderManager liteOrderManager;
private static IStoragePosManager storagePosManager;
private static List<String> outBarcodeList = new ArrayList<>();
/**
* 添加到预警列表缓存中
......@@ -67,12 +86,16 @@ public class PreWarningItemCache {
String firstItemLine = "";
//每次最多出多少盘
int maxReelCount = 30;
//如果取不到,从数据库中取
if (queueItemList == null || queueItemList.isEmpty()){
queueItemList = dataCache.getCache(Constants.CACHE_preWarningItem);
}
for (PreWarningItem preWarningItem : queueItemList) {
String itemLine = preWarningItem.getLine();
if(Strings.isNotBlank(itemLine)){
if(firstItemLine.isEmpty()){
if (firstItemLine.isEmpty()) {
firstItemLine = itemLine;
if(preWarningItem.getReceiveDate().getTime() - System.currentTimeMillis() < 1 * 60 * 1000){
if (System.currentTimeMillis() - preWarningItem.getReceiveDate().getTime() < 1 * 60 * 1000) {
//不到1分钟,暂不执行
return;
}
......@@ -94,20 +117,112 @@ public class PreWarningItemCache {
}
}
/**
* 根据预警信息挑选物料, 生成工单任务并执行
* @param lineItems
*/
private static void createAndExecuteLiteOrder(List<PreWarningItem> lineItems){
private static void createAndExecuteLiteOrder(List<PreWarningItem> lineItems) {
//TODO: 挑选物料,生成工单任务并执行
//开始对线别进行分组
Map<String, List<PreWarningItem>> lineMap = lineItems.stream().collect(Collectors.groupingBy(PreWarningItem::getLine));
for (Map.Entry<String, List<PreWarningItem>> lineEntry : lineMap.entrySet()) {
String line = lineEntry.getKey(); //线别
List<PreWarningItem> linePreWarningItem = lineEntry.getValue(); //处理线别需求单
LiteOrder liteOrder = new LiteOrder();
liteOrder.setType(2);
liteOrder.setLine(line);
liteOrder.setOrderNo(getSeq());
liteOrder.setSo(getSeq());
List<LiteOrderItem> orderItems = new ArrayList<>();
for (PreWarningItem item : linePreWarningItem) {
Barcode barcode = getChooseReel(item); //获取到需要出库的barcode
if (barcode != null) {
LiteOrderItem orderItem = new LiteOrderItem();
orderItem.setRi(barcode.getBarcode());
orderItem.setPn(item.getPartnumber());
orderItem.setNeedNum(1);
orderItem.setSide(item.getSide());
orderItem.setFeederInfo(item.getSlot());
orderItem.setTableNo(item.getMachinename());
orderItems.add(orderItem);
} else {
LiteOrderItem orderItem = new LiteOrderItem();
orderItem.setRi(item.getPartnumber());
orderItem.setPn(item.getPartnumber());
orderItem.setNeedNum(0);
orderItem.setSide(item.getSide());
orderItem.setFeederInfo(item.getSlot());
orderItem.setTableNo(item.getMachinename());
orderItems.add(orderItem);
}
}
if (orderItems != null && !orderItems.isEmpty()) {
liteOrder.setOrderItems(orderItems);
liteOrder.setTaskReelCount(orderItems.size());
liteOrder = liteOrderManager.createWithItems(liteOrder);
liteOrderManager.save(liteOrder);
liteOrderCache.addOrderToMap(liteOrder);
}
}
}
private static synchronized void updateItem(List<PreWarningItem> items, boolean remove){
if(remove){
queueItemList.remove(items);
}else{
private static Barcode getChooseReel(PreWarningItem item) {
final int limitNum = 5;
List<String> passBarcodes = new ArrayList<>();
String partnumber = item.getPartnumber();
boolean chooseFlag = true;
while (chooseFlag) {
Query query = new Query();
Criteria criteria = new Criteria();
//查询最先入的,前5条
criteria.where("barcode").exists(true).and("enabled").is(true);//可用;
if (passBarcodes != null && !passBarcodes.isEmpty()) {
criteria.and("barcode.subCodeList.barcode").nin(passBarcodes);
}
if (outBarcodeList != null && !outBarcodeList.isEmpty()) {
criteria.and("barcode.subCodeList.barcode").nin(outBarcodeList);
}
criteria.and("barcode.subCodeList.partNumber").is(partnumber);
query.addCriteria(criteria);
query.with(Sort.by(Sort.Direction.ASC, "canCheckOutTime", "barcode.subCodeList.usedCount"));
query.limit(limitNum);
List<StoragePos> storagePoss = storagePosManager.findByQuery(query);
if (storagePoss == null || storagePoss.isEmpty()) { //如果没有,则退出
chooseFlag = false;
}
for (StoragePos pos : storagePoss) {
Barcode barcode = pos.getBarcode();
List<Barcode> subCodeList = barcode.getSubCodeList();
for (Barcode subcode : subCodeList) {
//验证立臻接口,选择做成单个验证,后期需要修改为多个验证
String result = LizhenApi.wmsCheckReelfob("", subcode);
if (StringUtils.isBlank(result)) {
outBarcodeList.add(subcode.getBarcode());
return subcode;
} else {
passBarcodes.add(subcode.getBarcode());
}
}
}
}
return null;
}
private static synchronized void updateItem(List<PreWarningItem> items, boolean remove) {
if (remove) {
for (PreWarningItem item : items) {
queueItemList.remove(item);
}
} else {
queueItemList.addAll(items);
}
dataCache.updateCache(Constants.CACHE_preWarningItem, queueItemList);
}
private static boolean processing = false;
......@@ -144,4 +259,18 @@ public class PreWarningItemCache {
public void setDataCache(DataCache dataCache) {
PreWarningItemCache.dataCache = dataCache;
}
@Autowired
public void setILiteOrderManager(ILiteOrderManager liteOrderManager) {
PreWarningItemCache.liteOrderManager = liteOrderManager;
}
@Autowired
public void setIStoragePosManager(IStoragePosManager storagePosManager) {
PreWarningItemCache.storagePosManager = storagePosManager;
}
private static String getSeq(){
return UUID.randomUUID().toString();
}
}
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!