public without sharing class Product2Handler extends Oly_TriggerHandler { private Map newMap; private Map oldMap; private List newList; private List oldList; public Product2Handler() { this.newMap = (Map) Trigger.newMap; this.oldMap = (Map) Trigger.oldMap; this.newList = (List) Trigger.new; this.oldList = (List) Trigger.old; } protected override void beforeInsert() { beforeSetValue(); // SWAG-BHE9GK LHJ 竞争对手产品自动编码 Start SetCompetitorCode(); // SWAG-BHE9GK LHJ 竞争对手产品自动编码 End // WLIG-CKKA4M xxf 【委托】【产品主数据】注册证更新后部分字段信息未自动代入 Start AutomaticallyBringData(); // WLIG-CKKA4M xxf 【委托】【产品主数据】注册证更新后部分字段信息未自动代入 End } protected override void beforeUpdate() { beforeSetValue(); //SFDC停止预警 lt 20211015 add start // FlgStopManufacure(this.newList, this.oldMap); //SFDC停止预警 lt 20211015 add end FlgStopManufacure(); } //SFDC停止预警 lt 20210922 add start protected override void afterUpdate() { Calculate_AverageMonthSales(this.newList, this.oldMap); AssignmentUltrasonic(this.newList, this.oldMap); //20230506 lt DB202304618804 包含超声 add } //SFDC停止预警 lt 20210922 add end // SWAG-BHE9GK LHJ 竞争对手产品自动编码 Start private void SetCompetitorCode() { Boolean SelctFlg = false; list proList; //带量采购修改 start fy list proListsc; //带量采购修改 end fy String strPC = ''; //带量采购修改 start fy String strPCsc = ''; //带量采购修改 end fy Integer i = 1; String ProductRecordTypes = System.Label.ProductRecordTypeID; String[] RecordTypes = String.isNotBlank(ProductRecordTypes) ? ProductRecordTypes.split(',') : null; for (Product2 nObj : newList) { //带量采购修改 start fy String RecordTypeString = ''; if (nObj.RecordTypeId != null) { RecordTypeString = String.valueof(nObj.RecordTypeId).substring(0, 15); } // nObj.Competitor_product_dummy__c=System.Label.ProductRecordTypeID.contains(RecordTypeString); // if (nObj.Competitor_product_dummy__c) { if (System.Label.ProductRecordTypeID.contains(RecordTypeString)) { SelctFlg = true; } //带量采购修改 end fy } if (SelctFlg) { proList = [ SELECT Max(ProductCode) PC FROM Product2 WHERE ProductCode LIKE 'SD%' AND ProductCode != 'SD999999' ]; if (proList != null && proList.size() > 0) { strPC = String.valueof(proList[0].get('PC')); } //带量采购 start fy // proListsc = [Select Max(ProductCode) PC From Product2 Where ProductCode Like 'SC%']; // if (proListsc != null && proListsc.size() > 0) { // strPCsc = String.valueof(proListsc[0].get('PC')); // } List lastPro = [ SELECT Id, ProductCode FROM Product2 WHERE ProductCode LIKE 'SC%' ORDER BY ProductCode DESC LIMIT 1 ]; strPCsc = lastPro != null && lastPro.size() > 0 ? lastPro[0].ProductCode : ''; //带量采购 end fy } for (Product2 nObj : newList) { //带量采购 start fy String RecordTypeString = ''; if (nObj.RecordTypeId != null) { RecordTypeString = String.valueof(nObj.RecordTypeId).substring(0, 15); } // if (nObj.Competitor_product_dummy__c && strPC.length() == 8 // if (System.Label.ProductRecordTypeID.contains(RecordTypeString) && strPC.length() == 8 if (System.Label.ProductRecordTypeID.contains(RecordTypeString)) { //带量采购 end fy // && proList != null && proList.size() > 0 ) { // Integer num = Integer.valueOf(strPC.SubString(2,strPC.length())) + i; Integer num = String.isNotBlank(strPC) ? Integer.valueOf(strPC.SubString(2, strPC.length())) + i : i; //带量采购 start fy Integer numsc = String.isNotBlank(strPCsc) ? Integer.valueOf(strPCsc.SubString(2, strPCsc.length())) + i : i; // if(RecordTypeString=='0129D000001NacC'){ if ( RecordTypes != null && RecordTypes.size() > 1 && RecordTypeString == RecordTypes[1] ) { nObj.ProductCode = 'SC' + String.valueOf(numsc).leftpad(8, '0'); } else { nObj.ProductCode = 'SD' + String.valueOf(num).leftpad(6, '0'); } //带量采购 end fy // nObj.ProductCode = 'SD' + String.valueOf(num).leftpad(6,'0'); i++; } } } // SWAG-BHE9GK LHJ 竞争对手产品自动编码 End //WLIG-CKKA4M xxf 【委托】【产品主数据】注册证更新后部分字段信息未自动代入 Start private void AutomaticallyBringData() { List noNewList = new List(); for (Product2 prd : newList) { if (prd.Asset_Model_No__c != null) { noNewList.add(prd.Asset_Model_No__c); } } if (!noNewList.isEmpty()) { List prdList = [ SELECT Id, Name, Asset_Model_No__c, MDM_Name__c, Maintenance_Price_Year__c, Extend_new_product_gurantee_MD__c, Extend_Gurantee_Start_MD__c, Extend_Gurantee_End_MD__c, Entend_gurantee_period_MD__c, Extend_new_product_gurantee__c, Extend_Gurantee_Start__c, Extend_Gurantee_End__c, Entend_gurantee_period__c, CanNotCancelledGurantee__c, Service_Category1__c, Service_Category2__c, Service_Category3__c, Service_Category4__c, Service_Category5__c, Service_Category6__c, Service_Category7__c, Can_Repair__c, RepairListPriceLevelA__c, RepairListPriceLevelB__c, RepairListPriceLevelC__c, PartSupplyFinishDate__c, EndSaleDate__c, ProductClass__c, ProductCategory__c, Period_Filter_Classify1__c, Period_Filter_Classify2__c, Period_Filter_Classify3__c, Intra_Trade_Service_RMB_Date1__c, Intra_Trade_Service_RMB_Date2__c, Intra_Trade_Service_RMB_EndDate1__c, Intra_Trade_Service_RMB_EndDate2__c, Intra_Trade_Service_RMB_1__c, Intra_Trade_Service_RMB_2__c FROM Product2 WHERE Asset_Model_No__c IN :noNewList ORDER BY CreatedDate DESC ]; if (prdList.isEmpty()) { return; } Map prdMap = new Map(); for (Product2 pro2 : prdList) { if (!prdMap.isEmpty() && prdMap.containskey(pro2.Asset_Model_No__c)) { } else { prdMap.put(pro2.Asset_Model_No__c, pro2); } } for (Product2 prd : newList) { if (prdMap.containskey(prd.Asset_Model_No__c)) { prd.Maintenance_Price_Year__c = prdMap.get(prd.Asset_Model_No__c) .Maintenance_Price_Year__c; //维修合同报价 prd.CanNotCancelledGurantee__c = prdMap.get(prd.Asset_Model_No__c) .CanNotCancelledGurantee__c; //不可取消多年保修 prd.ProductClass__c = prdMap.get(prd.Asset_Model_No__c) .ProductClass__c; //市场产品类别 prd.ProductCategory__c = prdMap.get(prd.Asset_Model_No__c) .ProductCategory__c; //市场区分 prd.Extend_new_product_gurantee_MD__c = prdMap.get( prd.Asset_Model_No__c ) .Extend_new_product_gurantee_MD__c; //市场保修对象 prd.Extend_new_product_gurantee__c = prdMap.get(prd.Asset_Model_No__c) .Extend_new_product_gurantee__c; //服务保修对象 if ( prdMap.get(prd.Asset_Model_No__c) .Extend_new_product_gurantee_MD__c == true ) { //市场保修对象 prd.Entend_gurantee_period_MD__c = prdMap.get(prd.Asset_Model_No__c) .Entend_gurantee_period_MD__c; //市场保修期(年) } if ( prdMap.get(prd.Asset_Model_No__c).Extend_new_product_gurantee__c == true ) { //服务保修对象 prd.Entend_gurantee_period__c = prdMap.get(prd.Asset_Model_No__c) .Entend_gurantee_period__c; //服务保修期(年) } prd.Extend_Gurantee_Start_MD__c = prdMap.get(prd.Asset_Model_No__c) .Extend_Gurantee_Start_MD__c; //市场保修开始日 prd.Extend_Gurantee_End_MD__c = prdMap.get(prd.Asset_Model_No__c) .Extend_Gurantee_End_MD__c; //市场保修结束日 prd.Extend_Gurantee_Start__c = prdMap.get(prd.Asset_Model_No__c) .Extend_Gurantee_Start__c; //服务保修开始日 prd.Extend_Gurantee_End__c = prdMap.get(prd.Asset_Model_No__c) .Extend_Gurantee_End__c; //服务保修结束日 prd.Service_Category1__c = prdMap.get(prd.Asset_Model_No__c) .Service_Category1__c; //第1服务分类 prd.Service_Category2__c = prdMap.get(prd.Asset_Model_No__c) .Service_Category2__c; prd.Service_Category3__c = prdMap.get(prd.Asset_Model_No__c) .Service_Category3__c; prd.Service_Category4__c = prdMap.get(prd.Asset_Model_No__c) .Service_Category4__c; prd.Service_Category5__c = prdMap.get(prd.Asset_Model_No__c) .Service_Category5__c; prd.Service_Category6__c = prdMap.get(prd.Asset_Model_No__c) .Service_Category6__c; prd.Service_Category7__c = prdMap.get(prd.Asset_Model_No__c) .Service_Category7__c; prd.Can_Repair__c = prdMap.get(prd.Asset_Model_No__c).Can_Repair__c; //是否可维修 prd.RepairListPriceLevelA__c = prdMap.get(prd.Asset_Model_No__c) .RepairListPriceLevelA__c; //A(W)级维修参考价格 prd.RepairListPriceLevelB__c = prdMap.get(prd.Asset_Model_No__c) .RepairListPriceLevelB__c; prd.RepairListPriceLevelC__c = prdMap.get(prd.Asset_Model_No__c) .RepairListPriceLevelC__c; prd.PartSupplyFinishDate__c = prdMap.get(prd.Asset_Model_No__c) .PartSupplyFinishDate__c; //零件停止供应日期 prd.EndSaleDate__c = prdMap.get(prd.Asset_Model_No__c).EndSaleDate__c; //停止销售日期 prd.Period_Filter_Classify1__c = prdMap.get(prd.Asset_Model_No__c) .Period_Filter_Classify1__c; //营业统计分类1 prd.Period_Filter_Classify2__c = prdMap.get(prd.Asset_Model_No__c) .Period_Filter_Classify2__c; //营业统计分类2 prd.Period_Filter_Classify3__c = prdMap.get(prd.Asset_Model_No__c) .Period_Filter_Classify3__c; //营业统计分类3 prd.Intra_Trade_Service_RMB_Date1__c = prdMap.get( prd.Asset_Model_No__c ) .Intra_Trade_Service_RMB_Date1__c; //多年保价格有效开始日1 prd.Intra_Trade_Service_RMB_Date2__c = prdMap.get( prd.Asset_Model_No__c ) .Intra_Trade_Service_RMB_Date2__c; //多年保价格有效开始日2 prd.Intra_Trade_Service_RMB_EndDate1__c = prdMap.get( prd.Asset_Model_No__c ) .Intra_Trade_Service_RMB_EndDate1__c; //多年保价格有效结束日1 prd.Intra_Trade_Service_RMB_EndDate2__c = prdMap.get( prd.Asset_Model_No__c ) .Intra_Trade_Service_RMB_EndDate2__c; //多年保价格有效结束日2 prd.Intra_Trade_Service_RMB_1__c = prdMap.get(prd.Asset_Model_No__c) .Intra_Trade_Service_RMB_1__c; //多年保价格1 prd.Intra_Trade_Service_RMB_2__c = prdMap.get(prd.Asset_Model_No__c) .Intra_Trade_Service_RMB_2__c; //多年保价格2 } } } } // WLIG-CKKA4M xxf 【委托】【产品主数据】注册证更新后部分字段信息未自动代入 end private void beforeSetValue() { for (Product2 nObj : newList) { //CHAN-B8GCBB if (nObj.WhiteSpace__c == true) { nObj.StorageStatus__c = String.valueOf(nObj.StorageStatusNo__c); } else { nObj.StorageStatus__c = ''; } //CHAN-B8GCBB nObj.Fixture_Model_No_T__c = nObj.Fixture_Model_No_F__c; // CBPR LHJ if ( Trigger.isInsert || (Trigger.isUpdate && nObj.SFDA_Status_New__c != oldMap.get(nObj.id).SFDA_Status_New__c) ) { nObj.SFDA_Status__c = nobj.SFDA_Status_New__c; if ( nobj.SFDA_Status_New__c == '新製品申請中' || nobj.SFDA_Status_New__c == '準備中' ) { nObj.SFDA_Status__c = '停止'; } } // CBPR LHJ // SWAG-BHE9GK LHJ 竞争对手产品自动编码 Start if (Trigger.isInsert) { } // SWAG-BHE9GK LHJ 竞争对手产品自动编码 End } } //SFDC停止预警 lt 20210914 add start private static void Calculate_AverageMonthSales( List newList, Map oldMap ) { //符合条件的 旧 产品List List oproList = new List(); //符合条件的 新旧 产品Id List 作为条件 List conList = new List(); //Map<旧的,新的>对应 Map matMap = new Map(); //Map<旧Id,预计停止日> Map adateMap = new Map(); //Map<旧Id, x(平均月销量)> Map xMap = new Map(); //Map<旧Id, z(天数)> Map zMap = new Map(); for (Product2 term : newList) { System.debug('标识' + term.CalMonthSalesFLG__c); System.debug('新库存' + term.StorageStatusNo__c); System.debug('旧库存' + oldMap.get(term.Id).StorageStatusNo__c); if ( term.M_BC_Stop_manufacure__c != null && term.SFDA_Status__c != '停止' && (term.StorageStatusNo__c != oldMap.get(term.Id).StorageStatusNo__c || term.CalMonthSalesFLG__c == true) ) { if (term.Correspond_Code__c != null) { matMap.put((String) term.Id, (String) term.Correspond_Code__c); conList.add(term.Correspond_Code__c); } conList.add(term.Id); oproList.add(term.Id); adateMap.put(term.Id, term.M_BC_Stop_manufacure__c); } } //做 一对多 的 Map> Map> msMap = new Map>(); if (conList.size() > 0) { List msList = [ SELECT Id, MonthSales__c, CurrentMonth__c, CurrentDate__c, CurrentYear__c, ProductM__c, Product2Model__c, ProductM__r.StorageStatusNo__c, ProductM__r.M_BC_Stop_manufacure__c FROM ProductMonthlySales__c WHERE ProductM__c IN :conList ORDER BY CurrentDate__c DESC ]; //双层循环 产品==>月销量 for (Id pro : conList) { for (ProductMonthlySales__c mms : msList) { if (pro == mms.ProductM__c) { if (msMap.containsKey(pro)) { msMap.get(pro).add(mms); } else { List pmsaleList = new List(); pmsaleList.add(mms); msMap.put(pro, pmsaleList); } } } } System.debug('条件List' + conList); System.debug('sql查到的List' + msList); System.debug('产品月销量msMap为' + msMap); System.debug('旧的产品List' + oproList); if (msMap.size() > 0) { System.debug('产品月销量msMap为' + msMap); for (Id res : oproList) { //a旧 月销量和 ; b新 月销量和 ; c商(平均月销量) ; x商四舍五入 ; //y 库存/平均月销量天数 ; z 天数 四舍五入 Decimal c = 0, y = 0; Integer x = 0, z = 0; if (msMap.get(res) != null) { //月销量大于12个月 if (msMap.get(res).size() >= 12) { Decimal a = 0, b = 0; Integer i; for (i = 0; i < 12; i++) { a += msMap.get(res)[i].MonthSales__c; } if (matMap.get(res) != null) { if (msMap.get(matMap.get(res)) != null) { if (msMap.get(matMap.get(res)).size() >= 12) { for (i = 0; i < 12; i++) { b += msMap.get(matMap.get(res))[i].MonthSales__c; System.debug('新的大于十二' + b); } } else { for ( ProductMonthlySales__c nms : msMap.get(matMap.get(res)) ) { b += nms.MonthSales__c; System.debug('新的小于十二遍历全部' + b); } } } } //四舍五入 c = (a + b) / 12; if (c > 1) { x = Integer.valueOf(c.round(System.RoundingMode.HALF_UP)); xMap.put(res, x); } else if (c > 0) { x = 1; xMap.put(res, x); } //x = Integer.valueOf(c.round(System.RoundingMode.Up)); //x = Integer.valueOf(c.round(System.RoundingMode.HALF_UP)); System.debug('新' + b); System.debug('旧' + a); System.debug('除法足c' + c); System.debug('四舍五入x' + x); } //月销量不足12个月 else { Decimal a = 0, b = 0; for (ProductMonthlySales__c oms : msMap.get(res)) { a += oms.MonthSales__c; } if (msMap.get(matMap.get(res)) != null) { for (ProductMonthlySales__c nms : msMap.get(matMap.get(res))) { b += nms.MonthSales__c; } } c = (a + b) / msMap.get(res).size(); //x = Integer.valueOf(c.round(System.RoundingMode.UP)); //x = Integer.valueOf(c.round(System.RoundingMode.HALF_UP)); if (c > 1) { x = Integer.valueOf(c.round(System.RoundingMode.HALF_UP)); xMap.put(res, x); } else if (c > 0) { x = 1; xMap.put(res, x); } System.debug('除法不足12c' + c); System.debug('四舍五入x' + x); } if (x != 0) { for (ProductMonthlySales__c dat : msMap.get(res)) { Decimal m = 0; if (dat.ProductM__r.StorageStatusNo__c != null) { m = dat.ProductM__r.StorageStatusNo__c; } y = m / x; y = y * 30; } } //z = Integer.valueOf(y.round(System.RoundingMode.UP)); z = Integer.valueOf(y.round(System.RoundingMode.HALF_UP)); zMap.put(res, z); System.debug('天数y' + y); System.debug('四舍五入z' + z); } } } List finList = new List(); for (Id fin : oproList) { Product2 fip = new Product2(); fip.Id = fin; fip.CalMonthSalesFLG__c = false; if (xMap.get(fin) != null) { fip.Average_MonthSales__c = xMap.get(fin); } //20211020 if (zMap.get(fin) != null) { if (zMap.get(fin) != 0) { fip.Estimated_ConsumptionDueDate__c = Date.today() .addDays(zMap.get(fin)); } else { if (adateMap != null) { Date adate = adateMap.get(fin); fip.Estimated_ConsumptionDueDate__c = adate; } } } else { if (adateMap != null) { Date adate = adateMap.get(fin); fip.Estimated_ConsumptionDueDate__c = adate; } } //20211020 finList.add(fip); } update finList; } } //SFDC停止预警 lt 20210914 add end //SFDC停止预警 lt 20211015 add start //ProductMonthlySalesFlag__c 12月销量标识 预计停止日期(M_BC_Stop_manufacure__c)变化时 // private static void FlgStopManufacure(List newList,Map oldMap){ // if(newList != null){ // for(Product2 pts : newList){ // if(oldMap != null){ // if(pts.M_BC_Stop_manufacure__c != null && oldMap.get(pts.Id).M_BC_Stop_manufacure__c == null){ // pts.ProductMonthlySalesFlag__c = true; // } // if(pts.M_BC_Stop_manufacure__c != null && oldMap.get(pts.Id).M_BC_Stop_manufacure__c != null && pts.M_BC_Stop_manufacure__c != oldMap.get(pts.Id).M_BC_Stop_manufacure__c){ // pts.ProductMonthlySalesFlag__c = true; // } // if(pts.M_BC_Stop_manufacure__c == null && oldMap.get(pts.Id).M_BC_Stop_manufacure__c != null){ // pts.ProductMonthlySalesFlag__c = false; // pts.Estimated_ConsumptionDueDate__c = null; // } // } // } // } // } //SFDC停止预警 lt 20211015 add end private void FlgStopManufacure() { for (Product2 pts : newList) { Product2 oldPts = oldMap.get(pts.Id); if (pts.M_BC_Stop_manufacure__c != oldPts.M_BC_Stop_manufacure__c) { pts.ProductMonthlySalesFlag__c = true; if (pts.M_BC_Stop_manufacure__c == null) { pts.ProductMonthlySalesFlag__c = false; pts.Estimated_ConsumptionDueDate__c = null; } } if (pts.SFDA_Status__c == '停止' && oldPts.SFDA_Status__c != '停止') { pts.Estimated_ConsumptionDueDate__c = null; } } } //20230506 lt DB202304618804 包含超声 start private static void AssignmentUltrasonic( List newList, Map oldMap ) { List proIdList = new List(); List updateplpList = new List(); for (Product2 pro : newList) { if ( pro.RecordTypeId == System.Label.Pro_RecordType && (pro.Lost_Product_Differ__c != oldMap.get(pro.Id).Lost_Product_Differ__c || pro.Lost_Product_Category__c != oldMap.get(pro.Id).Lost_Product_Category__c) ) { proIdList.add(pro.Id); } } List plpList = [ SELECT Id, LostProduct__c, ProductClass__c, ProductCategory__c FROM PCLLostProduct__c WHERE LostProduct__c IN :proIdList ]; if (plpList.size() > 0) { for (PCLLostProduct__c plp : plpList) { plp.ProductClass__c = '主机'; plp.ProductCategory__c = '超声主机'; updateplpList.add(plp); } } update updateplpList; } //20230506 lt DB202304618804 包含超声 end }