public without sharing class TopPageController {
    //经销商信息
    public account accountInfo { get; set; }
    /*****************画面表示Bean******************/
    public List<ConsumableorderdetailsInfo> consumableorderdetailsRecords =new List<ConsumableorderdetailsInfo>();
    public List<List<ConsumableorderdetailsInfo>> consumableorderdetailsRecordsview = new List<List<ConsumableorderdetailsInfo>>();

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

    // update start by vivek2020-01-15 汇总使用
    public Integer Total_num {get; set;}
    public Integer OrderNumber_arrived {get; set;}
    public Integer Delivery_detail_count {get; set;}
    public Integer OrderNumber_notarrive {get; set;}
    public Integer More_than_seven_days {get; set;}
    // update end by vivek2020-01-15 

    //排序使用
    public String sortKey { get; set; }
    public String preSortKey { get; private set; }
    public Boolean sortOrderAsc { get; private set; }
    public String[] sortOrder { get; private set; }
    /*****************一周未到货订单一览对应start******************/
    // 订单 字段标签
    public List<String> title { get; private set; }
    // 订单 字段名
    public List<String> column;
    public List<List<String>> columns { get; private set; }
    // 画面显示数据
    public List<Consumable_order__c> raesList { get; private set; }
    /*****************一周未到货订单一览对应end******************/
    //排序使用
    private String[] orderby = new String[]{ 'Product2__c.Name__c'};
    //产品上下限
    String[] proLimitAndDate =new String[]{};
    public String product_Limit { get; set; }
    //库存产品最早有效期限
    private Map<String,Date> productkucun = new Map<String,Date>();
    //消费期限小于一年的产品
    public List<ConsumableorderdetailsInfo> overlimitdateorderdetails { get; set; }

    public String accountid { get; set; }
    public String accountName { get; set; }
    List<String> orderDetZaikuList = new List<String>();

    // 登录者工作地
    private String userWorkLocation;

    // 未到货订单信息（超过一周）显示控制
    //public Boolean over_view { get; set; }
    public Boolean over_view {
        get {
            return raesList.size() > 0 ? true : false;
        }
    }

    // 使用期限小于一年的产品 显示控制
    public Boolean overlimit {
        get {
            return overlimitdateorderdetails.size() > 0 ? true : false;
        }
    }
    //--------AddStart-----XHL--------------20180929-------------
    //用户产品区分
    public String userPro_Type {get; set;}
    public String userPro_Typestr = null;
    public Boolean EngFlag = false;
    public Boolean ETFlag = false;
    //--------AddEnd-----XHL--------------20180929-------------

    //add by rentx start
    public Boolean hasHos{get;set;}
    //add by rentx end

    public TopPageController() {
        //over_view = false;
        consumableorderdetailsRecords = new List<ConsumableorderdetailsInfo>();
        consumableorderdetailsRecordsview = new List<List<ConsumableorderdetailsInfo>>();
        overlimitdateorderdetails = new List<ConsumableorderdetailsInfo>();

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

    // 画面初始化
    public void init() {
        User useracc = [SELECT accountid, Work_Location__c,UserPro_Type__c
                        FROM user
                        WHERE id =:UserInfo.getUserId()];
        accountid = useracc.accountid;
        userWorkLocation = useracc.Work_Location__c;
        //--------AddStart-----XHL--------------20180929-------------
        userPro_Type = useracc.UserPro_Type__c;
        if(String.isBlank(userPro_Type)){
            userPro_Type = 'ET';
        }
        userPro_Typestr = '%' + userPro_Type + '%';
        if(userPro_Type == 'ENG'){
            EngFlag = true;
        }else{
            ETFlag = true;
        }
        //--------AddEnd-----XHL--------------20180929-------------
        //经销商·基本信息获取
        accountInfo = [SELECT Name,Ban_On_Use_Reason__c,Deposit_Price__c,
                        Medical_Equipment_Num__c,Medical_Equipment_Expiration_Date__c,
                        Ban_On_Use_Date__c,Tax_Practice_No__c,Tax_Practice_Expiration_Date__c,
                        Business_Authorization_No__c,Business_Paper_Expiration_Date__c,
                        Credit_Check_No__c,Dealer_discount__c,
                        Phone,Address_Together__c,Is_Active_Formula__c,
                        Management_Code__c,Sales_Shop_Class__c,Postal_Code__c,
                        Fax,Address__c,Deposit_Receipt_Finished__c,
                        Deposit_Receipt_Completion_Day__c,
                        Product_Limit_Date__c,
                        Product_Limit_DateENG__c
                        FROM account WHERE id =:accountid];
        accountName = accountInfo.Name;
        //--------UpdateStart-----XHL--------------20181008-------------
        if(EngFlag){
           product_Limit = accountInfo.Product_Limit_DateENG__c;    
        }else if(ETFlag){
           product_Limit = accountInfo.Product_Limit_Date__c;
        }
        //--------UpdateEnd-----XHL--------------20181008-------------
        if(product_Limit != null && product_Limit !=''){
            proLimitAndDate = product_Limit.split(',');
        }

        List<ConsumableorderdetailsInfo> boxRecords = new List<ConsumableorderdetailsInfo>();
        //库存明细取得
        orderDetZaikuList = new List<String>();
        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 Cancellation_Flag__c = false
                                                AND Bar_Code__c !=null
                                                AND Product_Type__c like : userPro_Typestr
                                                AND Dealer_Info_text__c = :accountName
                                                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')));
        }
        Map<String,Product2__c> MidMap = new Map<String,Product2__c>();
        List<Product2__c> product2Selected = [SELECT Id, Name,
                                Name__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
                            ];

        for (Integer i = 0; i < product2Selected.size(); i++) {
            MidMap.put(product2Selected[i].Id, product2Selected[i]);
        }
        //返品库存统计
        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 : userPro_Typestr
                        AND Dealer_Info_text__c = :accountName
                        AND Arrive_Owner_Work_Location__c = :userWorkLocation];
                        //ApexPages.addmessage(new ApexPages.message(ApexPages.severity.Error, 'CountDel +++++' + CountDel.size())); 
        Map<String,ConsumableorderdetailsInfo> newMidBoxMap = new Map<String,ConsumableorderdetailsInfo>();
        Map<String,ConsumableorderdetailsInfo> newMidPieceMap = new Map<String,ConsumableorderdetailsInfo>();
        Map<String,ConsumableorderdetailsInfo> newHosMidBoxMap = new Map<String,ConsumableorderdetailsInfo>();
        Map<String,ConsumableorderdetailsInfo> newHosMidPieceMap = new Map<String,ConsumableorderdetailsInfo>();

        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 == '盒'){

                if(newMidBoxMap.containsKey(CountDel[i].Consumable_Product__c+CountDel[i].Box_Piece__c)){
                    ConsumableorderdetailsInfo Jstage = newMidBoxMap.get(CountDel[i].Consumable_Product__c+CountDel[i].Box_Piece__c).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, 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;
                    newMidBoxMap.put(CountDel[i].Consumable_Product__c+CountDel[i].Box_Piece__c, Jstage);
                }
            }else if(MidMap.containsKey(CountDel[i].Consumable_Product__c) && CountDel[i].Box_Piece__c == '个'){
                if(newMidPieceMap.containsKey(CountDel[i].Consumable_Product__c+CountDel[i].Box_Piece__c)){
                    ConsumableorderdetailsInfo Jstage = newMidPieceMap.get(CountDel[i].Consumable_Product__c+CountDel[i].Box_Piece__c).clone();
                    Jstage.allnumber = Jstage.allnumber+1 ;
                    if(CountDel[i].Isoverdue__c == 1){
                        Jstage.limitCount = Jstage.limitCount + 1;
                    }
                    Jstage.BoxPiece = CountDel[i].Box_Piece__c;
                    newMidPieceMap.put(CountDel[i].Consumable_Product__c+CountDel[i].Box_Piece__c, 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;
                    newMidPieceMap.put(CountDel[i].Consumable_Product__c+CountDel[i].Box_Piece__c, Jstage);
                }
            }*/
            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;
                        newMidBoxMap.put(CountDel[i].Consumable_Product__c+CountDel[i].Box_Piece__c + tex, Jstage);
                    }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;
                    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;
                        newMidPieceMap.put(CountDel[i].Consumable_Product__c+CountDel[i].Box_Piece__c+ tex, Jstage);
                    }else{
                        Jstage.hospitalSpecialOffer = false;
                        newMidPieceMap.put(CountDel[i].Consumable_Product__c+CountDel[i].Box_Piece__c+ tex, Jstage);

                    }
                }
            }


            
            //如果是 医院特价创建的明细2  则   update and add by rentx 2020-11-26 end

        }
        consumableorderdetailsRecords = new List<ConsumableorderdetailsInfo>();
        List<ConsumableorderdetailsInfo> newHosMidBoxList = new List<ConsumableorderdetailsInfo>();
        //把Boxmap里的值从新赋给boxRecords
        for(ConsumableorderdetailsInfo bss : newMidBoxMap.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;
                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;
            }
        }
        //===========================================add by rentx 2020-11-26 start 
        

        //========================================add by rentx 2020-11-26  end

        //排序应该是 非医院特价的盒,医院特价的盒,非医院特价的个,医院特价的个
        
        //add by rentx 2020-11-27 先判断医院特价的盒 和 个
        //2020-11-27 日 于 rentx 注释 start
        String temp = 'A';
        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'));
            }
        }
        // consumableorderdetailsRecords.addAll(newMidPieceMap.values());
        //2020-11-27 日 于 rentx 注释 end
        
        notarriveorder();
        productLimtAndDate();
        datelimitSearch();
        //add by rentx
        Integer ishos = 0;
        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) {
                ishos = ishos+1;
            }
            
        }
        if (ishos > 0) {
            hasHos = true;
        }else{
            hasHos = false;
        }
        //add by rentx 2021-3-10 end

        //consumableorderdetailsRecords.sort();
        //list分割
        //listCut();
        this.sortKey = '0';
        this.preSortKey = '0';
        this.sortOrderAsc = false;
        this.sortOrder = new String[1];
        this.sortOrder = new String[]{' ', '↓'};

        //总件数
        totalcount = consumableorderdetailsRecords.size();
        //页数
        pagecount=(totalcount  +  pagesize  - 1) / pagesize; 
        //显示第一页
        moveToFirst();
        makeCurrentPageRecords();
    }

    public void datelimitSearch(){
        Set<String> barcodekucun = new Set<String>();
        //--------UpdateStart-----XHL--------------20180929-------------
         List<Consumable_order_details2__c> orderkucun = [SELECT Id,Bar_Code__c, Name,Consumable_Product__c,
                                                        Recordtypeid,Guarantee_period_for_products__c,
                                                        Sterilization_limit__c,Box_Piece__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 :userPro_Typestr
                                                        AND Dealer_Info_text__c = :accountName
                                                        AND Arrive_Owner_Work_Location__c = :userWorkLocation
                                                        ORDER BY Consumable_Product__c, Sterilization_limit__c asc ];
        //--------UpdateEnd-----XHL--------------20180929-------------
        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);
            }
        }
        barcodekucun.clear();
        for(Integer i = 0 ; i< orderkucun.size();i++){
            if(orderkucun[i].Sterilization_limit__c < Date.today().addYears(1)){
                if(barcodekucun.contains(orderkucun[i].Bar_Code__c)){
                    continue;
                }else{
                    barcodekucun.add(orderkucun[i].Bar_Code__c);
                }
            }
        }
        List<AggregateResult>  overlimitdatedetails = [SELECT Asset_Model_No__c prodName ,
                                            Box_Piece__c BoxPiece,count(id) countid
                                        FROM Consumable_order_details2__c
                                        WHERE Bar_Code__c in :barcodekucun
                                        AND Dealer_Arrive__c = true
                                        AND Dealer_Shipment__c = false
                                        AND Dealer_Saled__c = false
                                        AND Dealer_Returned__c = false
                                        AND Lose_Flag__c = false
                                        GROUP BY Asset_Model_No__c,Box_Piece__c
                                        ORDER BY Asset_Model_No__c,Box_Piece__c];
        for(Integer i = 0 ; i< overlimitdatedetails.size();i++){
            overlimitdateorderdetails.add(new ConsumableorderdetailsInfo(overlimitdatedetails[i]));
        }
    }

    //超过一周未到货订单
    public void notarriveorder (){
        //over_view = false;
        Date orderdate = Date.today().addDays(-7);
        
        List<Consumable_order_details2__c> orderdetails = [SELECT Id,Name,Consumable_order_minor__c
                                                            FROM Consumable_order_details2__c
                                                            WHERE Deliver_date__c < :orderdate
                                                            and Consumable_order_minor__c !=null
                                                            and Dealer_Info_text__c = :accountName
                                                            AND recordtypeid = :System.Label.RT_ConOrderDetail2_Delivery
                                                            AND Dealer_Arrive__c = false
                                                            ];
        //ApexPages.addmessage(new ApexPages.message(ApexPages.severity.INFO , 'userPro_Type——————' + userPro_Type));
        Map<String, String> notarriveorderMap = new Map<String, String>();
        List<String> notarriveorderid = new List<String>();
        for(Integer i = 0; i < orderdetails.size(); i++){
            if(notarriveorderMap.containsKey(orderdetails[i].Consumable_order_minor__c)){
                continue;
            }else{
                notarriveorderMap.put(orderdetails[i].Consumable_order_minor__c, orderdetails[i].Consumable_order_minor__c);
                //notarriveorderid.add('\'' + orderdetails[i].Consumable_order_minor__c +'\'');
                notarriveorderid.add(orderdetails[i].Consumable_order_minor__c);
            }
        }
        // 获得订单一览
        Map<String, Schema.FieldSet> fsMap = Schema.getGlobalDescribe().get('Consumable_order__c').getDescribe().fieldSets.getMap();
        Schema.FieldSet fs = fsMap.get('arrive_view');
        // 获得订单中的所有项目
        List<FieldSetMember> fsmList = fs.getFields();
        // 获得字段标签和字段名
        title = new List<String>();
        column = new List<String>();
        columns = new List<List<String>>();
        for (FieldSetMember fsm : fsmList) {
            title.add(fsm.getLabel());
            column.add(fsm.getFieldPath());
            columns.add(fsm.getFieldPath().split('\\.'));
        }
        system.debug('columns=====================>'+columns);
        // 获得显示数据
        raesList = new List<Consumable_order__c>();
        String soql = 'select Id';
        for (String s : column) {
            soql += ',' + s;
        }
        soql += ' from Consumable_order__c where Order_type__c = \''+'订单'+'\' and  recordtypeid =\'' + System.Label.RT_ConOrder_Delivery + '\' and Dealer_Info__c =\'' + accountid +'\'  and  Delivery_detail_count__c > 0 and showFalseNotshowTrue__c = false  ';
        soql += ' and Order_ProType__c = \'' + userPro_Type  + '\' ' ;
        soql += ' and Order_Owner_WorkLocal__c = \'' + userWorkLocation + '\' ';
       
        if(notarriveorderid.size() < 1){
            soql +=' AND Id = null ';
        }else{
            String sqlTail = '(\'';
            for(Integer i = 0 ; i< notarriveorderid.size();i++){
                if(i<notarriveorderid.size()-1){
                    sqlTail += notarriveorderid[i]+'\',\'';
                }else{
                    sqlTail += notarriveorderid[i]+'\')';
                }
            }
            //over_view = true;
            soql +=' AND Id in ' + sqlTail;
        }
        system.debug('soql_____11111__' + soql);
        raesList = Database.query(soql);
        // update end by vivek2020-01-15 
        Total_num = 0;
        OrderNumber_arrived = 0;
        Delivery_detail_count = 0;
        OrderNumber_notarrive = 0;
        More_than_seven_days = 0;
        for(Consumable_order__c conorder :raesList){
            Total_num += (Integer)conorder.Total_num__c;
            OrderNumber_arrived += (Integer)conorder.OrderNumber_arrived__c;
            Delivery_detail_count += (Integer)conorder.Delivery_detail_count__c;
            OrderNumber_notarrive += (Integer)conorder.OrderNumber_notarrive__c;
            More_than_seven_days += (Integer)conorder.More_than_seven_days__c;
        }
        // update end by vivek2020-01-15
    }

    public 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 void SortLimited(){
        Map<String,ConsumableorderdetailsInfo> MidMap = new Map<String,ConsumableorderdetailsInfo>();
        Map<String,ConsumableorderdetailsInfo> newMap = new Map<String,ConsumableorderdetailsInfo>();
        if (this.sortKey == this.preSortKey) {
            // 方向が変わるのみ
            this.sortOrderAsc = !this.sortOrderAsc;
            this.sortOrder[Integer.valueOf(this.sortKey)] = (this.sortOrderAsc == true ? '↑' : '↓');
        } else {
            this.sortOrderAsc = true;
            this.sortOrder[Integer.valueOf(this.preSortKey)] = ' ';
            this.sortOrder[Integer.valueOf(this.sortKey)] = (this.sortOrderAsc == true ? '↑' : '↓');
        }
        String sqlTail = '(\'';
        for(Integer i = 0 ; i< orderDetZaikuList.size();i++){
            if(i<orderDetZaikuList.size()-1){
                sqlTail += orderDetZaikuList[i]+'\',\'';
            }else{
                sqlTail += orderDetZaikuList[i]+'\')';
            }
        }

        this.preSortKey = this.sortKey;
        // 所有产品取得
        //共通方法的使用，limit 去掉  71行for 循环 写成共通函数
        String soql = 'select Id, Name,Name__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,';
        soql += ' Product2__r.Packing_list_manual__c from Product2__c ';
        soql += ' WHERE Id in' + sqlTail;
        soql += ' order by ' + this.orderby[Integer.valueOf(this.sortKey)];
        soql += ' ' + (this.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);
                }
            }
        }
        //update by rentx 2020-12-29
        pageRecords = new List<ConsumableorderdetailsInfo>();

        //再把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);
            }
        }

        /*
        for(ConsumableorderdetailsInfo bss : MidMap.values()){
            if(bss != null){
                pageRecords.add(bss);
           }
        }*/
    }

    //首页
    public void moveToFirst(){
        if(currentpage == 1) return;
        currentpage = 1;
        canMove();
        //makeCurrentPageRecords();
    }

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

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

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

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

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


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

    //编辑当前页内容
    public void makeCurrentPageRecords(){
        Integer startIdx;
        Integer endIdx;

        pageRecords = new List<ConsumableorderdetailsInfo>();
        startIdx = (currentpage-1) * pagesize;
        endIdx = (currentpage-1) * pagesize+ pagesize;
        if (endIdx > consumableorderdetailsRecords.size()){
            endIdx = consumableorderdetailsRecords.size();
        } 

        for(Integer i=startIdx; i < endIdx ; i++){
            pageRecords.add(consumableorderdetailsRecords.get(i));
        }
   }

    // Data Bean
    class ConsumableorderdetailsInfo implements Comparable {
        //public Boolean check { get; set; }
        //public Boolean oldCheck { get; set; }
        public Consumable_order_details2__c esd { get; set; }
        public Product2__c Prod { get; set; }
        public Decimal allnumber { get; set; }
        public Decimal oldConsumableCount { get; set; }
        public Integer packing_list { get; set; }
        public Date expiration_Date { get; set; }
        public String approbation_No { get; set; }
        public Decimal upperlimit { get; set; }
        public Decimal lowerlimit { get; set; }
        public Date guaranteeperiod { get; set; }
        public Decimal countid { get; set; }
        public String prodName { get; set; }
        public Decimal limitCount { get; set; }
        public Decimal overlimitCount { get; set; }
        public String BoxPiece { get; set; }

        public Boolean hospitalSpecialOffer { get; set ;}

        public ConsumableorderdetailsInfo(Product2__c e) {
            //check = false;
            //oldCheck = false;
            esd = new Consumable_order_details2__c();
            Prod = e;
            oldConsumableCount = null;
            allnumber = 0;
            limitCount = 0;
            overlimitCount = 0;

        }

        public ConsumableorderdetailsInfo(AggregateResult e) {
            countid =Integer.valueOf(e.get('countid'));
            prodName = String.valueOf(e.get('prodname'));
            BoxPiece = String.valueOf(e.get('BoxPiece'));
        }

        // 排序
        public Integer compareTo(Object compareTo) {
            ConsumableorderdetailsInfo compareToesd =(ConsumableorderdetailsInfo)compareTo;
            Integer returnValue = 0;
            if (allnumber > compareToesd.allnumber) {
                returnValue = -1;
            } else if (allnumber < compareToesd.allnumber) {
                returnValue = 1;
            }
            return returnValue;
        }
    }
 
}