需求分析:前端传入数据为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);
//遍历线路list
for (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