@isTest
private class InventoryReportControllerTest {
    // 创建 Asset & 盘点表头 & 盘点明细 数据
    static void setupTestData() {
        SS_Batch_Column_Mapping__c InventoryHeaderName = new SS_Batch_Column_Mapping__c(Name = 'Inventory_Header_Name', SS_TableName__c='Inventory_Header_Name');
        InventoryHeaderName.From_Column_001__c = '北京 备品中心';
        InventoryHeaderName.SS_Column_001__c = 'BJ';
        InventoryHeaderName.From_Column_002__c = '上海 备品中心';
        InventoryHeaderName.SS_Column_002__c = 'SH';
        InventoryHeaderName.From_Column_003__c = '广州 备品中心';
        InventoryHeaderName.SS_Column_003__c = 'GZ';
        insert new SS_Batch_Column_Mapping__c[] {InventoryHeaderName};
        // 病院を作る
        Account hospital = new Account();
        hospital.recordtypeId = [Select Id FROM RecordType WHERE IsActive = true and SobjectType = 'Account' and DeveloperName = 'HP'].id;
        hospital.Name = 'test hospital';
        hospital.Is_Active__c = '有効';
        hospital.Attribute_Type__c = '卫生部';
        hospital.Speciality_Type__c = '综合医院';
        hospital.Grade__c = '一级';
        hospital.OCM_Category__c = 'SLTV';
        hospital.Is_Medical__c = '医疗机构';
        //hospital.State_Master__c = al.id;
        //hospital.City_Master__c = al2.id;
        hospital.Town__c = '东京';
        insert hospital;

        // 戦略科室を得る
        Account[] strategicDep = [SELECT ID, Name FROM Account WHERE parentId = :hospital.Id AND recordType.DeveloperName = 'Department_Class_OTH'];
        // 診療科を作る
        Account dep = new Account();
        dep.recordtypeId = [Select Id FROM RecordType WHERE IsActive = true and SobjectType = 'Account' and DeveloperName = 'Department_OTH'].id;
        dep.Name = 'test dep';
        dep.AgentCode_Ext__c = '9999998';
        dep.ParentId = strategicDep[0].Id;
        dep.Department_Class__c = strategicDep[0].Id;
        dep.Hospital__c = hospital.Id;
        insert dep;

        Contact contact2 = new Contact();
        contact2.AccountId = dep.Id;
        contact2.FirstName = '責任者';
        contact2.LastName = 'test1经销商';
        insert contact2;

        // 产品
        Product2 pro1 = new Product2(Name='name01',IsActive=true,Family='GI',
                Fixture_Model_No__c='n01',Serial_Lot_No__c='S/N tracing',
                Fixture_Model_No_T__c = 'n01',
                ProductCode_Ext__c='pc01',Manual_Entry__c=false);
        Product2 pro2 = new Product2(Name='name02',IsActive=true,Family='GI',
                Fixture_Model_No__c='n02',Serial_Lot_No__c='Lot tracing',
                ProductCode_Ext__c='pc02',Manual_Entry__c=false);
        Product2 pro3 = new Product2(Name='name03',IsActive=true,Family='GI',
                Fixture_Model_No__c='n03',Serial_Lot_No__c='Lot tracing',
                ProductCode_Ext__c='pc03',Manual_Entry__c=false);
        insert new Product2[] {pro1, pro2, pro3};

        //---------------------------主体 两个附属品(个体管理 数量管理)
        // 保有设备A (主体)
        Asset assetA1 = new Asset(Asset_Owner__c = 'Olympus');
        assetA1.RecordTypeId = System.Label.Asset_RecordType;
        assetA1.SerialNumber = 'ass01';
        assetA1.Name = 'ass01';
        assetA1.AccountId = dep.Id;
        assetA1.Department_Class__c = strategicDep[0].Id;
        assetA1.Hospital__c = hospital.Id;
        assetA1.Product2Id = pro1.Id;
        assetA1.Quantity = 1;
        assetA1.Status = '有库存';
        assetA1.Manage_type__c = '个体管理';
        assetA1.Loaner_accsessary__c = false;
        assetA1.Product_category__c = 'GI';
        assetA1.Delete_Flag__c = false;
        assetA1.Freeze_sign__c = false;
        assetA1.Out_of_wh__c = 0;
        assetA1.Salesdepartment__c = '1.华北营业本部';
        assetA1.Internal_asset_location__c = '北京 备品中心';
        assetA1.Product_category__c = 'GI';
        assetA1.Equipment_Type__c = '产品试用';
        assetA1.SalesProvince__c = '北京';
        assetA1.WH_location__c = '货架号1';
        // 保有设备A (附属品 数量管理)
        Asset assetA2 = new Asset(Asset_Owner__c = 'Olympus');
        assetA2.RecordTypeId = System.Label.Asset_RecordType;
        assetA2.SerialNumber = 'ass02';
        assetA2.Name = 'ass02';
        assetA2.AccountId = dep.Id;
        assetA2.Department_Class__c = strategicDep[0].Id;
        assetA2.Hospital__c = hospital.Id;
        assetA2.Product2Id = pro2.Id;
        assetA2.Quantity = 10;
        assetA2.Status = '有库存';
        assetA2.Manage_type__c = '数量管理';
        assetA2.Loaner_accsessary__c = true;
        assetA2.Product_category__c = 'GI';
        assetA2.Delete_Flag__c = false;
        assetA2.Freeze_sign__c = false;
        assetA2.Out_of_wh__c = 3;
        assetA2.Frozen_Quantity__c = 2;
        assetA2.Salesdepartment__c = '1.华北营业本部';
        assetA2.Internal_asset_location__c = '北京 备品中心';
        assetA2.Product_category__c = 'GI';
        assetA2.Equipment_Type__c = '产品试用';
        assetA2.SalesProvince__c = '北京';
        assetA2.WH_location__c = '货架号2';
        // 保有设备A (附属品 个体管理)
        Asset assetA3 = new Asset(Asset_Owner__c = 'Olympus');
        assetA3.RecordTypeId = System.Label.Asset_RecordType;
        assetA3.SerialNumber = 'ass03';
        assetA3.Name = 'ass03';
        assetA3.AccountId = dep.Id;
        assetA3.Department_Class__c = strategicDep[0].Id;
        assetA3.Hospital__c = hospital.Id;
        assetA3.Product2Id = pro3.Id;
        assetA3.Quantity = 10;
        assetA3.Status = '有库存';
        assetA3.Manage_type__c = '数量管理';
        assetA3.Loaner_accsessary__c = true;
        assetA3.Product_category__c = 'GI';
        assetA3.Delete_Flag__c = false;
        assetA3.Freeze_sign__c = false;
        assetA3.Out_of_wh__c = 3;
        assetA3.Salesdepartment__c = '1.华北营业本部';
        assetA3.Internal_asset_location__c = '北京 备品中心';
        assetA3.Product_category__c = 'GI';
        assetA3.Equipment_Type__c = '产品试用';
        assetA3.SalesProvince__c = '北京';
        assetA3.WH_location__c = '货架号3';
        assetA3.Abandoned_Inventory__c = 1;
        insert new Asset[] {assetA1, assetA2, assetA3};

        // 盘点表头
        List<Inventory_Header__c> invHeadTestList = new List<Inventory_Header__c>();
        Inventory_Header__c invHead1 = new Inventory_Header__c();
        invHead1.Internal_asset_location__c = '北京 备品中心';
        // invHead1.InventoryPIC__c = ;
        invHead1.Inventory_Start_Date__c = Date.today();
        invHead1.Inventory_Status__c = '盘点中';
        invHead1.UniqueKey__c = '备品中心：' + String.valueOf(Date.today());
        invHeadTestList.add(invHead1);
        insert invHeadTestList;
        List<Inventory_Header__c> invHeadList = [SELECT Id FROM Inventory_Header__c];
        System.assertEquals(1, invHeadList.size());

        // 盘点表明细
        List<Inventory_Detail__c> invDetailTestList = new List<Inventory_Detail__c>();
        Inventory_Detail__c invDetail1 = new Inventory_Detail__c();
        invDetail1.Asset__c = assetA1.Id;
        invDetail1.Inventory_Header__c = invHead1.Id;
        invDetail1.toAbandon_amount__c = 1;             // 待废弃数
        invDetail1.Inventory_Count__c = 15;             // 实盘数
        invDetail1.Amount__c = 15;                      // 应盘数
        invDetail1.Internal_Asset_number__c = 'abc';    // 固定资产
        invDetail1.Internal_asset_location__c = '北京 备品中心';
        invDetail1.Inventory_Time__c = Date.today();
        invDetail1.Asset_Status__c = '在库';
        invDetail1.UniqueKey__c = '备品中心：' + String.valueOf(Date.today()) + '1';
        invDetailTestList.add(invDetail1);
        Inventory_Detail__c invDetail2 = new Inventory_Detail__c();
        invDetail2.Asset__c = assetA2.Id;
        invDetail2.Inventory_Header__c = invHead1.Id;
        invDetail2.toAbandon_amount__c = 1;             // 待废弃数
        invDetail2.Inventory_Count__c = 15;             // 实盘数
        invDetail2.Amount__c = 15;                      // 应盘数
        invDetail2.Internal_Asset_number__c = 'abc';    // 固定资产
        invDetail2.Internal_asset_location__c = '北京 备品中心';
        invDetail2.Asset_Status__c = '维修中';
        invDetail2.Inventory_Time__c = Date.today();
        invDetail2.UniqueKey__c = '备品中心：' + String.valueOf(Date.today()) + '2';
        invDetailTestList.add(invDetail2);
        Inventory_Detail__c invDetail3 = new Inventory_Detail__c();
        invDetail3.Asset__c = assetA3.Id;
        invDetail3.Inventory_Header__c = invHead1.Id;
        invDetail3.toAbandon_amount__c = 1;             // 待废弃数
        invDetail3.Inventory_Count__c = 15;             // 实盘数
        invDetail3.Amount__c = 15;                      // 应盘数
        invDetail3.Internal_Asset_number__c = 'abc';    // 固定资产
        invDetail3.Internal_asset_location__c = '北京 备品中心';
        invDetail3.Asset_Status__c = '出借中';
        invDetail3.Inventory_Time__c = Date.today();
        invDetail3.UniqueKey__c = '备品中心：' + String.valueOf(Date.today()) + '3';
        invDetailTestList.add(invDetail3);
        Inventory_Detail__c invDetail4 = new Inventory_Detail__c();
        invDetail4.Asset__c = assetA1.Id;
        invDetail4.Inventory_Header__c = invHead1.Id;
        invDetail4.toAbandon_amount__c = 1;             // 待废弃数
        invDetail4.Inventory_Count__c = 15;             // 实盘数
        invDetail4.Amount__c = 15;                      // 应盘数
        invDetail4.Internal_Asset_number__c = 'abc';    // 固定资产
        invDetail4.Internal_asset_location__c = '北京 备品中心';
        invDetail4.Asset_Status__c = '丢失';
        invDetail4.UniqueKey__c = '备品中心：' + String.valueOf(Date.today()) + '4';
        invDetailTestList.add(invDetail4);
        Inventory_Detail__c invDetail5 = new Inventory_Detail__c();
        invDetail5.Asset__c = assetA2.Id;
        invDetail5.Inventory_Header__c = invHead1.Id;
        invDetail5.toAbandon_amount__c = 1;             // 待废弃数
        invDetail5.Inventory_Count__c = 15;             // 实盘数
        invDetail5.Amount__c = 15;                      // 应盘数
        invDetail5.Internal_asset_location__c = '北京 备品中心';
        invDetail5.Asset_Status__c = '在库';
        invDetail5.UniqueKey__c = '备品中心：' + String.valueOf(Date.today()) + '5';
        invDetailTestList.add(invDetail5);
        Inventory_Detail__c invDetail6 = new Inventory_Detail__c();
        invDetail6.Asset__c = assetA3.Id;
        invDetail6.Inventory_Header__c = invHead1.Id;
        invDetail6.toAbandon_amount__c = 1;             // 待废弃数
        invDetail6.Inventory_Count__c = 15;             // 实盘数
        invDetail6.Amount__c = 15;                      // 应盘数
        invDetail6.Internal_asset_location__c = '北京 备品中心';
        invDetail6.Asset_Status__c = '在库';
        invDetail6.UniqueKey__c = '备品中心：' + String.valueOf(Date.today()) + '6';
        invDetailTestList.add(invDetail6);
        insert invDetailTestList;
        List<Inventory_Detail__c> invDetailList = [SELECT Id FROM Inventory_Detail__c];
        System.assertEquals(6, invDetailList.size());

    }

    // 获取存在经理(备品)、部长(备品)、总监的用户[用于保存为盘点报告提交人]
    static Map<String, Id> usersMap { get {
        List<User> submitUser = [
                SELECT Id, Name, JingliEquipmentManager__c, Buzhang_Equipment_Manager__c
                , ZongjianApprovalManager__c, SalesManager__c, BuchangApprovalManagerSales__c
                  FROM User
                 WHERE ZongjianApprovalManager__c <> null
                 AND BuZhangEquipmentId__c <> null
                 AND JingliEquipmentManager__c <> null
                 AND Buzhang_Equipment_Manager__c <> null
                 AND JingliEquipmentId__c <> null
                 LIMIT 1
                ];
        System.assertEquals(submitUser.size(), 1);  // todo jwt 如果是新刷的sandbox 可能会报错
        Map<String, String> userIdMap = new Map<String, String>();
        userIdMap.put('submiter', submitUser[0].Id);
        // 经理/部长(备品)没有的话, 取经理/部长(销售)
        if (submitUser[0].JingliEquipmentManager__c == null) {
            userIdMap.put('submiterJingli', submitUser[0].SalesManager__c);
        } else {
            userIdMap.put('submiterJingli', submitUser[0].JingliEquipmentManager__c);
        }
        if (submitUser[0].Buzhang_Equipment_Manager__c == null) {
            userIdMap.put('submiterBuzhang', submitUser[0].BuchangApprovalManagerSales__c);
        } else {
            userIdMap.put('submiterBuzhang', submitUser[0].Buzhang_Equipment_Manager__c);
        }
        userIdMap.put('submiterZongjian', submitUser[0].ZongjianApprovalManager__c);
        return userIdMap;
    }}

    static Inventory_Header__c invHeadObj { get {
        List<Inventory_Header__c> invObjs = [
                SELECT Id, Inventory_Status__c, Name, InventoryPIC__r.Name
                , Inventory_Submit_Date__c, Internal_asset_location__c, Inventory_Start_Date__c
                , Inventory_Date_From__c, Inventory_Date_To__c, Inventory_Persons__c
                , InventorySubmit_PIC__c, InventorySubmit_PIC__r.Post__c, InventoryCheck_PIC__c
                , InventoryCheck_PIC__r.Post__c, Checktime__c
                , Jingli_Equipment__r.Name, Buzhang_Equipment__r.Name, Zongjian_Equipment__r.Name
                , IvtDifference_Detail__c, IvtDifference_Comment__c
                , Buzhang_Equipment_Id__c, Zongjian_Equipment_Id__c, Jingli_Equipment_Id__c
                 FROM Inventory_Header__c
                ];
        System.assertEquals(invObjs.size(), 1);
        Inventory_Header__c invHeadObj = invObjs[0];

        return invHeadObj;
    }}

    static String invHeadId { get { return invHeadObj.Id; }}

    // 初始化画面
    static testMethod void testInitPage() {
        // システム管理者
        User user = new User(Test_staff__c = true);
        user.LastName = '_サンブリッジ';
        user.FirstName = 'う';
        user.Alias = 'う';
        user.Email = 'olympusTest03@sunbridge.com';
        user.Username = 'olympusTest03@sunbridge.com';
        user.CommunityNickname = 'う';
        user.IsActive = true;
        user.EmailEncodingKey = 'ISO-2022-JP';
        user.TimeZoneSidKey = 'Asia/Tokyo';
        user.LocaleSidKey = 'ja_JP';
        user.LanguageLocaleKey = 'ja';
        user.ProfileId = System.Label.ProfileId_SystemAdmin;
        user.Job_Category__c = '销售推广';
        user.Province__c = '北京市';
        user.Use_Start_Date__c = Date.today().addMonths(-6);
        user.SalesManager__c = UserInfo.getUserId();
        user.BuchangApprovalManagerSales__c = UserInfo.getUserId();
        user.JingliApprovalManager__c = UserInfo.getUserId();
        user.BuchangApprovalManager__c = UserInfo.getUserId();
        user.ZongjianApprovalManager__c = UserInfo.getUserId();
        user.Buzhang_Equipment_Manager__c = UserInfo.getUserId();
        user.JingliEquipmentManager__c = UserInfo.getUserId();

        System.runAs(new User(Id = Userinfo.getUserId())) {
            setupTestData();

            insert user;
            User currUser = [
                        SELECT Id, Name, Default_Referable_Apply_Equipment_Center__c
                        FROM User
                        WHERE Id = :UserInfo.getUserId()
                        ];
            System.assertEquals('北京 备品中心', currUser.Default_Referable_Apply_Equipment_Center__c);

            PageReference page = new PageReference('/apex/InventoryReport');    // 不带id的url
            System.Test.setCurrentPage(page);
            InventoryReportController controller = new InventoryReportController();
            controller.init();
            page = new PageReference('/apex/InventoryReport?Id=' + invHeadId);  // 带id的url
            System.Test.setCurrentPage(page);
            controller.init();


            System.Test.StartTest();
            Inventory_Header__c invHead = [
                    SELECT Id, Inventory_Date_From__c, Inventory_Date_To__c, Inventory_Persons__c
                    , IvtDifference_Detail__c, IvtDifference_Comment__c, Internal_asset_location__c
                    , InventorySubmit_PIC__c, Jingli_Equipment__c, Buzhang_Equipment__c, Zongjian_Equipment__c
                    FROM Inventory_Header__c
                    WHERE Id = :invHeadId
                    ];
            System.assertEquals(invHead.Internal_asset_location__c, '北京 备品中心');
            if (String.isNotBlank(invHead.InventorySubmit_PIC__c)) {
                User submitUser = [
                        SELECT Id, Name, JingliEquipmentManager__c, Buzhang_Equipment_Manager__c
                        , ZongjianApprovalManager__c
                          FROM User
                         WHERE Id = :invHead.InventorySubmit_PIC__c
                        ];
                System.assertEquals(invHead.Jingli_Equipment__c, submitUser.JingliEquipmentManager__c);
                System.assertEquals(invHead.Buzhang_Equipment__c, submitUser.Buzhang_Equipment_Manager__c);
                System.assertEquals(invHead.Zongjian_Equipment__c, submitUser.ZongjianApprovalManager__c);
            }

            System.Test.StopTest();
        }

    }

    // 保存按钮--盘点报告提交人 & 盘点报告确认人 & 盘点人员 & 盘点时间From & 盘点时间To & 盘点差异具体情况说明 & 差异资产部门处理意见
    static testMethod void testSaveData() {
        
            setupTestData();

            PageReference page = new PageReference('/apex/InventoryReport?Id=' + invHeadId);
            System.Test.setCurrentPage(page);
            InventoryReportController controller = new InventoryReportController();
            controller.init();
            controller.ihObj.Inventory_Date_From__c = Date.today();
            controller.ihObj.Inventory_Date_To__c = Date.today();
            controller.ihObj.Inventory_Persons__c = 'inventoryPerson1,inventoryPerson2';
            controller.ihObj.InventorySubmit_PIC__c = usersMap.get('submiter');
            controller.ihObj.InventoryCheck_PIC__c = usersMap.get('submiter');  // 随意指定,不能为空
            // controller.ihObj.Jingli_Equipment__c = hpOwner.JingliEquipmentManager__c;
            // controller.ihObj.Buzhang_Equipment__c = hpOwner.Buzhang_Equipment_Manager__c;
            // controller.ihObj.Zongjian_Equipment__c = hpOwner.ZongjianApprovalManager__c;
            controller.ihObj.IvtDifference_Detail__c = '盘点差异具体情况说明';
            controller.ihObj.IvtDifference_Comment__c = '差异资产部门处理意见';

            System.Test.StartTest();
            controller.init();
            page = controller.saveSubmit();

            

            Inventory_Header__c invHead = [
                    SELECT Id, Inventory_Date_From__c, Inventory_Date_To__c, Inventory_Persons__c
                    , IvtDifference_Detail__c, IvtDifference_Comment__c
                    , InventorySubmit_PIC__c, InventoryCheck_PIC__c, Jingli_Equipment__c, Buzhang_Equipment__c, Zongjian_Equipment__c
                    FROM Inventory_Header__c
                    WHERE Id = :invHeadId
                    ];
           // System.assertEquals(invHead.Inventory_Date_From__c, Date.today());
           // System.assertEquals(invHead.Inventory_Date_To__c, Date.today());
           // System.assertEquals(invHead.Inventory_Persons__c, 'inventoryPerson1,inventoryPerson2');
          //  System.assertEquals(invHead.IvtDifference_Detail__c, '盘点差异具体情况说明');
          //  System.assertEquals(invHead.IvtDifference_Comment__c, '差异资产部门处理意见');
            // 自动获取盘点报告提交人的经理 部长 总监
            //System.assertEquals(invHead.InventorySubmit_PIC__c, usersMap.get('submiter'));
            //System.assertEquals(invHead.Jingli_Equipment__c, usersMap.get('submiterJingli'));
            //System.assertEquals(invHead.Buzhang_Equipment__c, usersMap.get('submiterBuzhang'));
            //System.assertEquals(invHead.Zongjian_Equipment__c, usersMap.get('submiterZongjian'));

            System.Test.StopTest();
      
    }

    // 提交盘点报告按钮
    static testMethod void testSubmitData() {
        setupTestData();

        PageReference page = new PageReference('/apex/InventoryReport?Id=' + invHeadId + '&saveType=1');
        System.Test.setCurrentPage(page);
        InventoryReportController controller = new InventoryReportController();
        controller.init();
        System.assertEquals(String.isNotBlank(usersMap.get('submiter')), true);
        controller.ihObj.Inventory_Date_From__c = Date.today();
        controller.ihObj.Inventory_Date_To__c = Date.today();
        controller.ihObj.Inventory_Persons__c = 'inventoryPerson1,inventoryPerson2';
        controller.ihObj.InventorySubmit_PIC__c = usersMap.get('submiter');
        controller.ihObj.InventoryCheck_PIC__c = usersMap.get('submiter');  // 随意指定,不能为空
        controller.ihObj.IvtDifference_Detail__c = '盘点差异具体情况说明';
        controller.ihObj.IvtDifference_Comment__c = '差异资产部门处理意见';
        page = controller.saveSubmit();

        System.Test.StartTest();

        //System.assertEquals(controller.ihObj.Inventory_Status__c, '填写完毕');
        //System.assertEquals(controller.ihObj.Inventory_Submit_Date__c, Date.today());
        // 自动获取盘点报告提交人的经理 部长 总监

        System.Test.StopTest();
    }

    // 提交盘点报告按钮--审批流
    static testMethod void testApprovalProcess() {
        setupTestData();

        PageReference page = new PageReference('/apex/InventoryReport?Id=' + invHeadId + '&saveType=1');
        System.Test.setCurrentPage(page);
        InventoryReportController controller = new InventoryReportController();
        controller.init();
        System.assertEquals(String.isNotBlank(usersMap.get('submiter')), true);
        controller.ihObj.Inventory_Date_From__c = Date.today();
        controller.ihObj.Inventory_Date_To__c = Date.today();
        controller.ihObj.Inventory_Persons__c = 'inventoryPerson1,inventoryPerson2';
        controller.ihObj.InventorySubmit_PIC__c = usersMap.get('submiter');
        controller.ihObj.InventoryCheck_PIC__c = usersMap.get('submiter');  // 随意指定,不能为空
        controller.ihObj.IvtDifference_Detail__c = '盘点差异具体情况说明';
        controller.ihObj.IvtDifference_Comment__c = '差异资产部门处理意见';
        page = controller.saveSubmit();

        System.Test.StartTest();

        // List<ProcessInstance> piList = [
        //                     SELECT Id, TargetObjectId, Status, CreatedDate, CompletedDate
        //                     ,(
        //                         SELECT Id
        //                             ,ActorId
        //                             ,Comments
        //                             ,IsPending
        //                             ,OriginalActorId
        //                             ,ProcessInstanceId
        //                             ,StepStatus
        //                             ,TargetObjectId
        //                             ,CreatedDate
        //                           FROM StepsAndWorkitems
        //                          ORDER BY CreatedDate
        //                     )
        //                       FROM ProcessInstance
        //                      WHERE TargetObjectId = :invHeadObj.Id
        //                      ORDER BY CreatedDate DESC
        //                     ];
        // List<ProcessInstanceHistory> piHistory = piList[0].StepsAndWorkitems;

        // // Create an approval request for the Opportunity
        // Approval.ProcessWorkitemRequest req1 = new Approval.ProcessWorkitemRequest();
        // req1.setComments('Remark');
        // req1.setWorkitemId(piHistory[0].Id);
        // req1.setAction('Approve');
        // // Submit the approval request for the Opportunity
        // Approval.ProcessResult result1 = Approval.process(req1);
        controller.init();

        System.Test.StopTest();
    }

    // for coverage
    static testMethod void testException() {
        setupTestData();

        Inventory_Header__c invHeadObj = new Inventory_Header__c();
        invHeadObj.Internal_asset_location__c = '北京 备品中心';
        invHeadObj.Inventory_Start_Date__c = Date.today();
        invHeadObj.Inventory_Status__c = '处理中';
        invHeadObj.UniqueKey__c = '备品中心Obj：' + String.valueOf(Date.today());
        insert invHeadObj;

        InventoryReportController controller = new InventoryReportController();

        // 数据错误, 或者盘点报告状态为处理中
        PageReference page1 = new PageReference('/apex/InventoryReport?Id=' + invHeadObj.Id);
        System.Test.setCurrentPage(page1);
        controller.init();
        // 当前用户所在地区没有盘点报告, 或者盘点报告状态为处理中
        PageReference page2 = new PageReference('/apex/InventoryReport');
        System.Test.setCurrentPage(page2);
        controller.init();

        delete invHeadObj;

        // 盘点时间From不能大于盘点时间To。
        PageReference page3 = new PageReference('/apex/InventoryReport?Id=' + invHeadId);
        System.Test.setCurrentPage(page3);
        controller.init();
        controller.ihObj.Inventory_Date_From__c = Date.today().addDays(60);
        controller.ihObj.Inventory_Date_To__c = Date.today();
        page3 = controller.saveSubmit();

        // 盘点报告提交人或确认人不能为空, 请先确认。
        PageReference page4 = new PageReference('/apex/InventoryReport?Id=' + invHeadId);
        System.Test.setCurrentPage(page4);
        controller.init();
        controller.ihObj.Inventory_Date_From__c = Date.today();
        controller.ihObj.Inventory_Date_To__c = Date.today();
        controller.ihObj.InventorySubmit_PIC__c = null;
        page4 = controller.saveSubmit();
    }
    static testMethod void updaue() {
        InventoryReportController.test();//先调用这个，然后继续补充测试类
    }
}