OutInfo.java 8.1 KB
package com.myproject.bean.update.qisda;

import com.myproject.bean.BaseMongoBean;
import com.myproject.util.StorageConstants;
import org.springframework.data.annotation.Transient;

import java.util.*;
import java.util.concurrent.ConcurrentHashMap;

/**
 * DN单信息
 */
public class OutInfo extends BaseMongoBean {

    public OutInfo(){

    }

    public OutInfo(OutItem outItem){
        this.action = outItem.getAction();
        this.hSerial = outItem.gethSerial();
        this.so = outItem.getSo();
        this.soseq = outItem.getSoseq();
        this.refno = outItem.getRefno();
        this.sdate = outItem.getSdate();
        this.mdate = outItem.getMdate();
    }

    /**
     * 动作(首盘,分盘,补料盘,急料,指定料,单独出库)
     */
    private String action;
    /**
     * 需求单号
     */
    private String hSerial;

    /**
     * 工单
     */
    private String so;

    /**
     * 工单序号
     */
    private String soseq;

    /**
     * 备料单号
     */
    private String refno;

    /**
     * 建议出仓时间
     */
    private Date sdate;

    /**
     * 必须出仓日期
     */
    private Date mdate;

    /**
     * 任务数量
     */
    private int taskNum;

    /**
     * 绑定状态:0=未绑定 1=绑定缺料  2=绑定OK
     */
    private int bindStatus = StorageConstants.BIND_STATUS.NO_BIND;

    /**
     * 发料状态: 0=未发料 1=发料缺料 2=发料OK(需求单完成):首盘和补料,发料与需求单一致为发料OK, 分盘料出库后又入库即真实绑定与需求量一致为发料OK, 紧急料出库数量与需求数量一致为发料OK
     */
    private int sendStatus = StorageConstants.SEND_STATUS.NEW;

    /**
     * 出仓料盘数量
     */
    private int outReelNum;

    /**
     * 任务完成数量(放上料架)
     */
    private int taskFinishNum;

    /**
     * 第一次执行的时间,如果为0表示未执行过,如果小于0表示要优先执行,越小越优先
     */
    private long firstExecuteTime;

    @Transient
    private Map<String, OutItem> outItemMap = new HashMap<>();

    public String getAction() {
        return action;
    }

    public void setAction(String action) {
        this.action = action;
    }

    public String gethSerial() {
        return hSerial;
    }

    public void sethSerial(String hSerial) {
        this.hSerial = hSerial;
    }

    public Date getMdate() {
        return mdate;
    }

    public void setMdate(Date mdate) {
        this.mdate = mdate;
    }

    public String getRefno() {
        return refno;
    }

    public void setRefno(String refno) {
        this.refno = refno;
    }

    public Date getSdate() {
        return sdate;
    }

    public void setSdate(Date sdate) {
        this.sdate = sdate;
    }

    public String getSo() {
        return so;
    }

    public void setSo(String so) {
        this.so = so;
    }

    public int getOutReelNum() {
        return outReelNum;
    }

    public void setOutReelNum(int outReelNum) {
        this.outReelNum = outReelNum;
    }

    public int getTaskNum() {
        return taskNum;
    }

    public void setTaskNum(int taskNum) {
        this.taskNum = taskNum;
    }

    public List<OutItem> getOutItems() {
        return new ArrayList<>(outItemMap.values());
    }

    public void updateOutItems(List<OutItem> outItems) {
        for (OutItem outItem : outItems) {
            updateItem(outItem);
        }
    }


    public OutItem findOutItem(int slotSeq){
        for (OutItem outItem : getOutItems()) {
            if(outItem.getSlotlocation() == slotSeq){
                return outItem;
            }
        }
        return null;
    }

    public OutItem findOutItemById(String outItemId){
        return outItemMap.get(outItemId);
    }

    /**
     * 分盘需求单
     */
    public boolean isReelCutAction(){
        return getAction().contains("分盘");
    }

    /**
     * 紧急料或指定料或单独出库料
     * @return
     */
    public boolean isUrgentAction(){
        return getAction().contains("急料") || getAction().contains("指定料") || getAction().contains("单独出库");
    }

    /**
     * 首盘需求单
     */
    public boolean isFirstReelAction(){
        return getAction().contains("首盘");
    }


    /**
     * 补料需求单
     */
    public boolean isTailAction(){
        return getAction().contains("补料");
    }

    public int getTaskFinishNum() {
        return taskFinishNum;
    }

    public void setTaskFinishNum(int taskFinishNum) {
        this.taskFinishNum = taskFinishNum;
    }

    /**
     * 获取出库顺序,第一个为F,中间的为M,最后一个为L
     */
    public String getOutLatest(){
        if(taskNum == 1){
            return "L";
        }
        if(outReelNum == 1){
            return "F";
        }
        if(outReelNum >= taskNum){
            return "L";
        }
        return "M";
    }

    /**
     * 放上料架顺序
     */
    public String getShelfLatest(){
        if(taskNum == 1){
            return "L";
        }
        if(taskFinishNum == 1){
            return "F";
        }
        if(taskFinishNum >= taskNum){
            return "L";
        }
        return "M";
    }

    public int getBindStatus() {
        return bindStatus;
    }

    public void setBindStatus(int bindStatus) {
        this.bindStatus = bindStatus;
    }

    /**
     * 真实绑定OK
     */
    public boolean isRealBindOk(){
        return this.bindStatus == StorageConstants.BIND_STATUS.REAL_BIND_OK;
    }

    public boolean isRealBindLess(){
        return this.bindStatus == StorageConstants.BIND_STATUS.REAL_BIND_LESS;
    }

    public int getSendStatus() {
        return sendStatus;
    }

    /**
     * 是否发料完成(不缺料)
     */
    public boolean isSendEnd(){
        return sendStatus == StorageConstants.SEND_STATUS.SEND_OK;
    }

    /**
     * 是否已关闭
     */
    public boolean isClosed(){
        return sendStatus == StorageConstants.SEND_STATUS.CLOSED;
    }

    /**
     * 是否本次任务执行完成
     */
    public boolean isTaskEnd(){
        return taskNum > 0 && taskFinishNum >= taskNum;
    }

    /**
     * 是否正在执行
     */
    public boolean isExecuting(){
        return sendStatus == StorageConstants.SEND_STATUS.EXECUTING;
    }

    /**
     * 是否是新的需求单
     */
    public boolean isNew(){
        return sendStatus == StorageConstants.SEND_STATUS.NEW;
    }

    /**
     * 是否是发料缺料的需求单
     */
    public boolean isSendLess(){
        return sendStatus == StorageConstants.SEND_STATUS.SEND_LESS;
    }

    /**
     * 是否是需要优先执行的
     */
    public boolean isPriority(){
        return firstExecuteTime < 0;
    }

    public void setSendStatus(int sendStatus) {
        this.sendStatus = sendStatus;
    }

    public void updateItem(OutItem item){
        outItemMap.put(item.getId(),item);
    }

    public Map<String, OutItem> getOutItemMap() {
        return outItemMap;
    }

    public void setOutItemMap(Map<String, OutItem> outItemMap) {
        this.outItemMap = outItemMap;
    }

    public String getSoseq() {
        return soseq;
    }

    public void setSoseq(String soseq) {
        this.soseq = soseq;
    }

    public long getFirstExecuteTime() {
        return firstExecuteTime;
    }

    public void setFirstExecuteTime(long firstExecuteTime) {
        this.firstExecuteTime = firstExecuteTime;
    }

    public boolean updateExecuteTime(long executeTime){
        if(this.firstExecuteTime <= 0){
            setFirstExecuteTime(executeTime);
            return true;
        }
        return false;
    }

    @Override
    public String toString() {
        return "OutInfo{" +
                "action='" + action + '\'' +
                ", hSerial='" + hSerial + '\'' +
                ", so='" + so + '\'' +
                ", refno='" + refno + '\'' +
                ", sdate=" + sdate +
                ", mdate=" + mdate +
                ", taskNum=" + taskNum +
                ", bindStatus=" + bindStatus +
                ", sendStatus=" + sendStatus +
                ", outReelNum=" + outReelNum +
                ", taskFinishNum=" + taskFinishNum +
                '}';
    }
}