public without sharing class LexInventoryViewController {
    /*****************画面表示Bean******************/
    public static List<ConsumableorderdetailsInfo> consumableorderdetailsRecords = new List<ConsumableorderdetailsInfo>();
    public static List<List<ConsumableorderdetailsInfo>> consumableorderdetailsRecordsview = new List<List<ConsumableorderdetailsInfo>>();

    // page
    public static Integer pagesize { get; set; }
    public static Integer pageToken { get; set; }
    public static String sortField { get; set; }
    public static String sortOrder{ get; set; }

    
    public static Integer totalcount { get; set; }
    // public static Integer pagecount { get; set; }
    // public static Integer currentpage { get; set; }
    // public static Boolean hasPrevious { get; set; }
    // public static Boolean hasNext { get; set; }
    public static List<ConsumableorderdetailsInfo> pageRecords { get; set; }
    public static String soql { get; set; }

    // public static String sortKey { get; set; }
    // public static String preSortKey { get; private set; }
    // public static Boolean sortOrderAsc { get; private set; }
    // public static String[] sortOrder { get; private set; }
    // private static String[] columus = new List<String>{
    //     'Product2__c.Name__c',
    //     'Asset_Model_No__c',
    //     '',
    //     'Category3__c',
    //     'Category4__c',
    //     'Category5__c',
    //     ''
    // };

    public static String[] proLimitAndDate = new List<String>{};
    private static Map<String, Date> productkucun = new Map<String, Date>();
    public static List<SelectOption> categoryOptionList { get; set; }
    @AuraEnabled
    public static Map<String, String> categoryOptionMap { get; set; }
    public static List<SelectOption> category4OptionList { get; set; }
    @AuraEnabled
    public static Map<String, String> category4OptionMap { get; set; }
    public static List<SelectOption> category5OptionList { get; set; }
    @AuraEnabled
    public static Map<String, String> category5OptionMap { get; set; }
    public static String category5 { get; set; }
    public static String category4 { get; set; }
    public static String category3 { get; set; }
    public static String category_Goods { get; set; }
    public static String category1 { get; set; }
    public static Boolean editAble { get; set; }
    // 经销商在库产品ID
    public static List<String> orderDetZaikuList = new List<String>();
    // 产品 ID
    public static String ESetId { get; set; }
    public static String idCheck { get; set; }
    /*****************ソート時再検索条件（画面からの入力条件を無視するため）******************/
    private static String accountid = null;
    public static String accountName { get; set; }
    // 查看产品
    // private String[] ProidListAll = new String[]{};
    // 登录者工作地
    private static String userWorkLocation;
    // 经销商用户产品分类（ET、ENG）
    public static String agencyProType { get; set; }
    public static String sqlagencyProType;

    // add by rentx 2021-3-10
    public static Boolean hasHos { get; set; }
    // add by rentx 2021-3-10

    public LexInventoryViewController() {
        consumableorderdetailsRecords = new List<ConsumableorderdetailsInfo>();
        consumableorderdetailsRecordsview = new List<List<ConsumableorderdetailsInfo>>();
        editAble = false;
        categoryOptionList = new List<SelectOption>();
        category4OptionList = new List<SelectOption>();
        category5OptionList = new List<SelectOption>();
        categoryOptionMap = new Map<String, String>();
        category4OptionMap = new Map<String, String>();
        category5OptionMap = new Map<String, String>();

        // page
        // pagesize = Integer.valueof(system.label.orderdetLimitsize);
        // currentpage = 0;
    }

    @AuraEnabled
    public static ResponseBodyLWC init2(Integer pageSizeLWC,Integer pageTokenLWC,String sortFieldLWC,String sortOrderLWC) {
        return new ResponseBodyLWC('Error', 500, '测试 init2', '');
    }

    @AuraEnabled
    public static ResponseBodyLWC init(Integer pageSizeLWC, Integer pageTokenLWC, String sortFieldLWC, String sortOrderLWC) {
        pageSize =pageSizeLWC;
        pageToken = pageTokenLWC;
        sortField = sortFieldLWC;
        sortOrder = sortOrderLWC;

        


        ResponseBodyLWC res = new ResponseBodyLWC();
        Map<String, object> data = new Map<String, object>();
        res.entity = data;

        categoryOptionMap = new Map<String, String>();
        category4OptionMap = new Map<String, String>();
        category5OptionMap = new Map<String, String>();

        // sortKey = '2';
        // preSortKey = '2';
        // sortOrderAsc = false;
        // sortOrder = new List<String>(8);
        // sortOrder = new List<String>{ ' ', '', ' ', ' ', '', '', '', '↓' };

        // 取用户ID
        String userId = UserInfo.getUserId();
        User useracc = [SELECT Accountid, Work_Location__c, UserPro_Type__c FROM user WHERE id = :userId];
        accountid = useracc.accountid;
        userWorkLocation = useracc.Work_Location__c;
        agencyProType = Useracc.UserPro_Type__c;
        if (String.isBlank(Useracc.UserPro_Type__c)) {
            agencyProType = 'ET';
        }
        Account accountInfo = [SELECT Name, Dealer_discount__c, Product_Limit_Date__c FROM account WHERE id = :accountid];
        accountName = accountInfo.Name;
        // 经销商查看产品
        String product_Limit = accountInfo.Product_Limit_Date__c;

        if (product_Limit != null && product_Limit != '') {
            proLimitAndDate = product_Limit.split(',');
        }

        List<ConsumableorderdetailsInfo> boxRecords = new List<ConsumableorderdetailsInfo>();
        Map<String, Product2__c> MidMap = new Map<String, Product2__c>();
        Map<String, ConsumableorderdetailsInfo> newMidBoxMap = new Map<String, ConsumableorderdetailsInfo>();
        Map<String, ConsumableorderdetailsInfo> newMidPieceMap = new Map<String, ConsumableorderdetailsInfo>();
        // 库存明细取得
        sqlagencyProType = '%' + agencyProType + '%';
        orderDetZaikuList = new List<String>();
        System.debug('sqlagencyProType = ' + sqlagencyProType);
        System.debug('accountName = ' + accountName);
        System.debug('userWorkLocation = ' + userWorkLocation);
        List<AggregateResult> orderDetZaiku = [
            SELECT count(Id), Consumable_Product__c
            FROM Consumable_order_details2__c
            WHERE
                Dealer_Arrive__c = TRUE
                AND Dealer_Shipment__c = FALSE
                AND Dealer_Saled__c = FALSE
                AND Lose_Flag__c = FALSE
                AND Dealer_Returned__c = FALSE
                AND Bar_Code__c != NULL
                AND Product_Type__c LIKE :sqlagencyProType
                AND Dealer_Info_text__c = :accountName
                AND Cancellation_Flag__c = FALSE
                AND Arrive_Owner_Work_Location__c = :userWorkLocation
            GROUP BY Consumable_Product__c
        ];

        for (AggregateResult zaikuId : orderDetZaiku) {
            orderDetZaikuList.add(String.valueOf(zaikuId.get('Consumable_Product__c')));
        }
        System.debug('orderDetZaikuList = ' + orderDetZaikuList);
        List<Consumable_order_details2__c> CountDel = [
            SELECT
                Id,
                Bar_Code__c,
                Name,
                Inventory_date__c,
                Consumable_Product__c,
                Recordtypeid,
                Guarantee_period_for_products__c,
                Isoverdue__c,
                Box_Piece__c,
                hospitalSpecialOffer__c
            FROM Consumable_order_details2__c
            WHERE
                Dealer_Arrive__c = TRUE
                AND Dealer_Shipment__c = FALSE
                AND Dealer_Saled__c = FALSE
                AND Dealer_Returned__c = FALSE
                AND Lose_Flag__c = FALSE
                AND Cancellation_Flag__c = FALSE
                AND Bar_Code__c != NULL
                AND Product_Type__c LIKE :sqlagencyProType
                AND Dealer_Info_text__c = :accountName
                AND Arrive_Owner_Work_Location__c = :userWorkLocation
        ];
        System.debug('MidMap = ' + MidMap);
        System.debug('CountDel111 = ' + CountDel);
        System.debug('orderDetZaikuList  = ' + orderDetZaikuList);
        List<Product2__c> product2Selected = [
            SELECT
                Id,
                Name,
                Name__c,
                Intra_Trade_List_RMB__c,
                Asset_Model_No__c,
                Category3__c,
                Category4__c,
                Category5__c,
                SFDA_Status__c,
                Product2__r.SFDA_Approbation_No__c,
                Product2__r.SFDA_Expiration_Date__c,
                Product2__r.Packing_list_manual__c
            FROM Product2__c
            WHERE Id IN :orderDetZaikuList
        ];
        System.debug('product2Selected  = ' + product2Selected);
        for (Integer i = 0; i < product2Selected.size(); i++) {
            MidMap.put(product2Selected[i].Id, product2Selected[i]);
        }
        System.debug('MidMap = ' + MidMap);
        /////////////////////====================================update by rentx
        Map<String, ConsumableorderdetailsInfo> newHosMidBoxMap = new Map<String, ConsumableorderdetailsInfo>();
        Map<String, ConsumableorderdetailsInfo> newHosMidPieceMap = new Map<String, ConsumableorderdetailsInfo>();
        // update by rentx 2021-01-27 start
        for (Integer i = 0; i < CountDel.size(); i++) {
            // 然后循环CountDel做Box和piece2个map
            if (MidMap.containsKey(CountDel[i].Consumable_Product__c) && CountDel[i].Box_Piece__c == '盒') {
                String tex = 'A';
                if (CountDel[i].hospitalSpecialOffer__c) {
                    tex = 'B';
                }
                if (newMidBoxMap.containsKey(CountDel[i].Consumable_Product__c + CountDel[i].Box_Piece__c + tex)) {
                    ConsumableorderdetailsInfo Jstage = newMidBoxMap.get(CountDel[i].Consumable_Product__c + CountDel[i].Box_Piece__c + tex)
                        .clone();
                    Jstage.allnumber = Jstage.allnumber + 1;
                    if (CountDel[i].Isoverdue__c == 1) {
                        Jstage.limitCount = Jstage.limitCount + 1;
                    }
                    Jstage.BoxPiece = CountDel[i].Box_Piece__c;
                    newMidBoxMap.put(CountDel[i].Consumable_Product__c + CountDel[i].Box_Piece__c + tex, Jstage);
                } else {
                    ConsumableorderdetailsInfo Jstage = new ConsumableorderdetailsInfo(MidMap.get(CountDel[i].Consumable_Product__c));
                    Jstage.allnumber = Jstage.allnumber + 1;
                    if (CountDel[i].Isoverdue__c == 1) {
                        Jstage.limitCount = Jstage.limitCount + 1;
                    }
                    Jstage.BoxPiece = CountDel[i].Box_Piece__c;
                    if (CountDel[i].hospitalSpecialOffer__c) {
                        Jstage.hospitalSpecialOffer = true;
                    } else {
                        Jstage.hospitalSpecialOffer = false;
                    }
                    newMidBoxMap.put(CountDel[i].Consumable_Product__c + CountDel[i].Box_Piece__c + tex, Jstage);
                }
            } else if (MidMap.containsKey(CountDel[i].Consumable_Product__c) && CountDel[i].Box_Piece__c == '个') {
                String tex = 'A';
                if (CountDel[i].hospitalSpecialOffer__c) {
                    tex = 'B';
                }
                if (newMidPieceMap.containsKey(CountDel[i].Consumable_Product__c + CountDel[i].Box_Piece__c + tex)) {
                    ConsumableorderdetailsInfo Jstage = newMidPieceMap.get(
                            CountDel[i].Consumable_Product__c +
                            CountDel[i].Box_Piece__c +
                            tex
                        )
                        .clone();
                    Jstage.allnumber = Jstage.allnumber + 1;
                    if (CountDel[i].Isoverdue__c == 1) {
                        Jstage.limitCount = Jstage.limitCount + 1;
                    }
                    Jstage.BoxPiece = CountDel[i].Box_Piece__c;
                    if (CountDel[i].hospitalSpecialOffer__c) {
                        Jstage.hospitalSpecialOffer = true;
                    } else {
                        Jstage.hospitalSpecialOffer = false;
                    }
                    newMidPieceMap.put(CountDel[i].Consumable_Product__c + CountDel[i].Box_Piece__c + tex, Jstage);
                } else {
                    ConsumableorderdetailsInfo Jstage = new ConsumableorderdetailsInfo(MidMap.get(CountDel[i].Consumable_Product__c));
                    Jstage.allnumber = Jstage.allnumber + 1;
                    if (CountDel[i].Isoverdue__c == 1) {
                        Jstage.limitCount = Jstage.limitCount + 1;
                    }
                    Jstage.BoxPiece = CountDel[i].Box_Piece__c;
                    if (CountDel[i].hospitalSpecialOffer__c) {
                        Jstage.hospitalSpecialOffer = true;
                    } else {
                        Jstage.hospitalSpecialOffer = false;
                    }
                    newMidPieceMap.put(CountDel[i].Consumable_Product__c + CountDel[i].Box_Piece__c + tex, Jstage);
                }
            }
        }
        consumableorderdetailsRecords = new List<ConsumableorderdetailsInfo>();
        // 把Boxmap里的值从新赋给boxRecords
        System.debug('newMidBoxMap = ' + newMidBoxMap);
        for (ConsumableorderdetailsInfo bss : newMidBoxMap.values()) {
            if (bss.allnumber > 0) {
                bss.sortBy = false;
                bss.packing_list = Integer.valueof(bss.Prod.Product2__r.Packing_list_manual__c);
                bss.approbation_No = bss.Prod.Product2__r.SFDA_Approbation_No__c;
                bss.expiration_Date = bss.Prod.Product2__r.SFDA_Expiration_Date__c;
                bss.overlimitCount = bss.allnumber - bss.limitCount;
                boxRecords.add(bss);
            }
        }

        boxRecords.sort();
        for (ConsumableorderdetailsInfo bss : newMidPieceMap.values()) {
            if (bss.allnumber > 0) {
                bss.packing_list = Integer.valueof(bss.Prod.Product2__r.Packing_list_manual__c);
                bss.approbation_No = bss.Prod.Product2__r.SFDA_Approbation_No__c;
                bss.expiration_Date = bss.Prod.Product2__r.SFDA_Expiration_Date__c;
                bss.overlimitCount = bss.allnumber - bss.limitCount;
            }
        }
        for (ConsumableorderdetailsInfo bss : boxRecords) {
            consumableorderdetailsRecords.add(bss);
            // 该产品是医院特价产品
            if (bss.hospitalSpecialOffer && newMidPieceMap.containsKey(bss.Prod.Id + '个B')) {
                if (newMidPieceMap.get(bss.Prod.Id + '个B').hospitalSpecialOffer) {
                    consumableorderdetailsRecords.add(newMidPieceMap.get(bss.Prod.Id + '个B'));
                    newMidPieceMap.remove(bss.Prod.Id + '个B');
                }
            }

            if (!bss.hospitalSpecialOffer && newMidPieceMap.containsKey(bss.Prod.Id + '个A')) {
                // if (newMidPieceMap.get(bss.Prod.Id+'个A')) {
                consumableorderdetailsRecords.add(newMidPieceMap.get(bss.Prod.Id + '个A'));
                newMidPieceMap.remove(bss.Prod.Id + '个A');
                // }
            }
        }
        for (ConsumableorderdetailsInfo bss : newMidPieceMap.values()) {
            if (newMidPieceMap.containsKey(bss.Prod.Id + '个B')) {
                consumableorderdetailsRecords.add(newMidPieceMap.get(bss.Prod.Id + '个B'));
            }
        }
        for (ConsumableorderdetailsInfo bss : newMidPieceMap.values()) {
            if (newMidPieceMap.containsKey(bss.Prod.Id + '个A')) {
                consumableorderdetailsRecords.add(newMidPieceMap.get(bss.Prod.Id + '个A'));
            }
        }
        productLimtAndDate();
        datelimitSearch();

        // add by rentx 2021-3-10 start
        Integer hosnum = 0;
        // add by rentx 2021-3-10 end
        for (ConsumableorderdetailsInfo bss : consumableorderdetailsRecords) {
            if (productkucun.get(bss.Prod.Id) != null) {
                bss.guaranteeperiod = productkucun.get(bss.Prod.Id);
            }

            // add by rentx 2021-3-10 start
            if (bss.hospitalSpecialOffer) {
                hosnum = hosnum + 1;
            }
        }
        if (hosnum > 0) {
            hasHos = true;
        } else {
            hasHos = false;
        }
        // add by rentx 2021-3-10 end
        // listCut();

        AggregateResult[] categoryList = [
            SELECT Count(id), Category3_text__c c3c
            FROM Product2__c
            WHERE Estimation_Entry_Possibility__c = '○' AND Product_Type__c LIKE :agencyProType AND Category3_text__c != NULL
            GROUP BY Category3_text__c
        ];

        categoryOptionList = new List<SelectOption>();
        categoryOptionList.add(new SelectOption('', '-无-'));
        categoryOptionMap.put('', '-无-');
        for (AggregateResult category3Search : categoryList) {
            String deliverycnt = String.valueOf(category3Search.get('c3c'));
            categoryOptionList.add(new SelectOption(deliverycnt, deliverycnt));
            categoryOptionMap.put(deliverycnt, deliverycnt);
        }

        category4OptionList = new List<SelectOption>();
        category4OptionList.add(new SelectOption('', '-无-'));
        category4OptionMap.put('', '-无-');

        category5OptionList = new List<SelectOption>();
        category5OptionList.add(new SelectOption('', '-无-'));
        category5OptionMap.put('', '-无-');
        System.debug('categoryOptionList===>' + category4OptionList);
        System.debug('category4OptionList===>' + category4OptionList);
        System.debug('category5OptionList===>' + category4OptionList);

        //// 总件数
        totalcount = consumableorderdetailsRecords.size();
        //// 页数
        // pagecount = (totalcount  +  pagesize  - 1) / pagesize;

        //// 显示第一页

        // moveToFirst();
        makeCurrentPageRecords();
        // data.put('categoryOptionList',categoryOptionList);
        PaginatedAccounts paginatedAccounts = new PaginatedAccounts();
        paginatedAccounts.nextPageToken = (pageToken + pageSize < totalCount) ? pageToken + pageSize : null;
        paginatedAccounts.recordStart = pageToken + 1;
        paginatedAccounts.pageNumber = pageToken/pageSize + 1;
        Integer recordEnd = pageSize * paginatedAccounts.pageNumber;
        paginatedAccounts.recordEnd = totalCount >= recordEnd ? recordEnd : totalCount;
        paginatedAccounts.totalRecords = totalCount;



        data.put('paginatedAccounts', paginatedAccounts);

        data.put('categoryOptionMap', categoryOptionMap);
        data.put('category4OptionMap', category4OptionMap);
        data.put('category5OptionMap', category5OptionMap);

        data.put('agencyProType', agencyProType);
        data.put('orderDetZaikuList', orderDetZaikuList);
        data.put('accountid', accountid);
        data.put('accountName', accountName);
        data.put('sqlagencyProType', accountName);
        data.put('userWorkLocation', userWorkLocation);
        data.put('agencyProType', agencyProType);
        data.put('pageRecords', pageRecords);
        res.status = 'Success';
        res.code = 200;
        System.debug('res = ' + res);
        return res;
    }

    public static void categoryAllload() {
        ResponseBodyLWC res = new ResponseBodyLWC();
        // Map<String, object> data = new Map<String, object>();
        // dataselect  = new List<SelectOption>();
        // res.entity = dataselect;
        AggregateResult[] category4List = [
            SELECT Count(id), Category4_text__c c4c
            FROM Product2__c
            WHERE
                Estimation_Entry_Possibility__c = '○'
                AND Category3_text__c = :category3
                AND Product_Type__c LIKE :agencyProType
                AND Category4_text__c != NULL
                AND Category5_text__c != NULL
            GROUP BY Category4_text__c
        ];
        category4OptionList = new List<SelectOption>();
        category4OptionList.add(new SelectOption('', '-无-'));
        for (AggregateResult category4Search : category4List) {
            String deliverycnt4 = String.valueOf(category4Search.get('c4c'));
            category4OptionList.add(new SelectOption(deliverycnt4, deliverycnt4));
        }

        AggregateResult[] category5List = [
            SELECT Count(id), Category5_text__c c5c
            FROM Product2__c
            WHERE
                Estimation_Entry_Possibility__c = '○'
                AND Category3_text__c = :category3
                AND Product_Type__c LIKE :agencyProType
                AND Category4_text__c != NULL
                AND Category5_text__c != NULL
            GROUP BY Category5_text__c
        ];

        category5OptionList = new List<SelectOption>();
        category5OptionList.add(new SelectOption('', '-无-'));
        for (AggregateResult category5Search : category5List) {
            String deliverycnt5 = String.valueOf(category5Search.get('c5c'));
            category5OptionList.add(new SelectOption(deliverycnt5, deliverycnt5));
        }

        // data.put('category4OptionList'+category4OptionList);
        // data.put('category5OptionList'+category5OptionList);
        // res.status = 'Success';
        // res.code = '200';
        // return res;
    }

    public static void categoryload() {
        AggregateResult[] category4List = [
            SELECT Count(id), Category4_text__c c4c
            FROM Product2__c
            WHERE
                Estimation_Entry_Possibility__c = '○'
                AND Category3_text__c = :category3
                AND Product_Type__c LIKE :agencyProType
                AND Category4_text__c != NULL
                AND Category5_text__c != NULL
            GROUP BY Category4_text__c
        ];
        category4OptionList = new List<SelectOption>();
        category4OptionList.add(new SelectOption('', '-无-'));
        for (AggregateResult category4Search : category4List) {
            String deliverycnt4 = String.valueOf(category4Search.get('c4c'));
            category4OptionList.add(new SelectOption(deliverycnt4, deliverycnt4));
        }

        AggregateResult[] category5List = [
            SELECT Count(id), Category5_text__c c5c
            FROM Product2__c
            WHERE
                Estimation_Entry_Possibility__c = '○'
                AND Category3_text__c = :category3
                AND Product_Type__c LIKE :agencyProType
                AND Category4_text__c = :category4
                AND Category5_text__c != NULL
            GROUP BY Category5_text__c
        ];

        category5OptionList = new List<SelectOption>();
        category5OptionList.add(new SelectOption('', '-无-'));
        for (AggregateResult category5Search : category5List) {
            String deliverycnt5 = String.valueOf(category5Search.get('c5c'));
            category5OptionList.add(new SelectOption(deliverycnt5, deliverycnt5));
        }
    }
    // 检索
    @AuraEnabled
    public static ResponseBodyLWC searchConsumableorderdetails(
        String category1,
        String Category3,
        String Category4,
        String Category5,
        List<String> orderDetZaikuListLWC,
        String accountName,
        string agencyProType,
        string userWorkLocation,
        Integer pageSizeLWC, Integer pageTokenLWC, String sortFieldLWC, String sortOrderLWC
    ) {
        try {
            pageSize =pageSizeLWC;
        pageToken = pageTokenLWC;
        sortField = sortFieldLWC;
        sortOrder = sortOrderLWC;

            orderDetZaikuList = orderDetZaikuListLWC;
            sqlagencyProType = '%' + agencyProType + '%';
            ResponseBodyLWC res = new ResponseBodyLWC();
            Map<String, object> data = new Map<String, object>();
            res.entity = data;
            System.debug('====>accountName' + accountName);
            System.debug('====>sqlagencyProType' + sqlagencyProType);
            System.debug('====>userWorkLocation' + userWorkLocation);
            System.debug('====>category1' + category1);
            System.debug('====>Category3' + Category3);
            System.debug('====>Category4' + Category4);
            System.debug('====>Category5' + Category5);
            // sortKey = '2';
            // preSortKey = '2';
            // sortOrderAsc = false;
            // sortOrder = new List<String>(8);
            // sortOrder = new List<String>{ ' ', '', ' ', ' ', '', '', '', '↓' };

            List<ConsumableorderdetailsInfo> reSet = new List<ConsumableorderdetailsInfo>();
            List<Consumable_order_details2__c> CountDel = [
                SELECT
                    Id,
                    Bar_Code__c,
                    Name,
                    Inventory_date__c,
                    Consumable_Product__c,
                    Recordtypeid,
                    Guarantee_period_for_products__c,
                    Isoverdue__c,
                    Box_Piece__c,
                    hospitalSpecialOffer__c
                FROM Consumable_order_details2__c
                WHERE
                    Dealer_Arrive__c = TRUE
                    AND Dealer_Shipment__c = FALSE
                    AND Dealer_Saled__c = FALSE
                    AND Dealer_Returned__c = FALSE
                    AND Lose_Flag__c = FALSE
                    AND Cancellation_Flag__c = FALSE
                    AND Bar_Code__c != NULL
                    AND Product_Type__c LIKE :sqlagencyProType
                    AND Dealer_Info_text__c = :accountName
                    AND Arrive_Owner_Work_Location__c = :userWorkLocation
            ];
            System.debug('CountDel = ' + CountDel);

            List<ConsumableorderdetailsInfo> boxRecords = new List<ConsumableorderdetailsInfo>();
            Map<String, Product2__c> MidMap = new Map<String, Product2__c>();
            Map<String, ConsumableorderdetailsInfo> newMidBoxMap = new Map<String, ConsumableorderdetailsInfo>();
            Map<String, ConsumableorderdetailsInfo> newMidPieceMap = new Map<String, ConsumableorderdetailsInfo>();

            // 所有产品取得
            String soql = makeSoql(category1, category_Goods, category3, category4, category5);
            //orderDetZaikuList
            System.debug('orderDetZaikuList = ' + orderDetZaikuList);
            System.debug('accountName = ' + accountName);
            System.debug('soql====>' + soql);
            if(String.isNotBlank(sortField) && String.isNotBlank(sortOrder)){
                soql += ' ORDER BY ' + sortField + ' ' + sortOrder;
            }
            System.debug('soql = ' + soql);
            //soql += ' ORDER BY ' + this.columus[Integer.valueOf(this.sortKey)] + ' ' + (this.sortOrderAsc == true ? 'asc nulls first' : 'desc nulls last');
            List<Product2__c> queryList = Database.query(soql);
            System.debug('queryList = ' + queryList);
            for (Integer i = 0; i < queryList.size(); i++) {
                MidMap.put(queryList[i].Id, queryList[i]);
            }
            System.debug('MidMap = ' + MidMap);
            Map<String, ConsumableorderdetailsInfo> newHosMidBoxMap = new Map<String, ConsumableorderdetailsInfo>();
            Map<String, ConsumableorderdetailsInfo> newHosMidPieceMap = new Map<String, ConsumableorderdetailsInfo>();
            System.debug('CountDel = ' + CountDel);
            for (Integer i = 0; i < CountDel.size(); i++) {
                //然后循环CountDel做Box和piece2个map
                if (MidMap.containsKey(CountDel[i].Consumable_Product__c) && CountDel[i].Box_Piece__c == '盒') {
                    String tex = 'A';
                    if (CountDel[i].hospitalSpecialOffer__c) {
                        tex = 'B';
                    }
                    if (newMidBoxMap.containsKey(CountDel[i].Consumable_Product__c + CountDel[i].Box_Piece__c + tex)) {
                        ConsumableorderdetailsInfo Jstage = newMidBoxMap.get(
                                CountDel[i].Consumable_Product__c +
                                CountDel[i].Box_Piece__c +
                                tex
                            )
                            .clone();
                        Jstage.allnumber = Jstage.allnumber + 1;
                        if (CountDel[i].Isoverdue__c == 1) {
                            Jstage.limitCount = Jstage.limitCount + 1;
                        }
                        Jstage.BoxPiece = CountDel[i].Box_Piece__c;
                        newMidBoxMap.put(CountDel[i].Consumable_Product__c + CountDel[i].Box_Piece__c + tex, Jstage);
                    } else {
                        ConsumableorderdetailsInfo Jstage = new ConsumableorderdetailsInfo(MidMap.get(CountDel[i].Consumable_Product__c));
                        Jstage.allnumber = Jstage.allnumber + 1;
                        if (CountDel[i].Isoverdue__c == 1) {
                            Jstage.limitCount = Jstage.limitCount + 1;
                        }
                        Jstage.BoxPiece = CountDel[i].Box_Piece__c;
                        if (CountDel[i].hospitalSpecialOffer__c) {
                            Jstage.hospitalSpecialOffer = true;
                        } else {
                            Jstage.hospitalSpecialOffer = false;
                        }
                        newMidBoxMap.put(CountDel[i].Consumable_Product__c + CountDel[i].Box_Piece__c + tex, Jstage);
                    }
                } else if (MidMap.containsKey(CountDel[i].Consumable_Product__c) && CountDel[i].Box_Piece__c == '个') {
                    String tex = 'A';
                    if (CountDel[i].hospitalSpecialOffer__c) {
                        tex = 'B';
                    }
                    if (newMidPieceMap.containsKey(CountDel[i].Consumable_Product__c + CountDel[i].Box_Piece__c + tex)) {
                        ConsumableorderdetailsInfo Jstage = newMidPieceMap.get(
                                CountDel[i].Consumable_Product__c +
                                CountDel[i].Box_Piece__c +
                                tex
                            )
                            .clone();
                        Jstage.allnumber = Jstage.allnumber + 1;
                        if (CountDel[i].Isoverdue__c == 1) {
                            Jstage.limitCount = Jstage.limitCount + 1;
                        }
                        Jstage.BoxPiece = CountDel[i].Box_Piece__c;
                        if (CountDel[i].hospitalSpecialOffer__c) {
                            Jstage.hospitalSpecialOffer = true;
                        } else {
                            Jstage.hospitalSpecialOffer = false;
                        }
                        newMidPieceMap.put(CountDel[i].Consumable_Product__c + CountDel[i].Box_Piece__c + tex, Jstage);
                    } else {
                        ConsumableorderdetailsInfo Jstage = new ConsumableorderdetailsInfo(MidMap.get(CountDel[i].Consumable_Product__c));
                        Jstage.allnumber = Jstage.allnumber + 1;
                        if (CountDel[i].Isoverdue__c == 1) {
                            Jstage.limitCount = Jstage.limitCount + 1;
                        }
                        Jstage.BoxPiece = CountDel[i].Box_Piece__c;
                        if (CountDel[i].hospitalSpecialOffer__c) {
                            Jstage.hospitalSpecialOffer = true;
                        } else {
                            Jstage.hospitalSpecialOffer = false;
                        }
                        newMidPieceMap.put(CountDel[i].Consumable_Product__c + CountDel[i].Box_Piece__c + tex, Jstage);
                    }
                }
            }

            consumableorderdetailsRecords = new List<ConsumableorderdetailsInfo>();
            System.debug('newMidBoxMap = ' + newMidBoxMap);
            //把Boxmap里的值从新赋给boxRecords
            for (ConsumableorderdetailsInfo bss : newMidBoxMap.values()) {
                if (bss.allnumber > 0) {
                    bss.sortBy = false;
                    bss.packing_list = Integer.valueof(bss.Prod.Product2__r.Packing_list_manual__c);
                    bss.approbation_No = bss.Prod.Product2__r.SFDA_Approbation_No__c;
                    bss.expiration_Date = bss.Prod.Product2__r.SFDA_Expiration_Date__c;
                    bss.overlimitCount = bss.allnumber - bss.limitCount;
                    boxRecords.add(bss);
                }
            }

            boxRecords.sort();
            for (ConsumableorderdetailsInfo bss : newMidPieceMap.values()) {
                if (bss.allnumber > 0) {
                    bss.packing_list = Integer.valueof(bss.Prod.Product2__r.Packing_list_manual__c);
                    bss.approbation_No = bss.Prod.Product2__r.SFDA_Approbation_No__c;
                    bss.expiration_Date = bss.Prod.Product2__r.SFDA_Expiration_Date__c;
                    bss.overlimitCount = bss.allnumber - bss.limitCount;
                }
            }
            System.debug('boxRecords = ' + boxRecords);
            for (ConsumableorderdetailsInfo bss : boxRecords) {
                consumableorderdetailsRecords.add(bss);
                //该产品是医院特价产品
                if (bss.hospitalSpecialOffer && newMidPieceMap.containsKey(bss.Prod.Id + '个B')) {
                    if (newMidPieceMap.get(bss.Prod.Id + '个B').hospitalSpecialOffer) {
                        consumableorderdetailsRecords.add(newMidPieceMap.get(bss.Prod.Id + '个B'));
                        newMidPieceMap.remove(bss.Prod.Id + '个B');
                    }
                }

                if (!bss.hospitalSpecialOffer && newMidPieceMap.containsKey(bss.Prod.Id + '个A')) {
                    // if (newMidPieceMap.get(bss.Prod.Id+'个A')) {
                    consumableorderdetailsRecords.add(newMidPieceMap.get(bss.Prod.Id + '个A'));
                    newMidPieceMap.remove(bss.Prod.Id + '个A');
                    // }
                }
            }
            for (ConsumableorderdetailsInfo bss : newMidPieceMap.values()) {
                if (newMidPieceMap.containsKey(bss.Prod.Id + '个B')) {
                    consumableorderdetailsRecords.add(newMidPieceMap.get(bss.Prod.Id + '个B'));
                }
            }
            for (ConsumableorderdetailsInfo bss : newMidPieceMap.values()) {
                if (newMidPieceMap.containsKey(bss.Prod.Id + '个A')) {
                    consumableorderdetailsRecords.add(newMidPieceMap.get(bss.Prod.Id + '个A'));
                }
            }

            productLimtAndDate();
            datelimitSearch();
            System.debug('consumableorderdetailsRecords zzz = ' + consumableorderdetailsRecords);
            for (ConsumableorderdetailsInfo bss : consumableorderdetailsRecords) {
                if (productkucun.get(bss.Prod.Id) != null) {
                    bss.guaranteeperiod = productkucun.get(bss.Prod.Id);
                }
            }
            //listCut();

            // sortKey = '2';
            // preSortKey = '2';
            // sortOrderAsc = false;
            // sortOrder = new List<String>(8);
            // sortOrder = new List<String>{ ' ', '', ' ', ' ', '', '', '', '↓' };

            // //总件数
            totalcount = consumableorderdetailsRecords.size();
            // //页数
            // pagecount=(totalcount  +  pagesize  - 1) / pagesize;

            //显示第一页
            //currentpage = 0;
            //moveToFirst();
            makeCurrentPageRecords();
            PaginatedAccounts paginatedAccounts = new PaginatedAccounts();
            paginatedAccounts.nextPageToken = (pageToken + pageSize < totalCount) ? pageToken + pageSize : null;
            paginatedAccounts.recordStart = pageToken + 1;
            paginatedAccounts.pageNumber = pageToken/pageSize + 1;
            Integer recordEnd = pageSize * paginatedAccounts.pageNumber;
            paginatedAccounts.recordEnd = totalCount >= recordEnd ? recordEnd : totalCount;
            paginatedAccounts.totalRecords = totalCount;



            data.put('paginatedAccounts', paginatedAccounts);
            data.put('accountid', accountid);
            data.put('userWorkLocation', userWorkLocation);
            data.put('agencyProType', agencyProType);
            data.put('pageRecords', pageRecords);
            system.debug('===========>pageRecords' + pageRecords);
            system.debug('===========>data' + data);
            if (pageRecords.isEmpty()) {
                res.msg = '未搜索到相关消耗品订单！';
                res.status = 'fail';
                res.code = 500;
            } else {
                res.status = 'Success';
                res.msg = '共有' + pageRecords.size() + '条数据';
                res.code = 200;
                System.debug('res = ' + res);
            }
            return res;
        } catch (Exception e) {
            return new ResponseBodyLWC('Error', 500, e.getStackTraceString(), '');
        }
    }

    public static void productLimtAndDate() {
        String nowName = null, nowRightAsstModelNo = null;
        Map<String, String> productLimt = new Map<String, String>();
        for (Integer i = 0; i < proLimitAndDate.size(); i++) {
            nowName = proLimitAndDate[i];
            if (nowName.indexOf('|') >= 0) {
                nowRightAsstModelNo = nowName.subString(0, nowName.indexOf('|'));
                nowName = nowName.subString(nowName.indexOf('|') + 1);
            }
            productLimt.put(nowRightAsstModelNo, nowName);
        }
        for (ConsumableorderdetailsInfo ass : consumableorderdetailsRecords) {
            if (productLimt.containsKey(ass.Prod.Asset_Model_No__c)) {
                ass.lowerlimit = decimal.valueOf(
                    productLimt.get(ass.Prod.Asset_Model_No__c).subString(0, productLimt.get(ass.Prod.Asset_Model_No__c).indexOf('|'))
                );
                ass.upperlimit = decimal.valueOf(
                    productLimt.get(ass.Prod.Asset_Model_No__c).subString(productLimt.get(ass.Prod.Asset_Model_No__c).indexOf('|') + 1)
                );
            }
        }
    }

    public static void datelimitSearch() {
        List<String> barcodekucun = new List<String>();
        List<Consumable_order_details2__c> orderkucun = [
            SELECT Id, Bar_Code__c, Name, Consumable_Product__c, Recordtypeid, Guarantee_period_for_products__c, Sterilization_limit__c
            FROM Consumable_order_details2__c
            WHERE
                Dealer_Arrive__c = TRUE
                AND Dealer_Shipment__c = FALSE
                AND Dealer_Saled__c = FALSE
                AND Dealer_Returned__c = FALSE
                AND Lose_Flag__c = FALSE
                AND Bar_Code__c != NULL
                AND Product_Type__c LIKE :sqlagencyProType
                AND Dealer_Info_text__c = :accountName
                AND Arrive_Owner_Work_Location__c = :userWorkLocation
            ORDER BY Consumable_Product__c, Sterilization_limit__c ASC
        ];
        for (Integer i = 0; i < orderkucun.size(); i++) {
            if (productkucun.containsKey(orderkucun[i].Consumable_Product__c)) {
                continue;
            } else {
                productkucun.put(orderkucun[i].Consumable_Product__c, orderkucun[i].Sterilization_limit__c);
            }
        }
    }

    //名称排序
    // public static void SortLimited() {
    //     Map<String, ConsumableorderdetailsInfo> MidMap = new Map<String, ConsumableorderdetailsInfo>();
    //     Map<String, ConsumableorderdetailsInfo> newMap = new Map<String, ConsumableorderdetailsInfo>();
    //     if (sortKey == preSortKey) {
    //         // 方向が変わるのみ
    //         sortOrderAsc = !sortOrderAsc;
    //         sortOrder[Integer.valueOf(sortKey)] = (sortOrderAsc == true ? '↑' : '↓');
    //     } else {
    //         sortOrderAsc = true;
    //         sortOrder[Integer.valueOf(preSortKey)] = ' ';
    //         sortOrder[Integer.valueOf(sortKey)] = (sortOrderAsc == true ? '↑' : '↓');
    //     }

    //     preSortKey = sortKey;
    //     // 所有产品取得
    //     String soql = makeSoql(null, null, null, null, null);
    //     soql += ' ORDER BY ' + columus[Integer.valueOf(sortKey)] + ' ' + (sortOrderAsc == true ? 'asc nulls first' : 'desc nulls last');
    //     List<Product2__c> queryList = Database.query(soql);
    //     for (Integer i = 0; i < queryList.size(); i++) {
    //         MidMap.put(queryList[i].Id + '盒', null);
    //         MidMap.put(queryList[i].Id + '个', null);
    //     }

    //     //update by rentx 2020-12-29
    //     for (Integer i = 0; i < pageRecords.size(); i++) {
    //         if (MidMap.containsKey(pageRecords[i].prod.Id + pageRecords[i].BoxPiece)) {
    //             ConsumableorderdetailsInfo Jstage = pageRecords[i].clone();
    //             if (Jstage.hospitalSpecialOffer == true) {
    //                 newMap.put(pageRecords[i].prod.id + pageRecords[i].BoxPiece, Jstage);
    //             } else {
    //                 MidMap.put(pageRecords[i].prod.id + pageRecords[i].BoxPiece, Jstage);
    //             }
    //         }
    //     }

    //     pageRecords = new List<ConsumableorderdetailsInfo>();

    //     //update byr entx 2020-12-29
    //     //再把map里的值从新赋给CpageRecords
    //     for (ConsumableorderdetailsInfo bss : MidMap.values()) {
    //         if (bss != null) {
    //             pageRecords.add(bss);
    //             if (newMap.get(bss.Prod.Id + bss.BoxPiece) != null) {
    //                 pageRecords.add(newMap.get(bss.Prod.Id + bss.BoxPiece));
    //                 newMap.remove(bss.Prod.Id + bss.BoxPiece);
    //             }
    //         }
    //     }
    //     for (ConsumableorderdetailsInfo bss : newMap.values()) {
    //         if (bss != null) {
    //             pageRecords.add(bss);
    //         }
    //     }
    // }

    //库存排序
    // public static void SortStore() {
    //     if (sortKey == preSortKey) {
    //         // 方向が変わるのみ
    //         sortOrderAsc = !sortOrderAsc;
    //         sortOrder[Integer.valueOf(sortKey)] = (sortOrderAsc == true ? '↑' : '↓');
    //     } else {
    //         sortOrderAsc = true;
    //         sortOrder[Integer.valueOf(preSortKey)] = ' ';
    //         sortOrder[Integer.valueOf(sortKey)] = (sortOrderAsc == true ? '↑' : '↓');
    //     }
    //     preSortKey = sortKey;

    //     for (ConsumableorderdetailsInfo ass : pageRecords) {
    //         ass.sortBy = sortOrderAsc;
    //     }
    //     pageRecords.sort();
    // }

    //检索sql文做成
    private static String makeSoql(String CateName, String CateCode, String Category3, String Category4, String Category5) {
        String sqlTail = '(\'';
        for (Integer i = 0; i < orderDetZaikuList.size(); i++) {
            if (i < orderDetZaikuList.size() - 1) {
                sqlTail += orderDetZaikuList[i] + '\',\'';
            } else {
                sqlTail += orderDetZaikuList[i] + '\')';
            }
        }
        String soql = 'select Id, Name,Name__c,Intra_Trade_List_RMB__c,Asset_Model_No__c,Category3__c,Category4__c,Category5__c,';
        soql += ' SFDA_Status__c,Product2__r.SFDA_Approbation_No__c,Product2__r.SFDA_Expiration_Date__c,Product2__r.Packing_list_manual__c FROM Product2__c ';
        soql += ' WHERE Id in' + sqlTail;
        if (!String.isBlank(CateName)) {
            soql +=
                ' AND (Name__c like \'%' +
                String.escapeSingleQuotes(CateName.replaceAll('%', '\\%')) +
                '%\' or Asset_Model_No__c like \'%' +
                String.escapeSingleQuotes(CateName.replaceAll('%', '\\%')) +
                '%\')';
        }
        if (!String.isBlank(Category3)) {
            soql += ' AND Category3__c = \'' + Category3 + '\'';
        }
        if (!String.isBlank(Category4)) {
            soql += ' AND Category4__c = \'' + Category4 + '\'';
        }
        if (!String.isBlank(Category5)) {
            soql += ' AND Category5__c = \'' + Category5 + '\'';
        }
        return soql;
    }
    //首页
    // public static void moveToFirst() {
    //     if (currentpage == 1)
    //         return;
    //     currentpage = 1;
    //     canMove();
    // }

    // //尾页
    // public static void moveToLast() {
    //     if (currentpage >= pagecount)
    //         return;
    //     currentpage = pagecount;
    //     canMove();
    // }

    // //上一页
    // public static void moveToPrevious() {
    //     if (currentpage == 1)
    //         return;
    //     currentpage = currentpage - 1;
    //     canMove();
    // }

    // //下一页
    // public static void moveToNext() {
    //     if (currentpage >= pagecount)
    //         return;

    //     currentpage = currentpage + 1;
    //     canMove();
    // }

    // //判断是否可翻页
    // public static void canMove() {
    //     hasPrevious = false;
    //     hasNext = false;
    //     if (pagecount > 1 && currentpage > 1)
    //         hasPrevious = true;
    //     if (pagecount > 1 && currentpage < pagecount)
    //         hasNext = true;
    // }

    //刷新当前页
    public static PageReference refreshPageSize() {
        makeCurrentPageRecords();
        return null;
    }

    //编辑当前页内容
    public static void makeCurrentPageRecords() {
        // pageRecords = new List<ConsumableorderdetailsInfo>();
        // System.debug('consumableorderdetailsRecords  =' + consumableorderdetailsRecords);
        // for (Integer i = 0; i < consumableorderdetailsRecords.size(); i++) {
        //     pageRecords.add(consumableorderdetailsRecords.get(i));
        // }

        Integer startIdx;
        Integer endIdx;
        pageRecords = new List<ConsumableorderdetailsInfo>();
        startIdx = pageToken;
        endIdx = pageToken+pageSize;
        if (endIdx > consumableorderdetailsRecords.size()){
            endIdx = consumableorderdetailsRecords.size();
        } 
        for(Integer i=startIdx; i < endIdx ; i++){
            pageRecords.add(consumableorderdetailsRecords.get(i));
        }
    }


    //分页Bean
    public class PaginatedAccounts {
        @AuraEnabled
        public List<Account> records;
        @AuraEnabled
        public Integer nextPageToken;
        @AuraEnabled
        public Integer pageNumber {get;set;}
        @AuraEnabled
        public Integer totalRecords {get;set;}
        @AuraEnabled
        public Integer recordStart {get;set;}
        @AuraEnabled
        public Integer recordEnd {get;set;}        
    }

    // Data Bean
    class ConsumableorderdetailsInfo implements Comparable {
        @AuraEnabled
        public Consumable_order_details2__c esd { get; set; }
        @AuraEnabled
        public Product2__c Prod { get; set; }
        @AuraEnabled
        public Decimal allnumber { get; set; }
        @AuraEnabled
        public Integer packing_list { get; set; }
        @AuraEnabled
        public Date expiration_Date { get; set; }
        @AuraEnabled
        public String approbation_No { get; set; }
        @AuraEnabled
        public Consumable_order__c Concc { get; set; }
        @AuraEnabled
        public Boolean sortBy { get; set; }
        @AuraEnabled
        public Decimal upperlimit { get; set; }
        @AuraEnabled
        public Decimal lowerlimit { get; set; }
        @AuraEnabled
        public String BoxPiece { get; set; }
        @AuraEnabled
        public Date guaranteeperiod { get; set; }
        @AuraEnabled
        public Decimal limitCount { get; set; }
        @AuraEnabled
        public Decimal overlimitCount { get; set; }
        @AuraEnabled
        public Boolean hospitalSpecialOffer { get; set; }

        public ConsumableorderdetailsInfo(Product2__c e) {
            esd = new Consumable_order_details2__c();
            Prod = e;
            allnumber = 0;
            limitCount = 0;
            overlimitCount = 0;
        }
        // 排序
        public Integer compareTo(Object compareTo) {
            ConsumableorderdetailsInfo compareToesd = (ConsumableorderdetailsInfo) compareTo;
            Integer returnValue = 0;
            if (sortBy == false) {
                if (allnumber > compareToesd.allnumber) {
                    returnValue = -1;
                } else if (allnumber < compareToesd.allnumber) {
                    returnValue = 1;
                }
                return returnValue;
            } else {
                if (allnumber > compareToesd.allnumber) {
                    returnValue = 1;
                } else if (allnumber < compareToesd.allnumber) {
                    returnValue = -1;
                }
                return returnValue;
            }
        }
    }
}