Commit 1523e274 zshaohui

1.差异料功能提交

1 个父辈 9e7940a2
......@@ -334,6 +334,7 @@ public class LiteOrderCache {
liteOrderItem.setOutReelCount(liteOrderItem.getOutReelCount() + 1);
liteOrderItem.setTotalOutNum(liteOrderItem.getTotalOutNum() + task.getNum());
liteOrderItem.setTotalOutReelCount(liteOrderItem.getTotalOutReelCount() + 1);
liteOrderItem.setOutPn(task.getPartNumber());
liteOrderItem = liteOrderItemManager.save(liteOrderItem);
}
liteOrderItems.add(liteOrderItem);
......
......@@ -152,6 +152,9 @@ public class LiteOrder extends BasePo implements Serializable {
private Date finishDate;
private boolean differenceReq = false;
public void setClosed(boolean value){
this.closed=value;
if(value){
......
......@@ -220,6 +220,13 @@ public class LiteOrderItem extends BasePo implements Serializable ,Comparable<Li
private Date issuanceDate;
/**
* 发料pn
*/
private String outPn;
private String station;
/**
* 出库是否满足要求,已出库数量大于需求数量
*/
public boolean isOutFinished(){
......
......@@ -20,4 +20,6 @@ public interface IDataLogManager extends IBaseManager<DataLog> {
int countBySourceName(String barcodeStr, String orderNo);
int countByQuery(Query subSourceId);
DataLog findOne(Query with);
}
......@@ -129,4 +129,9 @@ public class DataLogManagerImpl implements IDataLogManager {
public int countByQuery(Query query) {
return dataLogDao.countByQuery(query);
}
@Override
public DataLog findOne(Query query) {
return dataLogDao.findOne(query);
}
}
......@@ -10,16 +10,20 @@ import com.neotel.smfcore.common.exception.ApiException;
import com.neotel.smfcore.common.exception.ValidateException;
import com.neotel.smfcore.common.utils.HttpHelper;
import com.neotel.smfcore.common.utils.JsonUtil;
import com.neotel.smfcore.common.utils.SecurityUtils;
import com.neotel.smfcore.common.utils.StringUtils;
import com.neotel.smfcore.core.api.listener.BaseSmfApiListener;
import com.neotel.smfcore.core.api.listener.DefaultSmfApiListener;
import com.neotel.smfcore.core.barcode.service.manager.IBarcodeManager;
import com.neotel.smfcore.core.barcode.service.po.Barcode;
import com.neotel.smfcore.core.device.enums.OP;
import com.neotel.smfcore.core.device.enums.OP_STATUS;
import com.neotel.smfcore.core.device.util.DataCache;
import com.neotel.smfcore.core.order.LiteOrderCache;
import com.neotel.smfcore.core.order.service.po.LiteOrder;
import com.neotel.smfcore.core.storage.enums.DeviceType;
import com.neotel.smfcore.core.storage.service.po.Storage;
import com.neotel.smfcore.core.system.service.manager.IDataLogManager;
import com.neotel.smfcore.core.system.service.po.DataLog;
import com.neotel.smfcore.custom.lizhen.agvBox.bean.GrLabel;
import com.neotel.smfcore.custom.lizhen.innerBox.bean.PreWarningItem;
......@@ -27,6 +31,9 @@ import com.neotel.smfcore.custom.lizhen.innerBox.util.PreWarningItemCache;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
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.Component;
import org.springframework.stereotype.Service;
......@@ -45,6 +52,9 @@ public class LizhenApi extends DefaultSmfApiListener {
@Autowired
private DataCache dataCache;
@Autowired
private IDataLogManager dataLogManager;
@Value("${api.fetchGRUrl}")
private String fetchGRUrl;
......@@ -72,6 +82,15 @@ public class LizhenApi extends DefaultSmfApiListener {
@Value("${api.getInDateUrl}")
private String getInDateUrl = "";
@Value("${api.save2DReelInfoUrl}")
private String save2DReelInfoUrl = "";
@Value("${api.commonGIRecordUrl}")
private String commonGIRecordUrl = "";
@Value("${api.commonRMRecordUrl}")
private String commonRMRecordUrl = "";
@PostConstruct
public void init(){
fetchGRUrl = dataCache.getConfigCache("fetchGRUrl",fetchGRUrl);
......@@ -298,10 +317,19 @@ public class LizhenApi extends DefaultSmfApiListener {
*/
@Override
public void inTaskStatusChange(String inNotifyUrl, DataLog task) {
if (!task.isFinished()){
return;
if (task.isFinished()){
//DataLog oldTask = dataLogManager.findOne(new Query(Criteria.where("barcode").is(task.getBarcode()).and("type").is(OP.CHECKOUT)
// .and("status").is(OP_STATUS.FINISHED.name()).and("createDate").lte(new Date())).with(Sort.by(Sort.Direction.DESC, "createDate")));
//if (oldTask == null) {
// log.info(task.getBarcode()+"为新料,调用save2ReelInfo接口");
reelInToTower(task);
// } else {
// log.info(task.getBarcode()+"为旧料,调用RMRecord接口");
reelReturnTower(task);
// }
}
Map<String, Object> dataMap = new HashMap<>();
/*Map<String, Object> dataMap = new HashMap<>();
dataMap.put("pickingid", "");
dataMap.put("wo", "");
dataMap.put("reelno", task.getBarcode());
......@@ -326,7 +354,7 @@ public class LizhenApi extends DefaultSmfApiListener {
} catch (ApiException e) {
e.printStackTrace();
log.info(barcode.getBarcode()+"保存物料异常:"+e.getMessage());
}
}*/
}
/**
......@@ -338,7 +366,11 @@ public class LizhenApi extends DefaultSmfApiListener {
@Override
public void outTaskStatusChange(String outNotifyUrl, DataLog task) {
if (task.getBarcode().startsWith("CS")
if (task.isFinished()) {
reelOutFromTower(task);
}
/* if (task.getBarcode().startsWith("CS")
|| task.getBarcode().startsWith("CM")
|| task.getBarcode().startsWith("CB")) {
return;
......@@ -391,7 +423,7 @@ public class LizhenApi extends DefaultSmfApiListener {
e.printStackTrace();
log.info(task.getBarcode() + "保存物料异常:" + e.getMessage());
}
}
}*/
}
......@@ -632,6 +664,110 @@ public class LizhenApi extends DefaultSmfApiListener {
}
}
private void reelInToTower(DataLog task) {
Map<String, Object> dataMap = new HashMap<>();
dataMap.put("pickingid", "");
dataMap.put("wo", "");
dataMap.put("reelno", task.getBarcode());
dataMap.put("ipn", task.getPartNumber());
Barcode barcode = barcodeManager.findByBarcode(task.getBarcode());
if (barcode != null) {
dataMap.put("qty", barcode.getAmount());
dataMap.put("datecode", barcode.getDateCode());
dataMap.put("lot", barcode.getBatch());
dataMap.put("vendor", barcode.getProvider());
dataMap.put("batch", "");
dataMap.put("vendorcode", barcode.getProviderNumber());
}
dataMap.put("werks", "W339");
dataMap.put("reelid", "");
String param = JsonUtil.toJsonStr(Arrays.asList(dataMap));
log.info(barcode.getBarcode()+"保存物料入参为:" + param+"地址为:"+ save2DReelInfoUrl);
try {
String result = HttpHelper.postJson(save2DReelInfoUrl, Arrays.asList(dataMap));
log.info(barcode.getBarcode()+"保存物料出参为:" + result);
} catch (ApiException e) {
e.printStackTrace();
log.info(barcode.getBarcode() + "保存物料异常:" + e.getMessage());
}
}
private void reelReturnTower(DataLog oldTask) {
Map<String, Object> dataMap = new HashMap<>();
dataMap.put("line", oldTask.getLine());
dataMap.put("reel_id", oldTask.getBarcode());
//dataMap.put("rm_type", 2);
//Storage storage = dataCache.getStorageById(oldTask.getStorageId());
//if (storage.isVirtual()) {
dataMap.put("rm_type", 2);
//}
dataMap.put("ipn",oldTask.getPartNumber());
dataMap.put("qty",oldTask.getNum());
dataMap.put("vendor_name",oldTask.getProvider());
dataMap.put("date_code",oldTask.getDateCode());
dataMap.put("lot",oldTask.getBatchId());
dataMap.put("create_empno", StringUtils.isEmpty(SecurityUtils.getLoginUsername()) ? "虚拟仓" : SecurityUtils.getLoginUsername());
Date date = new Date();
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
format.setTimeZone(TimeZone.getTimeZone("UTC")); // 设置为UTC时间
String nowDateStr = format.format(date);
dataMap.put("create_time", nowDateStr);
String param = JsonUtil.toJsonStr(Arrays.asList(dataMap) + "地址为:" + commonRMRecordUrl);
log.info(oldTask.getBarcode() + "调用退料接口:" + param);
try {
String result = HttpHelper.postJson(commonRMRecordUrl, Arrays.asList(dataMap));
log.info(oldTask.getBarcode() + "退料出参为:" + result);
} catch (ApiException e) {
e.printStackTrace();
log.info(oldTask.getBarcode() + "退料异常:" + e.getMessage());
}
}
private void reelOutFromTower(DataLog task) {
List<Map<String, Object>> paramList = new ArrayList<>();
Storage storage = null;
for (Storage stor : dataCache.getAllStorage().values()) {
if (stor.isVirtual()){
storage = stor;
break;
}
}
Map<String, Object> paramMap = new HashMap<>();
paramMap.put("line",task.getLine());
paramMap.put("mc_id",storage.getName());
paramMap.put("reel_id",task.getBarcode());
paramMap.put("ipn",task.getPartNumber());
paramMap.put("qty",task.getNum());
//发料类型(0:智能仓1:虚拟仓2:物料预警3:手动发料)
int type = 0;
if (StringUtils.isNotEmpty(task.getSourceId())) {
type = 2;
} else {
if (storage.isVirtual()) {
type = 1;
} else {
type = 3;
}
}
paramMap.put("gi_type",type);
paramMap.put("create_empno",StringUtils.isEmpty(task.getCreator()) ? "System" : task.getCreator());
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
paramMap.put("create_time",sdf.format(task.getCreateDate()));
paramList.add(paramMap);
log.info("出库通知入参为:" + JSON.toJSONString(paramList)+"地址为:"+commonGIRecordUrl);
try {
String result = HttpHelper.postJson(commonGIRecordUrl, paramList);
log.info(task.getBarcode() + "出入库通知返回结果为:" + result);
} catch (ApiException e) {
e.printStackTrace();
log.error(task.getBarcode() + "出入库通知异常:" + e.getMessage());
}
}
@Override
public boolean isForThisApi(String apiName) {
......
package com.neotel.smfcore.custom.lizhen.innerBox.bean;
import lombok.Data;
@Data
public class DifferentMaterial {
/**
* wo;//工单
* mc;//机台
* ipn;//物料
* zone;//站位
* gidLineSide;//线_Line_面
*/
private String mo;
private String mc;
private String ipn;
private String zone;
private String gidLineSide;
/*
[
{
"wo": "030000248583",
"mc": "NPM-2",
"ipn": "377S00070",
"zone": "1-07-L",
"gidLineSide": "A05-5FRF-01_1A_B"
},
{
"wo": "030000248583",
"mc": "NPM-2",
"ipn": "117S00069$YA0A01B5",
"zone": "1-08-L",
"gidLineSide": "A05-5FRF-01_1A_B"
},
{
"wo": "030000248583",
"mc": "NPM-2",
"ipn": "N/A",
"zone": "1-10",
"gidLineSide": "A05-5FRF-01_1B_T"
}
]
*/
}
package com.neotel.smfcore.custom.lizhen.innerBox.rest;
import com.alibaba.fastjson.JSONObject;
import com.neotel.smfcore.common.utils.StringUtils;
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.DifferentMaterial;
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.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
@Slf4j
@RestController
public class DifferenceReelController {
@Autowired
private ILiteOrderManager liteOrderManager;
@Autowired
private LiteOrderCache liteOrderCache;
@ApiOperation("工单差异料上传")
@RequestMapping("/api/Mes/differenceReel")
@AnonymousAccess
public synchronized String differenceReel(@RequestBody List<DifferentMaterial> differentMaterialList) {
log.info("收到mes的差异料数据为:" + JSONObject.toJSONString(differentMaterialList));
List<LiteOrderItem> itemList = new ArrayList<>();
for (DifferentMaterial differentMaterial : differentMaterialList) {
String mo = differentMaterial.getMo();
String mc = differentMaterial.getMc();
String ipn = differentMaterial.getIpn();
if (StringUtils.isEmpty(ipn)){
continue;
}
String zone = differentMaterial.getZone();
String gidLineSide = differentMaterial.getGidLineSide();
String[] gidLineSideS = gidLineSide.split("_");
if (gidLineSideS.length < 3){
return gidLineSide+"格式不正确";
}
String line = gidLineSideS[0];
String side = gidLineSideS[2];
LiteOrderItem item = new LiteOrderItem();
item.setMo(mo);
item.setMachineName(mc);
item.setPn(ipn);
item.setStation(zone);
item.setTableNo(zone);
item.setLine(line);
item.setSide(side);
item.setNeedNum(1);
item.setNeedReelCount(1);
itemList.add(item);
}
if (itemList != null && !itemList.isEmpty()){
Map<String, List<LiteOrderItem>> itemMap = itemList.stream().collect(Collectors.groupingBy(LiteOrderItem::getLine));
for (String line : itemMap.keySet()) {
List<LiteOrderItem> item = itemMap.get(line);
LiteOrder liteOrder = new LiteOrder();
liteOrder.setOrderNo(System.currentTimeMillis()+"差异料");
liteOrder.setLine(line);
liteOrder.setTotalTaskReelCount(item.size());
liteOrder.setOrderItems(item);
liteOrder.setDifferenceReq(true);
liteOrder = liteOrderManager.createWithItems(liteOrder);
liteOrderCache.addOrderToMap(liteOrder);
}
}
return "";
}
}
......@@ -574,7 +574,7 @@ public class InnerBoxRestController {
//判断料号是否一致
String partNumber = codeBean.getBarcode().getPartNumber();
if (!orderItem.getPn().equals(partNumber)) {
if (!orderItem.getPn().contains(partNumber)) {
return ResultBean.newErrorResult(-1, "", "请核实手动补料的料号:" + partNumber + "与工单需求料号:" + orderItem.getPn() + "是否一致");
}
......@@ -603,6 +603,7 @@ public class InnerBoxRestController {
dataLog.setNum(barcode.getAmount());
dataLog.setType(OP.CHECKOUT);
dataLog.setExtendType(ExtendType.MANUAL_FEEDING); //手动喂料
dataLog.setLine(liteOrder.getLine());
//dataLog.setPosName("人工");
//判断虚拟仓有没有,如果有,则删除库位
......@@ -679,7 +680,7 @@ public class InnerBoxRestController {
}
boolean hasItem = false;
for (LiteOrderItem orderItem : order.getOrderItems()) {
if (barcode.getPartNumber().equals(orderItem.getPn())) {
if (orderItem.getPn().contains(barcode.getPartNumber())) {
//判断供应商是否相同
if (StringUtils.isNotBlank(orderItem.getBrand())) {
if (!barcode.getProvider().equals(orderItem.getBrand())) {
......@@ -703,9 +704,13 @@ public class InnerBoxRestController {
dataLog.setSubSourceId(orderItem.getId());
dataLog.setPartNumber(barcode.getPartNumber());
dataLog.setProviderNumber(barcode.getProviderNumber());
dataLog.setProvider(barcode.getProvider());
dataLog.setDateCode(barcode.getDateCode());
dataLog.setNum(barcode.getAmount());
dataLog.setBatchInfo(barcode.getBatch());
dataLog.setType(OP.CHECKOUT);
dataLog.setExtendType(ExtendType.MANUAL_FEEDING); //手动喂料
dataLog.setLine(order.getLine());
//dataLog.setPosName("人工");
//判断虚拟仓有没有,如果有,则删除库位
......@@ -898,7 +903,7 @@ public class InnerBoxRestController {
}
}
//resultMap.put("barcode", dataLog.getBarcode());
resultMap.put("pn", liteOrderItem.getPn());
resultMap.put("pn", liteOrderItem.getOutPn());
resultMap.put("station", liteOrderItem.getTableNo());
resultMap.put("side", liteOrderItem.getSide());
resultMap.put("hSerial", liteOrder.getOrderNo());
......
......@@ -90,7 +90,7 @@ public class VirtualRestController {
@ApiOperation("虚拟入库")
@RequestMapping("/virtual/putIn")
public synchronized ResultBean putIn(@RequestBody Map<String, String> paramMap) {
public ResultBean putIn(@RequestBody Map<String, String> paramMap) {
String posName = paramMap.get("posName");
String code = paramMap.get("code");
String newCode = code.toUpperCase();
......@@ -185,7 +185,7 @@ public class VirtualRestController {
@ApiOperation("执行过的工单信息")
@RequestMapping("/getNoFinishedOrder")
@RequestMapping("/virtual/getNoFinishedOrder")
@AnonymousAccess
private ResultBean getNoFinishedOrder() {
List<LiteOrderItem> results = new ArrayList<>();
......@@ -208,6 +208,12 @@ public class VirtualRestController {
@RequestMapping("/vitual/checkout")
private ResultBean checkout(@RequestBody Map<String,String> paramMap) {
String code = paramMap.get("code");
String line = paramMap.get("line");
if (StringUtils.isEmpty(line)){
return ResultBean.newErrorResult(-1, "", "线体不能为空");
}
String newCode = code.toUpperCase();
//开始解析code
CodeBean codeBean = codeResolve.resolveSingleCode("=1x1=" + newCode);
......@@ -231,6 +237,11 @@ public class VirtualRestController {
} else {
dataLog.setExtendType(ExtendType.STORAGE_CHECKOUT); //手动出库
}
dataLog.setLine(line);
dataLog.setDateCode(barcode.getDateCode());
dataLog.setProvider(barcode.getProvider());
dataLog.setProviderNumber(barcode.getProviderNumber());
dataLog.setBatchId(barcode.getBatch());
barcodeManager.delete(barcode);
taskService.updateFinishedTask(dataLog);
taskService.removeFinishedTask(dataLog);
......@@ -246,6 +257,11 @@ public class VirtualRestController {
dataLog.setProviderNumber(barcode.getProviderNumber());
dataLog.setNum(barcode.getAmount());
dataLog.setType(OP.CHECKOUT);
dataLog.setLine(line);
dataLog.setDateCode(barcode.getDateCode());
dataLog.setProvider(barcode.getProvider());
//dataLog.setProviderNumber(barcode.getProviderNumber());
dataLog.setBatchId(barcode.getBatch());
//dataLog.setPosName("人工");
dataLog.setExtendType(ExtendType.MANUAL_CHECKOUT); //手动出库
taskService.updateFinishedTask(dataLog);
......@@ -382,7 +398,7 @@ public class VirtualRestController {
}
} catch (Exception e) {
e.printStackTrace();
log.error("导入失败:" + e.getMessage());
log.error("导入失败:",e);
return ResultBean.newErrorResult(-1, "", "导入失败:" + e.getMessage());
}
return ResultBean.newOkResult(null);
......
......@@ -18,6 +18,7 @@ import org.springframework.data.mongodb.core.query.Query;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.stream.Collectors;
......@@ -76,6 +77,9 @@ public class PreWarningItemCache {
if (queueItemList == null || queueItemList.isEmpty()) {
return;
}
queueItemList = queueItemList.stream().sorted(Comparator.comparing(PreWarningItem :: getCreateDate)).collect(Collectors.toList());
for (PreWarningItem preWarningItem : queueItemList) {
String itemLine = preWarningItem.getLine();
if (Strings.isNotBlank(itemLine)) {
......@@ -142,6 +146,7 @@ public class PreWarningItemCache {
orderItem.setReel(item.getReel());
orderItem.setBrand(item.getBrand());
orderItems.add(orderItem);
log.info("生成的工单号为:"+liteOrder.getOrderNo()+",对应的id为:"+orderItem.getWarningItemId());
}
}
if (orderItems != null && !orderItems.isEmpty()) {
......@@ -182,7 +187,7 @@ public class PreWarningItemCache {
for (int i = 0; i < items.size(); i++) {
PreWarningItem item = items.get(i);
Query q = new Query();
Criteria c = Criteria.where("pn").is(item.getPartnumber()).and("warningItemId").is(item.getItemId());
Criteria c = Criteria.where/*("pn").is(item.getPartnumber()).and*/("warningItemId").is(item.getItemId());
List<LiteOrderItem> orderItems = liteOrderItemManager.findByQuery(q.addCriteria(c));
if (orderItems != null && !orderItems.isEmpty()) {
newItems = newItems.stream().filter(t -> !t.getItemId().equals(item.getItemId())).collect(Collectors.toList());
......
......@@ -5,9 +5,9 @@ api:
name: Lizhen
inCheckUrl:
batchCheckUrl:
outNotifyUrl:
outNotifyUrl: 1
outNotifyUrlPK:
inNotifyUrl:
inNotifyUrl: 1
fetchOrderUrl:
barcodeInfoUrl:
fetchGRUrl:
......@@ -18,6 +18,12 @@ api:
plant:
werks:
outerFactory:
#入库
save2DReelInfoUrl: http://10.68.27.68:8002/SmtAutoWH/Save2DReelInfo
#发料
commonGIRecordUrl: http://10.68.27.69:8002/Sct/CommonGIRecord
#退料
commonRMRecordUrl: http://10.68.27.68:8002/Sct/CommonRMRecord
#缺料预警对应的地址
lizhen:
......@@ -84,5 +90,5 @@ app:
type: ""
menu:
show: imDetailsReport,feeding,virWarehous
show:
hide:
\ No newline at end of file
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!