package com.ruoyi.asset.domain;

import java.util.*;

import cn.hutool.core.util.CharsetUtil;
import cn.hutool.core.util.HexUtil;
import cn.hutool.core.util.RandomUtil;
import cn.hutool.core.util.StrUtil;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.asset.domain.dto.AssetEpcInfo;
import com.ruoyi.common.utils.MyUtils;
import lombok.*;
import com.ruoyi.common.annotation.Excel;
import com.ruoyi.common.core.domain.BaseEntity;

/**
 * 资产信息对象 tb_asset_information
 * 
 * @author 原动力
 * @date 2023-05-15
 */
@EqualsAndHashCode(callSuper = true)
@AllArgsConstructor
@NoArgsConstructor
@Data
@Builder
public class TbAssetInformation extends BaseEntity
{
    private static final long serialVersionUID = 1L;

    private List<String> nlist;

    /** 编号 */
    private Long id;

    /** 资产分类编号 */
    @Excel(name = "资产分类编号")
    private String categoryNumber;

    /** 分类名称 */
    @Excel(name = "资产分类名称（导出）")
    private String categoryName;

    /** 资产编号 */
    @Excel(name = "资产编号")
    private String number;

    /** 资产名称 */
    @Excel(name = "资产名称")
    private String name;

    /** 计量单位 */
    @Excel(name = "计量单位")
    private String units;

    /** 数量 */
    @Excel(name = "数量")
    private Integer quantity;

    /** 入账时间 */
    @JsonFormat(pattern = "yyyy-MM-dd")
    @Excel(name = "入账时间", width = 40, dateFormat = "yyyy-MM-dd")
    private Date paymentReceivingTime;

    /** 所在位置编号 */
    @Excel(name = "所在位置编号")
    private String locationNumber;
    /** 位置名称 */
    @Excel(name = "所在位置名称（导出）")
    private String locationName;

    /** 使用部门 */
    @Excel(name = "使用部门")
    private String userDepartment;

    /** 使用部门名称 */
    @Excel(name = "使用部门名称（导出）")
    private String userDepartmentName;


    /** 位置ID */
    private Long locationId;

    /** 位置标签 */
    @Excel(name = "所在位置标签（导出）")
    private String locationLabel;

    /** 位置ID */
    private Long parentLocationId;
    /** 位置ID */
    private Long ancestorLocationId;
    /** 资产条码 */
    @Excel(name = "资产条码")
    private String code;

    /** epc */
    @Excel(name = "epc")
    private String epc;

    /** epc补充长度 */
    private Integer epcReplenishLength;

    /** 图片路径 */
//    @Excel(name = "图片路径")
    private String imageUrl;

    /** 分类ID */
    private Long categoryId;

    /** 规格型号 */
    @Excel(name = "规格型号")
    private String specificationsModel;

    /** ABC分类 */
    @Excel(name = "ABC分类")
    private String abcCategory;

    /** 管理状态，0：闲置 */
    @Excel(name = "管理状态，0：正常，1：调整，2：调拨，3：借出，4：拆分，5：闲置，6：启用，7：报废，8：变卖")
    private Long manageStatus;

    /** 管理部门 */
    @Excel(name = "管理部门")
    private String department;

    /** 管理部门名称 */
    @Excel(name = "管理部门名称（导出）")
    private String departmentName;

    /** 责任人 */
    @Excel(name = "责任人")
    private String responsiblePerson;

    /** 资产性质 */
    @Excel(name = "资产性质")
    private String property;

    /** 购置日期 */
    @JsonFormat(pattern = "yyyy-MM-dd")
    @Excel(name = "购置日期", width = 40, dateFormat = "yyyy-MM-dd")
    private Date purchaseDate;

    /** 启用日期 */
    @JsonFormat(pattern = "yyyy-MM-dd")
    @Excel(name = "启用日期", width = 40, dateFormat = "yyyy-MM-dd")
    private Date commissioningDate;

    /** 原值（元） */
    @Excel(name = "原值", readConverterExp = "元=")
    private Double originalValue;

    /** 使用年限 */
    @Excel(name = "使用年限")
    private Long durableYears;

    /** 净值（元） */
    @Excel(name = "净值", readConverterExp = "元=")
    private Double netValue;

    /** 残值（元） */
    @Excel(name = "残值", readConverterExp = "元=")
    private Double residualValue;

    /** 累计折旧（元） */
    @Excel(name = "累计折旧", readConverterExp = "元=")
    private Double accumulatedDepreciation;

    /** 最近折旧日期 */
    @JsonFormat(pattern = "yyyy-MM-dd")
    @Excel(name = "最近折旧日期", width = 40, dateFormat = "yyyy-MM-dd")
    private Date lastDepreciationDate;

    /** 折旧方式，0：其他 */
    @Excel(name = "折旧方式，0：其他", width = 26)
    private Long depreciationMethod;

    /** 合同编号 */
    @Excel(name = "合同编号")
    private String contractNumber;

    /** 出厂编号 */
    @Excel(name = "出厂编号")
    private String factoryNumber;

    /** 制造商 */
    @Excel(name = "制造商")
    private String manufacturer;

    /** 供应商 */
    @Excel(name = "供应商")
    private String supplier;

    /** 资产用途 */
    @Excel(name = "资产用途")
    private String purpose;

    /** 维保到期日期 */
    @JsonFormat(pattern = "yyyy-MM-dd")
    @Excel(name = "维保到期日期", width = 40, dateFormat = "yyyy-MM-dd")
    private Date maintenanceDate;

    /** 维修电话 */
    @Excel(name = "维修电话")
    private String maintenanceTel;

    /** 维修人员 */
    @Excel(name = "维修人员")
    private String maintenanceUser;

    /** 所属公司 */
    @Excel(name = "所属公司")
    private String corporation;

    /** 使用公司名称 */
    @Excel(name = "所属公司名称（导出）")
    private String corporationName;

    /** 记录状态，0：未提交，1：已提交 */
    @Excel(name = "记录状态，0：未提交，1：已提交", width = 30)
    private Long recordStatus;

    /** 是否白名单 */
    @Excel(name = "是否白名单，Y：是，N：否", width = 30)
    private String isWhitelist;

    /** 预计使用期限 */
    @Excel(name = "预计使用期限")
    private Integer lifeExpectancy;

    /** 预计使用期限单位 */
    @Excel(name = "预计使用期限单位")
    private String lifeUnits;

    /** 开始使用日期 */
    @JsonFormat(pattern = "yyyy-MM-dd")
    @Excel(name = "开始使用日期", width = 40, dateFormat = "yyyy-MM-dd")
    private Date startDate;

    /** 子编码信息 */
    private List<AssetEpcInfo> childNumberInfo;

    /**
     * 设置epc相关信息
     */
    public void setEpcInfo() {
        // 将编码转为16进制 id达一千亿才24位字符
        String epc = HexUtil.encodeHexStr(String.valueOf(id), CharsetUtil.CHARSET_UTF_8);
        // epc补充位
        int epcReplenishLength = epc.length() % 4;
        int remainder = epcReplenishLength % 4;
        if (remainder != 0) {
            int padding = 4 - remainder;
            epc = epc + "0".repeat(padding);
        }
        // 将epc大写
        epc = epc.toUpperCase();

        setEpc(epc);
        setEpcReplenishLength(epcReplenishLength);
    }

    /**
     * 解析子编码EPC
     *
     * @param epc 子编码epc
     * @return 资产epc
     */
    public static String encodeChildEpc2Epc(String epc) {
        // 将epc转为编码
        String hexStr = HexUtil.decodeHexStr(epc);
        // 分割子编码
        String[] split = hexStr.split("-");
        // 将资产编码转换为epc split[0]=id
        epc = HexUtil.encodeHexStr(split[0], CharsetUtil.CHARSET_UTF_8);

        // epc补充位
        int epcReplenishLength = epc.length() % 4;
        int remainder = epcReplenishLength % 4;
        if (remainder != 0) {
            int padding = 4 - remainder;
            epc = epc + "0".repeat(padding);
        }

        // 将epc大写
        epc = epc.toUpperCase();

        return epc;
    }

    /**
     * 设置子编码
     */
    public void setChildNumberInfo() {
        List<AssetEpcInfo> assetEpcInfos = new ArrayList<>();

        if (quantity == null || quantity <= 1) {
            AssetEpcInfo assetEpcInfo = new AssetEpcInfo();
            assetEpcInfo.setNumber(number);
            assetEpcInfo.setEpc(epc);
            assetEpcInfo.setEpcReplenishLength(epcReplenishLength);

            assetEpcInfos.add(assetEpcInfo);

            setChildNumberInfo(assetEpcInfos);
            return;
        }

        for (int i = 1; i <= quantity; i++) {
            AssetEpcInfo assetEpcInfo = new AssetEpcInfo();

            String childNumberStr = number + "-" + i;
            assetEpcInfo.setNumber(childNumberStr);

            String childIdStr = id + "-" + i;
            // 将编码转为16进制
            String epc = HexUtil.encodeHexStr(childIdStr, CharsetUtil.CHARSET_UTF_8);
            // epc补充位
            int epcReplenishLength = epc.length() % 4;
            int remainder = epcReplenishLength % 4;
            if (remainder != 0) {
                int padding = 4 - remainder;
                epc = epc + "0".repeat(padding);
            }

            // 将epc大写
            epc = epc.toUpperCase();

            assetEpcInfo.setEpc(epc);
            assetEpcInfo.setEpcReplenishLength(epcReplenishLength);

            assetEpcInfos.add(assetEpcInfo);
        }

        setChildNumberInfo(assetEpcInfos);
    }
}
