游畅
2023-04-07 a886e1576fd1f45db37ed84b3c8b61aea4cdd4b1
force-app/main/default/classes/OpportunityTrigger.cls
@@ -1,5 +1,7 @@
public without sharing class OpportunityTrigger {
    public static Boolean isFirst = true;
    public static void lockOpportunityFile(List<Opportunity> newList, Map<Id, Opportunity> newMap, List<Opportunity> oldList, Map<Id, Opportunity> oldMap) {
        List<String> targetIds = new List<String>();
@@ -20,6 +22,7 @@
        update ofileList;
    }
    //CHAN-AZJ6JS 追溯系统来的询价,取消WIN时,经销商订单自动改到“驳回”
    public static void changeConsumableOrderStatus(List<Opportunity> newList, Map<Id, Opportunity> newMap, List<Opportunity> oldList, Map<Id, Opportunity> oldMap) {
        
@@ -40,10 +43,11 @@
                if (String.isNotBlank(newOpp.Opportunity_No__c)) orderIds.add(newOpp.Opportunity_No__c);
                //lastbuy  2022/2/9 fy start
                List<LastbuyProduct__c> upLastbuyObjList = new List<LastbuyProduct__c>();
                List<LastbuyProduct__c> LastbuyObjList=[select id,LastbuyQuantity__c,InquiryCode__c,ProductName__c from LastbuyProduct__c where InquiryCode__c= : newOpp.Id];
                List<LastbuyProduct__c> LastbuyObjList=[select id,LastbuyQuantity__c,InquiryCode__c,ProductName__c,effectiveFLG__c from LastbuyProduct__c where InquiryCode__c= : newOpp.Id];
                if(LastbuyObjList!=null){
                    for(LastbuyProduct__c lastbuypr :LastbuyObjList){
                        lastbuypr.ActualQuantity__c=null;
                        lastbuypr.ActualQuantity__c=0;
                        lastbuypr.effectiveFLG__c=true;
                        upLastbuyObjList.add(lastbuypr);
                    }
                }
@@ -162,10 +166,14 @@
                //     temptender.IsReactionOpp__c = true;
                //     tenderMap.put(temptender.id ,temptender ); 
                // }
                // 合并判断条件
                // 合并判断条件
                //20220803 you 招标项目增加 取消,中标结果更新确认条件
                if((op.SAP_Send_OK__c != oldopp.SAP_Send_OK__c) || 
                    ((op.StageName__c.equals('失单') && !oldopp.StageName__c.equals('失单')) || 
                    (!op.StageName__c.equals('失单') && oldopp.StageName__c.equals('失单')))) {
                    (!op.StageName__c.equals('失单') && oldopp.StageName__c.equals('失单'))) ||
                    ((op.StageName__c.equals('取消') && !oldopp.StageName__c.equals('取消')) ||
                    (!op.StageName__c.equals('取消') && oldopp.StageName__c.equals('取消'))) ||
                    (String.isNotBlank(op.ConfirmationofAward__c) && op.ConfirmationofAward__c!=oldopp.ConfirmationofAward__c)) {
                    for (Tender_Opportunity_Link__c link : links) {
                        if (link.Opportunity__c == op.Id) {
                            Tender_information__c temptender = new Tender_information__c();
@@ -175,6 +183,34 @@
                        }
                    }
                }
                //DB202304056706  you 20230406 清空 打标识,重新执行batch
                if(String.isBlank(op.ConfirmationofAward__c) && op.ConfirmationofAward__c!=oldopp.ConfirmationofAward__c){
                   for (Tender_Opportunity_Link__c link : links) {
                        if (link.Opportunity__c == op.Id) {
                            Tender_information__c temptender = new Tender_information__c();
                            temptender.Id = link.Tender_information__c;
                            temptender.IsReactionOpp__c = true;
                            tenderMap.put(temptender.id ,temptender);
                        }
                    }
                }
                //20221017  lt SWAG-CHL5XA【FY23询价改善】-统计主机台数 start
                // System.debug('lt123 oly主机'+op.OlyNumberHosts__c);
                // System.debug('lt123 老oly主机'+oldopp.OlyNumberHosts__c);
                // System.debug('lt123 对手主机'+op.RivalHostsNumber__c);
                // System.debug('lt123 老对手主机'+oldopp.RivalHostsNumber__c);
                if(op.OlyNumberHosts__c != oldopp.OlyNumberHosts__c || op.RivalHostsNumber__c != oldopp.RivalHostsNumber__c){
                    for (Tender_Opportunity_Link__c link : links){
                        if (link.Opportunity__c == op.Id){
                            Tender_information__c temptender = new Tender_information__c();
                            temptender.Id = link.Tender_information__c;
                            temptender.IsReactionOpp__c = true;
                            tenderMap.put(temptender.id ,temptender);
                        }
                    }
                }
                //20221017  lt SWAG-CHL5XA【FY23询价改善】-统计主机台数 end
            // }else {
            //     //新建时判断询价的招标项目是不是从无到有
@@ -259,4 +295,510 @@
        }
    } 
    // SWAG-C7P4XB end
    //LastBuy 预留产品 lt 20220315 start
    //询价失单或取消时,预留产品的"是否有效"设置为否
    public static void ReservedProFlg(List<Opportunity> newList, Map<Id, Opportunity> newMap, List<Opportunity> oldList, Map<Id, Opportunity> oldMap){
        List<Id> oppList = new List<Id>();
        List<LastbuyProduct__c> lbpflgList = new List<LastbuyProduct__c>();
        for (Opportunity lbOpp : newList){
            Opportunity OldLbOpp = oldMap.get(lbOpp.Id);
            if(OldLbOpp.StageName != lbOpp.StageName){
                if(lbOpp.StageName == '敗戦' || lbOpp.StageName == '削除'){
                    oppList.add(lbOpp.Id);
                }
            }
        }
        if(oppList.size() > 0){
            List<LastbuyProduct__c> lbpList = [select id, effectiveFLG__c,InquiryCode__c from LastbuyProduct__c where InquiryCode__c in :oppList];
            if(lbpList.size() > 0){
                for(LastbuyProduct__c lbp : lbpList){
                    if(lbp.effectiveFLG__c == true){
                        lbp.effectiveFLG__c = false;
                        lbpflgList.add(lbp);
                    }
                }
            }
        }
        if(lbpflgList.size() > 0){
            update lbpflgList;
        }
    }
    //LastBuy 预留产品 lt 20220315 end
//SWAG-CHL67J 【委托】【FY23询价改善】-询价页面/招标项目增加统计字段 fy start
// public static void UpdateBidNumber(List<Opportunity> newList, Map<Id, Opportunity> newMap, List<Opportunity> oldList, Map<Id, Opportunity> oldMap){
//     List<Id> OpportunityIdList = new List<Id>();
//     Boolean flag = true;
//     for (Opportunity opp : newList) {
//         OpportunityIdList.add(opp.Id);
//         Opportunity oldopp = oldMap == null? null : oldMap.get(opp.Id);
//         if(oldopp==null){
//             if(opp.NumberOfBids__c!=null||opp.BidWinningNumber__c!=null){
//                 flag = true;
//             }
//         }else{
//             if(opp.NumberOfBids__c!=oldopp.NumberOfBids__c||opp.NumberOfBids__c!=oldopp.NumberOfBids__c){
//                 flag = true;
//             }
//         }
//     }
//     system.debug('newList+++'+newList);
//     system.debug('oldList+++'+oldList);
//     if(flag){
//         List<Tender_Opportunity_Link__c> TenderOpportunityLinkList = [select Tender_information__c from Tender_Opportunity_Link__c where Opportunity__c in:OpportunityIdList];
//         Set<Id> enderOpportunityId = new Set<Id>();
//         if(TenderOpportunityLinkList.size()>0){
//             for (Tender_Opportunity_Link__c TenderOpportunity : TenderOpportunityLinkList) {
//                 enderOpportunityId.add(TenderOpportunity.Tender_information__c);
//             }
//         }
//         system.debug('TenderOpportunityLinkList+++'+TenderOpportunityLinkList);
//         List<Tender_Opportunity_Link__c> TenderOpportunityLinkList2 = [select Tender_information__c,Opportunity__r.NumberOfBids__c,Opportunity__r.BidWinningNumber__c from Tender_Opportunity_Link__c where Tender_information__c in:enderOpportunityId];
//         Map<String,Tender_information__c> TenderinformationMap = new Map<String,Tender_information__c>();
//         system.debug('TenderOpportunityLinkList2+++'+TenderOpportunityLinkList2);
//         if(TenderOpportunityLinkList2.size()>0){
//             for(Tender_Opportunity_Link__c TenderOpportunity2 :TenderOpportunityLinkList2){
//                     if(TenderinformationMap.containsKey(TenderOpportunity2.Tender_information__c)){
//                         Tender_information__c Tender_informationvalue = new Tender_information__c();
//                         Tender_informationvalue = TenderinformationMap.get(TenderOpportunity2.Tender_information__c);
//                         Tender_informationvalue.NumberOfBids__c=Tender_informationvalue.NumberOfBids__c+TenderOpportunity2.Opportunity__r.NumberOfBids__c;
//                         Tender_informationvalue.BidWinningNumber__c=Tender_informationvalue.BidWinningNumber__c+TenderOpportunity2.Opportunity__r.BidWinningNumber__c;
//                         TenderinformationMap.put(TenderOpportunity2.Tender_information__c, Tender_informationvalue);
//                     }else{
//                         Tender_information__c Tender_informationvalue = new Tender_information__c();
//                         Tender_informationvalue.Id=TenderOpportunity2.Tender_information__c;
//                         Tender_informationvalue.NumberOfBids__c=TenderOpportunity2.Opportunity__r.NumberOfBids__c;
//                         Tender_informationvalue.BidWinningNumber__c=TenderOpportunity2.Opportunity__r.BidWinningNumber__c;
//                         TenderinformationMap.put(TenderOpportunity2.Tender_information__c, Tender_informationvalue);
//                     }
//             }
//         }
//         List<Tender_information__c> Tender_informationList = new List<Tender_information__c>();
//         for (Tender_information__c value : TenderinformationMap.values()) {
//             Tender_informationList.add(value);
//         }
//         system.debug('Tender_informationList+++'+Tender_informationList);
//         update Tender_informationList;
//     }
// }
//SWAG-CHL67J 【委托】【FY23询价改善】-询价页面/招标项目增加统计字段 fy end
    //add 询价跟进任务开发 - 3.创建失单任务 sx 20220617 start
    //询价中标结果确认竞争对手中标时实时创建失单任务
    public static void createTaskByOppConfirmationofAward(List<Opportunity> newList, Map<Id, Opportunity> newMap, List<Opportunity> oldList, Map<Id, Opportunity> oldMap){
        if (!isFirst) {
            return;
        }
        Set<Id> oppoIds = new Set<Id>();
        Map<Id,String> mapoppid = new Map<Id,String>();
        list<task__c> taskUpdateList = new list<task__c>();
        for(Opportunity op : newList){
            Opportunity oldopp =  oldMap.get(op.Id);
            //询价中标结果确认竞争对手中标时实时创建失单任务 且 询价状态1等于询价
            if (oldopp.ConfirmationofAward__c != '竞争对手中标' && op.ConfirmationofAward__c == '竞争对手中标' && op.StageName__c == '询价' && !op.DirectLossFLG__c ){
                oppoIds.add(op.Id);
            }
            //20220929 you  SWAG-CJP7TL 手动更改询价所有人,同步修改任务所有人
            if(String.isNotBlank(op.OwnerId) && op.OwnerId !=oldopp.OwnerId){
                 mapoppid.put(op.id,op.OwnerId);
            }
        }
        if(mapoppid.size() > 0){
            List<Task__c> taskList = [
                    SELECT Id,OpportunityId__c,taskStatus__c
                    FROM task__c
                    WHERE OpportunityId__c in :mapoppid.keySet()
                    AND (RecordType.Name = '中标结果确认' OR RecordType.Name = '失单报告任务')
                    AND taskStatus__c = '02 接受'];
            system.debug(mapoppid.keySet()+'test1-----'+taskList);
            for(Task__c t: taskList){
                if(mapoppid.containsKey(t.OpportunityId__c)){
                   t.Ownerid = mapoppid.get(t.OpportunityId__c);
                   t.assignee__c = mapoppid.get(t.OpportunityId__c);
                   taskUpdateList.add(t);
                }
            }
             if (taskUpdateList != null && taskUpdateList.size() > 0) {
                update taskUpdateList;
            }
        }
        if (!oppoIds.isEmpty()) {
            // 20221206  DB202211594688 start
            // // 有效失单状态一览
            // List<String> validStatus = new List<String>{'申请中', '提交', '批准'};
            // // 询价失单/取消报告查询
            // List<Lost_cancel_report__c> lostCancelReportList = [SELECT Id, Opportunity__c from Lost_cancel_report__c WHERE Opportunity__c in :oppoIds and Report_Status__c in: validStatus];
            // List<Lost_cancel_report__c> lostCancelReportList1 = [SELECT Id, Opportunity__c,DeveloperName__c from Lost_cancel_report__c WHERE Opportunity__c in :oppoIds and Report_Status__c ='草案'];
            // //<询价Id, 失单报告>
            // Map<String, Lost_cancel_report__c> lostCancelReportMap = new Map<String, Lost_cancel_report__c>();
            // for(Lost_cancel_report__c lcr : lostCancelReportList){
            //     if (!lostCancelReportMap.isEmpty() && lostCancelReportMap.containsKey(lcr.Opportunity__c)) {
            //         // no action
            //     } else {
            //         lostCancelReportMap.put(lcr.Opportunity__c, lcr);
            //     }
            // }
            //有效失单状态一览
            List<String> validStatus = new List<String>{'申请中', '提交', '批准'};
            List<String> allStatus = new List<String>{'申请中', '提交', '批准','草案'};
            // 询价失单/取消报告查询
            List<Lost_cancel_report__c> lostCancelReportList = [SELECT Id, Opportunity__c,Report_Status__c,DeveloperName__c  from Lost_cancel_report__c WHERE Opportunity__c in :oppoIds and Report_Status__c in: allStatus];
            //<询价Id, 失单报告>
            Map<String, Lost_cancel_report__c> lostCancelReportMap = new Map<String, Lost_cancel_report__c>();
            Map<String, Lost_cancel_report__c> lostCancelReportMap1 = new Map<String, Lost_cancel_report__c>();
            for(Lost_cancel_report__c lcr : lostCancelReportList){
                if(validStatus.contains(lcr.Report_Status__c)){
                    if (!lostCancelReportMap.isEmpty() && lostCancelReportMap.containsKey(lcr.Opportunity__c)) {
                        // no action
                    } else {
                        lostCancelReportMap.put(lcr.Opportunity__c, lcr);
                    }
                }else{
                    // 草案
                    if (!lostCancelReportMap1.isEmpty() && lostCancelReportMap1.containsKey(lcr.Opportunity__c)) {
                    // no action
                    } else {
                        lostCancelReportMap1.put(lcr.Opportunity__c, lcr);
                    }
                }
            }
            // 20221206  DB202211594688 start
            List<Task__c> insTaskList = new List<Task__c>();
            // 定义需要更新的询价任务
            List<Opportunity> updateOpportunity = new List<Opportunity>();
            // 记录类型:失单报告任务
            List<RecordType> recordTypes = [select Id from RecordType where IsActive = true and SobjectType = 'task__c' and DeveloperName = 'LoseListTask'];
            Id loseListTask_TaskId = recordTypes.get(0).Id;
            //String taskName = '';
            for(Opportunity opp : newList) {
                //没有已提交的失单报告
                if(!lostCancelReportMap.containsKey(opp.Id) && oppoIds.contains(opp.Id)) {
                    //创建失单任务提醒
                    Task__c tempTask = new Task__c();
                    tempTask.RecordTypeId = loseListTask_TaskId;
                    tempTask.taskDifferent__c = '被动任务';
                    tempTask.taskStatus__c = '02 接受';       //任务状态2
                    tempTask.assignee__c = opp.OwnerId;    //被分配者
                    tempTask.account__c = opp.AccountId;
                    tempTask.Name = '失单结果确认:' + opp.Opportunity_No__c;
                    tempTask.OwnerId = opp.OwnerId;   //所有人
                    tempTask.OpportunityId__c = opp.Id;
                    tempTask.ConfirmDate__c = Date.today();
                    insTaskList.add(tempTask);
                    //更新询价  Task_createTime__c
                    Opportunity uopp  = new Opportunity();
                    uopp.Id = opp.Id;
                    uopp.LostTask_createTime__c  = Date.today();
                    //20221205 you DB202211594688  部分失单派发任务,但是中标结果不赋值
                    if(null!=lostCancelReportMap1.get(opp.Id) && lostCancelReportMap1.get(opp.Id).DeveloperName__c =='PCL_PartLost_report'){
                        uopp.ConfirmationofAward__c = '';
                        uopp.ConfirmationofAward_createTime__c = null;
                        uopp.Is_ConfirmationofAward__c =null;
                    }else{
                        if(oldMap.get(opp.Id).ConfirmationofAward__c != '竞争对手中标' && opp.ConfirmationofAward__c == '竞争对手中标'){
                          uopp.Closing_Bid_Date__c = null;
                        }
                    }
                    updateOpportunity.add(uopp);
                }
            }
            if (!insTaskList.isEmpty()) {
                insert insTaskList;
            }
            if (!updateOpportunity.isEmpty()) {
                update updateOpportunity;
            }
        }
        isFirst = false;
    }
    //add 询价跟进任务开发 - 3.创建失单任务 sx 20220617 end
    //询价跟进任务开发
    public static void opportunityTasks(List<Opportunity> newList, Map<Id, Opportunity> newMap, List<Opportunity> oldList, Map<Id, Opportunity> oldMap){
        Set<Id> oppoIds = new Set<Id>();
        for(Opportunity op : newList){
            Opportunity oldopp =  oldMap.get(op.Id);
            //询价中标结果确认竞争对手中标时实时创建失单任务 且 询价状态1等于询价
            if (oldopp.ConfirmationofAward__c != 'OLY中标' && op.ConfirmationofAward__c == 'OLY中标' && op.StageName__c == '询价'){
                oppoIds.add(op.Id);
                //确认中标结果时间 创建任务时间  20220629 sx
                op.ConfirmationofAward_createTime__c = Date.today();
                if(op.Task_createTime__c!=null){
                    //是否按时确认:3个工作日内按时1,不按时0
                    String inttemp = CalendarUtil.getWorkDayNum(String.valueOf(op.Task_createTime__c), String.valueOf(op.ConfirmationofAward_createTime__c));
                    op.Is_ConfirmationofAward__c = Integer.valueOf(inttemp) > 3 ? 0 : 1;
                }
            }
            //20220628会议新需求  对手中标 7.中标日清空
            if(oldopp.ConfirmationofAward__c != '竞争对手中标' && op.ConfirmationofAward__c == '竞争对手中标'){
                //op.Closing_Bid_Date__c = null; // 20221206 you
                op.ConfirmationofAward_createTime__c = Date.today();
                if(op.Task_createTime__c!=null){
                    //是否按时确认:3个工作日内按时1,不按时0
                    String inttemp = CalendarUtil.getWorkDayNum(String.valueOf(op.Task_createTime__c), String.valueOf(op.ConfirmationofAward_createTime__c));
                    op.Is_ConfirmationofAward__c = Integer.valueOf(inttemp) > 3 ? 0 : 1;
                }
            }
        }
        if(!oppoIds.isEmpty()){
            // 2022-12-02 ssm DB202211552746 增加流标废标时清空结果记录日的逻辑,需要判断不是流标废标的结果数据才更新中标日
            list<Tender_Opportunity_Link__c> toppLinkList = [Select Id, Opportunity__c, Tender_information__c,Tender_information__r.ResultDate__c,Tender_information__r.InfoType__c
                                                            FROM Tender_Opportunity_Link__c
                                                            WHERE Opportunity__c in :oppoIds
                                                            and Tender_information__r.InfoType__c = '3:结果'
                                                            and Tender_information__r.subInfoType__c != '3-1:废标公告'
                                                            and Tender_information__r.subInfoType__c != '3-2:流标公告'];
            Map<String, Tender_Opportunity_Link__c> toopLinkMap = new Map<String, Tender_Opportunity_Link__c>();
            for(Tender_Opportunity_Link__c tol : toppLinkList){
                Opportunity oppoTemp = newMap.get(tol.Opportunity__c);
                //询价关联到招标项目才进行操作
                if(oppoTemp.Bidding_Project_Name_Bid__c == tol.Tender_information__c){
                    toopLinkMap.put(tol.Opportunity__c, tol);
                }
            }
            for (String key : toopLinkMap.keySet()) {
                Opportunity oppoTemp = newMap.get(key);
                //20220628会议新需求  OLY中标 7.中标日(结果记录日)= 招标项目.结果记录日
                oppoTemp.Closing_Bid_Date__c = toopLinkMap.get(key).Tender_information__r.ResultDate__c;
                System.debug('============'+toopLinkMap.get(key).Tender_information__r.ResultDate__c);
                //是否按时确认:3个工作日内按时1,不按时0
                //String inttemp = CalendarUtil.getWorkDayNum(String.valueOf(oppoTemp.Task_createTime__c), String.valueOf(oppoTemp.ConfirmationofAward_createTime__c));
                //oppoTemp.Is_ConfirmationofAward__c = Integer.valueOf(inttemp) > 3 ? 0 : 1;
            }
        }
        Integer i = 0;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
    }
}