package com.benyun.project.third.kingdee.domain;

import lombok.Data;

import javax.validation.Valid;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import java.util.List;

/**
 * 销售出库单
 */
@Data
public class SALOutStock {
    /**
     *
     * 需要更新的字段，数组类型，格式：[key1,key2,...] （非必录）注（更新字段时Model数据包中必须设置内码，若更新单据体字段还需设置分录内码）
     */
    private String[] NeedUpDateFields;
    /**
     * 需返回结果的字段集合，数组类型，格式：[key,entitykey.key,...]（非必录） 注（返回单据体字段格式：entitykey.key）
     */
    private String[] NeedReturnFields;
    /**
     * 是否删除已存在的分录，布尔类型，默认true（非必录）
     */
    private boolean IsDeleteEntry;
    /**
     * 表单所在的子系统内码，字符串类型（非必录）
     */
    private String SubSystemId;
    /**
     * 是否验证所有的基础资料有效性，布尔类，默认false（非必录）
     */
    private boolean IsVerifyBaseDataField;
    /**
     * 是否批量填充分录，默认true（非必录）
     */
    private boolean IsEntryBatchFill;
    /**
     * 是否验证数据合法性标志，布尔类型，默认true（非必录）注（设为false时不对数据合法性进行校验）
     */
    private boolean ValidateFlag;
    /**
     * 是否用编码搜索基础资料，布尔类型，默认true（非必录）
     */
    private boolean NumberSearch;
    /**
     * 是否自动调整JSON字段顺序，布尔类型，默认false（非必录）
     */
    private boolean IsAutoAdjustField;
    /**
     * 交互标志集合，字符串类型，分号分隔，格式："flag1;flag2;..."（非必录） 例如（允许负库存标识：STK_InvCheckResult）
     */
    private String InterationFlags;
    /**
     * 是否允许忽略交互，布尔类型，默认true（非必录）
     */
    private String IgnoreInterationFlag;
    /**
     * 是否控制精度，为true时对金额、单价和数量字段进行精度验证，默认false（非必录）
     */
    private boolean IsControlPrecision;
    /**
     * 校验Json数据包是否重复传入，一旦重复传入，接口调用失败，默认false（非必录）
     */
    private boolean ValidateRepeatJson;
    /**
     * 表单数据包，JSON类型（必录）
     */
    @Valid
    @NotEmpty(message = "表单数据包，JSON类型（必录）")
    private List<Model> model;
    /**
     * 表单数据包，JSON类型（必录）
     */
    @Data
    public static class Model{
        public Integer FID;
        /**
         * 单据类型
         */
        @Valid
        @NotEmpty(message = "单据类型是必录项")
        public fBillTypeID FBillTypeID;
        /**
         * 单据类型
         */
        @Data
        public static class fBillTypeID{
            @NotNull(message = "单据类型是必录项")
            public String FNumber;
        }
        /**
         * 单据编号
         */
        public String FBillNo;
        /**
         * 日期
         */
        @NotNull(message = "单据日期是必录项")
        public String FDate;
        /**
         * 销售组织
         */
        @Valid
        @NotEmpty(message = "销售组织是必录项")
        public fSaleOrgId FSaleOrgId;
        /**
         * 销售组织
         */
        @Data
        public static class fSaleOrgId{
            @NotNull(message = "销售组织是必录项")
            public String FNumber;
        }
        /**
         * 销售门店
         */
        @Valid
        public fBranchId FBranchId;
        /**
         * 销售门店
         */
        @Data
        public static class fBranchId{
            public String FNUMBER;
        }
        /**
         * 客户
         */
        @Valid
        @NotEmpty(message = "客户是必录项")
        public fCustomerID FCustomerID;
        /**
         * 客户
         */
        @Data
        public static class fCustomerID{
            public String FNumber;
        }
        /**
         * 销售部门
         */
        public fSaleDeptID FSaleDeptID;
        /**
         * 销售部门
         */
        @Data
        public static class fSaleDeptID{
            public String FNumber;
        }
        /**
         * 收货方
         */
        public fReceiverID FReceiverID;
        /**
         * 收货方
         */
        @Data
        public static class fReceiverID{
            public String FNumber;
        }
        /**
         * 对应组织
         */
        public fCorrespondOrgId FCorrespondOrgId;
        /**
         * 对应组织
         */
        @Data
        public static class fCorrespondOrgId{
            public String FNumber;
        }
        /**
         * 交货地点
         */
        public fHeadLocationId FHeadLocationId;
        /**
         * 交货地点
         */
        @Data
        public static class fHeadLocationId{
            public String FNumber;
        }
        /**
         * 承运商
         */
        public fCarrierID FCarrierID;
        /**
         * 承运商
         */
        @Data
        public static class fCarrierID{
            public String FNumber;
        }
        /**
         * 运输单号
         */
        public String FCarriageNO;
        /**
         * 销售组
         */
        public fSalesGroupID FSalesGroupID;
        /**
         * 销售组
         */
        @Data
        public static class fSalesGroupID{
            public String FNumber;
        }
        /**
         * 销售员
         */
        public fSalesManID FSalesManID;
        /**
         * 销售员
         */
        @Data
        public static class fSalesManID{
            public String FNumber;
        }
        /**
         * 发货组织
         */
        @NotEmpty(message = "发货组织是必录项")
        public fStockOrgId FStockOrgId;
        /**
         * 发货组织
         */
        @Data
        public static class fStockOrgId{
            @NotNull(message = "发货组织是必录项")
            public String FNumber;
        }
        /**
         * 发货部门
         */
        public fDeliveryDeptID FDeliveryDeptID;
        /**
         * 发货部门
         */
        @Data
        public static class fDeliveryDeptID{
            public String FNumber;
        }
        /**
         * 收货人姓名
         */
        public String FLinkMan;
        /**
         * 联系电话
         */
        public String FLinkPhone;
        /**
         * 库存组
         */
        public fStockerGroupID FStockerGroupID;
        /**
         * 库存组
         */
        @Data
        public static class fStockerGroupID{
            public String FNumber;
        }
        /**
         * 仓管员
         */
        public fStockerID FStockerID;
        /**
         * 仓管员
         */
        @Data
        public static class fStockerID{
            public String FNumber;
        }
        /**
         * 备注
         */
        public String FNote;
        /**
         * 收货方地址
         */
        public String FReceiveAddress;
        /**
         * 结算方
         */
        public fSettleID FSettleID;
        /**
         * 结算方
         */
        @Data
        public static class fSettleID{
            public String FNumber;
        }
        /**
         * 收货方联系人
         */
        public fReceiverContactID FReceiverContactID;
        /**
         * 收货方联系人
         */
        @Data
        public static class fReceiverContactID{
            public String FNumber;
        }
        /**
         * 付款方
         */
        public fPayerID FPayerID;
        /**
         * 付款方
         */
        @Data
        public static class fPayerID{
            public String FNumber;
        }
        /**
         * 货主类型
         */
        public String FOwnerTypeIdHead;
        /**
         * 货主
         */
        public fOwnerIdHead FOwnerIdHead;
        /**
         * 货主
         */
        @Data
        public static class fOwnerIdHead{
            public String FNumber;
        }
        /**
         * 序列号上传
         */
        public String FScanBox;
        /**
         * 零售单日结生成
         */
        public boolean FGenFromPOS_CMK;
        /**
         * 创建日期偏移单位
         */
        public String FCDateOffsetUnit;
        /**
         * 创建日期偏移量
         */
        public Integer FCDateOffsetValue;
        /**
         * 交货明细执行地址(后台用)
         */
        public String FPlanRecAddress;
        /**
         * 整单服务或费用
         */
        public boolean FIsTotalServiceOrCost;
        /**
         * 网店编码
         */
        public String FSHOPNUMBER;
        /**
         * 管易发货日期
         */
        public String FGYDATE;
        /**
         * 销售渠道
         */
        public String FSALECHANNEL;
        /**
         * 物流单号
         */
        public String FLogisticsNos;
        /**
         * 预设基础资料字段2
         */
        public fpresetbase2 FPRESETBASE2;
        /**
         * 预设基础资料字段2
         */
        @Data
        public static class fpresetbase2{
            public String FNumber;
        }
        /**
         * 预设基础资料字段1
         */
        public fpresetbase1 FPRESETBASE1;
        /**
         * 预设基础资料字段1
         */
        @Data
        public static class fpresetbase1{
            public String FNumber;
        }
        /**
         * 预设辅助资料字段1
         */
        public fpresetassistant1 FPRESETASSISTANT1;
        /**
         * 预设辅助资料字段1
         */
        @Data
        public static class fpresetassistant1{
            public String FNumber;
        }
        /**
         * 预设辅助资料字段2
         */
        public fpresetassistant2 FPRESETASSISTANT2;
        /**
         * 预设辅助资料字段2
         */
        @Data
        public static class fpresetassistant2{
            public String FNumber;
        }
        /**
         * 财务信息
         */
        @NotEmpty(message = "财务信息是必录项")
        public subHeadEntity SubHeadEntity;
        /**
         * 财务信息
         */
        @Data
        public static class subHeadEntity{
            /**
             * 财务信息主键
             */
            public String FNumber;
            /**
             *
             * 结算币别
             */
            @NotEmpty(message = "结算币别是必录项")
            public fSettleCurrID FSettleCurrID;
            /**
             * 结算币别
             */
            @Data
            public static class fSettleCurrID{
                public String FNumber;
            }
            /**
             * 第三方单据编号
             */
            public String FThirdBillNo;
            /**
             * 第三方单据平台单号
             */
            public String FThirdBillId;
            /**
             * 第三方系统来源
             */
            public String FThirdSrcType;
            /**
             * 结算组织
             */
            @NotEmpty(message = "结算组织是必录项")
            public fSettleOrgID FSettleOrgID;
            /**
             * 结算组织
             */
            @Data
            public static class fSettleOrgID{
                public String FNumber;
            }
            /**
             * 结算方式
             */
            public fSettleTypeID FSettleTypeID;
            /**
             * 结算方式
             */
            @Data
            public static class fSettleTypeID{
                public String FNumber;
            }
            /**
             * 收款条件
             */
            public fReceiptConditionID FReceiptConditionID;
            /**
             * 收款条件
             */
            @Data
            public static class fReceiptConditionID{
                public String FNumber;
            }
            /**
             * 价目表
             */
            public fPriceListId FPriceListId;
            /**
             * 价目表
             */
            @Data
            public static class fPriceListId{
                public String FNumber;
            }
            /**
             * 折扣表
             */
            public fDiscountListId FDiscountListId;
            /**
             * 折扣表
             */
            @Data
            public static class fDiscountListId{
                public String FNumber;
            }
            /**
             * 是否含税
             */
            public boolean FIsIncludedTax;
            /**
             * 本位币
             */
            public fLocalCurrID FLocalCurrID;
            /**
             * 本位币
             */
            @Data
            public static class fLocalCurrID{
                public String FNumber;
            }
            /**
             * 汇率类型
             */
            public fExchangeTypeID FExchangeTypeID;
            /**
             * 汇率类型
             */
            @Data
            public static class fExchangeTypeID{
                public String FNumber;
            }
            /**
             * 汇率
             */
            public Integer FExchangeRate;
            /**
             * 价外税
             */
            public boolean FIsPriceExcludeTax;
            /**
             * 会员名称
             */
            public String FBuyerNick;
            /**
             * 收货人地址
             */
            public String FReceiverAddress;
            /**
             * 收货人
             */
            public String FReceiverName;
            /**
             * 收货人手机
             */
            public String FReceiverMobile;
            /**
             * 收货人国家
             */
            public String FReceiverCountry;
            /**
             * 收货人省份
             */
            public String FReceiverState;
            /**
             * 收货人城市
             */
            public String FReceiverCity;
            /**
             * 收货人地区
             */
            public String FReceiverDistrict;
            /**
             * 收货人电话
             */
            public String FReceiverPhone;
            /**
             * 会员编码
             */
            public String FVIPCODE;
            /**
             * 整单折扣额
             */
            public Integer FAllDisCount;
            /**
             * 管易订单标记编码
             */
            public String FGYTAGCODE;
            /**
             * 管易订单标记名称
             */
            public String FGYTAGNAME;
        }
        /**
         * 明细信息
         */
        public List<fEntity> FEntity;
        /**
         * 明细信息
         */
        @Data
        public static class fEntity{
            public Integer FENTRYID;
            /**
             * 产品类型
             */
            public String FRowType;
            /**
             * 客户物料编码
             */
            public fCustMatID FCustMatID;
            /**
             * 客户物料编码
             */
            @Data
            public static class fCustMatID{
                public String FNumber;
            }
            /**
             * 物料编码
             */
            @NotEmpty(message = "物料编码是必录项")
            public fMaterialID FMaterialID;
            /**
             * 物料编码
             */
            @Data
            public static class fMaterialID{
                public String FNumber;
            }
            /**
             * 辅助属性
             */
            public String FAuxPropId;
            /**
             * 库存单位
             */
            @NotEmpty(message = "库存单位是必录项")
            public fUnitID FUnitID;
            /**
             * 库存单位
             */
            @Data
            public static class fUnitID{
                public String FNumber;
            }
            /**
             * 当前库存
             */
            public Integer FInventoryQty;
            /**
             * 父项产品
             */
            public fParentMatId FParentMatId;
            /**
             * 父项产品
             */
            @Data
            public static class fParentMatId{
                public String FNUMBER;
            }
            /**
             * 实发数量
             */
            public Integer FRealQty;
            /**
             * 拆单数量（计价）
             */
            public Integer FDisPriceQty;
            /**
             * 单价
             */
            public Integer FPrice;
            /**
             * 含税单价
             */
            public Integer FTaxPrice;
            /**
             * 是否赠品
             */
            public boolean FIsFree;
            /**
             * BOM版本
             */
            public fBomID FBomID;
            /**
             * BOM版本
             */
            @Data
            public static class fBomID{
                public String FNumber;
            }
            /**
             * 货主类型
             */
            @NotNull(message = "货主类型是必录项")
            public String FOwnerTypeID;
            /**
             * 货主
             */
            @NotEmpty(message = "货主是必录项")
            public fOwnerID FOwnerID;
            /**
             * 货主
             */
            @Data
            public static class fOwnerID{
                public String FNumber;
            }
            /**
             * 批号
             */
            public fLot FLot;
            /**
             * 批号
             */
            @Data
            public static class fLot{
                public String FNumber;
            }
            /**
             * 生产日期
             */
            public String FProduceDate;
            /**
             * 有效期至
             */
            public String FExpiryDate;
            /**
             * 门店供货价
             */
            public Integer FProPrice;
            /**
             * 供货金额
             */
            public Integer FProAmount;
            /**
             * 税组合
             */
            public fTaxCombination FTaxCombination;
            /**
             * 税组合
             */
            @Data
            public static class fTaxCombination{
                public String FNumber;
            }
            /**
             * 税率%
             */
            public Integer FEntryTaxRate;
            /**
             * 库存辅单位数量
             */
            public Integer FAuxUnitQty;
            /**
             * 辅单位
             */
            public fExtAuxUnitId FExtAuxUnitId;
            /**
             * 辅单位
             */
            @Data
            public static class fExtAuxUnitId{
                public String FNumber;
            }
            /**
             * 实发数量(辅单位)
             */
            public Integer FExtAuxUnitQty;
            /**
             * 仓库
             */
            public fStockID FStockID;
            /**
             * 仓库
             */
            @Data
            public static class fStockID{
                public String FNumber;
            }
            @Data
            public static class FStockLocID{}
            /**
             * 库存状态
             */
            public fStockStatusID FStockStatusID;
            /**
             * 库存状态
             */
            @Data
            public static class fStockStatusID{
                public String FNumber;
            }
            /**
             * 质量类型
             */
            public String FQualifyType;
            /**
             * 计划跟踪号
             */
            public String FMtoNo;
            /**
             * 备注
             */
            public String FEntrynote;
            /**
             * 源单类型
             */
            public String FSrcType;
            /**
             * 源单编号
             */
            public String FSrcBillNo;
            /**
             * 折扣率%
             */
            public Integer FDiscountRate;
            /**
             * 单价折扣
             */
            public Integer FPriceDiscount;
            /**
             * 实收数量
             */
            public Integer FActQty;
            /**
             * 销售单位
             */
            public fSalUnitID FSalUnitID;
            /**
             * 销售单位
             */
            @Data
            public static class fSalUnitID{
                public String FNumber;
            }
            /**
             * 销售数量
             */
            public Integer FSALUNITQTY;
            /**
             * 销售基本数量
             */
            public Integer FSALBASEQTY;
            /**
             * 计价基本数量
             */
            public Integer FPRICEBASEQTY;
            /**
             * 项目编号
             */
            public String FProjectNo;
            /**
             * 控制出库数量
             */
            public boolean FOUTCONTROL;
            /**
             * 补货数量
             */
            public Integer FRepairQty;
            /**
             * 是否生成产品档案
             */
            public String FIsCreateProDoc;
            /**
             * 明细货主供应商
             */
            public fEOwnerSupplierId FEOwnerSupplierId;
            /**
             * 明细货主供应商
             */
            @Data
            public static class fEOwnerSupplierId{
                public String FNUMBER;
            }
            /**
             * 组织间结算跨法人标识
             */
            public boolean FIsOverLegalOrg;
            /**
             * 明细结算组织客户
             */
            public fESettleCustomerId FESettleCustomerId;
            /**
             * 明细结算组织客户
             */
            @Data
            public static class fESettleCustomerId{
                public String FNUMBER;
            }
            /**
             * 行价目表
             */
            public fPriceListEntry FPriceListEntry;
            /**
             * 行价目表
             */
            @Data
            public static class fPriceListEntry{
                public String FNUMBER;
            }
            /**
             * 未关联应收数量（计价单位）
             */
            public Integer FARNOTJOINQTY;
            /**
             * 库存请检单EntryID
             */
            public Integer FQmEntryID;
            /**
             * 库存状态转换单ENTRYID
             */
            public Integer FConvertEntryID;
            /**
             * 销售订单EntryId
             */
            public Integer FSOEntryId;
            /**
             * 是否零售促销
             */
            public boolean FRetailSaleProm;
            /**
             * 拆单前原计价数量
             */
            public Integer FBeforeDisPriceQty;
            /**
             * 签收数量
             */
            public Integer FSignQty;
            /**
             * 发货检验
             */
            public boolean FCheckDelivery;
            /**
             * 管易订单单号
             */
            public String FThirdEntryId;
            /**
             * 第三方单据ID
             */
            public String FETHIRDBILLID;
            /**
             * 第三方单据编号
             */
            public String FETHIRDBILLNO;
            /**
             * 价税合计（折前）
             */
            public Integer FAllAmountExceptDisCount;
            /**
             * 按子项结算
             */
            public boolean FSettleBySon;
            /**
             * BOM分录内码
             */
            public Integer FBOMEntryId;
            /**
             * 管易发货时间
             */
            public String FGYENTERTIME;
            /**
             * 物料（销售组织）
             */
            public fMaterialID_Sal FMaterialID_Sal;
            /**
             * 物料（销售组织）
             */
            @Data
            public static class fMaterialID_Sal{
                public String FNUMBER;
            }
            /**
             * 入库单编码_序号
             */
            public String FInStockBillno;
            /**
             * 入库单分录ID
             */
            public Integer FInStockEntryId;
            /**
             * 收料单编码_序号
             */
            public String FReceiveBillno;
            /**
             * 收料单分录ID
             */
            public Integer FReceiveEntryId;
            /**
             * 是否替代出库
             */
            public boolean FIsReplaceOut;
            /**
             * 替代原物料编码
             */
            public fReplaceMaterialID FReplaceMaterialID;
            /**
             * 替代原物料编码
             */
            @Data
            public static class fReplaceMaterialID{
                public String FNUMBER;
            }
            /**
             * VMI业务
             */
            public boolean FVmiBusinessStatus;
            /**
             * 税务明细
             */
            public List<fTaxDetailSubEntity> FTaxDetailSubEntity;
            /**
             * 税务明细
             */
            @Data
            public static class fTaxDetailSubEntity{
                public Integer FDetailID;
                /**
                 * 税率%
                 */
                public Integer FTaxRate;
            }
            /**
             * 序列号子单据体
             */
            public List<fSerialSubEntity> FSerialSubEntity;
            /**
             * 序列号子单据体
             */
            @Data
            public static class fSerialSubEntity{
                public Integer FDetailID;
                /**
                 * 序列号
                 */
                public String FSerialNo;
                /**
                 * 备注
                 */
                public String FSerialNote;
            }
        }
        /**
         * 物流跟踪明细
         */
        public List<fOutStockTrace> FOutStockTrace;
        /**
         * 物流跟踪明细
         */
        @Data
        public static class fOutStockTrace{
            public Integer FEntryID;
            /**
             * 物流公司
             */
            public fLogComId FLogComId;
            @Data
            public static class fLogComId{
                public String FCODE;
            }
            /**
             * 物流单号
             */
            public String FCarryBillNo;
            /**
             * 寄件人手机号码
             */
            public String FPhoneNumber;
            /**
             * 起始地点
             */
            public String FFrom;
            /**
             * 终止地点
             */
            public String FTo;
            /**
             * 发货时间
             */
            public String FDelTime;
            /**
             * 物流状态
             */
            public String FTraceStatus;
            /**
             * 签收时间
             */
            public String FReceiptTime;
            /**
             * 类型
             */
            public String FCarryBillNoType;
            /**
             * 物流详细信息
             */
            public List<fOutStockTraceDetail> FOutStockTraceDetail;
            @Data
            public static class fOutStockTraceDetail{
                public Integer FDetailID;
                /**
                 * 时间
                 */
                public String FTraceTime;
                /**
                 * 物流详情
                 */
                public String FTraceDetail;
            }
        }
    }
}
