Commit e8f815ad LN

工单合单,工单欠料发料,欠料合单功能

1 个父辈 e71444db
......@@ -465,7 +465,7 @@ public class LiteOrderCache implements ITaskListener {
}
}
//判断库存 使用最小库存盘数:当前盘数<=最小库存盘数时,需要截料
if(reelNum<=component.getMinStoreNum()){
if(component.getMinStoreNum()>0&& reelNum<=component.getMinStoreNum()){
needJieliao=true;
}
//判断库存数量是否小于需求数量,小于直接返回缺料
......@@ -521,21 +521,23 @@ public class LiteOrderCache implements ITaskListener {
//截料料规则
if (isGuizhong || needJieliao) {
if (pos.getBarcode().getAmount() >= targetNum) {
int jieliaoNum=targetNum;
//一盘刚好满足
targetNum -= pos.getBarcode().getAmount();
itemPosList.add(pos);
itemPosNameList.add(pos.getPosName());
if (targetNum < 0) {
jieliaoPosMap.put(pos.getPosName(), targetNum);
jieliaoPosMap.put(pos.getPosName(), jieliaoNum);
}
break;
} else if (isLast) {
int jieliaoNum=targetNum;
//一盘料不足,直接加入
itemPosList.add(pos);
itemPosNameList.add(pos.getPosName());
targetNum -= pos.getBarcode().getAmount();
if (targetNum < 0) {
jieliaoPosMap.put(pos.getPosName(), targetNum);
jieliaoPosMap.put(pos.getPosName(), jieliaoNum);
}
break;
}
......@@ -648,6 +650,7 @@ public class LiteOrderCache implements ITaskListener {
task.setLightColor(ORDER_COLOR.SKYBLUE.getRgb());//普通工单 颜色:SKYBLUE
}
if(addOutbound){
task.setInOperate(true);
task.setAddOutbound(true);
task.setLightColor(ORDER_COLOR.PINK.getRgb());//补料出库 颜色:PINK
}
......
......@@ -16,12 +16,24 @@ public class LITEORDER_STATUS {
/**工单已关闭*/
public static int CLOSED=3;
/**出库完成单缺料*/
public static int EXECUTING_END=4;
/**缺料出库、欠料出库中*/
public static int ADDOUTBOUND=5;
/**
* 工单状态
* 0=新建的工单
* 1=工单缺料
* 2=工单正在出库中
* 3=工单已关闭
* 4=出库完成
* 5=欠料出库中
*/
/**
* 工单状态
......
......@@ -241,8 +241,16 @@ public class OrderController {
@ApiOperation("工单出库")
@PostMapping(value = "/out")
@PreAuthorize("@el.check('workOrder')")
public ResultBean checkOut(@RequestBody Map<String, String> mapValues) {
String orderNo = mapValues.get("orderNo");
public ResultBean checkOut(@RequestBody Map<String, Object> mapValues) {
String orderNo = mapValues.get("orderNo").toString();
boolean isShortageOut=false;
if(mapValues.containsKey("shortageOut")) {
String shortageOut = mapValues.get("shortageOut").toString();
if (ObjectUtil.isNotEmpty(shortageOut) && shortageOut.toString().equals("true")) {
isShortageOut = true;
}
}
if (orderNo == null) {
throw new ValidateException("smfcore.valueCanotNull", "{0}不能为空", new String[]{"orderNo"});
}
......@@ -250,10 +258,14 @@ public class OrderController {
if (liteOrder == null) {
throw new ValidateException("smfcore.valueNotFind", "未找到{0}[{1}]", new String[]{"orderNo", orderNo});
}
String result = liteOrderCache.checkOutLiteOrder(SecurityUtils.getCurrentUsername(), liteOrder.getOrderNo());
String result = liteOrderCache.checkOutLiteOrder(SecurityUtils.getCurrentUsername(), liteOrder.getOrderNo(),isShortageOut,false);
if (ObjectUtil.isEmpty(result)) {
return ResultBean.newOkResult(result);
} else {
}
else if(result.equals("smfcore.order.out.short")){
return ResultBean.newErrorResult(99, result, result);
}
else {
return ResultBean.newErrorResult(-1, result, result);
}
}
......@@ -501,13 +513,17 @@ public class OrderController {
for (DataLog datalog :
allTasks) {
if(datalog.isAddOutbound()){
continue;
}
//是否需要判断任务是否已结束
if (onlyNotEndTask) {
if (datalog.isEnd() || datalog.isFinished() || datalog.isCancel()) {
continue;
}
}
if (datalog.isCheckOutTask() && datalog.getSourceId().equals(liteOrder.getId())) {
if (datalog.isOrderTask() && datalog.getSourceId().equals(liteOrder.getId())) {
//判断是否再自己的权限范围内
if (myStorageIds.contains(datalog.getStorageId())) {
returnTasks.add(datalog);
......
......@@ -125,7 +125,7 @@ public class OrderSheetController {
}
Query query = QueryHelp.getQuery(criteria);
//查询所有出库中或关闭的
query.addCriteria(Criteria.where("status").in(new Integer[]{LITEORDER_STATUS.EXECUTING, LITEORDER_STATUS.CLOSED}));
query.addCriteria(Criteria.where("status").in(new Integer[]{LITEORDER_STATUS.EXECUTING, LITEORDER_STATUS.CLOSED,LITEORDER_STATUS.EXECUTING_END,LITEORDER_STATUS.ADDOUTBOUND}));
query.addCriteria(Criteria.where("sheetEnd").ne(true));
PageData<LiteOrder> orderList = liteOrderManager.findByPage(query, pageable);
......@@ -142,7 +142,7 @@ public class OrderSheetController {
if (barcodeInfo == null) {
throw new ValidateException("smfcore.valueCanotNull", "{0}不能为空", new String[]{"条码"});
}
DataLog dataLog=dataLogManager.findLastOutTask(barcodeInfo.getBarcode());
DataLog dataLog=dataLogManager.findLastOutTask(barcodeInfo.getBarcode(),false);
if (dataLog == null) {
throw new ValidateException("smfcore.orderSheet.barcode", "未找到料盘{0}的工单信息",new String[]{barcodeInfo.getBarcode()} );
......@@ -162,6 +162,7 @@ public class OrderSheetController {
}else if(dataLog.isFirstReel()){
type=1;
}
String position=liteOrder.getPosition(type);
boolean isSave=false;
if(liteOrder.getCurrBoxNum()==null){
liteOrder.setCurrBoxNum(1);
......@@ -171,12 +172,12 @@ public class OrderSheetController {
isSave=true;
}
if(isSave){
log.info("工单合单:料盘条码["+barcodeInfo.getBarcode()+"],工单号["+liteOrder.getOrderNo()+"],箱子数+1,当前箱子数:"+liteOrder.getCurrBoxNum()+"/"+liteOrder.getBoxNum());
log.info("工单合单:料盘条码["+barcodeInfo.getBarcode()+"],类型["+type+"],位置["+position+"],工单号["+liteOrder.getOrderNo()+"],箱子数+1,当前箱子数:"+liteOrder.getCurrBoxNum()+"/"+liteOrder.getBoxNum());
liteOrderManager.save(liteOrder);
liteOrderCache.addOrderToMap(liteOrder);
}
OrderRIPostDto dto=new OrderRIPostDto(barcodeInfo.getBarcode(),liteOrder.getOrderNo(),type,liteOrder.getBoxNum(),liteOrder.getCurrBoxNum(),liteOrder.getPosition(type));
OrderRIPostDto dto=new OrderRIPostDto(barcodeInfo.getBarcode(),liteOrder.getOrderNo(),type,liteOrder.getBoxNum(),liteOrder.getCurrBoxNum(),position);
return dto;
}
......
......@@ -7,6 +7,7 @@ import com.neotel.smfcore.core.order.bean.OrderPosInfo;
import com.neotel.smfcore.core.order.enums.LITEORDER_STATUS;
import com.neotel.smfcore.hikvision.bean.HikOrderInfo;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.springframework.data.annotation.Transient;
import org.springframework.data.mongodb.core.mapping.Document;
......@@ -17,6 +18,7 @@ import java.util.List;
@Data
@Document
@Slf4j
public class LiteOrder extends BasePo implements Serializable {
public LiteOrder() {
......@@ -190,10 +192,26 @@ public class LiteOrder extends BasePo implements Serializable {
/**
* 结束当前的任务
*/
public void finishedTasks(){
public void finishedTasks() {
if(isExecuting()){
setClosed(true);
//TODO 判断是否处于缺料状态,是的话修改状态
if (getShortageOut()) {
boolean allOk = true;
for (LiteOrderItem liteOrderItem : getOrderItems()) {
if (!liteOrderItem.isOutFinished()) {
allOk = false;
break;
}
}
if (!allOk) {
setStatus(LITEORDER_STATUS.EXECUTING_END);
log.info("工单[]出库完成,但是未达到目标出库量,改为 EXECUTING_END 状态");
}
} else {
if (isExecuting()) {
setClosed(true);
}
}
setTaskFinishedTime(System.currentTimeMillis());
}
......
......@@ -8,5 +8,5 @@ import java.util.List;
public interface IDataLogManager extends IBaseManager<DataLog> {
List<DataLog> findUnFinishedTasks();
DataLog findLastOutTask(String barcode);
DataLog findLastOutTask(String barcode,boolean addOutbound);
}
......@@ -66,11 +66,19 @@ public class DataLogManagerImpl implements IDataLogManager {
}
@Override
public DataLog findLastOutTask(String barcode) {
public DataLog findLastOutTask(String barcode,boolean addOutbound) {
Query query = new Query(Criteria.where("barcode").is(barcode));
query.addCriteria(Criteria.where("outType").is(10));
Sort sort = Sort.by(Sort.Direction.DESC, "createDate");
query.with(sort);
//判断是否是欠料出库
if(addOutbound){
query.addCriteria(Criteria.where("addOutbound").is(true));
}else {
query.addCriteria(Criteria.where("addOutbound").ne(true));
}
DataLog dataLog = dataLogDao.findOne(query);
return dataLog;
}
......
......@@ -244,6 +244,11 @@ public class DataLog extends BasePo implements Serializable {
private boolean inOperate=false;
/**
* 工单出库,是否是缺料出库后的欠料出库
*/
private boolean addOutbound =false;
/**
* MSD附加信息
*/
private MSDAppendInfo msdAppendInfo;
......@@ -324,6 +329,16 @@ public class DataLog extends BasePo implements Serializable {
public boolean isCheckOutTask(){
return OP.CHECKOUT == type;
}
/**
* 是否是工单出库任务
*/
public boolean isOrderTask(){
if(OP.CHECKOUT==type&&outType==10){
return true;
}
return false;
}
/**
* 超过5分钟的已完成,已取消的任务都不再
......
server:
port: 8800
hik:
server: http://cloudapi-tst.hikvision.com.cn/api/
server: http://cloudapi-uat.hikvision.com.cn/api/
baseCode: "8001"
lgort: "M9142"
addr_1_transferOrderApi:
......@@ -26,18 +26,55 @@ hik:
key_9_updateRepOrderApi: "065009225"
key_10_reservedOrderApi: "065009370"
key_11_orderEndApi: "065009098"
secret_1_transferOrderApi: 3RqMfgy5djpbfol4NMh6sd1TIRNZnHeEn86QdQW5hV2Z0PXA35zUSneX07d5HQEi
secret_2_transferOrderInApi: IBf9yJb3vWCAG60pDLncapoypGsBV6gbzpENZEnLxbEsxKgvtoYcOmDDcKlbcL02
secret_3_scheduleTaskApi: eR2RbW9zHVglHfDweBHPzDF2pYR0RpF1dUpHJKrVKLmYCyHErz2NjXvMsWNJoKgz
secret_4_returnMaterialApi: sRs9lFTsRYpTvORhSI32FhjEPhJDb6TzTvIxhPudrmo9jgwwCiKJWi8go1yN8988
secret_5_putInApi: gTLARhgpnbhSv7SNOvQtHoMxWapphmgRwO72vLsVj76CpGvdpImDsum0LVlrsymu
secret_6_checkOutApi: MDulYCOgEasYYJXOk2tLycnpYKS2HQK0vXcIvJNzPt79isaHJkyE24BcCzn3hTg4
secret_7_updateOrderApi: HvbUVz6vQJYIDfmWokk98rxSUHAoDlUWNSsPuVc0hB8JtIOzZLDQYARW9tmeU2Fy
secret_8_riCheckApi: eQPd3y8xDvwXKMetEbwp2LdzJe8tD0Dg48YA1H68SPsGeKSt2Yj3pOrKibguwzwe
secret_9_updateRepOrderApi: UU9jBeJBbfg47Wpy3z1dxEBmXHanjH1AFBzGmj9c8U7zuGgG5EJR0KSzTJ7yJE9a
secret_10_reservedOrderApi: JBtBxmAXk5Xg4LEGzxLnJQf8gvYx5jquwwfRKRE4hrwvbpVDJh4RnPWGq8Hgd9ep
secret_11_orderEndApi: W0KWumdsD4eMyTm3Qail9HxHTfqdvxAJW30hLKtiTpJeGO7wXwBe7aUO6n0eicf8
secret_1_transferOrderApi: XQP14qbvLkjvEIPcTqtzqtfUT0VNkwWloczU9y3GO2ACclm2WsiWbf44itzGecrl
secret_2_transferOrderInApi: p5mjSoX80QfgevObxN549jMW4tzawr6da1yTAYtetuoWVL1HTSxZIOJdOaCvF4Kp
secret_3_scheduleTaskApi: IftxhjIKEryxUQfjHcgYcwGck6TIlcpkJd6gwjGmznkPN1IQT4jnmy8jlWs8Fkqu
secret_4_returnMaterialApi: IbVCzQD4sWgaR6bie70iL0ZN9bjHWWuGNm5Ad4nDKGOpbGccLYCAdDo9mQUvIIDd
secret_5_putInApi: TZgeifaZl71gM7FVY6ga4hfH56KOhcJmbf642VY7nbn2iV6JZHsu3RzTmrYn5QDm
secret_6_checkOutApi: AaC3HweGbW7VgGl3LIk3yyhMY7xpCTmGbVVi6R9Q340TuHhTtLTXMRtIIBgOzLJO
secret_7_updateOrderApi: PvCE1fdJ3psFQnKmkHnTcOBs2vqFOKKB5MZKYu1TDhkCldGh48gpldQDXuFdDiYY
secret_8_riCheckApi: 2B0dEQCtf4FEJcvNUtcpoblq3gfuHJDWbawFt9R1irrUNKORhqUyAaU8OMbGvMMu
secret_9_updateRepOrderApi: dpkHeHgpv8wrxf7ciJlWmvyrvhAndOvqsOxingsbvN1EmlmOdnwr7QjcIjCUJWRM
secret_10_reservedOrderApi: wsmY125PTNqNaKxE9tG692P1dhaaKWyJ37bpvSq8H6bAltjEqE2ZdMT4OidB8U2v
secret_11_orderEndApi: SbdAtaYTbVjk51YmOHeblBkIrtpRo0e3Tuff5l9fHD4zHIKeOEVLF2TU6pj4pmju
#hik:
# server: http://cloudapi-tst.hikvision.com.cn/api/
# baseCode: "8001"
# lgort: "M9142"
# addr_1_transferOrderApi:
# addr_2_transferOrderInApi:
# addr_3_scheduleTaskApi:
# addr_4_returnMaterialApi:
# addr_5_putInApi:
# addr_6_checkOutApi:
# addr_7_updateOrderApi:
# addr_8_riCheckApi:
# addr_9_updateRepOrderApi:
# addr_10_reservedOrderApi:
# addr_11_orderEndApi:
# key_1_transferOrderApi: "065009142"
# key_2_transferOrderInApi: "065009152"
# key_3_scheduleTaskApi: "065009097"
# key_4_returnMaterialApi: "065009043"
# key_5_putInApi: "065009094"
# key_6_checkOutApi: "065009095"
# key_7_updateOrderApi: "065009096"
# key_8_riCheckApi: "065009099"
# key_9_updateRepOrderApi: "065009225"
# key_10_reservedOrderApi: "065009370"
# key_11_orderEndApi: "065009098"
# secret_1_transferOrderApi: 3RqMfgy5djpbfol4NMh6sd1TIRNZnHeEn86QdQW5hV2Z0PXA35zUSneX07d5HQEi
# secret_2_transferOrderInApi: IBf9yJb3vWCAG60pDLncapoypGsBV6gbzpENZEnLxbEsxKgvtoYcOmDDcKlbcL02
# secret_3_scheduleTaskApi: eR2RbW9zHVglHfDweBHPzDF2pYR0RpF1dUpHJKrVKLmYCyHErz2NjXvMsWNJoKgz
# secret_4_returnMaterialApi: sRs9lFTsRYpTvORhSI32FhjEPhJDb6TzTvIxhPudrmo9jgwwCiKJWi8go1yN8988
# secret_5_putInApi: gTLARhgpnbhSv7SNOvQtHoMxWapphmgRwO72vLsVj76CpGvdpImDsum0LVlrsymu
# secret_6_checkOutApi: MDulYCOgEasYYJXOk2tLycnpYKS2HQK0vXcIvJNzPt79isaHJkyE24BcCzn3hTg4
# secret_7_updateOrderApi: HvbUVz6vQJYIDfmWokk98rxSUHAoDlUWNSsPuVc0hB8JtIOzZLDQYARW9tmeU2Fy
# secret_8_riCheckApi: eQPd3y8xDvwXKMetEbwp2LdzJe8tD0Dg48YA1H68SPsGeKSt2Yj3pOrKibguwzwe
# secret_9_updateRepOrderApi: UU9jBeJBbfg47Wpy3z1dxEBmXHanjH1AFBzGmj9c8U7zuGgG5EJR0KSzTJ7yJE9a
# secret_10_reservedOrderApi: JBtBxmAXk5Xg4LEGzxLnJQf8gvYx5jquwwfRKRE4hrwvbpVDJh4RnPWGq8Hgd9ep
# secret_11_orderEndApi: W0KWumdsD4eMyTm3Qail9HxHTfqdvxAJW30hLKtiTpJeGO7wXwBe7aUO6n0eicf8
# 文件存储路径
file:
......
......@@ -13,7 +13,7 @@ smfcore.notActivated=\u8D26\u53F7\u672A\u6FC0\u6D3B
smfcore.userInfoError=\u7528\u6237\u4FE1\u606F\u4E0D\u5B8C\u6574
smfcore.noaccess=\u65E0\u6743\u9650\u4FEE\u6539\u6B64\u89D2\u8272\u7684\u83DC\u5355
smfcore.notSelRole=\u8BF7\u8981\u4FEE\u6539\u7684\u9009\u62E9\u89D2\u8272
smfcore.posIsused=\u6599\u4ED3[{0}]\u7684\u5E93\u4F4D[{1}}]\u6709\u6599[{2}],\u5220\u9664\u5931\u8D25
smfcore.posIsused=\u5220\u9664\u5931\u8D25\uFF0C\u6599\u4ED3[{0}]\u7684\u5E93\u4F4D[{1}}]\u6709\u6599[{2}]
smfcore.thePosIsused= \u5E93\u4F4D[{0}]\u6709\u6599[{1}],\u4E0D\u80FD\u5220\u9664
smfcore.groupWithStorage=\u7EC4[{0}]\u5DF2\u548C\u8BBE\u5907\u5173\u8054
smfcore.groupWithUser=\u7EC4[{0}]\u5DF2\u548C\u7528\u6237\u5173\u8054
......@@ -256,6 +256,8 @@ smfcore.noValidPos=\u672A\u627E\u5230\u5355\u636E\u53F7
smfcore.order.out.short=\u5DE5\u5355\u7F3A\u6599
smfcore.outList.out.short=\u5B58\u50A8\u51FA\u5E93\u5355{0}\u7F3A\u6599
smfcore.outList.out.noTask=\u8F6C\u50A8\u51FA\u5E93\u5355\u65E0\u53EF\u6267\u884C\u7684\u4EFB\u52A1
smfcore.posNotDel=\u5220\u9664\u5931\u8D25\uFF0C\u8BF7\u5148\u5220\u9664[{0}]\u7684\u6240\u6709\u5E93\u4F4D
smfcore.orderShortage.hasOut=\u8BF7\u7B49\u5F85\u5DE5\u5355[{0}]\u6B20\u6599\u51FA\u5E93\u7ED3\u675F
#smfcore.order.out.short=\u5DE5\u5355\u51FA\u5E93\u5931\u8D25\uFF0C\u5DE5\u5355\u7F3A\u6599
#smfclient.nlp.onlyOneTray=\u4E0D\u53EF\u540C\u65F6\u653E\u5165\u591A\u76D8\u7269\u6599:{0}
......
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!