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 STKTransferDirect {
    /**
     * 需要更新的字段，数组类型，格式：[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;

    @Data
    public static class Model {
        public Integer FID;
        /**
         * 单据编号
         */
        public String FBillNo;
        /**
         * 单据类型
         */
        @Valid
        @NotEmpty(message = "单据类型是必录项")
        public fBillTypeID FBillTypeID;

        /**
         * 单据类型
         */
        @Data
        public static class fBillTypeID {
            public String FNUMBER;
        }

        /**
         * 业务类型
         */
        public String FBizType;
        /**
         * 调拨方向
         */
        @NotNull(message = "调拨方向是必录项")
        public String FTransferDirect;
        /**
         * 调拨类型
         */
        @NotNull(message = "调拨类型是必录项")
        public String FTransferBizType;
        /**
         * 结算组织
         */
        public List<fSettleOrgId> FSettleOrgId;

        /**
         * 结算组织
         */
        @Data
        public static class fSettleOrgId {
            public String FNumber;
        }

        /**
         * 销售组织
         */
        public List<fSaleOrgId> FSaleOrgId;

        /**
         * 销售组织
         */
        @Data
        public static class fSaleOrgId {
            public String FNumber;
        }

        /**
         * 调出库存组织
         */
        @NotEmpty(message = "调出库存组织是必录项")
        public List<fStockOutOrgId> FStockOutOrgId;

        /**
         * 调出库存组织
         */
        @Data
        public static class fStockOutOrgId {
            public String FNumber;
        }

        /**
         * 调出货主类型
         */
        @NotNull(message = "调出货主类型是必录项")
        public String FOwnerTypeOutIdHead;
        /**
         * 调出货主
         */
        public fOwnerOutIdHead FOwnerOutIdHead;

        /**
         * 调出货主
         */
        @Data
        public static class fOwnerOutIdHead {
            public String FNumber;
        }

        /**
         * 调入库存组织
         */
        @NotEmpty(message = "调入库存组织是必录项")
        public List<fStockOrgId> FStockOrgId;

        /**
         * 调入库存组织
         */
        @Data
        public static class fStockOrgId {
            public String FNumber;
        }

        /**
         * 结算方式
         */
        public List<fSettleModeId> FSettleModeId;

        /**
         * 结算方式
         */
        @Data
        public static class fSettleModeId {
            public String FNumber;
        }

        /**
         * 是否含税
         */
        public boolean FIsIncludedTax;
        /**
         * 价外税
         */
        public boolean FIsPriceExcludeTax;
        /**
         * 汇率类型
         */
        public fExchangeTypeId FExchangeTypeId;

        /**
         * 汇率类型
         */
        @Data
        public static class fExchangeTypeId {
            public String FNUMBER;
        }

        /**
         * 调入货主类型
         */
        @NotNull(message = "调入货主类型是必录项")
        public String FOwnerTypeIdHead;
        /**
         * 结算币别
         */
        public fsettlecurrid FSETTLECURRID;

        /**
         * 结算币别
         */
        @Data
        public static class fsettlecurrid {
            public String FNUMBER;
        }

        /**
         * 汇率
         */
        public Integer FExchangeRate;
        /**
         * 调入货主
         */
        public fOwnerIdHead FOwnerIdHead;

        /**
         * 调入货主
         */
        @Data
        public static class fOwnerIdHead {
            public String FNumber;
        }

        /**
         * 仓管员
         */
        public List<fStockerId> FStockerId;

        /**
         * 仓管员
         */
        @Data
        public static class fStockerId {
            public String FNumber;
        }

        /**
         * 库存组
         */
        public List<fStockerGroupId> FStockerGroupId;

        /**
         * 库存组
         */
        @Data
        public static class fStockerGroupId {
            public String FNumber;
        }

        /**
         * 日期
         */
        @NotNull(message = "日期是必录项")
        public String FDate;

        /**
         * 本位币
         */
        public fBaseCurrId FBaseCurrId;

        @Data
        public static class fBaseCurrId {
            public String FNumber;
        }

        /**
         * 备注
         */
        public String FNote;
        /**
         * 对应供应商
         */
        public List<fsupplierid> FSUPPLIERID;

        /**
         * 对应供应商
         */
        @Data
        public static class fsupplierid {
            public String FNUMBER;
        }

        /**
         * 对应客户
         */
        public List<fCustID> FCustID;

        /**
         * 对应客户
         */
        @Data
        public static class fCustID {
            public String FNUMBER;
        }

        /**
         * 序列号上传
         */
        public String FScanBox;
        /**
         * 第三方系统
         */
        public String FThirdSystem;
        /**
         * 第三方源单编码
         */
        public String FThirdSrcBillNo;
        /**
         * 第三方源单内码
         */
        public String FThirdSrcId;
        /**
         * 冲减普通寄售调拔单结算数量
         */
        public boolean FWriteOffConsign;
        /**
         * 调出部门
         */
        public List<foutdeptid> FOUTDEPTID;

        /**
         * 调出部门
         */
        @Data
        public static class foutdeptid {
            public String FNUMBER;
        }

        /**
         * 调入部门
         */
        public List<foutdeptid> FINDEPTID;

        /**
         * 调入部门
         */
        @Data
        public static class findeptid {
            public String FNUMBER;
        }

        /**
         * 明细信息
         */
        @Valid
        @NotEmpty(message = "明细信息是必录项")
        public List<fBillEntry> FBillEntry;

        /**
         * 明细信息
         */
        @Data
        public static class fBillEntry {
            public Integer FEntryID;
            /**
             * 产品类型
             */
            public String FRowType;
            /**
             * 物料编码
             */
            @NotEmpty(message = "物料编码是必录项")
            public fMaterialId FMaterialId;

            /**
             * 物料编码
             */
            @Data
            public static class fMaterialId {
                public String FNumber;
            }

            /**
             * 父项产品
             */
            public List<fParentMatId> FParentMatId;

            /**
             * 父项产品
             */
            @Data
            public static class fParentMatId {
                public String FNUMBER;
            }

            /**
             * 辅助属性
             */
            @Data
            public static class FAuxPropId {
            }

            /**
             * 单位
             */
            @NotEmpty(message = "单位是必录项")
            public fUnitID FUnitID;

            /**
             * 单位
             */
            @Data
            public static class fUnitID {
                public String FNumber;
            }

            /**
             * 调拨数量
             */
            public String FQty;
            /**
             * 调出批号
             */
            public List<fLot> FLot;

            /**
             * 调出批号
             */
            @Data
            public static class fLot {
                public String FNumber;
            }

            /**
             * 调出仓库
             */
            public fSrcStockId FSrcStockId;

            /**
             * 调出仓库
             */
            @Data
            public static class fSrcStockId {
                public String FNumber;
            }

            /**
             * 调出仓位
             */
            @Data
            public static class FSrcStockLocId {
            }

            /**
             * 调入仓库
             */
            public fDestStockId FDestStockId;

            /**
             * 调入仓库
             */
            @Data
            public static class fDestStockId {
                public String FNumber;
            }

            /**
             * 调入仓位
             */
            @Data
            public static class FDestStockLocId {
            }

            /**
             * BOM版本
             */
            public List<fBomId> FBomId;

            /**
             * BOM版本
             */
            @Data
            public static class fBomId {
                public String FNumber;
            }

            /**
             * 调出库存状态
             */
            public fSrcStockStatusId FSrcStockStatusId;

            /**
             * 调出库存状态
             */
            @Data
            public static class fSrcStockStatusId {
                public String FNumber;
            }

            /**
             * 质量类型
             */
            public String FDeliChkQualifyType;
            /**
             * 生产日期
             */
            public String FProduceDate;
            /**
             * 调入库存状态
             */
            public fDestStockStatusId FDestStockStatusId;

            /**
             * 调入库存状态
             */
            @Data
            public static class fDestStockStatusId {
                public String FNumber;
            }

            /**
             * 计划跟踪号
             */
            public String FMtoNo;
            /**
             * 入库日期
             */
            public String FBusinessDate;
            /**
             * 有效期至
             */
            public String FExpiryDate;
            /**
             * 源单类型
             */
            public String FSrcBillTypeId;
            /**
             * 调出货主类型
             */
            public String FOwnerTypeOutId;
            /**
             * 调出货主
             */
            public fOwnerOutId FOwnerOutId;

            /**
             * 调出货主
             */
            @Data
            public static class fOwnerOutId {
                public String FNumber;
            }

            /**
             * 调入货主类型
             */
            public String FOwnerTypeId;
            /**
             * 调入货主
             */
            @NotEmpty(message = "调入货主是必录项")
            public fOwnerId FOwnerId;

            /**
             * 调入货主
             */
            @Data
            public static class fOwnerId {
                public String FNumber;
            }

            /**
             * 备注
             */
            public String FNoteEntry;
            /**
             * 源单编号
             */
            public String FSrcBillNo;
            /**
             * 项目编号
             */
            public String FProjectNo;
            /**
             * 库存辅单位
             */
            public List<fSecUnitId> FSecUnitId;

            /**
             * 库存辅单位
             */
            @Data
            public static class fSecUnitId {
                public String FNumber;
            }

            /**
             * 调拨数量（库存辅单位）
             */
            public Integer FSecQty;
            /**
             * 辅单位
             */
            public List<fExtAuxUnitId> FExtAuxUnitId;

            /**
             * 辅单位
             */
            @Data
            public static class fExtAuxUnitId {
                public String FNumber;
            }

            /**
             * 调拨数量（辅单位）
             */
            public Integer FExtAuxUnitQty;
            /**
             * 基本单位
             */
            public fBaseUnitId FBaseUnitId;

            /**
             * 基本单位
             */
            @Data
            public static class fBaseUnitId {
                public String FNumber;
            }

            /**
             * 调拨数量（基本单位）
             */
            public Integer FBaseQty;
            /**
             * 赠品
             */
            public boolean FISFREE;
            /**
             * 调入保管者类型
             */
            @NotNull(message = "调入保管者类型是必录项")
            public String FKeeperTypeId;
            /**
             * 实收数量
             */
            public Integer FActQty;
            /**
             * 调入保管者
             */
            public fKeeperId FKeeperId;

            /**
             * 调入保管者
             */
            @Data
            public static class fKeeperId {
                public String FNumber;
            }

            /**
             * 调出保管者类型
             */
            @NotNull(message = "调出保管者类型是必录项")
            public String FKeeperTypeOutId;
            /**
             * 调出保管者
             */
            @NotEmpty(message = "调出保管者是必录项")
            public fKeeperOutId FKeeperOutId;

            /**
             * 调出保管者
             */
            @Data
            public static class fKeeperOutId {
                public String FNumber;
            }

            /**
             * 折扣率%
             */
            public Integer FDiscountRate;
            /**
             * 补货数量
             */
            public Integer FRepairQty;
            /**
             * 退货备注
             */
            public String FRETURNNOTE;
            /**
             * 调入批号
             */
            public List<fDestLot> FDestLot;

            /**
             * 调入批号
             */
            @Data
            public static class fDestLot {
                public String FNumber;
            }

            /**
             * 调入物料
             */
            public fDestMaterialId FDestMaterialId;

            /**
             * 调入物料
             */
            @Data
            public static class fDestMaterialId {
                public String FNUMBER;
            }

            /**
             * 调入BOM
             */
            public List<fDestBomId> FDestBomId;

            /**
             * 调入BOM
             */
            @Data
            public static class fDestBomId {
                public String FNUMBER;
            }

            /**
             * 销售单位
             */
            public fSaleUnitId FSaleUnitId;

            /**
             * 销售单位
             */
            @Data
            public static class fSaleUnitId {
                public String FNumber;
            }

            /**
             * 销售数量
             */
            public Integer FSaleQty;
            /**
             * 销售基本数量
             */
            public Integer FSalBaseQty;
            /**
             * 计价单位
             */
            public fPriceUnitID FPriceUnitID;

            /**
             * 计价单位
             */
            @Data
            public static class fPriceUnitID {
                public String FNumber;
            }

            /**
             * 计价数量
             */
            public Integer FPriceQty;
            /**
             * 计价基本数量
             */
            public Integer FPriceBaseQty;
            /**
             * 关联出库数量
             */
            public Integer FOutJoinQty;
            /**
             * 关联出库数量（基本单位）
             */
            public Integer FBASEOUTJOINQTY;
            /**
             * 服务上下文
             */
            public Integer FServiceContext;
            /**
             * 销售订单EntryId
             */
            public Integer FSOEntryId;
            /**
             * 转移预留关系
             */
            public boolean FTransReserveLink;
            /**
             * 库存请检单EntryId
             */
            public Integer FQmEntryId;
            /**
             * 库存状态转换EntryId
             */
            public Integer FConvertEntryId;
            /**
             * 第三方源单分录编码
             */
            public String FThirdSrcEntryId;
            /**
             * 发货检验
             */
            public boolean FCheckDelivery;
            /**
             * BOM分录内码
             */
            public Integer FBomEntryId;
            /**
             * 序列号子单据体
             */
            public List<fSerialSubEntity> FSerialSubEntity;

            /**
             * 序列号子单据体
             */
            @Data
            public static class fSerialSubEntity {
                public Integer FDetailID;
                /**
                 * 序列号
                 */
                public String String;
                /**
                 * 备注
                 */
                public String FSerialNote;
            }
        }
    }
}
