package com.ruoyi.asset.domain;

/**
 * 可退库资产候选对象。
 * <p>
 * 资产处于在用状态时当前仓位为空，因此退库默认仓位必须从最近一次已完成领用明细中读取。
 * </p>
 *
 * @author Yangk
 */
public class AmsReturnAssetCandidate extends AmsAsset
{
    private static final long serialVersionUID = 1L;

    /** 
     * 最近一次已完成领用的源单据ID。
     * 用于退库单回溯领用源头，并在业务逻辑中作为防呆比对的基础。
     */
    private Long sourceReceiveOrderId;

    /** 
     * 最近一次已完成领用的源单据明细项ID。
     * 在退库时，通过此明细ID定位具体的领用资产记录，用以核对当时被领用的历史原仓位。
     */
    private Long sourceReceiveItemId;

    /** 
     * 最近一次已完成领用时的原仓库ID。
     * 当资产处于“在用 (IN_USE)”状态时，其台账表上的当前仓库和位置字段通常为空。
     * 因此，必须通过最近一次完成的领用单明细（当时记为 `before_warehouse_id`）来找回最初领出它的源头仓库。
     */
    private Long originWarehouseId;

    /** 最近一次已完成领用时的原仓库编码 */
    private String originWarehouseCode;

    /** 最近一次已完成领用时的原仓库名称 */
    private String originWarehouseName;

    /** 
     * 最近一次已完成领用时的原仓库是否启用（Y表示启用，N表示停用）。
     * 在退库逻辑中，如果原仓库已被停用，该资产将无法走常规的原仓库原路退回校验。
     */
    private String originWarehouseEnabled;

    /** 
     * 最近一次已完成领用时的原资产位置ID。
     * 用以协助定位资产退库时应当默认回退的位置节点。
     */
    private Long originLocationId;

    /** 最近一次已完成领用时的原资产位置编码 */
    private String originLocationCode;

    /** 最近一次已完成领用时的原资产位置名称 */
    private String originLocationName;

    /** 最近一次已完成领用时的原资产位置是否启用（Y表示启用，N表示停用） */
    private String originLocationEnabled;

    public Long getSourceReceiveOrderId()
    {
        return sourceReceiveOrderId;
    }

    public void setSourceReceiveOrderId(Long sourceReceiveOrderId)
    {
        this.sourceReceiveOrderId = sourceReceiveOrderId;
    }

    public Long getSourceReceiveItemId()
    {
        return sourceReceiveItemId;
    }

    public void setSourceReceiveItemId(Long sourceReceiveItemId)
    {
        this.sourceReceiveItemId = sourceReceiveItemId;
    }

    public Long getOriginWarehouseId()
    {
        return originWarehouseId;
    }

    public void setOriginWarehouseId(Long originWarehouseId)
    {
        this.originWarehouseId = originWarehouseId;
    }

    public String getOriginWarehouseCode()
    {
        return originWarehouseCode;
    }

    public void setOriginWarehouseCode(String originWarehouseCode)
    {
        this.originWarehouseCode = originWarehouseCode;
    }

    public String getOriginWarehouseName()
    {
        return originWarehouseName;
    }

    public void setOriginWarehouseName(String originWarehouseName)
    {
        this.originWarehouseName = originWarehouseName;
    }

    public String getOriginWarehouseEnabled()
    {
        return originWarehouseEnabled;
    }

    public void setOriginWarehouseEnabled(String originWarehouseEnabled)
    {
        this.originWarehouseEnabled = originWarehouseEnabled;
    }

    public Long getOriginLocationId()
    {
        return originLocationId;
    }

    public void setOriginLocationId(Long originLocationId)
    {
        this.originLocationId = originLocationId;
    }

    public String getOriginLocationCode()
    {
        return originLocationCode;
    }

    public void setOriginLocationCode(String originLocationCode)
    {
        this.originLocationCode = originLocationCode;
    }

    public String getOriginLocationName()
    {
        return originLocationName;
    }

    public void setOriginLocationName(String originLocationName)
    {
        this.originLocationName = originLocationName;
    }

    public String getOriginLocationEnabled()
    {
        return originLocationEnabled;
    }

    public void setOriginLocationEnabled(String originLocationEnabled)
    {
        this.originLocationEnabled = originLocationEnabled;
    }

    /**
     * 判断资产是否有明确、可追溯的领用来源仓位。
     * <p>
     * 只有同时存在领用时的原仓库和原位置，才被认为是一笔具有完整可追溯链条的在用资产。
     * 否则，系统将在退库单校验中将其归类为“无明确来源资产”。
     * </p>
     */
    public boolean isOriginTraceable()
    {
        return originWarehouseId != null && originLocationId != null;
    }

    /**
     * 校验资产的源领用仓位是否依然可用。
     * <p>
     * 在进行原路退回操作时，除来源可追溯外，还需确保当时的仓库和位置在当前时间点均处于启用（"Y"）状态。
     * 若已被停用，系统应提示或拒绝执行默认的原路回填。
     * </p>
     */
    public boolean isOriginEnabled()
    {
        return isOriginTraceable() && "Y".equals(originWarehouseEnabled) && "Y".equals(originLocationEnabled);
    }
}
