public with sharing class TransferAgencyShipmentController { 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 TransferAgencyShipmentController() { taId = ApexPages.currentPage().getParameters().get('id'); outputFieldList = setFieldSet('TransferApplyDetail__c', 'TransferAgencyShipment'); } public PageReference init() { esdList = new List(); done_flg = false; String jsonStr; if (taId != null) { readOnly = false; List eList = getDetails(); if (eList.size() > 0) { for (TransferApplyDetail__c tad : eList) { 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) { readOnly = true; } EsdInfo ei = new EsdInfo(tad); esdList.add(ei); } } 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())); slip = new FixtureDeliverySlip__c(); } } else { 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 searchSlip() { done_flg = false; Map esdIdMap = new Map(); 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 void saveSlip() { done_flg = false; if(readOnly) return; Savepoint sp = Database.setSavepoint(); try { String jsonstr = JSON.serialize(slip); TransferApply__c ta = [SELECT Shipment_Slip_tmp__c, Yi_loaner_arranged__c FROM TransferApply__c WHERE Id=:taId]; if(ta.Yi_loaner_arranged__c > 0) { ApexPages.addmessage(new ApexPages.message(ApexPages.severity.Error, '调拨明细已发货,无法保存物流信息!')); return ; } ta.Shipment_Slip_tmp__c = jsonstr; update ta; done_flg = true; } catch (Exception ex) { ApexPages.addmessage(new ApexPages.message(ApexPages.severity.Error, ex.getMessage())); Database.rollback(sp); done_flg = false; } } 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 , DeliverySlip__c , LastModifiedDate , LastModifiedBy.Name , Fixture_Model_No__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 from TransferApplyDetail__c where TransferApply__c = :taId AND Cancel_Select__c = False order by TransferApplySummary__r.Name, Name ]; return eList; } private Map getDetailMap() { List tadList = getDetails(); Map tadMap = new Map(); for(TransferApplyDetail__c tad:tadList) { tadMap.put(tad.Id, tad); } return tadMap; } private Boolean isRaStatusOK() { //检查是否可以继续 List RaTarList = [ SELECT Campaign__c , Repair__c , Campaign__r.Status,repair__r.Return_Without_Repair_Date__c , Repair__r.Repair_Final_Inspection_Date__c , Repair__r.Repair_Shipped_Date__c FROM Rental_Apply__c WHERE id =:taId ]; for (Rental_Apply__c RaTar : RaTarList) { if( RaTar.Campaign__r.Status == '取消'){ ApexPages.addmessage(new ApexPages.message(ApexPages.severity.Error, '学会已取消,不能继续操作了')); return false; } else if(RaTar.Repair__r.Repair_Final_Inspection_Date__c != null){ ApexPages.addmessage(new ApexPages.message(ApexPages.severity.Error, '存在修理最终检测日,不能继续了')); return false; } else if(RaTar.repair__r.Return_Without_Repair_Date__c != null && RaTar.repair__c!=null ){ ApexPages.addmessage(new ApexPages.message(ApexPages.severity.Error, '未修理归还日不为空,不能出库')); return false; } else if(RaTar.Repair__r.Repair_Shipped_Date__c != null){ ApexPages.addmessage(new ApexPages.message(ApexPages.severity.Error, '存在RC修理返送日,不能继续了')); return false; } } return true; } // 下架按钮 public PageReference stockDown() { done_flg = false; //检查是否可以继续 if(!isRaStatusOK()) { return null; } Set oneToOneTas = new Set(); String userid = Userinfo.getUserId(); Datetime now = System.Now(); Map tadMap = getDetailMap(); List updateList = new List(); Boolean hasChecked = false; for (EsdInfo esdInfo : esdList) { if (!esdInfo.editable){ continue; } TransferApplyDetail__c esd = esdInfo.rec; if(!tadMap.containsKey(esd.Id)) { ApexPages.addmessage(new ApexPages.message(ApexPages.severity.Error, '明细数量有变化,请刷新画面重试!')); return null; } TransferApplyDetail__c tad = tadMap.get(esd.Id); if(esdInfo.checked || oneToOneTas.contains(esd.TransferApplySummary__c)) { hasChecked = true; if(esd.LastModifiedDate != tad.LastModifiedDate) { ApexPages.addmessage(new ApexPages.message(ApexPages.severity.Error, esd.Fixture_Model_No__c + ':后台数据被 ' + tad.LastModifiedBy.Name + ' 修改,请刷新画面!')); return null; } if(esd.StockDown__c && !tad.Approved_F__c) { ApexPages.addmessage(new ApexPages.message(ApexPages.severity.Error, esd.Fixture_Model_No__c + ':明细未批准,不能下架!')); return null; } // 下架 if(esd.StockDown__c && !tad.StockDown__c && tad.StockDown_time__c == null) { tad.StockDown__c = true; tad.StockDown_time__c = now; tad.StockDown_staff__c = userId; tad.Shipment_request_time2__c = now; updateList.add(tad); } // 恢复到未下架 else if (!esd.StockDown__c && tad.StockDown__c) { tad.StockDown__c = false; tad.StockDown_time__c = null; tad.StockDown_staff__c = null; tad.Shipment_request_time2__c = null; updateList.add(tad); } if(esd.Main_OneToOne__c) { oneToOneTas.add(esd.TransferApplySummary__c); } } } if(!hasChecked) { ApexPages.addmessage(new ApexPages.message(ApexPages.severity.Error, '未勾选下架的一览!')); return null; } Savepoint sp = Database.setSavepoint(); try { if(!updateList.isEmpty()) { FixtureUtil.withoutUpdate(new List {new TransferApply__c(Id=taId, Status__c='已出库指示')}); FixtureUtil.withoutUpdate(updateList); done_flg = true; } if(done_flg) { 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 shipment() { done_flg = false; //检查是否可以继续 if(!isRaStatusOK()) { return null; } //检查是否可以继续 String userid = Userinfo.getUserId(); Set eSet = new Set(); Set oneToOneTas = new Set(); List eList = new List(); //申请书set for (EsdInfo esdInfo : esdList) { TransferApplyDetail__c esd = esdInfo.rec; if (esdInfo.checked || oneToOneTas.contains(esd.TransferApplySummary__c)) { eSet.add(esd.Id); if(esd.Main_OneToOne__c) { oneToOneTas.add(esd.TransferApplySummary__c); } } else{ ApexPages.addmessage(new ApexPages.message(ApexPages.severity.Error, '发货时必须全部勾选!')); return null; } } if(String.isBlank(slip.Name) || String.isBlank(slip.DeliveryCompany__c) || String.isBlank(slip.Distributor_method__c) || String.isBlank(slip.Wh_Staff__c)) { ApexPages.addmessage(new ApexPages.message(ApexPages.severity.Error, '发货物流信息必填!')); return null; } eList = [ SELECT TransferApply__c, TransferApply__r.Shippment_ng_num__c, TransferApply__r.Pre_inspection_ng_num__c, TransferApplySummary__r.Inspection_not_finish__c, Fixture_Name_F__c, TransferApplySummary__r.Fixture_Set__r.Name, TransferApplySummary__r.TransferApply__r.Name, 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, TransferApply__r.Name, 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 FROM TransferApplyDetail__c WHERE TransferApply__c =: taId AND Cancel_Select__c = false AND Shippment_loaner_time_F__c = null FOR UPDATE ]; if (eList.size() == 0) { ApexPages.addmessage(new ApexPages.message(ApexPages.severity.Error, '没有可发货的调拨明细,请刷新画面重试!')); return null; } Set astForLock = new Set(); for (TransferApplyDetail__c esd : eList) { if(!eSet.contains(esd.Id)) { ApexPages.addmessage(new ApexPages.message(ApexPages.severity.Error, '有新追加的明细未在画面上显示,请刷新画面重试!')); return null; } if (esd.StockDown__c == false) { ApexPages.addmessage(new ApexPages.message(ApexPages.severity.Error, '未下架明细不能发货!')); return null; } astForLock.add(esd.Asset__c); } List astLock = [ SELECT Id FROM Asset WHERE id in :astForLock FOR UPDATE ]; if (slip.Id != null) { List slipList = [ SELECT Combine_Pack__c, Name, Id, DeliveryCompany_SlipNo__c,DeliveryType__c,Distributor_method__c,DeliveryCompany__c,Wh_Staff__c FROM FixtureDeliverySlip__c WHERE Id =:slip.Id FOR UPDATE ]; if(!slipList.isEmpty()) { slip = slipList[0]; } else { slip.Id = null; } } slip.Shippment_loaner_time__c = Datetime.now(); List raList = [ SELECT Id , DeliverySlip__c FROM TransferApply__c WHERE Id =:taId AND Status__c != '取消' ]; if(raList.isEmpty()) { ApexPages.addmessage(new ApexPages.message(ApexPages.severity.Error, '调拨申请不存在或已取消!')); return null; } Savepoint sp = Database.setSavepoint(); try { Datetime now = System.now(); FixtureUtil.withoutUpsertObjects(new List{ slip }); for (TransferApplyDetail__c esd : eList) { esd.DeliverySlip__c = slip.Id; // 20210706 ljh 1719 // esd.Pre_inspection_time__c = now; // esd.Inspection_staff__c = userId; // esd.Inspection_result__c = 'OK'; // 20210706 ljh 1719 } for (TransferApply__c ra : raList) { String jsonstr = JSON.serialize(slip); ra.DeliverySlip__c = slip.Id; ra.Shipment_Slip_tmp__c = jsonstr; } FixtureUtil.withoutUpsertObjects(eList); FixtureUtil.withoutUpsertObjects(raList); //esdList.clear(); //eList = getDetails(); //for (TransferApplyDetail__c esd : eList) { // EsdInfo ei = new EsdInfo(esd); // esdList.add(ei); //} //readOnly = true; init(); done_flg = true; } 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; } return null; } // 取消明细按钮 public void cancelDetail() { done_flg = false; Map updateTasMap = new Map(); Map updateTadMap = new Map(); Boolean hasChecked = false; Savepoint sp = Database.setSavepoint(); try { Map tadMap = getDetailMap(); for (EsdInfo esdInfo : esdList) { if (!esdInfo.editable){ continue; } TransferApplyDetail__c esd = esdInfo.rec; if(esdInfo.checked) { hasChecked = true; if(!tadMap.containsKey(esd.Id)) { ApexPages.addmessage(new ApexPages.message(ApexPages.severity.Error, esd.Fixture_Model_No__c + ':明细不存在或已取消,请刷新画面重试!')); return; } TransferApplyDetail__c tad = tadMap.get(esd.Id); if(esd.LastModifiedDate != tad.LastModifiedDate) { ApexPages.addmessage(new ApexPages.message(ApexPages.severity.Error, esd.Fixture_Model_No__c + ':后台数据被 ' + tad.LastModifiedBy.Name + ' 修改,请刷新画面!')); return; } if(tad.DeliverySlip__c != null) { ApexPages.addmessage(new ApexPages.message(ApexPages.severity.Error, esd.Fixture_Model_No__c + ':明细已发货,不可取消!')); return; } // 有主体的配套要按配套取消 if(esd.Main_OneToOne__c) { updateTasMap.put(esd.TransferApplySummary__c, new TransferApplySummary__c(Id=esd.TransferApplySummary__c, Cancel_Select__c = true, Cancel_Reason__c = '主动取消')); } // 非一对一附属品按明细取消 else if(!esd.OneToOneAccessory__c) { tad.Cancel_Select__c = true; tad.Cancel_Reason__c = '主动取消'; } updateTadMap.put(esd.Id, tad); } } if(!hasChecked) { ApexPages.addmessage(new ApexPages.message(ApexPages.severity.Error, '未勾选取消的一览!')); return; } if(!updateTadMap.isEmpty()) { update updateTadMap.values(); } if(!updateTasMap.isEmpty()) { update updateTasMap.values(); } init(); done_flg = true; } catch (Exception ex) { System.debug(ex.getStackTraceString()); ApexPages.addMessages(ex); Database.rollback(sp); } } public class EsdInfo { public TransferApplyDetail__c rec { get; set; } // 回库はSet単位で、明細一つ一つのquickCheck要らない public Boolean checked {get;set;} public boolean editable { get; set; } public String fsName {get;set;} public String tasId {get;set;} public EsdInfo(TransferApplyDetail__c rec) { this.rec = rec; this.checked = false; this.editable = rec.Approved_F__c && rec.Shippment_loaner_time__c == null; 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(String l, String v) { label = l; value = v; } } }