public with sharing class CheckAllOlympusAssetController {
    public static Asset StaticAssetQuertResult;
    // 按钮区域
    public String assertQueryCondition {get; private set;}
    public Boolean allBlueFlag {get; private set;}  // 查看全部保有设备蓝色按钮Flag
    public Boolean consumableBlueFlag {get; private set;}  // 查看在库的保有设备蓝色按钮Flag
    public Boolean lendingBlueFlag {get; private set;}  // 查看出借中保有设备蓝色按钮Flag
    public Boolean repairingBlueFlag {get; private set;}  // 查看修理中保有设备蓝色按钮Flag
    public Boolean scrappingBlueFlag {get; private set;}  // 查看待报废保有设备蓝色按钮Flag
    public Boolean scrappedBlueFlag {get; private set;}  //查看已报废保有设备蓝色按钮Flag
    public Boolean consumedBlueFlag {get; private set;}  //查看已消耗的保有设备
    public Boolean soonExpiredBlueFlag {get; private set;} //查看即将到期的保有设备
    public Boolean expiredBlueFlag {get; private set;}  //查看已过期的保有设备

    public Boolean angecylookrole {get; private set;} //办事处查看权限 20210628 you 1650
    // 检索区域
    public static final String NONE = system.label.StartTrading_None;  // 「なし」ラベル [Chinese:--无--]
    public String internalAssetLocation;  // 后台使用的
    public String internalAssetLocationLogin {get; set;}  // login的备品存放地
    public String internalAssetLocationSet {get; set;}  // 备品存放地 Internal_asset_location__c
    public String beipinCunFangDi {get; set;}  // 备品存放地

    public SearchBean searchB {get; set;} // 检索用Bean

    // 备品存放地 检索条件设置区
    public List<SelectOption> internalAssetLocationOptionList {
        get {
            if (internalAssetLocationOptionList == null) {
                internalAssetLocationOptionList = getPlickList('Asset', 'Internal_asset_location__c');
            }
            return internalAssetLocationOptionList;
        }
        set;
    }

    // 备品存放地 数据适用区
    public List<SelectOption> internalAssetDataLocationOptionList {
        get {
            if (internalAssetDataLocationOptionList == null) {
                internalAssetDataLocationOptionList = getPlickList('Asset', 'Internal_asset_location__c');
            }
            return internalAssetDataLocationOptionList;
        }
        set;
    }

    public String assetStatus {get; set;}  // 备品状态 Asset_Status__c 左侧快捷按钮
    public String assetStatus1 {get; set;}  // 备品状态 Asset_Status__c 右侧检索区的
    public List<SelectOption> assetStatusOptionList {
        get {
            // FIXME StartTrading_None を使う、--なし-- はNGでしょう
            List<SelectOption> selectOptions = new List<SelectOption> { new SelectOption(NONE, NONE) };
            //无保有
            selectOptions.add(new SelectOption(FixtureUtil.assetFixtureStatusMap.get(FixtureUtil.AssetFixtureStatus.Wu_Bao_You.ordinal()), FixtureUtil.assetFixtureStatusMap.get(FixtureUtil.AssetFixtureStatus.Wu_Bao_You.ordinal())));
            //无库存
            selectOptions.add(new SelectOption(FixtureUtil.assetFixtureStatusMap.get(FixtureUtil.AssetFixtureStatus.Mei_You_Ku_Cun.ordinal()), FixtureUtil.assetFixtureStatusMap.get(FixtureUtil.AssetFixtureStatus.Mei_You_Ku_Cun.ordinal())));
            //可分配
            selectOptions.add(new SelectOption(FixtureUtil.assetFixtureStatusMap.get(FixtureUtil.AssetFixtureStatus.Ke_Yi_Fen_Pei.ordinal()), FixtureUtil.assetFixtureStatusMap.get(FixtureUtil.AssetFixtureStatus.Ke_Yi_Fen_Pei.ordinal())));
            //暂定分配
            selectOptions.add(new SelectOption(FixtureUtil.assetFixtureStatusMap.get(FixtureUtil.AssetFixtureStatus.Zan_Ding_Fen_Pei.ordinal()), FixtureUtil.assetFixtureStatusMap.get(FixtureUtil.AssetFixtureStatus.Zan_Ding_Fen_Pei.ordinal())));
            //已出库指示
            selectOptions.add(new SelectOption(FixtureUtil.assetFixtureStatusMap.get(FixtureUtil.AssetFixtureStatus.Yi_Chu_Ku_Zhi_Shi.ordinal()), FixtureUtil.assetFixtureStatusMap.get(FixtureUtil.AssetFixtureStatus.Yi_Chu_Ku_Zhi_Shi.ordinal())));
            //已下架
            selectOptions.add(new SelectOption(FixtureUtil.assetFixtureStatusMap.get(FixtureUtil.AssetFixtureStatus.Yi_Xia_Jia.ordinal()), FixtureUtil.assetFixtureStatusMap.get(FixtureUtil.AssetFixtureStatus.Yi_Xia_Jia.ordinal())));
            //出库前已检测
            selectOptions.add(new SelectOption(FixtureUtil.assetFixtureStatusMap.get(FixtureUtil.AssetFixtureStatus.Chu_Ku_Qian_Yi_Jian_Ce.ordinal()), FixtureUtil.assetFixtureStatusMap.get(FixtureUtil.AssetFixtureStatus.Chu_Ku_Qian_Yi_Jian_Ce.ordinal())));
            //已出库
            selectOptions.add(new SelectOption(FixtureUtil.assetFixtureStatusMap.get(FixtureUtil.AssetFixtureStatus.Yi_Chu_Ku.ordinal()), FixtureUtil.assetFixtureStatusMap.get(FixtureUtil.AssetFixtureStatus.Yi_Chu_Ku.ordinal())));
            //申请者已收货
            selectOptions.add(new SelectOption(FixtureUtil.assetFixtureStatusMap.get(FixtureUtil.AssetFixtureStatus.Shen_Qing_Zhe_Yi_Shou_Huo.ordinal()), FixtureUtil.assetFixtureStatusMap.get(FixtureUtil.AssetFixtureStatus.Shen_Qing_Zhe_Yi_Shou_Huo.ordinal())));
            //申请者收货NG
            selectOptions.add(new SelectOption(FixtureUtil.assetFixtureStatusMap.get(FixtureUtil.AssetFixtureStatus.Shen_Qing_Zhe_Shou_Huo_NG.ordinal()), FixtureUtil.assetFixtureStatusMap.get(FixtureUtil.AssetFixtureStatus.Shen_Qing_Zhe_Shou_Huo_NG.ordinal())));
            //医院已装机确认
            selectOptions.add(new SelectOption(FixtureUtil.assetFixtureStatusMap.get(FixtureUtil.AssetFixtureStatus.Yi_Yuan_Yi_Zhuang_Ji_Que_Ren.ordinal()), FixtureUtil.assetFixtureStatusMap.get(FixtureUtil.AssetFixtureStatus.Yi_Yuan_Yi_Zhuang_Ji_Que_Ren.ordinal())));
            //已回寄
            selectOptions.add(new SelectOption(FixtureUtil.assetFixtureStatusMap.get(FixtureUtil.AssetFixtureStatus.Yi_Hui_Ji.ordinal()), FixtureUtil.assetFixtureStatusMap.get(FixtureUtil.AssetFixtureStatus.Yi_Hui_Ji.ordinal())));
            //欠品中
            selectOptions.add(new SelectOption(FixtureUtil.assetFixtureStatusMap.get(FixtureUtil.AssetFixtureStatus.Qian_Pin_Zhong.ordinal()), FixtureUtil.assetFixtureStatusMap.get(FixtureUtil.AssetFixtureStatus.Qian_Pin_Zhong.ordinal())));
            //已回收
            selectOptions.add(new SelectOption(FixtureUtil.assetFixtureStatusMap.get(FixtureUtil.AssetFixtureStatus.Yi_Hui_Shou.ordinal()), FixtureUtil.assetFixtureStatusMap.get(FixtureUtil.AssetFixtureStatus.Yi_Hui_Shou.ordinal())));
            //回收后已CDS
            selectOptions.add(new SelectOption(FixtureUtil.assetFixtureStatusMap.get(FixtureUtil.AssetFixtureStatus.Hui_Shou_Hou_Yi_CDS.ordinal()), FixtureUtil.assetFixtureStatusMap.get(FixtureUtil.AssetFixtureStatus.Hui_Shou_Hou_Yi_CDS.ordinal())));
            //待上架
            selectOptions.add(new SelectOption(FixtureUtil.assetFixtureStatusMap.get(FixtureUtil.AssetFixtureStatus.Dai_Shang_Jia.ordinal()), FixtureUtil.assetFixtureStatusMap.get(FixtureUtil.AssetFixtureStatus.Dai_Shang_Jia.ordinal())));
            //待移至报废区
            selectOptions.add(new SelectOption(FixtureUtil.assetFixtureStatusMap.get(FixtureUtil.AssetFixtureStatus.Yi_Zhi_Bao_Fei_Qu.ordinal()), FixtureUtil.assetFixtureStatusMap.get(FixtureUtil.AssetFixtureStatus.Yi_Zhi_Bao_Fei_Qu.ordinal())));
            //待废弃
            selectOptions.add(new SelectOption(FixtureUtil.assetFixtureStatusMap.get(FixtureUtil.AssetFixtureStatus.Dai_Fei_Qi.ordinal()), FixtureUtil.assetFixtureStatusMap.get(FixtureUtil.AssetFixtureStatus.Dai_Fei_Qi.ordinal())));
            //废弃
            selectOptions.add(new SelectOption(FixtureUtil.assetFixtureStatusMap.get(FixtureUtil.AssetFixtureStatus.Fei_Qi.ordinal()), FixtureUtil.assetFixtureStatusMap.get(FixtureUtil.AssetFixtureStatus.Fei_Qi.ordinal())));
            //修理草案中
            selectOptions.add(new SelectOption(FixtureUtil.assetFixtureStatusMap.get(FixtureUtil.AssetFixtureStatus.Xiu_Li_Cao_An_Zhong.ordinal()), FixtureUtil.assetFixtureStatusMap.get(FixtureUtil.AssetFixtureStatus.Xiu_Li_Cao_An_Zhong.ordinal())));
            //修理中
            selectOptions.add(new SelectOption(FixtureUtil.assetFixtureStatusMap.get(FixtureUtil.AssetFixtureStatus.Xiu_Li_Zhong.ordinal()), FixtureUtil.assetFixtureStatusMap.get(FixtureUtil.AssetFixtureStatus.Xiu_Li_Zhong.ordinal())));
            //冻结
            selectOptions.add(new SelectOption(FixtureUtil.assetFixtureStatusMap.get(FixtureUtil.AssetFixtureStatus.Dong_Jie.ordinal()), FixtureUtil.assetFixtureStatusMap.get(FixtureUtil.AssetFixtureStatus.Dong_Jie.ordinal())));
            //丢失
            selectOptions.add(new SelectOption(FixtureUtil.assetFixtureStatusMap.get(FixtureUtil.AssetFixtureStatus.Diu_Shi.ordinal()), FixtureUtil.assetFixtureStatusMap.get(FixtureUtil.AssetFixtureStatus.Diu_Shi.ordinal())));

            return selectOptions;
        }
    }
    public List<SelectOption> bodyOrAccessoryOptionList {
        get {
            List<SelectOption> selectOptions = new List<SelectOption> { new SelectOption(NONE, NONE) };
            //主体
            selectOptions.add(new SelectOption('主体', '主体'));
            //附属品
            selectOptions.add(new SelectOption('附属品', '附属品'));

            return selectOptions;
        }
    }
    //public String limits {get; set;}
    public List<SelectOption> limitOpts {
        get {
            //List<SelectOption> limitOpts = new List<SelectOption> { new SelectOption(NONE, NONE) };
            List<SelectOption> limitOpts = new List<SelectOption>();
            //limitOpts.add(new SelectOption('2','2'));
            limitOpts.add(new SelectOption('10','10'));
            limitOpts.add(new SelectOption('50','50'));
            limitOpts.add(new SelectOption('100','100'));
            limitOpts.add(new SelectOption('200','200'));

            return limitOpts;
        }
    }

    // 分公司号PlickList
    public List<SelectOption> companyOfEquipmentOpts {
        get {
            if (companyOfEquipmentOpts == null) {
                companyOfEquipmentOpts = getPlickList('Asset', 'CompanyOfEquipment__c');
            }
            return companyOfEquipmentOpts;
        }
        set;
    }

    //  产品分类PlickList
    public List<SelectOption> product_categoryOpts {
        get {
            if (product_categoryOpts == null) {
                product_categoryOpts = getPlickList('Asset', 'Product_category__c');
            }
            return product_categoryOpts;
        }
        set;
    }

    // 备品分类PlickList
    public List<SelectOption> equipment_TypeOpts {
        get {
            if (equipment_TypeOpts == null) {
                equipment_TypeOpts = getPlickList('Asset', 'Equipment_Type__c');
            }
            return equipment_TypeOpts;
        }
        set;
    }

    // 管理种类PlickList
    public List<SelectOption> manage_typeOpts {
        get {
            if (manage_typeOpts == null) {
                manage_typeOpts = getPlickList('Asset', 'Manage_type__c');
            }
            return manage_typeOpts;
        }
        set;
    }

    // 所在地区(本部)PlickList
    public List<SelectOption> salesdepartmentOpts {
        get {
            if (salesdepartmentOpts == null) {
                salesdepartmentOpts = getPlickList('Asset', 'Salesdepartment__c');
            }
            return salesdepartmentOpts;
        }
        set;
    }

    // 所在地区(省)PlickList
    public List<SelectOption> salesProvinceOpts {
        get {
            if (salesProvinceOpts == null) {
                salesProvinceOpts = getPlickList('Asset', 'SalesProvince__c');
            }
            return salesProvinceOpts;
        }
        set;
    }
    // 备品类别PlickList
    public List<SelectOption> assetLoanerCategoryOpts {
        get {
            if(assetLoanerCategoryOpts == null){
                assetLoanerCategoryOpts = new List<SelectOption>();
                assetLoanerCategoryOpts.add(new SelectOption('', NONE));
                assetLoanerCategoryOpts.add(new SelectOption('备品', '备品'));
                assetLoanerCategoryOpts.add(new SelectOption('耗材', '耗材'));
            }
            return assetLoanerCategoryOpts;
        }
        set;
    }
    // 到期时间picklist
    public List<SelectOption> daysToExpiredOpts {
        get {
            if(daysToExpiredOpts == null){
                daysToExpiredOpts = new List<SelectOption>();
                daysToExpiredOpts.add(new SelectOption('', NONE));
                daysToExpiredOpts.add(new SelectOption('7', '一周内到期'));
                daysToExpiredOpts.add(new SelectOption('14', '两周内到期'));
            }
            return daysToExpiredOpts;
        }
        set;
    }

    private String targetColumusStr;  // SOQL中的检索列

    // 项目set 字段标签
    public List<String> leftLabelList {get; private set;}
    public List<String> rightLabelList {get; private set;}
    public List<String> allLabelList {get; private set;}
    public Integer leftLabelSize {
        get {
            return leftLabelList.size();
        }
    }
    // 项目set 字段名
    public List<List<String>> leftApiList {get; private set;}  // 参照項目用
    public List<List<String>> rightApiList {get; private set;}  // 参照項目用
    public List<String> allApiList {get; private set;}  // 参照項目用
    public Integer eachLineSize {get; set;}
    public List<String> apiTypeIsReferenceList {get; set;}  // 判断api是否为参照关系

    public List<String> columnLeftCssList {get; private set;}  // css 用
    public List<String> columnRightCssList {get; private set;}  // css 用
    public Map<String, String> columnLeftRWMap {get; private set;}  // r,w,wm用
    public Map<String, String> columnRightRWMap {get; private set;}  // r,w,wm用
    private Map<String, String> DESC_RW = null;
    public String setInternalAssetLocation {get; set;}  // 设置备品存放地
    public String setAssetType {get; set;}  // 设置备品分类
    public List<String> canChangeFlagList {get; set;}  // 是否可编辑
    public String isSavingSuccess {get; set;}  // 保存flag
    public Asset assetSetting {get; set;}  // 设置用
    public List<Asset> allAssetDataList {get; set;}  // 明细结果(不包括checkoutbox)
    public Integer getAllAssetDataListSize() {  // 明细条数
        return allAssetInfoList.size();
    }
    public List<AssetInfo> allAssetInfoList {get; set;}  // 明细结果(包括checkoutbox)
    public List<Asset> assetExportCsvList {get; set;}  // 明细结果(导出CSV)
    public List<List<String>> exportCsvResultList {get; set;}

    public String changeFlg {get; set;}  // 监视刷新画面前是否存在未保持的值
    public Boolean searchFromBtn {get; private set;}  // 是否来自快捷键进行检索
    public Boolean searchFromSave {get; private set;}  // 是否来自保存进行检索
    public Boolean onlyReadFlag {get; set;}  // 只读权限
    public Boolean returnFirstPageFlag {get; private set;}  // 返回首页
    public Boolean beipincunfangdiEditableFlag {get; private set;}  // 备品存放地权限
    public Boolean beipinfenleiEditableFlag {get; private set;}  // 备品分类权限

    public Boolean equipmentSetManagmentCodeEditableFlag {get; private set;}  // 备品管理编码权限
    public Boolean internalAssetNumberEditableFlag {get; private set;}  // 固定资产号权限
    public Boolean serialNumberEditableFlag {get; private set;}  // 机身号权限
    public Boolean companyEquipmentEditableFlag {get; private set;}  // 分公司号权限
    public Boolean productCategoryEditableFlag {get; private set;}  // 产品分类权限
    public Boolean manageTypeEditableFlag {get; private set;}  // 管理种类权限
    public Boolean salesDepartmentEditableFlag {get; private set;}  // 所在地区(本部)
    public Boolean salesProvinceEditableFlag {get; private set;}  // 所在地区(省)
    public Boolean consumableGuaranteenEndEditableFlag {get; private set;}  // 消耗品有效期至
    public Boolean excess2000Flag {get; set;}  // 判断超过2000

    public Date consumableGuaranteenEndDate {get; set;}  // 消耗品有效期至 (2B2无access权限时)

    // 排序用
    public String sortKey {get; set;}
    public String preSortKey {get; set;}
    public Boolean sortOrderAsc {get; set;}
    public List<String> sortOrderList {get; set;}
    public Integer totalSoqlRecordNum {get; set;}  // 总数据数量
    public Integer totalNum {get; set;}  // 检索出的总数量 = 检索出的数量 + 打勾固定的数量
    // 分页用
    public String selRecordOption { get; set; }  // 选择的每页记录数
    public Integer selctRecordNum { get { return Integer.valueOf(selRecordOption); } } // 选择的每页记录数
    public Integer currPage { get; set; }  // 当前页
    public Integer totalPage { get; set; }  // 总页数
    public Integer totalFixDataNum { get; set; }  // 打勾固定数据数量
    public Integer totalUnfixDataNum { get; set; }  // 未打勾固定数据数量
    public List<User> loginUserList { get; set; }
    public String fromQuickBarFlag;  // 是否来自导航区按钮检索
    public static String assetRecordTypeId = System.Label.Asset_RecordType;

    public Asset getAsset() {  // 临时使用
        if (StaticAssetQuertResult == null) {
            StaticAssetQuertResult = new Asset(Id =
                [SELECT Id
                   FROM Asset
                  WHERE Asset_Owner__c = 'Olympus'
                    AND RecordTypeId = :assetRecordTypeId
                    // AND RecordTypeId = '01210000000kOPRAA2'
                    // AND Equipment_Type__c != '检测用备品' 已QA 不需要增加条件
                    AND Delete_Flag__c = False
                  LIMIT 1 ].Id);
        }
        System.debug('StaticAssetQuertResult.Id1===' + StaticAssetQuertResult.Id);
        return new Asset(Id = StaticAssetQuertResult.Id, RecordTypeId = assetRecordTypeId);
    }

    public String appliedSelectOption {get; set;}

    public String exportCsvName {get; set;}
    public Integer checkedAssetInfoNum {get; set;}
    public String checkFromQuickBarFlag;

    // 明细类
    class AssetInfo {
        public Boolean isCheck {get; set;}  // 是否选择
        public Asset assetQuertResult {get; set;}  // 借出备品set一览
        public AssetInfo() {
            isCheck = false;
            if (StaticAssetQuertResult == null) {
                StaticAssetQuertResult = new Asset(Id =
                  [SELECT Id
                     FROM Asset
                    WHERE Asset_Owner__c = 'Olympus'
                      AND RecordTypeId = :assetRecordTypeId
                      // AND RecordTypeId = '01210000000kOPRAA2'
                      // AND Equipment_Type__c != '检测用备品' 已QA 不需要增加条件
                      AND Delete_Flag__c = False
                    LIMIT 1 ].Id);
            }
            System.debug('StaticAssetQuertResult.Id2===' + StaticAssetQuertResult.Id);
            assetQuertResult = new Asset(Id = StaticAssetQuertResult.Id, RecordTypeId = assetRecordTypeId);
        }
    }
    // 导出CSV
    public String COMMA {
        get {
            return Parser.COMMA;
        }
    }
    public String CRLF {
        get {
            return Parser.CRLF;
        }
    }


    public CheckAllOlympusAssetController() {
        currPage = 1;
        selRecordOption = '10';  // 初始化时默认选择数量
        totalNum = 0;
        // 备品的RecordTypeId = 01210000000kOPRAA2
        DESC_RW = SoapApi.getEditLayoutItemRW('Asset', new String[]{System.Label.Asset_RecordType}).get(System.Label.Asset_RecordType);
    }
    public CheckAllOlympusAssetController(ApexPages.StandardController controller) {
        currPage = 1;
        selRecordOption = '10';  // 初始化时默认选择数量
        totalNum = 0;
        DESC_RW = SoapApi.getEditLayoutItemRW('Asset', new String[]{System.Label.Asset_RecordType}).get(System.Label.Asset_RecordType);
    }

    // 画面初始化
    public void init() {
        searchB = new SearchBean();
        System.debug('Start init');
        isSavingSuccess = 'true';
        checkFromQuickBarFlag = 'false';
        checkedAssetInfoNum = 0;
        bp3_Setting__c bp3config = bp3_Setting__c.getOrgDefaults();
        fromQuickBarFlag = 'false';

        exportCsvName = bp3config.Export_CSV_Filename__c + datetime.now().format('_YYYY-MM-dd_') + UserInfo.getUserName().split('@')[0] + '.csv';  // CustomSet的CSV文件名 日期 登录者Username
        System.debug('exportCsvName === ' + exportCsvName);
        System.debug('UserInfo.getUserId()===' + UserInfo.getUserName().split('@')[0]);

        appliedSelectOption = '';
        changeFlg = '0';
        searchFromBtn = false;
        onlyReadFlag = false;
        searchFromSave = false;
        initSearchButtonColor();
        returnFirstPageFlag = true;
        excess2000Flag = false;
        assetSetting = getAsset();
        System.debug('assetSetting.Equipment_Type__c ==' + assetSetting.Equipment_Type__c);
        allAssetDataList = new List<Asset>();
        allAssetInfoList = new List<AssetInfo>();
        //setAssetFieldSetInfo();
        totalFixDataNum = 0;
        totalUnfixDataNum =0;
        // 权限
        beipincunfangdiEditableFlag = Schema.sObjectType.Asset.fields.getMap().get('Internal_asset_location__c').getDescribe().isUpdateable();
        beipinfenleiEditableFlag = Schema.sObjectType.Asset.fields.getMap().get('Equipment_Type__c').getDescribe().isUpdateable();
        // 备品管理编码权限
        equipmentSetManagmentCodeEditableFlag = Schema.sObjectType.Asset.fields.getMap().get('EquipmentSet_Managment_Code__c').getDescribe().isUpdateable();
        // 固定资产号权限
        internalAssetNumberEditableFlag = Schema.sObjectType.Asset.fields.getMap().get('Internal_Asset_number__c').getDescribe().isUpdateable();
        // 机身号权限
        serialNumberEditableFlag = Schema.sObjectType.Asset.fields.getMap().get('SerialNumber').getDescribe().isUpdateable();
        // 分公司号权限
        companyEquipmentEditableFlag = Schema.sObjectType.Asset.fields.getMap().get('CompanyOfEquipment__c').getDescribe().isUpdateable();
        // 产品分类权限
        productCategoryEditableFlag = Schema.sObjectType.Asset.fields.getMap().get('Product_category__c').getDescribe().isUpdateable();
        // 管理种类权限
        manageTypeEditableFlag = Schema.sObjectType.Asset.fields.getMap().get('Manage_type__c').getDescribe().isUpdateable();
        // 所在地区(本部)
        salesDepartmentEditableFlag = Schema.sObjectType.Asset.fields.getMap().get('Salesdepartment__c').getDescribe().isUpdateable();
        // 所在地区(省)
        salesProvinceEditableFlag = Schema.sObjectType.Asset.fields.getMap().get('SalesProvince__c').getDescribe().isUpdateable();
        // 消耗品有效期至
        consumableGuaranteenEndEditableFlag = Schema.sObjectType.Asset.fields.getMap().get('Consumable_Guaranteen_end__c').getDescribe().isUpdateable();
        System.debug('7777');
        //loginUserList = new List<User>();
        loginUserList = [SELECT Id, Default_Referable_Apply_Equipment_Center__c
                         FROM User
                         WHERE Id = :Userinfo.getUserId()];
        beipinCunFangDi = loginUserList[0].Default_Referable_Apply_Equipment_Center__c;  // User.默认可参照备品中心

        //办事处查看权限  20210628 you 1650
        if (beipinCunFangDi=='广州 备品中心' || beipinCunFangDi=='北京 备品中心' || beipinCunFangDi=='上海 备品中心') {
            angecylookrole =true;
        }
        setAssetFieldSetInfo();//20210628 1650 you 挪个位置
        if (UserInfo.getProfileId() == System.Label.ProfileId_SystemAdmin || System.Label.ProfileId_EquCenAdmin.contains(UserInfo.getProfileId())) {
            internalAssetLocationLogin = FixtureUtil.bieCunFangDiOpsMap.get('备品管理中心')[0].getValue();  // SelectOption('All', '--全部--')
        } else {
            List<SelectOption> tempBieCunFangDiOpsList = FixtureUtil.bieCunFangDiOpsMap.get('备品管理中心');
            internalAssetLocationLogin = beipinCunFangDi;  // User.默认可参照备品中心
        }
        //internalAssetLocation1 = internalAssetLocationLogin;
        System.debug('internalAssetLocationLogin1111===' + internalAssetLocationLogin);

        System.debug('beipinCunFangDi===' + beipinCunFangDi);

        checkAssetBtn();
    }
    public void setAssetFieldSetInfo() {
        leftLabelList = new List<String>();
        rightLabelList = new List<String>();
        allLabelList = new List<String>();

        leftApiList = new List<List<String>>();
        rightApiList = new List<List<String>>();
        allApiList = new List<String>();

        columnLeftCssList = new List<String>();
        columnRightCssList = new List<String>();
        columnLeftRWMap = new Map<String, String>();
        columnRightRWMap = new Map<String, String>();
        List<String> columnLeftFieldPathList = new List<String>();
        List<String> columnRightFieldPathList = new List<String>();
        // 获得納入商品 項目セット
        Map<String, Schema.FieldSet> assetFieldSetMap = Schema.getGlobalDescribe().get('Asset').getDescribe().fieldSets.getMap();
        // 項目セット查看保有设备_左侧固定
        Schema.FieldSet leftFieldSetSet = assetFieldSetMap.get('CheckAsset_LeftFix');
        // 項目セット查看保有设备_右侧固定
        Schema.FieldSet rightFieldSetSet;
        //20210628 you 1650 办事处不显示 货架号
        system.debug('zheli'+angecylookrole);
        if(angecylookrole){
           rightFieldSetSet  = assetFieldSetMap.get('CheckAsset_Right');  
        } else{
           rightFieldSetSet = assetFieldSetMap.get('CheckAsset_Right_Angecy'); 
        }
        // 获得左侧固定項目セット中的所有项目
        List<FieldSetMember> leftFieldSetMemberList = leftFieldSetSet.getFields();
        // 获得右侧項目セット中的所有项目
        List<FieldSetMember> rightFieldSetMemberList = rightFieldSetSet.getFields();
        Boolean haveWrongField = false;
        for (FieldSetMember eachLeftFieldSetMember : leftFieldSetMemberList) {
            List<String> splitLeftFieldPathList = eachLeftFieldSetMember.getFieldPath().split('\\.');  // List size > 1 对应关联表
            if (splitLeftFieldPathList.size() > 1) {
                if ( haveWrongField == false) {
                     ApexPages.addMessage(new ApexPages.Message(ApexPages.severity.WARNING, '保有设备字段集CheckAsset_LeftFix只能选择保有设备的字段'));
                     haveWrongField = true;
                }
                continue;
            }
            leftLabelList.add(eachLeftFieldSetMember.getLabel());  // 左侧項目セットLabel
            columnLeftFieldPathList.add(eachLeftFieldSetMember.getFieldPath());  // 左侧項目セットAPI
            leftApiList.add(splitLeftFieldPathList);  // List<List<String>>() 左侧項目セットAPI
            if (DESC_RW == null) {
                columnLeftRWMap.put(eachLeftFieldSetMember.getFieldPath(), 'r');  // 未设置，默认为只读
            } else if (splitLeftFieldPathList.size() == 1) {
                String rw = DESC_RW.get(eachLeftFieldSetMember.getFieldPath());
                if (rw != null) {
                    columnLeftRWMap.put(eachLeftFieldSetMember.getFieldPath(), rw);  // 可读可写
                } else {
                    columnLeftRWMap.put(eachLeftFieldSetMember.getFieldPath(), 'r');  // 只读
                }
            } else {
                columnLeftRWMap.put(eachLeftFieldSetMember.getFieldPath(), 'r');  // 只读
            }
        }

        for (String eachColumnLeftFieldPath : columnLeftFieldPathList) {
        //    if (queryColumusSet.contains(eachcolumnLeftFieldPath) == false) {
        //        queryColumus.add(eachcolumnLeftFieldPath);
        //        queryColumusSet.add(eachcolumnLeftFieldPath);
        //    }
            columnLeftCssList.add(eachcolumnLeftFieldPath.replace('.', '_'));  // 与API相同
        }
        // 項目セット查看保有设备_右侧可拖动
        for (FieldSetMember eachRightFieldSetMember : rightFieldSetMemberList) {
            List<String> splitRightFieldPathList = eachRightFieldSetMember.getFieldPath().split('\\.');  // 与上面的相同
            if (splitRightFieldPathList.size() > 1) {
                if ( haveWrongField == false) {
                     ApexPages.addMessage(new ApexPages.Message(ApexPages.severity.WARNING, '保有设备字段集CheckAsset_Right只能选择保有设备的字段'));
                     haveWrongField = true;
                }
                continue;
            }
            rightLabelList.add(eachRightFieldSetMember.getLabel());  // 左侧項目セットLabel
            columnRightFieldPathList.add(eachRightFieldSetMember.getFieldPath());  // 左侧項目セットAPI
            rightApiList.add(splitRightFieldPathList);  // List<List<String>>() 左侧項目セットAPI
            if (DESC_RW == null) {
                columnRightRWMap.put(eachRightFieldSetMember.getFieldPath(), 'r');  // 未设置，默认为只读
            } else if (splitRightFieldPathList.size() == 1) {
                String rw = DESC_RW.get(eachRightFieldSetMember.getFieldPath());
                if (rw != null) {
                    columnRightRWMap.put(eachRightFieldSetMember.getFieldPath(), rw);  // 可读可写
                } else {
                    columnRightRWMap.put(eachRightFieldSetMember.getFieldPath(), 'r');  // 只读
                }
            } else {
                columnRightRWMap.put(eachRightFieldSetMember.getFieldPath(), 'r');  // 只读
            }
        }

        for (String eachColumnRightFieldPath : columnRightFieldPathList) {
            columnRightCssList.add(eachcolumnRightFieldPath.replace('.', '_'));  // 与API相同
        }

        allLabelList.addAll(leftLabelList);
        allLabelList.addAll(rightLabelList);
        System.debug('allLabelList=====' + allLabelList);  // 备品存放地, 所在地区(本部), 所在地区(省), 备品配套明细型号, 设备名, 固定资产编号(Key), 固定资产编号, 产品 + 机体编码, 产品分类(GI/SP), 备品分类, ...
        for (List<String> eachApiList : leftApiList) {
            allApiList.add(eachApiList[0]);
        }
        for (List<String> eachApiList : rightApiList) {
            allApiList.add(eachApiList[0]);
        }
        // CSV 每一行数量 不包括Id
        if (allApiList.contains('Id')) {
            allApiList.remove(0);
        }
        eachLineSize = allApiList.size();
        System.debug('allApiList===' + allApiList);
        Map<String, Schema.SObjectField> objectFields = Schema.getGlobalDescribe().get('Asset').getDescribe().fields.getMap();
        for(String eachApi : allApiList) {
            Schema.DescribeFieldResult lfieldLabel = objectFields.get(eachApi).getDescribe();
            Schema.DisplayType dType = lfieldLabel.getType();
            if (String.ValueOf(dType) == 'REFERENCE') {
                apiTypeIsReferenceList.add(eachApi);
            }
        }



        Map<String, SObjectField> queryAssetFieldMap = Asset.getSObjectType().getDescribe().fields.getMap();
        canChangeFlagList = new List<String>();
        for (String eachApi : allApiList) {
            DescribeFieldResult queryAssetFieldResult = queryAssetFieldMap.get(eachApi).getDescribe();
            if (!queryAssetFieldResult.isCalculated()) {
                canChangeFlagList.add('');
            } else {
                canChangeFlagList.add('（不可修改）');
            }
        }
        targetColumusStr = String.join(allApiList, ', ');
        if (targetColumusStr.contains('LastModifiedDate') == false) {
            targetColumusStr += ', LastModifiedDate';
        }

        // 默认排序
        this.sortKey = '0';
        this.preSortKey = '0';
        this.sortOrderAsc = true;
        this.sortOrderList = new List<String>();
        this.sortOrderList.add('↑');
        for (Integer i = 0; i < allLabelList.size(); i++) {
            this.sortOrderList.add(' ');
        }
    }

    // 初始化按钮颜色
    public void initSearchButtonColor() {
        angecylookrole =false; //20210628 you 1650
        allBlueFlag = true;  // 初始页面上全部保有设备按钮为蓝色
        consumableBlueFlag = false;
        lendingBlueFlag = false;
        repairingBlueFlag = false;
        scrappingBlueFlag = false;
        scrappedBlueFlag = false;
        consumedBlueFlag = false;
        soonExpiredBlueFlag = false;
        expiredBlueFlag = false;
    }
    // 检索按钮 查看保有设备
    public void checkAssetBtn() {
        // get方式传url参数
        if (String.isBlank(assertQueryCondition)) {
            assertQueryCondition = ApexPages.currentPage().getParameters().get('searchType');
        }
        System.debug('ApexPages.currentPage().getParameters().searchType===' + assertQueryCondition);
        // 来自按钮
        String tempAssertQueryCondition = ApexPages.currentPage().getParameters().get('assertCondition');
        System.debug('ApexPages.currentPage().getParameters()tempAssertQueryCondition===' + tempAssertQueryCondition);
        String fromQuickBarFlag = ApexPages.currentPage().getParameters().get('fromQuickBarFlag');
        System.debug('ApexPages.currentPage().getParameters()fromQuickBarFlag===' + fromQuickBarFlag);
        checkFromQuickBarFlag = fromQuickBarFlag;
        if (String.isNotBlank(tempAssertQueryCondition)) {
            assertQueryCondition = tempAssertQueryCondition;
        }
        //initSearchButtonColor();  // 每次检索时初始化按钮颜色
        //searchFromBtn = true;  // 去掉打钩项
        if (String.isNotBlank(assertQueryCondition) && assertQueryCondition != null) {
            System.debug('changecolor');
            allBlueFlag = false;
            consumableBlueFlag = false;
            lendingBlueFlag = false;
            repairingBlueFlag = false;
            scrappingBlueFlag = false;
            scrappedBlueFlag = false;
            consumedBlueFlag = false;
            soonExpiredBlueFlag = false;
            expiredBlueFlag = false;
            if (assertQueryCondition == 'all') {  //  备品检索条件assertQueryCondition为空视为 查看全部保佑设备
                allBlueFlag = true;
            } else if (assertQueryCondition == 'consumable') {
                consumableBlueFlag = true;
            } else if (assertQueryCondition == 'lending') {
                lendingBlueFlag = true;
            } else if (assertQueryCondition == 'repairing') {
                repairingBlueFlag = true;
            } else if (assertQueryCondition == 'scrapping') {
                scrappingBlueFlag = true;
            } else if (assertQueryCondition == 'scrapped') {
                scrappedBlueFlag = true;
            } else if (assertQueryCondition == 'consumed') {
                consumedBlueFlag = true;
            } else if (assertQueryCondition == 'soonExpired') {
                soonExpiredBlueFlag = true;
            } else if (assertQueryCondition == 'expired') {
                expiredBlueFlag = true;
            }
        }
        System.debug('fromQuickBarFlag1===' + fromQuickBarFlag);
        searchBtn();
    }

    // 适用
    public List<SelectOption> getAppliedSelectOptionList() {
        if (allApiList.contains('Id')) {
            allApiList.remove(0);
        }
        if (allLabelList.contains('Id')) {
            allLabelList.remove(0);
        }

        Map<String, Schema.FieldSet> assetFieldSetMap = Schema.getGlobalDescribe().get('Asset').getDescribe().fieldSets.getMap();
        Schema.FieldSet appliedFieldSetSet = assetFieldSetMap.get('CheckAsset_Apply');
        List<FieldSetMember> appliedFieldSetMemberList = appliedFieldSetSet.getFields();
        List<String> appliedLabelList = new List<String>();
        System.debug('appliedLabelList===' + appliedLabelList);
        System.debug('appliedFieldSetMemberList===' + appliedFieldSetMemberList);
        for (FieldSetMember eachAppliedFieldSetMember : appliedFieldSetMemberList) {
            System.debug('eachAppliedFieldSetMember===' + eachAppliedFieldSetMember);
            //String targetAppliedApi = allApiList.get(allLabelList.indexOf(eachAppliedFieldSetMember.getLabel()));
            String targetAppliedApi = '';
            system.debug('zheli0'+allLabelList.indexOf(eachAppliedFieldSetMember.getLabel()));
            if(allLabelList.indexOf(eachAppliedFieldSetMember.getLabel())!=-1){ //不包含
                targetAppliedApi =allApiList.get(allLabelList.indexOf(eachAppliedFieldSetMember.getLabel()));
                System.debug('targetAppliedApi===' + targetAppliedApi);
                if (Schema.sObjectType.Asset.fields.getMap().get(targetAppliedApi).getDescribe().isUpdateable()) {
                    System.debug('targetAppliedApi111===' + targetAppliedApi);
                    appliedLabelList.add(eachAppliedFieldSetMember.getLabel());
                }
            }
           
        }
        List<SelectOption> appliedSelectOptionList = new List<SelectOption> {new SelectOption('', NONE)};
        String targetAppliedApi;
        for (String eachAppliedLabel : appliedLabelList) {
            if (allLabelList.contains(eachAppliedLabel)) {
                targetAppliedApi = allApiList.get(allLabelList.indexOf(eachAppliedLabel));
            }
            appliedSelectOptionList.add(new SelectOption(targetAppliedApi, eachAppliedLabel));
        }
        return appliedSelectOptionList;
    }

    // 检索按钮
    public void searchBtn() {
        System.debug('Enter searchBtn.');
        System.debug('fromQuickBarFlag2 === ' + fromQuickBarFlag);
        System.debug('checkFromQuickBarFlag===' + checkFromQuickBarFlag);
        returnFirstPageFlag = true;
        getAllAssetData();
    }
    // 取消按钮 先清空所有打钩项
    public void clearAllCheckedBtn() {
        searchFromBtn = true;
        returnFirstPageFlag = false;  // 取消时不回到首页
        getAllAssetData();
    }

    // 明细排序
    public void sortTable() {
        searchFromBtn = false;  // 点击排序时，不需要清空打勾
        returnFirstPageFlag = true;  // 排序时回到首页
        // 排序
        this.sortKey = ApexPages.currentPage().getParameters().get('sortKey');

        System.debug('###########sortKey='+this.sortKey);
        System.debug('###########preSortKey='+this.preSortKey);

        if (this.sortKey == this.preSortKey) {
            // 方向が変わるのみ
            this.sortOrderAsc = !this.sortOrderAsc;
            this.sortOrderList[Integer.valueOf(this.sortKey)] = (this.sortOrderAsc == true ? '↑' : '↓');
        } else {
            if (preSortKey == '') {
                preSortKey = '0';
            }
            this.sortOrderAsc = true;
            this.sortOrderList[Integer.valueOf(this.preSortKey)] = ' ';
            this.sortOrderList[Integer.valueOf(this.sortKey)] = (this.sortOrderAsc == true ? '↑' : '↓');
        }
        System.debug('###########sortOrderAsc='+this.sortOrderAsc);
        this.preSortKey = this.sortKey;
        // 获取排序后借出备品一览
        getAllAssetData();
    }

    // 获取保有设备
    private void getAllAssetData() {
        internalAssetLocation = searchB.internal_asset_location;
        List<AssetInfo> oldAssetInfoList = new List<AssetInfo>();
        List<AssetInfo> newAssetInfoList = new List<AssetInfo>();
        List<Id> oldAssetDataIdList = new List<Id>();
        List<Id> checkedSavingDataIdList = new List<Id>();

        if (allAssetInfoList.size() > 0) {
            for (AssetInfo eachOldAssetInfo : allAssetInfoList) {
                if (eachOldAssetInfo.isCheck == true) {
                    oldAssetInfoList.add(eachOldAssetInfo);
                    oldAssetDataIdList.add(eachOldAssetInfo.assetQuertResult.Id);
                    if (searchFromSave == true) {
                        checkedSavingDataIdList.add(eachOldAssetInfo.assetQuertResult.Id);
                    }
                }
            }
        }
        System.debug('oldAssetInfoList===' + oldAssetInfoList);
        checkedAssetInfoNum = oldAssetInfoList.size();
        allAssetInfoList.clear();

        totalFixDataNum = oldAssetInfoList.size(); // 打勾固定数据数量

        if (searchFromBtn == true || searchFromSave == true) {  // 来自导航快捷键，去掉打钩项
            oldAssetDataIdList.clear();
            oldAssetInfoList.clear();
            searchFromBtn = false;
            //searchFromSave = false;
            totalFixDataNum = 0;
        }

        allAssetInfoList.addAll(oldAssetInfoList);
        String dateToday = String.valueOf(Date.today());
        String soqlAsset = '';
        soqlAsset += 'SELECT Id, ' + targetColumusStr + ' FROM Asset ';

        //soqlAsset += 'WHERE RecordTypeId = \'' + System.Label.Asset_RecordType + '\' ';  // RecordType备品
        soqlAsset += 'WHERE Asset_Owner__c = \'' + 'Olympus' + '\' ';
        soqlAsset += 'AND Delete_Flag__c = false ';  // 逻辑删除
        soqlAsset += 'AND AssetManageConfirm__c = true ';  // 备品中心确认

        if (oldAssetDataIdList.size() > 0) {
            soqlAsset += 'AND Id NOT IN :oldAssetDataIdList ';
        }

        if (String.isNotBlank(assertQueryCondition)) {  // 导航区快捷键备品状态
            if (assertQueryCondition == 'all') {  // 备品检索条件assertQueryCondition为空视为 查看全部保佑设备
                assetStatus = NONE;
            } else if (assertQueryCondition == 'consumable') {
                assetStatus = NONE;
                soqlAsset += 'AND You_Xiao_Ku_Cun__c > 0 ';  // 有效库存
            } else if (assertQueryCondition == 'lending') {  //  查看出借中保有设备
                assetStatus = NONE;
                soqlAsset += 'AND Out_of_wh__c > 0 ';  // 借出分配数
            } else if (assertQueryCondition == 'repairing') {  //  修理中
                assetStatus = NONE;
                soqlAsset += 'AND (Repairing_Count__c > 0 OR Draft_Repair_Count__c > 0) ';  // 修理中件数 + 草案中修理件数 > 0
            } else if (assertQueryCondition == 'scrapping') {  //  待报废
                assetStatus = NONE;
                soqlAsset += 'AND (Abandoned_RealThing__c > 0 OR Abandoned_Inventory__c  > 0) ';  // 待废弃数(实物) 或者 待废弃数(丢失/盘亏)
            } else if (assertQueryCondition == 'scrapped') {  //  已报废
                assetStatus = FixtureUtil.assetFixtureStatusMap.get(FixtureUtil.AssetFixtureStatus.Fei_Qi.ordinal());
            } else if (assertQueryCondition == 'consumed') {  //  已消耗
                assetStatus = NONE;
                soqlAsset += 'AND Consumed_Count__c > 0 ';// 已消耗数大于0
            } else if (assertQueryCondition == 'soonExpired') {  //  即将到期
                assetStatus = NONE;
                Datetime time1 = Datetime.now();
                Datetime future = time1.addMonths(1);
                // 这次能用format的原因是左边是Date类型，右边是DateTime类型
                // 如果左边和右边都是DateTime类型的话就不能这么用了，因为Salfesforce里面保存的是格林志时间
                soqlAsset += 'AND (Consumable_Guaranteen_end__c > ' + time1.format('YYYY-MM-dd') + ' AND Consumable_Guaranteen_end__c <= ' + future.format('YYYY-MM-dd') + ') ';
                //  1个月内即将到期的
            } else if (assertQueryCondition == 'expired') {  //  已过期
                assetStatus = NONE;
                soqlAsset += 'AND Expired_Count_F__c > 0 ';//  已过期数＞0
            }
        }
        String notScriptedAssetStatus1 = '';
        System.debug('assetStatus111==' + assetStatus);
        System.debug('fromQuickBarFlag3==' + fromQuickBarFlag);
        System.debug('checkFromQuickBarFlag===' + checkFromQuickBarFlag);
        if(assetStatus != FixtureUtil.assetFixtureStatusMap.get(FixtureUtil.AssetFixtureStatus.Fei_Qi.ordinal()) && checkFromQuickBarFlag == 'false') {
            assetStatus = searchB.fixture_Status;
        } else if (searchB.fixture_Status != NONE && checkFromQuickBarFlag == 'false') {  // 如果查看废弃保有设备同时选择了其他备品状态
            notScriptedAssetStatus1 = searchB.fixture_Status;
        }
        System.debug('assetStatus222==' + assetStatus);
        System.debug('notScriptedAssetStatus1==' + notScriptedAssetStatus1);
        fromQuickBarFlag = 'false';
        if (checkFromQuickBarFlag == null || checkFromQuickBarFlag == 'true') {
            internalAssetLocation = '';
        }
        if (UserInfo.getProfileId() != System.Label.ProfileId_SystemAdmin && !(System.Label.ProfileId_EquCenAdmin.contains(UserInfo.getProfileId()))) {  // ProfileId 2B3_备品中心管理者
            if (String.isBlank(internalAssetLocation)) {
                internalAssetLocation = loginUserList[0].Default_Referable_Apply_Equipment_Center__c;  // User.默认可参照备品中心
                searchB.internal_asset_location = loginUserList[0].Default_Referable_Apply_Equipment_Center__c;  // User.默认可参照备品中心
            }
        }
        if (String.isNotBlank(internalAssetLocation)) {
            //系统管理员 ，2B3_备品中心管理者， 2B3_备品中心管理者(照片) 可以进行更新
            if (UserInfo.getProfileId() == System.Label.ProfileId_SystemAdmin || System.Label.ProfileId_EquCenAdmin.contains(UserInfo.getProfileId())) {
                onlyReadFlag = false;
                if (internalAssetLocation != '全部' && internalAssetLocation != 'All') {
                    soqlAsset += 'AND Internal_asset_location__c = \'' + String.escapeSingleQuotes(internalAssetLocation) + '\' ';
                }// 20210628 you 1650 AgencyProfileId 办事处没有更改得权限 
            } else if (internalAssetLocation != loginUserList[0].Default_Referable_Apply_Equipment_Center__c || System.Label.AgencyProfileId.contains(UserInfo.getProfileId())){
                onlyReadFlag = true;
                if (internalAssetLocation != '全部' && internalAssetLocation != 'All') {
                    soqlAsset += 'AND Internal_asset_location__c = \'' + String.escapeSingleQuotes(internalAssetLocation) + '\' ';
                }
            } else {
                onlyReadFlag = false;
                if (internalAssetLocation != '全部' && internalAssetLocation != 'All') {
                    soqlAsset += 'AND Internal_asset_location__c = \'' + String.escapeSingleQuotes(internalAssetLocation) + '\' ';
                }
            }  // 备品存放地
        }
        if (String.isNotBlank(searchB.fixture_Model_No) && checkFromQuickBarFlag == 'false') {
            soqlAsset += 'AND Fixture_Model_No_F__c LIKE \'%' + String.escapeSingleQuotes(searchB.fixture_Model_No.trim().replaceAll('%', '\\%')) + '%\' ';
        }  // 备品配套明细型号
        if (String.isNotBlank(searchB.wh_location) && checkFromQuickBarFlag == 'false') {
            soqlAsset += 'AND WH_Location__c = \'' + String.escapeSingleQuotes(searchB.wh_location.trim()) + '\' ';
        }  // 货架号
        if (assetStatus != NONE && assetStatus != null && assetStatus != '') {
            System.debug('assetStatus=======' + assetStatus);
            if (assetStatus ==  FixtureUtil.assetFixtureStatusMap.get(FixtureUtil.AssetFixtureStatus.Xiu_Li_Zhong.ordinal())) {  // 修理中
                // 个体管理: 备品状态; 数量管理: 修理中件数 + 草案中修理件数 > 0
                soqlAsset += 'AND (Fixture_Status__c = \'' + String.escapeSingleQuotes(assetStatus) + '\' ';
                soqlAsset += 'OR (Repairing_Count__c > 0 ';
                soqlAsset += 'OR Draft_Repair_Count__c > 0)) ';
            } else if (assetStatus ==  FixtureUtil.assetFixtureStatusMap.get(FixtureUtil.AssetFixtureStatus.Dai_Fei_Qi.ordinal())) {  // 待报废
                // 个体管理: 备品状态; 数量管理: 待废弃数(实物) > 0
                soqlAsset += 'AND (Fixture_Status__c = \'' + String.escapeSingleQuotes(assetStatus) + '\' ';
                soqlAsset += 'OR Abandoned_RealThing__c > 0) ';
            } else if (assetStatus ==  FixtureUtil.assetFixtureStatusMap.get(FixtureUtil.AssetFixtureStatus.Fei_Qi.ordinal())) {  // 已报废
                // 备品状态
                soqlAsset += 'AND Fixture_Status__c = \'' + String.escapeSingleQuotes(assetStatus) + '\' ';
            } else {
                assetStatus = assetStatus == '废弃' ? FixtureUtil.assetFixtureStatusMap.get(FixtureUtil.AssetFixtureStatus.Fei_Qi.ordinal()) : assetStatus;
                soqlAsset += 'AND Fixture_Status__c = \'' + String.escapeSingleQuotes(assetStatus) + '\' ';
            }
            if (notScriptedAssetStatus1 != '') {
                soqlAsset += 'AND Fixture_Status__c = \'' + String.escapeSingleQuotes(notScriptedAssetStatus1) + '\' ';
            }
        }  // 备品状态
        if (String.isNotBlank(searchB.equipmentSet_Managment_Code) && checkFromQuickBarFlag == 'false') {
            soqlAsset += 'AND EquipmentSet_Managment_Code__c = \'' + String.escapeSingleQuotes(searchB.equipmentSet_Managment_Code.trim()) + '\' ';
        }  // 备品管理编码
        if (String.isNotBlank(searchB.internal_Asset_number) && checkFromQuickBarFlag == 'false') {
            soqlAsset += 'AND Internal_Asset_number__c = \'' + String.escapeSingleQuotes(searchB.internal_Asset_number.trim()) + '\' ';
        }  // 固定资产编号
        if (String.isNotBlank(searchB.serialNumber) && checkFromQuickBarFlag == 'false') {
            soqlAsset += 'AND SerialNumber = \'' + String.escapeSingleQuotes(searchB.serialNumber.trim()) + '\' ';
        }  // 机身号 シリアル番号
        if (String.isNotBlank(searchB.companyOfEquipment) && checkFromQuickBarFlag == 'false') {
            soqlAsset += 'AND CompanyOfEquipment__c = \'' + String.escapeSingleQuotes(searchB.companyOfEquipment) + '\' ';
        }  // 财务所属分公司
        if (searchB.bodyOrAccessory != NONE && searchB.bodyOrAccessory != null && searchB.bodyOrAccessory != '' && checkFromQuickBarFlag == 'false') {
            if (searchB.bodyOrAccessory == '主体') {
                soqlAsset += 'AND Loaner_accsessary__c = false ';
            } else {
                soqlAsset += 'AND Loaner_accsessary__c = true ';
            }
        }  // 主体/附属品
        if (String.isNotBlank(searchB.product_category) && checkFromQuickBarFlag == 'false') {
            soqlAsset += 'AND Product_category__c = \'' + String.escapeSingleQuotes(searchB.product_category.trim()) + '\' ';
        }  // 产品分类
        if (String.isNotBlank(searchB.equipment_Type) && checkFromQuickBarFlag == 'false') {
            soqlAsset += 'AND Equipment_Type__c = \'' + String.escapeSingleQuotes(searchB.equipment_Type.trim()) + '\' ';
        }  // 备品分类
        if (String.isNotBlank(searchB.manage_type) && checkFromQuickBarFlag == 'false') {
            soqlAsset += 'AND Manage_type__c = \'' + String.escapeSingleQuotes(searchB.manage_type.trim()) + '\' ';
        }  // 管理种类
        if (String.isNotBlank(searchB.salesdepartment) && checkFromQuickBarFlag == 'false') {
            soqlAsset += 'AND Salesdepartment__c = \'' + String.escapeSingleQuotes(searchB.salesdepartment.trim()) + '\' ';
        }  // 所在地区 本部 Saless_Department__c
        if (String.isNotBlank(searchB.salesProvince) && checkFromQuickBarFlag == 'false') {
            soqlAsset += 'AND SalesProvince__c = \'' + String.escapeSingleQuotes(searchB.salesProvince.trim()) + '\' ';
        }  // 所在地区 省 Sales_Province__c
        if (String.isNotBlank(searchB.asset_loaner_category) && checkFromQuickBarFlag == 'false') {
            if(searchB.asset_loaner_category == '耗材') {
                soqlAsset += 'AND Asset_loaner_category__c = \'耗材\'';
            }
            else {
                soqlAsset += 'AND Asset_loaner_category__c != \'耗材\'';
            }
        }  // 备品类别
        if (String.isNotBlank(searchB.daysToExpired) && checkFromQuickBarFlag == 'false') {
            Datetime time1 = Datetime.now();
            Datetime future = time1.addDays(Integer.valueOf(searchB.daysToExpired));
            // 这次能用format的原因是左边是Date类型，右边是DateTime类型
            // 如果左边和右边都是DateTime类型的话就不能这么用了，因为Salfesforce里面保存的是格林志时间
            soqlAsset += 'AND (Consumable_Guaranteen_end__c > ' + time1.format('YYYY-MM-dd') + ' AND Consumable_Guaranteen_end__c <= ' + future.format('YYYY-MM-dd') + ') ';
        }  // 到期时间
        if (searchB.consumable_Guaranteen_end != NULL && checkFromQuickBarFlag == 'false') {
            Date tempDate;
            tempDate = searchB.consumable_Guaranteen_end;
            // if (consumableGuaranteenEndEditableFlag) {
            //     tempDate = searchB.consumable_Guaranteen_end;
            // } else {
            //     tempDate = consumableGuaranteenEndDate;
            // }
            soqlAsset += 'AND Consumable_Guaranteen_end__c = :tempDate ';
        }  // 消耗品有效期至 Consumable_Guaranteen_End__c
        // ---------------检索区---------------

        if (!allApiList.contains('Id')) {
            allApiList.add(0, 'Id');
        }
        // 判断2000条限制
        System.debug('soql2000===' + soqlAsset.right(299) + ' LIMIT 2001 ');
        Integer allAssetDataCheckSize = Database.query(soqlAsset + ' LIMIT 2001 ').size();
        excess2000Flag = false;
        if(allAssetDataCheckSize > 2000) {
            excess2000Flag = true;
            ApexPages.Message excess2000Msg = new ApexPages.Message(ApexPages.severity.WARNING, '检索数据已超过2000条，无法显示超过2000条的部分，请追加检索条件。');
            ApexPages.addMessage(excess2000Msg);
        }

        soqlAsset += ' ORDER BY ' + this.allApiList[Integer.valueOf(this.sortKey)] + ' ' + (this.sortOrderAsc == true ? 'asc nulls first ' : 'desc nulls last ');
        totalSoqlRecordNum = allAssetDataCheckSize > 2000 ? 2000 : allAssetDataCheckSize;
        totalNum = oldAssetDataIdList.size() + totalSoqlRecordNum;  // 总的显示数量
        totalPage = (totalNum/selctRecordNum) + (Math.mod(totalNum, selctRecordNum) > 0 ? 1 : 0);  // 总页数
        if (returnFirstPageFlag) {
            currPage = 1;
        }
        System.debug('currPage===' + currPage);
        System.debug('totalPage===' + totalPage);
        if (selRecordOption != NONE) {
            // selRecordOption = String.valueOf(Integer.valueOf(selRecordOption) + checkedAssetInfoNum);
            if (currPage == 1) {
                soqlAsset += ' limit ' + selRecordOption;
            } else if (currPage >= totalPage) {
                currPage = totalPage;
                soqlAsset += ' limit ' + selRecordOption + ' offset ' + String.valueOf((currPage - 1) * selctRecordNum - checkedAssetInfoNum);
                System.debug('Last page;');
            } else {
                soqlAsset += ' limit ' + selRecordOption + ' offset ' + String.valueOf((currPage - 1) * selctRecordNum - checkedAssetInfoNum);
            }
        }
        // 最终检索结果
        allAssetDataList = Database.query(soqlAsset);

        if (allAssetDataList.size() > 0) {
            for (Asset eachAssetDataList : allAssetDataList) {
                AssetInfo resultAssertInfo = new AssetInfo();
                resultAssertInfo.assetQuertResult = eachAssetDataList;
                resultAssertInfo.isCheck = false;
                newAssetInfoList.add(resultAssertInfo);
            }
            allAssetInfoList.addAll(newAssetInfoList);
        }

        System.debug('Asset soql====' + soqlAsset);
        totalUnfixDataNum = allAssetInfoList.size() - totalFixDataNum;

        if (searchFromSave == true) {
            List<Asset> headAssetList = new List<Asset>();  // 暂存打勾项， 优先显示
            List<AssetInfo> headAssetInfoList = new List<AssetInfo>();  // 暂存打勾项， 优先显示
            List<AssetInfo> trailAssetInfo = new List<AssetInfo>();
            List<AssetInfo> tempAssetInfoList = new List<AssetInfo>(allAssetInfoList);
            allAssetInfoList.clear();
            // 获取打勾固定项
            headAssetList = Database.query('SELECT Id, ' + targetColumusStr + ' FROM Asset WHERE Id IN :checkedSavingDataIdList LIMIT 2000');
            for (Asset eachheadAsset : headAssetList) {
                AssetInfo tempHeadAssetInfo = new AssetInfo();
                tempHeadAssetInfo.isCheck = true;
                tempHeadAssetInfo.assetQuertResult = eachheadAsset;
                headAssetInfoList.add(tempHeadAssetInfo);
            }
            for (AssetInfo eachAssetInfo : tempAssetInfoList) {
                if (!checkedSavingDataIdList.contains(eachAssetInfo.assetQuertResult.Id)) {
                    trailAssetInfo.add(eachAssetInfo);
                }
            }
            allAssetInfoList.addAll(headAssetInfoList);
            allAssetInfoList.addAll(trailAssetInfo);
            searchFromSave = false;
        }
        checkFromQuickBarFlag = 'false';
        System.debug('allAssetInfoList===' + allAssetInfoList);
        System.debug('Test allAssetInfoListallAssetInfoList = ' + allAssetInfoList);
    }

    // csv export
    public PageReference csvExprot() {
        exportCsvResultList = new List<List<String>>();
        if (allApiList.contains('Id')) {
            allApiList.remove(0);
        }
        assetExportCsvList = new List<Asset>();
        for (AssetInfo eachAssetInfo : allAssetInfoList) {
            List<String> exportCsvRowList = new List<String>();
            if (eachAssetInfo.isCheck) {
                exportCsvRowList.add(eachAssetInfo.assetQuertResult.Id);
                for (String eachApi : allApiList) {
                    System.debug('----====----');
                    System.debug(eachApi);
                    System.debug(eachAssetInfo.assetQuertResult.get(eachApi));
                    System.debug('++++:::::++++');
                    if (eachAssetInfo.assetQuertResult.get(eachApi) != null) {
                        //exportCsvRowList.add(String.valueOf(eachAssetInfo.assetQuertResult.get(eachApi)).escapeCsv());
                        exportCsvRowList.add(String.valueOf(eachAssetInfo.assetQuertResult.get(eachApi)));
                    } else {
                        exportCsvRowList.add(''.escapeCsv());
                    }
                }
                exportCsvResultList.add(exportCsvRowList);
                System.debug('exportCsvRowList===' + exportCsvRowList);
            }
        }
        return Page.ExportAllOlympusAsset.setRedirect(false);
    }

    // 适用按钮
    public void applyBtn() {
        String strMessage = null;
    }

    // 适用区域信息提示
    public void showApplyMsg() {
        String applyMsg = ApexPages.currentPage().getParameters().get('applyMsg');
        String applyMsgType = ApexPages.currentPage().getParameters().get('applyMsgType');
        String applyErrorLabel = ApexPages.currentPage().getParameters().get('applyErrorLabel');
        if(applyMsgType == 'Fail') {
            ApexPages.Message vfApplyMsg = new ApexPages.Message(ApexPages.severity.ERROR, applyMsg);
            ApexPages.addMessage(vfApplyMsg);
            System.debug('applyMsg===' + applyMsg);
            System.debug('applyMsgType===' + applyMsgType);
            System.debug('applyErrorLabel===' + applyErrorLabel);
            if(applyErrorLabel != null) {
                System.debug('applyErrorLabel===' + applyErrorLabel);
            }
        } else {
            ApexPages.Message vfApplyMsg = new ApexPages.Message(ApexPages.severity.INFO, applyMsg);
            ApexPages.addMessage(vfApplyMsg);
        }
    }

    // 保存按钮 当保存时先将修改flag置0，只更新打勾的，未打勾的将在下次保存时刷掉。
    public PageReference saveBtn() {
        isSavingSuccess = 'true';
        List<Asset> saveAssetList = new List<Asset>();
        if (changeFlg == '1') {
            changeFlg = '0';
        }
        Set<Id> assetId = new Set<Id>();
        for (AssetInfo eachAssetInfoList : allAssetInfoList) {
            // 只更新打勾的
            if (eachAssetInfoList.isCheck == true) {
                saveAssetList.add(eachAssetInfoList.assetQuertResult);
                assetId.add(eachAssetInfoList.assetQuertResult.Id);
            }
        }
        totalFixDataNum = saveAssetList.size(); // 打勾固定数据数量
        totalUnfixDataNum = allAssetInfoList.size() - totalFixDataNum; // 未打勾固定数据数量
        Boolean errorFlag = false;
        Boolean errorFlaglook = false;
        String errorMsg = '保存失败，导入CSV数据存在问题。';
        //Map <String, String> errorSavingMap = new Map <String, String>();
        if (saveAssetList.size() > 0) {
            Map<Id, Asset> assMap = new Map<Id, Asset>();
            for (Asset ass : [Select Id, LastModifiedDate FROM Asset Where Id = :assetId for Update]) {
                assMap.put(ass.Id, ass);
            }
            System.debug('saveAssetList');
            //Savepoint spAsset = Database.setSavepoint();
            // Database.update(saveAssetList);  // withsharing
            Map<String, SObjectField> saveAssetFieldMap = Asset.getSObjectType().getDescribe().fields.getMap();
            for (Asset eachSavingAsset : saveAssetList) {
                for (String eachApi : allApiList) {
                    DescribeFieldResult saveAssetFieldResult = saveAssetFieldMap.get(eachApi).getDescribe();
                    if (!saveAssetFieldResult.isCalculated()) {
                        if (saveAssetFieldResult.getType() == Schema.DisplayType.Picklist) {
                            List<Schema.PicklistEntry> ple = saveAssetFieldResult.getPicklistValues();
                            List<String> pleList = new List<String>();
                            for (Schema.PicklistEntry s : ple) {
                                pleList.add(s.getValue());
                            }
                            if (!pleList.contains(String.valueOf(eachSavingAsset.get(eachApi))) && String.valueOf(eachSavingAsset.get(eachApi)) != null) {
                                errorFlag = true;
                                isSavingSuccess = 'false';
                                String targetLabel = allLabelList.get(allApiList.indexOf(eachApi) - 1);  // allApiList[0]为Id，allLabelList中不存在。
                                String errorMsgField = targetLabel + ' 中不存在 ' + String.valueOf(eachSavingAsset.get(eachApi)) + '。 ';
                                System.debug('targetLabel===' + targetLabel);
                                System.debug('eachApi===' + eachApi);
                                if (eachApi == 'Internal_asset_location__c') {  // 备品存放地
                                    eachSavingAsset.Internal_asset_location__c.addError(errorMsgField);
                                } else if (eachApi == 'Salesdepartment__c') {  // 所在地区(本部)
                                    eachSavingAsset.Salesdepartment__c.addError(errorMsgField);
                                } else if (eachApi == 'SalesProvince__c') {  // 所在地区(省)
                                    eachSavingAsset.SalesProvince__c.addError(errorMsgField);
                                } else if (eachApi == 'CompanyOfEquipment__c') {  // 备品所属公司
                                    eachSavingAsset.CompanyOfEquipment__c.addError(errorMsgField);
                                } else if (eachApi == 'Product_category__c') {  // 产品分类(GI/SP)
                                    eachSavingAsset.Product_category__c.addError(errorMsgField);
                                } else if (eachApi == 'Equipment_Type__c') {  // 备品分类
                                    eachSavingAsset.Equipment_Type__c.addError(errorMsgField);
                                } else if (eachApi == 'Manage_type__c') {  // 管理种类
                                    eachSavingAsset.Manage_type__c.addError(errorMsgField);
                                } else if (eachApi == 'Asset_loaner_category__c') { // 备品类别
                                    eachSavingAsset.Asset_loaner_category__c.addError(errorMsgField);
                                }
                            }
                        }
                    }
                }
                if (assMap.containsKey(eachSavingAsset.Id) && assMap.get(eachSavingAsset.Id).LastModifiedDate != eachSavingAsset.LastModifiedDate) {
                    ApexPages.Message errorMessage = new ApexPages.Message(ApexPages.severity.ERROR, '保有设备:' + eachSavingAsset.Fixture_Model_No_F__c + ' ' + eachSavingAsset.SerialNumber + '有被更新过,请刷新画面重试');
                    ApexPages.addMessage(errorMessage);
                    errorFlaglook = true;
                }
                System.debug('errorFlag===' + errorFlag);
            }
            if (errorFlaglook) {
                isSavingSuccess = 'false';
                return null;
            }
            if (errorFlag) {
                System.debug('errorFlagerrorFlag' + errorFlag);
                isSavingSuccess = 'false';
                System.debug('errorMsg' + errorMsg);

                ApexPages.Message errorMessage = new ApexPages.Message(ApexPages.severity.ERROR, errorMsg);
                ApexPages.addMessage(errorMessage);

                errorFlag = false;

                return null;
            }
            //if(!errorSavingMap.isEmpty()) {
            //    String errorMsg;
            //    errorMsg += '导入CSV数据存在问题，';
            //    for (String eachErrorApiKey : errorSavingMap.keySet()) {
            //        System.debug('eachErrorApiKey' + eachErrorApiKey);
            //        String eachErrorValue = String.valueOf(errorSavingMap.get(eachErrorApiKey));
            //        System.debug('eachErrorValue' + eachErrorValue);
            //        errorMsg += eachErrorApiKey + '中不存在' + eachErrorValue;
            //    }
            //    System.debug(errorMsg);
            //}

            //ApexPages.Message errorMessage = new ApexPages.Message(ApexPages.severity.ERROR, '导入过程出现错误，请检查CSV文件格式。');
            //ApexPages.addMessage(errorMessage);

            try {
                System.debug('saveAssetList====----===' + saveAssetList);
                Database.SaveResult[] saveResultList = FixtureUtil.withoutUpdate(saveAssetList, true);  // withoutsharing
                //Database.SaveResult[] saveResultList = Database.update(saveAssetList, true);
                getAllAssetData();
            } catch (Exception e) {
                //Database.rollback(spAsset);
                System.debug('eeee' + e);
            }
        }
        searchFromSave = true;

        return null;
    }

    // 保存完了信息提示
    public void setSaveSuccessMsg() {
        ApexPages.Message savingSuccessfullyMessage = new ApexPages.Message(ApexPages.severity.INFO, '保存成功。');
        ApexPages.addMessage(savingSuccessfullyMessage);
    }

    public Date stringToDate(String dateStr) {  // Fri Jan 18 00:00:00 GMT 2019
        //System.debug('dateStr=====' + dateStr);
        dateStr = dateStr.split(' ')[0];
        return Date.valueOf(dateStr.replaceAll('/','-'));

        //String monthStr = dateStr.substring(4,7);
        //Integer dayStr = Integer.ValueOf(dateStr.substring(8,10));
        //Integer yearStr = Integer.ValueOf(dateStr.substring(24,28));
        //Integer strMonth;
        //switch on monthStr {
        //    when 'Jan' {
        //        strMonth = 01;
        //    } when 'Feb' {
        //        strMonth = 02;
        //    } when 'Mar' {
        //        strMonth = 03;
        //    } when 'Apr' {
        //        strMonth = 04;
        //    } when 'May' {
        //        strMonth = 05;
        //    } when 'Jun' {
        //        strMonth = 06;
        //    } when 'Jul' {
        //        strMonth = 07;
        //    } when 'Aug' {
        //        strMonth = 08;
        //    } when 'Sep' {
        //        strMonth = 09;
        //    } when 'OCt' {
        //        strMonth = 10;
        //    } when 'Nov' {
        //        strMonth = 11;
        //    } when 'Dec' {
        //        strMonth = 12;
        //    }
        //}
        //return date.newinstance(yearStr, strMonth, dayStr);
    }

    public void importCSVFile() {
        System.debug('*************importCSVFile*************');
        allAssetInfoList.clear();  // 清空检索结果
        allAssetDataList.clear();  // 清空检索结果 用于统计数量
        String csvData = ApexPages.currentPage().getParameters().get('csvData');
        System.debug('------' + csvData + '------');
        System.debug('111111');
        List<List<String>> tempCsvBody = CSVReader.readIETFRFC4180CSVFile(Blob.valueof(csvData));  // 全部CSV数据
        System.debug('222222');
        List<String> importApiList = tempCsvBody[0];  // CSV读入的标题行 ID + Label
        List<String> importLabelList = tempCsvBody[1];  // CSV读入的标题行 ID + Label
        Map<Id, Asset> importAssetMap = new Map<Id, Asset>();  // 导入CSV生成的AssetList
        // 检查CSV列是否一一对应
        List<String> allLabelList = new List<String>();  // 默认的 ID + Label
        if (!allLabelList.contains('Id')) {
            allLabelList.add('Id');
        }
        allLabelList.addAll(leftLabelList);
        allLabelList.addAll(rightLabelList);
        for (Integer i = 0; i < importLabelList.size(); i++) {
            if (importLabelList[i].contains('不可修改')) {
                importLabelList[i] = importLabelList[i].remove('（不可修改）');
            }
        }
        System.debug('333333');
        // 检索CSV中的ID检索Asset获得List<Asset>
        // try {
            if (allApiList.contains('Id')) {
                allApiList.remove(0);
            }
            if (importApiList.contains('Id')) {
                importApiList.remove(0);
            }
            List<String> notIncludeApiList = new List<String>();
            for (String eachApi : allApiList) {
                if ((!importApiList.contains(eachApi)) && (!importApiList.contains(eachApi+'（不可修改）'))) {
                    notIncludeApiList.add(eachApi);
                }
            }

            Map<String, SObjectField> queryAssetFieldMap = Asset.getSObjectType().getDescribe().fields.getMap();
            for (Integer i = 2; i < tempCsvBody.size(); i++) {
                Asset tempAsset = getAsset();
                System.debug('--------==========----------');
                System.debug('internalAssetLocationLogin===' + internalAssetLocationLogin);
                System.debug('1234' + tempCsvBody[i][1]);
                if (UserInfo.getProfileId() == System.Label.ProfileId_SystemAdmin || System.Label.ProfileId_EquCenAdmin.contains(UserInfo.getProfileId())) {
                    internalAssetLocationLogin = FixtureUtil.bieCunFangDiOpsMap.get('备品管理中心')[0].getValue();  // SelectOption('All', '--全部--')
                } else {
                    List<SelectOption> tempBieCunFangDiOpsList = FixtureUtil.bieCunFangDiOpsMap.get('备品管理中心');
                    internalAssetLocationLogin = beipinCunFangDi;
                }
                if(internalAssetLocationLogin != 'All' && tempCsvBody[i][1] != internalAssetLocationLogin) {
                    continue;
                }
                for (Integer j = 0; j < importApiList.size(); j++) {

                    if (importApiList[j].contains('（不可修改）')) {
                        importApiList[j] = importApiList[j].remove('（不可修改）');
                    }
                    DescribeFieldResult queryAssetFieldResult = queryAssetFieldMap.get(importApiList[j]).getDescribe();
                    if (!queryAssetFieldResult.isCalculated()) {
                        if (queryAssetFieldResult.getType() == Schema.DisplayType.Date) {
                            if (tempCsvBody[i][j+1] != '') {
                                String s = tempCsvBody[i][j+1].substring(0,1);
                                if(s == '2'){
                                    tempAsset.put(importApiList[j], stringToDate(tempCsvBody[i][j+1]));
                                }
                                
                            }
                        } else if (queryAssetFieldResult.getType() == Schema.DisplayType.Boolean) {
                            if (tempCsvBody[i][j+1] != '') {
                                tempAsset.put(importApiList[j], Boolean.valueOf(tempCsvBody[i][j+1]));
                            }
                        } else if (queryAssetFieldResult.getType() == Schema.DisplayType.Double) {
                            if (tempCsvBody[i][j+1] != '') {
                                tempAsset.put(importApiList[j], Decimal.valueOf(tempCsvBody[i][j+1]));
                            }
                        } else {
                            tempAsset.put(importApiList[j], tempCsvBody[i][j+1]);
                        }
                    }
                }
                importAssetMap.put(tempCsvBody[i][0], tempAsset);
            }
            System.debug('importAssetMap===---===' + importAssetMap);
            if (!importAssetMap.isEmpty()) {
                Set<Id> importAssetId = importAssetMap.keySet();
                String soqlAsset = '';
                soqlAsset += 'SELECT Id, ' + targetColumusStr + ' FROM Asset ';
                //soqlAsset += 'WHERE RecordTypeId = \'' + System.Label.Asset_RecordType + '\' ';
                soqlAsset += 'WHERE Asset_Owner__c = \'' + 'Olympus' + '\' ';
                soqlAsset += 'AND Id IN :importAssetId LIMIT 2000 ';
                //System.debug('soqlAsset====' + soqlAsset);

                // 导入csv时，获取相应的数据库中的数据与导入的CSV数据比较，只更新存在差异的文件。
                allAssetDataList = Database.query(soqlAsset);
                // importAssetMap => allAssetDataList Id
                for (Asset eachOldAsset : allAssetDataList) {
                    Asset updatingAsset = importAssetMap.get((Id)(eachOldAsset.get('Id')));
                    for (String eachAllApi : importApiList) {
                        DescribeFieldResult queryAssetFieldResult = queryAssetFieldMap.get(eachAllApi).getDescribe();
                        if (queryAssetFieldResult.isCalculated()) {
                            continue;
                        }
                        System.debug('test1');
                        if ((eachOldAsset.get(eachAllApi) != updatingAsset.get(eachAllApi)) && (!notIncludeApiList.contains(eachAllApi))) {
                            eachOldAsset.put(eachAllApi, updatingAsset.get(eachAllApi));
                        }
                        System.debug('test2');
                    }
                    System.debug('eachOldAsset-======' + eachOldAsset);
                    AssetInfo updatingAssetInfo = new AssetInfo();
                    updatingAssetInfo.isCheck = true;
                    updatingAssetInfo.assetQuertResult = eachOldAsset;
                    allAssetInfoList.add(updatingAssetInfo);
                    System.debug('allAssetInfoList===---' + allAssetInfoList);
                }
            }
            System.debug('test3');
            totalFixDataNum = allAssetInfoList.size();
            totalUnfixDataNum = allAssetInfoList.size() - totalFixDataNum;
            totalSoqlRecordNum = 0;
            Integer importAssetMapSize = importAssetMap.size();
            if (importAssetMapSize == 0) {
                ApexPages.addMessage(new ApexPages.Message(ApexPages.severity.WARNING, '未导入任何数据，请检查CSV文件'));
            } else {
                String importSuccessfulMsg = '导入CSV文件完成，成功导入' + importAssetMapSize + '条数据。';
                ApexPages.Message errorMessage = new ApexPages.Message(ApexPages.severity.INFO, importSuccessfulMsg);
                ApexPages.addMessage(errorMessage);
            }
        // } catch (Exception e) {
        //     System.debug('1234 ' + e);
        //     ApexPages.Message errorMessage = new ApexPages.Message(ApexPages.severity.ERROR, '导入过程出现错误，导入文件中可能存在Fieldset中不存在的列名，请检查CSV文件。');
        //     ApexPages.addMessage(errorMessage);
        // }

    }

    // 翻页到首页
    public Integer soqlNos(){
        getAllAssetData();
        return totalNum;
    }
    public void firstPage() {
        currPage = 1;
        totalNum = soqlNos();
        totalPage = (totalNum/selctRecordNum) + (Math.mod(totalNum, selctRecordNum) > 0 ? 1 : 0);
    }

    // 向前翻页
    public void previousPage() {
        returnFirstPageFlag = false;
        currPage --;
        totalNum = soqlNos();
        totalPage = (totalNum/selctRecordNum) + (Math.mod(totalNum, selctRecordNum) > 0 ? 1 : 0);
    }

    // 向后翻页
    public void nextPage() {
        returnFirstPageFlag = false;
        if (totalNum == 0) {
            currPage = 1;
        } else {
            currPage ++;
        }
        totalNum = soqlNos();
        System.debug('totalNum ==' + totalNum);
        totalPage = (totalNum/selctRecordNum) + (Math.mod(totalNum, selctRecordNum) > 0 ? 1 : 0);
        System.debug('totalPage ==' + totalPage);
        System.debug('currPage ==' + currPage);
    }

    // 翻页到尾页
    public void endPage() {
        System.debug('currPage11===' + currPage);
        System.debug('totalPage11===' + totalPage);
        returnFirstPageFlag = false;
        totalNum = soqlNos();  // 获取总页数
        totalPage = (totalNum/selctRecordNum) + (Math.mod(totalNum, selctRecordNum) > 0 ? 1 : 0);
        if (totalNum == 0){
            currPage  = 1;
        } else {
            currPage = totalPage;  // 将当前页数置为总页数
        }
        totalNum = soqlNos();
        System.debug('currPage1===' + currPage);
        System.debug('totalPage1===' + totalPage);
    }

    // 每页显示记录数变更
    public void recordNumChange() {
        currPage = 1;
        totalPage = (totalNum/selctRecordNum) + (Math.mod(totalNum, selctRecordNum) > 0 ? 1 : 0);
    }
    // 清空检索条件
    public void clearAllSearchConditionWhenCancel() {
        // 备品存放地
        //if (UserInfo.getProfileId() != System.Label.ProfileId_SystemAdmin) {
        //    if (String.isBlank(internalAssetLocation)) {
        //        internalAssetLocation = beipinCunFangDi;
        //    }
        //}
        // 对于备品管理者，2B3_备品中心管理者、2B3_备品中心管理者(照片) 默认显示北京、上海、广州备品中心的库存，可以检索
        //if (UserInfo.getProfileId() == System.Label.ProfileId_SystemAdmin || System.Label.ProfileId_EquCenAdmin.contains(UserInfo.getProfileId())) {
        //    internalAssetLocation1 = FixtureUtil.bieCunFangDiOpsMap.get('备品管理中心')[0].getValue();  // SelectOption('All', '--全部--')
        //} else {
        //    List<SelectOption> tempBieCunFangDiOpsList = FixtureUtil.bieCunFangDiOpsMap.get('备品管理中心');
        //    internalAssetLocation1 = beipinCunFangDi;
        //}
        searchB.internal_asset_location = internalAssetLocationLogin;
        searchB.fixture_Model_No = '';  // 备品配套明细型号
        searchB.wh_location = '';  // 货架号
        searchB.fixture_Status = '';  // 备品状态
        searchB.equipmentSet_Managment_Code = '';  // 备品管理编码
        searchB.internal_Asset_number = '';  // 固定资产号
        searchB.serialNumber = '';  // 机身号
        searchB.companyOfEquipment = '';  // 分公司号
        searchB.bodyOrAccessory = '';  // 主体/附属品
        searchB.product_category = '';  // 产品分类
        searchB.equipment_Type = '';  // 备品分类
        searchB.manage_type = '';  // 管理种类
        searchB.salesdepartment = '';  // 所在地区(本部)
        searchB.salesProvince = '';  // 所在地区(省)
        searchB.consumable_Guaranteen_endStr = '';  // 消耗品有效期至
        searchB.asset_loaner_category = ''; // 备品类别
        searchB.daysToExpired = ''; // 到期时间
        System.debug('Before searching.');
        searchBtn();
    }

    public List<SelectOption> getPlickList(String objApi, String fieldApi) {
        Schema.DescribeFieldResult fieldResult = Schema.getGlobalDescribe().get(objApi).getDescribe().fields.getMap().get(fieldApi).getDescribe();
        List<SelectOption> pickListValuesList= new List<SelectOption>();
        List<Schema.PicklistEntry> ple = fieldResult.getPicklistValues();
        pickListValuesList.add(new SelectOption('', NONE));
        for( Schema.PicklistEntry pickListVal : ple){
            pickListValuesList.add(new SelectOption(pickListVal.getValue(), pickListVal.getLabel()));
        }
        return pickListValuesList;
    }

    // 画面检索Bean
    public Class SearchBean {
        // 为了节省viewstate所以不使用Sobject
        // public Asset assetQuery {get; set;} // 查询用
        public String internal_asset_location {get; set;} // 备品存放地
        public String fixture_Model_No {get; set;}  // 备品配套明细型号 Fixture_Model_No__c
        public String wh_location {get; set;} // 货架号 WH_location__c
        public String fixture_Status {get; set;} // 备品状态
        public String equipmentSet_Managment_Code {get; set;} // 备品管理编码
        public String internal_Asset_number {get; set;} // 固定资产号
        public String serialNumber {get; set;} // 机身号
        public String companyOfEquipment {get; set;} // 分公司号
        public String bodyOrAccessory {get; set;} // 主体/附属品
        public String product_category {get; set;} // 产品分类
        public String equipment_Type {get; set;} // 备品分类
        public String manage_type {get; set;} // 管理种类
        public String salesdepartment {get; set;} // 所在地区(本部)
        public String salesProvince {get; set;} // 所在地区(省)
        public String asset_loaner_category {get; set;} // 备品类别
        public String daysToExpired {get;set;} // 到期时间
        public Date consumable_Guaranteen_end {get; set;} // 消耗品有效期至
        public String consumable_Guaranteen_endStr {
            get;
            set{
                consumable_Guaranteen_endStr = value;
                if (String.isNotBlank(consumable_Guaranteen_endStr)) {
                    consumable_Guaranteen_end = Date.valueOf(consumable_Guaranteen_endStr.replace('/', '-'));
                }
                else {
                    consumable_Guaranteen_end = null;
                }
            }
        } // 消耗品有效期至
    }
}