public without sharing class TransferAgencyReceivedController { public List esdList { get; set; } public String apply_no { get; private set; } public Boolean done_flg { get; set; } private String taId; public Boolean readOnly { get; set; } public FixtureDeliverySlip__c slip { get; set; } public List outputFieldList {get; set;} public Boolean forceSave { get; set; } public Boolean needforceSave { get; set; } public Boolean canReturn { get; set; } private final static String DELIMITER = '#'; public Integer esdListLen{get; set;} public TransferAgencyReceivedController() { taId = ApexPages.currentPage().getParameters().get('id'); outputFieldList = setFieldSet('TransferApplyDetail__c', 'TransferAgencyReceived'); forceSave = false; needforceSave = false; canReturn = false; } public PageReference init() { esdList = new List(); done_flg = false; String jsonStr; if (taId != null) { readOnly = false; List eList = getDetails(); esdListLen = eList.size(); if (eList.size() > 0) { //20210111 ljh add start Map rsMap = new Map(); for (TransferApplyDetail__c tadd : eList) { Boolean isonetoone = tadd.OneToOneAccessory__c || tadd.Main_OneToOne__c; if (isonetoone) { //有NG或者主机欠品 if(rsMap.containsKey(tadd.TransferApplySummary__c) && !rsMap.get(tadd.TransferApplySummary__c)) { //满足条件更新值 if((String.isNotBlank(tadd.TransferApplySummary__r.First_TAD__r.ArrivalResult__c) && tadd.TransferApplySummary__r.First_TAD__r.ArrivalResult__c == '欠品' && tadd.TransferApplySummary__r.First_TAD__r.Main_OneToOne__c) ||(String.isNotBlank(tadd.ArrivalResult__c) && tadd.ArrivalResult__c == 'NG' && (tadd.TransferApplySummary__r.First_TAD__r.Main_OneToOne__c || tadd.TransferApplySummary__r.First_TAD__r.OneToOneAccessory__c))){ rsMap.put(tadd.TransferApplySummary__c,true); } }else{ if(!rsMap.containsKey(tadd.TransferApplySummary__c)){ //新加入 Boolean tempVal; if((String.isNotBlank(tadd.TransferApplySummary__r.First_TAD__r.ArrivalResult__c)&& tadd.TransferApplySummary__r.First_TAD__r.ArrivalResult__c == '欠品') ||(String.isNotBlank(tadd.ArrivalResult__c) && tadd.ArrivalResult__c == 'NG')){ tempVal = true; }else{ tempVal = false; } rsMap.put(tadd.TransferApplySummary__c, tempVal); } } } else { rsMap.put(tadd.TransferApplySummary__c,false); } } //20210111 ljh add end Boolean need = true; Id rsId; for (TransferApplyDetail__c tad : eList) { if (rsId != tad.TransferApplySummary__c) { need = need == false; } if(tad.TransferApply__r.Shipment_Slip_tmp__c != null && jsonStr == null) { jsonStr = tad.TransferApply__r.Shipment_Slip_tmp__c; } if(String.isBlank(apply_no)) { apply_no = tad.TransferApply__r.Name; } if (tad.TransferApply__r.Yi_loaner_arranged__c == 0 || tad.TransferApply__r.ShelfUp_ng_num__c == 0) { readOnly = true; } // 【FY24大及巨大课题】北京新法规项目对应 DB202307428742 20230804 by lc Start if (tad.Asset__c != null) { if (String.isBlank(tad.Asset__r.Temperature_And_Humidity_Zone__c)) { // 初始默认为A区 tad.Asset__r.Temperature_And_Humidity_Zone__c = 'A区'; } } // 【FY24大及巨大课题】北京新法规项目对应 DB202307428742 20230804 by lc End EsdInfo ei = new EsdInfo(tad); ei.needColor = need; ei.canReturn = rsMap.get(tad.TransferApplySummary__c);//20210111 ljh add esdList.add(ei); rsId = tad.TransferApplySummary__c; } } else { ApexPages.addmessage(new ApexPages.message(ApexPages.severity.Error, '没有调拨明细!')); return null; } } if (jsonStr != null) { try { slip = (FixtureDeliverySlip__c)JSON.deserialize(jsonStr, FixtureDeliverySlip__c.class); } catch (Exception ex) { ApexPages.addmessage(new ApexPages.message(ApexPages.severity.Error, ex.getMessage())); if (slip == null) { slip = new FixtureDeliverySlip__c(); } } } else { if (slip == null) { slip = new FixtureDeliverySlip__c(); } } if (slip.Wh_Staff__c == null) { slip.Wh_Staff__c = Userinfo.getUserId(); } slip.IsForTransfer__c = true; return null; } private List setFieldSet(String objApi, String fieldSetApi) { List lvList = new List(); Map fsMap = Schema.getGlobalDescribe().get(objApi).getDescribe().fieldSets.getMap(); Schema.FieldSet fs = fsMap.get(fieldSetApi); List fsmList = fs.getFields(); for (FieldSetMember fsm : fsmList) { lvList.add(new LabelValue(fsm.getLabel(), fsm.getFieldPath())); } return lvList; } // 保存物流信息按钮 public PageReference saveSlip() { done_flg = false; if(readOnly) return null; Savepoint sp = Database.setSavepoint(); Boolean needroll = false; try { Set tsIdSet = new Set(); Boolean haveError = false; List tadList = new List(); List infoList = new List(); Set ngSet = new Set(); Set lostSet = new Set(); for (EsdInfo main : esdList) { Boolean isonetoone = main.rec.OneToOneAccessory__c || main.rec.Main_OneToOne__c; if ((isonetoone || (main.rec.OneToOneAccessory__c == false && main.rec.Main_OneToOne__c == false)) && main.rec.ArrivalResult__c == 'NG') { ngSet.add(main.rec.TransferApplySummary__c); } else if (isonetoone && main.rec.ArrivalResult__c == '欠品' && main.rec.Main_OneToOne__c) { lostSet.add(main.rec.TransferApplySummary__c); } if (main.checked) { tsIdSet.add(main.rec.TransferApplySummary__c); } } for (EsdInfo main : esdList) { Boolean isonetoone = main.rec.OneToOneAccessory__c || main.rec.Main_OneToOne__c; if (main.checked) { if (ngSet.contains(main.rec.TransferApplySummary__c) == false && lostSet.contains(main.rec.TransferApplySummary__c) == false) { ApexPages.addmessage(new ApexPages.message(ApexPages.severity.Error, main.rec.SerialNumber_F__c + '只有主体欠品或者附属品NG的一览才可以回寄')); haveError = true; continue; } else if (isonetoone == false && main.rec.ArrivalResult__c == 'OK') { ApexPages.addmessage(new ApexPages.message(ApexPages.severity.Error, main.rec.SerialNumber_F__c + '只有主体欠品或者附属品NG的一览才可以回寄')); haveError = true; continue; } else { tadList.add(main.rec); infoList.add(main); } } else if (isonetoone && tsIdSet.contains(main.rec.TransferApplySummary__c) && (ngSet.contains(main.rec.TransferApplySummary__c) || lostSet.contains(main.rec.TransferApplySummary__c))) { ApexPages.addmessage(new ApexPages.message(ApexPages.severity.Error, main.rec.SerialNumber_F__c + '【需整套回寄】')); haveError = true; } } if (haveError == false) { if (tadList.size() == 0) { ApexPages.addmessage(new ApexPages.message(ApexPages.severity.Error, '请选择要回寄的明细')); return null; } if (slip.Id != null) { slip = [ SELECT Combine_Pack__c, Name, Id, DeliveryCompany_SlipNo__c,DeliveryType__c,Distributor_method__c,DeliveryCompany__c,Wh_Staff__c, Wh_Staff__r.Name FROM FixtureDeliverySlip__c WHERE Id =:slip.Id FOR UPDATE ]; } Map tadMap = new Map([SELECT Id , Inspection_result_after_ng__c , Lost_item_check_staff__c FROM TransferApplyDetail__c WHERE Id = :tadList AND (Inspection_result_after_ng__c != null OR Lost_item_check_staff__c != null) AND Return_DeliverySlip__c != null]); tadList = new List(); if (tadMap.isEmpty()) { slip.Shippment_loaner_time__c = Datetime.now(); needroll = String.isBlank(slip.Id); FixtureUtil.withoutUpsertObjects(new List{ slip }); } for (EsdInfo main : infoList) { if (tadMap.isEmpty()) { main.rec.Inspection_result_after_ng__c = null; main.rec.Inspection_result_after_NG_Final__c = null; main.rec.After_Inspection_time__c = null; main.rec.After_Inspection_time_Final__c = null; main.rec.Inspection_result_after__c = null; main.rec.Inspection_result_after_Final__c = null; main.rec.Return_DeliverySlip__c = slip.Id; main.rec.Asset_return_time__c = Datetime.now(); main.rec.Lost_item_check_staff__c = null; main.rec.Lost_item_check_staff_Final__c = null; main.rec.Lost_item_check_time__c = null; main.rec.Check_lost_Item__c = null; main.rec.Check_lost_Item_Final__c = null; main.rec.CDS_complete__c = false; main.rec.Lost_item_check_time_Final__c = null; main.editable = false; tadList.add(main.rec); } else if (tadMap.containsKey(main.rec.Id)) { main.errorInfo = '明细已经做了收货确认,无法回寄,请刷新画面重试'; ApexPages.addmessage(new ApexPages.message(ApexPages.severity.Error, main.rec.SerialNumber_F__c + '明细已经做了收货确认,无法回寄,请刷新画面重试')); } } if (tadList.size() > 0) { FixtureUtil.withoutUpdate(tadList); ApexPages.addmessage(new ApexPages.message(ApexPages.severity.CONFIRM, '已回寄')); return init(); } else { return init(); } } } catch (Exception ex) { String msg = ex.getMessage(); if (msg != null && msg.contains('DUPLICATE_VALUE') && msg.contains('DeliveryCompany_SlipNo__c')) { ApexPages.addmessage(new ApexPages.message(ApexPages.severity.Error, '系统已存在相同的运输单。如果继续使用该运输单回寄,请输入运输单号检索,检索后再勾选配套回寄。')); } else { ApexPages.addmessage(new ApexPages.message(ApexPages.severity.Error, msg)); } Database.rollback(sp); done_flg = false; if (needroll) { slip.Id = null; } } return null; } private List getDetails() { List eList = [ select SerialNumber_F__c, OneToOneAccessory__c, Main_OneToOne__c, TransferApplySummary__c , Internal_Asset_number_key__c, Fixture_Model_No_F__c, TAESD_Status__c , TransferApply__c, Shippment_loaner_time__c , TransferApply__r.Shipment_Slip_tmp__c , TransferApply__r.Yi_loaner_arranged__c , TransferApply__r.Name , Fixture_Model_No__c , SerialNumber__c , Detail_Finish__c , Inspection_result_after_F__c , Loaner_asset_no__c , ArrivalResult__c , Arrival_wh_Abandoned_Flag_F__c , Internal_asset_location_After__c , Salesdepartment_After__c , Return_DeliverySlip__c , Asset_return_time__c , Arrival_wh_Flag_F__c , FSD_OneToOneAccessory_Cnt_F__c , Cancel_Select__c , TransferApply__r.ShelfUp_ng_num__c , Asset__r.Product2.Name , LastModifiedDate , OneToOneAsset__c , First_You_Xiao_Ku_Cun__c , TransferApplySummary__r.First_TAD__r.Loaner_accsessary__c , TransferApplySummary__r.First_TAD__r.ArrivalResult__c , TransferApplySummary__r.First_TAD__r.Lost_item_giveup__c , TransferApplySummary__r.First_TAD__r.Arrival_in_wh__c , TransferApplySummary__r.First_TAD__r.Main_OneToOne__c , TransferApplySummary__r.First_TAD__r.OneToOneAccessory__c , Approved_F__c, Fixture_Name_F__c, TransferApplySummary__r.Fixture_Set__r.Name , Fixture_QRCode_F__c, TransferApplySummary__r.Name, Pre_inspection_time__c, StockDown__c , StockDown_time__c, Id, Name, Asset__c, Asset__r.Name, Asset__r.SerialNumber, Asset__r.Product_Serial_No__c, Asset__r.Remark__c, Asset__r.ImageAsset__c, Asset__r.ImageSerial__c, Asset__r.ImageAssetUploadedTime__c, Asset__r.ImageSerialUploadedTime__c, Loaner_CDS_Info__c, Inspection_result__c, Check_lost_Item__c, Pre_disinfection__c, Water_leacage_check__c, Inspection_result_after__c, Arrival_in_wh__c, Asset__r.Pre_Reserve_TAES_Detail__c, Asset__r.Pre_Reserve_TAES_Detail__r.After_Inspection_time__c, Inspection_result_after_ng__c, Inspection_result_ng__c, Lost_item_giveup__c, CDS_complete__c, Loaner_accsessary__c,Arrival_NG_Comment__c, //20210423 ljh 1832 add Arrival_NG_Comment__c // 【FY24大及巨大课题】北京新法规项目对应 DB202307428742 20230801 by lc Start Asset__r.Storage_Conditions__c, Asset__r.Temperature_And_Humidity_Zone__c, Asset__r.Storage_Conditions_Met_Status__c, Asset__r.Product2.ProductCode, Asset__r.Product2.SFDA_Approbation_No__c // 【FY24大及巨大课题】北京新法规项目对应 DB202307428742 20230801 by lc End from TransferApplyDetail__c where TransferApply__c = :taId AND Cancel_Select__c = False //order by TransferApplySummary__c, Is_First_TAD_F__c DESC, TransferApplySummary__r.Name, IndexFromUniqueKey__c order by TransferApplySummary__r.Name, TransferApplySummary__c,Name ]; return eList; } // // 下架按钮 // public PageReference stockup() { // done_flg = false; // needforceSave = false; // String userid = Userinfo.getUserId(); // List eList = new List(); // List otoCheckList_main = new List(); // List otoAccessoryList = new List(); // Set assetForLock = new Set(); // Set ukeySet = new Set(); // Boolean haveCheck = false; // Boolean haveError = false; // List newOneToOne = new List(); // for (EsdInfo esdInfo : esdList) { // if (esdInfo.checked) { // haveCheck = true; // esdInfo.errorInfo = null; // if (esdInfo.needsetone && String.isBlank(esdInfo.rec.OneToOneAsset__c) && esdInfo.rec.Arrival_in_wh__c) { // ApexPages.addmessage(new ApexPages.message(ApexPages.severity.Error, esdInfo.rec.Asset__r.Product2.Name + ':上架需要设置一对一主体')); // haveError = true; // } // if (esdInfo.accessoryFlg) { // otoAccessoryList.add(esdInfo); // } else { // if (!esdInfo.editable) continue; // TransferApplyDetail__c esd = esdInfo.rec; // eList.add(esd); // if (esd.Arrival_in_wh__c) { // if (esd.FSD_OneToOneAccessory_Cnt_F__c > 0 && esd.Main_OneToOne__c && (esd.ArrivalResult__c == 'OK' || (!esd.Arrival_wh_Abandoned_Flag_F__c && esd.Arrival_wh_Flag_F__c))) { // otoCheckList_main.add(esdInfo); // } else if ((esd.ArrivalResult__c == 'OK' || (!esd.Arrival_wh_Abandoned_Flag_F__c && esd.Arrival_wh_Flag_F__c)) && esd.FSD_OneToOneAccessory_Cnt_F__c > 0 && esd.Fixture_Set_Detail__r.Is_OneToOne__c) { // otoAccessoryList.add(esdInfo); // } // String ukey = esd.Fixture_Model_No_F__c // 型号;存放地;本部 // + ';' + esd.Internal_asset_location_After__c // + ';' + esd.Salesdepartment_After__c; // ukeySet.add(ukey); // } // } // if (esdInfo.editable) { // assetForLock.add(esdInfo.rec.Asset__c); // } // } // } // if (haveCheck == false) { // ApexPages.addmessage(new ApexPages.message(ApexPages.severity.Error, '请勾选需要操作的明细')); // return null; // } // else if (haveError) { // return null; // } // Map>> assProductCountMapAll = new Map>>(); // 一览Id->产品Id->保有设备Id列表 // for (EsdInfo ei : otoAccessoryList) { // Map> assProductCountMap; // if (assProductCountMapAll.containsKey(ei.accessorySetId)) { // assProductCountMap = assProductCountMapAll.get(ei.accessorySetId); // } else { // assProductCountMap = new Map>(); // } // Id recId; // Id product2Id; // if (ei.rec2 != null) { // recId = ei.rec2.Id; // product2Id = ei.rec2.Product2Id; // } else { // recId = ei.rec.Asset__c; // product2Id = ei.rec.Asset__r.Product2Id; // } // List count; // if (assProductCountMap.containsKey(product2Id)) { // count = assProductCountMap.get(product2Id); // } else { // count = new List(); // } // count.add(recId); // assProductCountMap.put(product2Id, count); // assProductCountMapAll.put(ei.accessorySetId, assProductCountMap); // } // Boolean needSaveSet = false; // Boolean needSaveDetail = false; // Boolean needSaveAsset = false; // List otolinkList = new List(); // boolean err = false; // Map otoMap = new Map(); // for (EsdInfo main : otoCheckList_main) { // List tadList; // //没有cancel的看最新一套明细的fsd数量 // //已经cancel的看最早一套明细的一对一分配数量 // //理论上出库前上架的数据不会有非cancel的情况,所以直接用Cancel_Select__c判断 // system.debug(main.rec); // if (main.rec.Cancel_Select__c == false) { // tadList = [select Asset__r.Product2.Name, Asset__c, Asset__r.Product2Id , OneToOneAccessory__c // from TransferApplyDetail__c // where TransferApplySummary__c = :main.rec.TransferApplySummary__c // and OneToOneAccessory__c = true // and Cancel_Select__c = false //找最新的一套明细 // //and Canceled_Id__c = null //找最初的一套明细 // and Asset__c <> null //过滤未分配的数据。 // order by OneToOneAccessory__c desc]; // } else { // tadList = [select Asset__r.Product2.Name, Asset__c, Asset__r.Product2Id , OneToOneAccessory__c // from TransferApplyDetail__c // where TransferApplySummary__c = :main.rec.TransferApplySummary__c // and OneToOneAccessory__c = true // //and Canceled_Id__c = null // and Asset__c <> null // order by OneToOneAccessory__c desc]; // } // system.debug(tadList); // Map> assProductCountMap = new Map>(); // if (assProductCountMapAll.containsKey(main.rec.TransferApplySummary__c)) { // assProductCountMap = assProductCountMapAll.get(main.rec.TransferApplySummary__c); // } // for (TransferApplyDetail__c tad : tadList) { // if (assProductCountMap.containsKey(tad.Asset__r.Product2Id) && assProductCountMap.get(tad.Asset__r.Product2Id).size() > 0) { // List count = assProductCountMap.get(tad.Asset__r.Product2Id); // String assetId = (String)count[0]; // count.remove(0); // assProductCountMap.put(tad.Asset__r.Product2Id, count); // assProductCountMapAll.put(main.rec.TransferApplySummary__c, assProductCountMap); // String key = (String)main.rec.Asset__c + ':' + assetId; // Integer otoCnt; // if (otoMap.containsKey(key)) { // otoCnt = otoMap.get(key); // } else { // otoCnt = 0; // } // otoMap.put(key, otoCnt + 1); // } else { // if (!forceSave && (main.rec.Cancel_Select__c == false || (main.rec.Cancel_Select__c == true && tad.OneToOneAccessory__c))) { // main.errorInfo = '未补全附属品:'+tad.Asset__r.Product2.Name; // ApexPages.addmessage(new ApexPages.message(ApexPages.severity.Error, main.rec.SerialNumber_F__c + '未补全附属品:'+tad.Asset__r.Product2.Name)); // err = true; // needforceSave = true; // break; // } else { // continue; // } // } // } // } // forceSave = false; // if (err) return null; // for (String oto : otoMap.keySet()) { // List keys = oto.split(':'); // Fixture_OneToOne_Link__c otolink = new Fixture_OneToOne_Link__c(); // otolink.Main_Asset__c = keys[0]; // otolink.Accessory_Asset__c = keys[1]; // otolink.Quantity__c = otoMap.get(oto); // otolinkList.add(otolink); // } // // TODO 没变化不存 // // if (Step_status == '上架') { // for (TransferApplyDetail__c esd : eList) { // if (esd.Arrival_in_wh__c) { // esd.Arrival_wh_time__c = System.now(); // esd.Return_wh_chenk_staff__c = userid; // } else { // esd.Arrival_wh_time__c = null; // esd.Return_wh_chenk_staff__c = null; // } // } // needSaveDetail = true; // // } // for (EsdInfo esdInfo : esdList) { // if (esdInfo.accessoryFlg) continue; // TransferApplyDetail__c esd = esdInfo.rec; // if (esd.Arrival_in_wh__c && esd.FSD_OneToOneAccessory_Cnt_F__c > 0 && esd.Main_OneToOne__c && esd.Arrival_wh_Abandoned_Flag_F__c) { // otoCheckList_main.add(esdInfo); // } // } // String sqlStr = 'SELECT Id FROM Asset WHERE Id IN:assetForLock '; // String sqlWhere = ''; // if(! ukeySet.isEmpty()) { // for(String ukey: ukeySet) { // // 型号;存放地;本部 // List fields = ukey.split(';'); // // 型号 // if (String.isNotBlank(fields[0]) && fields[0] != 'null') { // sqlWhere += ' (Fixture_Model_No_F__c =\'' + String.escapeSingleQuotes(fields[0]) + '\''; // } else { // sqlWhere += ' (Fixture_Model_No_F__c = null'; // } // // 备品存放地 // if (String.isNotBlank(fields[1]) && fields[1] != 'null') { // sqlWhere += ' AND Internal_asset_location__c =\'' + String.escapeSingleQuotes(fields[1]) + '\''; // } else { // sqlWhere += ' AND Internal_asset_location__c = null'; // } // // 本部 // if (String.isNotBlank(fields[2]) && fields[2] != 'null') { // sqlWhere += ' AND Salesdepartment__c =\'' + String.escapeSingleQuotes(fields[2]) + '\')'; // } else { // sqlWhere += ' AND Salesdepartment__c = null)'; // } // sqlWhere += ' OR'; // } // sqlWhere = sqlWhere.removeEnd('OR'); // sqlWhere = '((' + sqlWhere + ')'; // sqlWhere += ' AND Delete_Flag__c = false ' // + ' AND Asset_Owner__c = \'Olympus\'' // + ' AND AssetManageConfirm__c = true' // + ' AND Quantity > 0' // + ' AND Freeze_sign_Abandoned_Flag__c = False' // + ' AND Manage_type__c = \'数量管理\')'; // sqlStr += ' OR ' + sqlWhere ; // } // sqlStr += ' FOR UPDATE'; // List astLock = Database.query(sqlStr); // Savepoint sp = Database.setSavepoint(); // try { // // 强制删废弃主体的一对一link // if (otoCheckList_main.size() > 0) { // List mainIds = new List(); // for (EsdInfo oto : otoCheckList_main) { // if (String.isNotBlank(oto.rec.Asset__c)) { // // Asset__c 念のための確認 // mainIds.add(oto.rec.Asset__c); // } // } // FixtureUtil.delOtOLinkData(mainIds); // } // if (otolinkList.size() > 0) { // // TODO 只对现场追加的一对一附属品建link // if (needSaveDetail) { // FixtureUtil.withoutUpsertObjects(otolinkList); // needSaveDetail = false; // } // } // // 这里只更新明细,保有设备和link都放到trigger里更新 // if (needSaveDetail) FixtureUtil.withoutUpsertObjects(eList); // List esdL = new List(); // for (EsdInfo esd : esdList) { // if (!esd.accessoryFlg) { // esdL.add(esd); // } // } // init(); // done_flg = true; // } catch (Exception ex) { // system.debug('=====' + ex.getMessage()); // ApexPages.addmessage(new ApexPages.message(ApexPages.severity.Error, ex.getMessage()+'(回库)')); // Database.rollback(sp); // done_flg = false; // } // return null; // } public PageReference cdsSave() { Set rndIdSet = new Set(); Boolean haveError = false; done_flg = false; for (EsdInfo main : esdList) { if (main.checked) { rndIdSet.add(main.rec.Id); } //20210426 ljh add 1832 start if(String.isBlank(main.rec.ArrivalResult__c) || main.rec.ArrivalResult__c != 'NG'){ system.debug('111:Arrival_NG_Comment__c'+main.rec.Arrival_NG_Comment__c); main.rec.Arrival_NG_Comment__c = ''; } //20210426 ljh add 1832 start } Map tadMap = new Map(); for (TransferApplyDetail__c tad : getTad(rndIdSet)) { tadMap.put(tad.Id, tad); if (tad.Arrival_in_wh__c) { ApexPages.addmessage(new ApexPages.message(ApexPages.severity.Error, tad.SerialNumber_F__c + ':已经回库的明细不可以做到货确认&CDS操作')); haveError = true; } else if (tad.Lost_item_giveup__c) { ApexPages.addmessage(new ApexPages.message(ApexPages.severity.Error, tad.SerialNumber_F__c + ':已经欠品放弃的明细不可以做到货确认&CDS操作')); haveError = true; } } for (EsdInfo main : esdList) { if (main.checked) { if (main.rec.LastModifiedDate != tadMap.get(main.rec.Id).LastModifiedDate) { ApexPages.addmessage(new ApexPages.message(ApexPages.severity.Error, main.rec.SerialNumber_F__c + ':已经被修改,请刷新画面重试')); haveError = true; } if (String.isBlank(main.rec.ArrivalResult__c)) { ApexPages.addmessage(new ApexPages.message(ApexPages.severity.Error, main.rec.SerialNumber_F__c + ':您点击的按钮与当前操作不符')); haveError = true; } else if (main.rec.Arrival_in_wh__c) { ApexPages.addmessage(new ApexPages.message(ApexPages.severity.Error, main.rec.SerialNumber_F__c + ':您点击的按钮与当前操作不符')); haveError = true; } //20210426 ljh add 1832 start system.debug('Arrival_NG_Comment__c'+main.rec.Arrival_NG_Comment__c); if (main.rec.ArrivalResult__c != null && main.rec.ArrivalResult__c == 'NG' && String.isBlank(main.rec.Arrival_NG_Comment__c)) { ApexPages.addmessage(new ApexPages.message(ApexPages.severity.Error, main.rec.SerialNumber_F__c + ':调拨到货确认结果NG,到货NG结果备注必须填写!')); haveError = true; } //20210426 ljh add 1832 end } } if (haveError == false) { return saveRecord(); } else { return null; } } public PageReference arrival_in_whSave() { Set rndIdSet = new Set(); Set allrndIdSet = new Set(); Boolean haveError = false; done_flg = false; for (EsdInfo main : esdList) { if (main.checked) { rndIdSet.add(main.rec.Id); allrndIdSet.add(main.rec.TransferApplySummary__c); } } Map tadMap = new Map(); for (TransferApplyDetail__c tad : getTad(allrndIdSet)) { if (rndIdSet.contains(tad.Id)) { tadMap.put(tad.Id, tad); if (tad.ArrivalResult__c != 'OK') { ApexPages.addmessage(new ApexPages.message(ApexPages.severity.Error, tad.SerialNumber_F__c + ':到货确认不是OK不能回库')); haveError = true; } else if (tad.CDS_complete__c == false) { ApexPages.addmessage(new ApexPages.message(ApexPages.severity.Error, tad.SerialNumber_F__c + ':没有做CDS保存不能回库')); haveError = true; } else if (tad.Lost_item_giveup__c) { ApexPages.addmessage(new ApexPages.message(ApexPages.severity.Error, tad.SerialNumber_F__c + ':已经欠品放弃的明细不能回库')); haveError = true; } else if (tad.Arrival_in_wh__c) { ApexPages.addmessage(new ApexPages.message(ApexPages.severity.Error, tad.SerialNumber_F__c + ':已经回库的明细不能再回库')); haveError = true; } } else if (tad.ArrivalResult__c != '欠品' && tad.Cancel_Select__c == false && (tad.Main_OneToOne__c || tad.OneToOneAccessory__c) && !tad.Detail_Finish__c && tad.TransferApplySummary__r.First_TAD__r.Arrival_in_wh__c == false ) { ApexPages.addmessage(new ApexPages.message(ApexPages.severity.Error, tad.SerialNumber_F__c + ':回库时必须整套回库')); haveError = true; } } for (EsdInfo main : esdList) { if (main.checked) { if (main.rec.LastModifiedDate != tadMap.get(main.rec.Id).LastModifiedDate) { ApexPages.addmessage(new ApexPages.message(ApexPages.severity.Error, main.rec.SerialNumber_F__c + ':已经被修改,请刷新画面重试')); haveError = true; } if (main.rec.ArrivalResult__c != 'OK') { ApexPages.addmessage(new ApexPages.message(ApexPages.severity.Error, main.rec.SerialNumber_F__c + ':您点击的按钮与当前操作不符')); haveError = true; } else if (main.rec.CDS_complete__c == false) { ApexPages.addmessage(new ApexPages.message(ApexPages.severity.Error, main.rec.SerialNumber_F__c + ':您点击的按钮与当前操作不符')); haveError = true; } else if (main.rec.Arrival_in_wh__c == false) { ApexPages.addmessage(new ApexPages.message(ApexPages.severity.Error, main.rec.SerialNumber_F__c + ':您点击的按钮与当前操作不符')); haveError = true; } } } if (haveError == false) { return saveRecord(); } else { return null; } } private List getTad(Set rndIdSet) { return [select SerialNumber_F__c, OneToOneAccessory__c, Main_OneToOne__c, TransferApplySummary__c , Internal_Asset_number_key__c, Fixture_Model_No_F__c, TAESD_Status__c , TransferApply__c, Shippment_loaner_time__c , TransferApply__r.Shipment_Slip_tmp__c , TransferApply__r.Yi_loaner_arranged__c , TransferApply__r.Name , Fixture_Model_No__c , SerialNumber__c , Detail_Finish__c , Inspection_result_after_F__c , Loaner_asset_no__c , ArrivalResult__c , Arrival_wh_Abandoned_Flag_F__c , Internal_asset_location_After__c , Salesdepartment_After__c , Return_DeliverySlip__c , Asset_return_time__c , Arrival_wh_Flag_F__c , FSD_OneToOneAccessory_Cnt_F__c , Cancel_Select__c , TransferApply__r.ShelfUp_ng_num__c , Asset__r.Product2.Name , LastModifiedDate , OneToOneAsset__c , Approved_F__c, Fixture_Name_F__c, TransferApplySummary__r.Fixture_Set__r.Name , Fixture_QRCode_F__c, TransferApplySummary__r.Name, Pre_inspection_time__c, StockDown__c , TransferApplySummary__r.First_TAD__r.Loaner_accsessary__c , First_You_Xiao_Ku_Cun__c , TransferApplySummary__r.First_TAD__r.ArrivalResult__c , TransferApplySummary__r.First_TAD__r.Lost_item_giveup__c , TransferApplySummary__r.First_TAD__r.Arrival_in_wh__c , TransferApplySummary__r.First_TAD__r.Main_OneToOne__c , TransferApplySummary__r.First_TAD__r.OneToOneAccessory__c , StockDown_time__c, Id, Name, Asset__c, Asset__r.Name, Asset__r.SerialNumber, Asset__r.Product_Serial_No__c, Asset__r.Remark__c, Asset__r.ImageAsset__c, Asset__r.ImageSerial__c, Asset__r.ImageAssetUploadedTime__c, Asset__r.ImageSerialUploadedTime__c, Loaner_CDS_Info__c, Inspection_result__c, Check_lost_Item__c, Pre_disinfection__c, Water_leacage_check__c, Inspection_result_after__c, Arrival_in_wh__c, Asset__r.Pre_Reserve_TAES_Detail__c, Asset__r.Pre_Reserve_TAES_Detail__r.After_Inspection_time__c, Inspection_result_after_ng__c, Inspection_result_ng__c, Lost_item_giveup__c, CDS_complete__c, Loaner_accsessary__c,Arrival_NG_Comment__c //20210426 ljh 1832 add Arrival_NG_Comment__c from TransferApplyDetail__c where Id = :rndIdSet OR TransferApplySummary__c = :rndIdSet FOR UPDATE]; } // 保存按钮 public PageReference saveRecord() { done_flg = false; needforceSave = false; String userid = Userinfo.getUserId(); List eList = new List(); List otoCheckList_main = new List(); List otoAccessoryList = new List(); Set assetForLock = new Set(); Set ukeySet = new Set(); Boolean haveError = false; Boolean haveCheck = false; // 【FY24大及巨大课题】北京新法规项目对应 DB202307428742 20230804 by lc Start List assUpdList = new List(); //数量管理的保有设备,需要做去重处理 Map assIdMap = new Map(); // 【FY24大及巨大课题】北京新法规项目对应 DB202307428742 20230804 by lc End List otoList = new List(); Map> checkMap = new Map>(); Set ngSet = new Set(); Set lostSet = new Set(); for (EsdInfo main : esdList) { if ((main.rec.OneToOneAccessory__c || main.rec.Main_OneToOne__c) && (main.rec.TransferApplySummary__r.First_TAD__r.Arrival_in_wh__c == false && main.rec.TransferApplySummary__r.First_TAD__r.Loaner_accsessary__c == false && main.rec.TransferApplySummary__r.First_TAD__r.Lost_item_giveup__c == false) ) { if (main.rec.ArrivalResult__c == 'NG') { ngSet.add(main.rec.TransferApplySummary__c); } else if (main.rec.ArrivalResult__c == '欠品' && main.rec.Main_OneToOne__c) { lostSet.add(main.rec.TransferApplySummary__c); } } } Id tsid; EsdInfo info; for (EsdInfo esdInfo : esdList) { tsid = esdInfo.rec.TransferApplySummary__c; if (esdInfo.checked) { if (esdInfo.rec.Main_OneToOne__c) { info = esdInfo; } else if (esdInfo.rec.Main_OneToOne__c == false && esdInfo.rec.OneToOneAccessory__c == false) { info = null; } haveCheck = true; esdInfo.errorInfo = null; if (esdInfo.needsetone && String.isBlank(esdInfo.rec.OneToOneAsset__c) && esdInfo.rec.Arrival_in_wh__c) { ApexPages.addmessage(new ApexPages.message(ApexPages.severity.Error, esdInfo.rec.SerialNumber_F__c + ':上架需要设置一对一主体')); haveError = true; } if (esdInfo.rec.OneToOneAccessory__c && esdInfo.rec.TransferApplySummary__r.First_TAD__r.Arrival_in_wh__c && esdInfo.rec.First_You_Xiao_Ku_Cun__c == 0) { esdInfo.rec.SkipLink__c = true; continue; } else if (esdInfo.accessoryFlg) { otoAccessoryList.add(esdInfo); } else { if (!esdInfo.editable) continue; TransferApplyDetail__c esd = esdInfo.rec; eList.add(esd); // ApexPages.addmessage(new ApexPages.message(ApexPages.severity.Error, '1')); if (esd.Arrival_in_wh__c) { if (info == null && esd.ArrivalResult__c == 'NG') { ApexPages.addmessage(new ApexPages.message(ApexPages.severity.Error, '到货NG的附属品不能上架,请做回寄操作')); haveError = true; } if (ngSet.contains(esdInfo.rec.TransferApplySummary__c)) { ApexPages.addmessage(new ApexPages.message(ApexPages.severity.Error, esd.SerialNumber_F__c + ':有到货确认NG的一览不可以上架')); haveError = true; } if (esd.Main_OneToOne__c && (esd.ArrivalResult__c == 'OK' || (!esd.Arrival_wh_Abandoned_Flag_F__c && esd.Arrival_wh_Flag_F__c))) { otoCheckList_main.add(esdInfo); // ApexPages.addmessage(new ApexPages.message(ApexPages.severity.Error, '3')); } else if ((esd.ArrivalResult__c == 'OK' || (!esd.Arrival_wh_Abandoned_Flag_F__c && esd.Arrival_wh_Flag_F__c)) && esd.OneToOneAccessory__c) { otoAccessoryList.add(esdInfo); if (info == null && !forceSave && (esdInfo.rec.TransferApplySummary__r.First_TAD__r.Arrival_in_wh__c && esdInfo.rec.First_You_Xiao_Ku_Cun__c > 0) == false) { ApexPages.addmessage(new ApexPages.message(ApexPages.severity.Error, esd.SerialNumber_F__c + ':未选择主体一对一主体')); // needforceSave = true; haveError = true; } } String ukey = esd.Fixture_Model_No_F__c // 型号;存放地;本部 + ';' + esd.Internal_asset_location_After__c + ';' + esd.Salesdepartment_After__c; ukeySet.add(ukey); } } if (esdInfo.editable) { assetForLock.add(esdInfo.rec.Asset__c); // 【FY24大及巨大课题】北京新法规项目对应 DB202307428742 20230804 by lc Start if (assIdMap.isEmpty() || !assIdMap.containsKey(esdInfo.rec.Asset__c)) { String checkFlag = null; // 选择的温湿度区分 String thZone = esdInfo.rec.Asset__r.Temperature_And_Humidity_Zone__c; // 储存条件 5~40℃,10~95% String storageCon = esdInfo.rec.Asset__r.Storage_Conditions__c; if (String.isBlank(thZone)) { ApexPages.addmessage(new ApexPages.message(ApexPages.severity.Error, '请选择温湿度分区!')); haveError = true; } if (esdInfo.rec.Asset__r.Product2.ProductCode.StartsWith('BP')) { checkFlag = 'OK'; } else if (esdInfo.rec.Asset__r.Product2.SFDA_Approbation_No__c == 'FYL') { checkFlag = 'OK'; } else { if (String.isBlank(storageCon)) { checkFlag = 'OK'; } else { checkFlag = FixtureUtil.compareTemperatureAndHumidity(thZone, storageCon); } } Asset ast = new Asset(); ast.Id = esdInfo.rec.Asset__c; // 不满足则标记上储存条件不符合 ast.Storage_Conditions_Met_Status__c = checkFlag; ast.Temperature_And_Humidity_Zone__c = thZone; assUpdList.add(ast); assIdMap.put(esdInfo.rec.Asset__c, '1'); } // 【FY24大及巨大课题】北京新法规项目对应 DB202307428742 20230804 by lc End } if (String.isNotBlank(esdInfo.rec.OneToOneAsset__c) && esdInfo.needsetone && esdInfo.rec.Arrival_in_wh__c) { if (checkMap.containsKey(esdInfo.rec.OneToOneAsset__c) == false) { checkMap.put(esdInfo.rec.OneToOneAsset__c, new List()); } checkMap.get(esdInfo.rec.OneToOneAsset__c).add(esdInfo); otoList.add(esdInfo); } } else if (info != null && info.rec.Arrival_in_wh__c && info.rec.TransferApplySummary__c == esdInfo.rec.TransferApplySummary__c && esdInfo.rec.ArrivalResult__c != '欠品') { ApexPages.addmessage(new ApexPages.message(ApexPages.severity.Error, esdInfo.rec.SerialNumber_F__c + ':一对一非欠品的附属品必须统一上架')); haveError = true; } } if (haveCheck == false) { ApexPages.addmessage(new ApexPages.message(ApexPages.severity.Error, '请勾选需要操作的明细')); return null; } else if (haveError) { return null; } if (checkMap.isEmpty() == false) { // 20220211 ljh SFDC-CBH5GH update start /*for (Asset ass : [SELECT Id FROM ASSET WHERE Asset_Owner__c = 'Olympus' AND Asset_loaner_category__c != '耗材' AND RecordTypeId = '01210000000kOPR' AND Delete_Flag__c = False AND AssetManageConfirm__c = true // AND Account.Management_Code__c =:System.Label.Account_Asset AND Loaner_accsessary__c = false AND Freeze_sign_Abandoned_Flag__c = false AND Last_Reserve_RAES_Detail__c = null AND You_Xiao_Ku_Cun__c > 0 AND Id = :checkMap.keySet()]) { checkMap.remove(ass.Id); }*/ // 调拨至 的办事处 String locationAfter = esdList[0].rec.Internal_asset_location_After__c; Map checkAssetMap = new Map(); List checkAssetList = [SELECT Id,Internal_asset_location__c FROM ASSET WHERE Asset_Owner__c = 'Olympus' AND Asset_loaner_category__c != '耗材' AND RecordTypeId =:System.label.access_1 AND Delete_Flag__c = False AND AssetManageConfirm__c = true // AND Account.Management_Code__c =:System.Label.Account_Asset AND Loaner_accsessary__c = false AND Freeze_sign_Abandoned_Flag__c = false AND Last_Reserve_RAES_Detail__c = null AND You_Xiao_Ku_Cun__c > 0 AND Internal_asset_location__c = :locationAfter AND Id = :checkMap.keySet()]; for (Asset ass : checkAssetList) { checkMap.remove(ass.Id); } if (checkMap.isEmpty() == false) { checkAssetMap.putAll([SELECT Id,Internal_asset_location__c,SerialNumber,Fixture_Model_No_F__c FROM ASSET WHERE Id = :checkMap.keySet()]); for (Id assId : checkMap.keySet()) { for (EsdInfo esdInfo : checkMap.get(assId)) { // esdInfo.errorInfo = '保有设备:'+esdInfo.rec.SerialNumber_F__c + '请选择合适的主体'; // ApexPages.addmessage(new ApexPages.message(ApexPages.severity.Error, '保有设备:'+esdInfo.rec.SerialNumber_F__c + '请选择合适的主体')); // haveError = true; Asset checkAsset = checkAssetMap.get(assId); if(checkAsset != null && checkAsset.Internal_asset_location__c != locationAfter){ // esdInfo.errorInfo = '保有设备:'+esdInfo.rec.SerialNumber_F__c + '和主体备品存放地不一致,请选择合适的主体'; // ApexPages.addmessage(new ApexPages.message(ApexPages.severity.Error, '保有设备:'+esdInfo.rec.SerialNumber_F__c + '和主体备品存放地不一致,请选择合适的主体')); esdInfo.errorInfo = '附属品 '+esdInfo.rec.Fixture_Model_No__c+'('+esdInfo.rec.SerialNumber_F__c + ')与主体 '+checkAsset.Fixture_Model_No_F__c+'('+checkAsset.SerialNumber+')备品存放地不一致,不能入库'; ApexPages.addmessage(new ApexPages.message(ApexPages.severity.Error, '附属品 '+esdInfo.rec.Fixture_Model_No__c+'('+esdInfo.rec.SerialNumber_F__c + ')与主体 '+checkAsset.Fixture_Model_No_F__c+'('+checkAsset.SerialNumber+')备品存放地不一致,不能入库')); haveError = true; }else{ esdInfo.errorInfo = '保有设备:'+esdInfo.rec.SerialNumber_F__c + '请选择合适的主体'; ApexPages.addmessage(new ApexPages.message(ApexPages.severity.Error, '保有设备:'+esdInfo.rec.SerialNumber_F__c + '请选择合适的主体')); haveError = true; } // 20220211 ljh SFDC-CBH5GH update end } } } // 20220211 ljh SFDC-CBH5GH update end } if (haveError) { return null; } Map>> assProductCountMapAll = new Map>>(); // 一览Id->产品Id->保有设备Id列表 for (EsdInfo ei : otoAccessoryList) { Map> assProductCountMap; if (assProductCountMapAll.containsKey(ei.accessorySetId)) { assProductCountMap = assProductCountMapAll.get(ei.accessorySetId); } else { assProductCountMap = new Map>(); } Id recId; Id product2Id; if (ei.rec2 != null) { recId = ei.rec2.Id; product2Id = ei.rec2.Product2Id; } else { recId = ei.rec.Asset__c; product2Id = ei.rec.Asset__r.Product2Id; } List count; if (assProductCountMap.containsKey(product2Id)) { count = assProductCountMap.get(product2Id); } else { count = new List(); } count.add(recId); assProductCountMap.put(product2Id, count); assProductCountMapAll.put(ei.accessorySetId, assProductCountMap); } Boolean needSaveSet = false; Boolean needSaveDetail = false; Boolean needSaveAsset = false; List otolinkList = new List(); boolean err = false; Map otoMap = new Map(); List soqlList = new List(); if (otoCheckList_main.size() > 0) { for (EsdInfo main : otoCheckList_main) { if (main.rec.Cancel_Select__c == false) { String soql = '(TransferApplySummary__c = \'' + main.rec.TransferApplySummary__c + '\' and Cancel_Select__c = false )'; soqlList.add(soql); } else { String soql = '(TransferApplySummary__c = \'' + main.rec.TransferApplySummary__c + '\')'; soqlList.add(soql); } } String soql = 'select Asset__r.Product2.Name, Asset__c, Asset__r.Product2Id , OneToOneAccessory__c, TransferApplySummary__c,OneToOneAsset__c ' + ' from TransferApplyDetail__c ' + ' WHERE OneToOneAccessory__c = true and Asset__c <> null ' + ' AND (' + String.join(soqlList, ' OR ') + ') order by TransferApplySummary__c, OneToOneAccessory__c desc'; Map> tadMap = new Map>(); System.debug(soql); for (TransferApplyDetail__c tad : Database.query(soql)) { if (tadMap.containsKey(tad.TransferApplySummary__c) == false) { tadMap.put(tad.TransferApplySummary__c, new List()); } tadMap.get(tad.TransferApplySummary__c).add(tad); } for (EsdInfo main : otoCheckList_main) { List tadList = new List(); if (tadMap.containsKey(main.rec.TransferApplySummary__c)) { tadList = tadMap.get(main.rec.TransferApplySummary__c); } //没有cancel的看最新一套明细的fsd数量 //已经cancel的看最早一套明细的一对一分配数量 //理论上出库前上架的数据不会有非cancel的情况,所以直接用Cancel_Select__c判断 // system.debug(main.rec); // if (main.rec.Cancel_Select__c == false) { // tadList = [select Asset__r.Product2.Name, Asset__c, Asset__r.Product2Id , OneToOneAccessory__c // from TransferApplyDetail__c // where TransferApplySummary__c = :main.rec.TransferApplySummary__c // and OneToOneAccessory__c = true // and Cancel_Select__c = false //找最新的一套明细 // //and Canceled_Id__c = null //找最初的一套明细 // and Asset__c <> null //过滤未分配的数据。 // order by OneToOneAccessory__c desc]; // } else { // tadList = [select Asset__r.Product2.Name, Asset__c, Asset__r.Product2Id , OneToOneAccessory__c // from TransferApplyDetail__c // where TransferApplySummary__c = :main.rec.TransferApplySummary__c // and OneToOneAccessory__c = true // //and Canceled_Id__c = null // and Asset__c <> null // order by OneToOneAccessory__c desc]; // } system.debug(tadList); Map> assProductCountMap = new Map>(); if (assProductCountMapAll.containsKey(main.rec.TransferApplySummary__c)) { assProductCountMap = assProductCountMapAll.get(main.rec.TransferApplySummary__c); } for (TransferApplyDetail__c tad : tadList) { if (assProductCountMap.containsKey(tad.Asset__r.Product2Id) && assProductCountMap.get(tad.Asset__r.Product2Id).size() > 0) { List count = assProductCountMap.get(tad.Asset__r.Product2Id); String assetId = (String)count[0]; count.remove(0); assProductCountMap.put(tad.Asset__r.Product2Id, count); assProductCountMapAll.put(main.rec.TransferApplySummary__c, assProductCountMap); String key = (String)main.rec.Asset__c + ':' + assetId; Integer otoCnt; if (otoMap.containsKey(key)) { otoCnt = otoMap.get(key); } else { otoCnt = 0; } otoMap.put(key, otoCnt + 1); } else { // if (!forceSave && (main.rec.Cancel_Select__c == false || (main.rec.Cancel_Select__c == true && tad.OneToOneAccessory__c))) { // main.errorInfo = '未补全附属品(部分上架请勾选复选框):'+tad.Asset__r.Product2.Name; // ApexPages.addmessage(new ApexPages.message(ApexPages.severity.Error, main.rec.SerialNumber_F__c + '未补全附属品:'+tad.Asset__r.Product2.Name)); // err = true; // needforceSave = true; // break; // } else { // continue; // } } } } } Set tdIdSet = new Set(); forceSave = false; if (err) return null; // TODO 没变化不存 // if (Step_status == '上架') { for (TransferApplyDetail__c esd : eList) { if (esd.Arrival_in_wh__c) { esd.Arrival_wh_time__c = System.now(); esd.Return_wh_chenk_staff__c = userid; } else { esd.Arrival_wh_time__c = null; esd.Return_wh_chenk_staff__c = null; } tdIdSet.add(esd.Id); } needSaveDetail = true; // } for (EsdInfo esdInfo : esdList) { if (esdInfo.accessoryFlg) continue; TransferApplyDetail__c esd = esdInfo.rec; if (esd.Arrival_in_wh__c && esd.FSD_OneToOneAccessory_Cnt_F__c > 0 && esd.Main_OneToOne__c && esd.Arrival_wh_Abandoned_Flag_F__c) { otoCheckList_main.add(esdInfo); } } String sqlStr = 'SELECT Id FROM Asset WHERE Id IN:assetForLock '; String sqlWhere = ''; if(! ukeySet.isEmpty()) { for(String ukey: ukeySet) { // 型号;存放地;本部 List fields = ukey.split(';'); // 型号 if (String.isNotBlank(fields[0]) && fields[0] != 'null') { sqlWhere += ' (Fixture_Model_No_F__c =\'' + String.escapeSingleQuotes(fields[0]) + '\''; } else { sqlWhere += ' (Fixture_Model_No_F__c = null'; } // 备品存放地 if (String.isNotBlank(fields[1]) && fields[1] != 'null') { sqlWhere += ' AND Internal_asset_location__c =\'' + String.escapeSingleQuotes(fields[1]) + '\''; } else { sqlWhere += ' AND Internal_asset_location__c = null'; } // 本部 if (String.isNotBlank(fields[2]) && fields[2] != 'null') { sqlWhere += ' AND Salesdepartment__c =\'' + String.escapeSingleQuotes(fields[2]) + '\')'; } else { sqlWhere += ' AND Salesdepartment__c = null)'; } sqlWhere += ' OR'; } sqlWhere = sqlWhere.removeEnd('OR'); sqlWhere = '((' + sqlWhere + ')'; sqlWhere += ' AND Delete_Flag__c = false ' + ' AND Asset_Owner__c = \'Olympus\'' + ' AND AssetManageConfirm__c = true' + ' AND Quantity > 0' + ' AND Freeze_sign_Abandoned_Flag__c = False' + ' AND Manage_type__c = \'数量管理\')'; sqlStr += ' OR ' + sqlWhere ; } sqlStr += ' FOR UPDATE'; List astLock = Database.query(sqlStr); Savepoint sp = Database.setSavepoint(); try { // 【系统调查】调拨单报错 DB202308145516 20230807 lc Start TransferApplyDetailHandler.skipUpdateAgain = true; // 【系统调查】调拨单报错 DB202308145516 20230807 lc End // 强制删废弃主体的一对一link if (otoCheckList_main.size() > 0) { List mainIds = new List(); for (EsdInfo oto : otoCheckList_main) { if (String.isNotBlank(oto.rec.Asset__c)) { // Asset__c 念のための確認 mainIds.add(oto.rec.Asset__c); } } FixtureUtil.delOtOLinkData(mainIds); } // 【FY24大及巨大课题】北京新法规项目对应 DB202307428742 20230804 by lc Start if (!assUpdList.isEmpty() && assUpdList.size() > 0) { Oly_TriggerHandler.bypass('AssetHandler'); Oly_TriggerHandler.bypass('AssetHandlerCheck'); FixtureUtil.withoutUpdate(assUpdList); Oly_TriggerHandler.clearBypass('AssetHandler'); Oly_TriggerHandler.clearBypass('AssetHandlerCheck'); } // 【FY24大及巨大课题】北京新法规项目对应 DB202307428742 20230804 by lc End // 这里只更新明细,保有设备和link都放到trigger里更新 if (eList.size() > 0) { FixtureUtil.withoutUpsertObjects(eList); } if (otoList.size() > 0) { soqlList = new List(); Map otoMap1 = new Map(); // 主Id附Id->link Map otoMap2 = new Map(); // 主Id、主型号、附型号->数量 Map tdMap = new Map([ SELECT Id , OneToOneAsset__c , OneToOneAsset__r.Fixture_Model_No_F__c , OneToOneAsset__r.SerialNumber , Asset__c , Asset_After__c , Asset_After__r.Fixture_Model_No_F__c , Asset_After__r.SerialNumber , Asset__r.Fixture_Model_No_F__c , Asset__r.SerialNumber FROM TransferApplyDetail__c WHERE Id = :tdIdSet]); Map standardLinkCount = getLinkCountFromStandard(tdMap); Map assetIdToModel = getAssetIdToModel(tdMap); Map assetIdToSerial = getAssetIdToSerial(tdMap); System.debug(assetIdToModel); for (EsdInfo esdInfo : otoList) { Id afterId = esdInfo.rec.Asset__c; if(tdMap.containsKey(esdInfo.rec.Id) && tdMap.get(esdInfo.rec.Id).Asset_After__c != null) { afterId = tdMap.get(esdInfo.rec.Id).Asset_After__c; } // soqlList.add('(Main_Asset__c = \'' + esdInfo.rec.OneToOneAsset__c + '\' AND Accessory_Asset__c = \''+ afterId + '\')'); // 主体下已有的全部link要参与检查 soqlList.add('(Main_Asset__c = \'' + esdInfo.rec.OneToOneAsset__c + '\')'); } String linkSql = 'SELECT Quantity__c, Main_Asset__c, Main_Asset__r.Fixture_Model_No_F__c, Main_Asset__r.SerialNumber, Accessory_Asset__c, Accessory_Asset__r.Fixture_Model_No_F__c FROM Fixture_OneToOne_Link__c WHERE ' + String.join(soqlList, ' OR '); for (Fixture_OneToOne_Link__c oto : Database.query(linkSql)) { otoMap1.put(String.valueOf(oto.Main_Asset__c) + String.valueOf(oto.Accessory_Asset__c), oto); // 机身号不同的同型号主体,link要分开计数 String serialLinkName = String.join(new List { oto.Main_Asset__r.Fixture_Model_No_F__c, oto.Main_Asset__r.SerialNumber, oto.Accessory_Asset__r.Fixture_Model_No_F__c }, DELIMITER); Integer cnt = 0; if(otoMap2.containsKey(serialLinkName)) { cnt = otoMap2.get(serialLinkName); } otoMap2.put(serialLinkName, cnt + Integer.valueOf(oto.Quantity__c)); } System.debug(otoMap2); Map otoUpsertMap = new Map(); for (EsdInfo esdInfo : otoList) { Id afterId = esdInfo.rec.Asset__c; if(tdMap.containsKey(esdInfo.rec.Id) && tdMap.get(esdInfo.rec.Id).Asset_After__c != null) { afterId = tdMap.get(esdInfo.rec.Id).Asset_After__c; } // 主Id附Id作为key,新建link或修改link数量 String key = String.valueOf(esdInfo.rec.OneToOneAsset__c) + afterId; if (otoUpsertMap.containsKey(key) == false) { Fixture_OneToOne_Link__c oto = new Fixture_OneToOne_Link__c(); if (otoMap1.containsKey(key)) { oto = otoMap1.get(key); } else { oto.Main_Asset__c = esdInfo.rec.OneToOneAsset__c; oto.Accessory_Asset__c = tdMap.get(esdInfo.rec.Id).Asset_After__c; oto.Quantity__c = 0; } otoUpsertMap.put(key, oto); } otoUpsertMap.get(key).Quantity__c += 1; System.debug(otoUpsertMap); // 主型号、附型号作为key,和标准配套做比较 String linkName = String.join(new List { assetIdToModel.get(esdInfo.rec.OneToOneAsset__c), assetIdToModel.get(afterId) }, DELIMITER); // 主型号,主机身号,附型号作为key,用于和标准配套明细数量比较 // 不同主体下的link要分别计数,新入的附属品link要和既存的link按型号合并后计数 String serialLinkName = String.join(new List { assetIdToModel.get(esdInfo.rec.OneToOneAsset__c), assetIdToSerial.get(esdInfo.rec.OneToOneAsset__c), assetIdToModel.get(afterId) }, DELIMITER); // 主型号,主机身号,附型号,附机身号,用于画面提醒 String serialLinkNameFull = String.join(new List { assetIdToModel.get(esdInfo.rec.OneToOneAsset__c), assetIdToSerial.get(esdInfo.rec.OneToOneAsset__c), assetIdToModel.get(afterId), esdInfo.rec.SerialNumber_F__c }, DELIMITER); System.debug(linkName); System.debug(serialLinkName); System.debug(serialLinkNameFull); Integer cnt = 0; if(otoMap2.containsKey(serialLinkName)) { cnt = otoMap2.get(serialLinkName); } otoMap2.put(serialLinkName, cnt + 1); System.debug(otoMap2); System.debug(standardLinkCount); if(!standardLinkCount.containsKey(linkName)) { throw new ControllerUtil.myException(String.format('附属品 {2}({3}):不属于主体 {0}({1})配套中附属品,不能入库', serialLinkNameFull.split(DELIMITER))); } else if(standardLinkCount.get(linkName) < otoMap2.get(serialLinkName)) { throw new ControllerUtil.myException(String.format('附属品 {2}({3}):超过主体 {0}({1})配套中该型号附属品数量,多余数量不能入库', serialLinkNameFull.split(DELIMITER))); } } if (otoUpsertMap.isEmpty() == false) { FixtureUtil.withoutUpsertObjects(otoUpsertMap.values()); } } List esdL = new List(); for (EsdInfo esd : esdList) { if (!esd.accessoryFlg) { esdL.add(esd); } } init(); done_flg = true; } catch (Exception ex) { system.debug('=====' + ex.getMessage()); ApexPages.addmessage(new ApexPages.message(ApexPages.severity.Error, ex.getMessage())); Database.rollback(sp); done_flg = false; } return null; } /** * @return 设备id->型号 * * */ private Map getAssetIdToModel(Map tdMap) { Map assetIdToModel = new Map (); for(TransferApplyDetail__c tad:tdMap.values()) { assetIdToModel.put(tad.OneToOneAsset__c, tad.OneToOneAsset__r.Fixture_Model_No_F__c); assetIdToModel.put(tad.Asset_After__c, tad.Asset_After__r.Fixture_Model_No_F__c); assetIdToModel.put(tad.Asset__c, tad.Asset__r.Fixture_Model_No_F__c); } return assetIdToModel; } /** * @return 设备id->机身号 * * */ private Map getAssetIdToSerial(Map tdMap) { Map assetIdToSerial = new Map (); for(TransferApplyDetail__c tad:tdMap.values()) { assetIdToSerial.put(tad.OneToOneAsset__c, tad.OneToOneAsset__r.SerialNumber); assetIdToSerial.put(tad.Asset_After__c, tad.Asset_After__r.SerialNumber); assetIdToSerial.put(tad.Asset__c, tad.Asset__r.SerialNumber); } return assetIdToSerial; } /** * @description 按所选主体的型号找到配套明细及数量 * @return 主型号;附型号->数量 */ private Map getLinkCountFromStandard(Map tdMap) { Map mainModels = new Map(); Map linkCounts = new Map(); for(TransferApplyDetail__c tad:tdMap.values()) { mainModels.put(tad.OneToOneAsset__r.Fixture_Model_No_F__c, 0); } List fsdList = [SELECT Id , Quantity__c , Fixture_Model_No_F__c , Fixture_Set__r.Fixture_Set_Body_Model_No__c , Is_Body__c , Is_OneToOne__c FROM Fixture_Set_Detail__c WHERE Fixture_Set__r.Fixture_Set_Body_Model_No__c IN:mainModels.keySet() ORDER BY Fixture_Set__c, SortInt_F__c ]; for(Fixture_Set_Detail__c fsd:fsdList){ // 主体型号不可有多个配套 if(mainModels.get(fsd.Fixture_Model_No_F__c) == 1) { throw new ControllerUtil.myException(fsd.Fixture_Model_No_F__c + '主体对应多个配套,无法继续'); } if(fsd.Is_Body__c) { mainModels.put(fsd.Fixture_Model_No_F__c, 1); } else if (fsd.Is_OneToOne__c) { Integer c = 0; String linkName = fsd.Fixture_Set__r.Fixture_Set_Body_Model_No__c + DELIMITER + fsd.Fixture_Model_No_F__c; if (linkCounts.containsKey(linkName)) { c = linkCounts.get(linkName); } linkCounts.put(linkName, c + Integer.valueOf(fsd.Quantity__c)); } } return linkCounts; } public PageReference searchSlip() { done_flg = false; Map esdIdMap = new Map(); // for (EsdInfo esd : esdList) { // if (!esd.hasSended) // esdIdMap.put(esd.rec.Id, esd.isChecked); // } String qryString = 'select Id, Name, DeliveryCompany_SlipNo__c,DeliveryType__c,Distributor_method__c,DeliveryCompany__c,Wh_Staff__c ' + 'from FixtureDeliverySlip__c ' + 'where Name =\''+ slip.Name +'\' and DeliveryType__c = \'回寄\''; if (String.isNotBlank(slip.Distributor_method__c)) { qryString += ' and Distributor_method__c = \''+ slip.Distributor_method__c +'\''; } if (String.isNotBlank(slip.DeliveryCompany__c)) { qryString += ' and DeliveryCompany__c = \''+ slip.DeliveryCompany__c +'\''; } List slipList = Database.query(qryString); if (slipList.size() > 0) { if (slipList.size() > 1) { ApexPages.addmessage(new ApexPages.message(ApexPages.severity.Error, '当前条件检索到复数条运输单,请追加检索条件!')); return null; } slip = slipList[0]; } else { ApexPages.addmessage(new ApexPages.message(ApexPages.severity.WARNING, '没有检索出符合条件的运输单')); } return null; } public class EsdInfo { public TransferApplyDetail__c rec { get; set; } public Boolean canReturn { get; set; }//true 有能回寄的数据 // 回库はSet単位で、明細一つ一つのquickCheck要らない public Boolean checked {get;set;} public boolean editable { get; set; } public String fsName {get;set;} public String tasId {get;set;} // public String errorInfo { get; set; } public Asset rec2 { get; set; } public String errorInfo { get; set; } public boolean accessoryFlg { get; set; } public String accessorySetId { get; set; } public Boolean discardFlg { get; set; } public Boolean needsetone { get; set; } public Boolean needColor { get; set; } // public boolean editable { get; set; } // public String fsName {get;set;} // public EsdInfo() { // this.discardFlg = false; // this.editable = false; // } public EsdInfo(TransferApplyDetail__c rec) { this.needColor = false; this.rec = rec; this.needsetone = rec.Arrival_in_wh__c == false && ( //20210507 ljh update 1834 start //(rec.Main_OneToOne__c == false && rec.OneToOneAccessory__c == false) (rec.Main_OneToOne__c == false && rec.OneToOneAccessory__c == false && rec.Loaner_accsessary__c) //20210507 ljh update 1834 end || (rec.OneToOneAccessory__c && rec.TransferApplySummary__r.First_TAD__r.Arrival_in_wh__c && rec.First_You_Xiao_Ku_Cun__c == 0) ) ; this.accessoryFlg = false; this.discardFlg = false; this.checked = false; this.editable = rec.Shippment_loaner_time__c != null && rec.Detail_Finish__c == false && rec.Asset_return_time__c == null; this.fsName = rec.TransferApplySummary__r.Name + ':' + rec.TransferApplySummary__r.Fixture_Set__r.Name; this.accessorySetId = rec.TransferApplySummary__c; /*this.canReturn = rec.TransferApplySummary__r.First_TAD__r.Loaner_accsessary__c == true || (rec.TransferApplySummary__r.First_TAD__r.ArrivalResult__c != '欠品' && rec.TransferApplySummary__r.First_TAD__r.ArrivalResult__c != 'NG' );*/ this.canReturn = false;//20210118 ljh update } // public EsdInfo(TransferApplyDetail__c rec) { // this.rec = rec; // this.checked = false; // this.fsName = rec.TransferApplySummary__r.Name+':'+rec.TransferApplySummary__r.Fixture_Set__r.Name; // this.tasId = rec.TransferApplySummary__r.Id; // } } public class LabelValue { public String label {get; set;} public String value {get; set;} public LabelValue() { label = ''; value = ''; } public LabelValue(String l, String v) { label = l; value = v; } } }