李彤
2022-03-25 2682be2d1932fd43e0226c011bb32ae3c5e643bf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
/**
 * 20220210 lt 更新产品上的“预留产品”标识
 * 产品 有 有效预留产品  “预留产品”标识 true
 * 产品 没有 有效预留产品(无预留产品 或 预留产品 无效)  “预留产品”标识 false
 * (1) 新建 有效预留产品                                            --true
 * (2) 更新  “是否有效” false 变为 true                             --true
 * (3) 更新 “产品” 后                                               --true
 * (4) 更新  “是否有效” true 变为 false 的产品下无有效预留产品        --false
 * (5) 更新 “产品” 前的产品 无预留产品 或 无有效预留产品               --false
 */
public without sharing class LastbuyProductHandler extends Oly_TriggerHandler {
    private Map<Id, LastbuyProduct__c> newMap;
    private Map<Id, LastbuyProduct__c> oldMap;
    private List<LastbuyProduct__c> newList;
    private List<LastbuyProduct__c> oldList;
 
    public LastbuyProductHandler() {
        this.newMap = (Map<Id, LastbuyProduct__c>) Trigger.newMap;
        this.oldMap = (Map<Id, LastbuyProduct__c>) Trigger.oldMap;
        this.newList = (List<LastbuyProduct__c>) Trigger.new;
        this.oldList = (List<LastbuyProduct__c>) Trigger.old;
    }
    
    protected override void beforeInsert(){
 
    }
 
    protected override void afterInsert(){
        ReservedPro();
    }
 
    protected override void afterUpdate(){
        ReservedPro();
    }
 
    protected override void afterDelete(){
        ReservedPro();
    }
 
    private void ReservedPro(){
        //1.新建或者更新产品后,若预留产品有效,“预留产品”标识为true
        if(trigger.isInsert || trigger.isUpdate){
            
            //存产品的ID 
            List<Id> pList = new List<Id>();
            for(LastbuyProduct__c lbp : newList){
                if(lbp.ProductName__c != null && lbp.effectiveFLG__c == true){
                    pList.add(lbp.ProductName__c);
                }
            }
 
            List<Product2> proList = [select id, LastbuyProductFLG__c from Product2 where Id in :pList];
            List<Product2> pflgList = new List<Product2>();
 
            for(Product2 pro : proList){
                if(pro.LastbuyProductFLG__c == false){
                    pro.LastbuyProductFLG__c = true;
                    pflgList.add(pro);
                }
            }
 
            if(pflgList.size() > 0){
                update pflgList;
            }
        }
        
        //2.(1)"是否有效" 变为 false  检索产品主数据下的所有预留产品,全无效则把产品主数据的"预留产品"标识 变为 false
        //  (2)"产品"    预留产品 更改 产品主数据之前的产品 -- 检索产品主数据下的所有预留产品(没有/全无效)
        //                                                  "预留产品"标识 变为 false
        if(trigger.isUpdate || trigger.isDelete){
            //"是否有效" 变为 "否" 时 所对应的产品主数据Id &&预留产品 更改 产品主数据之前的产品
            List<Id> pfList = new List<Id>();  
 
            if(trigger.isUpdate){
                for(LastbuyProduct__c lbp1 : newList){
                    LastbuyProduct__c oldLbp1 = oldMap.get(lbp1.Id);
                    if(oldLbp1.effectiveFLG__c != lbp1.effectiveFLG__c){
                        if(lbp1.effectiveFLG__c == false){
                            pfList.add(lbp1.ProductName__c);
                        }
                    }
                    //产品发生变化时,检索两个产品的标识
                    if(oldLbp1.ProductName__c != lbp1.ProductName__c){
                        pfList.add(oldLbp1.ProductName__c);
                    }
                }
            }
            else if(trigger.isDelete){
                for(LastbuyProduct__c lbp2 : oldList){
                    pfList.add(lbp2.ProductName__c);
                }
            }
            
            
            System.debug('lt123需检索所有预留产品的产品ID-pfList'+pfList);
 
            //检索产品下的所有预留产品,全无效将产品主数据下的标识置为false
            if(pfList.size() > 0){
                //Map<产品Id,预留产品>
                Map<String,LastbuyProduct__c> lbpMap = new Map<String,LastbuyProduct__c>();
                //发生变化的产品Id下的所有预留产品
                List<LastbuyProduct__c> lbpList = [select id, effectiveFLG__c,ProductName__c from LastbuyProduct__c where ProductName__c in :pfList];
                //p1List effectiveFLG__c为true 的产品Id
                List<Id> p1List = new List<Id>();
                //p2List 这个产品所有的预留产品都无效 的产品Id
                List<Id> p2List = new List<Id>();
 
                if(lbpList.size() > 0){   //产品有预留产品 检查预留产品的"是否有效"
                    for(LastbuyProduct__c lbm : lbpList){
                        lbpMap.put(lbm.ProductName__c,lbm);
                        if(lbm.effectiveFLG__c == true){
                            p1List.add(lbm.ProductName__c);
                        }
                    }
        
                    if(p1List.size() > 0){
                        for(Id p1 : p1List){
                            if(!lbpMap.containsKey(p1)){
                                p2List.add(p1);
                            }
                        }
                    }else{
                        for(LastbuyProduct__c lbm : lbpList){
                            p2List.add(lbm.ProductName__c);
                        }
                    }
                    
                }
                else{   //产品 没有预留产品  标识false
                    p2List = pfList;
                }
                
                List<Product2> pro1List = [select Id, LastbuyProductFLG__c from Product2 where Id in :p2List];
                List<Product2> prflgList = new List<Product2>();
                for(Product2 pro1 : pro1List){
                    pro1.LastbuyProductFLG__c = false;
                    prflgList.add(pro1);
                }
                if(prflgList.size() > 0){
                    update prflgList;
                }
            }
        }
 
    }
 
}