【项目】出库流程记录

需求分析:前端传入数据为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

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
管理信息系统(简称MIS)是在管理科学、系统科学、计算机科学等的基础上发展起来的综合性边缘科学。在21世纪信息高速发展的时代中,管理信息系统具有很重要的作用,它的预测和辅助决策的功能,即利用现代管理的决策和支持。 管理信息系统是一个由人、机(计算机)组成的能进行管理信息的收集、传递、存储、加工、维护和使用的系统。它能观测企业或组织的各种运动情况,利用过去的数据预测未来;从全局出发辅助决策;利用信息控制企业或组织行为,帮助其实现长远的规划目标。简言之,管理信息系统是一个以计算机为工具,具有数据处理、预测、控制和辅助决策功能的信息系统。 管理信息系统是一个人机系统,同时它又是一个一体化集成系统。管理信息系统是信息系统的一个子系统,它以计算机技术、通讯技术和软件技术为技术基础,同时将现代管理理论、现代管理方法及各级管理人员融为一体,最终为某个组织整体的管理与决策服务,是由人和计算机组成的能进行管理信息的收集、传递、存储、加工、维护和使用的系统。 管理信息系统的基本结构可以概括为四大部件,即信息源、信息处理器、信息用户和信息管理者。因此,一个成功的管理信息系统应该具有可靠的硬件、实用的软件、强有力的现代化管理水平。具体讲,管理信息系统的三大支柱是:计算机网络、数据库和现代化的管理,这三打支柱称为管理信息系统的扩展部件。 1.2数据库应用系统开发简介 在数据库应用系统开发之前,对开发数据库的基本概念应当了解,对数据库的结构、开发数据库应用程序的步骤、开发体系及方法都应当有相当清晰的了解和认识。 数据库应用系统开发的目标是建立一个满足用户长期需求的产品。开发的主要过程为:理解用户的需求,然后,把它们转变为有效的数据库设计。把设计转变为实际的数据库,并且这些数据库带有功能完备、高效能的应用。 数据库技术在计算机软件邻域研究中一直是非常重要的主题,产生于60年代,30多年来数据库技术得到了迅速发展,并已形成较为完整的理论体系和一大批实用系统。并且,近年来,随着World Wide Web(WWW)的猛增及Internet技术的迅速发展,使得数据库技术之时成为最热门技术之一。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值