高章伟
2022-02-18 8b5f4c6c281cfa548f92de52c8021e37aa81901e
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
//create by rentx 2020-10-15
global class UpdateSAPContractNoTextBatch implements Database.Batchable<sObject>, Database.Stateful {
    public List<String> tempIds;
 
    global UpdateSAPContractNoTextBatch(List<String> tempId) {
        this.tempIds = tempId;
 
 
    }
    global UpdateSAPContractNoTextBatch() {
        this.tempIds = new List<String>();
 
    }
 
    global Database.QueryLocator start(Database.BatchableContext bc) {
        //1.拿到明细2
        String stasql = 'SELECT Id,sNo__c,Consumable_product__r.OT_CODE_Text__c,Consumable_order_minor__r.ContractNo__c,SerialLotNo__c,TracingCode__c,Consumable_product__c,Opportunity_No__c  from Consumable_order_details2__c where Consumable_product__c != null and ((sNo__c != null  and Consumable_order_minor__r.Opportunity__c != null) or Opportunity_No__c=null ) AND Consumable_product__r.OT_CODE_Text__c != null ';
        if (tempIds != null && tempIds.size() > 0) {
            stasql += 'AND Id in :tempIds ';
        }
        return Database.getQueryLocator(stasql);
    }
 
    global void execute(Database.BatchableContext BC, list<Consumable_order_details2__c> codList) {
        //直接跳过明细2的触发器
        StaticParameter.ConsumableAssetHanderTrigger = true;
        StaticParameter.EscapeOrderDetail2Trigger = true;
 
        //使用 消耗品明细2中的 消耗品名称 中的'产品编码.' + 明细2上的机身编码 拼接为保有设备标记为耗材的查询条件
        //使用 消耗品明细2中的 消耗品名称 中的'产品编码.' + 明细2上的批次号 拼接为保有设备标记为主机的查询条件
        Map<String,Consumable_order_details2__c> codMap = new Map<String,Consumable_order_details2__c>();
 
        for(Consumable_order_details2__c codc : codList) {
            //耗材
            String tempStr = codc.Consumable_product__r.OT_CODE_Text__c + ':' + codc.sNo__c;
            codMap.put(tempStr,codc);
            //主机 add by rentx 2020-12-02
            if (codc.SerialLotNo__c != null) {
                String tempStr2 = codc.Consumable_product__r.OT_CODE_Text__c + ':' + codc.SerialLotNo__c;
                codMap.put(tempStr2,codc);
            }
        }
 
 
        //3.根据拼接好的值 查找对应的保有设备
        List<Asset> assList = new List<Asset>();
        assList = [SELECT Id,Product_Serial_No__c,TocodeAndSerialNumber__c,Backorder__r.Opportunity__r.Id,Backorder__r.Id,Backorder__r.ContractNO__c,Product_name_serial__c,SerialNumber,OT_CODE__c
                   FROM Asset WHERE Backorder__c != null
                   AND TocodeAndSerialNumber__c <> null
                   AND TocodeAndSerialNumber__c in :codMap.keySet()];
        Map<String,Asset> assMap = new Map<String,Asset>();
        for (Asset ass : assList) {
            if(assMap.containsKey(ass.TocodeAndSerialNumber__c)) {
                continue;
            }else{
                assMap.put(ass.TocodeAndSerialNumber__c, ass);
            }
        }
 
        //4.获取询价
        List<String> oppIds = new List<String>();
        //存放保有设备的OTCode+机身编码 检索用 和 询价id
        Map<String,String> ssMap = new Map<String,String>();
        //存放询价id和拼好的SAP合同号字符串
        Map<String,String> ssMap2 = new Map<String,String>();
        //存放询价id和拼好的询价编码字符串 tcm 20211109
        Map<String,String> ssMap3 = new Map<String,String>();
 
        for(Asset ass :assMap.values()) {
            //如果保有设备的注残不为空 且注残上的询价也不为空 并且 OTCode+机身编码 检索用 也不为空
            //添加保有设备上的 OTCode+机身编码 检索用 为key 询价的id为value
            if (ass.Backorder__c != null && ass.Backorder__r.Opportunity__c != null  && ass.TocodeAndSerialNumber__c != null) {
                oppIds.add(ass.Backorder__r.Opportunity__r.Id);
                //将保有设备的TocodeAndSerialNumber__c作为key,oppid作为value
                ssMap.put(ass.TocodeAndSerialNumber__c, ass.Backorder__r.Opportunity__r.Id);
            }
        }
 
        //注残集合
        List<Statu_Achievements__c> statuList = new List<Statu_Achievements__c>();
        // tcm 添加查询字段 Opp_Number__c 20211109
        statuList = [SELECT Id,Opportunity__c,ContractNO__c,Opp_Number__c FROM Statu_Achievements__c WHERE Opportunity__c in :oppIds];
 
        for (String oppid : oppIds) {
            String str = '';
            // tcm 20211110 str2
            String str2;
            //遍历注残
            for (Statu_Achievements__c statu : statuList) {
                if (statu.Opportunity__c == oppId && statu.ContractNO__c != null) {
                    str += statu.ContractNO__c+',';
                }
 
                // 【委托】ET消耗品系统自动生成出库数量大于当月发货数量 tcm 20211109 start
                if (statu.Opportunity__c == oppId && statu.Opp_Number__c != null) {
                    str2 = statu.Opp_Number__c;
                }
                // 【委托】ET消耗品系统自动生成出库数量大于当月发货数量 tcm 20211109 end
            }
 
            //将 询价id SAP合同号放入map
            if (str.length() > 0) {
                ssMap2.put(oppId, str.substring(0,str.length()-1));
            }
            // 【委托】ET消耗品系统自动生成出库数量大于当月发货数量 tcm 20211109 start
            //将 询价id 询价编码放入map
            if (str2.length() > 0) {ssMap3.put(oppId, str2);}
            // 【委托】ET消耗品系统自动生成出库数量大于当月发货数量 tcm 20211109 end
        }
 
        //遍历查到的所有明细2 拼接明细2对应的保有设备中的 otcode加机身编码,以此为key获取ssmap中value->询价id,以询价id为key 获取ssmap2中的value->SAP合同号
        for(Consumable_order_details2__c codc : codList) {
            String tempStr = codc.Consumable_product__r.OT_CODE_Text__c + ':' + codc.sNo__c;
            String tempStr2 = codc.Consumable_product__r.OT_CODE_Text__c + ':' + codc.SerialLotNo__c;
            if (ssMap.containsKey(tempStr) || ssMap.containsKey(tempStr2)) {
                String oppid = ssMap.get(tempStr);
                String oppid2 = ssMap.get(tempStr2);
                if (String.isNotBlank(ssMap2.get(oppid2))) {
                    codc.ContractNo_text__c = ssMap2.get(oppid2);
                }else if (String.isNotBlank(ssMap2.get(oppid))) {
                    codc.ContractNo_text__c = ssMap2.get(oppid);
                }
                // 【委托】ET消耗品系统自动生成出库数量大于当月发货数量 tcm 20211110 start
                //询价编码赋值
                if (String.isNotBlank(ssMap3.get(oppid2))) {
                    codc.Opportunity_No__c = ssMap3.get(oppid2);
                }else if (String.isNotBlank(ssMap3.get(oppid))) {
                    codc.Opportunity_No__c = ssMap3.get(oppid);
                }
                // 【委托】ET消耗品系统自动生成出库数量大于当月发货数量 tcm 20211110 end
            }
        }
 
        if (codList.size() > 0) {
            update codList;
        }
    }
 
    global void finish(Database.BatchableContext BC) {
    }
}