有意思的代码

    将6个POJO中值整合到1个POJO中,大的POJO字段名和小的POJO不一致,实现做法

A:


public class JiupiOrder implements Serializable {

    /**
     * 订单编号
     */
    private BigInteger id;
    /**
     * 仓库编号
     */
    private Integer warehouse_Id;
    /**
     * 配送人编号
     */
    private Integer delivery_Id;
    /**
     * 卸货人编号
     */
    private Integer stevedore_Id;
    /**
     * 关联订单编号
     */
    private BigInteger relatedOrder_Id;
    /**
     * 酒批订单类型:普通订单(0),分销商订单(1)
     */
    private Integer jiupiOrderType;
    /**
     * 是否预售订单
     */
    private Integer isPreSale;
    /**
     * 酒批订单来源:合作商转酒批(0), 酒批订单(1),
     */
    private Integer jiupiOrderSource;
    /**
     * 仓管Id
     */
    private Integer storeAdmin_Id;
    /**
     * 末次更新时间
     */
    @IgnoreField
    private Timestamp lastModifyTime;

B:

public class OrderItem implements Serializable {
    private static final long serialVersionUID = 9049775047788595349L;
    /**
     * 订单项id
     */
    private BigInteger id;
    /**
     * 订单ID
     */
    private BigInteger orderId;
    /**
     * 订单项来源,XX活动
     */
    private Integer sourceType;
    /**
     * 来源ID
     */
    private BigInteger source_Id;
    /**
     * 普通商品(0),赠送商品(1),限时惠商品(2),加价购商品(3)
     */
    private Integer productType;
    /**
     * 最后修改时间
     */
    @IgnoreField
    private Date lastModifyTime;

C:

public class OrderItemAmount implements Serializable {
    private static final long serialVersionUID = 8889250027007274402L;

    /**
     * 订单项id
     */
    private BigInteger id;
    /**
     * 订单ID
     */
    private BigInteger orderId;
    /**
     * 商品优惠劵减价金额
     */
    private BigDecimal reduceCouponAmount;
    /**
     * 商品红包减价金额
     */
    private BigDecimal reduceBonusAmount;
    /**
     * 订单满减金额
     */
    private BigDecimal reduceOrderAmount;
    /**
     * 产品总价折扣=产品总价减价+商品优惠劵减价金额+商品红包减价金额+订单满减金额
     */
    private BigDecimal discount;
    /**
     * 产品总金额
     */
    private BigDecimal totalAmount;
    /**
     * 产品实付总金额
     */
    private BigDecimal payAmount;
    /**
     * 配送费
     */
    private BigDecimal deliveryAmount;
    /**
     * 销售数量
     */
    private Integer saleCount;
    /**
     * 销售数量小单位累计
     */
    private Integer minUnitTotalCount;
    /**
     * 自提优惠金额
     */
    private BigDecimal selfPickUpReduceAmount;
    /**
     * 兑奖红包减价金额
     */
    private BigDecimal reduceRewardBonusAmount;
    /**
     * 优惠码优惠金额
     */
    private BigDecimal reduceCouponCodeAmount;
    /**
     * 产品总价减价
     */
    private BigDecimal reduceProductAmount;

    /**
     * 最后修改时间
     */
    @IgnoreField
    private Date lastModifyTime;

D:


public class OrderItemPrice implements Serializable{
    private static final long serialVersionUID = -2470045089112016351L;
    /**
     * 订单项id
     */
    private BigInteger id;
    /**
     * 订单ID
     */
    private BigInteger orderId;
    /**
     * 销售价
     */
    private BigDecimal sellPrice;
    /**
     * 销售价单位
     */
    private String sellUnit;
    /**
     * 小单位价格
     */
    private BigDecimal minUnitPrice;
    /**
     * 小单位名称
     */
    private String minUnitName;

    /**
     * 最后修改时间
     */
    @IgnoreField
    private Date lastModifyTime;

   

E:

public class OrderItemProduct implements Serializable {

    private static final long serialVersionUID = -1114462513568729767L;

    /**
     * 订单项id
     */
    private BigInteger id;

    /**
     * 产品SKU id
     */
    private BigInteger productId;

    /**
     * 产品销售规格ID
     */
    private BigInteger ProductSaleSpec_Id;
    /**
     * 产品名称
     */
    private String productName;

    /**
     * 销售规格系数
     */
    private Integer saleSpecQuantity;

    /**
     * 销售规格单位
     */
    private String sellUnit;

    /**
     * 包装规格
     */
    private String productSpec;

    /**
     * 包装规格系数
     */
    private Integer specQuantity;

    /**
     * 大单位
     */
    private String packageName;

    /**
     * 小单位
     */
    private String unitName;

    /**
     * 供应商id
     */
    private Integer supplierId;

    /**
     * 销售模式
     */
    private Integer saleMode;

    /**
     * 订单id
     */
    private BigInteger orderId;

    /**
     * 产品业务类型,0,酒类,1,非酒类
     */
    private Integer productBusinessClass;

    /**
     * 最后修改时间
     */
    @IgnoreField
    private Date lastModifyTime;

  

F:

public class Orders implements Serializable {

    private static final long serialVersionUID = -1386379185614836343L;

    /**
     * 订单id
     */
    private BigInteger id;

    /**
     * 城市id
     */
    private Integer city_Id;

    /**
     * 订单编号
     */
    private String orderNo;


    /**
     * 订单类型 1:酒批 2: 合作商
     */
    private Integer orderType;

    /**
     * 订单类型 0:普通订单 1: 限时惠
     */
    private Integer orderClassify;

    /**
     * 订单状态
     */
    private Integer state;

    /**
     * 订单金额
     */
    private BigDecimal orderAmount;

    /**
     * 省
     */
    private String province;

    /**
     * 市
     */
    private String city;

    /**
     * 区
     */
    private String county;

    /**
     * 街道
     */
    private String street;

    /**
     * 详细地址
     */
    private String detailAddres;

    /**
     * 电话号码
     */
    private String phone;

    /**
     * 是否测试订单
     */
    private Boolean isTestOrder;

    /**
     * 用户id
     */
    private Integer userId;

    /**
     * 经纪人id
     */
    private Integer salemanId;

    /**
     * 配送模式
     */
    private Integer deliveryMode;

    /**
     * 下单时间
     */
    private Date orderCreateTime;

    /**
     * 下单审核时间
     */
    private Date orderAuditTime;

    /**
     * 订单发货时间
     */
    private Date orderDeliverTime;

    /**
     * 订单撤销时间
     */
    private Date orderCancelTime;

    /**
     * 订单完成时间
     */
    private Date orderCompleteTime;

    /**
     * 订单确认时间
     */
    private Date orderConfirmTime;

    /**
     * 订单的提交批次
     */
    private BigInteger OrderBatch_Id;
    /**
     * 用户名
     */
    private String userName;

    /**
     * 用户手机号
     */
    private String userMobileNo;

    /**
     * 客户的店铺名
     */
    private String userCompanyName;

    /**
     * 经销商店铺ID
     */
    private Integer shop_id;
    /**
     * 订单项数
     */
    private Integer orderItemCount;

    /**
     * 最后修改时间
     */
    @IgnoreField
    private Date lastModifyTime;

    /**
     * 订单明细项
     */
    private List<OrderItem> orderItemsList;
    /**
     * 订单明细项金额
     */
    private List<OrderItemAmount> orderItemAmountList;
    /**
     * 订单明细项价格
     */
    private List<OrderItemPrice> orderItemPriceList;
    /**
     * 订单明细项产品
     */
    private List<OrderItemProduct> orderItemProductList;

    /**
     * 酒批订单
     */
    private JiupiOrder jiupiOrder;

大表:

public class OrderDetailInfo implements Serializable {

    private static final long serialVersionUID = -2033526992975029350L;

    /**
     * 订单id
     */
    @OrderDetailInfoMapper(schema = OrderDetailInfoSchema.Order, fieldName = "id")
    private BigInteger orderId;
    /**
     * 城市id
     */
    @OrderDetailInfoMapper(schema = OrderDetailInfoSchema.Order, fieldName = "city_Id")
    private Integer orderCityId;

    /**
     * 订单编号
     */
    @OrderDetailInfoMapper(schema = OrderDetailInfoSchema.Order, fieldName = "orderNo")
    private String orderNo;

    /**
     * 订单类型 1:酒批 2: 合作商
     */
    @OrderDetailInfoMapper(schema = OrderDetailInfoSchema.Order, fieldName = "orderType")
    private Integer orderType;

    /**
     * 订单类型 0:普通订单 1: 限时惠
     */
    @OrderDetailInfoMapper(schema = OrderDetailInfoSchema.Order, fieldName = "orderClassify")
    private Integer orderClassify;

    /**
     * 订单状态
     */
    @OrderDetailInfoMapper(schema = OrderDetailInfoSchema.Order, fieldName = "state", fieldTranslateClass = {OrderStatusTranslate.class})
    private Integer orderState;

    /**
     * 订单金额
     */
    @OrderDetailInfoMapper(schema = OrderDetailInfoSchema.Order, fieldName = "orderAmount")
    private BigDecimal orderAmount;

    /**
     * 省
     */
    @OrderDetailInfoMapper(schema = OrderDetailInfoSchema.Order, fieldName = "province")
    private String orderProvince;

    /**
     * 市
     */
    @OrderDetailInfoMapper(schema = OrderDetailInfoSchema.Order, fieldName = "city")
    private String orderCity;

    /**
     * 区
     */
    @OrderDetailInfoMapper(schema = OrderDetailInfoSchema.Order, fieldName = "county")
    private String orderCounty;

    /**
     * 街道
     */
    @OrderDetailInfoMapper(schema = OrderDetailInfoSchema.Order, fieldName = "street")
    private String orderStreet;

    /**
     * 详细地址
     */
    @OrderDetailInfoMapper(schema = OrderDetailInfoSchema.Order, fieldName = "detailAddres")
    private String orderDetailAddres;

    /**
     * 电话号码
     */
    @OrderDetailInfoMapper(schema = OrderDetailInfoSchema.Order, fieldName = "phone")
    private String orderPhone;

    /**
     * 是否测试订单
     */
    @OrderDetailInfoMapper(schema = OrderDetailInfoSchema.Order, fieldName = "isTestOrder")
    private Boolean isTestOrder;

    /**
     * 用户id
     */
    @OrderDetailInfoMapper(schema = OrderDetailInfoSchema.Order, fieldName = "userId")
    private Integer orderUserId;

    /**
     * 经纪人id
     */
    @OrderDetailInfoMapper(schema = OrderDetailInfoSchema.Order, fieldName = "salemanId")
    private Integer orderSalemanId;

    /**
     * 配送模式
     */
    @OrderDetailInfoMapper(schema = OrderDetailInfoSchema.Order, fieldName = "deliveryMode")
    private Integer orderDeliveryMode;

    /**
     * 下单时间
     */
    @OrderDetailInfoMapper(schema = OrderDetailInfoSchema.Order, fieldName = "orderCreateTime")
    private Date orderCreateTime;

    /**
     * 下单审核时间
     */
    @OrderDetailInfoMapper(schema = OrderDetailInfoSchema.Order, fieldName = "orderAuditTime")
    private Date orderAuditTime;

    /**
     * 订单发货时间
     */
    @OrderDetailInfoMapper(schema = OrderDetailInfoSchema.Order, fieldName = "orderDeliverTime")
    private Date orderDeliverTime;

    /**
     * 订单撤销时间
     */
    @OrderDetailInfoMapper(schema = OrderDetailInfoSchema.Order, fieldName = "orderCancelTime")
    private Date orderCancelTime;

    /**
     * 订单完成时间
     */
    @OrderDetailInfoMapper(schema = OrderDetailInfoSchema.Order, fieldName = "orderCompleteTime")
    private Date orderCompleteTime;

    /**
     * 订单确认时间
     */
    @OrderDetailInfoMapper(schema = OrderDetailInfoSchema.Order, fieldName = "orderConfirmTime")
    private Date orderConfirmTime;

    /**
     * 订单的提交批次
     */
    @OrderDetailInfoMapper(schema = OrderDetailInfoSchema.Order, fieldName = "OrderBatch_Id")
    private BigInteger OrderBatchId;
    /**
     * 用户名
     */
    @OrderDetailInfoMapper(schema = OrderDetailInfoSchema.Order, fieldName = "userName")
    private String orderUserName;

    /**
     * 用户手机号
     */
    @OrderDetailInfoMapper(schema = OrderDetailInfoSchema.Order, fieldName = "userMobileNo")
    private String orderUserMobileNo;

    /**
     * 客户的店铺名
     */
    @OrderDetailInfoMapper(schema = OrderDetailInfoSchema.Order, fieldName = "userCompanyName")
    private String orderUserCompanyName;

    /**
     * 经销商店铺ID
     */
    @OrderDetailInfoMapper(schema = OrderDetailInfoSchema.Order, fieldName = "shop_id")
    private Integer orderShopId;
    /**
     * 订单项数
     */
    @OrderDetailInfoMapper(schema = OrderDetailInfoSchema.Order, fieldName = "orderItemCount")
    private Integer orderItemCount;


    /**
     * 订单项id
     */
    @OrderDetailInfoMapper(schema = OrderDetailInfoSchema.Item, fieldName = "id")
    private BigInteger itemId;

    /**
     * 订单项来源,XX活动
     */
    @OrderDetailInfoMapper(schema = OrderDetailInfoSchema.Item, fieldName = "sourceType")
    private Integer itemSourceType;
    /**
     * 来源ID
     */
    @OrderDetailInfoMapper(schema = OrderDetailInfoSchema.Item, fieldName = "source_Id")
    private BigInteger itemSourceId;
    /**
     * 普通商品(0),赠送商品(1),限时惠商品(2),加价购商品(3)
     */
    @OrderDetailInfoMapper(schema = OrderDetailInfoSchema.Item, fieldName = "productType")
    private Integer itemProductType;


    /**
     * 商品优惠劵减价金额
     */
    @OrderDetailInfoMapper(schema = OrderDetailInfoSchema.ItemAmount, fieldName = "reduceCouponAmount")
    private BigDecimal itemReduceCouponAmount;
    /**
     * 商品红包减价金额
     */
    @OrderDetailInfoMapper(schema = OrderDetailInfoSchema.ItemAmount, fieldName = "reduceBonusAmount")
    private BigDecimal itemReduceBonusAmount;
    /**
     * 订单满减金额
     */
    @OrderDetailInfoMapper(schema = OrderDetailInfoSchema.ItemAmount, fieldName = "reduceOrderAmount")
    private BigDecimal itemReduceOrderAmount;
    /**
     * 产品总价折扣=产品总价减价+商品优惠劵减价金额+商品红包减价金额+订单满减金额
     */
    @OrderDetailInfoMapper(schema = OrderDetailInfoSchema.ItemAmount, fieldName = "discount")
    private BigDecimal itemDiscount;
    /**
     * 产品总金额
     */
    @OrderDetailInfoMapper(schema = OrderDetailInfoSchema.ItemAmount, fieldName = "totalAmount")
    private BigDecimal itemTotalAmount;
    /**
     * 产品实付总金额
     */
    @OrderDetailInfoMapper(schema = OrderDetailInfoSchema.ItemAmount, fieldName = "payAmount")
    private BigDecimal itemPayAmount;
    /**
     * 配送费
     */
    @OrderDetailInfoMapper(schema = OrderDetailInfoSchema.ItemAmount, fieldName = "deliveryAmount")
    private BigDecimal itemDeliveryAmount;
    /**
     * 销售数量
     */
    @OrderDetailInfoMapper(schema = OrderDetailInfoSchema.ItemAmount, fieldName = "saleCount")
    private Integer itemSaleCount;
    /**
     * 销售数量小单位累计
     */
    @OrderDetailInfoMapper(schema = OrderDetailInfoSchema.ItemAmount, fieldName = "minUnitTotalCount")
    private Integer itemMinUnitTotalCount;
    /**
     * 自提优惠金额
     */
    @OrderDetailInfoMapper(schema = OrderDetailInfoSchema.ItemAmount, fieldName = "selfPickUpReduceAmount")
    private BigDecimal itemSelfPickUpReduceAmount;
    /**
     * 兑奖红包减价金额
     */
    @OrderDetailInfoMapper(schema = OrderDetailInfoSchema.ItemAmount, fieldName = "reduceRewardBonusAmount")
    private BigDecimal itemReduceRewardBonusAmount;
    /**
     * 优惠码优惠金额
     */
    @OrderDetailInfoMapper(schema = OrderDetailInfoSchema.ItemAmount, fieldName = "reduceCouponCodeAmount")
    private BigDecimal itemReduceCouponCodeAmount;
    /**
     * 产品总价减价
     */
    @OrderDetailInfoMapper(schema = OrderDetailInfoSchema.ItemAmount, fieldName = "reduceProductAmount")
    private BigDecimal itemReduceProductAmount;


    /**
     * 销售价
     */
    @OrderDetailInfoMapper(schema = OrderDetailInfoSchema.ItemPrice, fieldName = "sellPrice")
    private BigDecimal itemSellPrice;
    /**
     * 销售价单位
     */
    @OrderDetailInfoMapper(schema = OrderDetailInfoSchema.ItemPrice, fieldName = "sellUnit")
    private String itemSellUnit;
    /**
     * 小单位价格
     */
    @OrderDetailInfoMapper(schema = OrderDetailInfoSchema.ItemPrice, fieldName = "minUnitPrice")
    private BigDecimal itemMinUnitPrice;
    /**
     * 小单位名称
     */
    @OrderDetailInfoMapper(schema = OrderDetailInfoSchema.ItemPrice, fieldName = "minUnitName")
    private String itemMinUnitName;


    /**
     * 产品SKU id
     */
    @OrderDetailInfoMapper(schema = OrderDetailInfoSchema.ItemProduct, fieldName = "productId")
    private BigInteger itemProductId;

    /**
     * 产品销售规格ID
     */
    @OrderDetailInfoMapper(schema = OrderDetailInfoSchema.ItemProduct, fieldName = "ProductSaleSpec_Id")
    private BigInteger itemProductSaleSpecId;
    /**
     * 产品名称
     */
    @OrderDetailInfoMapper(schema = OrderDetailInfoSchema.ItemProduct, fieldName = "productName")
    private String itemProductName;

    /**
     * 销售规格系数
     */
    @OrderDetailInfoMapper(schema = OrderDetailInfoSchema.ItemProduct, fieldName = "saleSpecQuantity")
    private Integer itemProductSaleSpecQuantity;

    /**
     * 销售规格单位
     */
    @OrderDetailInfoMapper(schema = OrderDetailInfoSchema.ItemProduct, fieldName = "sellUnit")
    private String itemProductSellUnit;

    /**
     * 包装规格
     */
    @OrderDetailInfoMapper(schema = OrderDetailInfoSchema.ItemProduct, fieldName = "productSpec")
    private String itemProductSpec;

    /**
     * 包装规格系数
     */
    @OrderDetailInfoMapper(schema = OrderDetailInfoSchema.ItemProduct, fieldName = "specQuantity")
    private Integer itemProductSpecQuantity;

    /**
     * 大单位
     */
    @OrderDetailInfoMapper(schema = OrderDetailInfoSchema.ItemProduct, fieldName = "packageName")
    private String itemProductPackageName;

    /**
     * 小单位
     */
    @OrderDetailInfoMapper(schema = OrderDetailInfoSchema.ItemProduct, fieldName = "unitName")
    private String itemProductUnitName;

    /**
     * 供应商id
     */
    @OrderDetailInfoMapper(schema = OrderDetailInfoSchema.ItemProduct, fieldName = "supplierId")
    private Integer itemProductSupplierId;

    /**
     * 销售模式
     */
    @OrderDetailInfoMapper(schema = OrderDetailInfoSchema.ItemProduct, fieldName = "saleMode")
    private Integer itemProductSaleMode;

    /**
     * 销售模式大类
     */
    @OrderDetailInfoMapper(schema = OrderDetailInfoSchema.ItemProduct, fieldName = "saleMode", fieldTranslateClass = {OrderSaleModeCategoryTranslate.class})
    private Integer itemProductSaleModeCategory;

    /**
     * 产品业务类型,0,酒类,1,非酒类
     */
    @OrderDetailInfoMapper(schema = OrderDetailInfoSchema.ItemProduct, fieldName = "productBusinessClass")
    private Integer itemProductBusinessClass;


    /**
     * 仓库编号
     */
    @OrderDetailInfoMapper(schema = OrderDetailInfoSchema.Jiupi, fieldName = "warehouse_Id")
    private Integer jiupiOrderWarehouseId;
    /**
     * 配送人编号
     */
    @OrderDetailInfoMapper(schema = OrderDetailInfoSchema.Jiupi, fieldName = "delivery_Id")
    private Integer jiupiOrderDeliveryId;
    /**
     * 卸货人编号
     */
    @OrderDetailInfoMapper(schema = OrderDetailInfoSchema.Jiupi, fieldName = "stevedore_Id")
    private Integer jiupiOrderStevedoreId;
    /**
     * 关联订单编号
     */
    @OrderDetailInfoMapper(schema = OrderDetailInfoSchema.Jiupi, fieldName = "relatedOrder_Id")
    private BigInteger jiupiOrderRelatedOrderId;
    /**
     * 酒批订单类型:普通订单(0),分销商订单(1)
     */
    @OrderDetailInfoMapper(schema = OrderDetailInfoSchema.Jiupi, fieldName = "jiupiOrderType")
    private Integer jiupiOrderType;
    /**
     * 是否预售订单
     */
    @OrderDetailInfoMapper(schema = OrderDetailInfoSchema.Jiupi, fieldName = "isPreSale")
    private Integer jiupiOrderIsPreSale;
    /**
     * 酒批订单来源:合作商转酒批(0), 酒批订单(1),
     */
    @OrderDetailInfoMapper(schema = OrderDetailInfoSchema.Jiupi, fieldName = "jiupiOrderSource")
    private Integer jiupiOrderSource;
    /**
     * 仓管Id
     */
    @OrderDetailInfoMapper(schema = OrderDetailInfoSchema.Jiupi, fieldName = "storeAdmin_Id")
    private Integer jiupiOrderStoreAdminId;

枚举类:


public enum OrderDetailInfoSchema {

    Order("o"), Jiupi("j"), Item("i"), ItemAmount("a"), ItemPrice("p"), ItemProduct("u"), LastModifyFlag("f");

    private String familyName;

    private OrderDetailInfoSchema(String familyName) {
        this.familyName = familyName;
    }

    @Override
    public String toString() {
        return familyName;
    }
}

注解类:



@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface OrderDetailInfoMapper {

    /**
     * 属于哪个列族
     *
     * @return
     */
    OrderDetailInfoSchema schema();

    /**
     * 原表中的字段名称
     *
     * @return
     */
    String fieldName();

    /**
     * 对应字段的转换类
     *
     * @return
     */
    Class<? extends IFieldTranslate<?>>[] fieldTranslateClass() default {};
}

package com.yjp.himalaya.stream.model.business;

import java.lang.annotation.*;

/**
 * 标记update时是否是自己感兴趣的字段时忽略
 *
 */
@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface IgnoreField {
    boolean isIgnore() default true;
}

接口类:

package com.yjp.himalaya.stream.model.hbase;

public interface IFieldTranslate<Input> {
    Object translate(Input inputObject);
}

接口现实类:


public class OrderSaleModeCategoryTranslate implements IFieldTranslate<OrderItemProduct> {
    @Override
    public Integer translate(OrderItemProduct inputObject) {
        if (inputObject.getSaleMode() == 0 || inputObject.getSaleMode() == 4) {
            return 1;
        }
        return null;
    }
}

实现方法:

Map<OrderDetailInfoSchema, Map<String, Field>> enumMap = new HashMap<>(6);
Map<Class, OrderDetailInfoSchema> enumClass = new HashMap<>(6);

{
    enumMap.put(OrderDetailInfoSchema.Order, new HashMap<>());
    enumMap.put(OrderDetailInfoSchema.Jiupi, new HashMap<>());
    enumMap.put(OrderDetailInfoSchema.Item, new HashMap<>());
    enumMap.put(OrderDetailInfoSchema.ItemAmount, new HashMap<>());
    enumMap.put(OrderDetailInfoSchema.ItemPrice, new HashMap<>());
    enumMap.put(OrderDetailInfoSchema.ItemProduct, new HashMap<>());


    enumClass.put(Orders.class, OrderDetailInfoSchema.Order);
    enumClass.put(JiupiOrder.class, OrderDetailInfoSchema.Jiupi);
    enumClass.put(OrderItem.class, OrderDetailInfoSchema.Item);
    enumClass.put(OrderItemAmount.class, OrderDetailInfoSchema.ItemAmount);
    enumClass.put(OrderItemPrice.class, OrderDetailInfoSchema.ItemPrice);
    enumClass.put(OrderItemProduct.class, OrderDetailInfoSchema.ItemProduct);
}


protected List<OrderDetailInfo> buildHbaseObject(Orders orders) throws IllegalAccessException, InstantiationException, NoSuchFieldException, NoSuchMethodException, InvocationTargetException {
    List<Field> transFields = new ArrayList<>();
    Field[] infoFields = OrderDetailInfo.class.getDeclaredFields();
    for (Field infoField : infoFields) {
        OrderDetailInfoMapper orderDetailInfoMapper = infoField.getAnnotation(OrderDetailInfoMapper.class);
        if (null != orderDetailInfoMapper) {
            //field  字段映射中的字段名
            String field = orderDetailInfoMapper.fieldName();
            OrderDetailInfoSchema orderDetailInfoSchema = orderDetailInfoMapper.schema();
            Class<? extends IFieldTranslate<?, ?>>[]
                    classes = orderDetailInfoMapper.fieldTranslateClass();
            if (classes.length == 0) {
                //将字段映射中的字段名 和本来的字段名关联
                enumMap.get(orderDetailInfoSchema).put(field, infoField);
            } else {
                transFields.add(infoField);
            }

        }
    }

    int num = orders.getOrderItemsList().size();
    List<OrderDetailInfo> orderDetailInfos = new ArrayList<>(num);
    for (int i = 0; i < num; i++) {
        OrderDetailInfo orderDetailInfo = new OrderDetailInfo();
        assignmentOrderDetailInfo(orders.getOrderItemsList().get(i), orderDetailInfo);
        assignmentOrderDetailInfo(orders.getOrderItemAmountList().get(i), orderDetailInfo);
        assignmentOrderDetailInfo(orders.getOrderItemPriceList().get(i), orderDetailInfo);
        assignmentOrderDetailInfo(orders.getOrderItemProductList().get(i), orderDetailInfo);
        assignmentOrderDetailInfo(orders.getJiupiOrder(), orderDetailInfo);
        assignmentOrderDetailInfo(orders, orderDetailInfo);
        //用方法设值的字段
        for (Field field : transFields) {
            OrderDetailInfoSchema orderDetailInfoSchema = field.getAnnotation(OrderDetailInfoMapper.class).schema();
            Class<? extends IFieldTranslate<?, ?>>[]
                    classes = field.getAnnotation(OrderDetailInfoMapper.class).fieldTranslateClass();
            Object value = null;
            for (Map.Entry<Class, OrderDetailInfoSchema> entry : enumClass.entrySet()) {
                if (entry.getValue() == orderDetailInfoSchema) {
                    Method method = classes[0].getDeclaredMethod("translate");
                    value = method.invoke(entry.getKey());
                    break;
                }
            }
            field.set(orderDetailInfo, value);
        }
        orderDetailInfos.add(orderDetailInfo);
    }
    //存成一个静态的mapping表

    //先要根据四个item,把OrderDetailInfo创建出来

    //反射order

    //反射OrderDetailInfo

    //根据order中的所有字段,排除ignorefield,剩余的字段全部根据OrderDetailInfo中的所有用于如下条件的枚举的字段(Order),然后根据对应的值进行反射设值。注意如果有转换方法,要先调用转换方法,再赋值

    //然后再依次处理OrderItem, OrderItemProduct....

    //最后把所有未用的字段用warning打印出来

    return orderDetailInfos;
}

private OrderDetailInfo assignmentOrderDetailInfo(Object item, OrderDetailInfo orderDetailInfo) throws IllegalAccessException, NoSuchFieldException {
    Field[] itemFields = item.getClass().getDeclaredFields();
    HashMap<String, Field> itemMap = (HashMap<String, Field>) enumMap.get(enumClass.get(item.getClass()));
    for (Field field : itemFields) {
        IgnoreField ignoreField = field.getAnnotation(IgnoreField.class);
        if (ignoreField == null) {
            field.setAccessible(true);
            //infoField  OrderDetailInfo中对应的字段
            Field infoField = itemMap.get(field.getName());
            if (infoField != null) {
                //传入对象的字段的值 field
                field.get(item);
                infoField.setAccessible(true);
                //赋值
                infoField.set(orderDetailInfo, field.get(item));
            } else {
                LOG.warn("字段未映射{}", field);
            }
        }
    }
    return orderDetailInfo;
}


猜你喜欢

转载自blog.csdn.net/yidan7063/article/details/79807772