Commit 6572d7a3 zshaohui

1.格力新增创建工单,查询工单/工单详情,修改建议出仓时间 接口

1 个父辈 e06f3c0e
......@@ -21,6 +21,7 @@ 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.service.po.LiteOrderItemOutDetail;
import com.neotel.smfcore.core.shelf.util.TaskShelfUtil;
import com.neotel.smfcore.core.storage.enums.CHECKOUT_TYPE;
import com.neotel.smfcore.core.storage.service.manager.IStoragePosManager;
......@@ -35,6 +36,7 @@ import org.springframework.stereotype.Service;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.stream.Collectors;
/**
* Created by sunke on 2021/7/12.
......@@ -142,6 +144,10 @@ public class LiteOrderCache {
if(order.isNew()||order.isTaskFinished()){
//判断是否到达时间
Date curr=new Date();
Date sDate = order.getSDate();
if (sDate == null){
sDate = order.getCreateDate();
}
if(order.getSDate().before(curr)){
//开始自动出库
String result= checkOutLiteOrder(order.getOrderNo(),false);
......@@ -151,7 +157,6 @@ public class LiteOrderCache {
}else{
log.info("自动执行工单 【"+order.getOrderNo()+"】 成功");
}
break;
}
}
......@@ -280,6 +285,20 @@ public class LiteOrderCache {
liteOrderItem.setOutReelCount(liteOrderItem.getOutReelCount() + 1);
liteOrderItem.setTotalOutNum(liteOrderItem.getTotalOutNum()+task.getNum());
liteOrderItem.setTotalOutReelCount(liteOrderItem.getTotalOutReelCount()+1);
//同时更新出库详情信息
List<LiteOrderItemOutDetail> outDetailList = liteOrderItem.getOutDetailList();
if (outDetailList == null){
outDetailList = new ArrayList<>();
}
LiteOrderItemOutDetail detail = new LiteOrderItemOutDetail();
detail.setBarcode(task.getBarcode());
detail.setNum(task.getNum());
detail.setCreateDate(task.getCreateDate());
detail.setUpdateDate(task.getUpdateDate());
outDetailList.add(detail);
liteOrderItem.setOutDetailList(outDetailList);
liteOrderItem = liteOrderItemManager.save(liteOrderItem);
// Barcode barcode = barcodeManager.findByBarcode(task.getBarcode());
// if (barcode != null) {
......
......@@ -8,6 +8,7 @@ import org.springframework.data.mongodb.core.mapping.Document;
import java.io.Serializable;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Data
......@@ -98,6 +99,11 @@ public class LiteOrderItem extends BasePo implements Serializable ,Comparable<Li
public Map<String,String> appendData = new HashMap<>();
/**
* 出库详情
*/
private List<LiteOrderItemOutDetail> outDetailList;
/**
* 出库是否满足要求,已出库数量大于需求数量
*/
public boolean isOutFinished(){
......
package com.neotel.smfcore.core.order.service.po;
import lombok.Data;
import java.util.Date;
@Data
public class LiteOrderItemOutDetail {
private String barcode;
private int num;
private Date createDate;
private Date updateDate;
}
package com.neotel.smfcore.custom.gree20242;
import com.alibaba.fastjson.JSON;
import com.neotel.smfcore.common.bean.ResultBean;
import com.neotel.smfcore.common.utils.DateUtil;
import com.neotel.smfcore.common.utils.StringUtils;
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.order.service.po.LiteOrderItemOutDetail;
import com.neotel.smfcore.core.storage.bean.InventoryItem;
import com.neotel.smfcore.custom.gree20242.bean.*;
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.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
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.Date;
import java.util.List;
import java.util.Map;
@Api(tags = "工单")
@Slf4j
@RestController
public class GreeOrderController {
@Autowired
private LiteOrderCache liteOrderCache;
@Autowired
private ILiteOrderManager liteOrderManager;
@Autowired
private DataCache dataCache;
@ApiOperation("S001需求单任务下发")
@RequestMapping("/rest/api/gree/outInfo")
@AnonymousAccess
public ResultBean outInfo(@RequestBody GreeOrder order) {
log.info("S001需求单任务下发,信息为:" + JSON.toJSONString(order));
String hSerial = order.getHSerial();
if (StringUtils.isEmpty(hSerial)) {
return ResultBean.newErrorResult(-1, "smfcore.valueCanotNull", "{0}不能为空", new String[]{"hSerial"});
}
String so = order.getSo();
if (StringUtils.isEmpty(so)) {
return ResultBean.newErrorResult(-1, "smfcore.valueCanotNull", "{0}不能为空", new String[]{"so"});
}
String line = order.getLine();
if (StringUtils.isEmpty(line)) {
return ResultBean.newErrorResult(-1, "smfcore.valueCanotNull", "{0}不能为空", new String[]{"line"});
}
Date stmeDate = null;
String stmeStr = order.getStme();
if (StringUtils.isNotEmpty(stmeStr)) {
stmeDate = DateUtil.toDate(stmeStr, "yyyy-MM-dd HH:mm:ss");
}
List<GreeOrderItem> outItemList = order.getOutItems();
if (outItemList == null || outItemList.isEmpty()) {
return ResultBean.newErrorResult(-1, "smfcore.valueCanotNull", "{0}不能为空", new String[]{"outItems"});
}
LiteOrder cacheLiteOrder = liteOrderCache.getLiteOrder(hSerial);
if (cacheLiteOrder != null) {
log.info(hSerial + "需求单已经存在");
return ResultBean.newErrorResult(-1, "smfcore.valueAlreadyExist", "{0}[{1}]已存在", new String[]{"hSerial", hSerial});
}
List<String> lackOfPnList = new ArrayList<>();
//开始构造工单数据
LiteOrder liteOrder = new LiteOrder();
liteOrder.setOrderNo(hSerial);
liteOrder.setSo(so);
liteOrder.setLine(line);
if (stmeDate == null) {
stmeDate = new Date();
}
liteOrder.setSdate(stmeDate);
List<LiteOrderItem> itemList = new ArrayList<>();
for (GreeOrderItem greeOrderItem : outItemList) {
LiteOrderItem item = new LiteOrderItem();
String partNum = greeOrderItem.getPartNum();
int qty = greeOrderItem.getQty();
item.setPn(partNum);
item.setNeedNum(qty);
itemList.add(item);
//判断是否缺料
Map<String, InventoryItem> inventoryItemMap = dataCache.getAllInventory(null, partNum);
InventoryItem inventoryItem = inventoryItemMap.get(partNum);
if (inventoryItem == null) {
lackOfPnList.add(partNum);
} else {
int stockCount = inventoryItem.getStockCount();
if (stockCount < qty) {
lackOfPnList.add(partNum);
}
}
}
liteOrder.setOrderItems(itemList);
liteOrder = liteOrderManager.createWithItems(liteOrder);
liteOrderCache.addOrderToMap(liteOrder);
return ResultBean.newOkResult(lackOfPnList);
}
@ApiOperation("S002获取需求单任务列表")
@RequestMapping("/rest/api/gree/outInfoList")
@AnonymousAccess
public ResultBean outInfoList(@RequestBody GreeOrderQuery query) {
log.info("S002获取需求单任务列表,信息为:" + JSON.toJSONString(query));
String dateTimeFrom = query.getDateTimeFrom();
String dateTimeTo = query.getDateTimeTo();
Date from = DateUtil.toDate(dateTimeFrom, "yyyy-MM-dd HH:mm:ss");
if (from == null) {
return ResultBean.newErrorResult(-1, "smfcore.valueInvalid", "[{0}]不是有效的参数", new String[]{"dateTimeFrom"});
}
Date to = DateUtil.toDate(dateTimeTo, "yyyy-MM-dd HH:mm:ss");
if (to == null) {
return ResultBean.newErrorResult(-1, "smfcore.valueInvalid", "[{0}]不是有效的参数", new String[]{"dateTimeTo"});
}
String line = query.getLine();
//设置查询条件
Criteria c = Criteria.where("createDate").gte(from).lt(to);
if (StringUtils.isNotEmpty(line)) {
c.and("line").is(line);
}
List<LiteOrder> orderList = liteOrderManager.findByQuery(new Query(c));
List<GreeOrderResult> resultList = new ArrayList<>();
if (orderList != null && !orderList.isEmpty()) {
for (LiteOrder liteOrder : orderList) {
GreeOrderResult result = new GreeOrderResult();
result.setHSerial(liteOrder.getOrderNo());
result.setLine(liteOrder.getLine());
result.setSo(liteOrder.getSo());
Date sDate = liteOrder.getSDate();
if (sDate == null) {
sDate = liteOrder.getCreateDate();
}
result.setStme(DateUtil.toDateString(sDate, "yyyy-MM-dd HH:mm:ss"));
String status = "NEW";
if (liteOrder.isClosed()) {
status = "CLOSE";
} else if (liteOrder.isTaskFinished()) {
status = "FINISHED";
} else if (liteOrder.isOutTails() || liteOrder.isOutOne() || liteOrder.isOutBom()) {
status = "EXECUTING";
}
result.setStatus(status);
resultList.add(result);
}
}
return ResultBean.newOkResult(resultList);
}
@ApiOperation("S003需求单任务详情")
@RequestMapping("/rest/api/gree/outInfoDetail")
@AnonymousAccess
public ResultBean outInfoDetail(@RequestBody GreeOrderDetailQuery detailQuery) {
log.info("S003需求单任务详情,信息为:" + JSON.toJSONString(detailQuery));
String hSerial = detailQuery.getHSerial();
if (StringUtils.isEmpty(hSerial)) {
return ResultBean.newErrorResult(-1, "smfcore.valueCanotNull", "{0}不能为空", new String[]{"hSerial"});
}
LiteOrder order = liteOrderCache.getLiteOrder(hSerial);
if (order == null) {
return ResultBean.newErrorResult(-1, "smfcore.valueNotExist", "{0}[{1}]不存在", new String[]{"hSerial", hSerial});
}
GreeOrderDetailResult detailResult = new GreeOrderDetailResult();
detailResult.setHSerial(order.getOrderNo());
detailResult.setLine(order.getLine());
detailResult.setSo(order.getSo());
Date sDate = order.getSDate();
if (sDate == null) {
sDate = order.getCreateDate();
}
detailResult.setStme(DateUtil.toDateString(sDate, "yyyy-MM-dd HH:mm:ss"));
String status = "NEW";
if (order.isClosed()) {
status = "CLOSE";
} else if (order.isTaskFinished()) {
status = "FINISHED";
} else if (order.isOutTails() || order.isOutOne() || order.isOutBom()) {
status = "EXECUTING";
}
detailResult.setStatus(status);
//设置
List<GreeOrderDetailResultItem> resultItemList = new ArrayList<>();
List<LiteOrderItem> orderItems = order.getOrderItems();
for (LiteOrderItem orderItem : orderItems) {
GreeOrderDetailResultItem resultItem = new GreeOrderDetailResultItem();
resultItem.setPartNum(orderItem.getPn());
resultItem.setNeedQty(orderItem.getNeedNum());
resultItem.setOutQty(orderItem.getTotalOutNum());
List<GreeOrderDetailResultItemDetail> detailList = new ArrayList<>();
List<LiteOrderItemOutDetail> outDetailList = orderItem.getOutDetailList();
if (outDetailList != null && !outDetailList.isEmpty()) {
for (LiteOrderItemOutDetail detail : outDetailList) {
GreeOrderDetailResultItemDetail resultItemDetail = new GreeOrderDetailResultItemDetail();
resultItemDetail.setBarcode(detail.getBarcode());
resultItemDetail.setQty(detail.getNum());
resultItemDetail.setStartDate(DateUtil.toDateString(detail.getCreateDate(), "yyyy-MM-dd HH:mm:ss"));
resultItemDetail.setEndDate(DateUtil.toDateString(detail.getUpdateDate(), "yyyy-MM-dd HH:mm:ss"));
detailList.add(resultItemDetail);
}
}
resultItem.setDetailList(detailList);
resultItemList.add(resultItem);
}
detailResult.setOutItems(resultItemList);
return ResultBean.newOkResult(detailResult);
}
@ApiOperation("S004更改需求单任务建议出仓时间")
@RequestMapping("/rest/api/gree/updateStme")
@AnonymousAccess
public ResultBean updateStme(@RequestBody GreeOrderUpdateStme updateStme) {
log.info("S004更改需求单任务建议出仓时间,信息为:" + JSON.toJSONString(updateStme));
String hSerial = updateStme.getHSerial();
String stme = updateStme.getStme();
if (StringUtils.isEmpty(hSerial)) {
return ResultBean.newErrorResult(-1, "smfcore.valueCanotNull", "{0}不能为空", new String[]{"hSerial"});
}
if (StringUtils.isEmpty(stme)) {
return ResultBean.newErrorResult(-1, "smfcore.valueCanotNull", "{0}不能为空", new String[]{"stme"});
}
Date stmeDate = DateUtil.toDate(stme, "yyyy-MM-dd HH:mm:ss");
if (stmeDate == null) {
return ResultBean.newErrorResult(-1, "smfcore.valueInvalid", "[{0}]不是有效的参数", new String[]{stme});
}
LiteOrder order = liteOrderCache.getLiteOrder(hSerial);
if (order == null) {
return ResultBean.newErrorResult(-1, "smfcore.valueNotExist", "{0}[{1}]不存在", new String[]{"hSerial", hSerial});
}
if (order.isClosed()) {
return ResultBean.newErrorResult(-1, "smfcore.greeOrder.hasClose", "[{0}]已关闭", new String[]{hSerial});
}
if (order.isOutTails() || order.isOutOne() || order.isOutBom()) {
return ResultBean.newErrorResult(-1, "smfcore.greeOrder.executing", "[{0}]正在执行", new String[]{hSerial});
}
order.setSdate(stmeDate);
liteOrderManager.save(order);
liteOrderCache.addOrderToMap(order);
return ResultBean.newOkResult("");
}
}
......@@ -47,7 +47,7 @@ public class GreeMsgHandlerImpl implements MessageHandler {
private KafkaMsgUtil msgUtil;
// private MqttGateway mqttGateway;
@KafkaListener(topics = {"Topic_task_dzlc"}, groupId = "${spring.kafka.consumer.group-id}")
//@KafkaListener(topics = {"Topic_task_dzlc"}, groupId = "${spring.kafka.consumer.group-id}")
public void kafkaListener(ConsumerRecord<?, ?> record) {
try {
log.info("---------------kafkaListener 收到消息-----------------");
......
package com.neotel.smfcore.custom.gree20242.bean;
import lombok.Data;
import java.util.List;
@Data
public class GreeOrder {
private String hSerial;
private String line;
private String so;
private String stme;
private List<GreeOrderItem> outItems;
}
package com.neotel.smfcore.custom.gree20242.bean;
import lombok.Data;
@Data
public class GreeOrderDetailQuery {
private String hSerial;
}
package com.neotel.smfcore.custom.gree20242.bean;
import lombok.Data;
import java.util.List;
@Data
public class GreeOrderDetailResult {
private String hSerial;
private String line;
private String so;
private String stme;
private String status;
private List<GreeOrderDetailResultItem> outItems;
}
package com.neotel.smfcore.custom.gree20242.bean;
import lombok.Data;
import java.util.List;
@Data
public class GreeOrderDetailResultItem {
private String partNum; // 零件编号
private int needQty; // 需求数量
private int outQty; // 出库数量
private List<GreeOrderDetailResultItemDetail> detailList; // 明细列表
}
package com.neotel.smfcore.custom.gree20242.bean;
import lombok.Data;
@Data
public class GreeOrderDetailResultItemDetail {
private String barcode;
private int qty;
private String startDate;
private String endDate;
}
package com.neotel.smfcore.custom.gree20242.bean;
import lombok.Data;
@Data
public class GreeOrderItem {
private String partNum;
private int qty;
}
package com.neotel.smfcore.custom.gree20242.bean;
import lombok.Data;
@Data
public class GreeOrderQuery {
private String dateTimeFrom;
private String dateTimeTo;
private String line;
}
package com.neotel.smfcore.custom.gree20242.bean;
import lombok.Data;
@Data
public class GreeOrderResult {
private String hSerial;
private String line;
private String so;
private String stme;
private String status; // 如果 status 是枚举类型,可以替换为 enum
}
package com.neotel.smfcore.custom.gree20242.bean;
import lombok.Data;
@Data
public class GreeOrderUpdateStme {
private String hSerial;
private String stme;
}
......@@ -353,6 +353,9 @@ smfcore.mesApi.loginCheck.error=MES\u767B\u9646\u9A8C\u8BC1\u9519\u8BEF\uFF1A{0}
smfcore.taskShelf.notExist=\u672A\u627E\u5230\u5DE5\u5355[{0}]\u7684rfid[{1}]
smfcore.agvShelf.noLoc=\u672A\u627E\u5230\u6599\u67B6{0}\u76EE\u6807\u4F4D\u7F6E
smfcore.codeLight=\u626B\u7801\u4EAE\u706F
smfcore.valueInvalid=[{0}]\u4E0D\u662F\u6709\u6548\u7684\u53C2\u6570
smfcore.greeOrder.hasClose=[{0}]\u5DF2\u5173\u95ED
smfcore.greeOrder.executing=[{0}]\u6B63\u5728\u6267\u884C
#smfclient.nlp.onlyOneTray=\u4E0D\u53EF\u540C\u65F6\u653E\u5165\u591A\u76D8\u7269\u6599:{0}
#smfclient.nlp.cannotFindPos={0}\u672A\u627E\u5230\u5E93\u4F4D:{1}
#smfclient.nlp.inputOk={0}\u5165\u5E93\u5230{1}\u6210\u529F
......
......@@ -350,4 +350,7 @@ smfcore.mesApi.inCheck.error=MES verification error\uFF1A{0}
smfcore.mesApi.loginCheck.fail=MES Login fail
smfcore.mesApi.loginCheck.error=MES Login error\uFF1A{0}
smfcore.agvShelf.noLoc=Shelf {0} target location not found
smfcore.codeLight=CODE LIGHT
\ No newline at end of file
smfcore.codeLight=CODE LIGHT
smfcore.valueInvalid=[{0}] is not a valid parameter
smfcore.greeOrder.hasClose=[{0}] has been closed
smfcore.greeOrder.executing=[{0}] is being executed
\ No newline at end of file
......@@ -347,4 +347,7 @@ smfcore.mesApi.inCheck.error=MES\u9A8C\u8BC1\u51FA\u9519\uFF1A{0}
smfcore.mesApi.loginCheck.fail=MES\u767B\u9646\u9A8C\u8BC1\u5931\u8D25
smfcore.mesApi.loginCheck.error=MES\u767B\u9646\u9A8C\u8BC1\u9519\u8BEF\uFF1A{0}
smfcore.agvShelf.noLoc=\u672A\u627E\u5230\u6599\u67B6{0}\u76EE\u6807\u4F4D\u7F6E
smfcore.codeLight=\u626B\u7801\u4EAE\u706F
\ No newline at end of file
smfcore.codeLight=\u626B\u7801\u4EAE\u706F
smfcore.valueInvalid=[{0}]\u306F\u6709\u52B9\u306A\u30D1\u30E9\u30E1\u30FC\u30BF\u3067\u306F\u3042\u308A\u307E\u305B\u3093
smfcore.greeOrder.hasClose=[{0}]\u306F\u9589\u3058\u3089\u308C\u307E\u3057\u305F
smfcore.greeOrder.executing=[{0}]\u3092\u5B9F\u884C\u4E2D\u3067\u3059
\ No newline at end of file
......@@ -347,4 +347,7 @@ smfcore.mesApi.inCheck.error=MES\u9A8C\u8BC1\u51FA\u9519\uFF1A{0}
smfcore.mesApi.loginCheck.fail=MES\u767B\u9646\u9A8C\u8BC1\u5931\u8D25
smfcore.mesApi.loginCheck.error=MES\u767B\u9646\u9A8C\u8BC1\u9519\u8BEF\uFF1A{0}
smfcore.agvShelf.noLoc=\u672A\u627E\u5230\u6599\u67B6{0}\u76EE\u6807\u4F4D\u7F6E
smfcore.codeLight=\u626B\u7801\u4EAE\u706F
\ No newline at end of file
smfcore.codeLight=\u626B\u7801\u4EAE\u706F
smfcore.valueInvalid=[{0}]\u4E0D\u662F\u6709\u6548\u7684\u53C2\u6570
smfcore.greeOrder.hasClose=[{0}]\u5DF2\u5173\u95ED
smfcore.greeOrder.executing=[{0}]\u6B63\u5728\u6267\u884C
\ No newline at end of file
......@@ -348,4 +348,7 @@ smfcore.mesApi.inCheck.error=MES\u9A57\u8B49\u51FA\u932F\uFF1A{0}
smfcore.mesApi.loginCheck.fail=MES\u767B\u9678\u9A57\u8B49\u5931\u6557
smfcore.mesApi.loginCheck.error=MES\u767B\u9678\u9A57\u8B49\u932F\u8AA4\uFF1A{0}
smfcore.agvShelf.noLoc=\u672A\u627E\u5230\u6599\u67B6{0}\u76EE\u6A19\u4F4D\u7F6E
smfcore.codeLight=\u6383\u78BC\u4EAE\u71C8
\ No newline at end of file
smfcore.codeLight=\u6383\u78BC\u4EAE\u71C8
smfcore.valueInvalid=[{0}]\u4E0D\u662F\u6709\u6548\u7684\u53C3\u6578
smfcore.greeOrder.hasClose=[{0}]\u5DF2\u95DC\u9589
smfcore.greeOrder.executing=[{0}]\u6B63\u5728\u57F7\u884C
\ No newline at end of file
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!