需求分析:前端传入数据为list,里面为包含线路的数组,例如:lineInfos:[lineNo,lineNo...]。功能:第一批前六辆车直接到交接位,后面的车在等待位排队等待,交接位有空闲位置时等待位补上。

接口:(start)开始出库、(linesOut)出库呼叫、(linesOutQueue)出库排队、(linesOutQueue)排队等待,四个接口

设计:前端发起开始出库,调用start接口,start接口会调用linesOutQueue、linesOutQueue这两个线程,排队和等待线程会一直运行,直到所有出库完成。前端选择需要出库的线路后点击呼叫,调用linesOut接口,将笼车搬出。

1、(start)开始出库

前端传入线路类型,用于区分网点和ATM,更新delivery-plan表的今日出库状态为正在出库,同时转发开启出库队列和等待队列(直到今日线路全部出库完成才会结束)

2、(linesOut)出库呼叫

判断正在出库的数量,正在出库数量大于12辆的话就无法发起下一批。发起的list添加到redis中,在DeliveryOutSetObject脚本中

package com.zjft.bpe.dispatch.delivery.out;import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.zjft.bpe.dispatch.common.DeliveryConstant;
import com.zjft.bpe.dispatch.common.PushMsgUtil;
import com.zjft.bpe.itms_sx.util.CalendarUtil;
import com.zjft.bpe.itms_sx.util.CommonUtil;
import com.zjft.bpe.itmslib.utils.RedisToolUtil;
import com.zjft.bpe.stdlib.util.ModuleUtil;
import com.zjft.log.ZjLogger;
import com.zjft.zjfz.datamodule.BizDataModule;
import com.zjft.zjfz.db.DbOperate;
import com.zjft.zjfz.db.RedisConnection;
import com.zjft.zjfz.engine.IWFEngine;
import com.zjft.zjfz.util.LoggerUtil;
import com.zjft.zjfz.wfactivety.WFActivity;
import com.zjft.zjfz.wfdata.WFData;
import redis.clients.jedis.Jedis;import javax.sql.RowSet;
import java.sql.Connection;
import java.util.LinkedList;
import java.util.List;/*** @author cyz* @date 2019/4/23 17:45*/
public class DeliveryOutSetObject {private final static String DB_ALIAS = "ALIAS";private final static String REDISURL = "RedisUrl";private final static String KEY = "Key";private final static String LINEINFOSLIST = "lineInfosList";public String process(IWFEngine engine, WFActivity activity, WFData wfd, String wfName) throws Exception {BizDataModule dm = wfd.getDataModule();ZjLogger log = LoggerUtil.getLog(dm.getChannelId(), dm.getTxCode());ModuleUtil moduleUtil = new ModuleUtil(wfd, wfd.getDataModule(), activity, log);String alias = moduleUtil.getParamValue(DB_ALIAS);String redisUrl = moduleUtil.getParamValue(REDISURL);String key = moduleUtil.getParamValue(KEY);JSONArray lineNoList = (JSONArray) moduleUtil.getParamObjValue(LINEINFOSLIST);Jedis redisClient;if (redisUrl != null && redisUrl.trim().length() != 0) {redisClient = new Jedis(redisUrl);} else {redisClient = RedisConnection.getRedisConnection();}Connection conn = wfd.getTxConnection(alias);//遍历线路listfor (int i=0;i<lineNoList.size();i++){JSONObject jsonObject = lineNoList.getJSONObject(i);String lineNo = jsonObject.getString("lineNo");String updateStatus =  "update DELIVERY_LINE_INFO set out_pace = 2 where line_no ="+lineNo;//更新线路状态为正在出库DbOperate.executeCUID(updateStatus,conn,log);//将线路添加到linkedlist中redisClient.rpush(key,lineNo);}//设置出库全部完成之后的推送JSONObject jsonObject = lineNoList.getJSONObject(0);String lineNo = jsonObject.getString("lineNo");String qrylineType = "select line_type from delivery_line_info where line_no="+lineNo;RowSet rowSet = DbOperate.executeQuery(qrylineType,conn,log);rowSet.next();String lineType = rowSet.getString("line_type");//获取日期String date = CalendarUtil.getSysTimeYMD().replaceAll("-","");String deliveryNo = "CK"+date;List<String> lineInfos = redisClient.lrange(key, 0, -1);redisClient.close();if (lineInfos.size() != 0){wfd.getDataModule().setObjBusinessInfo("reqMsg.msgType", 1);wfd.getDataModule().setObjBusinessInfo("reqMsg.deliveryNo", deliveryNo);wfd.getDataModule().setObjBusinessInfo("reqMsg.lineType", lineType);log.info("deliveryNo [" + deliveryNo + "] 推送");PushMsgUtil.fireMsgPush(wfd, DeliveryConstant.PUSH_DELIVERY_MSG_PATH);return "ok";}else {CommonUtil.setResponseMsg("FFFFF","向redis插入数据失败",moduleUtil);return "fail";}}
}

获取redis连接

将链表中的数据插入到redis中

设置推送

3、想redis插入数据之后,一直在运行的linesOutQueue线程就会检测到redis中有值,就会将值取出,然后根据返回值调用对应的搬运操作,搬运到交接位或者等待点。

从redis中取数据写在DeliveryOutGetObject中

package com.zjft.bpe.dispatch.delivery.out;import com.zjft.bpe.itms_sx.util.CommonUtil;
import com.zjft.bpe.stdlib.util.ModuleUtil;
import com.zjft.log.ZjLogger;
import com.zjft.zjfz.datamodule.BizDataModule;
import com.zjft.zjfz.db.DbOperate;
import com.zjft.zjfz.db.RedisConnection;
import com.zjft.zjfz.engine.IWFEngine;
import com.zjft.zjfz.util.LoggerUtil;
import com.zjft.zjfz.wfactivety.WFActivity;
import com.zjft.zjfz.wfdata.WFData;
import redis.clients.jedis.Jedis;import javax.sql.RowSet;
import java.sql.Connection;
import java.util.*;/*** @author cyz* @date 2019/4/23 18:43*/
public class DeliveryOutGetObject {private final static String DB_ALIAS = "ALIAS";private final static String REDISURL = "RedisUrl";private final static String KEY = "Key";private final static String HANDCARTANDLOCATIONLIST = "handcartAndLocationList";private final static String HANDCART = "handCartNo";public String process(IWFEngine engine, WFActivity activity, WFData wfd, String wfName) throws Exception {BizDataModule dm = wfd.getDataModule();ZjLogger log = LoggerUtil.getLog(dm.getChannelId(), dm.getTxCode());ModuleUtil moduleUtil = new ModuleUtil(wfd, wfd.getDataModule(), activity, log);String alias = moduleUtil.getParamValue(DB_ALIAS);String redisUrl = moduleUtil.getParamValue(REDISURL);String key = moduleUtil.getParamValue(KEY);Jedis redisClient;if (redisUrl != null && redisUrl.trim().length() != 0) {redisClient = new Jedis(redisUrl);} else {redisClient = RedisConnection.getRedisConnection();}//LinkedList<String> lineInfos = (LinkedList<String>)RedisToolUtil.getObjFromRedis(key,redisUrl);Connection conn = wfd.getTxConnection(alias);String qryFreeNum = "select count(b.location_no) as a from delivery_cache_location d ,base_storage_location b where b.type = 10 and b.location_no=d.location_no and b.status = 1";RowSet rowSet = DbOperate.executeQuery(qryFreeNum,conn,log);rowSet.next();int freeNum = rowSet.getInt("a");String lineNo = "";String handCartNo = "";List<Map> handcartAndLocationList = new ArrayList<Map>();try {//6个交接位全部为空的情况if (freeNum==6){List<String> lineInfos = redisClient.lrange(key, 0, -1);if (lineInfos.size()==0){redisClient.close();return "empty";}int min = lineInfos.size();if (min>6){min = 6;}String qryFreeBerth = "select b.location_no as location_no from delivery_cache_location d ,base_storage_location b where b.type = 10 \n" +"  and b.location_no=d.location_no and b.status = 1 order by d.sort_no";RowSet locationRowSet = DbOperate.executeQuery(qryFreeBerth, conn, log);for (int i =0;i<min;i++){//取出线路lineNo = redisClient.lpop(key);if (lineNo==null || lineNo==""){redisClient.close();return "empty";}String qryhandcart = "select handcart_no from base_handcart_info where LINE_NO="+lineNo;RowSet hancartRowSet = DbOperate.executeQuery(qryhandcart, conn, log);hancartRowSet.next();//查出笼车handCartNo = hancartRowSet.getString("handcart_no");locationRowSet.next();//查出空闲交接位String locationNo = locationRowSet.getString("location_no");Map<String, String> map = new HashMap<String, String>();map.put("handCartNo",handCartNo);map.put("locationNo",locationNo);handcartAndLocationList.add(map);}redisClient.close();moduleUtil.setParamObjValue(HANDCARTANDLOCATIONLIST,handcartAndLocationList);return "handover";}else{//交接位不全为空的情况lineNo = redisClient.lpop(key);if (lineNo==null || lineNo==""){redisClient.close();return "empty";}String qryhandcart = "select handcart_no from base_handcart_info where LINE_NO="+lineNo;RowSet hancartRowSet = DbOperate.executeQuery(qryhandcart, conn, log);hancartRowSet.next();//查出笼车handCartNo = hancartRowSet.getString("handcart_no");moduleUtil.setParamObjValue(HANDCART,handCartNo);redisClient.close();return "wait";}}catch (Exception e){log.error(e);CommonUtil.setResponseMsg("FFFFF","从redis取数据失败",moduleUtil);if (redisClient!=null) {redisClient.close();}return "fail";}}
}

获取redis连接

6个交接位全部为空的情况下,取出前6条线路与交接位绑定搬运,如果线路不足六条就全部取出,返回handover。判断redis中的值,如果为空就返回empty。

如果6个交接位不是全部为空,将线路对应的笼车全部搬运到等待点排队等待。

4、一旦有车到达等待点,一直在运行的lineOutWait线程就会检测到,查询是否有空库位,如果检测到空库位,就会将等待区的车搬运至空交接位,后面的车补上以后继续检测,直到所有的线路全部搬运至等待点,出库队列和等待队列才会结束。

根据线路状态判断线路是否到达交接区或者已交接,线路状态是在搬运任务完成以后由回调更新

在脚本DeliveryCRYDUtil中

deliveryType为1的任务完成后,将状态更新为3

【项目】出库流程记录相关推荐

  1. 深入浅出WMS之出库流程解析

    深入浅出WMS之出库流程解析 创建出库单 出库单管理 出库单管理-配货 出库单管理-关单 出库任务管理 出库任务管理-撤销 结尾 创建出库单 本来打算周末的时候写出库的流程,没想到今天开了一天会,作为 ...

  2. 仓储系统之入库、出库理解浅谈

    入库管理: 功能:入库单打印.入库上架确认. 一.入库流程: 1,首先,操作人员在电脑上通过仓储系统的入库管理下的入库单打印功能查询有没有要打印的入库单.如果有,打印入库单,入库单主要信息:商品条码. ...

  3. 被装管理系统之出入库流程

    一.系统简介 本系统主要分为三部分:后台系统软件,采用B/S架构:通道数据采集软件,采用CS架构:移动APP软件,Android系统.主要功能如下: n 手持功能:出库.回库.上架.盘点.报废 n 发 ...

  4. wms系统的出库单价是这样自动生成的?

    wms仓库管理软件中,出库单价是可以自动填写,因为自动生成价格通常有几种情况,所以,用户可以在参数设置,单据定义中设置如何自动产生出库价. wms仓库管理软件 1.按成本价 根据用户选择的成本算法(先 ...

  5. 2021-05-26wms系统的出库单价是这样自动生成的?

    wms仓库管理软件中,出库单价是可以自动填写,因为自动生成价格通常有几种情况,所以,用户可以在参数设置,单据定义中设置如何自动产生出库价. wms仓库管理软件 1.按成本价 根据用户选择的成本算法(先 ...

  6. 编辑出库单issue

    普遍意义上的出库流程是在出库之前要有一个审批流程(编辑出库单审批),流程过了,再走出库单的流程(出库单审批) 极少数情况下,出库单的流程可直接过,即直接审批通过

  7. SpringBoot+MyBatisPlus+Swagger2.7规范开发接口流程(以废料包材入库与出库为例)

    场景 SpringBoot+Swagger2实现可视化API文档流程: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/936166 ...

  8. flowjo软件使用方法_管家婆软件使用方法出库教程,管家婆软件做账流程视频_双全科技...

    管家婆软件的使用方法出库,管家婆软件做账流程视频 想要做好财务管理工作,那么财务人员就要经常对自己进行总结,归纳工作中的得失,对工作存在的问题要及时进行整改,提升工作效率.下面就由管家婆软件小编介绍一 ...

  9. 自动化立体仓库使用流程!海格里斯自动化立体库流程:入库——出库——拣选

    随着现代物流行业的不断进步,我们可以发现自动化立体仓库已成为现代物流系统中重要的一个组成部分,它不但可以减轻人工劳动强度,还可以节省地面面积,可以很轻松的避免一些不必要的故障出现,同时还可以提高仓库的 ...

最新文章

  1. new file https 找不到路径_Python3用pathlib模块替代os.path进行文件路径的操作
  2. 【资料篇】你需要掌握SEO的8个常用知识点
  3. 远程访问数据库出错的解决办法
  4. 三星Galaxy Note 10渲染图曝光:前置打孔双摄+后置横排四摄
  5. IO Visor Project Use Cases
  6. Activity中的setDefaultKeyMode() (转载)
  7. macOS上简便好用的看图软件分享
  8. php聊天室简单实现
  9. c# MD5加密
  10. PHP 防止 while true循环 CPU 使用率过高的方法
  11. 智慧养老之智慧养老解决方案-新导智能
  12. 学无止境,京东活动自动领取脚本
  13. 【渝粤教育】广东开放大学 岭南文化概论 形成性考核 (45)
  14. 小技巧 - 一键查看身份证名下所有支付宝账户(可选择注销)
  15. unite17-shanghai-JPLee-netease-pangu-FullChinese
  16. 2020-10-21 ubuntu 打包解包压缩解压tar gz bz2 tar.Z tgz rar lha格式
  17. 两个单链表相交的一系列问题-Java
  18. VCIP2020:不同尺寸块基于神经网络的帧内预测
  19. 智慧水库安全监测解决方案
  20. 华三无线控制器的配置优化

热门文章

  1. 开发一个可以查询并显示数据库内容的微信小程序
  2. vue路由报错Navigating to current location (“/login“) is not allowed踩坑总结
  3. 三角形面积的勾股定理
  4. 劳动者可以拒绝加班吗
  5. S32K144调试记录(二)
  6. 带弧CAD和GDB数据导入ARCSDE后面积一致性问题
  7. 刀~~~~~~~~~~~~
  8. PDF编辑器首选工具Acrobat Pro DC
  9. STP/RSTP协议(二)
  10. 随机森林的构建过程(机器学习)