高章伟
2023-03-03 d8dc84a3d56df839895f1c417a4d9cbee763d262
force-app/main/default/classes/RentalApplyEquipmentSetDetailHandler.cls
@@ -2879,6 +2879,9 @@
    protected override void beforeUpdate() {
        if(!disabled){
            beforeSetValue();
            // 设值排队的UniqueKey
            setUniqueKeyQueue();
        }
    }
    protected override void afterInsert() {
@@ -4491,115 +4494,147 @@
                }
            }
        }
        if (!detailIds.isEmpty()) {
            List<String> sequencekeylist = new List<String>();
            List<String> changeSequenceIds = new List<String>();
            Map<String,Decimal> changesequenceMap = new Map<String,Decimal>();
            List<Rental_Apply_Sequence__c> assignSequence = [SELECT Id,Series_No__c,Invalid_Flag__c,Externalkey__c
                                                            FROM Rental_Apply_Sequence__c
                                                            WHERE Apply_Set_Detail__c IN: detailIds
                                                            AND Invalid_Flag__c = false
                                                            AND Series_No__c > 0];
            for(Rental_Apply_Sequence__c se:assignSequence){
                // sequencekeylist.add(se.Externalkey__c);
                changeSequenceIds.add(se.Id);
                // if(!changesequenceMap.containsKey(se.Externalkey__c)){
                //     changesequenceMap.put(se.Externalkey__c,se.Series_No__c);
                // }else{
                //     if(changesequenceMap.get(se.Externalkey__c) > se.Series_No__c){
                //         changesequenceMap.put(se.Externalkey__c,se.Series_No__c);
                //     }
                // }
                se.Invalid_Flag__c = true;
                se.Series_No__c = 0;
            }
            List<Rental_Apply_Equipment_Set_Detail__c> changeDetailList = new List<Rental_Apply_Equipment_Set_Detail__c>();
            List<Rental_Apply_Equipment_Set_Detail__c> raesdList = [SELECT Id, Rental_Apply_Equipment_Set__c, Asset__c,Rental_Apply_Equipment_Set__r.Fixture_Set__r.Product_Type__c,
                                                                       FSD_Fixture_Model_No__c, Fixture_Model_No_text__c,Rental_Apply__r.demo_purpose2__c,Queue_Day__c,ExternalKey__c,
                                                                       Is_Body__c, FSD_Is_OneToOne__c, Select_Time__c,Rental_Apply__r.EquipmentGuaranteeFlg__c,Allow_Adjust_Queue_Flag__c,
                                                                       Cancel_Select__c, Fixture_Model_No_F__c, Queue_Number__c, Internal_asset_location__c,Fixture_Model_No__c,Rental_Apply__c,
                                                                       Internal_asset_location_before__c,Salesdepartment__c, Product_category_F__c, Product_category_text__c,Equipment_Type_text__c,
                                                                       Salesdepartment_before__c,Rental_Apply__r.Request_shipping_day__c,QuenType__c,IsAdjust__c,Rental_Apply__r.Request_approval_time__c,
                                                                       Equipment_Type__c, Rental_Apply__r.Internal_asset_location_F__c,Cancel_Reason__c,Loaner_cancel_reason__c,
                                                                       Loaner_cancel_Remarks__c ,Rental_Apply_Equipment_Set__r.Name
                                                                FROM Rental_Apply_Equipment_Set_Detail__c
                                                                WHERE Queue_Number__c > 0
                                                                  AND Cancel_Select__c = false
                                                                  AND ExternalKey__c IN:externalKeyList
                                                                  AND Id NOT IN :detailIds
                                                                ORDER BY Queue_Number__c ASC ];
            Map<String,List<Rental_Apply_Equipment_Set_Detail__c>> detailsMap = new Map<String,List<Rental_Apply_Equipment_Set_Detail__c>>();
            for(Rental_Apply_Equipment_Set_Detail__c setdetail:raesdList){
                if(!detailsMap.containsKey(setdetail.Externalkey__c)){
                    detailsMap.put(setdetail.Externalkey__c,new List<Rental_Apply_Equipment_Set_Detail__c>());
                }
                detailsMap.get(setdetail.Externalkey__c).add(setdetail);
                
        List<String> sequencekeylist = new List<String>();
        List<String> changeSequenceIds = new List<String>();
        Map<String,Decimal> changesequenceMap = new Map<String,Decimal>();
        List<Rental_Apply_Sequence__c> assignSequence = [SELECT Id,Series_No__c,Invalid_Flag__c,Externalkey__c
                                                        FROM Rental_Apply_Sequence__c
                                                        WHERE Apply_Set_Detail__c IN: detailIds
            }
            for(String key:detailsMap.keySet()){
                Decimal queueNo = minNumberMap.get(key);
                System.debug(LoggingLevel.INFO, '*** queueNo: ' + queueNo);
                Decimal i = 0;
                for(Rental_Apply_Equipment_Set_Detail__c detail : detailsMap.get(key)){
                    System.debug(LoggingLevel.INFO, '*** detail.Queue_Number__c: ' + detail.Queue_Number__c);
                    if(detail.Queue_Number__c > queueNo){
                        RentalFixtureSetAssignController.KeyObj dobj = RentalFixtureSetAssignController.getSequenceInfo(detail);
                        sequencekeylist.addAll(dobj.sequencekeylist);
                        detail.Queue_Number__c  = queueNo + i;
                        i ++;
                        System.debug(LoggingLevel.INFO, '**111* detail.Queue_Number__c: ' + detail.Queue_Number__c);
                        changeDetailList.add(detail);
                    }
                }
            }
            List<String> nodusequencekeylist = new List<String>(new Set<String>(sequencekeylist));
            List<Rental_Apply_Sequence__c> sequenceList = [SELECT Id,ExternalKey__c,Demo_Purpose2__c,
                                                        Apply_Set_Detail__c,Apply_Set_Detail_ExternalKey__c,
                                                        Series_No__c,Salesdepartment__c,Product_category__c,
                                                        Rental_Apply__c,Internal_asset_location__c,
                                                        Apply_Set_Detail__r.Queue_Number__c,Series_Unequal_Queue_Flag__c,
                                                        Fixture_Model_No__c,Equipment_Type__c
                                                        FROM Rental_Apply_Sequence__c
                                                        WHERE ExternalKey__c IN: nodusequencekeylist
                                                        AND Id NOT IN:changeSequenceIds
                                                        AND Series_No__c > 0
                                                        AND Invalid_Flag__c = false
                                                        AND Series_No__c > 0];
        for(Rental_Apply_Sequence__c se:assignSequence){
            // sequencekeylist.add(se.Externalkey__c);
            changeSequenceIds.add(se.Id);
            // if(!changesequenceMap.containsKey(se.Externalkey__c)){
            //     changesequenceMap.put(se.Externalkey__c,se.Series_No__c);
            // }else{
            //     if(changesequenceMap.get(se.Externalkey__c) > se.Series_No__c){
            //         changesequenceMap.put(se.Externalkey__c,se.Series_No__c);
            //     }
            // }
            se.Invalid_Flag__c = true;
            se.Series_No__c = 0;
        }
        List<Rental_Apply_Equipment_Set_Detail__c> changeDetailList = new List<Rental_Apply_Equipment_Set_Detail__c>();
        List<Rental_Apply_Equipment_Set_Detail__c> raesdList = [SELECT Id, Rental_Apply_Equipment_Set__c, Asset__c,Rental_Apply_Equipment_Set__r.Fixture_Set__r.Product_Type__c,
                                                                   FSD_Fixture_Model_No__c, Fixture_Model_No_text__c,Rental_Apply__r.demo_purpose2__c,Queue_Day__c,ExternalKey__c,
                                                                   Is_Body__c, FSD_Is_OneToOne__c, Select_Time__c,Rental_Apply__r.EquipmentGuaranteeFlg__c,Allow_Adjust_Queue_Flag__c,
                                                                   Cancel_Select__c, Fixture_Model_No_F__c, Queue_Number__c, Internal_asset_location__c,Fixture_Model_No__c,Rental_Apply__c,
                                                                   Internal_asset_location_before__c,Salesdepartment__c, Product_category_F__c, Product_category_text__c,Equipment_Type_text__c,
                                                                   Salesdepartment_before__c,Rental_Apply__r.Request_shipping_day__c,QuenType__c,IsAdjust__c,Rental_Apply__r.Request_approval_time__c,
                                                                   Equipment_Type__c, Rental_Apply__r.Internal_asset_location_F__c,Cancel_Reason__c,Loaner_cancel_reason__c,
                                                                   Loaner_cancel_Remarks__c ,Rental_Apply_Equipment_Set__r.Name
                                                            FROM Rental_Apply_Equipment_Set_Detail__c
                                                            WHERE Queue_Number__c > 0
                                                              AND Cancel_Select__c = false
                                                              AND ExternalKey__c IN:externalKeyList
                                                              AND Id NOT IN :detailIds
                                                            ORDER BY Queue_Number__c ASC ];
        Map<String,List<Rental_Apply_Equipment_Set_Detail__c>> detailsMap = new Map<String,List<Rental_Apply_Equipment_Set_Detail__c>>();
        for(Rental_Apply_Equipment_Set_Detail__c setdetail:raesdList){
            if(!detailsMap.containsKey(setdetail.Externalkey__c)){
                detailsMap.put(setdetail.Externalkey__c,new List<Rental_Apply_Equipment_Set_Detail__c>());
                                                        FOR UPDATE
                                                        ];
            System.debug(LoggingLevel.INFO, '*** sequenceList: ' + sequenceList);
            Map<String,List<Rental_Apply_Sequence__c>> sequenceMap = new Map<String,List<Rental_Apply_Sequence__c>>();
            List<FixtureUtil.SequenceWrapper> Wrappers = new List<FixtureUtil.SequenceWrapper>();
            for(Rental_Apply_Sequence__c se: sequenceList){
                Wrappers.add(new FixtureUtil.SequenceWrapper(se));
            }
            detailsMap.get(setdetail.Externalkey__c).add(setdetail);
            Wrappers.sort();
            sequenceList = new List<Rental_Apply_Sequence__c>();
            for(FixtureUtil.SequenceWrapper wrapper:wrappers){
                sequenceList.add(wrapper.sequence);
            }
            for(Rental_Apply_Sequence__c se: sequenceList){
                if(!sequenceMap.containsKey(se.Externalkey__c)){
                    sequenceMap.put(se.Externalkey__c,new List<Rental_Apply_Sequence__c>());
                }
                sequenceMap.get(se.Externalkey__c).add(se);
            }
            List<Rental_Apply_Sequence__c> changeSequenceList = new List<Rental_Apply_Sequence__c>();
            for(String key:sequenceMap.keyset()){
                Decimal i = 1;
                for(Rental_Apply_Sequence__c se: sequenceMap.get(key)){
                    if(se.Series_No__c != i){
                        se.Series_No__c =  i;
                        changeSequenceList.add(se);
                    }
                    i ++ ;
                }
            }
            update assignSequence;
            update changeSequenceList;
            update changeDetailList;
        }
    }
    private void setUniqueKeyQueue(){
        Map<Id, Rental_Apply_Equipment_Set_Detail__c> olddetailMap = (Map<Id, Rental_Apply_Equipment_Set_Detail__c>) Trigger.oldMap;
        System.debug('开始处理------------------------------------');
        System.debug('(List<Rental_Apply_Equipment_Set_Detail__c>) Trigger.new---------------' + (List<Rental_Apply_Equipment_Set_Detail__c>) Trigger.new);
        for(Rental_Apply_Equipment_Set_Detail__c newdetail :  (List<Rental_Apply_Equipment_Set_Detail__c>) Trigger.new){
            System.debug(newdetail.Id + ' 申请单号:' + newdetail.Rental_Apply__r.name);
            Rental_Apply_Equipment_Set_Detail__c olddetail = olddetailMap.get(newdetail.Id);
            System.debug('旧排队No:' + olddetail.Queue_Number__c);
            System.debug('新排队No:' + newdetail.Queue_Number__c);
            
        }
        for(String key:detailsMap.keySet()){
            Decimal queueNo = minNumberMap.get(key);
            System.debug(LoggingLevel.INFO, '*** queueNo: ' + queueNo);
            Decimal i = 0;
            for(Rental_Apply_Equipment_Set_Detail__c detail : detailsMap.get(key)){
                System.debug(LoggingLevel.INFO, '*** detail.Queue_Number__c: ' + detail.Queue_Number__c);
                if(detail.Queue_Number__c > queueNo){
                    RentalFixtureSetAssignController.KeyObj dobj = RentalFixtureSetAssignController.getSequenceInfo(detail);
                    sequencekeylist.addAll(dobj.sequencekeylist);
                    detail.Queue_Number__c  = queueNo + i;
                    i ++;
                    System.debug(LoggingLevel.INFO, '**111* detail.Queue_Number__c: ' + detail.Queue_Number__c);
                    changeDetailList.add(detail);
                }
            if((olddetail.Queue_Number__c > 0  && newdetail.Queue_Number__c == 0)// 暂定分配
                || (!olddetail.Cancel_Select__c && newdetail.Cancel_Select__c && olddetail.Queue_Number__c > 0)  //取消(排队中,暂定分配)
                || (olddetail.Queue_Number__c > 0  && newdetail.Queue_Number__c == null )//分单
                ){
                // 清空排队的UniqueKey
                newdetail.UniqueKey_Queue__c = null;
                System.debug('新排队UniqueKey_Queue__c:' + newdetail.UniqueKey_Queue__c);
            }
        }
        List<String> nodusequencekeylist = new List<String>(new Set<String>(sequencekeylist));
        List<Rental_Apply_Sequence__c> sequenceList = [SELECT Id,ExternalKey__c,Demo_Purpose2__c,
                                                    Apply_Set_Detail__c,Apply_Set_Detail_ExternalKey__c,
                                                    Series_No__c,Salesdepartment__c,Product_category__c,
                                                    Rental_Apply__c,Internal_asset_location__c,
                                                    Apply_Set_Detail__r.Queue_Number__c,Series_Unequal_Queue_Flag__c,
                                                    Fixture_Model_No__c,Equipment_Type__c
                                                    FROM Rental_Apply_Sequence__c
                                                    WHERE ExternalKey__c IN: nodusequencekeylist
                                                    AND Id NOT IN:changeSequenceIds
                                                    AND Series_No__c > 0
                                                    AND Invalid_Flag__c = false
                                                    FOR UPDATE
                                                    ];
        System.debug(LoggingLevel.INFO, '*** sequenceList: ' + sequenceList);
        Map<String,List<Rental_Apply_Sequence__c>> sequenceMap = new Map<String,List<Rental_Apply_Sequence__c>>();
        List<FixtureUtil.SequenceWrapper> Wrappers = new List<FixtureUtil.SequenceWrapper>();
        for(Rental_Apply_Sequence__c se: sequenceList){
            Wrappers.add(new FixtureUtil.SequenceWrapper(se));
        }
        Wrappers.sort();
        sequenceList = new List<Rental_Apply_Sequence__c>();
        for(FixtureUtil.SequenceWrapper wrapper:wrappers){
            sequenceList.add(wrapper.sequence);
        }
        for(Rental_Apply_Sequence__c se: sequenceList){
            if(!sequenceMap.containsKey(se.Externalkey__c)){
                sequenceMap.put(se.Externalkey__c,new List<Rental_Apply_Sequence__c>());
            }
            sequenceMap.get(se.Externalkey__c).add(se);
        }
        List<Rental_Apply_Sequence__c> changeSequenceList = new List<Rental_Apply_Sequence__c>();
        for(String key:sequenceMap.keyset()){
            Decimal i = 1;
            for(Rental_Apply_Sequence__c se: sequenceMap.get(key)){
                if(se.Series_No__c != i){
                    se.Series_No__c =  i;
                    changeSequenceList.add(se);
                }
                i ++ ;
            }
        }
        update assignSequence;
        update changeSequenceList;
        update changeDetailList;
            // 重排或者排队No变化时更新
            if (!newdetail.Cancel_Select__c && newdetail.Queue_Number__c > 0 && newdetail.ExternalKey__c != null
                && (newdetail.Queue_Number__c != olddetail.Queue_Number__c
                    || newdetail.ExternalKey__c != olddetail.ExternalKey__c)) {
                // 排队的UniqueKey设值
                newdetail.UniqueKey_Queue__c = newdetail.ExternalKey__c + ':' + newdetail.Queue_Number__c;
            System.debug('新排队UniqueKey_Queue__c:' + newdetail.UniqueKey_Queue__c);
            }
        }
        System.debug('结束处理------------------------------------');
    }
    /*
@@ -4796,13 +4831,12 @@
                                                                 ORDER BY Rental_Apply__c, Rental_Apply_Equipment_Set__c, Name];
        // 收集回寄明细 {raesId -> raesdList}
        Map<Id, List<Rental_Apply_Equipment_Set_Detail__c>> raesdListMap = new Map<Id, List<Rental_Apply_Equipment_Set_Detail__c>>();
        Map<Id, Rental_Apply__c> return_DeliverySlipIdMap = new Map<Id, Rental_Apply__c>();
        Map<Id, FixtureDeliverySlip__c> return_DeliverySlipMap = new Map<Id, FixtureDeliverySlip__c>();
        for (Rental_Apply_Equipment_Set_Detail__c raesd : raesdList) {
            if (!raesdListMap.containsKey(raesd.Rental_Apply_Equipment_Set__c)) {
                raesdListMap.put(raesd.Rental_Apply_Equipment_Set__c, new List<Rental_Apply_Equipment_Set_Detail__c>());
            }
            return_DeliverySlipIdMap.put(raesd.Return_DeliverySlip__c, raesd.Rental_Apply__r);
            raesdListMap.get(raesd.Rental_Apply_Equipment_Set__c).add(raesd);
            /* --------- 设置运输单Map Start --------- */
            if (return_DeliverySlipMap.containsKey(raesd.Rental_Apply__c) == false) {