高章伟
2023-03-03 d8dc84a3d56df839895f1c417a4d9cbee763d262
force-app/main/default/classes/RepairAgainAnHandler.cls
@@ -3,7 +3,6 @@
    private Map<Id, RepairAgainAn__c> oldMap;
    private List<RepairAgainAn__c> newList;
    private List<RepairAgainAn__c> oldList;
    public RepairAgainAnHandler() {
      this.newMap = (Map<Id, RepairAgainAn__c>) Trigger.newMap;
        this.oldMap = (Map<Id, RepairAgainAn__c>) Trigger.oldMap;
@@ -12,13 +11,181 @@
   }
    protected override void beforeInsert() {
        setPhotoImgText();
        Set<Id> repairSet = new Set<Id>();
        for(RepairAgainAn__c ra : newList){
            repairSet.add(ra.Repair__c);
        }
        Map<Id,Repair__c> repairMap = new Map<Id,Repair__c>([SELECT Id,Name,SAP_Service_Repair_No__c,(select Id from reparirAgain01__r where RepairAgain_Status__c != '取消') from Repair__c where id in :repairSet]);
        //Map<Id,Repair__c> repairConplateMap = new Map<Id,Repair__c>([SELECT Id,Name,SAP_Service_Repair_No__c,(select Id from reparirAgain01__r) from Repair__c where id in :repairSet]);
        for(RepairAgainAn__c ra : newList){
            //修理没上传SAP之前,不能新建 再修理分析
            System.debug('=======repairMap' + repairMap);
            System.debug('=======newList' + newList);
            //已存在再修理分析的修理不能新建  存在取消的也可以新建再修理
            if( repairMap.containsKey(ra.Repair__c) && repairMap.get(ra.Repair__c).reparirAgain01__r.size() >= 1 ){
                ra.addError('该修理已存在再修理返品分析,不能再新建再修理返品分析');
            }else if(repairMap.containsKey(ra.Repair__c) && repairMap.get(ra.Repair__c).SAP_Service_Repair_No__c == null){
                ra.addError('该修理还没有上传SAP,不能够新建再修理分析');
            }else{
                setPhotoImgText();
                setRepairAgainNameAndReport();
            }
        }
    }
    protected override void beforeUpdate() {
        setPhotoImgText();
        setStatusChange();
        //提交审批之后更新字段
        updateExaminePeople();
        //附件更新
        updateAttachment();
    }
    public static Set<Id> RA_Ids = new Set<Id>();
    protected override void afterUpdate(){
        submitRepair();
        //发送邮件
        sendIssueEmail();
    }
    
    public static Set<Id> RA_Ids = new Set<Id>();
    //再注册分析 需求 新增字段 20220811 sx start
    public static List<Id> openRepairAgainRepairIds = new List<Id>();
    public static List<Id> oSHRepairAgainRepairIds = new List<Id>();
    public static List<Id> oSHWrittenRepairAgainRepairIds = new List<Id>();
    public static List<Id> finalRepairAgainRepairIds = new List<Id>();
    public static List<Id> cleanRepairIds = new List<Id>();
    //再注册分析 需求 新增字段 20220811 sx end
    private void sendIssueEmail(){
        List<Id> repairAgainIds = new List<Id>();
        List<Id> repairAgainIdsSH = new List<Id>();
        List<Id> repairAgainIdsGZ = new List<Id>();
        for(RepairAgainAn__c ra : newList){
            //一次二次通过都发送邮件通知对应的OCSM
            // TODO 发行投诉邮件在workflow,审批通过邮件在审批流,后续业务确认后再统一整合
            if(ra.RepairAgainAn_Approve_status__c != oldMap.get(ra.Id).RepairAgainAn_Approve_status__c && ra.RepairAgainAn_Approve_status__c == '批准'){
                repairAgainIds.add(ra.Id);
            }else if(ra.RepairAgainAn_Approve_status2__c != oldMap.get(ra.Id).RepairAgainAn_Approve_status2__c && ra.RepairAgainAn_Approve_status2__c == '批准'){
                repairAgainIds.add(ra.Id);
            }
            //工厂/RC发起再注册申请时,给对应的用户发送邮件提醒
            if(ra.RepairAgain_Status__c == 'RC填写完毕' && oldMap.get(ra.Id).RepairAgain_Status__c != 'RC填写完毕') {
                if (ra.SORC__c == 'OSH-SH') {
                    repairAgainIdsSH.add(ra.Id);
                } else if (ra.SORC__c == 'OSH-GZ') {
                    repairAgainIdsGZ.add(ra.Id);
                }
            }
        }
        /*if (!repairAgainIds.isEmpty()) {
            email(repairAgainIds, '再修理分析审批通过', System.Label.RepairAgainAn_Issue_Sendmail);
        }*/
        if (!repairAgainIdsSH.isEmpty()) {
            email(repairAgainIdsSH, '工厂/RC发起再注册申请通知', System.Label.SendRepairAgainAn_OSH_SH);
        }
        if (!repairAgainIdsGZ.isEmpty()) {
            email(repairAgainIdsGZ, '工厂/RC发起再注册申请通知', System.Label.SendRepairAgainAn_OSH_GZ);
        }
    }
    private void email(List<Id> neadUpdateList, String emailTemplateName, String toEmailAddress){
        EmailTemplate et=[Select id from EmailTemplate where name =: emailTemplateName limit 1];
        String[] toAddresses = toEmailAddress.split(';');
        List<Messaging.SingleEmailMessage> emails = new List<Messaging.SingleEmailMessage>();
        for(Id repairAgainId: neadUpdateList){
            Messaging.SingleEmailMessage mail = new Messaging.SingleEmailMessage();
            mail = Messaging.renderStoredEmailTemplate(et.Id, null , repairAgainId);
            mail.setSaveAsActivity(false);
            mail.setToAddresses(toAddresses);
            emails.add(mail);
        }
        Messaging.sendEmail(emails);
    }
    private void setRepairAgainNameAndReport() {
        Date todayTemp = Date.today();
        Set<Id> repairSet = new Set<Id>();
        for(RepairAgainAn__c ra : newList){
            repairSet.add(ra.Repair__c);
            // 报告者、报告日自动设值,创建者自动设置
            ra.Reporter__c = UserInfo.getUserId();
            ra.Report_Date__c = todayTemp;
        }
        Map<Id,Repair__c> repairMap = new Map<Id,Repair__c>([SELECT Id,Name,Repair_Detail__c,InspectionFailureCause__c,SerialNumber__c,Delivered_Product__c,Incharge_Staff__c,(select Id from reparirAgain01__r) from Repair__c where id in :repairSet]);
        System.debug('repairMap========='+repairMap);
        for(RepairAgainAn__c ra : newList){
            if(repairMap.containsKey(ra.Repair__c)){
                Integer repairSize = repairMap.get(ra.Repair__c).reparirAgain01__r.size() + 1;
                String repairSizeString = '000' + repairSize;
                String cutString = repairSizeString.substring(repairSizeString.length()-3, repairSizeString.length());
                if(repairSize == 0) {
                    ra.Name = repairMap.get(ra.Repair__c).Name + '_001';
                }else{
                    ra.Name = repairMap.get(ra.Repair__c).Name + '_' + cutString;
                }
                //修理上字段带过来  客户确认 = 修理.问题内容描述  RC确认 = 修理.检测故障内容 机身号码
                ra.RC_Describe__c = repairMap.get(ra.Repair__c).InspectionFailureCause__c;
                ra.Customer_Describe__c = repairMap.get(ra.Repair__c).Repair_Detail__c;
                ra.SerialNumber1__c = repairMap.get(ra.Repair__c).SerialNumber__c;
                ra.Delivered_Product__c = repairMap.get(ra.Repair__c).Delivered_Product__c;
                ra.Incharge_Staff__c = repairMap.get(ra.Repair__c).Incharge_Staff__c;
            }
        }
    }
    //通过审批流判断确认者和审核人员的值
    private void updateExaminePeople(){
        for(RepairAgainAn__c ram : newList){
            RepairAgainAn__c ramOld = oldMap.get(ram.Id);
            if(ram.OSH_Confirmation_Date__c != ramOld.OSH_Confirmation_Date__c && ram.OSH_Confirmation_Date__c != null){
                //审批提交日修改  OSH确认者 = 操作人员
                ram.OSH_Confirmer__c = UserInfo.getUserId();
            }else if(ram.RepairAgainAn_Approve_Confirm__c != ramOld.RepairAgainAn_Approve_Confirm__c && ram.RepairAgainAn_Approve_Confirm__c != null){
                //OSH审批完了日修改  OSH审核人员 = 操作人员
                ram.OSH_Auditor__c = UserInfo.getUserId();
            }else if(ram.OSH_Confirmation_Date2__c != ramOld.OSH_Confirmation_Date2__c  && ram.OSH_Confirmation_Date2__c != null){
                //审批提交日(二次)修改  OSH确认者(二次) = 操作人员
                ram.OSH_Confirmer2__c = UserInfo.getUserId();
            }else if(ram.RepairAgainAn_Approve_Confirm2__c != ramOld.RepairAgainAn_Approve_Confirm2__c && ram.RepairAgainAn_Approve_Confirm2__c != null){
                //OSH审批完了日(二次)修改  OSH审核人员(二次) = 操作人员
                ram.OSH_Auditor2__c = UserInfo.getUserId();
            }
            // OCSM确认者
            if (ram.OCSM_Approve_Status__c == '批准' && ram.OCSM_Approve_Status__c != ramOld.OCSM_Approve_Status__c) {
                ram.OCM_Confirmer__c = UserInfo.getUserId();
            }
        }
    }
    private void setPhotoImgText() {
        for (RepairAgainAn__c ra : newList) {
            System.debug('ra.Dectect_Picture1__c2:' + ra.Dectect_Picture1__c);
@@ -71,6 +238,20 @@
                    }
                }
                ra.Dectect_Picture2_URL__c = phtTxt;
                RA_Ids.add(ra.Id);
            }
            // 本次报价检测图片3
            if(Trigger.isAfter && Trigger.isInsert && String.isBlank(ra.Dectect_Picture3__c) == false
                    || (Trigger.isUpdate && ((RepairAgainAn__c) oldMap.get(ra.Id)).Dectect_Picture3__c != ra.Dectect_Picture3__c)
                    || (Trigger.isUpdate && String.isBlank(ra.Dectect_Picture3__c) == false && String.isBlank(ra.Dectect_Picture3_URL__c))){
                ra.Dectect_Picture3_URL__c = setPictureUrl(ra.Dectect_Picture3__c);
                RA_Ids.add(ra.Id);
            }
            // 本次报价检测图片4
            if(Trigger.isAfter && Trigger.isInsert && String.isBlank(ra.Dectect_Picture4__c) == false
                    || (Trigger.isUpdate && ((RepairAgainAn__c) oldMap.get(ra.Id)).Dectect_Picture4__c != ra.Dectect_Picture4__c)
                    || (Trigger.isUpdate && String.isBlank(ra.Dectect_Picture4__c) == false && String.isBlank(ra.Dectect_Picture4_URL__c))){
                ra.Dectect_Picture4_URL__c = setPictureUrl(ra.Dectect_Picture4__c);
                RA_Ids.add(ra.Id);
            }
            // OSH技术检测图片1
@@ -168,6 +349,177 @@
                ra.OSH_Dectect_Picture4_URL__c = phtTxt;
                RA_Ids.add(ra.Id);
            }
            // OSH技术检测图片5
            if(Trigger.isInsert && String.isBlank(ra.OSH_Dectect_Picture5__c) == false
                    || (Trigger.isUpdate && ((RepairAgainAn__c) oldMap.get(ra.Id)).OSH_Dectect_Picture5__c != ra.OSH_Dectect_Picture5__c)
                    || (Trigger.isUpdate && String.isBlank(ra.OSH_Dectect_Picture5__c) == false && String.isBlank(ra.OSH_Dectect_Picture5_URL__c))
            ){
                ra.OSH_Dectect_Picture5_URL__c = setPictureUrl(ra.OSH_Dectect_Picture5__c);
                RA_Ids.add(ra.Id);
            }
            // OSH技术检测图片6
            if(Trigger.isInsert && String.isBlank(ra.OSH_Dectect_Picture6__c) == false
                || (Trigger.isUpdate && ((RepairAgainAn__c) oldMap.get(ra.Id)).OSH_Dectect_Picture6__c != ra.OSH_Dectect_Picture6__c)
                || (Trigger.isUpdate && String.isBlank(ra.OSH_Dectect_Picture6__c) == false && String.isBlank(ra.OSH_Dectect_Picture6_URL__c))
            ){
                ra.OSH_Dectect_Picture6_URL__c = setPictureUrl(ra.OSH_Dectect_Picture6__c);
                RA_Ids.add(ra.Id);
            }
            // OSH技术检测图片7
            if(Trigger.isInsert && String.isBlank(ra.OSH_Dectect_Picture7__c) == false
                || (Trigger.isUpdate && ((RepairAgainAn__c) oldMap.get(ra.Id)).OSH_Dectect_Picture7__c != ra.OSH_Dectect_Picture7__c)
                || (Trigger.isUpdate && String.isBlank(ra.OSH_Dectect_Picture7__c) == false && String.isBlank(ra.OSH_Dectect_Picture7_URL__c))
            ){
                ra.OSH_Dectect_Picture7_URL__c = setPictureUrl(ra.OSH_Dectect_Picture7__c);
                RA_Ids.add(ra.Id);
            }
            // OSH技术检测图片8
            if(Trigger.isInsert && String.isBlank(ra.OSH_Dectect_Picture8__c) == false
                || (Trigger.isUpdate && ((RepairAgainAn__c) oldMap.get(ra.Id)).OSH_Dectect_Picture8__c != ra.OSH_Dectect_Picture8__c)
                || (Trigger.isUpdate && String.isBlank(ra.OSH_Dectect_Picture8__c) == false && String.isBlank(ra.OSH_Dectect_Picture8_URL__c))
            ){
                ra.OSH_Dectect_Picture8_URL__c = setPictureUrl(ra.OSH_Dectect_Picture8__c);
                RA_Ids.add(ra.Id);
            }
        }
    }
    public String setPictureUrl(String pic){
        String phtTxt = '';
        if(String.isBlank(pic) == false) {
            Integer pStt = pic.indexOf('<img');
            if(pStt >= 0){
                pStt = pic.indexOf('src="');
                if(pStt >= 0){
                    Integer pEnd = pic.indexOf('"', pStt + 5);
                    if(pEnd >= 0){
                        phtTxt = pic.substring(pStt + 5, pEnd);
                        //富文本反转义
                        phtTxt = phtTxt.unescapeHtml4();
                    }
                }
            }
        }
        return phtTxt;
    }
    public void setStatusChange() {
        Map<String,id> rtmaps = new Map<String,id>();
        List<RecordType> rtIds = [SELECT Id,Name FROM RecordType where SobjectType='RepairAgainAn__c'];
        Date todayTemp = Date.today();
        for (RecordType rt : rtIds) {
           rtmaps.put(rt.Name, rt.Id);
        }
        for (RepairAgainAn__c raa : newList) {
            RepairAgainAn__c raaOld = oldMap.get(raa.id);
            //状态变更为草案中
            if (String.isBlank(raa.RepairAgain_Status__c)) {
                raa.RepairAgain_Status__c = '草案中';
            }
            //当RC的内容填写完毕
            if(raa.RepairAgain_Status__c == 'RC填写完毕' && raaOld.RepairAgain_Status__c != 'RC填写完毕') {
                raa.RecordTypeId = rtmaps.get('2.OSH');
                // 发起再注册分析时间
                raa.Start_RepairAgainAn_Day__c = todayTemp;
                // 和SAP交互  OPEN
                openRepairAgainRepairIds.add(raa.Repair__c);
            }
            //当OSH受理
            if(raa.RepairAgain_Status__c == 'OSH受理' && raaOld.RepairAgain_Status__c != 'OSH受理') {
                // OSH受理日
                raa.OSH_Accept_Day__c = todayTemp;
                // 和SAP交互
                oSHRepairAgainRepairIds.add(raa.Repair__c);
            }
            //当OSH内容填写完毕
            if(raa.RepairAgain_Status__c == 'OSH填写完毕' && raaOld.RepairAgain_Status__c != 'OSH填写完毕') {
                raa.RecordTypeId = rtmaps.get('3.OCSM');
                // 和SAP交互
                oSHWrittenRepairAgainRepairIds.add(raa.Repair__c);
            }
            //当OCSM跟进完毕
            if(raa.RepairAgain_Status__c == '完毕' && raaOld.RepairAgain_Status__c != '完毕') {
                raa.RecordTypeId = rtmaps.get('4.Final完毕');
                // 和SAP交互
                finalRepairAgainRepairIds.add(raa.Repair__c);
            }
            //当再修理状态变成取消时
            if(raa.RepairAgain_Status__c == '取消' && raaOld.RepairAgain_Status__c != '取消'){
                cleanRepairIds.add(raa.Repair__c);
            }
        }
    }
    public void submitRepair(){
        List<Repair__c> repairUpdateList = new List<Repair__c>();
        if(openRepairAgainRepairIds.size() > 0 || oSHRepairAgainRepairIds.size() > 0 || oSHWrittenRepairAgainRepairIds.size() > 0 || finalRepairAgainRepairIds.size() > 0 || cleanRepairIds.size() > 0){
            BatchIF_Log__c iflog = new BatchIF_Log__c();
                iflog.Type__c = 'NFM103';
                iflog.Log__c  = 'callout start\n';
                insert iflog;
            if(openRepairAgainRepairIds.size() > 0) {
                setRepairList(openRepairAgainRepairIds, repairUpdateList, 'OCSM已发起');
                //关联一个open的再修理分析,传X
                NFM103Controller.callout(iflog.Id, openRepairAgainRepairIds,'OCSM已发起');
            }
            if(oSHRepairAgainRepairIds.size() > 0 ){
                setRepairList(oSHRepairAgainRepairIds, repairUpdateList, '品保已受理');
                NFM103Controller.callout(iflog.Id, oSHRepairAgainRepairIds,'品保已受理');
            }
            if(oSHWrittenRepairAgainRepairIds.size() > 0 ){
                setRepairList(oSHWrittenRepairAgainRepairIds, repairUpdateList, '品保出结论');
                NFM103Controller.callout(iflog.Id, oSHWrittenRepairAgainRepairIds,'品保出结论');
            }
            if(finalRepairAgainRepairIds.size() > 0) {
                setRepairList(finalRepairAgainRepairIds, repairUpdateList, 'OCSM出结论');
                //关联再修理分析完毕,传F
                NFM103Controller.callout(iflog.Id, finalRepairAgainRepairIds,'OCSM出结论');
            }
            if(cleanRepairIds.size() > 0 ){
                setRepairList(cleanRepairIds, repairUpdateList, '');
            }
            if(repairUpdateList.size() > 0 ){
                Update repairUpdateList;
            }
        }
    }
    public void setRepairList(List<Id> repairIdList, list<Repair__c> repairList, String status){
        for(Id repairId : repairIdList){
            Repair__c tempRepair = new Repair__c();
            tempRepair.Id = repairId;
            tempRepair.RepairAgainAn_Status__c = status;
            repairList.add(tempRepair);
        }
    }
    public void updateAttachment(){
        for(RepairAgainAn__c ram : newList){
            String pid = ram.Id;
            String sql = 'SELECT Name,Body,ContentType from Attachment where ParentId =\'' + pid + '\'';
            Attachment att = Database.query(sql);
            System.debug('bName====='+att.Body);
        }
    }
}