buli
2022-03-11 02ddc35714cbd1688b7cb057f770f1410de79dab
PIPL Updated Code 20220311
77个文件已修改
6359 ■■■■ 已修改文件
force-app/main/default/aura/AgencyAccount/AgencyAccount.cmp 30 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
force-app/main/default/aura/AgencyAccount/AgencyAccount.css 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
force-app/main/default/aura/AgencyAccount/AgencyAccountController.js 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
force-app/main/default/aura/AgencyAccount/AgencyAccountHelper.js 124 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
force-app/main/default/aura/WeeklyReport/WeeklyReport.cmp 32 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
force-app/main/default/aura/WeeklyReport/WeeklyReport.css 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
force-app/main/default/aura/WeeklyReport/WeeklyReportController.js 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
force-app/main/default/aura/WeeklyReport/WeeklyReportHelper.js 338 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
force-app/main/default/classes/AWSServiceTool.cls 48 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
force-app/main/default/classes/AgencyAccountCmp.cls 48 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
force-app/main/default/classes/AgencyContactHandler.cls 20 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
force-app/main/default/classes/AssessmentReportController.cls 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
force-app/main/default/classes/BmeWorkController.cls 59 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
force-app/main/default/classes/CM_SearchContact.cls 62 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
force-app/main/default/classes/CM_SearchContactServiceController.cls 64 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
force-app/main/default/classes/CampaignMemberController.cls 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
force-app/main/default/classes/CampaignMemberServiceController.cls 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
force-app/main/default/classes/ConsumFixtureSetSelectController.cls 补丁 | 查看 | 原始文档 | blame | 历史
force-app/main/default/classes/ConsumReassignController.cls 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
force-app/main/default/classes/ConsumTrialController.cls 9 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
force-app/main/default/classes/ConsumTrialPDFController.cls 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
force-app/main/default/classes/FixtureRentalPDFController.cls 17 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
force-app/main/default/classes/InsReportPDFController.cls 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
force-app/main/default/classes/InstructReportController.cls 13 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
force-app/main/default/classes/LayoutDescriberHelper.cls 66 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
force-app/main/default/classes/LeadIntentionController.cls 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
force-app/main/default/classes/LightningUtil.cls 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
force-app/main/default/classes/NFM103Controller.cls 29 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
force-app/main/default/classes/NFM203Rest.cls 111 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
force-app/main/default/classes/NFM501Controller.cls 44 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
force-app/main/default/classes/NFM501FutureController.cls 51 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
force-app/main/default/classes/NFM502Controller.cls 149 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
force-app/main/default/classes/NFM503InfoFileBatch.cls 184 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
force-app/main/default/classes/NFM606Controller.cls 36 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
force-app/main/default/classes/NFM607Rest.cls 48 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
force-app/main/default/classes/NFM612Rest.cls 25 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
force-app/main/default/classes/NFM620Rest.cls 32 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
force-app/main/default/classes/NFM623Rest.cls 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
force-app/main/default/classes/NFM624Rest.cls 46 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
force-app/main/default/classes/NFM702Controller.cls 55 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
force-app/main/default/classes/NFMUtil.cls 132 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
force-app/main/default/classes/NewAndEditAddressController.cls 102 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
force-app/main/default/classes/NewAndEditLeadController.cls 121 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
force-app/main/default/classes/OFSInsReportLayoutController.cls 32 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
force-app/main/default/classes/QISPDFController.cls 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
force-app/main/default/classes/SLAReportDetailsController.cls 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
force-app/main/default/classes/SearchVisitorController.cls 60 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
force-app/main/default/classes/SimpleEventRegisterController.cls 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
force-app/main/default/classes/StartTradingController.cls 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
force-app/main/default/classes/StraightBackAddressController.cls 56 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
force-app/main/default/classes/UpdateContractAimAmountHandler.cls 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
force-app/main/default/classes/WeeklyReportCmp.cls 74 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
force-app/main/default/classes/XinDailyReportController.cls 47 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
force-app/main/default/pages/AssessmentReport.page 60 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
force-app/main/default/pages/BMEWorkPage.page 114 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
force-app/main/default/pages/CM_SearchContact.page 223 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
force-app/main/default/pages/CM_SearchContactService.page 199 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
force-app/main/default/pages/CampaignMember.page 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
force-app/main/default/pages/CampaignMemberService.page 48 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
force-app/main/default/pages/ConsumReassign.page 108 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
force-app/main/default/pages/ConsumTrial.page 117 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
force-app/main/default/pages/ConsumTrialPDF.page 166 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
force-app/main/default/pages/FixtureRentalPDF.page 110 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
force-app/main/default/pages/InsReportPDF.page 125 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
force-app/main/default/pages/InstructReport.page 88 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
force-app/main/default/pages/LeadIntention.page 437 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
force-app/main/default/pages/NewAndEditLead.page 554 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
force-app/main/default/pages/OFSInsReportLayout.page 169 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
force-app/main/default/pages/QISPDF.page 130 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
force-app/main/default/pages/SLAReportDetails.page 84 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
force-app/main/default/pages/SearchVisitor.page 254 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
force-app/main/default/pages/SimpleEventRegister.page 57 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
force-app/main/default/pages/StartTrading.page 73 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
force-app/main/default/pages/StraightBackAddress.page 473 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
force-app/main/default/pages/XinDailyReport.page 72 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
force-app/main/default/triggers/ContactHpDeptUpd.trigger 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
force-app/main/default/triggers/Repair.trigger 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
force-app/main/default/aura/AgencyAccount/AgencyAccount.cmp
@@ -5,7 +5,12 @@
    <aura:attribute name="hosStr" type="String"/>
    <aura:attribute name="conStr" type="String"/>
    <aura:attribute name="filedsmap" type="Map"/>
    <aura:attribute name="awsdata" type="Map"/>
    <aura:attribute name="temp_aws_id" type="String"/>
    <aura:attribute name="staticResource" type="Map"/>
    <ltng:require scripts="{! $Resource.AWSService+'/AWSService.js' }" afterScriptsLoaded="{!c.scriptsLoaded}" />
    <aura:renderIf isTrue="{!v.login}">
        <div class="slds-spinner_container height100vh">
            <div class="slds-spinner--brand slds-spinner slds-spinner--medium" role="alert">
@@ -46,17 +51,17 @@
          <th scope="col" style = "width:5px;">
            <div class="slds-truncate" title="{!v.filedsmap.Hospital_Name__c}">{!v.filedsmap.Hospital_Name__c}</div>
          </th>
          <th scope="col">
          <th scope="col" style="width: 150px;">
            <div class="slds-truncate" title="{!v.filedsmap.Department_Cateogy_F__c}">{!v.filedsmap.Department_Cateogy_F__c}</div>
          </th>
          <!-- 精琢科技  zxk  SWAG-C8F8TU end -->
          <!-- <th scope="col">
            <div class="slds-truncate" title="{!v.filedsmap.Hospital_DC_Name__c}">{!v.filedsmap.Hospital_DC_Name__c}</div>
          </th> -->
          <th scope="col">
          <th scope="col" style="width: 150px;">
            <div class="slds-truncate" title="{!v.filedsmap.Type__c}">{!v.filedsmap.Type__c}</div>
          </th>
          <th scope="col">
          <th scope="col" style="width: 150px;">
            <div class="slds-truncate" title="{!v.filedsmap.Doctor_Division1__c}">{!v.filedsmap.Doctor_Division1__c}</div>
          </th>
          <th scope="col">
@@ -68,7 +73,14 @@
          <aura:iteration items="{!v.accounts}" var="item" indexVar="index">
        <tr>
          <th scope="row" data-label="Opportunity Name">
            <div class="slds-truncate" title="{!item.Name}"><a href="{!'/partner/s/agency-contact/' + item.Id}">{!item.Name}</a></div>
            <aura:set attribute="temp_aws_id" value="{! item.AWS_Data_Id__c }" />
            <div class="slds-truncate">
                <a href="{!'/partner/s/agency-contact/' + item.Id}" style="position: relative;">
                    <span class="encrypt">{!item.Name}</span>
                    <span class="decrypt">{!item.awsdata.name}</span>
                </a>
            </div>
          </th>
            <!-- 精琢科技  zxk  SWAG-C8F8TU start -->
             <td data-label="Account Name">
@@ -94,10 +106,16 @@
          </td> -->
          <td data-label="Close Date">
            <div class="slds-truncate" title="{!item.Type__c}">{!item.Type__c}</div>
            <div class="slds-truncate" title="{!item.Type__c}">
                <span class="encrypt">{!item.Type__c}</span>
                <span class="decrypt">{!item.awsdata.type}</span>
            </div>
          </td>
          <td data-label="Stage">
            <div class="slds-truncate" title="{!item.Doctor_Division1__c}">{!item.Doctor_Division1__c}</div>
            <div class="slds-truncate" title="{!item.Doctor_Division1__c}">
                <span class="encrypt">{!item.Doctor_Division1__c}</span>
                <span class="decrypt">{!item.awsdata.doctorDivision1}</span>
            </div>
          </td>
          <td data-label="IsOlympusContact__c">
            <ui:outputCheckbox value="{!item.IsOlympusContact__c}" />
force-app/main/default/aura/AgencyAccount/AgencyAccount.css
@@ -1,3 +1,21 @@
.THIS.contents_wrapper {
    padding-top: 10px;
}
.THIS tr .decrypt{
    /* position: absolute;
    top: 0;
    left: 100%;
    display: none;
    text-align: left;
    padding-left: 5px; */
    display: none;
}
.THIS tr:hover .decrypt{
    display: unset;
}
.THIS tr:hover .encrypt{
    display: none;
}
force-app/main/default/aura/AgencyAccount/AgencyAccountController.js
@@ -10,4 +10,8 @@
    clearContact: function(component, event, helper) {
        helper.clearContact(component, event, helper);
    },
    scriptsLoaded:function(component, event, helper) {
        // AWSService.logFun = helper.saveLog;
        // AWSService.component = component;
    }
})
force-app/main/default/aura/AgencyAccount/AgencyAccountHelper.js
@@ -1,12 +1,14 @@
({
    doinit : function(component, event, helper) {
        component.set('v.login',true);
        component.set("v.awsdata",{});
        var action = component.get("c.getfiledsmap");
        action.setCallback(this, function(response) {
            var state = response.getState();
            if(state === "SUCCESS") {
                var res = response.getReturnValue();
                component.set("v.filedsmap", res);
            } else if (state === "ERROR") {
                var errors = response.getError();
@@ -27,7 +29,11 @@
            if(state === "SUCCESS") {
                var acList = response.getReturnValue();
                component.set("v.accounts", acList);
                helper.Decrypt(component,helper,function(){
                component.set('v.login',false);
                })
            } else if (state === "ERROR") {
                var errors = response.getError();
                var toastEvent = $A.get("e.force:showToast");
@@ -40,7 +46,31 @@
                component.set('v.login',false);
            }
        });
        var action3 = component.get("c.GetConfig");
        action3.setCallback(this, function(response) {
            var state = response.getState();
            if(state === "SUCCESS") {
                var res = response.getReturnValue();
                //AWSService.sfSessionId = res.sessionId;
                component.set("v.staticResource",JSON.parse(res.staticResource));
        $A.enqueueAction(action2);
            } else if (state === "ERROR") {
                var errors = response.getError();
                var toastEvent = $A.get("e.force:showToast");
                toastEvent.setParams({
                    "title": "错误",
                    "type":"error",
                    "message": errors[0].message
                });
                toastEvent.fire();
            }
        });
        $A.enqueueAction(action3);
    },
    clearContact: function(component, event, helper) {
@@ -53,15 +83,17 @@
        component.set('v.login',true);
        var hosStr = component.get("v.hosStr");
        var conStr = component.get("v.conStr");
        var action = component.get("c.searchAccounts");
        action.setParams({"hosStr": hosStr, "conStr": conStr});
        var action = component.get("c.searchAccounts2");
        let awsdata = component.get("v.awsdata");
        let staticResource = component.get("v.staticResource");
        action.setCallback(this, function(response) {
            var state = response.getState();
            if(state === "SUCCESS") {
                var acList = response.getReturnValue();
                component.set("v.accounts", acList);
                helper.Decrypt(component,helper,function(){
                component.set('v.login',false);
                })
            } else if (state === "ERROR") {
                var errors = response.getError();
                var toastEvent = $A.get("e.force:showToast");
@@ -74,6 +106,92 @@
                component.set('v.login',false);
            }
        });
        if (conStr) {
            AWSService.search(staticResource.searchUrl,JSON.stringify({
                "name":conStr
            }),function(data){
                $A.getCallback(function(){
                    let dataIds = [];
                    if(data.object && data.object.length > 0){
                        for(let d of data.object){
                            if(d.dataId){
                                dataIds.push(d.dataId);
                                awsdata[d.dataId] = d;
                            }
                        }
                    }
                    action.setParams({"hosStr": hosStr, awsids:dataIds});
                    $A.enqueueAction(action);
                })()
           },staticResource.token);
        }else{
            action.setParams({"hosStr": hosStr});
            $A.enqueueAction(action);
        }
    },
    Decrypt :function(component, helper, callback){
        let awsdata = component.get("v.awsdata");
        let need_query = [];
        let acList = component.get("v.accounts");
        let staticResource = component.get("v.staticResource");
        for (const acc of acList) {
            if(acc.AWS_Data_Id__c &&
                (!awsdata.hasOwnProperty(acc.AWS_Data_Id__c) || !awsdata[acc.AWS_Data_Id__c])
                ){
                need_query.push(acc.AWS_Data_Id__c);
            }
        }
        let Foo = function(){
            for (const acc of acList) {
                if(acc.AWS_Data_Id__c && awsdata.hasOwnProperty(acc.AWS_Data_Id__c)){
                    acc.awsdata = awsdata[acc.AWS_Data_Id__c];
                }
            }
            component.set("v.accounts", acList);
            if(callback)callback();
        }
        if(need_query.length>0){
            AWSService.search(staticResource.searchUrl,JSON.stringify({
                 "dataIds":need_query
                }),function(data){
                    $A.getCallback(function(){
                        if(data.object && data.object.length > 0){
                            for(let d of data.object){
                                if(d.dataId){
                                    awsdata[d.dataId] = d;
                                }
                            }
                        }
                        Foo();
                    })()
            },staticResource.token);
        }else{
            Foo();
        }
    },
    saveLog:function(component,module,url,request,response,status){
        var action = component.get("c.SaveLog");
        action.setParams({
            "module": hosStr,
            "content": content,
            "status": status,
            "respMsg": respMsg
            });
        $A.enqueueAction(action);
    }
})
force-app/main/default/aura/WeeklyReport/WeeklyReport.cmp
@@ -71,6 +71,14 @@
    <!-- It will display 100 records . Change for your requirement-->
    <aura:attribute name="NumOfRecords" type="Integer" default="1000"/> 
    <aura:attribute name="showMain" type="Boolean" default="true"/>
    <!-- PIPL update Yin Mingjie 21/02/2022 start -->
    <aura:attribute name="AWStoken" type="String"/>
    <aura:attribute name="AWSsearch" type="String"/>
    <aura:attribute name="AWSinsert" type="String"/>
    <aura:attribute name="AWStransactionURL" type="String"/>
    <aura:attribute name="AWSDoctor2Map" type="String"/>
    <aura:attribute name="awsurl" type="Map"/>
    <!-- PIPL update Yin Mingjie 21/02/2022 end -->
    <!-- 批量添加周报 end-->
    
@@ -135,7 +143,7 @@
                            <span class="slds-truncate" title="Name">{!v.fieldsmap.Department_Cateogy__c}</span>
                        </th>
                        <th class="table_header slds-text-title--caps">
                            <span class="slds-truncate" title="Name">{!v.fieldsmap.doctor2__c}</span>
                            <span class="slds-truncate" title="Name">{!v.fieldsmap.doctor2__r}</span>
                        </th>
                        <th class="table_header slds-text-title--caps">
                            <span class="slds-truncate" title="Name">{!v.fieldsmap.visitor_title__c}</span>
@@ -169,12 +177,18 @@
                            </td>
                            <td role="gridcell" class="slds-cell-edit">
                                <span class="slds-grid slds-grid--align-spread">
                                    <span class="slds-truncate" title="{!item.doctor2__r.Name}">{!item.doctor2__r.Name}</span>
                                    <span class="slds-truncate" title="{!item.doctor2__r.Name}">
                                        <span class="encrypt">{!item.doctor2__r.Name}</span>
                                        <span class="decrypt">{!item.doctor2__r.awsdata.name}</span>
                                    </span>
                                </span>
                            </td>
                            <td role="gridcell" class="slds-cell-edit">
                                <span class="slds-grid slds-grid--align-spread">
                                    <span class="slds-truncate" title="{!item.visitor_title__c}">{!item.visitor_title__c}</span>
                                    <span class="slds-truncate" title="{!item.visitor_title__c}">
                                        <span class="encrypt">{!item.visitor_title__c}</span>
                                        <span class="decrypt">{!item.doctor2__r.awsdata.doctorDivision1}</span>
                                    </span>
                                </span>
                            </td>
                            <td role="gridcell" class="slds-cell-edit">
@@ -473,12 +487,18 @@
                                            </td>
                                            <td role="gridcell" class="slds-cell-edit">
                                                <span class="slds-grid slds-grid--align-spread">
                                                    <span class="slds-truncate" title="{!item.doctor2__r.Name}">{!item.doctor2__r.Name}</span>
                                                    <span class="slds-truncate" title="{!item.doctor2__r.Name}">
                                                        <span class="encrypt">{!item.doctor2__r.Name}</span>
                                                        <span class="decrypt">{!item.doctor2NameOrigin}</span>
                                                    </span>
                                                </span>
                                            </td>
                                            <td role="gridcell" class="slds-cell-edit">
                                                <span class="slds-grid slds-grid--align-spread">
                                                    <span class="slds-truncate" title="{!item.visitor_title__c}">{!item.visitor_title__c}</span>
                                                    <span class="slds-truncate" title="{!item.visitor_title__c}">
                                                        <span class="encrypt">{!item.visitor_title__c}</span>
                                                        <span class="decrypt">{!item.visitorTitleOrigin}</span>
                                                    </span>
                                                </span>
                                            </td>
                                            <td role="gridcell" class="slds-cell-edit">
@@ -524,7 +544,7 @@
                    <lightning:messages aura:id="OppMessage" />
                    <!-- onload="{!c.showRequiredFields}" -->
                    <aura:renderIf isTrue="{!v.truthy}">
                        <lightning:inputField fieldName="Name"/>
                        <lightning:inputField fieldName="Name" aura:id="newOpportunityField" />
                        <lightning:inputField fieldName="Type__c" aura:id="newOpportunityField" />
                        <lightning:inputField fieldName="Doctor_Division1__c" aura:id="newOpportunityField" />
                        <!-- <lightning:inputField class="customRequired none" aura:id="Input_type__c" fieldName="Type__c"/>
force-app/main/default/aura/WeeklyReport/WeeklyReport.css
@@ -127,3 +127,15 @@
.THIS .none{
     display:none; 
}
.THIS tr .decrypt{
    display: none;
}
.THIS tr:hover .decrypt{
    display: unset;
}
.THIS tr:hover .encrypt{
    display: none;
}
force-app/main/default/aura/WeeklyReport/WeeklyReportController.js
@@ -64,6 +64,10 @@
        // var vaildationFailReason2 = '';
        // var currentDate = new Date().toJSON().slice(0,10);
 
        // PIPL update Yin Mingjie 21/02/2022 start
        let agencyReport = Object.create(null);
        // PIPL update Yin Mingjie 21/02/2022 end
        fields.forEach(function (field) {
            if(field.get("v.fieldName") === 'Type__c' && $A.util.isEmpty(field.get("v.value"))){
                showValidationError = true;
@@ -77,12 +81,38 @@
                }
                
            }
            // PIPL update Yin Mingjie 21/02/2022 start
            if(field.get("v.fieldName") === 'Name'){
                agencyReport['name'] = field.get("v.value");
            }else if(field.get("v.fieldName") === 'Type__c'){
                agencyReport['type'] = field.get("v.value");
            }else if(field.get("v.fieldName") === 'Doctor_Division1__c'){
                agencyReport['doctorDivision1'] = field.get("v.value");
            }
            // PIPL update Yin Mingjie 21/02/2022 end
        });
         
        if (!showValidationError) {
            // PIPL update Yin Mingjie 21/02/2022 start
            /*
            var eventFields = event.getParam("fields");
            eventFields["Agency_Hospital__c"] = component.get('v.hospitalLinkId');
            component.find('recordEditForm').submit(eventFields);
            */
            var agencyHospitalid = component.get('v.hospitalLinkId');
            var arr = new Array();
            arr.push(agencyReport);
            var data = JSON.stringify(arr);
            // helper.set_aws_url(component,data,agencyHospitalid);
            var token = component.get('v.AWStoken');
            var newUrl = component.get('v.AWSinsert');
            component.set('v.login',true);
            helper.insert_agencycontact(component,token,newUrl,data,agencyHospitalid,helper);
            // PIPL update Yin Mingjie 21/02/2022 end
        }else{
            component.find('OppMessage').setError(vaildationFailReason);
        }
force-app/main/default/aura/WeeklyReport/WeeklyReportHelper.js
@@ -22,6 +22,7 @@
                //SWAG-CBX68C fy 【委托】DAMS系统周报模块内容需求增加 end
                component.set('v.selected_agency_person', res.allselectlist.AgencyPerson__c[0].label);
                component.set('v.dialog_type', '新建');
                component.set('v.awsurl', res.awsurl);// 20220222 PI改造 by Bright
                
                this.get_reports(component, event, helper, component.find('select_date').get('v.value'), component.find('select_agency_person').get('v.value'));
                
@@ -95,6 +96,38 @@
            if(state == 'SUCCESS'){
                var res = response.getReturnValue();
                component.set('v.reports', res.reports);
                // 20220222 PI改造 by Bright--start
                let dataIds = [];
                for (const rep of res.reports) {
                    if (rep.doctor2__r && rep.doctor2__r.AWS_Data_Id__c) {
                        dataIds.push(rep.doctor2__r.AWS_Data_Id__c);
                    }
                }
                if(dataIds.length > 0){
                    let awsurl = component.get('v.awsurl');
                    helper.search_agency_contact_core(awsurl.token,awsurl.searchUrl,JSON.stringify({
                        "dataIds":dataIds
                    }),(result)=>{
                        if(result.status == '0'){
                            let mm = {};
                            for (const m of result.object) {
                                mm[m.dataId] = m;
                            }
                            for (const rep of res.reports) {
                                if (rep.doctor2__r && rep.doctor2__r.AWS_Data_Id__c && mm.hasOwnProperty(rep.doctor2__r.AWS_Data_Id__c)) {
                                    rep.doctor2__r.awsdata = mm[rep.doctor2__r.AWS_Data_Id__c];
                                }
                            }
                            component.set('v.reports', res.reports);
                        }else{
                            this.error('AWS search status : ' + result.status);
                        }
                    },component);
                }
                // 20220222 PI改造 by Bright--end
                component.set('v.report_count', res.reports.length);
                // 更新保存後のselect_data用
@@ -422,6 +455,9 @@
        component.set('v.selected_date', select_date);
        var name = component.get('v.selected_agency_person');
        var ret = this.create_report_header(component, name, select_agency, select_date);
        // PIPL update Yin Mingjie 21/02/2022 start
        this.set_aws_url(component)
        // PIPL update Yin Mingjie 21/02/2022 end
    },
    
    copy_button : function(component, event, helper) {
@@ -491,6 +527,19 @@
    },
    
    save_report : function(component, event, helper) {
        // 20220222 PI改造  by Bright--start
        let doctor2Name = '';
        let visitortitle = '';
        for(let op of component.find('select_doctor').get('v.options')){
            if (op.selected) {
                doctor2Name = op.label;
                visitortitle = op.Doctor_Division1__c;
            }
        }
        // 20220222 PI改造  by Bright--end
        component.find('save_button').set('v.disabled', true);
        var Report_Date__c = component.get('v.data.Report_Date__c');
@@ -716,6 +765,10 @@
                            // Save&New時のウィンドウ内データ一覧
                            if (res.length > 0) {
                                // 20220222 PI改造  by Bright--start
                                res[0].doctor2NameOrigin = doctor2Name;
                                res[0].visitorTitleOrigin = visitortitle;
                                // 20220222 PI改造  by Bright--end
                                reports_now[reports_now_count] = res[0];
                                
                                reports_now.sort(function(a,b) {
@@ -1012,6 +1065,128 @@
            component.set('v.doctor_title', '');
        }
    },
    // PIPL update Yin Mingjie 21/02/2022 start
    set_aws_url : function(component) {
        var action = component.get('c.getAwsurl');
        action.setParams({
            "sobj" : "Agency_Contact__c",
        });
        action.setCallback(this,function(response){
            var state = response.getState();
            if(state == 'SUCCESS'){
                var awsmap = this.conv_selected(response.getReturnValue());
                component.set('v.AWStoken',awsmap.token);
                component.set('v.AWSinsert',awsmap.newUrl);
                component.set('v.AWStransactionURL',awsmap.transactionURL);
            }
            else{
                this.error('AWS url/token error.');
                component.set('v.login',false);
            }
        });
        $A.enqueueAction(action);
    },
    insert_agencycontact : function(component,token,newUrl,payload,agencyHospitalid,helper) {
        fetch(newUrl, {
            method: 'POST',
            body: payload,
            headers: {
                'Content-Type': 'application/json',
                'pi-token': token
            }
        }).then((data) => {
            return data.json();
        }).then((result) => {
            if(result.status == '0'){
                $A.getCallback(function(){
                    helper.to_agencycontact(component,result,agencyHospitalid);
                })();
            }else{
                console.log('AWS status error:' + result)
                component.set('v.login',false);
                component.find('OppMessage').setError('AWS insert error.');
            }
        }).catch(error => {
            console.log('AWS insert error:' + error)
            component.set('v.login',false);
            component.find('OppMessage').setError('AWS insert error.');
        });
    },
    to_agencycontact : function(component,result,agencyHospitalid) {
        var action = component.get('c.saveAgencyContact');
        action.setParams({
            "name" : result.object[0].name,
            "nameEncrypt" : result.object[0].nameEncrypt,
            "type" : result.object[0].type,
            "typeEncrypt" : result.object[0].typeEncrypt,
            "doctorDivision1" : result.object[0].doctorDivision1,
            "doctorDivision1Encrypt" : result.object[0].doctorDivision1Encrypt,
            "agencyHospitalid" : agencyHospitalid,
            "awsid" : result.object[0].dataId,
        });
        action.setCallback(this,function(response){
            var state = response.getState();
            if(state == 'SUCCESS'){
                var acMap = this.conv_selected(response.getReturnValue());
                console.log(acMap);
                if(acMap.AgencyContactId != ''){
                    //确认事务
                    var token = component.get('v.AWStoken');
                    var confirmUrl = component.get('v.AWStransactionURL');
                    let data = Object.create(null);
                    data['isSuccess'] = 1;
                    data['sfRecordId'] = '';
                    data['txId'] = result.txId;
                    this.to_confirm(component,token,confirmUrl,JSON.stringify(data));
                }else if(acMap.errormsg != ''){
                    this.error(acMap.errormsg);
                    component.set('v.login',false);
                }else {
                    this.error('agency contact insert id error.');
                    component.set('v.login',false);
                }
            }
            else{
                this.error('agency contact insert error.');
                component.set('v.login',false);
            }
        });
        $A.enqueueAction(action);
    },
    to_confirm : function(component,token,confirmUrl,payload) {
        fetch(confirmUrl, {
            method: 'POST',
            body: payload,
            headers: {
                'Content-Type': 'application/json',
                'pi-token': token
            }
        }).then((data) => {
            return data.json();
        }).then((result) => {
            if(result.status == '0' && result.hasOwnProperty('success') && result.success){
                component.set('v.truthy', false);
                var modal_newAC = component.find('modal_newAC')
                $A.util.addClass(modal_newAC, 'disp_none');
                this.success('.客户人员已创建。');
                this.set_doctor_list(component);
            }else {
                this.error('AWS confirm error.');
                component.set('v.login',false);
            }
        }).catch(error => {
            this.error('AWS confirm error.');
            component.set('v.login',false);
        });
    },
    // PIPL update Yin Mingjie 21/02/2022 end
    
    set_doctor_list : function(component) {
        var hospital_id = component.get('v.hospitalLinkId');
@@ -1024,7 +1199,123 @@
            action.setCallback(this,function(response){
                var state = response.getState();
                if(state == 'SUCCESS'){
                    var res = this.conv_selected(response.getReturnValue());
                    var retMap = this.conv_selected(response.getReturnValue());
                    // PIPL update Yin Mingjie 21/02/2022 start
                    this.AWS_search(retMap,component);
                    /*
                    var default_doctor = component.get('v.default_select_doctor_id');
                    if (default_doctor != '' && res.length > 0) {
                        var doctor_title = '';
                        for (var i = 0; i < res.length; i++) {
                            if (res[i].value == default_doctor) {
                                res[i].selected = true;
                                doctor_title = res[i].Doctor_Division1__c;
                            } else {
                                res[i].selected = false;
                            }
                        }
                        component.find('select_doctor').set('v.options', res);
                        component.set('v.doctor_title', doctor_title);
                    } else {
                        component.find('select_doctor').set('v.options', res);
                        if (res.length > 0) {
                            component.set('v.doctor_title', res[0].Doctor_Division1__c);
                        }
                    }
                    component.set('v.default_select_doctor_id', '');
                    component.set('v.doctor_list', res);
                    component.set('v.login',false);
                    */
                   // PIPL update Yin Mingjie 21/02/2022 end
                }
                else{
                    this.error('set_doctor_list failed.');
                    component.set('v.login',false);
                }
            });
            $A.enqueueAction(action);
        }
    },
    // PIPL update Yin Mingjie 21/02/2022 start
    AWS_search : function(retMap,component) {
        var token = retMap.sre.token;
        var searchUrl = retMap.sre.searchUrl;
        var dataArr = new Array();
        for (const key in retMap) {
            if (key == 'sre') {continue;}
            dataArr.push(key);
        }
        let obj= Object.create(null);
        obj['dataIds'] = dataArr;
        var data = JSON.stringify(obj);
        this.search_agency_contact(token,searchUrl,data,retMap,component);
    },
    search_agency_contact : function(token,searchUrl,payload,retMap,component) {
        this.search_agency_contact_core(token,searchUrl,payload,(result)=>{
            if(result.status == '0'){
                this.to_doctor_list(result,retMap,component);
            }else{
                this.error('AWS search status : ' + result.status);
                component.set('v.login',false);
            }
        },component);
        // fetch(searchUrl, {
        //     method: 'POST',
        //     body: payload,
        //     headers: {
        //         'Content-Type': 'application/json',
        //         'pi-token': token
        //     }
        // }).then((data) => {
        //     return data.json();
        // }).then((result) => {
        // }).catch(error => {
        //     this.error('AWS search error.');
        //     component.set('v.login',false);
        // });
    },
    search_agency_contact_core : function(token,searchUrl,payload,callback,component) {
        fetch(searchUrl, {
            method: 'POST',
            body: payload,
            headers: {
                'Content-Type': 'application/json',
                'pi-token': token
            }
        }).then((data) => {
            return data.json();
        }).then((result) => {
            component.set('v.login',false);
            if(callback)callback(result);
        }).catch(error => {
            this.error('AWS search error.');
            component.set('v.login',false);
        });
    },
    to_doctor_list : function(result,retMap,component) {
        var resls = result.object;
        var res = [];
        var space = {};
        space['label'] = '';
        space['selected'] = true;
        space['value'] = '';
        res.push(space);
        for (var i = 0; i < resls.length; i++) {
            var t = {};
            t['label'] = resls[i].name;
            t['selected'] = false;
            t['Doctor_Division1__c'] = resls[i].doctorDivision1;
            t['value'] = retMap[resls[i].dataId].value;
            res.push(t);
        }
                    
                    var default_doctor = component.get('v.default_select_doctor_id');
                    if (default_doctor != '' && res.length > 0) {
@@ -1050,15 +1341,8 @@
                    component.set('v.default_select_doctor_id', '');
                    component.set('v.doctor_list', res);
                    component.set('v.login',false);
                }
                else{
                    this.error('set_doctor_list failed.');
                    component.set('v.login',false);
                }
            });
            $A.enqueueAction(action);
        }
    },
    // PIPL update Yin Mingjie 21/02/2022 end
    // stageNameChange : function(component, event, helper) {
    //     var options = component.find('input-oppstage').get("v.body")[0].get('v.options');
@@ -1656,4 +1940,40 @@
        $A.util.addClass(modalimport, 'disp_none');
        $A.util.addClass(modalimportbg,'disp_none');
    }
    // searchAgencyContact : function(res) {
    //     var agencyContacts = [];
    //     for (let idx = 0; idx < res.length; idx++) {
    //         agencyContacts.push(res[idx].awsid);
    //     }
    //     var action = component.get('c.getAWStoken');
    //     action.setCallback(this,function(response){
    //         var state = response.getState();
    //         console.log('state : ' + state);
    //         if(state === 'SUCCESS') {
    //             console.log('get name : ' + action.getName());
    //         }
    //         else if(state === 'INCOMPLETE') {
    //             console.log('incomplete state');
    //         } else if(state === 'ERROR') {
    //             if (errors) {
    //                 if (errors[0] && errors[0].message) {
    //                     console.log("Error message: " +
    //                              errors[0].message);
    //                 }
    //             } else {
    //                 console.log("Unknown error");
    //             }
    //         }
    //     });
    //     $A.enqueueAction(action);
    //     // var requestSearchPayload = new Map();
    //     // requestSearchPayload.set("dataIds",agencyContacts);
    //     var data = '{"dataIds": ["944233643042144256", "943645353649897473"]}';
    //     var token = 'eyJhbGciOiJIUzUxMiJ9.eyJjcmVhdGVkIjoxNjQ0NzY4MTIwNjc2LCJhcHBpZCI6IjZMeml6Y1JmN2g4eUx4MjgiLCJleHAiOjE2NDk5NTIxMjB9.6vORDP8BRaf_beCt4SEXrl3DEuYZ3owotkUqh27r8YhfmKDDWrv_NpVVpjTPeFjvzlQqaJMcFobZeAmPxpmq2A';
    //     var searchUrl = 'https://52.83.101.205/api/agencycontact/search';
    //     var data = this.search(searchUrl,data,token);
    //     return data;searchUrl,requestSearchPayload,token
    // },
})
force-app/main/default/classes/AWSServiceTool.cls
@@ -9,14 +9,44 @@
 * */
public without sharing class AWSServiceTool {
    public static String getAWSToken(){
        String app_id = '6LzizcRf7h8yLx28';
        String app_secret = 'UkLohQcHNjg164SdRc7gnS4rgu4d7FjINM3mtzRbyTS6IrUP5V';
        String url = 'https://52.83.101.205/api/token/getToken?app_id=' + app_id + '&app_secret=' + app_secret;
        HttpRequest req = new HttpRequest();
        req.setEndpoint(url);
        req.setMethod('GET');
        Http h = new Http();
        HttpResponse res = h.send(req);
        return res.getBody();
        AWS_Integration_Info__mdt awsConfiguration = [SELECT App_Id__c,Token_URL__c,App_Secret__c,Host_URL__c FROM AWS_Integration_Info__mdt  WHERE DeveloperName = 'AWS_Default_Configuration'];
        if (awsConfiguration == null) {
            System.debug('AWS_Integration_Info__mdt没配置');
            return null;
        }
        String awsAppId = awsConfiguration.App_Id__c;
        String awsAppSecret = awsConfiguration.App_Secret__c;
        Http http = new Http();
        HttpRequest request = new HttpRequest();
        String url = awsConfiguration.Token_URL__c;
        request.setEndpoint(url);
        request.setMethod('GET');
        HttpResponse response = http.send(request);
        Map<String, Object> results = (Map<String, Object>) JSON.deserializeUntyped(response.getBody());
        String token = (String)results.get('object');
        return token;
    }
    @future(callout=true)
    public static void deleteFileAddress(Set<String> fileAddressIds){
        //1. Get file address id
        system.debug('fileAddressId = '+ JSON.serialize(fileAddressIds));
        PIHelper.PIIntegration documentPI=PIHelper.getPIIntegrationInfo('Document');
        //2. Delete aws file doucment and post aws service
        Http http = new Http();
        HttpRequest request = new HttpRequest();
        String url = documentPI.deleteUrl;
        request.setEndpoint(url);
        request.setMethod('POST');
        request.setHeader('pi-token',documentPI.token);
        request.setHeader('Content-Type', 'application/json');
        request.setBody(JSON.serialize(fileAddressIds));
        HttpResponse response = http.send(request);
        system.debug('response = ' + response);
        if(response.getStatusCode() == 200){
            Map<String, Object> results = (Map<String, Object>) JSON.deserializeUntyped(response.getBody());
            if(results.get('status')=='0'){
                System.debug('成功删除');
            }
        }
    }
}
force-app/main/default/classes/AgencyAccountCmp.cls
@@ -75,4 +75,52 @@
        return acList1;
    }
    @AuraEnabled
    public static void SaveLog(String module,String content,String status,String respMsg){
        string awsDataId = '';
        string sfId = '';
        string transId = '';
        try {
            Map<string,object> mso = (Map<string,object>)JSON.deserializeUntyped(respMsg);
            awsDataId = String.valueOf(mso.get('AWS_Data_Id__c'));
            transId = String.valueOf(mso.get('txId'));
        } catch (Exception e) {
        }
        PIHelper.saveTransLog(module, awsDataId, sfId, transId, content, status, respMsg);
    }
    // 20220222 PI改造 by Bright--start
    @AuraEnabled
    public static Map<string,string> GetConfig() {
        Map<String,string> result = new Map<String,string>();
        result.put('staticResource', JSON.serialize(PIHelper.getPIIntegrationInfo('Agency_Contact__c')));
        //result.put('sessionId', UserInfo.getSessionId());
        return result;
    }
    @AuraEnabled
    public static List<Agency_Contact__c> searchAccounts2(String hosStr, List<string> awsids) {
        System.debug('hosStr='+hosStr);
        System.debug('awsids='+awsids);
        String f1 = '%'+hosStr+'%';
        if (String.isBlank(hosStr)) f1 = '%';
        Set<String> hospitalSet = new Set<String>();
        Set<String> aHospitalSet = new Set<String>();
        List<Agency_Hospital_Link__c> ahls = [select Id, Hospital__c from Agency_Hospital_Link__c];
        for (Agency_Hospital_Link__c ahl : ahls) {
            hospitalSet.add(ahl.Hospital__c);
            aHospitalSet.add(ahl.Id);
        }
        List<Agency_Contact__c> acList1 = LightningUtil.searchOCMAgencyContact(hospitalSet, aHospitalSet, f1, awsids);
        return acList1;
    }
    // 20220222 PI改造 by Bright--end
}
force-app/main/default/classes/AgencyContactHandler.cls
@@ -47,15 +47,25 @@
                }
                nObj.Agency_ID__c = nObj.Agency_ID_F__c;
            }
            nameSet.add(nObj.Name);
            nameSet.add(nObj.Name_Encrypted__c);
            ahIdSet.add(nObj.Agency_Hospital__c);
            keyMap.put(nObj.Agency_Hospital__c + nObj.Name, nObj);
            // PIPL update Yin Mingjie 21/02/2022 start
            // keyMap.put(nObj.Agency_Hospital__c + nObj.Name, nObj);
            keyMap.put(nObj.Agency_Hospital__c + nObj.Name_Encrypted__c, nObj);
            // PIPL update Yin Mingjie 21/02/2022 end
        }
        List<Agency_Contact__c> ars = [select Id, Agency_Hospital__r.Name, Agency_Hospital__c, Name from Agency_Contact__c
            where Name in :nameSet and Agency_Hospital__c in :ahIdSet and Agency_Hospital__c != null];
        // PIPL update Yin Mingjie 21/02/2022 start
        // List<Agency_Contact__c> ars = [select Id, Agency_Hospital__r.Name, Agency_Hospital__c, Name from Agency_Contact__c
        //     where Name in :nameSet and Agency_Hospital__c in :ahIdSet and Agency_Hospital__c != null];
        List<Agency_Contact__c> ars = [select Id, Agency_Hospital__r.Name, Agency_Hospital__c, Name, Name_Encrypted__c from Agency_Contact__c
            where Name_Encrypted__c in :nameSet and Agency_Hospital__c in :ahIdSet and Agency_Hospital__c != null];
        // PIPL update Yin Mingjie 21/02/2022 end
        for (Agency_Contact__c ar : ars) {
            String key = ar.Agency_Hospital__c + ar.Name;
            // PIPL update Yin Mingjie 21/02/2022 start
            // String key = ar.Agency_Hospital__c + ar.Name;
            String key = ar.Agency_Hospital__c + ar.Name_Encrypted__c;
            // PIPL update Yin Mingjie 21/02/2022 end
            //system.debug('========3333333key'+key);
            if (keyMap.containsKey(key)) {
                Agency_Contact__c a = keyMap.get(key);
force-app/main/default/classes/AssessmentReportController.cls
@@ -7,6 +7,8 @@
    public integer ASRRecordsNumber;
    public boolean hasError;
    public String ErrorMessages;
    public String awsString{get; set;}
    public String staticResource {get; set;}
    public AssessmentReportController() {
@@ -71,6 +73,7 @@
                return null;
            }
            setCurrentAssessmentReportStaff();
            staticResource = JSON.serialize(PIHelper.getPIIntegrationInfo('Contact'));
        } catch (Exception ex) {
            ApexPages.addMessages(ex);
@@ -221,6 +224,7 @@
        list<CampaignMember__c> CMlist = [
                                             SELECT Id, Name, Department_ID__c,
                                             Contact_ID__c, Contact_ID__r.Name,
                                             Contact_ID__r.AWS_Data_Id__c,
                                             dept__c, State__c, City__c
                                             FROM CampaignMember__c
                                             where Campaign__c = : AssessmentReport.Campaign__c
@@ -259,7 +263,7 @@
            }
        }
        ARSInfoList = TempARSInfoList.clone();
        awsString = JSON.serialize(ARSInfoList);
    }
    public PageReference Submit() {
force-app/main/default/classes/BmeWorkController.cls
@@ -16,6 +16,17 @@
    public String numtextD2 { get; set; } //数据字段02
    public String numtextD { get; set; }//数据字段03
    public String limits { get; set; }//日期03
    public String AwsDataIds { get; set; }//PI 改造
    public String[] AwsDataIdArr{
        get{
            if(String.isBlank(AwsDataIds)){
                return new string[]{};
            }
            return AwsDataIds.split(';');
        }
    }
    //public List<SelectOption> dateOpts { get; private set; }
    public List<SelectOption> textOpts { get; private set; }
    public List<SelectOption> textOpts01 { get; private set; }
@@ -49,33 +60,41 @@
    private String strRtColumus;
    @TestVisible private String accTypeForSort = null;
    private static Integer oppLimit = 500;
    // 20220222 PI改造 by Bright--start
    public List<SelectOption> equalOpts2 { get; private set; }
    public string staticResource { get; private set; }
    // 20220222 PI改造 by Bright--end
    public BmeWorkController() {
        oppRecords = new List<ConMeetInfo>();
        //数据字段下拉列表
        textOpts = new List<SelectOption>();
        textOpts.add(new SelectOption('Account.Name', '医院科室'));
        textOpts.add(new SelectOption('CampaignName__c', '学会培训名称'));
        textOpts.add(new SelectOption('MedicalStaff_Full_name__c', '拜访人姓名'));
        // textOpts.add(new SelectOption('MedicalStaff_Full_name__c', '拜访人姓名'));
        textOpts.add(new SelectOption('CampaignOwnerName__c', '学会培训主担当'));
        textOpts.add(new SelectOption('', '--无--'));
        textOpts01 = new List<SelectOption>();
        textOpts01.add(new SelectOption('CampaignName__c', '学会培训名称'));
        textOpts01.add(new SelectOption('MedicalStaff_Full_name__c', '拜访人姓名'));
        // textOpts01.add(new SelectOption('MedicalStaff_Full_name__c', '拜访人姓名'));
        textOpts01.add(new SelectOption('CampaignOwnerName__c', '学会培训主担当'));
        textOpts01.add(new SelectOption('Account.Name', '医院科室'));
        textOpts01.add(new SelectOption('', '--无--'));
        textOpts02 = new List<SelectOption>();
        textOpts02.add(new SelectOption('MedicalStaff_Full_name__c', '拜访人姓名'));
        textOpts02.add(new SelectOption('Account.Name', '医院科室'));
        textOpts02.add(new SelectOption('CampaignName__c', '学会培训名称'));
        textOpts02.add(new SelectOption('CampaignOwnerName__c', '学会培训主担当'));
        // textOpts02.add(new SelectOption('Account.Name', '医院科室'));
        // textOpts02.add(new SelectOption('CampaignName__c', '学会培训名称'));
        // textOpts02.add(new SelectOption('CampaignOwnerName__c', '学会培训主担当'));
        textOpts02.add(new SelectOption('', '--无--'));
        textOpts03 = new List<SelectOption>();
        textOpts03.add(new SelectOption('CampaignOwnerName__c', '学会培训主担当'));
        textOpts03.add(new SelectOption('MedicalStaff_Full_name__c', '拜访人姓名'));
        // textOpts03.add(new SelectOption('MedicalStaff_Full_name__c', '拜访人姓名'));
        textOpts03.add(new SelectOption('Account.Name', '医院科室'));
        textOpts03.add(new SelectOption('CampaignName__c', '学会培训名称'));
        textOpts03.add(new SelectOption('', '--无--'));
@@ -86,6 +105,10 @@
        equalOpts.add(new SelectOption('contains', '包含'));
        equalOpts.add(new SelectOption('notcontains', '不包含'));
        equalOpts.add(new SelectOption('starts with', '起始字符'));
        equalOpts2 = new List<SelectOption>();
        equalOpts2.add(new SelectOption('contains', '包含'));
        //首要显示包含
        firstOpts = new List<SelectOption>();
        firstOpts.add(new SelectOption('contains', '包含'));
@@ -104,11 +127,12 @@
        limitOpts.add(new SelectOption('1000', '全部'));
        //数据显示默认条数
        limits = '50';
        staticResource = JSON.serialize(PIHelper.getPIIntegrationInfo('Contact'));
    }
    //--------------------------------------init()--------------------------------------------------------------------------------
    public PageReference init() {
        setLayoutRWInfo();
        searchOppInner();
        //searchOppInner();
        system.debug(oppRecords);
        return null;
    }
@@ -193,7 +217,7 @@
    public void searchOppInner() {
        //try {
            //SOQL:拼接检索条件以及经销商询价的SOQL语句
            String soql = ' SELECT Campaign__c, CampaignOwnerID__c, Campaign__r.Ownerid, '+
        String soql = ' SELECT AWS_Data_Id__c,Campaign__c, CampaignOwnerID__c, Campaign__r.Ownerid, '+
                                'CampaignOwnerName__c,MedicalStaff_Full_name__c,Accountid,' +
                          strColumus +
                          ' FROM Contact WHERE Campaign__c != \'\' and CampaignStatus__c = \'公开中\'';
@@ -207,10 +231,16 @@
                String str = makeTextSql(numtextB1,  numtextB2,  newNumtext, 1);
                soql += str;
            }
            if (!String.isBlank(numtextC)) {
                String newNumtext = numtextC.trim();
                String str = makeTextSql(numtextC1,  numtextC2,  newNumtext, 1);
                soql += str;
        // if (!String.isBlank(numtextC)) {
        //     String newNumtext = numtextC.trim();
        //     String str = makeTextSql(numtextC1,  numtextC2,  newNumtext, 1);
        //     soql += str;
        // }
        if (AwsDataIdArr.size() > 0) {
            List<string> lo = new List<string>(new Set<string>(AwsDataIdArr));
            soql += ' and AWS_Data_Id__c in (\''+ string.join(lo, '\',\'')+'\') ';
            }
            if (!String.isBlank(numtextD)) {
                String newNumtext = numtextD.trim();
@@ -229,6 +259,7 @@
            }
            system.debug('联系人:' + soql);
            List<Contact> InfoList = Database.query(soql);
        System.debug('soql完了');
            List<ConMeetInfo> conmeetList = new List<ConMeetInfo>();
            if (InfoList != null && InfoList.size() > 0) {
                String str = '';
@@ -263,7 +294,7 @@
                    }
                }
                Id myID = Userinfo.getUserId();
                String soql1 = 'SELECT ' + strRtColumus + ' , Contact__c FROM MeetingManagement__c WHERE CreatedById  =: myID and Contact__c IN (' + str + ') AND CreatedDate__c = ' + strToday  ;
            String soql1 = 'SELECT ' + strRtColumus + ' , Contact__c, Contact__r.Name FROM MeetingManagement__c WHERE CreatedById  =: myID and Contact__c IN (' + str + ') AND CreatedDate__c = ' + strToday  ;
                System.debug('-----服务技师管理表-----:' + soql1);
                List<MeetingManagement__c> OpportList = new List<MeetingManagement__c>();
                //对应匹配;
@@ -281,6 +312,7 @@
                    if (tmpmmc == null) {
                        tmpmmc = new MeetingManagement__c();
                        tmpmmc.Contact__c = info.Id;
                    tmpmmc.Contact__r = info;
                        tmpmmc.Name  = info.MedicalStaff_Full_name__c + ':' + Date.today().format();
                        tmpmmc.CreatedDate__c  = Date.today();
                        //tmpmmc.Campaign__c = info.Campaign__c;
@@ -291,6 +323,7 @@
            }
            oppRecords = conmeetList.clone();
            oppCount = oppRecords.size();
        System.debug('searchOppInner完了'+oppRecords);
            //显示提示操作信息
            if (String.isBlank(this.saveType) && String.isBlank(this.sortKey)) {
                ApexPages.addmessage(new ApexPages.message(ApexPages.severity.INFO, '取得最近的 ' + oppCount + ' 条数据'));
force-app/main/default/classes/CM_SearchContact.cls
@@ -11,6 +11,10 @@
    private Integer i = 0;
    // SWAG-BB44G7  所在医院id end
    private String nowValue;
    public String staticResource {get; set;}
    public String contactAWSIds {set;get;}
    public String contactsInfo {set;get;}
    public String awsDataIdArray {set;get;}
    public CM_SearchContact() {
        openLine = Apexpages.currentPage().getParameters().get('line');
@@ -28,6 +32,26 @@
        }
        // SWAG-BB44G7  检索所在医院id end
        nowValue = Apexpages.currentPage().getParameters().get('now');
        //2022/02/15 张华建 PI PL start
        //1. Query Contact by accountId
        List<Contact> conList = new List<Contact>();
        system.debug('Account Id from Front-end:'+accountId);
        if(String.isNotBlank(accountId) && String.isNotEmpty(accountId)){
            conList = new List<Contact>([select Id,AWS_Data_Id__c from Contact where AccountId=:accountId and AWS_Data_Id__c!='']);
        }
        //2. Prepare the Contact Info
        Map<String,Contact> awsIdToContactMap = new Map<String,Contact>();
        List<String> conAWSIds = new List<String>();
        for(Contact con:conList){
            conAWSIds.add(con.AWS_Data_Id__c);
            awsIdToContactMap.put(con.AWS_Data_Id__c,con);
        }
        //conAWSIds.add('943114607025717249');
        contactsInfo = JSON.serialize(awsIdToContactMap);
        contactAWSIds = JSON.serialize(conAWSIds);
        staticResource = JSON.serialize(PIHelper.getPIIntegrationInfo('Contact'));
        //2022/02/15 张华建 PI PL end
    }
    public void init() {
@@ -50,9 +74,9 @@
    public PageReference searchContact() {
        String searchStr = 'select Id, Name, Department__c, Type__c, AccountName__c, Supplement__c, Phone,accountid ';
        String searchStr = 'select Id, Name, Department__c, Type__c, AccountName__c, Supplement__c, Phone,accountid,AWS_Data_Id__c';
        searchStr += '        from Contact ';
        searchStr += '       where Isactive__c = \'有效\' ';
        searchStr += '       where Isactive__c = \'有效\' and AWS_Data_Id__c!=\'\' ';
        // SWAG-BB44G7  检索所在医院的客户人员 start
        if(i == 1 ){
            searchStr += '         and Account.parent.parentid = :HPId ';
@@ -62,12 +86,29 @@
        }
        // searchStr += '         and Account.parent.parentid = :HPId ';
        // SWAG-BB44G7  检索所在医院的客户人员 end
        if (searchCon.Search_LastName__c != null && searchCon.Search_LastName__c != '') {
            searchStr += '     and LastName like \'%' + searchCon.Search_LastName__c + '%\'';
        //2022/02/15 张华建 检索 start
        // if (searchCon.Search_LastName__c != null && searchCon.Search_LastName__c != '') {
        //     searchStr += '     and LastName like \'%' + searchCon.Search_LastName__c + '%\'';
        // }
        // if (searchCon.Search_FirstName__c != null && searchCon.Search_FirstName__c != '') {
        //     searchStr += '     and FirstName like \'%' + searchCon.Search_FirstName__c + '%\'';
        // }
        System.debug('awsDataIdArray = ' + awsDataIdArray);
        if (awsDataIdArray != null && awsDataIdArray != '') {
            String[] arr = awsDataIdArray.split(',');
            System.debug('arr = ' + arr);
            String awsDataIdSql = '';
            for(String s : arr){
                System.debug('s = ' + s);
                awsDataIdSql = awsDataIdSql + ',' + '\'' + s+'\'';
        }
        if (searchCon.Search_FirstName__c != null && searchCon.Search_FirstName__c != '') {
            searchStr += '     and FirstName like \'%' + searchCon.Search_FirstName__c + '%\'';
            awsDataIdSql = awsDataIdSql.substring(1);
            System.debug('awsDataIdSql = ' + awsDataIdSql);
            searchStr += ' and AWS_Data_Id__c in (' + awsDataIdSql + ')';
        }
        //2022/02/15 张华建 检索 end
        system.debug('=====searchStr:' + searchStr);
        List<Contact> searchResult = Database.query(searchStr);
@@ -87,8 +128,8 @@
    public PageReference editContact() {
        if (conId != null && conId != '') {
            newCon = [select Id, Name, Department__c, Type__c, Search_LastName__c, Search_FirstName__c, Phone, Supplement__c,
                      FirstName, LastName
            newCon = [select Id, Name, Department__c, Type__c, Search_LastName__c, Search_FirstName__c, Phone, Supplement__c,LastName_Encrypted__c,Phone_Encrypted__c,
                      FirstName, LastName,AWS_Data_Id__c
                      from Contact where Id = :conId];
            newCon.Search_LastName__c = newCon.LastName;
            newCon.Search_FirstName__c = newCon.FirstName;
@@ -120,6 +161,11 @@
        return null;
    }
    public PageReference clearLineInfoList()  {
        lineInfoList = new List<LineInfo>();
        return null;
    }
    class LineInfo {
        public Integer lineNo { get; set; }
        public Contact con { get; set; }
force-app/main/default/classes/CM_SearchContactServiceController.cls
@@ -8,10 +8,35 @@
    private String accountId;
    private String nowValue;
    public String staticResource {get; set;}
    public String contactAWSIds {set;get;}
    public String contactsInfo {set;get;}
    public String awsDataIdArray {set;get;}
    public CM_SearchContactServiceController() {
        openLine = Apexpages.currentPage().getParameters().get('line');
        accountId = Apexpages.currentPage().getParameters().get('acc');
        nowValue = Apexpages.currentPage().getParameters().get('now');
        //2022/02/15 张华建 PI PL start
        //1. Query Contact by accountId
        List<Contact> conList = new List<Contact>();
        system.debug('Account Id from Front-end:'+accountId);
        if(String.isNotBlank(accountId) && String.isNotEmpty(accountId)){
            conList = new List<Contact>([select Id,AWS_Data_Id__c from Contact where AccountId=:accountId and AWS_Data_Id__c!='']);
        }
        //2. Prepare the Contact Info
        Map<String,Contact> awsIdToContactMap = new Map<String,Contact>();
        List<String> conAWSIds = new List<String>();
        for(Contact con:conList){
            conAWSIds.add(con.AWS_Data_Id__c);
            awsIdToContactMap.put(con.AWS_Data_Id__c,con);
        }
        //conAWSIds.add('943114607025717249');
        contactsInfo = JSON.serialize(awsIdToContactMap);
        contactAWSIds = JSON.serialize(conAWSIds);
        staticResource = JSON.serialize(PIHelper.getPIIntegrationInfo('Contact'));
        //2022/02/15 张华建 PI PL end
    }
    public void init() {
@@ -34,17 +59,35 @@
    public PageReference searchContact() {
        String searchStr = 'select Id, Name, Department__c, Type__c, AccountName__c, Supplement__c, Phone ';
        String searchStr = 'select Id, Name, Department__c, Type__c, AccountName__c, Supplement__c, Phone,AWS_Data_Id__c ';
         searchStr += ', City__c , State__c '; //2018/11/19 HWAG-B399RW 读取省和市
        searchStr += '        from Contact ';
        searchStr += '       where Isactive__c = \'有效\' ';
        searchStr += '       where Isactive__c = \'有效\' and AWS_Data_Id__c!=\'\' ';
        searchStr += '         and AccountId = :accountId ';
        if (searchCon.Search_LastName__c != null && searchCon.Search_LastName__c != '') {
            searchStr += '     and LastName like \'%' + searchCon.Search_LastName__c + '%\'';
        //2022/02/15 张华建 检索 start
        // if (searchCon.Search_LastName__c != null && searchCon.Search_LastName__c != '') {
        //     searchStr += '     and LastName like \'%' + searchCon.Search_LastName__c + '%\'';
        // }
        // if (searchCon.Search_FirstName__c != null && searchCon.Search_FirstName__c != '') {
        //     searchStr += '     and FirstName like \'%' + searchCon.Search_FirstName__c + '%\'';
        // }
        System.debug('awsDataIdArray = ' + awsDataIdArray);
        if (awsDataIdArray != null && awsDataIdArray != '') {
            String[] arr = awsDataIdArray.split(',');
            System.debug('arr = ' + arr);
            String awsDataIdSql = '';
            for(String s : arr){
                System.debug('s = ' + s);
                awsDataIdSql = awsDataIdSql + ',' + '\'' + s+'\'';
        }
        if (searchCon.Search_FirstName__c != null && searchCon.Search_FirstName__c != '') {
            searchStr += '     and FirstName like \'%' + searchCon.Search_FirstName__c + '%\'';
            awsDataIdSql = awsDataIdSql.substring(1);
            System.debug('awsDataIdSql = ' + awsDataIdSql);
            searchStr += ' and AWS_Data_Id__c in (' + awsDataIdSql + ')';
        }
        //2022/02/15 张华建 检索 end
        system.debug('=====searchStr:' + searchStr);
        List<Contact> searchResult = Database.query(searchStr);
@@ -64,8 +107,8 @@
    public PageReference editContact() {
        if (conId != null && conId != '') {
            newCon = [select Id, Name, Department__c, Type__c, Search_LastName__c, Search_FirstName__c, Phone, Supplement__c,
                             FirstName, LastName
            newCon = [select Id, Name, Department__c, Type__c, Search_LastName__c, Search_FirstName__c, Phone, Supplement__c,LastName_Encrypted__c,Phone_Encrypted__c,
                      FirstName, LastName,AWS_Data_Id__c
                        from Contact where Id = :conId];
            newCon.Search_LastName__c = newCon.LastName;
            newCon.Search_FirstName__c = newCon.FirstName;
@@ -97,6 +140,11 @@
        return null;
    }
    public PageReference clearLineInfoList()  {
        lineInfoList = new List<LineInfo>();
        return null;
    }
    class LineInfo {
        public Integer lineNo { get; set; }
        public Contact con { get; set; }
force-app/main/default/classes/CampaignMemberController.cls
@@ -10,9 +10,12 @@
    public String saveflg { get; set; }
    public String errorStr { get; set; }
    // 20220216 PI改造 by 徐亮
    public String staticResource {get; set;}
    public CampaignMemberController() {
        campaignId = ApexPages.currentPage().getParameters().get('id');
        staticResource = JSON.serialize(PIHelper.getPIIntegrationInfo('Contact')); // 20220216 PI改造 by 徐亮
    }
    public Integer getLineInfoListSize() {
@@ -35,9 +38,10 @@
        localuser = [select id, State_Hospital__c from User where id = :UserInfo.getUserId()];
        // 20220216 PI改造 by 徐亮
        List<CampaignMember__c> cmList = [
                                             select id, Name, Campaign__c, Department__c, Department_ID__c, Opportunity__c, Opportunity_ID__c,
                                             Contact__c, Contact_ID__c, Type__c, Contact_ID__r.Strategic_dept_Class__r.Name
                                             Contact__c, Contact_ID__c, Type__c, Contact_ID__r.Strategic_dept_Class__r.Name, Contact_ID__r.AWS_Data_Id__c
                                             from CampaignMember__c
                                             where Campaign__c = :campaignId];
force-app/main/default/classes/CampaignMemberServiceController.cls
@@ -10,9 +10,12 @@
    public String saveflg { get; set; }
    public String errorStr { get; set; }
    // 20220216 PI改造 by 徐亮
    public String staticResource {get; set;}
    public CampaignMemberServiceController() {
        campaignId = ApexPages.currentPage().getParameters().get('id');
        staticResource = JSON.serialize(PIHelper.getPIIntegrationInfo('Contact')); // 20220216 PI改造 by 徐亮
    }
    public Integer getLineInfoListSize() {
@@ -35,9 +38,10 @@
        localuser = [select id, State_Hospital__c from User where id = :UserInfo.getUserId()];
        // 20220216 PI改造 by 徐亮
        List<CampaignMember__c> cmList = [
                                             select id, Name, Campaign__c, Department__c, Department_ID__c, Opportunity__c, Opportunity_ID__c,
                                             Contact__c, Contact_ID__c, Type__c, Contact_ID__r.Strategic_dept_Class__r.Name
                                             Contact__c, Contact_ID__c, Type__c, Contact_ID__r.Strategic_dept_Class__r.Name, Contact_ID__r.AWS_Data_Id__c
                                             , State__c, City__c // 2018/11/19 HWAG-B399RW 获取参会人员所在省和市
                                             from CampaignMember__c
                                             where Campaign__c = :campaignId];
force-app/main/default/classes/ConsumFixtureSetSelectController.cls
force-app/main/default/classes/ConsumReassignController.cls
@@ -1,4 +1,5 @@
public with sharing class ConsumReassignController {
    public string staticResource { get; private set; }
    // 明细行项目
    public List<LineInfo> lineInfoList { get; set; }
    //备品申请书ID
@@ -12,6 +13,7 @@
    public ConsumReassignController() {
        //Apexpages.currentPage().getHeaders().put('X-UA-Compatible', 'IE=8');
        caId = ApexPages.currentPage().getParameters().get('caid');
        staticResource = JSON.serialize(PIHelper.getPIIntegrationInfo('Consum_Apply_Equipment_Set_Detail__c'));
    }
    // 画面初始化
@@ -24,6 +26,7 @@
            // 耗材借出申请
            caesdList = [
                SELECT Id
                     , AWS_Data_Id__c
                     , Fixture_Model_No_F__c
                     , Asset__c
                     , Consum_Start_Date__c
force-app/main/default/classes/ConsumTrialController.cls
@@ -15,6 +15,8 @@
    public Boolean showEditButton{get;set;}
    private String case_OR_animal_organLabel{get;set;}
    private String saveType{get;set;}
    public String staticResource {get; set;}
    public String rowListString{set;get;}
    public ConsumTrialController(ApexPages.StandardController stdController) {
        parId = System.currentPageReference().getParameters().get('Id');
@@ -25,6 +27,8 @@
        if (String.isBlank(parId)) {
            parId = stdController.getId();
        }
        PIHelper.PIIntegration piIntegration = PIHelper.getPIIntegrationInfo('Consum_Apply_Equipment_Set_Detail__c');
        staticResource = JSON.serialize(piIntegration);
    }
    public void init() {
@@ -36,6 +40,7 @@
                        // , DateOfDelivery__c
                        // , ReceivingNoteNo__c
                        , Status__c
                        ,AWS_Data_Id__c
                        // , Asset_loaner_category__c
                        , RA_Status__c
                        , demo_purpose2__c
@@ -63,6 +68,7 @@
            assetFieldApiList.addAll(assetFieldApiSet);
            receivingNoteFieldApiList.addAll(receivingNoteFieldApiSet);
            pageB = new PageBean(rnList[0], assetFieldApiList, receivingNoteFieldApiList);
            rowListString = JSON.serialize(pageB.rowBList);
            showEditButton = (rnList[0].Status__c != '申请中' && rnList[0].Status__c != '取消');
        }
        catch (Exception e) {
@@ -408,6 +414,7 @@
                    + String.join(assetFieldApiList, ',')
                    + (assetFieldApiList.size() > 0 ? ',' : '')
                    + String.join(receivingNoteFieldApiList, ',')
                    + ',AWS_Data_Id__c'
                 + ' FROM Consum_Apply_Equipment_Set_Detail__c '
                + ' WHERE Consum_Apply_Equipment_Set__r.Consum_Apply__c = \'' + rn.Id + '\'' + wher
                  + ' AND (Cancel_Select__c = false OR NG_Select_Again__c = true)'
@@ -477,7 +484,7 @@
            // dataConfirmation = rnd1.DataConfirmation__c;
            lineNo = lineNo1 + 1;
            canChangeField = 'Show_demonstration__c, Operation_Type__c, Consum_Start_Date__c';
            canChangeField += ', Case_OR_animal_organ__c, Trial_User__c, Follower_User__c, Spare__c, Comment__c, Degree_Of_Importance__c';
            canChangeField += ',AWS_Data_Id__c, Case_OR_animal_organ__c, Trial_User__c, Follower_User__c, Spare__c, Comment__c, Degree_Of_Importance__c';
            haveAsset = String.isNotBlank(rnd1.Asset__c);
        }
force-app/main/default/classes/ConsumTrialPDFController.cls
@@ -21,12 +21,17 @@
    public Integer consumApplySetDetailListSize { get; set; }  // 耗材备品总数量
    public String errorMsg { get; set; }  // 错误信息
    public string staticResource { get; private set; }
    public string BRSrc{get;private set;}
    public string QRSrc{get;private set;}
    public ConsumTrialPDFController() {
        targetConsumApplyId = ApexPages.currentPage().getParameters().get('id');
        if (String.isBlank(targetConsumApplyId)) {
            throw new ControllerUtil.myException('参数错误:请指定Id。');
        }
        pdfPageList = new List<PdfPageClass>();
        staticResource = JSON.serialize(PIHelper.getPIIntegrationInfo('Consum_Apply_Equipment_Set_Detail__c'));
    }
    /**
@@ -40,6 +45,10 @@
            ApexPages.addMessage(new ApexPages.Message(ApexPages.severity.ERROR, errorMsg));
            return;
        }
        BRSrc = GetImageBase64(targetConsumApply.BRId__c);
        QRSrc = GetImageBase64(targetConsumApply.QRId__c);
        // 获取耗材备品配套一览明细
        List<Consum_Apply_Equipment_Set_Detail__c> targetConsumSetDetailList = getTargetConsumSetDetailList();
@@ -139,6 +148,7 @@
                     , Follower_User__r.Name
                     , Spare__c  // 备用
                     , Comment__c  // 备注
                     , AWS_Data_Id__c
                     , ManagementCode__c  // 管理编码 yc 耗材追溯
                     , EquipmentManagementCode__c  // 备品管理码 yc 耗材追溯
                  FROM Consum_Apply_Equipment_Set_Detail__c
@@ -207,4 +217,12 @@
            equipSetDetailList = new List<Consum_Apply_Equipment_Set_Detail__c>();
        }
    }
    public static string GetImageBase64(string id){
        List<Attachment> atts = [SELECT Id, IsDeleted, ParentId, Name, IsPrivate, ContentType, BodyLength, Body, OwnerId, CreatedDate, CreatedById, LastModifiedDate, LastModifiedById, SystemModstamp, Description FROM Attachment where id=:id];
        if (atts.size()==0) {
            return null;
        }
        return 'data:image/png;base64,' + EncodingUtil.base64Encode(atts[0].body);
    }
}
force-app/main/default/classes/FixtureRentalPDFController.cls
@@ -30,12 +30,18 @@
    public String centreAddress { get; set; }
    public Boolean IsShowLU { get; set; } //是否显示签收单左上角文字 true显示 20201119 LJH OCSM_BP5-61 add
    public Boolean IsMain; //是否是现地分配的主单 20201120 LJH OCSM_BP5-61 add
    public string staticResource { get; private set; }
    public Boolean addFlag { get; private set; }//敏感地址使用标记
    public String qrcode { get; private set; }
    public FixtureRentalPDFController() {
        pageNum = Integer.valueOf(ApexPages.currentPage().getParameters().get('page'));
        rentalApplyIdIMG = ApexPages.currentPage().getParameters().get('raid');
        //Apexpages.currentPage().getHeaders().put('X-UA-Compatible', 'IE=8');
        // rentalApplyId = ApexPages.currentPage().getParameters().get('raid');//20201120 ljh 
        String tempStr = ApexPages.currentPage().getParameters().get('raid');
        staticResource = JSON.serialize(PIHelper.getPIIntegrationInfo('Rental_Apply__c'));
        addFlag = false;
        rentalApplyId = new List<String>();
        if(tempStr != null){
           rentalApplyId.add(tempStr); 
@@ -96,13 +102,17 @@
                                Root_Rental_Apply__c,//20210617 ljh 1732 add
                                BRId__c, // 20211209 ljh SFDC-C923SR add 
                                QRImg__c,
                                QRId__c
                                QRId__c,
                                AWS_Data_Id__c,//20220304
                                Direct_Shippment_Address_Encrypt__c,//20220304
                                Phone_Number_Encrypt__c//20220304
                        from  Rental_Apply__c
                        where id = :rentalApplyId];
        }
        if(ApplyList.size()>0){
            ApplyHeadShow = ApplyList[0];
            qrcode = ConsumTrialPDFController.GetImageBase64(ApplyHeadShow.QRId__c);
        }
        //增加借出备品SET一览List,为了获取借出备品SET一览明细
        List<String> RAESSearchList = New List<String>();
@@ -191,6 +201,7 @@
            ShippMentAdr = ApplyHeadShow.Shippment_adress_detail__c;
        } else {
            ShippMentAdr = ApplyHeadShow.Direct_shippment_address__c;
            addFlag = true;
        }
        Integer ShipAdrSize = ShippMentAdr == null ? 0 : ShippMentAdr.length();
@@ -313,7 +324,6 @@
                        Rental_Apply_Equipment_Set__r.Name,
                        Rental_Apply_Equipment_Set__r.Fixture_Set__r.Name,
                        Rental_Apply_Equipment_Set__r.Loaner_code__c,
                        // Rental_Apply_Equipment_Set__r.Received_ng_detail__c,// 20220124 ljh SFDC-C4U3PH add start
                        FSD_Name_CHN__c,
                        Fixture_Name_text__c,
                        Fixture_Model_No_F__c,
@@ -607,8 +617,6 @@
        public String dQRCode { get; private set; }  //  二维码
        private Integer maxLineContact;
        public String wh_location { get; private set; }  //  货位号
        // 20220124 ljh SFDC-C4U3PH add start
        // public String Received_ng_detail { get; private set; }  //  收到确认NG内容
        public String name1 { get; private set; }
@@ -672,7 +680,6 @@
           //serialNumber2 = esd2.SerialNumber__c;
           height = height ==null ? MAXLINEHRIGHT: height;
           wh_location = raesd.Asset__r.WH_location__c;
           // Received_ng_detail = raesd.Rental_Apply_Equipment_Set__r.Received_ng_detail__c; // 20220124 ljh SFDC-C4U3PH add start
        }
    }
    // Data Bean
force-app/main/default/classes/InsReportPDFController.cls
@@ -11,6 +11,10 @@
    public String endfen {get;set;}
    //add by rentx 20210707 end
    
    // 20220222 PI改造 by Bright---start
    public string staticResource { get; private set; }
    // 20220222 PI改造 by Bright---end
    public Integer getItemCount() {
        return itemList.size();
    }
@@ -27,6 +31,12 @@
    
    private static Integer commentMax = 15;
    
    public InsReportPDFController(){
        // 20220222 PI改造 by Bright---start
        staticResource = JSON.serialize(PIHelper.getPIIntegrationInfo('Inspection_Report__c'));
        // 20220222 PI改造 by Bright---end
    }
    public void init() {
        //add by rentx 20210707 start
        startfen = '';
force-app/main/default/classes/InstructReportController.cls
@@ -6,9 +6,14 @@
    public list<InstructedstaffInfo> checkedISList { get; private set; }
    public list<InstructedstaffInfo> uncheckedISList { get; private set; }
    public boolean ReadOnly { get; private set; }
    // 20220222 PI改造 by Bright--start
    public string staticResource { get; private set; }
    // 20220222 PI改造 by Bright--end
    public InstructReportController() {
        this.ReadOnly = true;
        staticResource = JSON.serialize(PIHelper.getPIIntegrationInfo('Contact'));// 20220222 PI改造 by Bright
    }
    public InstructReportController(ApexPages.StandardController controller) {
        this();
@@ -102,6 +107,7 @@
                                             Is_Active_Formula__c
                                             //增加检索 有效/无效 精琢技术 wql 2021/02/04 end
                                             ,Contact_ID__c, Contact_ID__r.Name,
                                             Contact_ID__r.AWS_Data_Id__c,// 20220222 PI改造 by Bright
                                             // LJPH-BVNBMM start
                                             Contact_ID__r.AccountId,
                                             Department_Service__c,
@@ -123,6 +129,7 @@
             ,Is_Active_Formula__c
             //增加检索 有效/无效 精琢技术 wql 2021/02/04 end
             , ContactID__C
             ,ContactID__r.AWS_Data_Id__c// 20220222 PI改造 by Bright
             //带教报告 新增查询字段:带教地点、带教地点(其他)、设备类别、具体型号、备注 精琢技术 wql 2020/04/14 start
             , Instruct_place_other__c, Specific_model__c,
             Instruct_remarks__c, Equipment_category__c, Instruct_place__c, Instruct_content__c
@@ -169,12 +176,14 @@
        for (InstructedstaffInfo uncheckedIS : uncheckedISList) {
            if (uncheckedIS.rec_checkBox) {
                System.debug('uncheckedIS.CamMem.Contact_ID__r='+uncheckedIS.CamMem.Contact_ID__r.AWS_Data_Id__c);
                uncheckedIS.IS = new Instructed_staff__c(Name = uncheckedIS.CamMem.Contact_ID__r.Name,
                        // LJPH-BVNBMM 改为同步当前联系人所在的科室 start
                        Department__c = uncheckedIS.CamMem.Contact_ID__r.AccountId,
                        // LJPH-BVNBMM 改为同步当前联系人所在的科室 start
                        CampaignMember__c = uncheckedIS.CamMem.id,
                        ContactID__c = uncheckedIS.CamMem.Contact_ID__c
                        ContactID__c = uncheckedIS.CamMem.Contact_ID__c,
                        ContactID__r = uncheckedIS.CamMem.Contact_ID__r // 20220222 PI改造 by Bright
                         );
                uncheckedIS.lineNo = temuncheckedISList.size();
                temcheckedISList.add(uncheckedIS);
force-app/main/default/classes/LayoutDescriberHelper.cls
@@ -10,11 +10,29 @@
public class LayoutDescriberHelper {
    public static String urlPrefixToUse {get;set;}
    public static List<String> requiredFieldAPIList{set;get;}
    public static Map<String,String> fieldAPIToLabelMap{set;get;}
    public static Set<String> CaseWebFields = new Set<String>{'SuppliedCompany','SuppliedName','SuppliedEmail','SuppliedPhone'};
    public static Set<String> ConcatenationNameSType = new Set<String>{'Lead','Contact'};  
    public static LayoutWrapper describeSectionWithFieldsWrapper(Id recordTypeId, String objectType,String userMode){
        if(String.isEmpty(recordTypeId)){
            //Assign default record type for sobject
            recordTypeId = getDefaultRecordType(objectType);
        }
        List<LayoutSection> layoutSections = describeSectionWithFields(recordTypeId,objectType,userMode);
        LayoutWrapper layoutWrapperValue = new LayoutWrapper();
        layoutWrapperValue.layoutSections = layoutSections;
        layoutWrapperValue.requiredFieldAPIList = requiredFieldAPIList;
        layoutWrapperValue.fieldAPIToLabelMap = fieldAPIToLabelMap;
        system.debug('required API List:'+JSON.serialize(requiredFieldAPIList));
        return layoutWrapperValue;
    }
    public static List<LayoutSection> describeSectionWithFields(Id recordTypeId, String objectType,String userMode){
        system.debug('record type id ===>'+ recordTypeId+' object type===>'+objectType + ' userMode===>'+userMode);
        List<LayoutSection> layoutSections;
        Map<String,List<LayoutField>> layoutFields;
        requiredFieldAPIList = new List<String>();
        fieldAPIToLabelMap = new Map<String,String>();
        layoutSections = new List<LayoutSection>();
        String theRespBody = getLayoutSchema(recordTypeId, objectType,userMode);      
        Map<String, Object> layoutSection = (Map<String, Object>) JSON.deserializeUntyped(theRespBody);
@@ -87,6 +105,7 @@
                                    lf.isPlaceHolder = placeholderF;
                                    lf.editableField = isEditable;
                                    lf.fieldAPI = fieldLabelPrefix+addressType;
                                    lf.fieldLabel = fieldLabelPrefix+' '+addressType;
                                    lf.fieldType = 'string';
                                    if(ls.Name != '' || layoutSections.size() == 1){
@@ -94,11 +113,20 @@
                                    }else if(layoutSections.size() - 2 >= 0){
                                        layoutSections.get(layoutSections.size() - 2).layoutFields.add(lf); 
                                    }                                                                  
                                    if(lf.isRequired){
                                        requiredFieldAPIList.add(lf.fieldAPI);
                                    }
                                    if(string.isBlank(lf.fieldAPI)){
                                        system.debug('==================================2');
                                        continue;
                                    }else{
                                        fieldAPIToLabelMap.put(lf.fieldAPI,lf.fieldLabel);
                                    }
                                }
                                continue;
                            }
                            if(userMode == 'classic' && apiName == 'Name' && ConcatenationNameSType.contains(objectType)){
                                List<String> nameDetail = new List<String>{'LastName'};
                                List<String> nameDetail = new List<String>{'Salutation','LastName'};
                                for(String nameField:nameDetail){
                                    LayoutField lf = new LayoutField();
                                    lf.isRequired = (Boolean)fields.get('required');
@@ -112,7 +140,19 @@
                                    }else if(layoutSections.size() - 2 >= 0){
                                        layoutSections.get(layoutSections.size() - 2).layoutFields.add(lf); 
                                    }                                                                  
                                    if(lf.isRequired){
                                        requiredFieldAPIList.add(lf.fieldAPI);
                                }
                                    if(string.isBlank(lf.fieldAPI)){
                                        system.debug('==================================3');
                                        continue;
                                    }else{
                                        fieldAPIToLabelMap.put(lf.fieldAPI,lf.fieldLabel);
                                    }
                                }
                                continue;
                            }
                            if(objectType == 'Case' && CaseWebFields.contains(apiName)){
                                continue;
                            }
                            LayoutField lf = new LayoutField();
@@ -127,6 +167,16 @@
                            }else if(layoutSections.size() - 2 >= 0){
                                layoutSections.get(layoutSections.size() - 2).layoutFields.add(lf);
                            }                               
                            if(lf.isRequired){
                                requiredFieldAPIList.add(lf.fieldAPI);
                            }
                            if(string.isBlank(lf.fieldAPI)){
                                system.debug('==================================1');
                                continue;
                            }else{
                                fieldAPIToLabelMap.put(lf.fieldAPI,lf.fieldLabel);
                            }
                            priorFieldLayoutAdded = true;
                        }else
                            priorFieldLayoutAdded = false;
@@ -138,6 +188,7 @@
            }
        }
        System.debug('Layout Section Result:'+JSon.serialize(layoutSections));
        system.debug('required API List:'+JSON.serialize(requiredFieldAPIList));
        return layoutSections;
    }
    public static String getUrlPrefix(){
@@ -159,6 +210,7 @@
        req.setMethod('GET');        
        if(userMode =='lightning'){
            req.setEndPoint('callout:SF_Rest_API'+urlPost);
            system.debug('callout:SF_Rest_API'+urlPost);
        }else if(userMode == 'classic'){
            req.setEndpoint(urlForClassic); 
            req.setHeader('Authorization', 'Bearer ' + UserInfo.getsessionid());
@@ -169,8 +221,10 @@
        return resp.getBody();
    }
    public static Id  getDefaultRecordType(SObject obj) {
        Schema.DescribeSObjectResult describeResult = obj.getsObjectType().getDescribe();
    public static Id  getDefaultRecordType(String ObjectName) {
        Map<String, Schema.SObjectType> GlobalDescribeMap = Schema.getGlobalDescribe();
        Schema.SObjectType obj = GlobalDescribeMap.get(ObjectName);
        Schema.DescribeSObjectResult describeResult = obj.getDescribe();
        List<Schema.RecordTypeInfo> rtInfos = describeResult.getRecordTypeInfos();
        for(Schema.RecordTypeInfo rtInfo : rtInfos) {
            if(rtInfo.DefaultRecordTypeMapping) {              
@@ -179,7 +233,11 @@
        }
        return null;
    }
    public class LayoutWrapper{
        @AuraEnabled public List<LayoutSection> layoutSections{set;get;}
        @AuraEnabled public List<String> requiredFieldAPIList{set;get;}
        @AuraEnabled public Map<String,String> fieldAPIToLabelMap{set;get;}
    }
    public class LayoutSection{
        @AuraEnabled public boolean useHeader {get;set;}
        @AuraEnabled public String name {get;set;}
force-app/main/default/classes/LeadIntentionController.cls
@@ -1,4 +1,4 @@
public with sharing class LeadIntentionController {
public without sharing class LeadIntentionController {
        public List<PCLInfo> pclInfos { get; set; }
    
    /*****************検索用******************/
@@ -72,6 +72,8 @@
    private String soqlForMoneyWithoutSort = null;
    private static Integer searchLimit = 1000;
    public String staticResource {get; set;}
    public String awsDataIds {get; set;}
    public LeadIntentionController() {
        pclInfos = new List<PCLInfo>();
@@ -134,6 +136,7 @@
        isActiveFormula = '有效';
        staticResource = JSON.serialize(PIHelper.getPIIntegrationInfo('Inquiry_form__c'));
    }
    public PageReference init() {
@@ -179,6 +182,11 @@
        pclCount = pclInfos.size();
        ApexPages.addmessage(new ApexPages.message(ApexPages.severity.INFO, '取得最近的 ' + pclCount + ' 条数据'));
        
        List<String> a = new List<String>();
        for(Inquiry_form__c ifc : queryList){
            a.add(ifc.AWS_Data_Id__c);
        }
        awsDataIds = JSON.serialize(a);
        return null;
    }
@@ -355,7 +363,7 @@
                + ' Opp_Name_Search__c, Opportunity_Division__c, LeadSource__c, Campaign__c,'
                + ' Urgent__c, Request_Detail__c ,Contact_Id__c,Hospital_ID__c,Department_ID__c,Opp_Name_Search_ID__c,'
                + 'Campaign_ID__c,Last_Name__c,Family_Name__c,Name,Reasons_options__c,'
                + 'Product1__c,Confirmation_Date__c'
                + 'Product1__c,Confirmation_Date__c,AWS_Data_Id__c'
                //,Lead_link__c
                + ' from Inquiry_form__c where Id != null ';
                //2021-11-24  mzy  共通平台项目-首页修改  start
force-app/main/default/classes/LightningUtil.cls
@@ -16,6 +16,21 @@
        return [select Id, Agency_Hospital__c, IsOlympusContact__c, Name, Doctor_Division1__c, Type__c, Hospital_DC_Name__c,Department_Cateogy_F__c,Hospital_Name__c from Agency_Contact__c 
                    where (Department_Class__r.Hospital_Department_Class__c in :hospitalSet or (Department_Class__c = null and Agency_Hospital__c in :aHospitalSet)) and Name like :conStr and Hospital_DC_Name__c like :hosStr order by Name];
    }
    // 20220222 PI改造 by Bright--start
    public static List<Agency_Contact__c> searchOCMAgencyContact(Set<String> hospitalSet, Set<String> aHospitalSet, String hosStr, List<string> awsids) {
        string sql = 'select Id, Agency_Hospital__c, IsOlympusContact__c, Name, Doctor_Division1__c, Type__c, Hospital_DC_Name__c,Department_Cateogy_F__c,Hospital_Name__c,AWS_Data_Id__c from Agency_Contact__c';
        sql += ' where (Department_Class__r.Hospital_Department_Class__c in :hospitalSet or (Department_Class__c = null and Agency_Hospital__c in :aHospitalSet)) and Hospital_DC_Name__c like :hosStr';
        if (awsids!=null && awsids.size()>0) {
            sql += ' and AWS_Data_Id__c in :awsids ';
        }
        sql += ' order by Hospital_DC_Name__c';
        system.debug('sql='+sql);
        return Database.query(sql);
    }
    // 20220222 PI改造 by Bright--end
    public static List<Contact> selectContact(String cId) {
        return [select Id, AccountId, Name from Contact where id=:cId];
    }
@@ -67,6 +82,21 @@
        // return data;
    }
    // PIPL update Yin Mingjie 21/02/2022 start
    public static Map<String, String> insertAgencyContact(Agency_Contact__c data) {
        Map<String, String> acmap = new Map<String, String>();
        acmap.put('AgencyContactId', '');
        acmap.put('errormsg', '');
        try {
            insert data;
            acmap.put('AgencyContactId', data.Id);
        } catch (Exception e) {
            acmap.put('errormsg', e.getMessage());
        }
        return acmap;
    }
    // PIPL update Yin Mingjie 21/02/2022 end
    public static Agency_Report__c insertAgencyReport(Agency_Report__c data) {
        if (String.isBlank(data.Hospital__c)) {
            List<Agency_Hospital_Link__c> agency_hospital_link = [select Id, Hospital__c from Agency_Hospital_Link__c where Id=:data.Agency_Hospital__c];
@@ -117,6 +147,7 @@
            List<Contact> person_list = selectAgencyPerson();
            return [Select Id, Name, Report_Date__c, Product_Category1__r.Name, Product_Category2__r.Name, Product_Category3__r.Name, Product_Category1__c, Product_Category2__c, Product_Category3__c,ConsumptionOfConsumables__c, WorkMark__c,warlocksNumber__c,Department_Cateogy__c,ProductClassification__c,WarlockClassification__r.WarlockClassification__c,WarlockClassification__c,ProductCcategory__c, ProductCcategory__r.ProductCcategory__c,productCategories__c, productCategories__r.productCategories__c,DealerPersonnel__c,WorkRecord__c, Agency_Report_Header__c, Agency_Hospital__r.Name, Agency_Hospital__r.Hospital__c, OppName__c,
                            Person_In_Charge2__c,DealerPersonnel__r.Name, Person_In_Charge2__r.Name, doctor2__c, doctor2__r.Name, Submit_date__c,
                            doctor2__r.AWS_Data_Id__c,// 20220222 PI改造 by Bright
                            Product_Category__c, Product_Category__r.Name, Result__c, visitor_title__c, Opportunity__c, Opportunity__r.Name,EffectProgress__r.EffectProgress__c,EffectProgress__c,
                            UseProduct1__c,UseProduct2__c,UseProduct3__c,UseProduct1__r.Name,UseProduct2__r.Name,UseProduct3__r.Name    
                            From Agency_Report__c
@@ -124,6 +155,7 @@
        } else {
            return [Select Id, Name, Report_Date__c, Product_Category1__r.Name, Product_Category2__r.Name, Product_Category3__r.Name, Product_Category1__c, Product_Category2__c, Product_Category3__c,ConsumptionOfConsumables__c, WorkMark__c,warlocksNumber__c,Department_Cateogy__c,DealerPersonnel__c,ProductClassification__c,WarlockClassification__r.WarlockClassification__c,WarlockClassification__c,ProductCcategory__c,ProductCcategory__r.ProductCcategory__c, productCategories__c, productCategories__r.productCategories__c,WorkRecord__c, Agency_Report_Header__c, Agency_Hospital__r.Name, Agency_Hospital__r.Hospital__c, OppName__c,
                            Person_In_Charge2__c,DealerPersonnel__r.Name, Person_In_Charge2__r.Name, doctor2__c, doctor2__r.Name, Submit_date__c,
                            doctor2__r.AWS_Data_Id__c,// 20220222 PI改造 by Bright
                            Product_Category__c, Product_Category__r.Name, Result__c, visitor_title__c, Opportunity__c, Opportunity__r.Name,EffectProgress__r.EffectProgress__c,EffectProgress__c,
                            UseProduct1__c,UseProduct2__c,UseProduct3__c,UseProduct1__r.Name,UseProduct2__r.Name,UseProduct3__r.Name   
                            From Agency_Report__c
@@ -138,12 +170,14 @@
            return [Select Id, Name, Report_Date__c, Product_Category1__r.Name, Product_Category2__r.Name, Product_Category3__r.Name, Product_Category1__c, Product_Category2__c, Product_Category3__c,ConsumptionOfConsumables__c, WorkMark__c,warlocksNumber__c,Department_Cateogy__c,ProductClassification__c,WarlockClassification__r.WarlockClassification__c,WarlockClassification__c,ProductCcategory__c,ProductCcategory__r.ProductCcategory__c,productCategories__c, productCategories__r.productCategories__c, DealerPersonnel__c,WorkRecord__c, Agency_Report_Header__c, Agency_Hospital__r.Name, Agency_Hospital__r.Hospital__c, OppName__c,
                            Person_In_Charge2__c,DealerPersonnel__r.Name, Person_In_Charge2__r.Name, doctor2__c, doctor2__r.Name, Submit_date__c,
                            Product_Category__c, Product_Category__r.Name, Result__c, visitor_title__c, Opportunity__c, Opportunity__r.Name,EffectProgress__r.EffectProgress__c,EffectProgress__c,
                            doctor2__r.AWS_Data_Id__c,// 20220222 PI改造 by Bright
                            UseProduct1__c,UseProduct2__c,UseProduct3__c,UseProduct1__r.Name,UseProduct2__r.Name,UseProduct3__r.Name    
                            From Agency_Report__c
                            where Submit_date__c=:week and Person_In_Charge2__c in :person_list and WeeklyReportClassification__c != '' order by LastModifiedDate desc];
        } else {
            return [Select Id, Name, Report_Date__c, Product_Category1__r.Name, Product_Category2__r.Name, Product_Category3__r.Name, Product_Category1__c, Product_Category2__c, Product_Category3__c,ConsumptionOfConsumables__c, WorkMark__c,warlocksNumber__c,Department_Cateogy__c,DealerPersonnel__c,ProductClassification__c,WarlockClassification__r.WarlockClassification__c,WarlockClassification__c,ProductCcategory__c,ProductCcategory__r.ProductCcategory__c,productCategories__c, productCategories__r.productCategories__c, WorkRecord__c, Agency_Report_Header__c, Agency_Hospital__r.Name, Agency_Hospital__r.Hospital__c, OppName__c,
                            Person_In_Charge2__c,DealerPersonnel__r.Name, Person_In_Charge2__r.Name, doctor2__c, doctor2__r.Name, Submit_date__c,
                            doctor2__r.AWS_Data_Id__c,// 20220222 PI改造 by Bright
                            Product_Category__c, Product_Category__r.Name, Result__c, visitor_title__c, Opportunity__c, Opportunity__r.Name,EffectProgress__r.EffectProgress__c,EffectProgress__c,
                            UseProduct1__c,UseProduct2__c,UseProduct3__c,UseProduct1__r.Name,UseProduct2__r.Name,UseProduct3__r.Name   
                            From Agency_Report__c
@@ -164,6 +198,7 @@
    public static List<Agency_Report__c> selectMAgencyReport01(Date date1, Date date2 ,List<Contact> conMList) {
        List<Agency_Report__c> reportlist = [Select Id, Name, Report_Date__c, Product_Category1__r.Name, Product_Category2__r.Name, Product_Category3__r.Name, Product_Category1__c, Product_Category2__c, Product_Category3__c,ConsumptionOfConsumables__c,warlocksNumber__c,WorkMark__c,Department_Cateogy__c, DealerPersonnel__c,WorkRecord__c, ProductClassification__c,WarlockClassification__r.WarlockClassification__c,WarlockClassification__c,ProductCcategory__c,ProductCcategory__r.ProductCcategory__c,productCategories__c, productCategories__r.productCategories__c,Agency_Report_Header__c, Agency_Hospital__r.Name, Agency_Hospital__r.Hospital__c, OppName__c,
                            Person_In_Charge2__c,DealerPersonnel__r.Name,Person_In_Charge2__r.Name, doctor2__c, doctor2__r.Name, Submit_date__c,
                            doctor2__r.AWS_Data_Id__c,// 20220222 PI改造 by Bright
                            Product_Category__c, Product_Category__r.Name, Result__c, visitor_title__c, Opportunity__c, Opportunity__r.Name,EffectProgress__r.EffectProgress__c,EffectProgress__c,
                            UseProduct1__c,UseProduct2__c,UseProduct3__c,UseProduct1__r.Name,UseProduct2__r.Name,UseProduct3__r.Name  
                            From Agency_Report__c
@@ -174,6 +209,7 @@
    public static List<Agency_Report__c> selectAgencyReportById(String report_id) {
        return [Select Id, Name, Department_Cateogy__c, ConsumptionOfConsumables__c,warlocksNumber__c,WorkMark__c,WorkRecord__c,EffectProgress__c,ProductClassification__c,ProductCcategory__c,productCategories__c, Agency_Report_Header__c, Agency_Hospital__r.Name, Agency_Hospital__r.Hospital__c, OppName__c,
                            Person_In_Charge2__c,DealerPersonnel__c,DealerPersonnel__r.Name, Person_In_Charge2__r.Name, doctor2__c, doctor2__r.Name, Submit_date__c,
                            doctor2__r.AWS_Data_Id__c,// 20220222 PI改造 by Bright
                            Product_Category__c, Product_Category__r.Name, Result__c, visitor_title__c 
                            From Agency_Report__c
                            where id=:report_id ];
@@ -182,6 +218,7 @@
    public static List<Agency_Report__c> selectAgencyReportById01(String report_id) {
        return [Select Id, Name, Department_Cateogy__c, ConsumptionOfConsumables__c,warlocksNumber__c,WorkMark__c,WorkRecord__c,EffectProgress__c,ProductClassification__c,ProductCcategory__c,productCategories__c, Agency_Report_Header__c, Agency_Hospital__r.Name, Agency_Hospital__r.Hospital__c, OppName__c,
                            Person_In_Charge2__c,DealerPersonnel__c,DealerPersonnel__r.Name, Person_In_Charge2__r.Name, doctor2__c, doctor2__r.Name, Submit_date__c,
                            doctor2__r.AWS_Data_Id__c,// 20220222 PI改造 by Bright
                            Product_Category__c, Product_Category__r.Name, Result__c, visitor_title__c 
                            From Agency_Report__c
                            where id=:report_id ];
force-app/main/default/classes/NFM103Controller.cls
@@ -103,6 +103,9 @@
        public String ReturnType;//返品方式
        public String UpdateStatus;//直返修改标识
        //add by wangweipeng  2021/07/14   end
        //add pi 加密 sushanhu 20220222 start
        public String DataId;//AWS存储凭证
        //add pi 加密 sushanhu 20220222 end
    }
    ////NFM103修改Rest end
@@ -327,7 +330,7 @@
                                         ,Returns_Product_way__c    //返品方式
                                         ,FSE_ApplyForRepair_time__c    //申请修理时间
                                         //add by wangweipeng  2021/07/14   start
                                         ,AWS_Data_Id__c //add by sushanhu AWSDateID for PIPL
                                         from Repair__c where Id IN :repairIds];          // 削除データを検索しないはず、All ROWS いらないはず
            System.debug(Logginglevel.DEBUG, 'NFM103_ recptList.size()=' + recptList.size());
@@ -472,7 +475,11 @@
                 element.Postal                     = rpr.address_ZipCode__c;    //邮编
                 element.ReturnType                 = NFMUtil.getMapValue(ReturnsProductWayMap,'Returns_Product_way__c', rpr.Returns_Product_way__c, iflog);//返品方式
                 element.UpdateStatus               = rpr.Address_type__c;    //申请修理时间
                 //add by wangweipeng  2021/07/14   start
                 //add by wangweipeng  2021/07/14   end
                 //add pi 密文 sushanhu 20220222 start
                 element.DataId                     =rpr.AWS_Data_Id__c;//aws存储凭证
                 //add pi 密文 sushanhu 20220222 end
            }
            if (repairRequest.GeneralData.size() > 0) {
@@ -571,10 +578,24 @@
            // NFM103修改Rest end
            // WLIG-BXQBH6 start
            NFMUtil.response response =
                NFMUtil.sendToSapStatusAndBody(rowDataStr, NFMUtil.NFM103_ENDPOINT);
            // NFMUtil.response response =
            //     NFMUtil.sendToSapStatusAndBody(rowDataStr, NFMUtil.NFM103_ENDPOINT);
                //update to aws 20220222 sushanhu start for PIPL
                NFMUtil.response res = NFMUtil.getAwsToken();
                String token=res.responseBody;
                if(String.isBlank(token)){
                    iflog.ErrorLog__c='NFM103'+'获取aws token 失败';
                }
                NFMUtil.response response =     NFMUtil.sendToPiAWS(rowDataStr, NFMUtil.NFM103_ENDPOINT,token);
                //update to aws 20220222 sushanhu end for PIPL
            status = response.status;
                system.debug('AWS Response status:'+status);
            ResponseBody = response.responseBody;
            //update to aws 20220302 sushanhu start for PIPL
            Map<String, Object> results = (Map<String, Object>)JSON.deserializeUntyped(ResponseBody);
            system.System.debug('NGM103 AWS result--'+ ResponseBody);
            //update to aws 20220302 sushanhu end for PIPL
            NFM103Response NFM103Response = new NFM103Response();
            system.debug(ResponseBody);
            if (string.isNotEmpty(ResponseBody)) {
force-app/main/default/classes/NFM203Rest.cls
@@ -1,6 +1,9 @@
@RestResource(urlMapping = '/NFM203/*')
global with sharing class NFM203Rest {
    //add Response to aws 20220221 add sushanhu
    static Boolean SFStatus=true;
    static String SFMessage='';
    global class GeDatas {
        public NFMUtil.Monitoring Monitoring;
        public GeData[] Partners;
@@ -93,10 +96,16 @@
    // 收货人层级
    global class Consignee_Info {
        public String ContactName;
        public String ContactNameEncrypted;//add 20220221
        public String ContactPhone;
        public String ContactPhoneEncrypted;//add 20220221
        public String PostalCode;
        public String PostalCodeEncrypted;//add 20220221
        public String ContactAddress;
        public String ContactAddressEncrypted;//add 20220221
        public String ContactCity; //有效收货人城市
        public String ContactDataId;// add  20220221 CONTACT aws 存储id
        public String AddressDataId;// add 2020221 adress aws 存储id
    }
    // 销售人层级
@@ -154,13 +163,18 @@
        // 取得接口传输内容
        String strData = RestContext.request.requestBody.toString();
        GeDatas ges = (GeDatas) JSON.deserializeStrict(strData, GeDatas.class);
        NFMUtil.NFMResponse result = NFMUtil.getNFMResponse();
        if (ges == null ) {
            SFMessage+='参数为空';
            system.debug('SFMessage---'+SFMessage);
            return;
        }
        NFMUtil.Monitoring Monitoring = ges.Monitoring;
        if (Monitoring == null) {
            SFMessage+='Monitoring为空';
            system.debug('SFMessage---'+SFMessage);
            return;
        }
@@ -173,7 +187,12 @@
        res.addHeader('Content-Type', 'application/json');
        res.statusCode = 200;
        //String jsonResponse = '{"status": "Success", "Message":'  + gedata + '}';
        String jsonResponse = '{"status": "Success", "Message":""}';
        // String jsonResponse = '{"status": "Success", "Message":""}';
        //updata response toAWS
        result.SFStatus=SFStatus;
        result.SFMessage=SFMessage;
        String jsonResponse =JSON.serialize(result);
        system.debug('result---'+jsonResponse);
        res.responseBody = blob.valueOf(jsonResponse);
        return;
    }
@@ -263,6 +282,11 @@
                    if (String.isNotBlank(result.split('/')[0])) {
                        iflog.ErrorLog__c += result.split('/')[0];
                        //add response to aws 2022022 sushanhu start
                        SFMessage=iflog.ErrorLog__c;
                        system.debug('ErrorLog__c--'+iflog.ErrorLog__c);
                        system.debug('SFMessage---'+SFMessage);
                        //add response to aws 20220222 sushanhu end
                    } else {
                        logstr += result.split('/')[1];
                    }
@@ -270,7 +294,13 @@
                }
                //WYAN-BS8B2A -XHL -20200925 -End
                if (String.isBlank(gda.BPType)) {
                    iflog.ErrorLog__c += 'BPCode[ ' + gda.BPCode + ' ] of BPType is required,This data is skipped.\n';
                    //add response to aws 20220221 sushanhu start
                    SFMessage=iflog.ErrorLog__c;
                    system.debug('SFMessage--'+SFMessage);
                    //add response to aws 20220221 sushanhu end
                    continue;
                }
                if (gda.BPType != '02' && gda.BPType != '03' && gda.BPType != '04' && gda.BPType != '05') {
@@ -278,16 +308,28 @@
                }
                if (String.isBlank(gda.BPCode)) {
                    iflog.ErrorLog__c += 'BPCode is required,This data is skipped.\n';
                    //add response to aws 20220221 sushanhu start
                    SFMessage=iflog.ErrorLog__c;
                    system.debug('SFMessage---'+SFMessage);
                    //add response to aws 20220221 sushanhu end
                    continue;
                }
                if (gda.BPType == '02') {
                    // 经销商的场合
                    if (String.isBlank(gda.CompanyName)) {
                        iflog.ErrorLog__c += 'BPCode[ ' + gda.BPCode + ' ] of CompanyName is required,This data is skipped.\n';
                        //add response to aws 20220221 sushanhu start
                        SFMessage=iflog.ErrorLog__c;
                        system.debug('SFMessage---'+SFMessage);
                        //add response to aws 20220221 sushanhu end
                        continue;
                    }
                    if (String.isBlank(gda.AgentType)) {
                        iflog.ErrorLog__c += 'BPCode[ ' + gda.BPCode + ' ] of AgentType is required,This data is skipped.\n';
                        //add response to aws 20220221 sushanhu start
                        SFMessage=iflog.ErrorLog__c;
                        system.debug('SFMessage---'+SFMessage);
                        //add response to aws 20220221 sushanhu end
                        continue;
                    }
                    //当经销商的分类为“特约经销商(区域)”、“特约经销商(产品)”、"特约经销商(区域+产品)"、"集采经销商"时,验证契约的必填字段
@@ -298,6 +340,10 @@
                            //CHAN-BF8CCU ---XHL---updateEnd---20190821
                            if (String.isBlank(contractInfos.TermContractNo)) {
                                iflog.ErrorLog__c += 'BPCode[ ' + gda.BPCode + ' ] of TermContractNo is required ,This data is skipped.\n';
                               //add response to aws 20220221 sushanhu start
                                SFMessage=iflog.ErrorLog__c;
                                system.debug('SFMessage---'+SFMessage);
                                //add response to aws 20220221 sushanhu end
                                flg = true;
                                continue;
                            }
@@ -321,6 +367,10 @@
                    applyTypeMap.put(gda.BPCode, gda.ApplyType);
                }
                //add result message 20220222 sushanhu satrt
                    SFMessage=iflog.ErrorLog__c;
                    system.debug('SFMessage---'+SFMessage);
                //add result message 20220222 sushanhu end
                bPCodeList.add(gda.BPCode);
                nfmgd.add(gda);
@@ -403,6 +453,10 @@
                    //判断BPCode是否已经存在,不存在的话会提示不存在,并且跳过
                    if (!accsMap.containsKey(gda.BPCode)) {
                        iflog.ErrorLog__c += ' This BPCode[' + gda.BPCode + '] is not exist,This data is skipped .\n';
                        //add response to aws 20220221 sushanhu start
                        SFMessage=iflog.ErrorLog__c;
                        system.debug('SFMessage---'+SFMessage);
                        //add response to aws 20220221 sushanhu end
                        continue;
                    }
                }
@@ -497,6 +551,9 @@
                    accountInfo.SPO_ApplicationNo__c = GetApplicationNo(gda);
                }
                accountUpsertList.add(accountInfo);
                // //add response to aws 20220221 sushanhu start
                // SFMessage=iflog.ErrorLog__c;
                // //add response to aws 20220221 sushanhu end
            }
            // 新建/更新客户主数据
            if (accountUpsertList.size() > 0) {
@@ -580,6 +637,10 @@
                                    } 
                                } else {
                                    iflog.ErrorLog__c += 'This Contract[ ' + contractInfos.TermContractNo + ' ] not exist,The Data Not  Cancel';
                                     //add response to aws 20220221 sushanhu start
                                    SFMessage=iflog.ErrorLog__c;
                                    system.debug('SFMessage---'+SFMessage);
                                    //add response to aws 20220221 sushanhu end
                                    continue ;
                                }
@@ -640,6 +701,9 @@
                                if (cdcErrorMap.size() > 0) {
                                    iflog.ErrorLog__c += ' This BPCode[' + gda.BPCode + '] of ContractDepartmentClass [' + cdcErrorMap.values() + '] noneffective, [' + cdcErrorMap.values() + '] skipped .\n';
                                     //add response to aws 20220221 sushanhu start
                                    SFMessage=iflog.ErrorLog__c;
                                    //add response to aws 20220221 sushanhu end
                                }
                                contractInfoAcc.Contract_Start_Date__c = NFMUtil.parseStr2Date(contractInfos.ContractStartDate);
                                contractInfoAcc.Contract_End_Date__c = NFMUtil.parseStr2Date(contractInfos.ContractEndDate);
@@ -805,6 +869,10 @@
                    if (String.isBlank(gdds.LicenseType)) {
                        iflog.ErrorLog__c += 'BPCode[ ' + gda.BPCode + ' ] of LicenseType is required ,This data is skipped.\n';
                        //add response to aws 20220221 sushanhu start
                        SFMessage=iflog.ErrorLog__c;
                        system.debug('SFMessage---'+SFMessage);
                        //add response to aws 20220221 sushanhu end
                        continue;
                    }
                    if (gdds.LicenseType == '23' || gdds.LicenseType == '24') { //3PL相关证
@@ -812,6 +880,10 @@
                    }
                    if (String.isBlank(gdds.BusLicenseNo)) {
                        iflog.ErrorLog__c += 'BPCode[ ' + gda.BPCode + ' ] of BusLicenseNo is required,This data is skipped .\n';
                        //add response to aws 20220221 sushanhu start
                        SFMessage=iflog.ErrorLog__c;
                        system.debug('SFMessage---'+SFMessage);
                        //add response to aws 20220221 sushanhu end
                        continue;
                    }
                    geDataDetailsMap.put(gdds.LicenseType, gdds);
@@ -847,6 +919,7 @@
                    licenseInfo.IsFromSPO__c = true;
                    licenseInfo.Scope__c = gdds.BusinessScope;
                    licenseInfo.Scope3__c = gdds.BusinessScope1;
                    licenseInfoUpsertList.add(licenseInfo);
                    //对"经销商"主数据中的"营业许可证书状况"的相关字段进行赋值
@@ -960,11 +1033,20 @@
            logstr += '\nend';
            rowData.retry_cnt__c = 0;
            //add response to AWS 20220221 start
            SFStatus =true;
            SFMessage+=logstr;
            system.debug('SFMessage---'+SFMessage);
             //add response to AWS 20220221 end
        } catch (Exception ex) {
            Database.rollback(sp);
            System.debug(Logginglevel.ERROR, 'NFM203_' + rowData.MessageGroupNumber__c + ':' + ex.getMessage());
            System.debug(Logginglevel.ERROR, 'NFM203_' + rowData.MessageGroupNumber__c + ':' + ex.getStackTraceString());
            logstr += '\n' + ex.getMessage();
            //add response to AWS 20220221 start
            SFMessage+=ex.getMessage();
            system.debug('SFMessage---'+SFMessage);
            //add response to AWS 20220221 end
            iflog.ErrorLog__c = ex.getMessage() + '\n' + ex.getStackTraceString() + '\n' + iflog.ErrorLog__c;
            if (rowData.retry_cnt__c == null) rowData.retry_cnt__c = 0;
@@ -1148,10 +1230,14 @@
                if (complianceDataMap.containsKey(accountCode)) {
                    // 获取客户Id
                    for(Consignee_Info info:complianceDataMap.get(accountCode)){
                        // add  sushanhu for pi '000000'为Consignee_Info源数据为空
                        if (!'000000'.equals(info.ContactDataId)) {
                        String accountId = tempAccountMap.get(accountCode).Id;
                        String contactPhone = info.ContactPhone;
                        String contactName = info.ContactName;
                        String contactAllName = contactAllName(contactName);
                        // String contactAllName = contactAllName(contactName);
                        //update to aws contactName 20220221 sushanhu
                        String contactAllName=info.contactName;
                        // 联系人字段赋值
                        Contact contact  = new Contact();
@@ -1160,14 +1246,20 @@
                        contact.Phone = contactPhone;
                        contact.MobilePhone = contactPhone;
                        contact.LastName = contactAllName.split('_')[0];
                        contact.FirstName = contactAllName.split('_')[1];
                        // contact.FirstName = contactAllName.split('_')[1];//delete for pi 20220304
                        contact.IsFromSPO__c = true;
                        // SFDC电话重复人员创建信息确认  pk 2022-2-28 start
                        contact.RecordTypeId = '01210000000QfWi';
                        // SFDC电话重复人员创建信息确认  pk 2022-2-28 end
                        contact.Ignore_Same_Name__c = true;//不是重复的客户名 跳过 客户人员名字已存在 验证
                        // add pi 密文 start 20220221 sushanhu
                        contact.Phone_Encrypted__c = info.ContactPhoneEncrypted;
                        contact.MobilePhone_Encrypted__c = info.ContactPhoneEncrypted;
                        contact.LastName_Encrypted__c =info.ContactNameEncrypted;
                        contact.AWS_Data_Id__c = info.ContactDataId;
                        // add pi 密文 end 20220221 sushanhu
                        insertContactList.add(contact);
                        if (!'000000'.equals(info.AddressDataId)) {
                        // 收货地址字段赋值
                        String contactCity = info.ContactCity;
@@ -1175,18 +1267,29 @@
                        addressData.Customer__c = accountId;//客户
                        addressData.IsFromSPO__c = true;//是否SPO来源
                        addressData.Telephone__c = contactPhone;//电话
                        addressData.Telephone_Encrypted__c =info.ContactPhoneEncrypted;//电话密文 add sushanhu for pi 20220304
                        addressData.Address_Classification__c = '经销商';//地址分类
                        addressData.Detailed_Address__c = info.ContactAddress;//详细地址
                        // 因接口不传输省,导致保存时报错。因此将其注掉,城市字段不赋值 XHL 20210823
                        // if (cityMap.containsKey(contactCity)) {
                        //     addressData.City__c = cityMap.get(contactCity).Id;//市
                        // }
                        // add pi 密文 start sushanhu 20220221
                        addressData.AWS_Data_Id__c =info.AddressDataId;
                        addressData.Detailed_Address_Encrypted__c =info.ContactAddressEncrypted;
                        // add pi 密文 end sushanhu 20220221
                        String mapkey = accountCode + contactName;
                        insertAddressMap.put(mapkey,addressData);
                        accountCodeList.add(accountCode);
                    }
                    
                }
                    }
                }
            }
            if (insertContactList.size() > 0) {
force-app/main/default/classes/NFM501Controller.cls
@@ -1,5 +1,6 @@
public with sharing class NFM501Controller implements Queueable {
    //先定义
    //add aws response
    public class AllData {
        public String code;
        public QLMData data;
@@ -45,6 +46,17 @@
        public String[] ZhaoRelationName;
        public String[] ZhongRelationName;
        public String infoTypeSegment;
        //add aws pi start sushanhu 20220223 start
        public String[] AgentRelationWayEncrypted;//代理机构联系方式密文
        public String[] AgentRelationNameEncrypted;//代理机构联系方式人密文
        public String[] ZhongRelationWayEncrypted;//中标单位联系方式密文
        public String[] ZhongRelationNameEncrypted;//中标单位联系人密文
        public String[] ZhaoRelationNameEncrypted;//招标单位联系人密文
        public String[] ZhaoRelationWayEncrypted;//招标单位联系方式密文
        public String DataId;// AWS 存储凭据
        //add aws pi start sushanhu 20220223 start
    }
    public class AmountItem {
        public String Amount;
@@ -166,7 +178,10 @@
            System.debug('++++1++++' + token + '  : ' + timeslot);
            if (string.isblank(token) || timeslot > 1800000) {
                System.debug('++++2++++' + token + '  : ' + timeslot);
                NFMUtil.response response = NFMUtil.receiveToken();
                // NFMUtil.response response = NFMUtil.receiveToken();
                //update to aws token sushanhu start 20220223
                NFMUtil.response response=NFMUtil.getAwsToken();
                //update to aws token sushanhu end 20220223
                System.debug('++++response++++' + response);
                //判断rowdata中数据获取成功与否,如果失败重发三次,如果大于三次则手动操作
                if (String.isBlank(response.responseBody)) {
@@ -188,11 +203,19 @@
                oldTimeTran.NFM501_Gain_End_Time__c = oldTime;
            }
            //替换获取到数据中的关键字
            NFMUtil.response response = NFMUtil.getQLMData(NFMUtil.NFM501_ENDPOINT
                                        + oldMark.Internal_Value__c + '/10', token);
            // aaaaaaaa 这里顺序错了,肯定是应该先判断是不是因为http 报错,然后才是千里马的code解析
            // //替换获取到数据中的关键字
            // NFMUtil.response response = NFMUtil.getQLMData(NFMUtil.NFM501_ENDPOINT
            //                             + oldMark.Internal_Value__c + '/10', token);
            // // aaaaaaaa 这里顺序错了,肯定是应该先判断是不是因为http 报错,然后才是千里马的code解析
            //update to aws start sushanhu 20220223
            PIHelper.PIIntegration NFM501AWS =PIHelper.getPIIntegrationInfo('QLMNFM501');
            NFMUtil.response response = NFMUtil.getAWSQLMData(NFM501AWS.newUrl+'cursorMark='
                                         + oldMark.Internal_Value__c + '&pageSize=10', token);
            //update to aws  sushanhu end 20220223
            //http的报错处理(重发三遍)
            //
            if (String.isBlank(response.responseBody)) {
                System.debug('-------7-------');
                // aaaaaaaa 报错原因写的不对
@@ -209,7 +232,14 @@
            // 解析后的code报错处理
            String NFM501responseBody = response.responseBody;
            System.debug('-------------NFM501responseBody------------' + NFM501responseBody);
            NFM501responseBody = NFM501responseBody.replaceAll('"list"', '"list1"').replaceAll('"number":', '"number1":');
            //update to aws response sushanhu 20220223 start
            Map<String, Object> results = (Map<String, Object>) JSON.deserializeUntyped(NFM501responseBody);
            //String qlmResult =(String)results.get('object');
            String qlmResult =JSON.serialize(results.get('object'));
            System.debug('-------------NFM501responseBody qlmResult------------' + qlmResult);
            // NFM501responseBody = NFM501responseBody.replaceAll('"list"', '"list1"').replaceAll('"number":', '"number1":');
            NFM501responseBody = qlmResult.replaceAll('"list"', '"list1"').replaceAll('"number":', '"number1":');
            //update to aws response sushanhu 20220223 end
            AllData getQLMData =  (AllData) JSON.deserializeStrict(NFM501responseBody, AllData.class);
            System.debug('-------------8------------' + getQLMData);
            if (!getQLMData.code.equals('0')) {
@@ -223,6 +253,8 @@
                return;
            }
            rowData = NFMUtil.QLMmakeRowData(NFM501responseBody, rowData);
            rowData.AWS_Transaction_Id__c = (String)results.get('txId');// add for pi susanhu 20220310
            system.debug('rowData---'+rowData);
            System.debug('======2221234======');
            update tokenTran;
force-app/main/default/classes/NFM501FutureController.cls
@@ -3,6 +3,10 @@
    //先定义
    //     投标截止时间
    // 2021/01/04 18:00
    //add by sushanhu for pi 20220310 start
    public static String txId;
    //add by sushanhu for pi 20220310 end
    public String rowData_id;
    public NFM501FutureController(String rowData_id) {
        this.rowData_id = rowData_id;
@@ -13,16 +17,20 @@
        BatchIF_Log__c rowData = [Select Id, Name, Log__c, ErrorLog__c, Log2__c, Log3__c,
            Log4__c, Log5__c, Log6__c, Log7__c, Log8__c, Log9__c, Log10__c, Log11__c,
            Log12__c, MessageGroupNumber__c, retry_cnt__c, NFM501Future_Count__c,
            NFM501_Web_Annex_Count__c
            NFM501_Web_Annex_Count__c,
            AWS_Transaction_Id__c //ADD BY SUSHANHU for pi 20220310
            from BatchIF_Log__c where RowDataFlg__c = true and Id = : rowData_id
        ];
        //存放报错信息
        txId =rowData.AWS_Transaction_Id__c; //add by sushanhu for pipl 20220310
        system.debug('nfm501future awsid'+txId);
        BatchIF_Log__c iflog501Future = new BatchIF_Log__c();
        iflog501Future.Type__c = 'NFM501';
        iflog501Future.MessageGroupNumber__c = rowData.MessageGroupNumber__c;
        iflog501Future.Log__c = ' ';
        iflog501Future.ErrorLog__c = ' ';
        iflog501Future.RowDataFlg__c = false;
        iflog501Future.AWS_Transaction_Id__c=rowData.AWS_Transaction_Id__c;
        insert iflog501Future;
        NFM501FutureController.main(rowData.Id, iflog501Future.Id, false);
    }
@@ -49,9 +57,12 @@
        String QLMDataStr = NFMUtil.QLMgetRowDataStr(rowData);
        NFM501controller.AllData getQLMData1 = (NFM501controller.AllData)
        JSON.deserialize(QLMDataStr, NFM501controller.AllData.class);
        if (getQLMData1 == null) {
            return;
        }
        List<PIHelper.IdList> idList = new List<PIHelper.IdList>();//存储更新后得sfid和awsid add by sushanhu 20220310
        PIHelper.PIIntegration NFM501AWS =PIHelper.getPIIntegrationInfo('QLMNFM501'); //add by sushanhu 20220310
        Savepoint sp = Database.setSavepoint();
        //IF转换表(为实现选项列表的下拉选项)
        Map < String, String > transferMap = new Map < String, String > ();
@@ -122,15 +133,20 @@
            tempbidInfoFileURLList.add(bidInfoFile.infoAddress__c);
            SelectbidInfoFileMap.put(bidInfoFile.Tender_information__r.ProjectId__c, tempbidInfoFileURLList);
        }
        try {
            // 招标信息
            Map < string, List < bidInfoFile__c >> createbidInfoFileMap = new map < string, List < bidInfoFile__c >> ();
            Map < String, List < Tender_information_details__c >> tempList1 = new Map < String, List < Tender_information_details__c >> ();
            Map < string, Tender_information__c > updateTenderMap = new map < string, Tender_information__c > ();
            Set < String > TarDetailSet = new Set < String > ();
            for (NFM501Controller.ListItem LI: getQLMData1.data.list1) {
                // 項目転送のセット
                Tender_information__c te1 = new Tender_information__c();
                //add aws dataid sushanhu 20220223 start
                te1.AWS_Data_Id__c = LI.DataId;
                //add aws dataid sushanhu 20220223 end
                if (String.isBlank(LI.projectId)) {
                    iflog501Future.ErrorLog__c += 'Error! [' + LI.projectId + ']NotExist. This information is skipped.\n';
                    continue;
@@ -183,6 +199,9 @@
                //拼接字符串
                if (LI.ZhaoRelationWay != null && LI.ZhaoRelationWay.size() > 0) {
                    te1.ZhaoRelationWay__c = String.join(LI.ZhaoRelationWay, ',');
                     //add 密文 sushanhu 20220223 start
                     te1.ZhaoRelationWay_Encrypted__c =String.join(LI.ZhaoRelationWayEncrypted,',');
                     //add 密文 sushanhu 20220223 end
                }
                //转换表(选项列表的下拉选项)
                te1.IsElectronic__c = NFMUtil.getMapValue(transferMap, 'IsElectronic__c', LI.isElectronic, iflog501Future);
@@ -283,6 +302,9 @@
                }
                if (LI.AgentRelationWay != null && LI.AgentRelationWay.size() > 0) {
                    te1.AgentRelationWay__c = String.join(LI.AgentRelationWay, ',');
                    //add 密文 sushanhu 20220223 start
                    te1.AgentRelationWay_Encrypted__c =String.join(LI.AgentRelationWayEncrypted,',');
                    //add 密文 sushanhu 20220223 end
                }
                // 将改附件存入招投标项目子对象中
                if (LI.InfoFile != null && LI.InfoFile.size() > 0) {
@@ -327,6 +349,9 @@
                }
                if (LI.AgentRelationName != null && LI.AgentRelationName.size() > 0) {
                    te1.AgentRelationName__c = String.join(LI.AgentRelationName, ',');
                    //add 密文 sushanhu 20220223 start
                    te1.AgentRelationName_Encrypted__c =String.join(LI.AgentRelationNameEncrypted,',');
                    //add 密文 sushanhu 20220223 end
                }
                if (String.isNotBlank(LI.bidingEndTime)) {
                    te1.BidingEndTime__c = Datetime.valueOf(LI.bidingEndTime);
@@ -355,6 +380,9 @@
                }
                if (LI.ZhongRelationWay != null && LI.ZhongRelationWay.size() > 0) {
                    te1.ZhongRelationWay__c = String.join(LI.ZhongRelationWay, ',');
                    //add 密文 sushanhu 20220223 start
                    te1.ZhongRelationWay_Encrypted__c =String.join(LI.ZhongRelationWayEncrypted,',');
                    //add 密文 sushanhu 20220223 end
                }
                if (String.isNotBlank(LI.bidingAcquireTime)) {
                    te1.BidingAcquireTime__c = Datetime.valueOf(LI.bidingAcquireTime);
@@ -462,10 +490,18 @@
                }
                if (LI.ZhaoRelationName != null && LI.ZhaoRelationName.size() > 0) {
                    te1.ZhaoRelationName__c = String.join(LI.ZhaoRelationName, ',');
                    //add 密文 sushanhu 20220223 start
                    te1.ZhaoRelationName_Encrypted__c =String.join(LI.ZhaoRelationNameEncrypted,',');
                    //add 密文 sushanhu 20220223 end
                }
                if (LI.ZhongRelationName != null && LI.ZhongRelationName.size() > 0) {
                    te1.ZhongRelationName__c = String.join(LI.ZhaoRelationName, ',');
                     //add 密文 sushanhu 20220223 start
                     te1.ZhongRelationName_Encrypted__c =String.join(LI.ZhongRelationNameEncrypted,',');
                     //add 密文 sushanhu 20220223 end
                }
                //精琢科技   zxk   2021-11-11  SWAG-C637NF   start
                // 如果第一次项目阶段就传来变更状态的话,那么就不生成招投标项目(由于变更阶段项目名称传来为空,为了不让项目名自动赋值为Id)
                if (String.isNotBlank(te1.InfoType__c) && String.isNotBlank(LI.projectId)) {
@@ -499,8 +535,15 @@
            System.debug('123456789123456789:' + updateTenderMap);
            //将招标信息和招标信息详情关联起来(通过ProjectId这一唯一标识)
            Map < string, Tender_information__c > TenderMap = new map < string, Tender_information__c > ();
            for (Tender_information__c TMap: updateTenderMap.values()) {
                TenderMap.put(TMap.ProjectId__c, TMap);
                PIHelper.IdList il= new PIHelper.IdList();
                // add for pipl  sushanhu 20220310 start
                il.awsId =TMap.AWS_Data_Id__c;
                il.sfRecordId=TMap.Id;
                idList.add(il);
                // add for pipl  sushanhu 20220310 end
            }
            System.debug('12345678!!!!!' + TenderMap.values());
            List < Tender_information_details__c > TenList = new List < Tender_information_details__c > ();
@@ -537,9 +580,15 @@
            if (System.Test.isRunningTest()) {
                throw new ControllerUtil.myException('aaa');
            }
            //确认事务 add for pi sushanhu 20220310 start
            PIHelper.confirmTrans('NFM501',1,null,txId,NFM501AWS.token,NFM501AWS.transactionURL,idList);
            //确认事务 add for pi sushanhu 20220310 end
        } catch (Exception ex) {
            // 如果数据获取过程中,有错误(同一游标,如果报错,是他重新获取一遍,如果三次都没能获取到,就发送邮件报错信息,然后手动进行获取)
            Database.rollback(sp);
            //确认事务 add for pi sushanhu 20220310 start
            PIHelper.confirmTrans('NFM501',0,null,txId,NFM501AWS.token,NFM501AWS.transactionURL,idList);
            //确认事务 add for pi sushanhu 20220310 end
            System.debug(Logginglevel.ERROR, 'QLMData_' + rowData.MessageGroupNumber__c + ':' + ex.getMessage());
            System.debug(Logginglevel.ERROR, 'QLMData_' + rowData.MessageGroupNumber__c + ':' + ex.getStackTraceString());
            // logstr += '\n' + ex.getMessage();
force-app/main/default/classes/NFM502Controller.cls
@@ -1,6 +1,10 @@
public with sharing class NFM502Controller implements Queueable {
    public String rowData_id;
    //add staic sushanhu 20220302 start
    public static String transUrl;
    public static String transId;
    public static String token;
    //add staic sushanhu 20220302 end
    public NFM502Controller(String rowData_id) {
        this.rowData_id = rowData_id;
    }
@@ -46,7 +50,9 @@
        // Savepoint sp = Database.setSavepoint();
        try {
            String token;
            //update 同staic 20220302 satrt
            // String token;
            //update 同staic 20220302 end
            Datetime oldTime;
            // 从转换表中获取token
            BatchIF_Transfer__c token502 = [Select ID, NFM501_Token__c
@@ -75,11 +81,13 @@
            }
            // System.debug('++++1++++' + token + '  : ' + timeslot);
            if (string.isblank(token) || timeslot > 1800000) {
                NFMUtil.response response = NFMUtil.receiveToken();
                // NFMUtil.response response = NFMUtil.receiveToken();
                //update to aws token sushanhu 20220301  start
                NFMUtil.response response = NFMUtil.getAWSToken();
                //判断rowdata中数据获取成功与否,如果失败重发三次,如果大于三次则手动操作
                if (String.isBlank(response.responseBody)) {
                    System.debug('response.responseBody:' + response.responseBody);
                    iflog502.ErrorLog__c = '502token:' + response.status;
                    iflog502.ErrorLog__c = '502token:' + response.responseBody;
                    // rowData.NFM501_Web_Annex_Count__c = 0;
                    if (!Manual_execution502) {
                        NFM501Controller.againSendRequest(iflog502, 'NFM501_Web_Annex_Count__c', rowData);
@@ -92,6 +100,7 @@
                oldTime = Datetime.now();
                token502.NFM501_Token__c = token;
                oldTime502.NFM501_Gain_End_Time__c = oldTime;
                //update to aws token sushanhu 20220301  end
            }
            //关联附件与招投标项目(通过Id)
@@ -116,7 +125,12 @@
            }
            //循环URL
            List<Attachment> TenAttList = new List<Attachment>();
            // List<Attachment> TenAttList = new List<Attachment>();
            //update to aws pi sushanhu 20220301 start
            List<FileAddress__c> fileList = new List<FileAddress__c>();
            List<String> queryUrlList = new List<String>();
            Map<String, NFM501Controller.ListItem> queryMap = new Map<String, NFM501Controller.ListItem>();
            //update to aws pi sushanhu 20220301 end
            for (NFM501Controller.ListItem QLMWebAtt : getQLMData502.data.list1) {
                if (QLMWebAtt.projectId == null) {
                    iflog502.ErrorLog__c += 'Error! [' + QLMWebAtt.projectId + ']NotExist. This information is skipped.\n';
@@ -129,11 +143,69 @@
                                            ']Is 香港特别行政区(澳门特别行政区,台湾省). This information is skipped.\n';
                    continue;
                }
                //update to aws pi sushanhu 20220301 start
                queryUrlList.add(QLMWebAtt.infoQianlimaUrl);
                queryMap.put(QLMWebAtt.infoQianlimaUrl,QLMWebAtt);
                //update to aws pi sushanhu 20220301 start
            //     //调用接口3
            //     NFMUtil.response response = NFMUtil.getQLMData(NFMUtil.NFM502_ENDPOINT + QLMWebAtt.infoQianlimaUrl, token);
            //     if (String.isBlank(response.responseBody)) {
            //         System.debug('response.responseBody:' + response.responseBody);
            //         iflog502.ErrorLog__c = '502接口调用:' + response.status;
            //         rowData.NFM501_Web_Annex_Count__c = 0;
            //         if (!Manual_execution502) {
            //             NFM501Controller.againSendRequest(iflog502, 'NFM501_Web_Annex_Count__c', rowData);
            //         }
            //         //更新日志数据
            //         update token502;
            //         update oldTime502;
            //         return;
            //     }
            //     //解析后的code报错处理
            //     string NFM502responseBody = response.responseBody;
            //     Map<String, Object> Body502 = (Map<String, Object>) JSON.deserializeUntyped(NFM502responseBody);
            //     if (!Body502.get('code').equals('0')) {
            //         System.debug('-------9-------');
            //         iflog502.ErrorLog__c = '502解析:' + Body502.get('msg').tostring() ;
            //         if (!Manual_execution502) {
            //             NFM501Controller.againSendRequest(iflog502, 'NFM501_Web_Annex_Count__c', rowData);
            //         }
            //         update token502;
            //         update oldTime502;
            //         return;
            //     }
            //     System.debug('Body502.data:' + Body502.get('data').tostring() + '---------'
            //                  + Body502.get('msg').tostring() + '-------' + Body502.get('code').tostring());
            //     //获取网页信息转存为附件
            //     //截切数据(使数据成为解析的格式)
            //     Integer start = NFM502responseBody.indexOf('"infoHtml":"');
            //     Integer theEnd = NFM502responseBody.lastIndexOf('"},"msg');
            //     NFM502responseBody = NFM502responseBody.substring(start + 12, theEnd);
            //     //将其转换为附件
            //     // System.debug('---------' + NFM502responseBody);
            //     Attachment WebAtt = new Attachment();
            //     // System.debug('projectId:' + QLMWebAtt.projectId);
                // if (TenMap.containskey(QLMWebAtt.projectId)) {
                //     WebAtt.ParentId = TenMap.get(QLMWebAtt.projectId).Id;
                //     WebAtt.Body = Blob.valueOf(NFM502responseBody);
                //     WebAtt.Name = TenMap.get(QLMWebAtt.projectId).InfoType__c + ':' + QLMWebAtt.infoTitle + '.html';
                //     TenAttList.add(WebAtt);
                // }
             }
            //update to aws pi  sushanhu 20220301 start
            PIHelper.piIntegration pi =PIHelper.getPIIntegrationInfo('NFM502');
            transUrl=pi.searchUrl;
                //调用接口3
                NFMUtil.response response = NFMUtil.getQLMData(NFMUtil.NFM502_ENDPOINT + QLMWebAtt.infoQianlimaUrl, token);
                if (String.isBlank(response.responseBody)) {
            system.debug('Payload for NFM 520:'+JSON.serialize(queryUrlList));
            NFMUtil.response response = NFMUtil.getAWSQLMData(pi.newUrl ,JSON.serialize(queryUrlList), token);
            Map<String, Object> result = (Map<String, Object>)JSON.deserializeUntyped(response.responseBody);
            String statusCode =(String)result.get('status');
            transId =(String)result.get('txId');
            if (!'0'.equals(statusCode)) {
                    System.debug('response.responseBody:' + response.responseBody);
                    iflog502.ErrorLog__c = '502接口调用:' + response.status;
                iflog502.ErrorLog__c = '502接口调用:' + (String)result.get('message');
                    rowData.NFM501_Web_Annex_Count__c = 0;
                    if (!Manual_execution502) {
                        NFM501Controller.againSendRequest(iflog502, 'NFM501_Web_Annex_Count__c', rowData);
@@ -147,9 +219,9 @@
                //解析后的code报错处理
                string NFM502responseBody = response.responseBody;
                Map<String, Object> Body502 = (Map<String, Object>) JSON.deserializeUntyped(NFM502responseBody);
                if (!Body502.get('code').equals('0')) {
            if (!String.valueOf(Body502.get('status')).equals('0')) {
                    System.debug('-------9-------');
                    iflog502.ErrorLog__c = '502解析:' + Body502.get('msg').tostring() ;
                iflog502.ErrorLog__c = '502解析:' + Body502.get('message').tostring() ;
                    if (!Manual_execution502) {
                        NFM501Controller.againSendRequest(iflog502, 'NFM501_Web_Annex_Count__c', rowData);
                    }
@@ -157,23 +229,22 @@
                    update oldTime502;
                    return;
                }
                System.debug('Body502.data:' + Body502.get('data').tostring() + '---------'
                             + Body502.get('msg').tostring() + '-------' + Body502.get('code').tostring());
            System.debug('Body502.data:' + Body502.get('object').tostring() + '---------'
                         + Body502.get('message').tostring() + '-------' + Body502.get('status').tostring());
                //获取网页信息转存为附件
                //截切数据(使数据成为解析的格式)
                Integer start = NFM502responseBody.indexOf('"infoHtml":"');
                Integer theEnd = NFM502responseBody.lastIndexOf('"},"msg');
                NFM502responseBody = NFM502responseBody.substring(start + 12, theEnd);
                //将其转换为附件
                // System.debug('---------' + NFM502responseBody);
                Attachment WebAtt = new Attachment();
                // System.debug('projectId:' + QLMWebAtt.projectId);
            //获取aws返回的地址并存储
            Map<String, Object> fileMap = (Map<String, Object >)result.get('object');
            for(String url:queryUrlList){
                NFM501Controller.ListItem QLMWebAtt = queryMap.get(url);
                if (TenMap.containskey(QLMWebAtt.projectId)) {
                    WebAtt.ParentId = TenMap.get(QLMWebAtt.projectId).Id;
                    WebAtt.Body = Blob.valueOf(NFM502responseBody);
                    WebAtt.Name = TenMap.get(QLMWebAtt.projectId).InfoType__c + ':' + QLMWebAtt.infoTitle + '.html';
                    TenAttList.add(WebAtt);
                    FileAddress__c file =new FileAddress__c();
                    file.ParentRecordId__c = TenMap.get(QLMWebAtt.projectId).Id;
                    file.FileName__c = TenMap.get(QLMWebAtt.projectId).InfoType__c + ':' + QLMWebAtt.infoTitle + '.html';
                    file.DownloadLink__c =pi.undeleteUrl+(String)fileMap.get(url)+'&fileName='+file.FileName__c;
                    file.ViewLink__c = pi.queryUrl+(String)fileMap.get(url) ;
                    file.AWS_File_Key__c =(String)fileMap.get(url) ;
                    fileList.add(file);
                }
            }
@@ -185,22 +256,34 @@
                }
            }
            List<Attachment> DeleAttList = [select id, name, ParentId from Attachment
                                            where name in :UrlList and ParentId in :TenIdSet];
            if (DeleAttList.size() > 0) {
                delete DeleAttList;
            List<FileAddress__c> DeleFileList = [select id, FileName__c, ParentRecordId__c from FileAddress__c
                                            where FileName__c in :UrlList and ParentRecordId__c in :TenIdSet];
            if (DeleFileList.size() > 0) {
                delete DeleFileList;
            }
            System.debug('----1----' + TenAttList);
            if (TenAttList.size() > 0) {
                upsert TenAttList;
            System.debug('----1----' + fileList);
            if (fileList.size() > 0) {
                upsert fileList;
            }
            //确认事务
            List<String> sfRecordIds = new List<String>();
            for (FileAddress__c file : fileList) {
                sfRecordIds.add(file.Id);
            }
            //update to aws pi  sushanhu 20220301 end
             PIHelper.confirmFileTrans('NFM502',1,JSON.serialize(sfRecordIds),transId,token,transUrl);
            // if (!confirm) {
            //     //回滚
            // }
            rowData.NFM501_Web_Annex_Count__c = 0;
        } catch (Exception ex) {
            // Database.rollback(sp);
            // System.debug(Logginglevel.ERROR, 'QLMData_' + rowData.MessageGroupNumber__c + ':' + ex.getMessage());
            // System.debug(Logginglevel.ERROR, 'QLMData_' + rowData.MessageGroupNumber__c + ':' + ex.getStackTraceString());
            // logstr += '\n' + ex.getMessage();
            //add 事务确认 sushanhu 20220302 satrt
             PIHelper.confirmFileTrans('NFM502',0,'',transId,token,transUrl);
            //add 事务确认 sushanhu 20220302 end
            iflog502.ErrorLog__c = '502抛出异常:' + ex.getMessage() + '\n'
                                   + ex.getStackTraceString() + '\n' + iflog502.ErrorLog__c;
            if (!Manual_execution502) {
force-app/main/default/classes/NFM503InfoFileBatch.cls
@@ -1,8 +1,18 @@
global class NFM503InfoFileBatch implements Database.Batchable<sObject>, Database.AllowsCallouts, Database.Stateful {
    public String TenId;
    public String bidInfoFileID;
    //add staic sushanhu 20220302 start
    public static String transUrl;
    public static String transId;
    public static String token;
    //add staic sushanhu 20220302 end
    Boolean IsNeedExecute = false;  //2021-06-28 mzy  WLIG-BYHD79  SFDC环境batch合并调查  是否符合执行条件
    //add nfm 503 aws response start sushanhu 20220301
    global class File{
        public String key;
        public String name;
    }
    //add nfm 503 aws response sushanhu 20220301 end
    //2021-06-28  mzy update  千里马-Batch start
    global NFM503InfoFileBatch() {
        this.IsNeedExecute = true;
@@ -33,9 +43,12 @@
    global void execute(Database.BatchableContext BC, list<bidInfoFile__c> bidInfoFileList) {
        Savepoint sp;
        bidInfoFile__c bidInfoFile = bidInfoFileList[0];
        List<String> queryfileList = new List<String>();
        queryfileList.add(bidInfoFile.infoAddress__c);
        try {
            String token;
           //update 同staic 20220302 satrt
            // String token;
            //update 同staic 20220302 end
            Datetime oldTime;
            // 从转换表中获取token
            BatchIF_Transfer__c token503 = [Select ID, NFM501_Token__c
@@ -56,7 +69,9 @@
            }
            // System.debug('++++1++++' + token + '  : ' + timeslot);
            if (string.isblank(token) || timeslot > 1800000) {
                NFMUtil.response response = NFMUtil.receiveToken();
                //UP TO AWAS TOKEN 20220225 SUSHANHU START
                NFMUtil.response response = NFMUtil.getAWSToken();
                //UP TO AWAS TOKEN 20220225 SUSHANHU END
                if (String.isBlank(response.responseBody)) {
                    bidInfoFile.ErrorMessage__c = '503token:' + response.status;
                }
@@ -65,53 +80,133 @@
                token503.NFM501_Token__c = token;
                oldTime503.NFM501_Gain_End_Time__c = oldTime;
            }
            // 存放超过12M的附件
            List<Attachment> TenOtherAttList = new List<Attachment>();
            // 存放所有附件
            List<String> FileList = new List<String>();
            // 如果文件大小超过12M更新
            List< Tender_information__c> updateTenderList = new  List< Tender_information__c>();
            // 获取接口3中数据
            NFMUtil.response503 response = NFMUtil.getFileData(token, bidInfoFile.infoAddress__c);
            // 文件大小超过12M
            if (response.Name.equals('文件大小超过12M')) {
                id tendID = bidInfoFile.Tender_information__c;
                Tender_information__c tempTender = new Tender_information__c();
                tempTender.id = tendID;
                tempTender.File_Surpass_12M__c = true;
                if (String.isBlank(tempTender.Overstep_12M_infofile__c)) {
                    tempTender.Overstep_12M_infofile__c = bidInfoFile.infoAddress__c;
                } else {
                    if (!tempTender.Overstep_12M_infofile__c.contains(bidInfoFile.infoAddress__c)) {
                        // List<String> urlList = singleFile.split(',');
                        tempTender.Overstep_12M_infofile__c += bidInfoFile.infoAddress__c + ',';
            // // 存放超过12M的附件
            // List<Attachment> TenOtherAttList = new List<Attachment>();
            // // 存放所有附件
            // List<String> FileList = new List<String>();
            // // 如果文件大小超过12M更新
            // List< Tender_information__c> updateTenderList = new  List< Tender_information__c>();
            // // 获取接口3中数据
            // NFMUtil.response503 response = NFMUtil.getFileData(token, bidInfoFile.infoAddress__c);
            //UP TO NEW  AWS method sushanhu start 20220301
            // List< Tender_information__c> updateTenderList = new  List< Tender_information__c>();
            List<FileAddress__c> fileList = new List<FileAddress__c>();
            PIHelper.piIntegration pi =PIHelper.getPIIntegrationInfo('NFM503');
            transUrl =pi.searchUrl;
            NFMUtil.response response = NFMUtil.getAWSQLMData(pi.newUrl ,JSON.serialize(queryfileList), token);
            system.debug('aws result'+response.responseBody);
            Map<String, Object> result = (Map<String, Object>)JSON.deserializeUntyped(response.responseBody);
            system.debug('NFM503 aws result--'+response.responseBody+'status'+response.status);
            transId =(String)result.get('txId');
            //UP TO NEW  AWS method sushanhu start 20220301
            // 新得存储 不需要判断文件超过12m
            // // 文件大小超过12M
            // if (response.Name.equals('文件大小超过12M')) {
            //     id tendID = bidInfoFile.Tender_information__c;
            //     Tender_information__c tempTender = new Tender_information__c();
            //     tempTender.id = tendID;
            //     tempTender.File_Surpass_12M__c = true;
            //     if (String.isBlank(tempTender.Overstep_12M_infofile__c)) {
            //         tempTender.Overstep_12M_infofile__c = bidInfoFile.infoAddress__c;
            //     } else {
            //         if (!tempTender.Overstep_12M_infofile__c.contains(bidInfoFile.infoAddress__c)) {
            //             // List<String> urlList = singleFile.split(',');
            //             tempTender.Overstep_12M_infofile__c += bidInfoFile.infoAddress__c + ',';
            //         }
            //     }
            //     updateTenderList.add(tempTender);
            // }
            // // 将获取到的数据存成附件
            // Attachment WebAtt = new Attachment();
            // WebAtt.ParentId = bidInfoFile.Tender_information__c;
            // WebAtt.Body = response.responseBody;
            // WebAtt.Name = bidInfoFile.Tender_information__r.InfoType__c + ':' + response.Name;
            // if (!response.Name.equals('文件大小超过12M')) {
            //     TenOtherAttList.add(WebAtt);
            // }
            // sp = Database.setSavepoint();
            // if (updateTenderList.size() > 0) {
            //     update updateTenderList;
            // }
            // System.debug('----1----' + TenOtherAttList);
            // if (TenOtherAttList.size() > 0 ) {
            //     upsert TenOtherAttList;
            // }
            // bidInfoFileList[0].isProcessed__c = true;
            // bidInfoFileList[0].ErrorMessage__c = '';
            // update bidInfoFileList;
            // if (System.Test.isRunningTest()) {
            //     throw new ControllerUtil.myException('aaa');
            // }
            // return;
            String statusCode =String.valueOf(result.get('status')) ;
            system.debug('statuscode aws-- '+statusCode);
            if (!'0'.equals(statusCode)) {
                System.debug('response.responseBody:' + response.responseBody);
                return;
                    }
                }
                updateTenderList.add(tempTender);
            }
            // 将获取到的数据存成附件
            Attachment WebAtt = new Attachment();
            WebAtt.ParentId = bidInfoFile.Tender_information__c;
            WebAtt.Body = response.responseBody;
            WebAtt.Name = bidInfoFile.Tender_information__r.InfoType__c + ':' + response.Name;
            if (!response.Name.equals('文件大小超过12M')) {
                TenOtherAttList.add(WebAtt);
            }
            Map<String, Object> fileMap = (Map<String, Object >)result.get('object');
            system.debug('fileMap'+fileMap.toString());
            Map<String, Object> fileVO =(Map<String, Object>)fileMap.get(bidInfoFile.infoAddress__c);
            String Name =(String)fileVO.get('name');
            // if (Name.equals('文件大小超过12M')) {
            //     id tendID = bidInfoFile.Tender_information__c;
            //     Tender_information__c tempTender = new Tender_information__c();
            //     tempTender.id = tendID;
            //     tempTender.File_Surpass_12M__c = true;
            //     if (String.isBlank(tempTender.Overstep_12M_infofile__c)) {
            //         tempTender.Overstep_12M_infofile__c = bidInfoFile.infoAddress__c;
            //     } else {
            //         if (!tempTender.Overstep_12M_infofile__c.contains(bidInfoFile.infoAddress__c)) {
            //             // List<String> urlList = singleFile.split(',');
            //             tempTender.Overstep_12M_infofile__c += bidInfoFile.infoAddress__c + ',';
            //         }
            //     }
            //     updateTenderList.add(tempTender);
            // }
            //将获取的AWS文件地址存储
            FileAddress__c file = new FileAddress__c();
            file.ParentRecordId__c = bidInfoFile.Tender_information__c;
            file.FileName__c = bidInfoFile.Tender_information__r.InfoType__c + ':' + Name;
            file.DownloadLink__c =pi.undeleteUrl+(String)fileVO.get('key')+'&fileName='+file.FileName__c;
            file.ViewLink__c = pi.queryUrl+(String)fileVO.get('key');
            file.AWS_File_Key__c =(String)fileVO.get('key');
            fileList.add(file);
            sp = Database.setSavepoint();
            if (updateTenderList.size() > 0) {
                update updateTenderList;
            }
            System.debug('----1----' + TenOtherAttList);
            if (TenOtherAttList.size() > 0 ) {
                upsert TenOtherAttList;
            System.debug('----1----' + fileList);
            if (fileList.size() > 0 ) {
                upsert fileList;
            }
            bidInfoFileList[0].isProcessed__c = true;
            bidInfoFileList[0].ErrorMessage__c = '';
            update bidInfoFileList;
            // add 确认事务 sushanhu 20220302 start
            List<String> sfRecordIds = new List<String>();
            for (FileAddress__c fileAddress : fileList) {
                sfRecordIds.add(fileAddress.Id);
                system.debug('fileAddress.Id---'+fileAddress.Id);
            }
            system.debug('成功的token'+token);
             PIHelper.confirmFileTrans('NFM503',1,JSON.serialize(sfRecordIds),transId,token,transUrl);
            // if (!confirm) {
            //     //回滚
            //     if (sp != null) {
            //         Database.rollback(sp);
            //     }
            // }
            // add 确认事务 sushanhu 20220302 end
            if (System.Test.isRunningTest()) {
                throw new ControllerUtil.myException('aaa');
            }
@@ -120,7 +215,12 @@
            if (sp != null) {
                Database.rollback(sp);
            }
            //add 确认事务 20220302 sushanhu start
            system.debug('失败的token'+token);
             PIHelper.confirmFileTrans('NFM503',0,'',transId,token,transUrl);
            //add 确认事务 20220302 sushanhu end
            bidInfoFile.ErrorMessage__c = '503抛出异常:' + ex.getMessage() + '\n' + ex.getStackTraceString();
            system.debug('ErrorMessage'+bidInfoFile.ErrorMessage__c);
        }
        update bidInfoFile;
    }
force-app/main/default/classes/NFM606Controller.cls
@@ -6,6 +6,9 @@
    public static String logstr;
    public static String status;      
    //add aws respnse sushanhu 20220228 start
    public static String responseBody;
    //add aws respnse sushanhu 20220228 end
    private static final String LOG_TYPE = 'NFM606';
    private static final String API = '/admin/api/user/save';
    public class NFM606 {
@@ -33,6 +36,9 @@
        public String AgentCode; //经销商编码
        public String AgentUserType; //人员类型
        public String Email; //电子邮件
        //add aws pi start sushanhu 20220228
        public String DataId;//aws 存储凭据
        //add aws pi end sushanhu 20220228
    }
@@ -104,6 +110,7 @@
            Account.ParentId,
            Account.Parent.ParentId,
            UniqueNumber__c,
            AWS_Data_Id__c,
            Name, Email from Contact where id in: conIdList AND RecordTypeId != '01210000000QtkyAAC'
        ];
        String logstr = iflog.Log__c + ' ' + 'NumberOfRecord=' + conList.size() + '\n';
@@ -112,6 +119,9 @@
                String flag = '';
                GeData ged = new GeData();
                ged.ContactId = String.isBlank(con.UnifiedI_Contact_ID__c) ? '':con.UnifiedI_Contact_ID__c; //智慧医疗ID
                //update to AWS_UnifiedI_Contact_ID__c sushanhu 20220228 start
                //ged.ContactId = String.isBlank(con.) ? '':con.AWS_UnifiedI_Contact_ID__c; //AWS 智慧医疗ID
                ////update to AWS_UnifiedI_Contact_ID__c sushanhu 20220228 end
                ged.ServiceUserId = String.isBlank(con.ServicePlatformCode__c) ? '':con.ServicePlatformCode__c; //服务平台用户ID???
                ged.Mobile = String.isNotBlank(con.UniqueNumber__c) ? con.UniqueNumber__c:con.MobilePhone;//手机
                ged.PersonManagementCode = con.CManageCode__c; //人员管理编码
@@ -143,6 +153,7 @@
                    ged.AgentFlag = true;//经销商
                    ged.Email = con.Email;
                }
                ged.DataId =con.AWS_Data_Id__c;//add aws 存储凭据
                ged = getStateAndCity(ged,con);
                gds.GeData.add(ged);
@@ -259,17 +270,32 @@
        try {
            
            
            // 发往PO
            status = NFMUtil.sendToSapRet(rowDataStr, NFMUtil.NFM606_ENDPOINT);
            System.debug('NFM606Log--status->'+ status);
            // status = ''
            if ('Accepted'.equals(status)) {
            // // 发往PO
            // status = NFMUtil.sendToSapRet(rowDataStr, NFMUtil.NFM606_ENDPOINT);
            // System.debug('NFM606Log--status->'+ status);
            // // status = ''
            // if ('Accepted'.equals(status)) {
            //     logstr += status+'\n';
            //     rowDataSFDC.retry_cnt__c = 0;
            // }
            // else {
            //     rowDataSFDC = NFMUtil.LogAutoSend(rowDataSFDC, null, status);
            // }
            //update to aws 20220228 sushanhu satrt
            PIHelper.PIIntegration pi =PIHelper.getPIIntegrationInfo('NFM606');
            NFMUtil.response result =NFMUtil.sendToPiAWS(rowDataStr,pi.newUrl,pi.token);
            system.debug('aws result---'+result);
            responseBody=result.responseBody;
            //Map<String, Object> res = (Map<String, Object>)JSON.deserializeUntyped(responseBody);
            //status=(String)res.get(status);
            if ('202'.equals(result.status)) {
                logstr += status+'\n';
                rowDataSFDC.retry_cnt__c = 0;
            } 
            else {
                rowDataSFDC = NFMUtil.LogAutoSend(rowDataSFDC, null, status);
            }
            //update to aws 20220228 sushanhu end
        } catch (Exception ex) {
            // TODO IOException
             // 异常重发
force-app/main/default/classes/NFM607Rest.cls
@@ -3,7 +3,13 @@
 */
@RestResource(urlMapping = '/NFM607/*')
global with sharing class NFM607Rest {
    //add to AWS 回复 start sushanhu 20220225
    static Boolean SFStatus=true;
    static String SFMessage='';
   //add to AWS 回复 end sushanhu 20220225
    private static final String LOG_TYPE = 'NFM607';
    //add Response to aws 20220221 add sushanhu
    static NFMUtil.NFMResponse result = new NFMUtil.NFMResponse();
    global class GeData {
        public String mngCd; //  ASE管理编码
@@ -21,10 +27,20 @@
        public String activityStartTime; //活动开始时间
        public String activityEndTime; //活动结束时间
        public String workDesc; //工作描述
        // add 加密字段索引 add 20220210
        public String DataId; //加密字段索引
        //add 加密字段密文 20220210
        public String customerNmEncrypted;
        //add             wangweipeng         2022/02/14      start
        public String customerTel;//客户手机号码
        public String workPlace;//工作场所
        //add             wangweipeng         2022/02/14      end
        //add 20220216 sushanhu start
        public String customerTelEncrypted;
        public String workPlaceEncrypted;
        // add 20220216 sushanhu end
    }
    @HttpPost
@@ -32,7 +48,7 @@
        // 取得接口传输内容
        String strData = RestContext.request.requestBody.toString();
        List < GeData > ges = (List < GeData > ) JSON.deserializeStrict(strData, List < GeData > .class);
        system.debug('ges---'+ges);
        if (ges == null) {
            return;
        }
@@ -52,8 +68,16 @@
        RestResponse res = RestContext.response;
        res.addHeader('Content-Type', 'application/json');
        res.statusCode = 200;
        String jsonResponse = '{"status": "Success", "Message":"成功"}';
        res.responseBody = Blob.valueOf(jsonResponse);
        // String jsonResponse = '{"status": "Success", "Message":"成功"}';
        // res.responseBody = Blob.valueOf(jsonResponse);
        //updata response toAWS 20220225 sushanhu start
        NFMUtil.NFMResponse result = NFMUtil.getNFMResponse();
        result.SFStatus=SFStatus;
        result.SFMessage=SFMessage;
        String jsonResponse =JSON.serialize(result);
        system.debug('result---'+jsonResponse);
        res.responseBody = blob.valueOf(jsonResponse);
        //updata response toAWS 20220225 sushanhu end
        return;
    }
@@ -105,7 +129,7 @@
                if (String.isNotBlank(ged.departmentCd)) {
                    accountCodeList.add(ged.departmentCd);
                }
                system.debug('date---'+Date.valueOf(ged.activityDailyDate));
                dateCalendarMap.put(Date.valueOf(ged.activityDailyDate), null);
            }
@@ -166,11 +190,17 @@
                    ASEAct.VisitStaff__c = ged.customerNm;
                    ASEAct.ReporterASE__c = contactId;//报告者
                    ASEAct.DurationInMinutes__c =  getDurationInMinutes(ged);//持续时间分钟
                    activityIDStr += ged.activityID +'\n';
                    //add             wangweipeng         2022/02/14      start
                    ASEAct.CustomerTel__c = ged.customerTel;//客户手机号码
                    ASEAct.WorkPlace__c = ged.workPlace;//工作场所
                    //add             wangweipeng         2022/02/14      end
                    activityIDStr += ged.activityID +'\n';
                    ASEAct.AWS_Data_Id__c =ged.DataId;//加密索引 20220207
                    ASEAct.VisitStaffEncrypt__c=ged.customerNmEncrypted;//密文 20220207
                   //add sushanhu 2022/02/16 sart
                   ASEAct.CustomerTel_Encrypted__c=ged.customerTelEncrypted;
                   ASEAct.WorkPlace_Encrypted__c =ged.workPlaceEncrypted;
                    //add sushanhu 2022/02/16 end
                    upsertASEList.add(ASEAct);
                }
@@ -329,9 +359,17 @@
        if (String.isBlank(ged.visitDistinction) ) {
            result += 'DataError:  拜访区分 [ visitDistinction ] is null!\n';
        }
        // if (String.isBlank(ged.DataId) ) {
        //     result += 'DataError:  加密索引 [ DataId ] is null!\n';
        // }
        // if (String.isBlank(ged.customerNmEncrypted)) {
        //     result += 'DataError:  客户姓名密文 [ customerNmEncrypted ] is null!\n';
        // }
        if (String.isNotBlank(activityID) && String.isNotBlank(result)) {
            result = activityID + result;
        }
        return result;
    }
force-app/main/default/classes/NFM612Rest.cls
@@ -1,5 +1,9 @@
@RestResource(urlMapping = '/NFM612/*')
global with sharing class NFM612Rest {
    //add to AWS 回复 start sushanhu 20220225
    static Boolean SFStatus=true;
    static String SFMessage='';
   //add to AWS 回复 end sushanhu 20220225
    public static final String LOG_TYPE = 'NFM612';
    global class GeData {
        public RepairOderInfo repairOderInfo;
@@ -14,7 +18,10 @@
        public String departmentCd; //报修科室编码
        public String repairApplyPerson; //报修人用户编码
        public String repairApplicantName; //报修人姓名
        public String repairApplicantNameEncrypted; //报修人姓名密文 add20220214
        public String repairApplyPersonTel; //报修人联系人电话
        public String repairApplyPersonTelEncrypted;//保修人联系电话 密文 add 20220214
        public String DataId;//aws 存储凭证 add 20220214
        public String repairApplyType; // 报修人岗位
        public String equipmentCategory; //设备大类
        public String assetType; //设备类型
@@ -88,8 +95,16 @@
        res.addHeader('Content-Type', 'application/json');
        res.statusCode = 200;
        //String jsonResponse = '{"status": "Success", "Message":'  + gedata + '}';
        String jsonResponse = '{"status": "Success", "Message":"成功"}';
        res.responseBody = Blob.valueOf(jsonResponse);
        // String jsonResponse = '{"status": "Success", "Message":"成功"}';
        // res.responseBody = Blob.valueOf(jsonResponse);
         //updata response toAWS 20220225 sushanhu start
         NFMUtil.NFMResponse result = NFMUtil.getNFMResponse();
         result.SFStatus=SFStatus;
         result.SFMessage=SFMessage;
         String jsonResponse =JSON.serialize(result);
         system.debug('result---'+jsonResponse);
         res.responseBody = blob.valueOf(jsonResponse);
         //updata response toAWS 20220225 sushanhu end
        return;
    }
    @future(callout = true)
@@ -220,7 +235,9 @@
                    repair.EndTimeThird__c = NFMUtil.parseStr2DateTime(ged.repairOderInfo.endTimeThird); //三次上门结束时间
                    repair.FaultDescriptionThird__c = ged.repairOderInfo.faultDescriptionThird; //三次故障描述
                    repair.ApplicantType__c = ged.repairOderInfo.applicantType; //申请修理人类型
                    repair.RepairApplicantName_Encrypted__c =ged.repairOderInfo.repairApplicantNameEncrypted; //报修人姓名密文 add 20220214
                    repair.RepairApplicantTel_Encrypted__c = ged.repairOderInfo.repairApplyPersonTelEncrypted;//保修人联系电话密文 add 20220214
                    repair.AWS_Data_Id__c =ged.repairOderInfo.DataId;//AWS 存储凭证 add 20220214
                    // repair.Applicant__c = canidMap.get(ged.repairOderInfo.applicantId).Id; //申请修理人编号
                    repair.Applicanter__c = personMap.get(ged.repairOderInfo.applicantId);//申请修理人编号
                    repair.ApplicationTime__c = NFMUtil.parseStr2DateTime(ged.repairOderInfo.applyDate); //申请时间
@@ -230,6 +247,8 @@
                    repair.AirframeCodeEngineer__c = ged.applyRepairInfo.equipmentCd; //机身编码(工程师)
                    repair.ResponseResultDesc__c = ged.applyRepairInfo.responseResultDesc; //应对描述
                    repair.ProcessResult__c = ged.applyRepairInfo.processResult; //处理结果
                    if ('问题已解决'.equals(ged.applyRepairInfo.processResult)) {
                        repair.Status__c = '关闭';
                    } else {
force-app/main/default/classes/NFM620Rest.cls
@@ -10,7 +10,10 @@
@RestResource(urlMapping = '/NFM620/*')
global with sharing class NFM620Rest {
    //新增NFM620Rest 商品询问单接收数据接口 精琢技术 start
   //add to AWS 回复 start sushanhu 20220225
   static Boolean SFStatus=true;
   static String SFMessage='';
  //add to AWS 回复 end sushanhu 20220225
    global class GeDatas {
        public NFMUtil.Monitoring Monitoring;
        public  GeData[] GeData;
@@ -26,6 +29,9 @@
        public String Request;                   // 委托事项
        public String RequestDetail;             // 委托事项详细
        public String ApproverID;                // 审核人员员工编码
        public String ContactWayEncrypted;         //联系方式密文 for pi
        public String DataId;                      //AWS 加密凭据
        public Integer ContactType;                 //联系方式 1为邮箱 2为电话
    }
    @HttpPost
@@ -34,7 +40,7 @@
        // 取得接口传输内容
        String strData = RestContext.request.requestBody.toString();
        GeDatas ges = (GeDatas) JSON.deserializeStrict(strData, GeDatas.class);
        system.debug('rquest----'+strData);
        if (ges == null ) {
            return;
        }
@@ -53,8 +59,16 @@
        RestResponse res = RestContext.response;
        res.addHeader('Content-Type', 'application/json');
        res.statusCode = 200;
        String jsonResponse = '{"status": "Success", "Message":""}';
        // String jsonResponse = '{"status": "Success", "Message":""}';
        // res.responseBody = blob.valueOf(jsonResponse);
        //updata response toAWS 20220225 sushanhu start
        NFMUtil.NFMResponse result = NFMUtil.getNFMResponse();
        result.SFStatus=SFStatus;
        result.SFMessage=SFMessage;
        String jsonResponse =JSON.serialize(result);
        system.debug('result---'+jsonResponse);
        res.responseBody = blob.valueOf(jsonResponse);
        //updata response toAWS 20220225 sushanhu end
        return;
    }
@@ -177,9 +191,6 @@
                    }
                }
            }
            // 将XML各数据项更新到商品询问单对象中
            for (GeData geData : geDataListNew) {
@@ -195,6 +206,8 @@
                if (String.isNotBlank(ownerMap.get(geData.ApproverID))){
                    inquiry.OwnerId = ownerMap.get(geData.ApproverID);            //所有人
                }
                inquiry.AWS_Data_Id__c =geData.DataId;                              //AWS加密凭据 add 200220214
                
                //委托事项取值后拆分
                List<String> requestList = geData.Request.split(';');
@@ -226,12 +239,17 @@
                }
                logstr += '咨询单来源:' + inquiry.LeadSource__c + '\n';
                //联系方式的值是否包含@来判断是邮箱还是电话
                if (geData.ContactWay.contains('@')) {
                if (geData.ContactType==1) {
                    inquiry.Phone__c = '';                            //电话
                    inquiry.Phone_Encrypted__c='';                     //电话密文 add 20220214
                    inquiry.Email__c = geData.ContactWay;             //邮箱
                    inquiry.Email_Encrypted__c =geData.ContactWayEncrypted; //邮箱密文 add 20220214
                } else {
                    inquiry.Phone__c = geData.ContactWay;
                    inquiry.Email__c = '';
                    inquiry.Email_Encrypted__c = ''; //邮箱密文 add 20220214
                    inquiry.Phone_Encrypted__c=geData.ContactWayEncrypted;    //电话密文 add 20220214
                }
                if (String.isNotBlank(inqInfoMap.get(geData.InquiryNo))) {
force-app/main/default/classes/NFM623Rest.cls
@@ -9,6 +9,10 @@
*************************************************************************/
@RestResource(urlMapping = '/NFM623/*')
global with sharing class NFM623Rest {
     //add to AWS 回复 start sushanhu 20220225
     static Boolean SFStatus=true;
     static String SFMessage='';
    //add to AWS 回复 end sushanhu 20220225
    //新增NFM623Rest 学会·活动参加人员接收数据接口 精琢技术 start
    global class GeDatas {
@@ -19,7 +23,7 @@
    global class GeData {
        public String Num;                              // 活动编码
        public String Name;                             // 活动名称
        public ViewContactIdS[] ViewContactIdS;
        public ViewContactIdS[] ViewContactIdS;      //替换为aws存储凭据ID 20220225 sushanhu
        public LabelTypeS[] LabelTypeS;
    }
@@ -57,8 +61,16 @@
        RestResponse res = RestContext.response;
        res.addHeader('Content-Type', 'application/json');
        res.statusCode = 200;
        String jsonResponse = '{"status": "Success", "Message":""}';
        // String jsonResponse = '{"status": "Success", "Message":""}';
        // res.responseBody = blob.valueOf(jsonResponse);
        //updata response toAWS 20220225 sushanhu start
        NFMUtil.NFMResponse result = NFMUtil.getNFMResponse();
        result.SFStatus=SFStatus;
        result.SFMessage=SFMessage;
        String jsonResponse =JSON.serialize(result);
        system.debug('result---'+jsonResponse);
        res.responseBody = blob.valueOf(jsonResponse);
        //updata response toAWS 20220225 sushanhu end
        return;
    }
@@ -130,6 +142,18 @@
                        conIDList.add(conInfo.Id);
                    }
                } 
                //update to 通过aws存储的unified查询 start 20220225
                // List<Contact> contactList = [select Id,Name,AWS_UnifiedI_Contact_ID__c,
                //                             AccountId,Account.Name
                //                             from Contact where AWS_UnifiedI_Contact_ID__c in :conIDListNew];
                // if (contactList.size() > 0) {
                //     //客户人员ID获取成功
                //     for (Contact conInfo : contactList) {
                //         contactMap.put(conInfo.AWS_UnifiedI_Contact_ID__c, conInfo);
                //         conIDList.add(conInfo.Id);
                //     }
                // }
                //update to 通过aws存储的unified查询 20220225 end
            }
            //使用市场活动编码获取市场活动ID和活动名称存入Map
            List<String> camIDList = new List<String>();
@@ -156,6 +180,19 @@
                }
            }
            //update to 获取aws 统一凭据关联 sushanhu 20220225 satrt
            // List<CampaignMember__c>  camMemberList = [select Id,Contact_ID__c,AWS_ViewContact_Id__c,
            //                                             Campaign__c,Campaign__r.Num__c
            //                                             from CampaignMember__c where Campaign__c in : camIDList];
            // Map<String, String> camContactMap = new Map<String, String>();
            // Map<String, String> camViewContactMap = new Map<String, String>();
            // if (camMemberList.size() > 0 ) {
            //     for (CampaignMember__c cm : camMemberList) {
            //         camContactMap.put(cm.Contact_ID__c, cm.Campaign__r.Num__c);
            //         camViewContactMap.put(cm.AWS_ViewContact_Id__c, cm.Campaign__r.Num__c);
            //     }
            // }
             //update to 获取aws 统一凭据关联 sushanhu 20220225 end
            //将原有活动标签对象中市场活动ID和标签活动名称存入Map中
            List<CampaignLable__c> camLabInfoList = [select id,name,Campaign__c,Lable__c,LableType__c from CampaignLable__c where  Campaign__c in : camIDList];
            Map<String, String> camLabInfoMap = new Map<String, String>();
force-app/main/default/classes/NFM624Rest.cls
@@ -10,6 +10,10 @@
@RestResource(urlMapping = '/NFM624/*')
global with sharing class NFM624Rest {
    //add to AWS 回复 start sushanhu 20220225
    static Boolean SFStatus=true;
    static String SFMessage='';
   //add to AWS 回复 end sushanhu 20220225
    private static final String LOG_TYPE = 'NFM624';
    // global class GeDatasRest {
    //     public GeDatas GeDatas;
@@ -21,13 +25,15 @@
    }
    global class GeData {
        public String ContactId; //统一平台ID
        public String ContactId; //统一平台ID//Update to aws 存储的AWSContactId 20220225 SUSHANHU
        public String ServiceUserId; //服务平台用户ID
        public String PersonManagementCode; //人员管理编码 
        public String HospitalManagementCode2; //医院平台编码  平台编码 PlatformCode__c
        public String DepartmentManagementCode2; //科室平台编码  平台编码 PlatformCode__c
        public String Name; //姓名
        public String NameEncrypted;//姓名密文 add 20220215
        public String Mobile; //手机号码
        public String MobileEncrypted;//手机号码密文 add 20220215
        public String State; //单位所在省份
        public String City; //市
        public String AccountName; //医院名
@@ -37,10 +43,12 @@
        public String RelatedDepartment; //关联SFDC科室 客户管理编码(手写) AgentCode_Ext__c
        public String Type; //职种
        public String ContactAddress; //联系地址
        public String ContactAddressEncrypted;//联系地址密文
        public Boolean ForbiddenStatus; //平台用户禁用标识
        public String RegSource; //注册平台来源
        public Boolean AgentFlag; //经销商标识
        public String ApproverID; //审核人员员工编码
        public String DataId;//aws存储凭据
    }
    @HttpPost
@@ -49,7 +57,7 @@
        // 取得接口传输内容
        String strData = RestContext.request.requestBody.toString();
        GeDatas ges = (GeDatas) JSON.deserializeStrict(strData, GeDatas.class);
        system.debug('ges---'+ges);
        if (ges == null) {
            return;
@@ -71,8 +79,16 @@
        RestResponse res = RestContext.response;
        res.addHeader('Content-Type', 'application/json');
        res.statusCode = 200;
        String jsonResponse = '{"status": "Success", "Message":""}';
        // String jsonResponse = '{"status": "Success", "Message":""}';
        // res.responseBody = blob.valueOf(jsonResponse);
         //updata response toAWS 20220225 sushanhu start
         NFMUtil.NFMResponse result = NFMUtil.getNFMResponse();
         result.SFStatus=SFStatus;
         result.SFMessage=SFMessage;
         String jsonResponse =JSON.serialize(result);
         system.debug('result---'+jsonResponse);
        res.responseBody = blob.valueOf(jsonResponse);
         //updata response toAWS 20220225 sushanhu end
        return;
    }
@@ -130,7 +146,11 @@
        try { //根据传过来的管理编码查询如果可以查询得到结果则更新,查询不到则新增
            List < Gedata > newGeDataList = new List < Gedata > ();
            for (Gedata gedata: GeDataList) {
                string dataComplete = verify(gedata);
                //for test
                gedata.AgentFlag=false;
                // string dataComplete = verify(gedata);
                string dataComplete =null;
                // test  end  for pi
                if (!String.isBlank(dataComplete)) {
                    logstr += dataComplete;
                    rowData.Is_Error__c = 1;
@@ -282,12 +302,18 @@
                    ct.MobilePhone = gedata.Mobile;
                    ct.RegSource__c = comefrom;
                    ct.UnifiedI_Contact_ID__c = gedata.ContactId; //统一平台Id
                    // //UPDATE TO AWS 存储的统一平台id
                    // ct.AWS_UnifiedI_Contact_ID__c=gedata.ContactId; //统一平台Id
                    ct.ServicePlatformCode__c = gedata.ServiceUserId; //服务平台用户Id
                    ct.Contact_address__c = gedata.ContactAddress;//联系地址
                    ct.Contact_address_Encrypted__c=gedata.ContactAddressEncrypted;//联系地址密文 add 20220215
                    ct.Platform_disabled_representation__c = gedata.ForbiddenStatus;//平台禁用标识
                    //ct.IsFromPlatform__c = true; //来自智慧医疗创建
                    ct.Ignore_Same_Name__c = true; //不是重复的客户名 
                    //ct.SendToComPlat__c = true;
                    ct.AWS_Data_Id__c =gedata.DataId;//add 20220215 aws存储凭证
                    ct.MobilePhone_Encrypted__c =gedata.MobileEncrypted;//add 20220215 手机密文
                    ct.LastName_Encrypted__c =gedata.NameEncrypted;//add 20220215 姓名密文
                    String personCode = gedata.PersonManagementCode;
@@ -518,11 +544,19 @@
        if (string.isblank(gda.Name)) {
            result += 'DataError:姓名为空\n';
        }
        if (string.isblank(gda.NameEncrypted)) {
            result += 'DataError:姓名密文为空\n';
        }
        if (string.isblank(gda.Mobile)) {
            result += 'DataError:手机号为空\n';
        }
        if (string.isblank(gda.MobileEncrypted)) {
            result += 'DataError:手机号密文为空\n';
        }
        if (string.isblank(gda.RegSource)) {
            result += 'DataError:注册平台来源为空\n';
        }if (string.isblank(gda.DataId)) {
            result += 'DataError:AWS加密凭据为空\n';
        }
        if (gda.AgentFlag) {
            if (string.isblank(gda.PersonManagementCode)) {
@@ -618,7 +652,6 @@
        List<Inquiry_form__c> InquiryList = [select Id,Inquiry_No__c,ContactId__c,Hospital_Name__c,Department_Class__c,Contact_Name__c from Inquiry_form__c where ContactId__c = :ContactId];
        system.debug('InquiryList'+InquiryList);
        //根据统一用户Id查询联系人
        //select Id,Name,UnifiedI_Contact_ID__c,AccountId,Account.Name from Contact
        List<Contact> contactList = [select Id,Name,UnifiedI_Contact_ID__c,Account.Id,Strategic_dept_Class__c,AccountId,Account.Name,Strategic_dept_Class__r.OwnerId from Contact where UnifiedI_Contact_ID__c = :ContactId];
        system.debug('contactList' + contactList);  
        
@@ -649,7 +682,8 @@
        //补充询问单部分 end
        
        //补充学会部分 start
        List<CampaignMember__c> capMemList = [select Id,Contact_ID__c,Campaign__c,Campaign__r.Num__c,ViewContactId__c from CampaignMember__c where ViewContactId__c = :ContactId];
        List<CampaignMember__c> campaignMemberList = new List<CampaignMember__c>();
        List<CampaignMember__c> capMemList = [select Id,Contact_ID__c,Campaign__c,Campaign__r.Num__c,ViewContactId__c from CampaignMember__c where Contact_ID__c = :ContactId];
        if(capMemList.size() > 0){
            system.debug('capMemList=================>'+capMemList);
            Map<String, String> capMemMap = new Map<String, String>(); 
force-app/main/default/classes/NFM702Controller.cls
@@ -39,6 +39,9 @@
        public String HcpNo;    //HPC编码
        public Boolean IsActive;    //是否有效
        public String UpdateStatus;     //操作类型
        // add by sushanhu 20220304 for pi satrt
        public String DataId;           //aws 存储凭据
        // add by sushanhu 20220304 for pi end
    }
    @future(callout = true)
@@ -72,7 +75,8 @@
                                        Phone,      //电话
                                        HcpNo__c,       //HCP编码
                                        Isactive__c,    //是否有效
                                        UpdateStatus__c            //操作类型
                                        UpdateStatus__c,            //操作类型
                                        AWS_Data_Id__c              //aws 存储凭据 add bysushanhu 20220304 for Pi
                                        from Contact WHERE Id IN:accIdList order by Id];  //AccountId
        String logstr = iflog.Log__c + ' ' + 'NumberOfRecord=' + conList.size() + '\n';
@@ -98,6 +102,7 @@
                ged.HcpNo = con.HcpNo__c;
                ged.IsActive = '有效'.equals(con.Isactive__c)? true:false;
                ged.UpdateStatus = con.UpdateStatus__c;
                ged.DataId  =   con.AWS_Data_Id__c;//add by sushanhu  for pi 20220304
                gds.GeData.add(ged);
            }
@@ -178,26 +183,56 @@
        }
        try {
            NFMUtil.response response = NFMUtil.sendToSapStatusAndBody(rowDataStr, NFMUtil.NFM702_ENDPOINT);
            System.debug('NFM702Log--status->'+ status);
            // NFMUtil.response response = NFMUtil.sendToSapStatusAndBody(rowDataStr, NFMUtil.NFM702_ENDPOINT);
            // System.debug('NFM702Log--status->'+ status);
            // status = response.status;
            // ResponseBody = response.responseBody;
            // Response resultList = ( Response ) JSON.deserializeStrict(ResponseBody, Response.class);
            // System.debug('NFM702Log--status->'+ ResponseBody);
            // Result = resultList.Result.Result;
            // if ('00'.equals(Result)) {
            //     logstr += ResponseBody+'\n';
            //     rowDataSFDC.retry_cnt__c = 0;
            //     //iflog.Log__c = 'ok';
            // }
            // else {
            //     //iflog.Log__c = 'ok2';
            //     rowDataSFDC = NFMUtil.LogAutoSend(rowDataSFDC, null, status);
            // }
            //update to AWS sushanhu FOR PI start 20220304
            PIHelper.PIIntegration pi =PIHelper.getPIIntegrationInfo('NFM702');
            NFMUtil.response response = NFMUtil.sendToPiAWS(rowDataStr, pi.newUrl,pi.token);
            status = response.status;
            System.debug('NFM702Log--status->'+ status);
            ResponseBody = response.responseBody;
            Response resultList = ( Response ) JSON.deserializeStrict(ResponseBody, Response.class);
            System.debug('NFM702Log--status->'+ ResponseBody);
            System.debug('NFM702Log--responsebody->'+ ResponseBody);
            if ('200'.equals(status)) {
                //aws 正确响应
                // Response resultList = ( Response ) JSON.deserializeStrict(ResponseBody, Response.class);
                Map<String, Object> result = (Map<String, Object>)JSON.deserializeUntyped(ResponseBody);
                String statusCode =(String)result.get('status');
            Result = resultList.Result.Result;
            if ('00'.equals(Result)) {
                if ('0'.equals(statusCode)) {
                logstr += ResponseBody+'\n';
                rowDataSFDC.retry_cnt__c = 0;
                //iflog.Log__c = 'ok';
            }
            else {
                } else {
                //iflog.Log__c = 'ok2';
                rowDataSFDC = NFMUtil.LogAutoSend(rowDataSFDC, null, status);
            }
            }
            else {
                logstr=ResponseBody;
                iflog.ErrorLog__c=ResponseBody;
            }
            //update to AWS sushanhu FOR PI  20220304 end
        }catch ( Exception ex ) {
           //打印错误日志
           System.debug(Logginglevel.ERROR, LOG_TYPE + iflog.Name + ':' + ex.getMessage());
force-app/main/default/classes/NFMUtil.cls
@@ -78,7 +78,8 @@
            //NFM007_ENDPOINT = 'http://wdp.olympus.com.cn:8089/RESTAdapter/NFM007';
            NFM007_ENDPOINT = 'https://wdp.olympus.com.cn:44301/RESTAdapter/NFM007';
            NFM008_ENDPOINT = 'https://owdc-test.olympus.co.jp/XISOAPAdapter/MessageServlet?senderParty=&senderService=OCM_SFDC_T&receiverParty=&receiverService=&interface=NFM008_Sync_BC2GPI&interfaceNamespace=http%3A%2F%2Folympus.co.jp%2Fgpi%2FNFM008';
            NFM103_ENDPOINT = 'http://wdp.olympus.com.cn:8089/RESTAdapter/NFM103';
            // NFM103_ENDPOINT = 'http://wdp.olympus.com.cn:8089/RESTAdapter/NFM103';
            NFM103_ENDPOINT = 'https://sfpi-mebg-test.olympuschina.com/api/nfm/103';//aws 103接口
            // NFM106_ENDPOINT = 'https://owdc-test.olympus.co.jp/XISOAPAdapter/MessageServlet?senderParty=&senderService=OCM_SFDC_T&receiverParty=&receiverService=&interface=NFM106_Sync_BC2GPI&interfaceNamespace=http%3A%2F%2Folympus.co.jp%2Fgpi%2FNFM106';
            NFM106_ENDPOINT = 'http://wdp.olympus.com.cn:8089/RESTAdapter/NFM106';
            //NFM106_ENDPOINT = 'https://sfdc-ocm-test.olympus.co.jp/XISOAPAdapter/MessageServlet?senderParty=&senderService=OCM_SFDC_T&receiverParty=&receiverService=&interface=NFM106_Sync_BC2GPI&interfaceNamespace=http%3A%2F%2Folympus.co.jp%2Fgpi%2FNFM106';
@@ -100,16 +101,16 @@
            NFM401_ENDPOINT = 'http://ec2-161-189-3-104.cn-northwest-1.compute.amazonaws.com.cn:8088/dojtest/dojInfo/recevie';
            NFM402_ENDPOINT = 'http://ec2-161-189-3-104.cn-northwest-1.compute.amazonaws.com.cn:8088/dojtest/dojInfo/getDojInfoByRefNo';
            NFM501_ENDPOINT = 'http://cusdata.qianlima.com/v1/info/page/';
            NFM502_ENDPOINT = 'http://cusdata.qianlima.com/v1/info/detailHtml?url=';
            NFM504_ENDPOINT = 'http://cusdata.qianlima.com/v1/customer/albs/feedback';
            // NFM501_ENDPOINT = 'http://cusdata.qianlima.com/test/v1/info/page/';
            NFM501_ENDPOINT = 'https://sfpi-mebg-test.olympuschina.com/api/nfm/501';
            NFM502_ENDPOINT = 'http://cusdata.qianlima.com/test/v1/info/detailHtml?url=';
            NFM504_ENDPOINT = 'http://cusdata.qianlima.com/test/v1/customer/albs/feedback';
            CBPR_Auth_Sap = 'Basic U0ZEQ19XU1VTRVI6cG9xMTIzNDU=';
            // LHJ 20180824 CBPR End
            //CBPR_Auth_Spo = 'http://cbpr.chinacloudsites.cn/sfdc/token';
            CBPR_Auth_Spo = 'http://cbpr.olympuschina.com/sfdc/token';
            QLM_Token = 'http://cusdata.qianlima.com/v1/token';
            // 智慧医疗&服务新系统通信 客户接口
            NFM601_ENDPOINT = 'https://wdp.olympus.com.cn:44301/RESTAdapter/NFM601';
@@ -143,7 +144,7 @@
            NFM007_ENDPOINT = 'https://wdp.olympus.com.cn:44302/RESTAdapter/NFM007';
            NFM008_ENDPOINT = 'https://owdc.olympus.co.jp/XISOAPAdapter/MessageServlet?senderParty=&senderService=OCM_SFDC_P&receiverParty=&receiverService=&interface=NFM008_Sync_BC2GPI&interfaceNamespace=http%3A%2F%2Folympus.co.jp%2Fgpi%2FNFM008';
            //NFM103_ENDPOINT = 'https://owdc.olympus.co.jp/XISOAPAdapter/MessageServlet?senderParty=&senderService=OCM_SFDC_P&receiverParty=&receiverService=&interface=NFM103_Sync_BC2GPI&interfaceNamespace=http%3A%2F%2Folympus.co.jp%2Fgpi%2FNFM103';
            NFM103_ENDPOINT = 'https://wdp.olympus.com.cn:44302/RESTAdapter/NFM103';
            NFM103_ENDPOINT = 'https://wdp.olympus.com.cn:44302/RESTAdapter/NFM103';// 原saphost
            //NFM106_ENDPOINT = 'https://owdc.olympus.co.jp/XISOAPAdapter/MessageServlet?senderParty=&senderService=OCM_SFDC_P&receiverParty=&receiverService=&interface=NFM106_Sync_BC2GPI&interfaceNamespace=http%3A%2F%2Folympus.co.jp%2Fgpi%2FNFM106';
            NFM106_ENDPOINT = 'https://wdp.olympus.com.cn:44302/RESTAdapter/NFM106';
            // LHJ 20180824 CBPR Start
@@ -158,7 +159,8 @@
            NFM401_ENDPOINT = 'http://ec2-161-189-3-104.cn-northwest-1.compute.amazonaws.com.cn:8082/doj/dojInfo/recevie';
            NFM402_ENDPOINT = 'http://ec2-161-189-3-104.cn-northwest-1.compute.amazonaws.com.cn:8082/doj/dojInfo/getDojInfoByRefNo';
            NFM501_ENDPOINT = 'http://cusdata.qianlima.com/v1/info/page/';
            // NFM501_ENDPOINT = 'http://cusdata.qianlima.com/v1/info/page/';
            NFM501_ENDPOINT   ='https://sfpi-mebg-test.olympuschina.com/api/nfm/501';
            NFM502_ENDPOINT = 'http://cusdata.qianlima.com/v1/info/detailHtml?url=';
            NFM504_ENDPOINT = 'http://cusdata.qianlima.com/v1/customer/albs/feedback';
            CBPR_Auth_Sap = 'Basic U0ZEQ19XU1VTRVI6cG9wMTIzNDU=';
@@ -228,7 +230,25 @@
        webservice String timestamp;
        webservice String appKey;
    }
    global class NFMResponse{
        public Boolean SFStatus;
        public String SFMessage;
        public StaticResponse staticResponse;
    }
    global class StaticResponse{
        public string status;
        public String Message;
        public StaticResponse(){
            status='Success';
            Message='';
        }
    }
    public static NFMResponse getNFMResponse(){
        NFMResponse  result=new NFMResponse();
        result.staticResponse =new StaticResponse();
        return result;
    }
    /**
     * @return yyyyMMdd の日付文字列
     */
@@ -601,32 +621,6 @@
        return rowData;
    }
    // public static BatchIF_Log__c makeRowDataToOnline(NFMUtil.MonitoringToOnline Monitoring, String NFMType, Object NFMData) {
    //     BatchIF_Log__c rowData = new BatchIF_Log__c();
    //     rowData.Type__c = NFMType;
    //     rowData.MessageGroupNumber__c = Monitoring.MessageGroupNumber;
    //     rowData.TransmissionDateTime__c = Monitoring.TransmissionDateTime;
    //     rowData.RowDataFlg__c = true;
    //     rowData.Log__c = '';
    //     rowData.ErrorLog__c = '';
    //     String rowDataStr = JSON.serialize(NFMData);
    //     if (rowDataStr.length() > 0) {
    //         Integer splitIdx = 1;
    //         while (rowDataStr.length() > 0) {
    //             if (splitIdx == 1) {
    //                 rowData.put('Log__c', rowDataStr.substring(0, (rowDataStr.length() > MaxLogColumnLength ? MaxLogColumnLength : rowDataStr.length())));
    //             } else if (splitIdx == 13) {
    //                 rowData.ErrorLog__c = rowDataStr;
    //                 break;
    //             } else {
    //                 rowData.put('Log' + splitIdx + '__c', rowDataStr.substring(0, (rowDataStr.length() > MaxLogColumnLength ? MaxLogColumnLength : rowDataStr.length())));
    //             }
    //             splitIdx++;
    //             rowDataStr = rowDataStr.substring((rowDataStr.length() > MaxLogColumnLength ? MaxLogColumnLength : rowDataStr.length()));
    //         }
    //     }
    //     return rowData;
    // }
    public static BatchIF_Log__c makeRowData(BatchIF_Log__c iflog, String NFMType, Object NFMData) {
        // TransmissionDateTimeの設定
        Datetime nowDT = Datetime.now();
@@ -868,7 +862,30 @@
        system.debug('ress:' + ress);
        return new response(ress, resb);
    }
    // send to aws to sap sushuanhu 20220222
    public static response sendToPiAWS(String rowDataStr, String endpoint,String awsToken) {
        Http http = new Http();
        HttpRequest req = new HttpRequest();
        HTTPResponse res;
        String resb;
        req.setTimeout(120000);
        req.setEndpoint(endpoint);
        req.setMethod('POST');
        req.setHeader('Content-Type', 'application/json');
        req.setHeader('pi-token', awsToken);
        req.setBody(rowDataStr);
        res = http.send(req);
        string ress =String.valueof(res.getStatusCode());
        resb = res.getBody();
        system.debug('ress:' + ress);
        return new response(ress, resb);
    }
    // 获取aws token sushanhu 20220222
    public static response getAwsToken(){
        String responseBody = AWSServiceTool.getAWSToken();
        return new response('success', responseBody);
    }
    public class response {
        public string status;
        public string responseBody;
@@ -989,6 +1006,51 @@
        //正常执行
        return new response(ress, response.getBody());
    }
    // NEW QLM AWS 501  接口 sushanhu 20220223
    public static response getAWSQLMData(String endpoint, String token) {
        //2、获取招标信息:记得使用1中获取的token
        Http http = new Http();
        HttpRequest req = new HttpRequest();
        req.setHeader('Content-Type', 'application/json');
        req.setHeader('pi-token',  token);
        req.setTimeout(120000);
        req.setEndpoint(endpoint);
        req.setMethod('GET');
        HTTPResponse response = http.send(req);
        String statusCode = response.getStatus();
        System.debug('response:' + response);
        //http:状态和code
        //如果状态不通过 , 则将状态及空的的数据 , 返回
        if (String.isNotBlank(statusCode)) {
            return new response(statusCode, null);
        }
        System.debug('=====2======' + response.getBody());
        //正常执行
        return new response(statusCode, response.getBody());
    }
    // NEW QLM AWS 502 503接口 sushanhu 20220223
    public static response getAWSQLMData(String endpoint,String jsonStr,  String token) {
        //2、获取招标信息:记得使用1中获取的token
        Http http = new Http();
        HttpRequest req = new HttpRequest();
        req.setHeader('Content-Type', 'application/json');
        req.setHeader('pi-token',  token);
        req.setTimeout(120000);
        req.setEndpoint(endpoint);
        req.setMethod('POST');
        req.setBody(jsonStr);
        HTTPResponse response = http.send(req);
        String statusCode = response.getStatus();
        System.debug('response:' + response);
        //http:状态和code
        //如果状态不通过 , 则将状态及空的的数据 , 返回
        if (String.isNotBlank(statusCode)) {
            return new response(statusCode, null);
        }
        System.debug('=====2======' + response.getBody());
        //正常执行
        return new response(statusCode, response.getBody());
    }
    //接口3,获取其他附件
    public static response503 getFileData(String token503, String endpoint) {
@@ -1035,7 +1097,7 @@
    public static String sendTenInfo(String token504, String jsonStr, String endpoint) {
        Http http = new Http();
        HttpRequest req = new HttpRequest();
        req.setEndpoint('http://cusdata.qianlima.com/test/v1/customer/albs/feedback');
        req.setEndpoint(endpoint);
        req.setHeader('open-authorization', 'Bearer' + token504);
        req.setHeader('Content-Type', 'application/x-www-form-urlencoded');
        req.setMethod('POST');
@@ -1153,6 +1215,8 @@
        system.debug('resb:' + resb);
        return resb;
    }
    //发送给共通平台 精琢技术 thh 2021-09-22 end
    
    public static Integer ControllerUtil() {
force-app/main/default/classes/NewAndEditAddressController.cls
@@ -1,13 +1,13 @@
/*
 * Author: Bubba Li
 * Author: Yanan Chen
 * Created Date: 02/08/2022
 * Purpose: Utility class for describe layouts
 * Test Class: NewAndEditAddressController
 * History: 
 *      02/08/2022 - Bubba Li - Initial Code.
 *      02/08/2022 - Yanan Chen - Initial Code.
 * 
 * */
public without sharing class NewAndEditAddressController {
global without sharing class NewAndEditAddressController {
    public List <LayoutDescriberHelper.LayoutSection > layoutSections{set;get;}
    public String awsToken{set;get;}
    public static Map<String, Schema.SObjectType> schemaMap = Schema.getGlobalDescribe();
@@ -15,50 +15,75 @@
    public Boolean isNewMode{set;get;}
    public String rtTypeId {get; set;}
    public String AWSDataId{set;get;}
    //fieldLabel fieldAPI
    public String fieldApiListStr {get; set;}
    public String contactId{set;get;}//For Lookup field
    public List<String> encryptedAPIList{set;get;}
    public String staticResource {get; set;}
    public String staticResourceContact {get; set;}
    public String requiredFieldAPIListStr {get; set;}
    public String fieldAPIToLabelMapStr {get; set;}
    public String Input_Required_Field_Msg{set;get;}
    public String PIPL_Name_Label{set;get;}
    public String PIPL_Input_Account_Error_Msg{set;get;}
    public String sobjectPrefix{set;get;}
    public String sobjecttypeForFrontEnd{set;get;}
    public String contactsInfo {set;get;}//key sfid;value awsid
    public NewAndEditAddressController(ApexPages.StandardController controller) {
        isNewMode = true;
        Input_Required_Field_Msg = Label.Input_Required_Field_Msg;
        PIPL_Name_Label = Label.PIPL_Name_Label;
        PIPL_Input_Account_Error_Msg = label.PIPL_Input_Account_Error_Msg;
        sobjecttypeForFrontEnd = sobjectTypeValue;
        //获取所有字段
        List<String> fieldList = new List<String>(Schema.getGlobalDescribe().get('Address__c').getDescribe().fields.getMap().keyset());  
        // Add fields to controller. This is to avoid the SOQL error in visualforce page
        controller.addFields(fieldList);
        SObject obj = controller.getRecord();
        rtTypeId = ApexPages.currentPage().getParameters().get('RecordType');
        rtTypeId = '0121m000000kiMxAAI';//For testing
        layoutSections = LayoutDescriberHelper.describeSectionWithFields(rtTypeId, 'Address__c','classic');
        if(obj.Id != null){
            //更新
            isNewMode = false;
            Address__c addressData = [select Id, RecordTypeId, AWS_Data_Id__c from Address__c where id =: obj.Id];
            Address__c addressData = [select Id, RecordTypeId, AWS_Data_Id__c, Contacts__r.Id, Contacts__r.AWS_Data_Id__c from Address__c where id =: obj.Id];
            rtTypeId = addressData.RecordTypeId;
            AWSDataId = addressData.AWS_Data_Id__c;
            Map<String,String> sfIdToAWSIdMap = new Map<String,String>();
            // if(addressData.Contacts__r.Id != null){
            //     sfIdToAWSIdMap.put(String.valueof(addressData.Contacts__r.Id).subString(0,15),addressData.Contacts__r.AWS_Data_Id__c);
            // }
            sfIdToAWSIdMap.put(String.valueof(addressData.Contacts__r.Id).subString(0,15),addressData.Contacts__r.AWS_Data_Id__c);
            contactsInfo = JSON.serialize(sfIdToAWSIdMap);
        }else{
            //新建
            rtTypeId = ApexPages.currentPage().getParameters().get('RecordType');
        }
        List<String> fieldApiList = new List<String>();
        for (LayoutDescriberHelper.LayoutSection ls : layoutSections) {
            for (LayoutDescriberHelper.LayoutField lf : ls.layoutFields) {
                if (lf.fieldAPI != '') {
                    fieldApiList.add(lf.fieldAPI);
                }
            }
        }
        fieldApiListStr = JSON.serialize(fieldApiList);
        awsToken = AWSServiceTool.getAWSToken();
        LayoutDescriberHelper.LayoutWrapper LayoutWrapperValue = LayoutDescriberHelper.describeSectionWithFieldsWrapper(rtTypeId, 'Address__c','classic');
        layoutSections = LayoutWrapperValue.layoutSections;
        List<String> requiredFieldAPIList = LayoutWrapperValue.requiredFieldAPIList;
        Map<String,String> fieldAPIToLabelMap = LayoutWrapperValue.fieldAPIToLabelMap;
        requiredFieldAPIListStr = JSON.serialize(requiredFieldAPIList);
        fieldAPIToLabelMapStr = JSON.serialize(fieldAPIToLabelMap);
        PIHelper.PIIntegration piIntegration = PIHelper.getPIIntegrationInfo('Address__c');
        staticResource = JSON.serialize(piIntegration);
        staticResourceContact = JSON.serialize(PIHelper.getPIIntegrationInfo('Contact'));
        encryptedAPIList = piIntegration.PIFields;
        sobjectPrefix = piIntegration.sobjectPrefix;
    }
    public class Response{
    global class Response{
        public String recordId{set;get;}
        public String message{set;get;}
        public String status{set;get;}
    }
    @RemoteAction
    public static Response saveAddress(String addressJson,String transId,Boolean isNew) {
    global static Response saveAddress(String addressJson,String transId,Boolean isNew) {
        System.debug('Address Info:' + JSON.serialize(addressJson));
        //1. Prepare the payload for  Address
        Schema.SObjectType addressSchema = schemaMap.get(sobjectTypeValue);
        Map<String, Schema.SObjectField> fieldAPIToTypeMap = addressSchema.getDescribe().fields.getMap();
        Map<String,Object> fieldValueMap = (Map<String,Object>)JSON.deserializeUntyped(addressJson);
        Address__c addressInfo = new Address__c();
        //自定义格式转换
        for (String fieldAPI: fieldValueMap.keySet()) {
            system.debug('field API'+fieldAPI);
            Schema.DisplayType fielddataType = fieldAPIToTypeMap.get(fieldAPI).getDescribe().getType();  
            String fieldValue = String.valueOf(fieldValueMap.get(fieldAPI)); 
            if(String.isBlank(fieldValue)){
@@ -75,7 +100,7 @@
            }else if(String.valueOf(fielddataType)=='Number'||String.valueOf(fielddataType)=='DOUBLE' ){
                addressInfo.put(fieldAPI, Decimal.valueOf(String.valueOf(fieldValueMap.get(fieldAPI))));
            } else if(String.valueof(fielddataType)=='BOOLEAN'){
                addressInfo.put(fieldAPI, Boolean.valueOf(fieldValueMap.get(fieldAPI)));
                addressInfo.put(fieldAPI, fieldValueMap.get(fieldAPI));
            }else {
                addressInfo.put(fieldAPI, String.valueOf(fieldValueMap.get(fieldAPI)));
            }                  
@@ -85,34 +110,35 @@
        String status = 'success';    
        Response resp = new Response();
        Savepoint sp = Database.setSavepoint();
        String rid = '';
        try{
            System.debug('abcde');
            if(isNew){
                System.debug('addressInfoNancy = ' + addressInfo);
                insert addressInfo;
            }else{
                //Id addressIdValue = [select id from Address where AWS_Data_Id__c =:awsId];
                addressInfo.put('Id','a4R1m000000KGxSEAW');//For testing;
                System.debug('into update');
                String awsDataId = (String)addressInfo.get('AWS_Data_Id__c');
                System.debug('awsDataId = ' + awsDataId);
                Address__c[] addresses = [select id from Address__c where AWS_Data_Id__c =:awsDataId];
                System.debug('addresses[0].id = ' + addresses[0].id);
                addressInfo.put('Id',addresses[0].id);//For testing;
                update addressInfo;
            }
            // //saveTransLog(transId, addressInfo.AWS_Data_Id__c, status, '');
            // Transaction_Log__c traLog = new Transaction_Log__c();
            // // AWS_Data_Id__c=AWSDataId,TransId__c=transId,JsonContent__c=addressJson,Status__c=status
            // traLog.AWS_Data_Id__c = AWSDataId;
            // traLog.TransId__c = transId;
            // traLog.JsonContent__c = addressJson;
            // traLog.Status__c = status;
            // insert traLog;
            rid=addressInfo.Id;
            PIHelper.saveTransLog(sobjectTypeValue,(String)addressInfo.get('AWS_Data_Id__c'),rid,transId,addressJson ,status,'');
            resp.recordId = addressInfo.Id;
            // resp.message = 'success saveAddress';
            resp.message = '';
            resp.status = status;
            System.debug('resp from sfdx back-end' + resp);
            return resp;
        } catch(Exception e) {
            System.debug('into catch'+e.getMessage());
            Database.rollback(sp);
            // status = 'fail';
            // //saveTransLog(transId, addressInfo.AWS_Data_Id__c, status, '');
            // system.System.debug(e.getMessage() + '-' + e.getStackTraceString() + '-' + e.getLineNumber());
            // resp.message = e.getMessage();
            // resp.recordId = 'fail saveAddress';
            status = 'fail';
            PIHelper.saveTransLog(sobjectTypeValue,(String)addressInfo.get('AWS_Data_Id__c'),rid,transId,addressJson,status,e.getMessage());
            resp.message = e.getMessage();
            resp.status = status;
            return resp;
        }
force-app/main/default/classes/NewAndEditLeadController.cls
@@ -7,7 +7,7 @@
 *      01/19/2022 - Bubba Li - Initial Code.
 * 
 * */
public without sharing class NewAndEditLeadController {
global without sharing class NewAndEditLeadController {
    public List <LayoutDescriberHelper.LayoutSection > layoutSections{set;get;}
    public String awsToken{set;get;}
    public static Map<String, Schema.SObjectType> schemaMap = Schema.getGlobalDescribe();
@@ -15,69 +15,93 @@
    public Boolean isNewMode{set;get;}
    public String rtTypeId {get; set;}
    public String AWSDataId{set;get;}
    //fieldLabel fieldAPI
    public String fieldApiListStr {get; set;}
    public String contactId{set;get;}//For Lookup field
    public List<String> encryptedAPIList{set;get;}
    public String staticResource {get; set;}
    public String staticResourceContact {get; set;}
    public String requiredFieldAPIListStr {get; set;}
    public String fieldAPIToLabelMapStr {get; set;}
    public String Input_Required_Field_Msg{set;get;}
    public String PIPL_Name_Label{set;get;}
    public String PIPL_Input_Account_Error_Msg{set;get;}
    public String sobjectPrefix{set;get;}
    public String sobjecttypeForFrontEnd{set;get;}
    public String contactsInfo {set;get;}//key sfid;value awsid
    public NewAndEditLeadController(ApexPages.StandardController controller) {
        isNewMode = true;
        Input_Required_Field_Msg = Label.Input_Required_Field_Msg;
        PIPL_Name_Label = Label.PIPL_Name_Label;
        PIPL_Input_Account_Error_Msg = label.PIPL_Input_Account_Error_Msg;
        sobjecttypeForFrontEnd = sobjectTypeValue;
        //获取所有字段
        List<String> fieldList = new List<String>(Schema.getGlobalDescribe().get('Lead').getDescribe().fields.getMap().keyset());  
        // Add fields to controller. This is to avoid the SOQL error in visualforce page
        controller.addFields(fieldList);
        SObject obj = controller.getRecord();
        //rtTypeId = ApexPages.currentPage().getParameters().get('RecordType');
        rtTypeId = '01210000000QiRa';//For testing
        layoutSections = LayoutDescriberHelper.describeSectionWithFields(rtTypeId, 'Lead','classic');
        if(obj.Id != null){
            //更新
            isNewMode = false;
            Lead leadData = [select Id,RecordTypeId,AWS_Data_Id__c from Lead where id =: obj.Id];
            Lead leadData = [select Id,RecordTypeId,AWS_Data_Id__c,Contact_Name__r.Id,Contact_Name__r.AWS_Data_Id__c from Lead where id =: obj.Id];
            rtTypeId = leadData.RecordTypeId;
            AWSDataId = leadData.AWS_Data_Id__c;
            Map<String,String> sfIdToAWSIdMap = new Map<String,String>();
            if(leadData.Contact_Name__r.Id != null){
                sfIdToAWSIdMap.put(String.valueof(leadData.Contact_Name__r.Id).subString(0,15),leadData.Contact_Name__r.AWS_Data_Id__c);
        }
        List<String> fieldApiList = new List<String>();
        for (LayoutDescriberHelper.LayoutSection ls : layoutSections) {
            for (LayoutDescriberHelper.LayoutField lf : ls.layoutFields) {
                if (lf.fieldAPI != '') {
                    fieldApiList.add(lf.fieldAPI);
            contactsInfo = JSON.serialize(sfIdToAWSIdMap);
        }else{
            //新建
            rtTypeId = ApexPages.currentPage().getParameters().get('RecordType');
            obj.put('OwnerId',UserInfo.getUserId());
                }
            }
        }
        fieldApiListStr = JSON.serialize(fieldApiList);
        //awsToken = AWSServiceTool.getAWSToken();
        LayoutDescriberHelper.LayoutWrapper LayoutWrapperValue = LayoutDescriberHelper.describeSectionWithFieldsWrapper(rtTypeId, 'Lead','classic');
        layoutSections = LayoutWrapperValue.layoutSections;
        List<String> requiredFieldAPIList = LayoutWrapperValue.requiredFieldAPIList;
        Map<String,String> fieldAPIToLabelMap = LayoutWrapperValue.fieldAPIToLabelMap;
        requiredFieldAPIListStr = JSON.serialize(requiredFieldAPIList);
        fieldAPIToLabelMapStr = JSON.serialize(fieldAPIToLabelMap);
        PIHelper.PIIntegration piIntegration = PIHelper.getPIIntegrationInfo('Lead');
        staticResource = JSON.serialize(piIntegration);
        staticResourceContact = JSON.serialize(PIHelper.getPIIntegrationInfo('Contact'));
        encryptedAPIList = piIntegration.PIFields;
        sobjectPrefix = piIntegration.sobjectPrefix;
    }
    public class Response{
    global class Response{
        public String recordId{set;get;}
        public String message{set;get;}
        public String status{set;get;}
    }
    @RemoteAction
    public static Response saveLead(String leadJson,String transId,Boolean isNew) {
    global static Response saveLead(String leadJson,String transId,Boolean isNew) {
        System.debug('Lead Info:' + JSON.serialize(leadJson));
        //1. Prepare the payload for  Lead
        Schema.SObjectType leadSchema = schemaMap.get(sobjectTypeValue);
        Map<String, Schema.SObjectField> fieldAPIToTypeMap = leadSchema.getDescribe().fields.getMap();
        Map<String,Object> fieldValueMap = (Map<String,Object>)JSON.deserializeUntyped(leadJson);
        Lead leadInfo = new Lead();
        //自定义格式转换
        for (String fieldAPI: fieldValueMap.keySet()) {
            system.debug('field API='+fieldAPI);
            Schema.DisplayType fielddataType = fieldAPIToTypeMap.get(fieldAPI).getDescribe().getType();  
            String fieldValue = String.valueOf(fieldValueMap.get(fieldAPI)); 
            if(String.isBlank(fieldValue)){
                continue;
            }
            system.debug('Field Type:'+fielddataType+' field Value='+fieldValue);
            if(String.valueOf(fielddataType)=='DATE'){
                leadInfo.put(fieldAPI, Date.valueOf(String.valueOf(fieldValueMap.get(fieldAPI)).replace('/', '-')));
                leadInfo.put(fieldAPI,(String.isBlank(fieldValue)||String.isEmpty(fieldValue))? null:Date.valueOf(fieldValue.replace('/', '-')));
            }else if(String.valueOf(fielddataType)=='DATETIME'){
                String dt = String.valueOf(fieldValueMap.get(fieldAPI));
                if(String.isNotBlank(dt)&&dt.contains('T')){
                    dt = dt.replace('T',' ');
                    leadInfo.put(fieldAPI, Datetime.valueOfGmt(dt));
                }
            }else if(String.valueOf(fielddataType)=='Number'||String.valueOf(fielddataType)=='DOUBLE' ){
                leadInfo.put(fieldAPI, Decimal.valueOf(String.valueOf(fieldValueMap.get(fieldAPI))));
            } else if(String.valueof(fielddataType)=='BOOLEAN'){
                leadInfo.put(fieldAPI, Boolean.valueOf(fieldValueMap.get(fieldAPI)));
                if(String.isNotBlank(fieldValue)&&fieldValue.contains('T')){
                    fieldValue = fieldValue.replace('T',' ');
                    leadInfo.put(fieldAPI, Datetime.valueOfGmt(fieldValue));
            }else {
                leadInfo.put(fieldAPI, String.valueOf(fieldValueMap.get(fieldAPI)));
                    leadInfo.put(fieldAPI, null);
                }
            }else if(String.valueof(fielddataType)=='CURRENCY'|| String.valueof(fielddataType)=='PERCENT'||String.valueOf(fielddataType)=='Number'||String.valueOf(fielddataType)=='DOUBLE' ){
                leadInfo.put(fieldAPI, (String.isBlank(fieldValue)||String.isEmpty(fieldValue))?0:Decimal.valueOf(fieldValue));
            } else if(String.valueof(fielddataType)=='BOOLEAN'){
                leadInfo.put(fieldAPI, fieldValueMap.get(fieldAPI));
            }else {
                leadInfo.put(fieldAPI,fieldValue);
            }                  
        }
        
@@ -85,34 +109,35 @@
        String status = 'success';    
        Response resp = new Response();
        Savepoint sp = Database.setSavepoint();
        String rid = '';
        try{
            System.debug('abcde');
            if(isNew){
                System.debug('leadInfozhj = ' + leadInfo);
                insert leadInfo;
            }else{
                //Id leadIdValue = [select id from Lead where AWS_Data_Id__c =:awsId];
                leadInfo.put('Id','00Q1m000001lVY8');//For testing;
                System.debug('into update');
                String awsDataId = (String)leadInfo.get('AWS_Data_Id__c');
                System.debug('awsDataId = ' + awsDataId);
                Lead[] leads = [select id from Lead where AWS_Data_Id__c =:awsDataId];
                System.debug('leads[0].id = ' + leads[0].id);
                leadInfo.put('Id',leads[0].id);//For testing;
                update leadInfo;
            }
            // //saveTransLog(transId, leadInfo.AWS_Data_Id__c, status, '');
            // Transaction_Log__c traLog = new Transaction_Log__c();
            // // AWS_Data_Id__c=AWSDataId,TransId__c=transId,JsonContent__c=leadJson,Status__c=status
            // traLog.AWS_Data_Id__c = AWSDataId;
            // traLog.TransId__c = transId;
            // traLog.JsonContent__c = leadJson;
            // traLog.Status__c = status;
            // insert traLog;
            rid=leadInfo.Id;
            PIHelper.saveTransLog(sobjectTypeValue,(String)leadInfo.get('AWS_Data_Id__c'),rid,transId,leadJson ,status,'');
            resp.recordId = leadInfo.Id;
            // resp.message = 'success saveLead';
            resp.message = '';
            resp.status = status;
            System.debug('resp from sfdx back-end' + resp);
            return resp;
        } catch(Exception e) {
            System.debug('into catch'+e.getMessage());
            Database.rollback(sp);
            // status = 'fail';
            // //saveTransLog(transId, leadInfo.AWS_Data_Id__c, status, '');
            // system.System.debug(e.getMessage() + '-' + e.getStackTraceString() + '-' + e.getLineNumber());
            // resp.message = e.getMessage();
            // resp.recordId = 'fail saveLead';
            status = 'fail';
            PIHelper.saveTransLog(sobjectTypeValue,(String)leadInfo.get('AWS_Data_Id__c'),rid,transId,leadJson,status,e.getMessage());
            resp.message = e.getMessage();
            resp.status = status;
            return resp;
        }
force-app/main/default/classes/OFSInsReportLayoutController.cls
@@ -28,7 +28,7 @@
    private String oldHospital;
    private String oldStatus;
    private Boolean isPDF;
    public Boolean isPDF{get;private set;}
    private Boolean isUpDown;
    private Boolean isSubmit;
    public String alertMessage {
@@ -247,18 +247,23 @@
            oirSettingMap.put(oir.recordType_devName__c, oir);
        }
    }
    public string staticResource { get; private set; }
    //public boolean IsAddmessage { get; private set; }
    /**
    * Visaulforceから呼ばれるコンストラクタ
    */
    public OFSInsReportLayoutController(ApexPages.StandardController controller) {
        staticResource = JSON.serialize(PIHelper.getPIIntegrationInfo('Inspection_Report__c'));
}
    public OFSInsReportLayoutController() {
        countorder = 1;
        nowAssetcount = 1;
        runCount = 0;
        isUpDown = true;
        staticResource = JSON.serialize(PIHelper.getPIIntegrationInfo('Inspection_Report__c'));
    }
    // TODO 全部画面リフレッシュにする
@@ -335,7 +340,7 @@
                pReportId = iis[0].Inspection_ReportId__c;
            }
            List < Inspection_Report__c > queryIrs = [select Id, RecordType.DeveloperName, RecordType.Name, Name, Status__c, Inspection_StartTime__c, Inspection_EndTime__c from Inspection_Report__c where Id = :pReportId];
            List < Inspection_Report__c > queryIrs = [select Id, RecordType.DeveloperName, RecordType.Name, Name, Status__c, Inspection_StartTime__c, Inspection_EndTime__c,Responsible_Person_Encrypted__c,phone_Encrypted__c,AWS_Data_Id__c from Inspection_Report__c where Id = :pReportId];
            if (queryIrs.size() <= 0) {
                initFlag = false;
                ApexPages.addmessage(new ApexPages.message(ApexPages.severity.ERROR, '无法找到点检报告书'));
@@ -401,7 +406,7 @@
            }
        }
        this.settingSoql = 'select Id, Name, Name_Manual__c, Next_StartHour_Page__c, Next_StartMinute_Page__c, Next_EndHour_Page__c, Next_EndMinute_Page__c '
        this.settingSoql = 'select Id, Name, Name_Manual__c, Next_StartHour_Page__c, Next_StartMinute_Page__c, Next_EndHour_Page__c, Next_EndMinute_Page__c,Responsible_Person_Encrypted__c,phone_Encrypted__c,AWS_Data_Id__c '
        // fxk 2021/8/4 新加 Start
        + ' , Remarks__c, CleaningFluid__c,SterilizationMethod__c,Disinfectant__c,UsedMachine__c,Used_ET__c ,Mode__c';
        // fxk 2021/8/4 新加 End
@@ -785,14 +790,19 @@
            // }
        }
        if (isError) {
            system.debug('795'+ir.AWS_Data_Id__c);
            return null;
        }
        system.debug('798'+ir.AWS_Data_Id__c);
        //add by rentx 20210630
        if (timeCheck() != true) {
            system.debug('800');
            return null;
        }
        system.debug('804');
        if (isPDF) {
            ir.Status__c = 'PDF';
        }
@@ -801,6 +811,7 @@
            ir.Status__c = '填写完毕';
        }
        system.debug('813');
        Savepoint sp = Database.setSavepoint();
        try {
            // 部长经理总监
@@ -815,9 +826,11 @@
            OFSInsReportAssetHistoryController.upsertInspection_Report(ir);
        } catch(Exception e) {
            clearIrId(sp, e, isIrNew);
            system.debug('829');
            return null;
        }
        system.debug('832');
        // 日報からくる場合、保存時、EventCに書き戻す
        if (String.isBlank(pEventCId) == false) {
            try {
@@ -825,10 +838,11 @@
                update ec;
            } catch(Exception e) {
                clearIrId(sp, e, isIrNew);
                system.debug('840');
                return null;
            }
        }
        system.debug('844');
        //List<Inspection_Item__c> toUpsertAhs = new List<Inspection_Item__c>();
        List < Inspection_Item__c > toDeleteAhs = new List < Inspection_Item__c > ();
        List < Inspection_Item__c > manualDeleteAhs = new List < Inspection_Item__c > ();
@@ -868,14 +882,17 @@
        // SWAG-AREBA8 end
        toDeleteAhs = [select Id, AssetId__c from Inspection_Item__c where AssetId__c in :unCheckedAssetIds and Inspection_ReportId__c = :ir.Id];
        system.debug('884');
        try {
            if (manualDeleteAhs.size() > 0) toDeleteAhs.addAll(manualDeleteAhs);
            OFSInsReportAssetHistoryController.deleteInspection_Item(ir, toDeleteAhs);
        } catch(Exception e) {
            clearIrId(sp, e, isIrNew);
            system.debug('890');
            return null;
        }
        system.debug('894');
        try {
            //OFSInsReportAssetHistoryController.upsertInspection_Item(ir, toUpsertAhs);
            OFSInsReportAssetHistoryController.upsertInspection_Item(ir, new List < Inspection_Item__c > (toUpsertAhsMap.keySet()));
@@ -884,9 +901,11 @@
            for (Inspection_Item__c ah: toUpsertAhsMap.keySet()) {
                if (toUpsertAhsMap.get(ah).isNew == true) ah.Id = null;
            }
            system.debug('903');
            return null;
        }
        system.debug('905');
        saveOK = true;
        this.init();
        return null;
@@ -896,6 +915,7 @@
        if (isIrNew) ir.Id = null;
        Database.rollback(sp);
        ApexPages.addMessages(e);
        //IsAddmessage = true;
    }
    private Boolean checkHpChange() {
force-app/main/default/classes/QISPDFController.cls
@@ -2,6 +2,7 @@
    public QIS_Report__c qr { get; private set; }
    public User usr { get; private set; }
    public Boolean inGuarantee { get; private set; }
    public string staticResource { get; private set; }
    
    //  HWAG-BC68W3  故障发生日为空时, 它为真  start
    public Boolean outOfGuarantee { get; private set; }
@@ -10,6 +11,8 @@
        qr = new QIS_Report__c();
        usr = new User();
        inGuarantee = false;
        staticResource = JSON.serialize(PIHelper.getPIIntegrationInfo('QIS_Report__c'));
    }
    
    public void init() {
force-app/main/default/classes/SLAReportDetailsController.cls
@@ -16,6 +16,8 @@
    public String visitor5;
    public String serviceId;
    public String accId;
    public String slaInfoStr{get; set;}
    public String staticResourceContact {get; set;}
    public SLAReportDetailsController(){
        eventcId = ApexPages.currentPage().getParameters().get('eventCId') == null ? '' : ApexPages.currentPage().getParameters().get('eventCId');
        visitor1 = ApexPages.currentPage().getParameters().get('visitor1') == null ? '' : ApexPages.currentPage().getParameters().get('visitor1');
@@ -111,7 +113,8 @@
        }else{
            slaInfo.Visitor5__c = null; 
        }
        slaInfoStr = JSON.serialize(slaInfo);
        staticResourceContact = JSON.serialize(PIHelper.getPIIntegrationInfo('Contact'));
    }
    public void save(){
        try {
force-app/main/default/classes/SearchVisitorController.cls
@@ -5,6 +5,7 @@
    public List<Contact> cl {get;set;}
    public List<AddContactWrapper> acwl {get;set;}
    public String index {get; set;}
    public String awsContactIds{set;get;}//Add By Li Jun 20220214 for PIPL
    public String id1 {get;set;}
    public String hId1 {get;set;}
    public String idVa1 {get;set;}
@@ -24,6 +25,14 @@
    
    public User u {get;set;}
    public Account a {get;set;}
    //Add By Li Jun 20220217 Start
    public String staticResource {get; set;}
    public String contactAWSIds {set;get;}
    public String contactsInfo {set;get;}
    public String awsDataIdArray {set;get;}
    //Add By Li Jun 20220217 End
    
    public SearchVisitorController(){
        this.id1 = Apexpages.currentPage().getParameters().get('id1');
@@ -161,10 +170,40 @@
        }*/
        
        serContact();
    }
    
        //Add By Li Jun for PIPL 20220217 Start
        //1. Query Contact by accountId
        List<Contact> conList = new List<Contact>();
        system.debug('Account Id from Front-end:'+a.Id);
        String accountId = a.Id;
        if(String.isNotBlank(accountId) && String.isNotEmpty(accountId)){
            conList = new List<Contact>([select Id,AWS_Data_Id__c from Contact where AccountId=:accountId and AWS_Data_Id__c!='']);
        }
        //2. Prepare the Contact Info
        List<String> conAWSIds = new List<String>();
        for(Contact con:conList){
            conAWSIds.add(con.AWS_Data_Id__c);
        }
        contactAWSIds = JSON.serialize(conAWSIds);
        staticResource = JSON.serialize(PIHelper.getPIIntegrationInfo('Contact'));
        //Add By Li Jun for PIPL 20220217 End
     }
    //Add by Li Jun for PIPL 202202117 Start
    public PageReference clearLineInfoList()  {
        scwl = new List<SltContactWrapper>();
        return null;
    }
    //Add by Li Jun for PIPL 202202117 End
    public PageReference serContact(){
        System.debug('===== serContact start =====');
        System.debug('===== serContact start ====='+awsContactIds);
        //Add By Li Jun for PIPL 20220218 Start
        Set<String> awsContactSet = new Set<String>();
        if(String.isNotBlank(awsContactIds)&&String.isNotEmpty(awsContactIds)){
            List<String> awsDataIds = (List<String>) JSON.deserialize(awsContactIds, List<String>.class);
            awsContactSet = new Set<String>(awsDataIds);
        }
        System.debug('===== serContact start ====='+awsContactSet);
         //Add By Li Jun for PIPL 20220218 End
        String searchHospital = 'Select Hospital__c, Department_Class__c,Is_Active__c From Account Where Id = \'' + vp + '\' ';
        Account a = Database.query(searchHospital);
        if(a.Is_Active__c == '無効'){
@@ -172,16 +211,20 @@
            return null;
        }
        
        String searchSql = 'Select id, name,Ignore_Same_Name__c, Account.Name, Type__c, Doctor_Division1__c, MyDr_Flg__c, phone, Supplement__c, MyDr__c, Select_Flg__c,Delete_Reason__c, Please_Delete__c, Please_Delete_applier__c, FirstName, LastName, Search_LastName__c, Account_Visitor_Search__c  From Contact ';
        String searchSql = 'Select id, name,Ignore_Same_Name__c,AWS_Data_Id__c, Account.Name, Type__c, Doctor_Division1__c, MyDr_Flg__c, phone, Supplement__c, MyDr__c, Select_Flg__c,Delete_Reason__c, Please_Delete__c, Please_Delete_applier__c, FirstName, LastName, Search_LastName__c, Account_Visitor_Search__c  From Contact ';
        String whereStr = 'Where Account.ParentId =\'' + a.Department_Class__c + '\' and Account.Is_Active__c != \'無効\' ' + ' and Isactive__c != \'无效(退休)\' and Isactive__c != \'无效(重复)\'';
        String whereSql = '';
        if(sc.Search_LastName__c != null && sc.Search_LastName__c != ''){
            whereSql += 'and LastName like ' + '\'%' + sc.Search_LastName__c + '%\' ';
        //Commented by Li Jun 20220214 for PIPL
        if(awsContactSet.size()>0){
            whereSql += 'and AWS_Data_Id__c in: awsContactSet ';
        }
        // if(sc.Search_LastName__c != null && sc.Search_LastName__c != ''){
        //     whereSql += 'and LastName like ' + '\'%' + sc.Search_LastName__c + '%\' ';
        // }
        
        if(sc.Search_FirstName__c != null && sc.Search_FirstName__c != ''){
            whereSql += 'and FirstName like ' + '\'%' + sc.Search_FirstName__c + '%\' ';
        }
        // if(sc.Search_FirstName__c != null && sc.Search_FirstName__c != ''){
        //     whereSql += 'and FirstName like ' + '\'%' + sc.Search_FirstName__c + '%\' ';
        // }
        
        if(sc.Type__c != null && sc.Type__c != ''){
            whereSql += 'and Type__c = \'' + sc.Type__c + '\' ';
@@ -202,6 +245,7 @@
        
        System.debug('searchSql:'+searchSql);
        cl = Database.query(searchSql);
        System.debug('Query Result from SF:'+JSON.serialize(cl));
        Integer i = 0;
        
        scwl = new List<SltContactWrapper>();
force-app/main/default/classes/SimpleEventRegisterController.cls
@@ -88,6 +88,12 @@
    //2021-10-20  mzy  任务管理改善   start
    private Boolean IsGeneratePlan;  //是否生成计划
    //2021-10-20  mzy  任务管理改善   end
    //Add By Li Jun 20220224 for PIPL start
    public String idVisitor1PI{set;get;}
    public String idVisitor2PI{set;get;}
    public String staticResource {get; set;}
    public String contactAWSIds{set;get;}
    //Add By Li Jun 20220224 for PIPL end
    public SimpleEventRegisterController(ApexPages.StandardController controller) {
        this.isHospital = true;
        this.isAgent = false;
@@ -153,6 +159,11 @@
            System.debug('-----:inputDatetime=' + inputDatetime);
            this.targetEvent.StartDateTime = inputDatetime;
        }
        //Add by Li Jun 20220303 for PIPL Start
        PIHelper.PIIntegration piIntegration = PIHelper.getPIIntegrationInfo('Contact');
        staticResource = JSON.serialize(piIntegration);
        system.debug('static resource:'+JSON.serialize(staticResource));
        //Add by Li Jun 20220303 for PIPL End
    }
    public void init() {
@@ -212,6 +223,22 @@
            //2021-07-28  mzy  SWAG-C4YB9J 事件页面优化 今天的事件 如果已经生成报告一览,则不允许进行取消和延期操作 end
                allDisable = true;
            }
            //Add By Li Jun for PIPL 20220303 Start
            List<String> conAWSIds = new List<String>();
            Set<String> contactIdsForReport = new Set<String>();
            List<String> visitorList = new List<String>{'Visitor1_ID__c','Visitor2_ID__c','Visitor3_ID__c','Visitor4_ID__c','Visitor5_ID__c'};
            for(String visitorValue:visitorList){
                if(String.isNotEmpty((String)targetEvent.get(visitorValue))&&String.isNotBlank((String)targetEvent.get(visitorValue))){
                    contactIdsForReport.add((String)targetEvent.get(visitorValue));
                }
            }
            List<Contact> conListForReport = new List<Contact>([select id,AWS_Data_Id__c from Contact where id in:contactIdsForReport and AWS_Data_Id__c!='']);
            for(Contact con:conListForReport){
                conAWSIds.add(con.AWS_Data_Id__c);
            }
            contactAWSIds = JSON.serialize(conAWSIds);
            system.debug('Contact AWSIDs:'+contactAWSIds);
            //Add By Li Jun for PIPL 20220303 End
        }
        //20210324 zh WLIG-BX3DQ5 【委托】Outlook日历和SFDC日历同步 end
        if (targetEvent.OPDPlan_Flag__c) {
force-app/main/default/classes/StartTradingController.cls
@@ -1,4 +1,4 @@
public class StartTradingController {
public without sharing class StartTradingController {
    /** リードID */
    public String leadId{get;set;}
@@ -9,12 +9,15 @@
    /** リードOnwer */
    public User leadOnwer{get; set;}
    public String staticResource {get; set;}
    /** コンストラクタ */
    public StartTradingController(ApexPages.StandardController controller){
        // リードID設定
        this.leadId = system.currentPageReference().getParameters().get('leadId');
        System.debug('this.leadId'+this.leadId);
        this.SI_Flg = false;
        staticResource = JSON.serialize(PIHelper.getPIIntegrationInfo('Contact'));
    }
    
    /** 引合ID */
@@ -66,6 +69,8 @@
    
    /** 販売店から引合をConvertするフラグ **/
    private Boolean isAgencyOpp = false;
    
    /** 初期処理 */
    public void init(){
@@ -153,6 +158,7 @@
    
    /** 取引の開始ボタン **/
    public PageReference start(){
        system.debug('进入start()');
        
        // LHJ 20181012 CHAN-B5G6EZ 购买意向转询价报错 Start
        try {
force-app/main/default/classes/StraightBackAddressController.cls
@@ -9,9 +9,14 @@
    /***************表格数据*********************/
    public List<AddressData> tableData { get; set; }
    public String tableDataStr{ get; set; }
    public String staticResource {get; set;}
    public String staticResourceContact {get; set;}
    public Contact newCon{get; set;}
    /***************底部 编辑和新增的 对象*******************/
    public Address__c insUpdData{get;set;}
    public String insUpdDataStr{get;set;}
    /***************被编辑数据的id********************/
    public String UpdId{get;set;}
@@ -55,6 +60,14 @@
    /***************是否发生数据接口的序号*************/
    public Integer AddressTypeIndex{get;set;}
    public String contactId{set;get;}//For Lookup field
    // Add by Li Jun for PIPL 20220308 Start
    public String contactNameValue{set;get;}
    public String contactIdValue{set;get;}
    public String addressDataIds{set;get;}
    // Add by Li Jun for PIPL 20220308 End
    public StraightBackAddressController() {
        //获取url数据
        RepairId = System.currentPageReference().getParameters().get('id');
@@ -77,6 +90,10 @@
        addContact = new Contact();
        //查询到所有的科室类别
        hospitalTypp = '診療科 その他,診療科 呼吸科,診療科 婦人科,診療科 普外科,診療科 泌尿科,診療科 消化科,診療科 耳鼻喉科,診療科(共通)';
        staticResource = JSON.serialize(PIHelper.getPIIntegrationInfo('Address__c'));
        staticResourceContact = JSON.serialize(PIHelper.getPIIntegrationInfo('Contact'));
    }
    /**
@@ -86,6 +103,7 @@
        String RepairSql = makeTextRepairSql(RepairId);
        try{
            pc = Database.query(RepairSql);
            system.debug('pc = ' + pc);
            //给一个全局变量赋值医院id
            if(!String.isBlank(pc.HP_ID__c)){
                hospitalId = pc.HP_ID__c;
@@ -126,6 +144,7 @@
            ApexPages.addMessages(e);
        }
        insUpdData = new Address__c();
        newCon = new Contact();
        return null;
    }
@@ -141,6 +160,7 @@
                        insUpdData = tableData[i].address;
                    }
                }
                insUpdDataStr = JSON.serialize(insUpdData);
            }
        }
        return null;
@@ -163,6 +183,7 @@
                        }
                    }
                }
                insUpdDataStr = JSON.serialize(insUpdData);
            }
        }
        return null;
@@ -196,8 +217,12 @@
                        }
                        //联系人
                        String contactsName = '';
                        String contactsNameEncrypt ='';
                        String contactawsDataId = '';
                        if(!String.isBlank(tableData[i].address.Contacts__c)){
                            contactsName = tableData[i].address.Contacts__r.Name;
                            contactsNameEncrypt = tableData[i].address.Contacts__r.LastName_Encrypted__c;
                            contactawsDataId = tableData[i].address.Contacts__r.AWS_Data_Id__c;
                        }
                        //客户
                        String ContactPerson = '';
@@ -208,10 +233,18 @@
                            //保存数据到修理表中
                            Repair__c rc = new Repair__c();
                            rc.id=RepairId;
                            rc.Address_AWS_Data_Id__c = tableData[i].address.AWS_Data_Id__c;
                            rc.Contact_AWS_Data_Id__c = contactawsDataId;
                            rc.address_Contacts__c=contactsName;
                            rc.Address_Contacts_Encrypt__c = contactsNameEncrypt;
                            rc.address_ZipCode__c = tableData[i].address.ZipCode__c;
                            rc.Address_ZipCode_Encrypt__c = tableData[i].address.ZipCode_Encrypted__c;
                            rc.address_City__c = cityName;
                            rc.address_Contacts_Name__c = ContactPerson;
                            rc.Detailed_Address__c = tableData[i].address.Detailed_Address__c;
                            rc.Detailed_Address_Encrypt__c = tableData[i].address.Detailed_Address_Encrypted__c;
                            rc.address_Telephone__c = tableData[i].address.Telephone__c;
                            rc.Address_Telephone_Encrypt__c = tableData[i].address.Telephone_Encrypted__c;
                            //isUpload:是否上传SAP  FSEApplyForRepairTime:SAP修理申请时间
                            if(isUpload && (FSEApplyForRepairTime != null)){
                                rc.Address_type__c = 'X';
@@ -343,6 +376,8 @@
                }
            }
            ApexPages.addmessage(new ApexPages.message(ApexPages.severity.INFO, '共有 '+indexCou+' 条数据'));
            tableDataStr = JSON.serialize(tableData);
            system.debug('tableDataStr = ' + tableDataStr);
        }catch(Exception e){
            //失败提示
            ApexPages.addMessages(e);
@@ -354,6 +389,12 @@
     * 保存和修改的方法
     */
    public PageReference save(){
        system.debug('Address value:'+JSON.serialize(insUpdData));
        if(String.isNotBlank(contactIdValue)&&String.isNotEmpty(contactIdValue)){
            system.debug('Contact Value:'+contactIdValue);
            insUpdData.Contacts__c = contactIdValue;
        }
        system.debug('Address value:'+JSON.serialize(insUpdData));
        savepoint sp = Database.setsavepoint();
        if(insUpdData != null){
            boolean flag = true;
@@ -451,7 +492,8 @@
                            monicker = surname.substring(1,surname.length());
                            surname = surname.substring(0,1);
                        }
                        addContact = new Contact(LastName=surname,FirstName=monicker,AccountId=insUpdData.Customer__c,RecordTypeId=typeL);
                        System.debug('newCon = '+newCon);
                        addContact = new Contact(LastName=surname,FirstName=monicker,AccountId=insUpdData.Customer__c,RecordTypeId=typeL,AWS_Data_Id__c = newCon.AWS_Data_Id__c,LastName_Encrypted__c=newCon.LastName_Encrypted__c);
                        try{
                            //新增一条联系人数据
                            insert addContact;
@@ -515,8 +557,8 @@
    }
    //查询地址表数据
    private String makeTextAddressSql(String typeSearchId) {
        String AddressSql = 'SELECT ID,Address_Classification__c,Customer__c,Customer__r.Name,Contacts__c,Contacts__r.Name,Telephone__c'
                        +',Province__c,Province__r.Name,City__c,City__r.name,Detailed_Address__c,Create_Contacts__c,ZipCode__c,CreatedByid '
        String AddressSql = 'SELECT AWS_Data_Id__c,ID,Address_Classification__c,Customer__c,Customer__r.Name,Contacts__c,Contacts__r.Name,Contacts__r.AWS_Data_Id__c,Telephone__c'
                        +',Province__c,Province__r.Name,City__c,City__r.name,Detailed_Address__c,Create_Contacts__c,ZipCode__c,CreatedByid,Detailed_Address_Encrypted__c,Telephone_Encrypted__c,ZipCode_Encrypted__c,Contacts__r.LastName_Encrypted__c'
                        + ' FROM Address__c where id != null';
        //类型筛选
        if(!String.isBlank(typeText)){
@@ -542,8 +584,11 @@
            AddressSql += ' and Customer__r.Name LIKE \'%' + txtName.trim() + '%\'' ;
        }
        //详细地址筛选
        if(!String.isBlank(txtAddress)){
            AddressSql += ' and Detailed_Address__c LIKE \'%' + txtAddress.trim() + '%\'' ;
        // if(!String.isBlank(txtAddress)){
        //     AddressSql += ' and Detailed_Address__c LIKE \'%' + txtAddress.trim() + '%\'' ;
        // }
        if(!String.isBlank(addressDataIds)){
            AddressSql += ' and AWS_Data_Id__c in('+addressDataIds.trim()+')';
        }
        //排序,根据上次修改时间和采用时间进行降序排序,值为空放到后面
        AddressSql += ' order by LastModifiedDate desc,Using_Datetime__c desc NULLS LAST';
@@ -551,6 +596,7 @@
        if(String.isBlank(typeSearchId)){
            AddressSql += ' limit 1000 ';
        }
        System.debug('AddressSql = '+AddressSql);
        return AddressSql;
    }
    //查询医院客户人员信息
force-app/main/default/classes/UpdateContractAimAmountHandler.cls
@@ -246,7 +246,12 @@
            }
    
        }
        if(!System.Test.isRunningTest()){
        //Before :
        //if(!System.Test.isRunningTest()){
        //After : to avoid mutiple execute
        //if(!(System.Test.isRunningTest()||System.isFuture()||System.isBatch())){
        //Update by Li Jun for PIPL 20220304
        if(!(System.Test.isRunningTest()||System.isFuture()||System.isBatch())){
            if (queueableAccountIdList.size() > 0) {
                NFM601Controller.callout('', queueableAccountIdList);
force-app/main/default/classes/WeeklyReportCmp.cls
@@ -4,10 +4,45 @@
    @AuraEnabled public Map<String,String> fieldsMap{get;set;}
    @AuraEnabled public Map<String,List<Map<String,String>>> docmap{get;set;}
    @AuraEnabled public List<Map<String,String>> doctorList{get;set;}
    // PIPL update Yin Mingjie 21/02/2022 start
    @AuraEnabled public Map<String,String> awsurl{get;set;}
    // PIPL update Yin Mingjie 21/02/2022 end
    public WeeklyReportCmp() {
    }
    // PIPL update Yin Mingjie 21/02/2022 start
    @RemoteAction
    @AuraEnabled
    public static Map<String,String> getAwsurl(String sobj){
        PIHelper.PIIntegration piIntegration = PIHelper.getPIIntegrationInfo(sobj);
        Map<String,String> awsmap = new Map<String,String>();
        awsmap.put('token', piIntegration.token);
        awsmap.put('newUrl', piIntegration.newUrl);
        awsmap.put('searchUrl', piIntegration.searchUrl);
        awsmap.put('transactionURL', piIntegration.transactionURL);
        return awsmap;
    }
    @RemoteAction
    @AuraEnabled
    public static Map<String, String> saveAgencyContact(String name, String nameEncrypt, String type, String typeEncrypt, String doctorDivision1,
        String doctorDivision1Encrypt, String agencyHospitalid, String awsid) {
        Agency_Contact__c agency_contact = new Agency_Contact__c();
        agency_contact.Name = name;
        agency_contact.Name_Encrypted__c = nameEncrypt;
        agency_contact.Type__c = type;
        agency_contact.Type_Encrypted__c = typeEncrypt;
        agency_contact.Doctor_Division1__c = doctorDivision1;
        agency_contact.Doctor_Division1_Encrypted__c = doctorDivision1Encrypt;
        agency_contact.Agency_Hospital__c = agencyHospitalid;
        agency_contact.AWS_Data_Id__c = awsid;
        Map<String, String> acMap = new Map<String, String>();
        acMap = LightningUtil.insertAgencyContact(agency_contact);
        return acMap;
    }
    // PIPL update Yin Mingjie 21/02/2022 end
    @RemoteAction
    @AuraEnabled
    public static List<Map<String,String>> getProductList(String dc, String opdsis){
@@ -112,6 +147,8 @@
        
        //System.debug('fieldsMap is ' + fieldsMap);
        //System.debug('allselectlist is ' + this.allselectlist);
        this.awsurl = getAwsurl('Agency_Contact__c');// 20220222 PI改造 by Bright
    }
    
    
@@ -218,6 +255,9 @@
    
    @RemoteAction
    @AuraEnabled
    // PIPL update Yin Mingjie 21/02/2022 start
    public static Map<String,Map<String,String>> getDoctorList(String hospital_id){
    /*
    public static List<Map<String,String>> getDoctorList(String hospital_id){
        List<Map<String,String>> ret = new List<Map<String,String>>();
        Map<String,String> space = new Map<String,String>();
@@ -225,10 +265,14 @@
        space.put('value', '');
        space.put('selected', 'true');
        ret.add(space);
    */
    // PIPL update Yin Mingjie 21/02/2022 end
        
        // 戦略科室IDを取得して、それをもとに顧客をSELECT
        Agency_Hospital_Link__c ahl = [select Hospital__c from Agency_Hospital_Link__c where id = :hospital_id];
        // PIPL update Yin Mingjie 21/02/2022 start
        /*
        List<Agency_Contact__c> doctor_list = [select id,Name,Doctor_Division1__c,Type__c,Agency_Hospital__c 
            FROM Agency_Contact__c WHERE Hospital_ID18__c=:ahl.Hospital__c order by Name];
@@ -242,8 +286,32 @@
            tmp.put('Doctor_Division1__c', row.Doctor_Division1__c);
            ret.add(tmp);
        }
        */
        List<Agency_Contact__c> doctor_list = [select id,Name,AWS_Data_Id__c,Doctor_Division1__c,Type__c,Agency_Hospital__c
            FROM Agency_Contact__c WHERE Hospital_ID18__c=:ahl.Hospital__c order by Name];
        
        Map<String,Map<String,String>> ret_test = new Map<String,Map<String,String>>();
        for (Agency_Contact__c row : doctor_list)
        {
            if(row.AWS_Data_Id__c == '' || row.AWS_Data_Id__c == null){
                continue;
            }
            Map<String,String> tmp = new Map<String,String>();
            tmp.put('label', row.Name);
            tmp.put('value', row.Id);
            tmp.put('awsid', row.AWS_Data_Id__c);
            tmp.put('selected', 'false');
            tmp.put('Doctor_Division1__c', row.Doctor_Division1__c);
            ret_test.put(row.AWS_Data_Id__c, tmp);
        }
        PIHelper.PIIntegration piIntegration = PIHelper.getPIIntegrationInfo('Agency_Contact__c');
        Map<String, String> sre = new Map<String, String>();
        sre.put('token', piIntegration.token);
        sre.put('searchUrl', piIntegration.searchUrl);
        ret_test.put('sre', sre);
        
        return ret_test;
        // PIPL update Yin Mingjie 21/02/2022 end
        /*
        String record_type_id = LightningUtil.getRecordTypeId(department);
@@ -260,7 +328,11 @@
        }
        */
        // PIPL update Yin Mingjie 21/02/2022 start
        /*
        return ret;
        */
        // PIPL update Yin Mingjie 21/02/2022 end
    }
    /*
force-app/main/default/classes/XinDailyReportController.cls
@@ -78,7 +78,14 @@
    public String repoErrorMessage{get;set;}
    public String idParam{get;set;}
    public Integer activitiesSize {get;set;}
    //Add By Li Jun 20220224 for PIPL start
    public String idVisitor1PI{set;get;}
    public String idVisitor2PI{set;get;}
    public String idVisitor3PI{set;get;}
    public String idVisitor4PI{set;get;}
    public String idVisitor5PI{set;get;}
    public String staticResource {get; set;}
    //Add By Li Jun 20220224 for PIPL end
//*************************Create 20160630 OCM-231 趙徳芳 Start*************************//
    public String completionFlg{get;set;}
    public Daily_Report__c reportBak {get;set;}
@@ -91,8 +98,14 @@
    public String etAPPMsg1 {get;set;} // 20210603 zh ETAPP与日报联动
    public String etAPPMsg2 {get;set;} // 20210603 zh ETAPP与日报联动
    public String etAPPFlg {get;set;} // 20210603 zh ETAPP与日报联动
    //Add By Li Jun for PIPL 20220225
    public String contactAWSIds{set;get;}
    public String acSize{set;get;}
    /** コンストラクタ */
    public XinDailyReportController() {
        PIHelper.PIIntegration piIntegration = PIHelper.getPIIntegrationInfo('Contact');
        staticResource = JSON.serialize(piIntegration);
        system.debug('static resource:'+JSON.serialize(staticResource));
        EsetId = ApexPages.currentPage().getParameters().get('id');
        completionFlg =  ApexPages.currentPage().getParameters().get('completion');
        eventFlg = ApexPages.currentPage().getParameters().get('event');
@@ -113,6 +126,9 @@
    /** コンストラクタ */
    public XinDailyReportController(ApexPages.StandardController controller) {
        PIHelper.PIIntegration piIntegration = PIHelper.getPIIntegrationInfo('Contact');
        staticResource = JSON.serialize(piIntegration);
        system.debug('static resource:'+JSON.serialize(staticResource));
        EsetId = ApexPages.currentPage().getParameters().get('id');
        completionFlg =  ApexPages.currentPage().getParameters().get('completion');
        eventFlg = ApexPages.currentPage().getParameters().get('event');
@@ -469,6 +485,35 @@
            managerCommentEditFlg = false;
        }
        reportBak = report;
        //Add By Li Jun for PIPL 20220225 Start
        List<String> conAWSIds = new List<String>();
        Set<String> contactIdsForReport = new Set<String>();
        for(Activity a:activities){
            if(String.isNotEmpty(a.act.Visitor1_ID__c)&&String.isNotBlank(a.act.Visitor1_ID__c)){
                contactIdsForReport.add(a.act.Visitor1_ID__c);
            }
            if(String.isNotEmpty(a.act.Visitor2_ID__c)&&String.isNotBlank(a.act.Visitor2_ID__c)){
                contactIdsForReport.add(a.act.Visitor2_ID__c);
            }
            if(String.isNotEmpty(a.act.Visitor3_ID__c)&&String.isNotBlank(a.act.Visitor3_ID__c)){
                contactIdsForReport.add(a.act.Visitor3_ID__c);
            }
            if(String.isNotEmpty(a.act.Visitor4_ID__c)&&String.isNotBlank(a.act.Visitor4_ID__c)){
                contactIdsForReport.add(a.act.Visitor4_ID__c);
            }
            if(String.isNotEmpty(a.act.Visitor5_ID__c)&&String.isNotBlank(a.act.Visitor5_ID__c)){
                contactIdsForReport.add(a.act.Visitor5_ID__c);
            }
            system.debug('Activity:'+JSON.serialize(a.act.Visitor1_ID__c));
        }
        List<Contact> conListForReport = new List<Contact>([select id,AWS_Data_Id__c from Contact where id in:contactIdsForReport and AWS_Data_Id__c!='']);
        for(Contact con:conListForReport){
            conAWSIds.add(con.AWS_Data_Id__c);
        }
        contactAWSIds = JSON.serialize(conAWSIds);
        system.debug('Contact AWSIDs:'+contactAWSIds);
        //Add By Li Jun for PIPL 20220225 End
        return null;
    }
    
force-app/main/default/pages/AssessmentReport.page
@@ -4,6 +4,62 @@
    <apex:includeScript value="{!URLFOR($Resource.PleaseWaitDialog)}"/>
    <apex:includeScript value="/soap/ajax/29.0/connection.js"/>
    <apex:includeScript value="/soap/ajax/29.0/apex.js"/>
    <apex:includeScript value="{!URLFOR($Resource.AWSService, 'AWSService.js') }" />
    <script>
        var aws = JSON.parse('{!awsString}');
        var staticResources = JSON.parse('{!staticResource}');
        var contactAwsDataIds = [];
        var contact = {};
        queryContact();
        function preparePayloadForSearchContact(){
            let searchPayload = new Object();
            searchPayload.dataIds = contactAwsDataIds;
            searchPayload.contactName = '';
            return JSON.stringify(searchPayload);
        }
        function queryContact(){
            for(var i = 0;i<aws.length;i++){
                contactAwsDataIds.push(aws[i].CamMem.Contact_ID__r.AWS_Data_Id__c);
            }
            let data = preparePayloadForSearchContact();
            let searchCallBack = function searchCallBack(result){
                console.log(result);
                let contacts = result.object;
                if(contacts == null){
                    return;
                }
                for(var i=0;i<contacts.length;i++){
                    contact[contacts[i].dataId] = contacts[i].lastName.replace(/"/g,"");
                }
                console.log(JSON.stringify(contact));
            };
            AWSService.search(staticResources.searchUrl,data,searchCallBack,staticResources.token);
        }
        function showPIDiv(awsDataId){
            console.log('awsDataId Value:'+awsDataId);
            let parentNode = document.getElementById(awsDataId);
            let createDiv = document.createElement("div");
            createDiv.id = awsDataId+"_PI";
            let piInformation = 'Name:'+contact[awsDataId]
            //let piInformation = 'Name:'+contact['943114607025717249'].lastName +'\n' +'Phone:'+contact['943114607025717249'].phone
            createDiv.innerText = piInformation;
            let x=window.event.x;
            let y=window.event.y;
            createDiv.style.left=x;
            createDiv.style.top=y;
            createDiv.style.background="#dddddd";
            createDiv.style.position = "absolute";
            parentNode.appendChild(createDiv);
        }
        function hidePIDiv(awsDataId){
            document.getElementById(awsDataId+'_PI').remove();
        }
    </script>
    <apex:form id="allForm">
@@ -86,8 +142,10 @@
                            <apex:column style="width: 18%">
                               <apex:outputField style="resize:vertical;width: 95%" id="Department" value="{!al.CamMem.Department_ID__c}"/>
                            </apex:column>
                            <!-- id="{!al.CamMem.Contact_ID__r.AWS_Data_Id__c}" onmouseover="showPIDiv('{!al.CamMem.Contact_ID__r.AWS_Data_Id__c}')" onmouseout="hidePIDiv('{!al.CamMem.Contact_ID__r.AWS_Data_Id__c}')" -->
                            <apex:column style="width: 8%">
                               <apex:outputField style="resize:vertical;width: 95%" id="Name" value="{!al.CamMem.Contact_ID__c}"/>
                               <!-- <apex:outputField style="resize:vertical;width: 95%" id="Name" value="{!al.CamMem.Contact_ID__c}" /> -->
                               <span id="{!al.CamMem.Contact_ID__r.AWS_Data_Id__c}" onmouseover="showPIDiv('{!al.CamMem.Contact_ID__r.AWS_Data_Id__c}')" onmouseout="hidePIDiv('{!al.CamMem.Contact_ID__r.AWS_Data_Id__c}')">{!al.ARS.Name}</span>
                            </apex:column>
                            <apex:column style="width: 14%">
                               <apex:outputText style="resize:vertical;width: 95%" id="dept" value="{!al.CamMem.dept__c}"/>
force-app/main/default/pages/BMEWorkPage.page
@@ -5,6 +5,12 @@
<apex:includeScript value="{!URLFOR($Resource.jquery183minjs)}"/>
<apex:includeScript value="{!URLFOR($Resource.PleaseWaitDialog)}"/>
<apex:includeScript value="{!URLFOR($Resource.BmeWorkJs)}"/>
<!-- 20220222 PI改造 by Bright--start -->
<apex:includeScript value="{! URLFOR($Resource.AWSService, 'AWSService.js') }" />
<script src="../../soap/ajax/53.0/connection.js" type="text/javascript"></script>
<!-- 20220222 PI改造 by Bright--end -->
<style>
    td .dateFormat  {
        display: none;
@@ -83,6 +89,11 @@
}
body .pbBody table.list tr.headerRow td.col_Scroll {width:0px; padding:0px; border-width:0px;}
body .pbBody table.list tr.dataRow td.col_Scroll {width:0px; padding:0px; border-width:0px;}
.decrypt{position: absolute;top: 0;left: 100%;display: none;text-align: left;
    padding-left: 5px;}
a:hover .decrypt{display: block;width: 100px}
</style>
<script type="text/javascript">
var heightAjustment = 120;
@@ -96,14 +107,14 @@
</script>
</head>
    <apex:form id="allForm">
        <apex:actionFunction name="saveAndSearch" action="{!save}" rerender="allPanel" oncomplete="unblockUI();">
        <apex:actionFunction name="saveAndSearch" action="{!save}" rerender="allPanel" oncomplete="afterSaveAndSearch();">
             <apex:param name="firstParam" assignTo="{!saveType}" value="" />
        </apex:actionFunction>
         <apex:actionFunction name="saveAndSort" action="{!save}" rerender="allPanel" oncomplete="unblockUI();">
            <apex:param name="firstParam" assignTo="{!saveType}" value="" />
            <apex:param name="secondParam" assignTo="{!sortKey}" value="" />
        </apex:actionFunction>
        <apex:actionFunction name="searchOpp" action="{!chick}" rerender="allPanel" oncomplete="unblockUI();"/>
        <apex:actionFunction name="searchOpp" action="{!chick}" rerender="allPanel" oncomplete="afterSearchOpp();"/>
        <apex:actionFunction name="sortTable" action="{!sortTable}" rerender="allPanel" oncomplete="unblockUI();">
            <apex:param name="firstParam" assignTo="{!sortKey}" value="" />
        </apex:actionFunction>
@@ -113,7 +124,7 @@
                    <tr>
                        <td width="150px">
                            <apex:commandButton onclick="blockme()" oncomplete="unblockUI();" action="{!save}" value="保存"  style="height:30px;width:50px;"/>&nbsp;&nbsp;
                            <apex:commandButton value="检索" onclick="searchOppJs_Account_copy();return false;" style="height:30px;width:70px;"/>
                            <apex:commandButton value="检索" onclick="NewSearch();return false;" style="height:30px;width:70px;"/>
                        </td>
                        <td width="1000px">
                            <apex:pageMessages />
@@ -149,10 +160,11 @@
                            <apex:selectList value="{!numtextC1}" size="1" style="width:110px"><apex:selectOptions value="{!textOpts02}"/></apex:selectList>
                        </td>
                        <td width="130px">  
                            <apex:selectList value="{!numtextC2}" size="1" style="width:110px"><apex:selectOptions value="{!equalOpts}"/></apex:selectList>
                            <apex:selectList value="{!numtextC2}" size="1" style="width:110px"><apex:selectOptions value="{!equalOpts2}"/></apex:selectList>
                        </td>
                         <td width="200px">
                          <apex:inputText style="width:150px" value="{!numtextC}"/>
                          <apex:inputHidden id="AwsDataIds" value="{!AwsDataIds}"/>
                          <apex:inputText id="numtextC" style="width:150px" value="{!numtextC}"/>
                        </td>
                        <td width="200px">
                            <font>数&nbsp;据&nbsp;字&nbsp;段&nbsp;</font>&nbsp;
@@ -165,7 +177,7 @@
                          <apex:inputText style="width:150px" value="{!numtextD}"/>
                        </td>
                        <td width="230px">显示&nbsp;
                          <apex:selectList value="{!limits}" size="1" onchange="searchOppJs_Account_copy();return false;">
                          <apex:selectList value="{!limits}" size="1" onchange="NewSearch();return false;">
                          <apex:selectOptions value="{!limitOpts}"/></apex:selectList> 条数据
                        </td>
                    </tr>
@@ -246,7 +258,9 @@
                                    </apex:outputLink>
                                  </td>
                                  <td align="center">
                                    <apex:outputField value="{!or.Agcmmc.Contact__c}"/>
                                    <a style="position: relative" href="/{!or.con.Id}" aws-data-id="{!or.con.AWS_Data_Id__c}" title=""><span>{!or.con.MedicalStaff_Full_name__c}</span><span class="decrypt"></span></a>
                                  </td>
                                  <td>
                                    <apex:outputField value="{!or.con.Accountid}"/>
@@ -342,6 +356,92 @@
        input[i].style.width = "75%";
    }
}
              AWSService.sfSessionId = '{!GETSESSIONID()}';
              var staticResource = JSON.parse('{!staticResource}');
              document.body.onload = function(){
                NewSearch();
              }
              var awsdata_map={};
              function NewSearch(){
                // 如果有填写姓名,先去aws查询,再用awsdataid查询后台,如果没有填写直接查询后台
                awsdata_map={};
                let e = document.getElementById("allPage:allForm:searchBlock:numtextC");
                if(e && e.value){
                  blockme();
                  AWSService.search(staticResource.searchUrl,JSON.stringify({
                    "contactName":e.value
                  }),function(data){
                    unblockUI();
                    if(data.object && data.object.length > 0){
                      let aws_data_ids = [];
                      for(let d of data.object){
                        if(d.dataId){
                          awsdata_map[d.dataId] = d;
                          aws_data_ids.push(d.dataId);
                        }
                      }
                      document.getElementById("allPage:allForm:searchBlock:AwsDataIds").value = aws_data_ids.join(";");
                    }else{
                      document.getElementById("allPage:allForm:searchBlock:AwsDataIds").value = new Date().getTime();
                    }
                    searchOppJs_Account_copy();
                  },staticResource.token);
                }else{
                  searchOppJs_Account_copy();
                }
              }
              function afterSearchOpp(){
                DecryptContactName(()=>unblockUI());
              }
              function afterSaveAndSearch(){
                DecryptContactName(()=>unblockUI());
              }
              function DecryptContactName(callback){
                let no_in_ids = [];
                j$("[aws-data-id]").each(function(i,e){
                  let id = e.getAttribute("aws-data-id");
                  if(!(id && awsdata_map.hasOwnProperty(id))){
                    no_in_ids.push(id);
                  }
                });
                if(no_in_ids.length>0){
                  AWSService.search(staticResource.searchUrl,JSON.stringify({
                    "dataIds":no_in_ids
                  }),function(data){
                    if(data.object && data.object.length > 0){
                      for(let d of data.object){
                        if(d.dataId){
                          awsdata_map[d.dataId] = d;
                        }
                      }
                    }
                    BindToTile();
                    if(callback)callback();
                  },staticResource.token);
                }
                else{
                  BindToTile();
                  if(callback)callback();
                }
              }
              function BindToTile(){
                j$("[aws-data-id]").each(function(i,e){
                  let id = e.getAttribute("aws-data-id");
                  if(id && awsdata_map.hasOwnProperty(id) && awsdata_map[id].medicalStaffFullName){
                    j$(e).find(".decrypt").html(awsdata_map[id].medicalStaffFullName);
                  }
                });
              }
</script>
        </apex:outputPanel>
    </apex:form>
force-app/main/default/pages/CM_SearchContact.page
@@ -1,21 +1,83 @@
<apex:page id="Page" controller="CM_SearchContact" sidebar="false" showHeader="false" action="{!init}">
    <apex:stylesheet value="{!URLFOR($Resource.blockUIcss)}"/>
    <!-- 2022/02/15 张华建 dependency start -->
    <apex:includeScript value="{!URLFOR($Resource.AWSService, 'AWSService.js') }" />
    <!-- 2022/02/15 张华建 dependency end -->
    <apex:includeScript value="{!URLFOR($Resource.jquery183minjs)}"/>
    <apex:includeScript value="{!URLFOR($Resource.PleaseWaitDialog)}"/>
    <script type="text/javascript">
        // 2022/02/15 张华建 改造PI start
        var staticResources = JSON.parse('{!staticResource}');
        var contactAWSIds = JSON.parse('{!contactAWSIds}');
        var LastName = '';
        var contact = {};
        var now_edit_id = '';
        var aws_result = {};
        searchContactAll();
        function preparePayloadForSearchContact(){
            let searchPayload = new Object();
            searchPayload.dataIds = contactAWSIds;
            searchPayload.contactName = LastName;
            return JSON.stringify(searchPayload);
        }
        function searchContactAll(){
            let data = preparePayloadForSearchContact();
            let searchCallBack = function searchCallBack(result){
                let contacts = result.object;
                if(contacts == null){
                    return;
                }
                for(var i=0;i<contacts.length;i++){
                    let temp = {}
                    temp.lastName = contacts[i].lastName;
                    temp.phone = contacts[i].phone;
                    contact[contacts[i].dataId] = temp;
                }
                console.log(JSON.stringify(contact));
            };
            AWSService.search(staticResources.searchUrl,data,searchCallBack,staticResources.token);
        }
        function searchContactJs() {
            blockme();
            searchContact();
            LastName = document.getElementById('Page:allForm:searchBlock:LastName').value;
            let awsDataIdArray = [];
            for(var key in contact){
                if(contact[key].lastName.includes(LastName)){
                    awsDataIdArray.push(key);
        }
            }
            console.log(awsDataIdArray)
            if(awsDataIdArray.length == 0){
                clearLineInfoList();
                return;
            }
            searchContactAll();
            searchContact(awsDataIdArray.toString());
        }
        // 2022/02/15 张华建 改造PI end
        function editContactJs(conid) {
            blockme();
            now_edit_id=conid;// 2022/02/15 徐亮 改造PI
            editContact(conid);
        }
        function editSaveJs() {
            document.getElementById("errorMsg").innerHTML = '';
            if(!document.getElementById("Page:allForm:editBlock:Search_LastName__c").value){
                document.getElementById("errorMsg").innerHTML = '<strong>错误:</strong> 必须填写。';
                return;
            }
            blockme();
            saveNew();
            ProcessPI({},GetEditObj());
        }
        function editClearJs() {
@@ -23,14 +85,17 @@
            editClear();
        }
        function setContact(line) {
        function setContact(line,awsDataId) {
            var openLine = '{!openLine}';
            var cm = 'allPage:allForm:allBlock:records:'+ (openLine - 1) + ':contact';
            var cmid = 'allPage:allForm:allBlock:records:'+ (openLine - 1) + ':contactId';
            var conid = j$(escapeVfId('Page:allForm:listBlock:lineinfo:' + (line - 1) + ':conId')).value();
            var conname = j$(escapeVfId('Page:allForm:listBlock:lineinfo:' + (line - 1) + ':conName')).value();
            //var conname = j$(escapeVfId('Page:allForm:listBlock:lineinfo:' + (line - 1) + ':conName')).value();
            //2022/02/15 张华建 赋值成明文 start
            var conname = contact[awsDataId].lastName;
            //2022/02/15 张华建 赋值成明文 end
            j$(escapeVfId(cmid),window.opener.document).val(conid);
            j$(escapeVfId(cm),window.opener.document).val(conname);
@@ -53,19 +118,136 @@
            window.close();
        }
        function showPIDiv(awsDataId){
            console.log('awsDataId Value:'+awsDataId);
            let parentNode = document.getElementById(awsDataId);
            let createDiv = document.createElement("div");
            createDiv.id = awsDataId+"_PI";
            let piInformation = 'Name:'+contact[awsDataId].lastName +'\n' +'Phone:'+contact[awsDataId].phone
            //let piInformation = 'Name:'+contact['943114607025717249'].lastName +'\n' +'Phone:'+contact['943114607025717249'].phone
            createDiv.innerText = piInformation;
            let x=window.event.x;
            let y=window.event.y;
            createDiv.style.left=x;
            createDiv.style.top=y;
            createDiv.style.background="#dddddd";
            createDiv.style.position = "absolute";
            parentNode.appendChild(createDiv);
        }
        function hidePIDiv(awsDataId){
            document.getElementById(awsDataId+'_PI').remove();
        }
        // 2022年2月15日 PI改造 徐亮 start
        function sobjectToAws(){
            let aws_id = document.getElementById("Page:allForm:editBlock:AWS_Data_Id__c").value;
            if(contact.hasOwnProperty(aws_id)){
                return contact[aws_id];
            }
            else{
                console.log('not found aws data in contact obj');
                return {};
            }
        }
        function GetAWSResultObj(){
            if(aws_result && aws_result.object && aws_result.object.length > 0){
                return aws_result.object[0];
            }
            return null;
        }
        function ProcessPI(sobjJson, payloadForNewPI) {
            let url = staticResources.newUrl
            if (now_edit_id) {
                url = staticResources.updateUrl
            }
            AWSService.post(url, payloadForNewPI, function(result){
                aws_result = result;
                SetEditObj();
                saveNew();
            }, staticResources.token);
        }
        function Trans(){
            /*
            jQuery.ajax({
                "type":"post",
                "url":staticResources.transactionUrl,
                "data":{
                    "txId":aws_result.txId,
                    "isSuccess":1
                },
                beforeSend: function(request) {
                    request.setRequestHeader("pi-token",staticResources.token);
                    request.setRequestHeader('Content-Type', 'application/json');
                },
                success:function(data){
                    console.log(data);
                },
                error:function(jqXHR, textStatus, errorThrown) {
                    console.log(jqXHR);
                    console.log(textStatus);
                    console.log(errorThrown);
                }
            });*/
            AWSService.post(staticResources.transactionUrl, JSON.stringify({
                    "txId":aws_result.txId,
                    "isSuccess":1
                }), function(result){
                    window.location.reload();
                }, staticResources.token);
        }
        function assignUnencrypted(){
            let obj = sobjectToAws();
            document.getElementById("Page:allForm:editBlock:Search_LastName__c").value = obj.lastName;
            document.getElementById("Page:allForm:editBlock:Phone").value = obj.phone;
            unblockUI();
        }
        function GetEditObj(){
            return JSON.stringify([{
                lastName : document.getElementById("Page:allForm:editBlock:Search_LastName__c").value,
                phone : document.getElementById("Page:allForm:editBlock:Phone").value,
                dataId:document.getElementById("Page:allForm:editBlock:AWS_Data_Id__c").value,
            }]);
        }
        function SetEditObj(){
            let obj = GetAWSResultObj();
            if(obj){
                document.getElementById("Page:allForm:editBlock:AWS_Data_Id__c").value = obj.dataId;
                document.getElementById("Page:allForm:editBlock:Search_LastName__c").value = obj.lastName;
                document.getElementById("Page:allForm:editBlock:LastName_Encrypted__c").value = obj.lastNameEncrypt;
                document.getElementById("Page:allForm:editBlock:Phone").value = obj.phone;
                document.getElementById("Page:allForm:editBlock:Phone_Encrypted__c").value = obj.phoneEncrypt;
            }
        }
        // 2022年2月15日 PI改造 徐亮 end
    </script>
    <apex:form id="allForm">
        <apex:actionFunction name="searchContact" action="{!searchContact}" rerender="allForm" onComplete="unblockUI();">
            <apex:param name="awsDataIdArray" assignTo="{!awsDataIdArray}" value="" />
        </apex:actionFunction>
        <apex:actionFunction name="editContact" action="{!editContact}" rerender="allForm" onComplete="unblockUI();">
        <apex:actionFunction name="editContact" action="{!editContact}" rerender="allForm" onComplete="assignUnencrypted();">
            <apex:param name="firstParam" assignTo="{!conId}" value="" />
        </apex:actionFunction>
        <apex:actionFunction name="saveNew" action="{!saveNew}" rerender="allForm" onComplete="unblockUI();">
        <apex:actionFunction name="saveNew" action="{!saveNew}" rerender="allForm" onComplete="Trans();">
        </apex:actionFunction>
        <apex:actionFunction name="editClear" action="{!editClear}" rerender="allForm" onComplete="unblockUI();">
        </apex:actionFunction>
        <!-- 2022/02/15 张华建 清空LineInfoList start -->
        <apex:actionFunction name="clearLineInfoList" action="{!clearLineInfoList}" rerender="allForm" onComplete="unblockUI();">
        </apex:actionFunction>
        <!-- 2022/02/15 张华建 清空LineInfoList end -->
        <apex:outputPanel id="allPanel">
            <apex:pageBlock id="searchBlock" title="检索条件">
                <table class="linetable" border="0" style="border-collapse: collapse;width:600px;table-layout:fixed;">
@@ -78,9 +260,11 @@
                    </colgroup>
                    <tr>
                        <td>{!$ObjectType.Contact.fields.LastName.Label}</td>
                        <td><apex:inputField value="{!searchCon.Search_LastName__c}" style="width: 90%"/></td>
                        <td>{!$ObjectType.Contact.fields.FirstName.Label}</td>
                        <td><apex:inputField value="{!searchCon.Search_FirstName__c}" style="width: 90%"/></td>
                        <td><apex:inputField id="LastName" value="{!searchCon.Search_LastName__c}" style="width: 90%"/></td>
                        <!-- 2022/02/15 张华建 不需要FirstName start -->
                        <!-- <td>{!$ObjectType.Contact.fields.FirstName.Label}</td>
                        <td><apex:inputField id="FirstName" value="{!searchCon.Search_FirstName__c}" style="width: 90%"/></td> -->
                        <!-- 2022/02/15 张华建 不需要FirstName end -->
                        <td><input type="button" value="检索" onclick="searchContactJs(); return null;" /></td>
                    </tr>
                </table>
@@ -109,7 +293,10 @@
                            <apex:inputHidden id="accountName" value="{!lineinfo.con.AccountName__c}"/>
                            <apex:inputHidden id="accountid" value="{!lineinfo.con.accountid}"/>
                        </td>
                        <td><a href="#" onclick="setContact('{!lineinfo.lineNo}');">{!lineinfo.con.Name}</a></td>
                            <!-- <td><a href="#" onclick="setContact('{!lineinfo.lineNo}');" id="943114607025717249" onmouseover="showPIDiv('943114607025717249')" onmouseout="hidePIDiv('943114607025717249')">{!lineinfo.con.Name}</a></td> -->
                            <!-- 2022/02/15 张华建 解密信息 start -->
                            <td><a href="#" onclick="setContact('{!lineinfo.lineNo}','{!lineinfo.con.AWS_Data_Id__c}');" id="{!lineinfo.con.AWS_Data_Id__c}" onmouseover="showPIDiv('{!lineinfo.con.AWS_Data_Id__c}')" onmouseout="hidePIDiv('{!lineinfo.con.AWS_Data_Id__c}')">{!lineinfo.con.Name}</a></td>
                            <!-- 2022/02/15 张华建 解密信息 end -->
                        <td>{!lineinfo.con.AccountName__c}</td>
                        <td><input style="width:90%;" type="button" value="编辑" onclick="editContactJs('{!lineinfo.con.Id}'); return null;" /></td>
                    </tr>
@@ -123,6 +310,11 @@
                    <apex:commandButton onclick="editClearJs();" value="清空" rerender="dummy"/>
                    <apex:commandButton onclick="editSaveJs();" value="保存" rerender="dummy"/>
                </apex:pageBlockButtons>
                <apex:inputHidden id="LastName_Encrypted__c" value="{!newCon.LastName_Encrypted__c}"/>
                <apex:inputHidden id="Phone_Encrypted__c" value="{!newCon.Phone_Encrypted__c}"/>
                <apex:inputHidden id="AWS_Data_Id__c" value="{!newCon.AWS_Data_Id__c}"/>
                <table class="edittable" border="0" style="border-collapse: collapse; width:600px; table-layout:fixed;">
                    <colgroup>
                        <col width="50px" />
@@ -135,12 +327,13 @@
                    <tr>
                        <td>{!$ObjectType.Contact.fields.LastName.Label}</td>
                        <td><span><div class="requiredInput"><div class="requiredBlock"></div>
                            <apex:inputField value="{!newCon.Search_LastName__c}" style="width: 90%"/>
                            <apex:inputField id="Search_LastName__c" value="{!newCon.Search_LastName__c}" style="width: 90%"/>
                            <div id="errorMsg" class="errorMsg"></div>
                        </div></span></td>
                        <td>{!$ObjectType.Contact.fields.FirstName.Label}</td>
                        <td><apex:inputField value="{!newCon.Search_FirstName__c}" style="width: 90%"/></td>
                        <!-- <td>{!$ObjectType.Contact.fields.FirstName.Label}</td>
                        <td><apex:inputField value="{!newCon.Search_FirstName__c}" style="width: 90%"/></td> -->
                        <td>{!$ObjectType.Contact.fields.Phone.Label}</td>
                        <td><apex:inputField value="{!newCon.Phone}" style="width: 90%"/></td>
                        <td><apex:inputField id="Phone" value="{!newCon.Phone}" style="width: 90%"/></td>
                    </tr>
                    <tr>
                        <td>{!$ObjectType.Contact.fields.Supplement__c.Label}</td>
force-app/main/default/pages/CM_SearchContactService.page
@@ -1,21 +1,83 @@
<apex:page id="Page" controller="CM_SearchContactServiceController" sidebar="false" showHeader="false" action="{!init}">
    <!-- 2022/02/15 张华建 dependency start -->
    <apex:includeScript value="{!URLFOR($Resource.AWSService, 'AWSService.js') }" />
    <!-- 2022/02/15 张华建 dependency end -->
    <apex:stylesheet value="{!URLFOR($Resource.blockUIcss)}"/>
    <apex:includeScript value="{!URLFOR($Resource.jquery183minjs)}"/>
    <apex:includeScript value="{!URLFOR($Resource.PleaseWaitDialog)}"/>
    <script type="text/javascript">
        // 2022/02/15 张华建 改造PI start
        var staticResources = JSON.parse('{!staticResource}');
        var contactAWSIds = JSON.parse('{!contactAWSIds}');
        var LastName = '';
        var contact = {};
        var now_edit_id = '';
        var aws_result = {};
        searchContactAll();
        function preparePayloadForSearchContact(){
            let searchPayload = new Object();
            searchPayload.dataIds = contactAWSIds;
            searchPayload.contactName = LastName;
            return JSON.stringify(searchPayload);
        }
        function searchContactAll(){
            let data = preparePayloadForSearchContact();
            let searchCallBack = function searchCallBack(result){
                let contacts = result.object;
                if(contacts == null){
                    return;
                }
                for(var i=0;i<contacts.length;i++){
                    let temp = {}
                    temp.lastName = contacts[i].lastName;
                    temp.phone = contacts[i].phone;
                    contact[contacts[i].dataId] = temp;
                }
                console.log(JSON.stringify(contact));
            };
            AWSService.search(staticResources.searchUrl,data,searchCallBack,staticResources.token);
        }
        function searchContactJs() {
            blockme();
            searchContact();
            LastName = document.getElementById('Page:allForm:searchBlock:LastName').value;
            let awsDataIdArray = [];
            for(var key in contact){
                if(contact[key].lastName.includes(LastName)){
                    awsDataIdArray.push(key);
        }
            }
            console.log(awsDataIdArray)
            if(awsDataIdArray.length == 0){
                clearLineInfoList();
                return;
            }
            searchContactAll();
            searchContact(awsDataIdArray.toString());
        }
        // 2022/02/15 张华建 改造PI end
        function editContactJs(conid) {
            blockme();
            now_edit_id=conid;// 2022/02/15 徐亮 改造PI
            editContact(conid);
        }
        function editSaveJs() {
            document.getElementById("errorMsg").innerHTML = '';
            if(!document.getElementById("Page:allForm:editBlock:Search_LastName__c").value){
                document.getElementById("errorMsg").innerHTML = '<strong>错误:</strong> 必须填写。';
                return;
            }
            blockme();
            saveNew();
            ProcessPI({},GetEditObj());
        }
        function editClearJs() {
@@ -23,12 +85,16 @@
            editClear();
        }
        function setContact(line) {
        function setContact(line,awsDataId) {
            var openLine = '{!openLine}';
            var cm = 'allPage:allForm:allBlock:records:'+ (openLine - 1) + ':contact';
            var cmid = 'allPage:allForm:allBlock:records:'+ (openLine - 1) + ':contactId';
            var conid = j$(escapeVfId('Page:allForm:listBlock:lineinfo:' + (line - 1) + ':conId')).value();
            var conname = j$(escapeVfId('Page:allForm:listBlock:lineinfo:' + (line - 1) + ':conName')).value();
            //var conname = j$(escapeVfId('Page:allForm:listBlock:lineinfo:' + (line - 1) + ':conName')).value();
            //2022/02/15 张华建 赋值成明文 start
            var conname = contact[awsDataId].lastName;
            //2022/02/15 张华建 赋值成明文 end
            // 2018/11/19 HWAG-B399RW 自动设置省和市 start
            var cityName = j$(escapeVfId('Page:allForm:listBlock:lineinfo:' + (line - 1) + ':City')).value();
            var StateName = j$(escapeVfId('Page:allForm:listBlock:lineinfo:' + (line - 1) + ':State')).value();
@@ -45,19 +111,115 @@
            window.close();
        }
        function showPIDiv(awsDataId){
            console.log('awsDataId Value:'+awsDataId);
            let parentNode = document.getElementById(awsDataId);
            let createDiv = document.createElement("div");
            createDiv.id = awsDataId+"_PI";
            let piInformation = 'Name:'+contact[awsDataId].lastName +'\n' +'Phone:'+contact[awsDataId].phone
            //let piInformation = 'Name:'+contact['943114607025717249'].lastName +'\n' +'Phone:'+contact['943114607025717249'].phone
            createDiv.innerText = piInformation;
            let x=window.event.x;
            let y=window.event.y;
            createDiv.style.left=x;
            createDiv.style.top=y;
            createDiv.style.background="#dddddd";
            createDiv.style.position = "absolute";
            parentNode.appendChild(createDiv);
        }
        function hidePIDiv(awsDataId){
            document.getElementById(awsDataId+'_PI').remove();
        }
        // 2022年2月15日 PI改造 徐亮 start
        function sobjectToAws(){
            let aws_id = document.getElementById("Page:allForm:editBlock:AWS_Data_Id__c").value;
            if(contact.hasOwnProperty(aws_id)){
                return contact[aws_id];
            }
            else{
                console.log('not found aws data in contact obj');
                return {};
            }
        }
        function GetAWSResultObj(){
            if(aws_result && aws_result.object && aws_result.object.length > 0){
                return aws_result.object[0];
            }
            return null;
        }
        function ProcessPI(sobjJson, payloadForNewPI) {
            //blockme();
            let url = staticResources.newUrl
            if (now_edit_id) {
                url = staticResources.updateUrl
            }
            AWSService.post(url, payloadForNewPI, function(result){
                aws_result = result;
                SetEditObj();
                saveNew();
            }, staticResources.token);
        }
        function Trans(){
            AWSService.post(staticResources.transactionUrl, JSON.stringify({
                "txId":aws_result.txId,
                "isSuccess":1
            }), function(result){
                window.location.reload();
            }, staticResources.token);
        }
        function assignUnencrypted(){
            let obj = sobjectToAws();
            document.getElementById("Page:allForm:editBlock:Search_LastName__c").value = obj.lastName;
            //document.getElementById("Page:allForm:editBlock:Phone").value = obj.phone;
            unblockUI();
        }
        function GetEditObj(){
            return JSON.stringify([{
                lastName : document.getElementById("Page:allForm:editBlock:Search_LastName__c").value,
                //phone : document.getElementById("Page:allForm:editBlock:Phone").value,
                dataId:document.getElementById("Page:allForm:editBlock:AWS_Data_Id__c").value,
            }]);
        }
        function SetEditObj(){
            let obj = GetAWSResultObj();
            if(obj){
                document.getElementById("Page:allForm:editBlock:AWS_Data_Id__c").value = obj.dataId;
                document.getElementById("Page:allForm:editBlock:Search_LastName__c").value = obj.lastName;
                document.getElementById("Page:allForm:editBlock:LastName_Encrypted__c").value = obj.lastNameEncrypt;
                //document.getElementById("Page:allForm:editBlock:Phone").value = obj.phone;
                document.getElementById("Page:allForm:editBlock:Phone_Encrypted__c").value = obj.phoneEncrypt;
            }
        }
        // 2022年2月15日 PI改造 徐亮 end
    </script>
    <apex:form id="allForm">
        <apex:actionFunction name="searchContact" action="{!searchContact}" rerender="allForm,allPanel" onComplete="unblockUI();">
            <apex:param name="awsDataIdArray" assignTo="{!awsDataIdArray}" value="" />
        </apex:actionFunction>
        <apex:actionFunction name="editContact" action="{!editContact}" rerender="allForm,allPanel" onComplete="unblockUI();">
        <apex:actionFunction name="editContact" action="{!editContact}" rerender="allForm,allPanel" onComplete="assignUnencrypted();">
            <apex:param name="firstParam" assignTo="{!conId}" value="" />
        </apex:actionFunction>
        <apex:actionFunction name="saveNew" action="{!saveNew}" rerender="allForm,allPanel" onComplete="unblockUI();">
        <apex:actionFunction name="saveNew" action="{!saveNew}" rerender="allForm,allPanel" onComplete="Trans();">
        </apex:actionFunction>
        <apex:actionFunction name="editClear" action="{!editClear}" rerender="allForm,allPanel" onComplete="unblockUI();">
        </apex:actionFunction>
        <!-- 2022/02/15 张华建 清空LineInfoList start -->
        <apex:actionFunction name="clearLineInfoList" action="{!clearLineInfoList}" rerender="allForm" onComplete="unblockUI();">
        </apex:actionFunction>
        <!-- 2022/02/15 张华建 清空LineInfoList end -->
        <apex:outputPanel id="allPanel">
            <apex:pageBlock id="searchBlock" title="检索条件">
                <table class="linetable" border="0" style="border-collapse: collapse;width:600px;table-layout:fixed;">
@@ -70,9 +232,11 @@
                    </colgroup>
                    <tr>
                        <td>{!$ObjectType.Contact.fields.LastName.Label}</td>
                        <td><apex:inputField value="{!searchCon.Search_LastName__c}" style="width: 90%"/></td>
                        <td>{!$ObjectType.Contact.fields.FirstName.Label}</td>
                        <td><apex:inputField value="{!searchCon.Search_FirstName__c}" style="width: 90%"/></td>
                        <td><apex:inputField id="LastName" value="{!searchCon.Search_LastName__c}" style="width: 90%"/></td>
                        <!-- 2022/02/15 张华建 不需要FirstName start -->
                        <!-- <td>{!$ObjectType.Contact.fields.FirstName.Label}</td>
                        <td><apex:inputField id="FirstName" value="{!searchCon.Search_FirstName__c}" style="width: 90%"/></td> -->
                        <!-- 2022/02/15 张华建 不需要FirstName end -->
                        <td><input type="button" value="检索" onclick="searchContactJs(); return null;" /></td>
                    </tr>
                </table>
@@ -104,7 +268,10 @@
                            <!--  2018/11/19 HWAG-B399RW  存取客户人员省市数据 end -->
                        </td>
                        <td><a href="#" onclick="setContact('{!lineinfo.lineNo}');">{!lineinfo.con.Name}</a></td>
                        <!-- <td><a href="#" onclick="setContact('{!lineinfo.lineNo}');" id="943114607025717249" onmouseover="showPIDiv('943114607025717249')" onmouseout="hidePIDiv('943114607025717249')">{!lineinfo.con.Name}</a></td> -->
                        <!-- 2022/02/15 张华建 解密信息 start -->
                        <td><a href="#" onclick="setContact('{!lineinfo.lineNo}','{!lineinfo.con.AWS_Data_Id__c}');" id="{!lineinfo.con.AWS_Data_Id__c}" onmouseover="showPIDiv('{!lineinfo.con.AWS_Data_Id__c}')" onmouseout="hidePIDiv('{!lineinfo.con.AWS_Data_Id__c}')">{!lineinfo.con.Name}</a></td>
                        <!-- 2022/02/15 张华建 解密信息 end -->
                        <td>{!lineinfo.con.AccountName__c}</td>
                        <td><input style="width:90%;" type="button" value="编辑" onclick="editContactJs('{!lineinfo.con.Id}'); return null;" /></td>
                    </tr>
@@ -118,6 +285,9 @@
                    <apex:commandButton onclick="editClearJs();" value="清空" rerender="dummy"/>
                    <apex:commandButton onclick="editSaveJs();" value="保存" rerender="dummy"/>
                </apex:pageBlockButtons>
                <apex:inputHidden id="LastName_Encrypted__c" value="{!newCon.LastName_Encrypted__c}"/>
                <apex:inputHidden id="Phone_Encrypted__c" value="{!newCon.Phone_Encrypted__c}"/>
                <apex:inputHidden id="AWS_Data_Id__c" value="{!newCon.AWS_Data_Id__c}"/>
                <table class="edittable" border="0" style="border-collapse: collapse; width:600px; table-layout:fixed;">
                    <colgroup>
                        <col width="50px" />
@@ -130,10 +300,11 @@
                    <tr>
                        <td>{!$ObjectType.Contact.fields.LastName.Label}</td>
                        <td><span><div class="requiredInput"><div class="requiredBlock"></div>
                            <apex:inputField value="{!newCon.Search_LastName__c}" style="width: 90%"/>
                            <apex:inputField id="Search_LastName__c" value="{!newCon.Search_LastName__c}" style="width: 90%"/>
                            <div id="errorMsg" class="errorMsg"></div>
                        </div></span></td>
                        <td>{!$ObjectType.Contact.fields.FirstName.Label}</td>
                        <td><apex:inputField value="{!newCon.Search_FirstName__c}" style="width: 90%"/></td>
                        <!-- <td>{!$ObjectType.Contact.fields.FirstName.Label}</td>
                        <td><apex:inputField value="{!newCon.Search_FirstName__c}" style="width: 90%"/></td> -->
                    </tr>
                    <tr>
                        <td>{!$ObjectType.Contact.fields.Supplement__c.Label}</td>
force-app/main/default/pages/CampaignMember.page
@@ -6,6 +6,9 @@
<apex:includeScript value="{!URLFOR($Resource.jquerysuggestjs)}"/>
<apex:includeScript value="{!URLFOR($Resource.connection20)}"/>
<apex:includeScript value="{!URLFOR($Resource.apex20)}"/>
<!-- 2022/02/15 张华建 dependency start -->
<apex:includeScript value="{!URLFOR($Resource.AWSService, 'AWSService.js') }" />
<!-- 2022/02/15 张华建 dependency end -->
<style type="text/css">
    .visitorplace_results {
        border: 1px solid gray;
@@ -138,8 +141,49 @@
        }
    }
    // 20220216 PI改造 by 徐亮 start
    var staticResource = JSON.parse('{!staticResource}');
    var awsids = [];
    var aws_result={};
    jQuery(function(){
        var eles = document.getElementsByClassName("contact");
        for(let e of eles){
            let awsid = e.getAttribute('awsid');
            if(awsid) awsids.push(awsid);
        }
        if(awsids.length > 0){
            AWSService.search(staticResource.searchUrl,JSON.stringify({dataIds:awsids}),function(result){
                if(result.status == '0' && result.object && result.object.length > 0){
                    for(let obj of result.object){
                        jQuery("[awsid='"+obj.dataId + "']").val(obj.lastName);
                    }
                }
            },staticResource.token);
        }
    })
    //jQuery(".contact").attr("awsid");
    function encrypt(){
        jQuery(".contact").each(function(i,e){
            if(e.value){
                e.value = '***';
            }
        });
    }
    // 20220216 PI改造 by 徐亮 end
function saveJs() {
    blockme();
    encrypt() // 20220216 PI改造 by 徐亮
    saveLine();
}
function addJs() {
@@ -349,7 +393,7 @@
                            <apex:inputHidden id="departmentHiddenId" value="{!lineInfo.cm.Department_ID__c}" />
                        </td>
                        <td align="center">
                            <apex:inputField id="contact" value="{!lineInfo.cm.Contact__c}" onclick="openSearchContact({!lineInfo.line})" style="width: 95%"></apex:inputField>
                            <apex:inputField styleClass="contact" html-awsid="{!lineInfo.cm.Contact_ID__r.AWS_Data_Id__c}" id="contact" value="{!lineInfo.cm.Contact__c}" onclick="openSearchContact({!lineInfo.line})" style="width: 95%"></apex:inputField>
                            <apex:inputHidden id="contactId" value="{!lineInfo.cm.Contact_ID__c}"></apex:inputHidden>
                            <apex:inputHidden id="contactSDCName" value="{!lineInfo.cm.Contact_ID__r.Strategic_dept_Class__r.Name}"></apex:inputHidden>
                        </td>
force-app/main/default/pages/CampaignMemberService.page
@@ -6,6 +6,9 @@
<apex:includeScript value="{!URLFOR($Resource.jquerysuggestjs)}"/>
<apex:includeScript value="{!URLFOR($Resource.connection20)}"/>
<apex:includeScript value="{!URLFOR($Resource.apex20)}"/>
<!-- 2022/02/15 张华建 dependency start -->
<apex:includeScript value="{!URLFOR($Resource.AWSService, 'AWSService.js') }" />
<!-- 2022/02/15 张华建 dependency end -->
<style type="text/css">
    .visitorplace_results {
        border: 1px solid gray;
@@ -136,10 +139,53 @@
        }
    }
// 20220216 PI改造 by 徐亮 start
var staticResource = JSON.parse('{!staticResource}');
    var awsids = [];
    var aws_result={};
    jQuery(function(){
        var eles = document.getElementsByClassName("contact");
        for(let e of eles){
            let awsid = e.getAttribute('awsid');
            if(awsid) awsids.push(awsid);
        }
        if(awsids.length > 0){
            AWSService.search(staticResource.searchUrl,JSON.stringify({dataIds:awsids}),function(result){
                if(result.status == '0' && result.object && result.object.length > 0){
                    for(let obj of result.object){
                        jQuery("[awsid='"+obj.dataId + "']").val(obj.lastName);
                    }
                }
            },staticResource.token);
        }
    })
    //jQuery(".contact").attr("awsid");
    function encrypt(){
        jQuery(".contact").each(function(i,e){
            if(e.value){
                e.value = '***';
            }
        });
    }
    // 20220216 PI改造 by 徐亮 end
function saveJs() {
    blockme();
    encrypt() // 20220216 PI改造 by 徐亮
    saveLine();
}
function addJs() {
    blockme();
    addLine();
@@ -261,7 +307,7 @@
                            <apex:inputHidden id="departmentHiddenId" value="{!lineInfo.cm.Department_ID__c}" />
                        </td>
                        <td align="center">
                            <apex:inputField id="contact" value="{!lineInfo.cm.Contact__c}" onclick="openSearchContact({!lineInfo.line})" style="width: 95%"></apex:inputField>
                            <apex:inputField styleClass="contact" html-awsid="{!lineInfo.cm.Contact_ID__r.AWS_Data_Id__c}" id="contact" value="{!lineInfo.cm.Contact__c}" onclick="openSearchContact({!lineInfo.line})" style="width: 95%"></apex:inputField>
                            <apex:inputHidden id="contactId" value="{!lineInfo.cm.Contact_ID__c}"></apex:inputHidden>
                            <apex:inputHidden id="contactSDCName" value="{!lineInfo.cm.Contact_ID__r.Strategic_dept_Class__r.Name}"></apex:inputHidden>
                        </td>
force-app/main/default/pages/ConsumReassign.page
@@ -2,7 +2,23 @@
<apex:stylesheet value="{!URLFOR($Resource.blockUIcss)}"/>
<apex:includeScript value="{!URLFOR($Resource.jquery183minjs)}"/>
<apex:includeScript value="{!URLFOR($Resource.PleaseWaitDialog)}"/>
<apex:includeScript value="{! URLFOR($Resource.AWSService, 'AWSService.js') }" />
<script src="../../soap/ajax/53.0/connection.js" type="text/javascript"></script>
<style>
    .decrypt {
        position: absolute;
        top: 0;
        left: 100%;
        display: none;
        text-align: left;
        padding-left: 5px;
    }
    a:hover .decrypt {
        display: block;
        width: 100px
    }
</style>
<script type="text/javascript">
    function savejs() {
        if (confirm('是否操作重新分配?')) {
@@ -28,6 +44,54 @@
            alert('保存成功');
            returnjs();
        }
    }
    AWSService.sfSessionId = '{!GETSESSIONID()}';
    var staticResource = JSON.parse('{!staticResource}');
    document.body.onload = function () {
        blockme();
        DecryptContactName(() => unblockUI());
    }
    var awsdata_map = {};
    function DecryptContactName(callback) {
        let no_in_ids = [];
        j$("[aws-data-id]").each(function (i, e) {
            let id = e.getAttribute("aws-data-id");
            if (!(id && awsdata_map.hasOwnProperty(id))) {
                no_in_ids.push(id);
            }
        });
        if (no_in_ids.length > 0) {
            AWSService.search(staticResource.searchUrl, JSON.stringify({
                "dataIds": no_in_ids
            }), function (data) {
                if (data.object && data.object.length > 0) {
                    for (let d of data.object) {
                        if (d.dataId) {
                            awsdata_map[d.dataId] = d;
                        }
                    }
                }
                BindToTile();
                if (callback) callback();
            }, staticResource.token);
        }
        else {
            BindToTile();
            if (callback) callback();
        }
    }
    function BindToTile() {
        j$("[aws-data-id]").each(function (i, e) {
            let id = e.getAttribute("aws-data-id");
            if (id && awsdata_map.hasOwnProperty(id) && awsdata_map[id].trialUser) {
                j$(e).find(".decrypt").html(awsdata_map[id].trialUser);
            }
        });
    }
</script>
@@ -59,7 +123,9 @@
                        <col width="175"/>
                    </colgroup>
                    <tr style="background-color:#DCDCDC;">
                        <th style="text-align:center">全选<apex:inputCheckbox id="checkAll" value="{!checkAll}" onclick="checkAll(this);"/></th>
                        <th style="text-align:center">全选
                            <apex:inputCheckbox id="checkAll" value="{!checkAll}" onclick="checkAll(this);" />
                        </th>
                        <th style="text-align:center">{!$ObjectType.Consum_Apply_Equipment_Set_Detail__c.fields.Consum_Apply_Equipment_Set__c.label}</th>
                        <th style="text-align:center">{!$ObjectType.Consum_Apply_Equipment_Set_Detail__c.fields.Fixture_Model_No_F__c.label}</th>
                        <th style="text-align:center">数量</th>
@@ -72,15 +138,37 @@
                    <apex:repeat value="{!lineInfoList}" var="info" id="records">
                        <tr>
                            <!--<td align="center"><apex:inputCheckbox value="{!info.isSelect}" id="rowCheck" disabled="{!IF(info.status=='cantCancel', true, false)}"/></td>-->
                            <td align="center"><apex:inputCheckbox styleClass="checker" value="{!info.isSelect}" id="rowCheck"/></td>
                            <td align="left"><apex:outputField value="{!info.caesd.Consum_Apply_Equipment_Set__c}"></apex:outputField></td>
                            <td align="left"><apex:outputField value="{!info.caesd.Fixture_Model_No_F__c}"></apex:outputField></td>
                            <td align="left"><apex:outputField value="{!info.caesd.Trial_Num__c}"></apex:outputField></td>
                            <td align="left"><apex:outputField value="{!info.caesd.Asset__c}"></apex:outputField></td>
                            <td align="left"><apex:outputField value="{!info.caesd.SerialNumber_F__c}"></apex:outputField></td>
                            <td align="center"><apex:outputField value="{!info.caesd.RAESD_Status__c}"></apex:outputField></td>
                            <td align="center"><apex:outputField value="{!info.caesd.Trial_User__c}"></apex:outputField></td>
                            <td align="center"><apex:outputField value="{!info.caesd.Degree_Of_Importance__c}"></apex:outputField></td>
                            <td align="center">
                                <apex:inputCheckbox styleClass="checker" value="{!info.isSelect}" id="rowCheck" />
                            </td>
                            <td align="left">
                                <apex:outputField value="{!info.caesd.Consum_Apply_Equipment_Set__c}"></apex:outputField>
                            </td>
                            <td align="left">
                                <apex:outputField value="{!info.caesd.Fixture_Model_No_F__c}"></apex:outputField>
                            </td>
                            <td align="left">
                                <apex:outputField value="{!info.caesd.Trial_Num__c}"></apex:outputField>
                            </td>
                            <td align="left">
                                <apex:outputField value="{!info.caesd.Asset__c}"></apex:outputField>
                            </td>
                            <td align="left">
                                <apex:outputField value="{!info.caesd.SerialNumber_F__c}"></apex:outputField>
                            </td>
                            <td align="center">
                                <apex:outputField value="{!info.caesd.RAESD_Status__c}"></apex:outputField>
                            </td>
                            <td align="center">
                                <a style="position: relative" href="/{!info.caesd.Id}" aws-data-id="{!info.caesd.AWS_Data_Id__c}" title="">
                                    <span>{!info.caesd.Trial_User__c}</span>
                                    <span class="decrypt"></span>
                                </a>
                                <!-- <apex:outputField value="{!info.caesd.Trial_User__c}"></apex:outputField> -->
                            </td>
                            <td align="center">
                                <apex:outputField value="{!info.caesd.Degree_Of_Importance__c}"></apex:outputField>
                            </td>
                        </tr>
                    </apex:repeat>
                </table>
force-app/main/default/pages/ConsumTrial.page
@@ -5,6 +5,7 @@
    <apex:stylesheet value="{!URLFOR($Resource.ConsumTrialPageCss)}"/>
    <apex:includeScript value="{!URLFOR($Resource.ReceivingNotePageJS)}"/>
    <apex:includeScript value="{!URLFOR($Resource.CommonUtilJs)}"/>
    <apex:includeScript value="{! URLFOR($Resource.AWSService, 'AWSService.js') }"/>
    <apex:form id="allForm">
        <style>
            table.headTable td   {
@@ -26,6 +27,8 @@
<script type="text/javascript">
    var heightAjustment = 120;
    var widthAjustment = 30;
            var staticResource = JSON.parse('{!staticResource}');
    // 适用按钮
    function applyJs() {
@@ -303,6 +306,109 @@
        }
        window.history.pushState({},"", window.location.href.replace('&saveType=1',''));
    }
            //2022 02 24 张华建 display PI Data start
            var rowBList;
            var TrialUser = {};
            var ids = [];
            queryUser();
            function q1(){
                var p = new Promise(function(resolve, reject){
                    rowBList = JSON.parse('{!rowListString}')
                    var x = 0;
                    let searchCallBack = function searchCallBack(result){
                        let contacts = result.object;
                        if(contacts == null){
                            return;
                        }
                        let temp = {}
                        temp.trialUser = contacts.trialUser;
                        TrialUser[contacts.dataId] = temp;
                        x++;
                    };
                    for(var i=0;i<rowBList.length;i++){
                        ids.push(rowBList[i].rnd.AWS_Data_Id__c + '_' + rowBList[i].rnd.Id);
                        AWSService.query(staticResource.queryUrl,rowBList[i].rnd.AWS_Data_Id__c,searchCallBack,staticResource.token);
                    }
                    var id = setInterval(function(){
                        if(x >= rowBList.length){
                            console.log('success')
                            resolve('success');
                            clearInterval(id);
                        }
                    },1000);
                });
                return p;
            }
            function q2(value){
                var p = new Promise(function(resolve, reject){
                    console.log('进入q2'+value)
                    for(var i=0;i<ids.length;i++){
                        console.log('i = '+i);
                        document.getElementById(ids[i]).children[0].children[0].children[0].value = TrialUser[ids[i].substring(0,18)].trialUser;
                        console.log('i = '+i);
                    }
                });
            }
            function queryUser(){
                rowBList = JSON.parse('{!rowListString}')
                console.log('pageB.fixMode = '+'{!pageB.fixMode}')
                if('{!pageB.fixMode}' == 'true'){
                    q1().then(function(data){
                        return q2(data);
                    })
                    unblockUI();
                }else{
                    blockme();
                    console.log(rowBList)
                    let searchCallBack = function searchCallBack(result){
                        let contacts = result.object;
                        if(contacts == null){
                            return;
                        }
                        let temp = {}
                        temp.trialUser = contacts.trialUser;
                        TrialUser[contacts.dataId] = temp;
                    };
                    for(var i=0;i<rowBList.length;i++){
                        ids.push(rowBList[i].rnd.AWS_Data_Id__c + '_' + rowBList[i].rnd.Id);
                        AWSService.query(staticResource.queryUrl,rowBList[i].rnd.AWS_Data_Id__c,searchCallBack,staticResource.token);
                    }
                    unblockUI();
                }
            }
            function showPIDiv(awsDataId){
                if(awsDataId.length == 0){
                    return
                }
                console.log('awsDataId Value:'+awsDataId);
                let parentNode = document.getElementById(awsDataId);
                let createDiv = document.createElement("div");
                createDiv.id = awsDataId+"_PI";
                let piInformation = 'trialUser:'+TrialUser[awsDataId.substring(0,18)].trialUser
                //let piInformation = 'Name:'+contact['943114607025717249'].lastName +'\n' +'Phone:'+contact['943114607025717249'].phone
                createDiv.innerText = piInformation;
                let x=window.event.x;
                let y=window.event.y;
                createDiv.style.left=x;
                createDiv.style.top=y;
                createDiv.style.background="#dddddd";
                createDiv.style.position = "absolute";
                parentNode.appendChild(createDiv);
            }
            function hidePIDiv(awsDataId){
                if(awsDataId.length == 0){
                    return
                }
                document.getElementById(awsDataId+'_PI').remove();
            }
            //2022 02 24 张华建 display PI Data end
</script>
        <apex:pageMessages />
        <!-- oncomplete="clearApplyValue(); return false;" -->
@@ -352,6 +458,15 @@
                                    <!-- 试用者 -->
                                    {!$ObjectType.Consum_Apply_Equipment_Set_Detail__c.fields.Trial_User__c.label}
                                    <apex:inputField id="TrialUser" value="{!pageB.caesdInput.Trial_User__c}"/>
                                    <!-- <script>
                                           sfdcPage.appendToOnloadQueue(function () {
                                            var queryBack = function queryBack(data) {
                                                console.log('data = ' + data);
                                                document.getElementById('{!pageB.caesdInput.AWS_Data_Id__c}') = data.object.trialUser;
                                            };
                                                AWSService.query(staticResources.queryUrl, '{!pageB.caesdInput.AWS_Data_Id__c}', queryBack, staticResources.token);
                                            });
                                    </script> -->
                                </td>
                                <td>
                                    <!-- 跟台者 -->
@@ -444,7 +559,7 @@
                    <apex:repeat id="dataline_R" value="{!pageB.rowBList}" var="var">
                    <tr id="tableData_R_{!Cnt_R}" class="dataRow" onmouseover="if (window.hiOn){hiOn(this);} " onmouseout="if (window.hiOff){hiOff(this);} " onblur="if (window.hiOff){hiOff(this);}" onfocus="if (window.hiOn){hiOn(this);}" style="{!IF(var.isOddnumber, 'background-color : #EFF4FC;', '')}">
                        <apex:repeat value="{!inputFieldList}" var="info" id="inputField">
                            <td class="dataCellBorder1 intf {!info.value} col_{!info.value}">
                                    <td class="dataCellBorder1 intf {!info.value} col_{!info.value}" id="{! IF(info.value=='Trial_User__c',var.rnd.AWS_Data_Id__c+'_'+var.rnd.Id,info.value)}" onmouseover="showPIDiv('{! IF(info.value=='Trial_User__c',var.rnd.AWS_Data_Id__c+'_'+var.rnd.Id,'')}')" onmouseout="hidePIDiv('{! IF(info.value=='Trial_User__c',var.rnd.AWS_Data_Id__c+'_'+var.rnd.Id,'')}')">
                                <apex:outputPanel rendered="{!(contains(var.canChangeField, info.value) || var.canChangeField == '') && pageB.fixMode == true && var.canChange == true && info.value != 'Degree_Of_Importance__c'}">
                                    <!-- onchange="setChangeFlg('{!var.lineNo}')" -->
                                    <apex:outputPanel rendered="{!info.value != 'Case_OR_animal_organ__c'}">
force-app/main/default/pages/ConsumTrialPDF.page
@@ -1,4 +1,4 @@
<apex:page applyHtmlTag="false" Controller="ConsumTrialPDFController" showHeader="false" sidebar="false" id="allPage" action="{!init}" renderAs="pdf">
<apex:page applyHtmlTag="false" Controller="ConsumTrialPDFController" showHeader="false" sidebar="false" id="allPage" action="{!init}">
<!-- renderAs="pdf" -->
    <html>
        <head>
@@ -39,16 +39,66 @@
                }
            </style>
            <style>
                /* 20220221 PI改造 by 徐亮 start */
                body {
                    font-family: Arial Unicode MS;
                    page-break-inside: auto;
                    font-size: 14px;
                }
                table {
                    border-collapse: collapse;
                    width: 100%;
                }
                table, th, td {
                    border: 1px solid black;
                    text-align: left;
                }
                table.headTable tr td {
                    font-size: 13px;
                }
                table.deliInfoTable tr td {
                    font-size: 13px;
                }
                table.detailListTable tr td {
                    font-size: 8px;
                    text-align: left;
                    box-sizing:border-box;
                    padding: 1px;
                }
                table.tailTable tr td {
                    font-size: 12px;
                }
                body{margin: 0 auto;width: 920px;font-size: 14px;}
                #title1{height: 30px;}
                #title2{height: 80px;}
                #pdf-wrapper {position: relative;}
                #pdf-wrapper table{width: 100%;border-spacing: 0px;border-collapse: collapse;    border: none;}
                #pdf-wrapper table th,td{border-bottom: 1px #000 solid;}
                /* 20220221 PI改造 by 徐亮 end */
            </style>
            <!-- 20220221 PI改造 by 徐亮 start  -->
        <apex:includeScript value="{! URLFOR($Resource.AWSService, 'AWSService.js') }" />
        <script src="../../soap/ajax/53.0/connection.js" type="text/javascript"></script>
        <apex:stylesheet value="{!URLFOR($Resource.blockUIcss)}"/>
        <apex:includeScript value="{!URLFOR($Resource.jquery183minjs)}"/>
        <apex:includeScript value="{!URLFOR($Resource.PleaseWaitDialog)}"/>
        <apex:includeScript value="{!URLFOR($Resource.jspdf)}"/>
        <apex:includeScript value="{!URLFOR($Resource.html2canvas)}"/>
        <!-- 20220221 PI改造 by 徐亮 end  -->
        </head>
        <body>
            <div id="pdf-wrapper">
                <div id="title1"></div>
            <!-- 页码 -->
            <apex:variable value="{!1}" var="pageCnt" />
            <!-- 借用耗材备品发货清单 -->
            <!-- 序号 -->
            <apex:variable value="{!1}" var="lineCnt" />
            <apex:repeat value="{!pdfPageList}" var="eachPdfPage">
                <img style="float:left;width:79px;height:79px;padding:0px;margin-top:1px;z-index:999;position:relative;"
                        src="{!'/servlet/servlet.FileDownload?file=' + targetConsumApply.QRId__c}" />
                <img style="width:79px;height:79px;padding:0px;margin-top:1px;z-index:999;position:absolute;"
                        src="{!QRSrc}" />
                <!-- 表头 -->
                <table class="headTable" style="position:relative;">
                    <colgroup>
@@ -197,10 +247,10 @@
                    </colgroup>
                    <apex:outputPanel layout="none" rendered="{!eachPdfPage.equipSetDetailList.size > 0}">
                        <tr>
                            <th style="text-align:center;" colspan="14" height="25">借用耗材备品发货清单</th>
                            <th style="text-align:center;" colspan="12" height="25">借用耗材备品发货清单</th>
                        </tr>
                        <tr>
                            <th style="text-align:center; font-size:10px;" colspan="14" height="25">共计耗材备品({!consumApplySetDetailListSize})件</th>
                            <th style="text-align:center; font-size:10px;" colspan="12" height="25">共计耗材备品({!consumApplySetDetailListSize})件</th>
                        </tr>
                        <tr>
                            <td style="text-align: center;"><c:PDFWbr targetStr="序号"/></td>
@@ -254,7 +304,7 @@
                            <!-- 病例/动物脏器 -->
                            <td><c:PDFWbr targetStr="{!eachEquipSetDetail.Case_OR_animal_organ__c}"/></td>
                            <!-- 试用者盖章 -->
                            <td><c:PDFWbr targetStr="{!eachEquipSetDetail.Trial_User__c}"/></td>
                            <td aws-data-id="{!eachEquipSetDetail.AWS_Data_Id__c}"><c:PDFWbr targetStr="{!eachEquipSetDetail.Trial_User__c}"/></td>
                            <!-- 跟台者盖章 -->
                            <td><c:PDFWbr targetStr="{!eachEquipSetDetail.Follower_User__r.Name}"/></td>
                            <!-- 备用 -->
@@ -283,8 +333,7 @@
                    <!-- 20211210 ljh SFDC-C923SR add -->
                    <tr>
                        <td colspan="2" style=" border: none;">
                            <img align="left" src="{!'/servlet/servlet.FileDownload?file=' + targetConsumApply.BRId__c}" />
                            <img align="left" src="{!BRSrc}" />
                        </td>
                    </tr>
                    <!-- 20211210 ljh SFDC-C923SR end -->
@@ -294,6 +343,107 @@
                </apex:outputPanel>
                <apex:variable value="{!pageCnt + 1}" var="pageCnt" />
            </apex:repeat>
        </div>
        </body>
        <!-- 20220221 PI改造 by 徐亮 start  -->
<script>
    AWSService.sfSessionId = '{!GETSESSIONID()}';
    var staticResource = JSON.parse('{!staticResource}');
    function Fun(pdf){
        var iframe = document.createElement('iframe');
        iframe.setAttribute('style', 'position:absolute;right:0; top:0; bottom:0; height:100%; width:100%');
        document.body.appendChild(iframe);
        iframe.src = pdf.output('datauristring');
        for(let e of document.body.childNodes){
            if( e != iframe && e.style){
                e.style.display = 'none';
            }
        }
    }
    let id = "pdf-wrapper";
    var target = document.getElementById(id);
    function jsPdfDownload(){
        let pdfName = "测试";
        let id = "pdf-wrapper";
        var target = document.getElementById(id);
        target.style.background = "#FFFFFF";
        if(pdfName==''||pdfName==undefined) pdfName= getNowFormatDate();
        html2canvas(target, {
            scale: 2,
            onrendered:function(canvas) {
                var contentWidth = canvas.width;
                var contentHeight = canvas.height;
                //一页pdf显示html页面生成的canvas高度;
                var pageHeight = contentWidth / 592.28 * 841.89;
                //未生成pdf的html页面高度
                var leftHeight = contentHeight;
                //页面偏移
                var position = 0;
                //a4纸的尺寸[595.28,841.89],html页面生成的canvas在pdf中图片的宽高
                var imgWidth = 515.28;//595.28//左右边距20
                var imgHeight = 515.28/contentWidth * contentHeight;//左右边距20
                var pageData = canvas.toDataURL('image/jpeg', 1.0);
                var pdf = new jsPDF('', 'pt', 'a4');
                //有两个高度需要区分,一个是html页面的实际高度,和生成pdf的页面高度(841.89)
                //当内容未超过pdf一页显示的范围,无需分页
                if (leftHeight < pageHeight) {
                    pdf.addImage(pageData, 'JPEG', 40, 0, imgWidth, imgHeight );//左右边距20
                } else {
                    while(leftHeight > 0) {
                        pdf.addImage(pageData, 'JPEG', 40, position, imgWidth, imgHeight)//左右边距20
                        leftHeight -= pageHeight;
                        position -= 841.89;
                        //避免添加空白页
                        if(leftHeight > 0) {
                            pdf.addPage();
                        }
                    }
                }
                Fun(pdf);
            }
        })
    }
    blockme();
    document.body.onload = function(){
        let aws_ids = [];
        j$("[aws-data-id]").each(function(i,e){
            let id = j$(e).attr('aws-data-id');
            if (id) {
                aws_ids.push(id);
            }
        })
        AWSService.search(staticResource.searchUrl, JSON.stringify({
            dataIds:aws_ids
        }), function(data){
            unblockUI();
            if (data && data.object && data.object.length > 0) {
                for (const d of data.object) {
                    j$("[aws-data-id='"+d.dataId +"']").html(d.trialUser);
                }
            }
            //document.getElementById("Responsible_Person_HP__c").innerHTML = data.object.responsiblePersonHP;
            //document.getElementById("Caller_phone__c").innerHTML = data.object.callerPhone;
            setTimeout(() => {
                jsPdfDownload();
            }, 1500);
        }, staticResource.token);
    }
    document.body.onclick = function(){
        //jsPdfDownload();
    }
</script>
<!-- 20220221 PI改造 by 徐亮 end  -->
    </html>
</apex:page>
force-app/main/default/pages/FixtureRentalPDF.page
@@ -1,4 +1,4 @@
<apex:page applyHtmlTag="false" Controller="FixtureRentalPDFController" showHeader="false" sidebar="false" id="allPage" action="{!init}" renderAs="pdf" ><!-- renderAs="pdf" -->
<apex:page applyHtmlTag="false" Controller="FixtureRentalPDFController" showHeader="false" sidebar="false" id="allPage" action="{!init}" ><!-- renderAs="pdf" -->
<html>
    <head>
         <style type="text/css" media="print">
@@ -12,16 +12,31 @@
            }*/
        </style>
            <style>
                body{margin: 0 auto;
                    width: 780px;}
                    #title1{height: 30px;}
                    #title2{height: 110px;}
            </style>
            <apex:includeScript value="{! URLFOR($Resource.AWSService, 'AWSService.js') }" />
            <script src="../../soap/ajax/53.0/connection.js" type="text/javascript"></script>
            <apex:stylesheet value="{!URLFOR($Resource.blockUIcss)}"/>
            <apex:includeScript value="{!URLFOR($Resource.jquery183minjs)}"/>
            <apex:includeScript value="{!URLFOR($Resource.PleaseWaitDialog)}"/>
            <apex:includeScript value="{!URLFOR($Resource.jspdf)}"/>
            <apex:includeScript value="{!URLFOR($Resource.html2canvas)}"/>
    </head>
    
<body style="font-family: Arial Unicode MS; page-break-inside: auto;font-size: 14px">
            <div id="pdf-wrapper">
<apex:outputPanel id="showhidden" rendered="true">
    <!-- 20201119 LJH OCSM_BP5-61 update start 现地管理和现地管理的主单不显示-->
    <!-- <apex:outputText style="float:left;font-size:22px;margin-top: 25px;" value="{!centreAddress}" /> -->
    <apex:outputText style="float:left;font-size:22px;margin-top: 25px;" value="{!IF(IsShowLU,centreAddress,'')}" />
    <!-- 20201119 LJH OCSM_BP5-61 update end 现地管理和现地管理的主单不显示-->
    <img style="float: right; width: 55px; height: 55px;padding: 0px;margin-top: 12px;" src="{!'/servlet/servlet.FileDownload?file=' + ApplyHeadShow.QRId__c}" />
                    <img style="float: right; width: 55px; height: 55px;padding: 0px;margin-top: 12px;" src="{!qrcode}" />
    <table border="1" width="100%" style="border-collapse: collapse;margin-top: 18mm;">
        <colgroup>
            <col width="50%" />
@@ -77,7 +92,7 @@
            <td style="text-align:left;" >科室名</td> <td  style="text-align:left;font-size: 13px"><apex:outputText value="{!ApplyHeadShow.Account__r.Department_Name__c}" /></td>
        </tr>
        <tr>
            <td style="text-align:left;" rowspan="3" >发货地址</td> <td colspan="2" rowspan="3" style="text-align:left;font-size: 13px"> <apex:outputText value="{!Shippmentadress}" /></td>
                            <td style="text-align:left;" rowspan="3" >发货地址</td> <td colspan="2" rowspan="3" style="text-align:left;font-size: 13px"> <apex:outputText id="Shippmentadress" value="{!Shippmentadress}" /></td>
            <td style="text-align:left;" colspan="1">邮编</td> <td  style="text-align:left;"> <apex:outputText value="{!IF(ApplyHeadShow.Shipment_address__r.Post_Code__c==null,ApplyHeadShow.Post_Code__c,ApplyHeadShow.Shipment_address__r.Post_Code__c)}" /></td>
        </tr>
        <tr>
@@ -252,7 +267,7 @@
            </td>
            <td style="box-sizing: border-box;text-align:center;font-size:13px;border-left: solid 1px;"  rowspan="2">医疗机构</td>
            <!-- 20220124 ljh SFDC-C4U3PH update colspan="4"  -->
            <td style="box-sizing: border-box;text-align:left;font-size: 13px;"  colspan="5"  rowspan="2">
                            <td style="box-sizing: border-box;text-align:left;font-size: 13px;"  colspan="4"  rowspan="2">
                <apex:outputText value="{!HospitalName}" />
            </td>
        </tr>
@@ -269,7 +284,7 @@
            </td>
            <td style="box-sizing: border-box;text-align:center;font-size:13px;border-left: solid 1px;"  rowspan="2">发货地址</td>
            <!-- 20220124 ljh SFDC-C4U3PH update colspan="4"  -->
            <td style="box-sizing: border-box;text-align:left;font-size: 13px;"  colspan="5"  rowspan="2">
                            <td style="box-sizing: border-box;text-align:left;font-size: 13px;"  colspan="4"  rowspan="2">
                <apex:outputText value="{!if(isblank(ApplyHeadShow.Shippment_adress_detail__c), ApplyHeadShow.direct_shippment_address__c, ApplyHeadShow.Shippment_adress_detail__c)}" />
            </td>
        </tr>
@@ -281,13 +296,13 @@
        </tr>
        <tr>
            <!-- 20220124 ljh SFDC-C4U3PH update colspan="8" -->
            <th style="text-align:center;font-size:13px;height: 7pt;" colspan="9" >借用备品发货清单</th>
                            <th style="text-align:center;font-size:13px;height: 7pt;" colspan="8" >借用备品发货清单</th>
        </tr>
        <tr>
            <td rowspan="2" style="box-sizing: border-box;text-align:center;font-size: 11px;">序号</td>
            <td rowspan="2" style="box-sizing: border-box;text-align:center;font-size: 11px;">管理编号</td>
            <!-- 20220124 ljh SFDC-C4U3PH update colspan="6" -->
            <td colspan="7" style="box-sizing: border-box;text-align:center;font-size: 11px;">明细</td>
                            <td colspan="6" style="box-sizing: border-box;text-align:center;font-size: 11px;">明细</td>
        </tr>
        <tr>
            <!-- <td style="text-align:center;">序号</td>
@@ -345,6 +360,87 @@
</apex:repeat>
</apex:outputPanel>
            </div>
</body>
        <script>
            console.log('----start----')
            console.log('----{!ApplyHeadShow.AWS_Data_Id__c}----')
            AWSService.sfSessionId = '{!GETSESSIONID()}';
            //sforce.connection.sessionId = '{!GETSESSIONID()}';
            var staticResources = JSON.parse('{!staticResource}');
            blockme();
            document.body.onload = function(){
                console.log('document.body.onload')
                AWSService.query(staticResources.queryUrl, '{!ApplyHeadShow.AWS_Data_Id__c}', function(data){
                    console.log('data----------')
                    console.log(data);
                    unblockUI();
                    document.getElementById("allPage:Shippmentadress").innerHTML = data.object.directShippmentAddress;
                    //document.getElementById("Caller_phone__c").innerHTML = data.object.callerPhone;
                    setTimeout(() => {
                        jsPdfDownload();
                    }, 1500);
                }, staticResources.token);
            }
            function jsPdfDownload(){
                let pdfName = "测试";
                let id = "pdf-wrapper";
                var target = document.getElementById(id);
                target.style.background = "#FFFFFF";
                if(pdfName==''||pdfName==undefined) pdfName= getNowFormatDate();
                html2canvas(target, {
                    scale: 2,
                    onrendered:function(canvas) {
                        var contentWidth = canvas.width;
                        var contentHeight = canvas.height;
                        //一页pdf显示html页面生成的canvas高度;
                        var pageHeight = contentWidth / 592.28 * 841.89;
                        //未生成pdf的html页面高度
                        var leftHeight = contentHeight;
                        //页面偏移
                        var position = 0;
                        //a4纸的尺寸[595.28,841.89],html页面生成的canvas在pdf中图片的宽高
                        var imgWidth = 565.28;//595.28//左右边距20
                        var imgHeight = 605.28/contentWidth * contentHeight;//左右边距20
                        var pageData = canvas.toDataURL('image/jpeg', 1.0);
                        var pdf = new jsPDF('', 'pt', 'a4');
                        //有两个高度需要区分,一个是html页面的实际高度,和生成pdf的页面高度(841.89)
                        //当内容未超过pdf一页显示的范围,无需分页
                        if (leftHeight < pageHeight) {
                            pdf.addImage(pageData, 'JPEG', 15, 0, imgWidth, imgHeight );//左右边距7.5
                        } else {
                            while(leftHeight > 0) {
                                pdf.addImage(pageData, 'JPEG', 15, position, imgWidth, imgHeight)//左右边距7.5
                                leftHeight -= pageHeight;
                                position -= 841.89;
                                //避免添加空白页
                                if(leftHeight > 0) {
                                    pdf.addPage();
                                }
                            }
                        }
                        Fun(pdf);
                    }
                })
            }
            function Fun(pdf){
                var iframe = document.createElement('iframe');
                iframe.setAttribute('style', 'position:absolute;right:0; top:0; bottom:0; height:100%; width:100%');
                document.body.appendChild(iframe);
                iframe.src = pdf.output('datauristring');
                for(let e of document.body.childNodes){
                    if( e != iframe && e.style){
                        e.style.display = 'none';
                    }
                }
            }
        </script>
</html>
</apex:page>
force-app/main/default/pages/InsReportPDF.page
@@ -1,4 +1,4 @@
<apex:page controller="InsReportPDFController" showHeader="false" sidebar="false" renderAs="PDF" action="{!init}" applyHtmlTag="false">
<apex:page controller="InsReportPDFController" showHeader="false" sidebar="false" action="{!init}" applyHtmlTag="false">
<html>
<apex:stylesheet value="{!URLFOR($Resource.BeforeOPDPDF)}"/>
@@ -14,18 +14,38 @@
            }
        }
        
        table {border-collapse: collapse;}
        table {border-collapse: collapse;border: 0px;}
        
        th {text-align: center;}
        th.border-thick-title { border-width: 1pt 0pt 1pt 0pt; border-style: solid; border-color: black; text-align: center;}
        td.middle {text-align: center;}
        td.topClear {border-top-color: white;}
        /* 20220221 PI改造 by 徐亮 start */
        body{margin: 0 auto;
        width: 780px;}
        #title1{height: 30px;}
        #title2{height: 80px;}
        .dianjian td{border: 1px #000 solid}
        /* 20220221 PI改造 by 徐亮 end */
        </style>
         <!-- 20220221 PI改造 by 徐亮 start  -->
         <apex:includeScript value="{! URLFOR($Resource.AWSService, 'AWSService.js') }" />
         <script src="../../soap/ajax/53.0/connection.js" type="text/javascript"></script>
         <apex:stylesheet value="{!URLFOR($Resource.blockUIcss)}"/>
         <apex:includeScript value="{!URLFOR($Resource.jquery183minjs)}"/>
         <apex:includeScript value="{!URLFOR($Resource.PleaseWaitDialog)}"/>
         <apex:includeScript value="{!URLFOR($Resource.jspdf)}"/>
         <apex:includeScript value="{!URLFOR($Resource.html2canvas)}"/>
         <!-- 20220221 PI改造 by 徐亮 end  -->
        <script>
        </script>
    </head>
    
    <body style="font-family: Arial Unicode MS;">
        <div id="pdf-wrapper">
            <div id="title1"></div>
        <table border="0" style="width:100%;">
            <tr>
                <!-- update by rentx 20210707 start -->
@@ -52,7 +72,7 @@
                    <td>点检人</td>
                </tr>
                <tr>
                    <td width="70%">院方负责人 &nbsp;&nbsp;&nbsp;&nbsp;{!ir.Responsible_Person__c}</td>
                    <td width="70%">院方负责人 &nbsp;&nbsp;&nbsp;&nbsp;<span id="Responsible_Person__c">{!ir.Responsible_Person__c}</span></td>
                    <td width="15%"><apex:outputField value="{!ir.Inspection_Date__c}" /></td>
                    <td width="15%">{!usr.Alias__c}</td>
                </tr>
@@ -72,7 +92,7 @@
                    <td> 本次点检对象数 &nbsp;&nbsp;&nbsp;&nbsp; {!ir.Inspection_asset_number__c}</td>
                </tr>
                <tr>
                    <td width="70%"> 院方负责人 &nbsp;&nbsp;&nbsp;&nbsp;{!ir.Responsible_Person__c}</td>
                    <td width="70%"> 院方负责人 &nbsp;&nbsp;&nbsp;&nbsp;<span id="Responsible_Person__c">{!ir.Responsible_Person__c}</span></td>
                    <td > 本次点检日期 &nbsp;&nbsp;&nbsp;&nbsp; <apex:outputField value="{!ir.Inspection_Date__c}" /></td>
                </tr>
                <tr>
@@ -82,7 +102,7 @@
            </apex:outputText>
        </table>
        <br/>
        <table border="1" style="width:100%;">
        <table class="dianjian" border="0" style="width:100%;border-collapse: collapse;border: 0px;">
            <!-- update by rentx 20210707 start -->
            <apex:outputText rendered="{!ir.Contract__c = null}">
                <tr>
@@ -199,6 +219,101 @@
        <table border="0" width="100%">
            <tr><td style="text-align: right"><apex:image value="{!ir.SignUrl__c}" width="300px" height="150px" rendered="{!NOT(ISBLANK(ir.SignUrl__c))}" /></td></tr>
        </table>
    </div>
    </body>
    <!-- 20220221 PI改造 by 徐亮 start  -->
<script>
    AWSService.sfSessionId = '{!GETSESSIONID()}';
    var staticResources = JSON.parse('{!staticResource}');
    function Fun(pdf){
        var iframe = document.createElement('iframe');
        iframe.setAttribute('style', 'position:absolute;right:0; top:0; bottom:0; height:100%; width:100%');
        document.body.appendChild(iframe);
        iframe.src = pdf.output('datauristring');
        for(let e of document.body.childNodes){
            if( e != iframe && e.style){
                e.style.display = 'none';
            }
        }
    }
    let id = "pdf-wrapper";
    var target = document.getElementById(id);
    function jsPdfDownload(){
        let pdfName = "测试";
        let id = "pdf-wrapper";
        var target = document.getElementById(id);
        target.style.background = "#FFFFFF";
        if(pdfName==''||pdfName==undefined) pdfName= getNowFormatDate();
        html2canvas(target, {
            scale: 2,
            onrendered:function(canvas) {
                let landscape = true;
                let pw = 595.28;
                let ph = 841.89;
                const marginw = 40;
                let orientation = '';
                if (landscape) {
                    let temp =ph;
                    ph = pw;
                    pw = temp;
                    orientation = 'l';
                }
                var contentWidth = canvas.width;
                var contentHeight = canvas.height;
                //一页pdf显示html页面生成的canvas高度;
                var pageHeight = contentWidth / pw * ph;
                //未生成pdf的html页面高度
                var leftHeight = contentHeight;
                //页面偏移
                var position = 0;
                //a4纸的尺寸[595.28,841.89],html页面生成的canvas在pdf中图片的宽高
                var imgWidth = pw-2*marginw;//595.28//左右边距20
                var imgHeight = imgWidth/contentWidth * contentHeight;//左右边距20
                var pageData = canvas.toDataURL('image/jpeg', 1.0);
                var pdf = new jsPDF(orientation, 'pt', 'a4');// 第一个参数填字母l,注意不是数字1,为横向pdf
                //有两个高度需要区分,一个是html页面的实际高度,和生成pdf的页面高度(841.89)
                //当内容未超过pdf一页显示的范围,无需分页
                if (leftHeight < pageHeight) {
                    pdf.addImage(pageData, 'JPEG', marginw, 0, imgWidth, imgHeight );//左右边距20
                } else {
                    while(leftHeight > 0) {
                        pdf.addImage(pageData, 'JPEG', marginw, position, imgWidth, imgHeight)//左右边距20
                        leftHeight -= pageHeight;
                        position -= ph;
                        //避免添加空白页
                        if(leftHeight > 0) {
                            pdf.addPage();
                        }
                    }
                }
                Fun(pdf);
            }
        })
    }
    blockme();
    document.body.onload = function(){
        AWSService.query(staticResources.queryUrl, '{!ir.AWS_Data_Id__c}', function(data){
            unblockUI();
            document.getElementById("Responsible_Person__c").innerHTML = data.object.responsiblePerson;
            setTimeout(() => {
                jsPdfDownload();
            }, 1500);
        }, staticResources.token);
    }
</script>
<!-- 20220221 PI改造 by 徐亮 end  -->
</html>
</apex:page>
force-app/main/default/pages/InstructReport.page
@@ -6,14 +6,82 @@
    <apex:includeScript value="/soap/ajax/29.0/connection.js"/>
    <apex:includeScript value="/soap/ajax/29.0/apex.js"/>
    <!-- <apex:includeScript value="{!URLFOR($Resource.OpportunityPCLJs)}"/> -->
    <!-- 20220222 PI改造 by Bright--start -->
    <apex:includeScript value="{! URLFOR($Resource.AWSService, 'AWSService.js') }" />
    <script src="../../soap/ajax/53.0/connection.js" type="text/javascript"></script>
    <!-- 20220222 PI改造 by Bright--end -->
    <style type="text/css">
        [aws-api] {
            position: relative;
        }
        [aws-api] .decrypt{position: absolute;top: 0;left: 100%;display: none;text-align: left;
            padding-left: 5px;}
        [aws-api]:hover .decrypt{display: block;width: 100px}
    </style>
    <script type="text/javascript">
        function init() {
             
        function init() {
        }
        // 20220222 PI改造 by Bright--start
        AWSService.sfSessionId = '{!GETSESSIONID()}';
        var staticResource = JSON.parse('{!staticResource}');
        var aws_data = {};
        function Decrypt(dataIds){
            let Foo = function(){
                for (const id of dataIds) {
                    if (aws_data.hasOwnProperty(id)) {
                        let d = aws_data[id];
                        let $e =j$("[aws-id='"+d.dataId+ "']");
                        $e.find(".decrypt").html(d[$e.attr("aws-api")]);
                    }
                }
            }
            let ids = [];
            for (const id of dataIds) {
                if (!aws_data.hasOwnProperty(id)) {
                    ids.push(id);
                }
            }
            if (ids.length > 0) {
                blockme();
                AWSService.search(staticResource.searchUrl,JSON.stringify({
                    "dataIds":ids
                }),function(data){
                    unblockUI();
                    if(data.object && data.object.length > 0){
                        for(let d of data.object){
                            if(d.dataId){
                                aws_data[d.dataId] = d;
                            }
                        }
                        Foo();
                    }
                },staticResource.token);
            }else{
                Foo();
            }
        }
        function DecryptAll(){
            let dataIds = [];
            j$("[aws-id]").each((i,e)=>{
                let v = j$(e).attr('aws-id');
                if (v) {
                    dataIds.push(v);
                }
            });
            Decrypt(dataIds);
        }
        j$(function(){
            DecryptAll();
        })
        // 20220222 PI改造 by Bright--end
        function checkAll(checker) {
             var cnt = j$(escapeVfId('allPage:allForm:allBlock:'+checker.alt+':memberCnt')).val();
             for (var i = 0; i < cnt; i++) {
@@ -110,7 +178,12 @@
                        </apex:column>
                        <!-- 被带教人 -->
                        <apex:column style="width: 2%">
                        <apex:outputLink style="resize:vertical;width: 95%" id="Name" value="/{!checkedIS.CamMem.Contact_ID__c}" target="LINK_{!checkedIS.CamMem.Contact_ID__c}"><apex:outputField value="{!checkedIS.IS.Name}" /></apex:outputLink>
                        <apex:outputLink html-aws-api="lastName" html-aws-id="{!checkedIS.IS.ContactID__r.AWS_Data_Id__c}" style="resize:vertical;width: 95%" id="Name" value="/{!checkedIS.CamMem.Contact_ID__c}" target="LINK_{!checkedIS.CamMem.Contact_ID__c}">
                            <!-- 20220222 PI改造 by Bright--start -->
                            <span class="encrypt">{!checkedIS.IS.Name}</span>
                            <span class="decrypt"></span>
                            <!-- 20220222 PI改造 by Bright--end -->
                        </apex:outputLink>
                        </apex:column>
                        <!-- 客户名 -->
                        <!-- 增加无效科室红色提醒 精琢技术 wql 2021/02/04 start -->
@@ -203,7 +276,7 @@
                <table style="width:100%;">
                    <tr>
                        <td>
                            <apex:commandButton value="刷新选中的参会人员"  action="{!exchangeInstructedstaff}" onclick="blockme();" oncomplete="unblockUI();" rerender="allPage:allForm:allBlock:InstructedStaff,allPage:allForm:allBlock:Campaign_members" />
                            <apex:commandButton value="刷新选中的参会人员"  action="{!exchangeInstructedstaff}" onclick="blockme();" oncomplete="unblockUI();DecryptAll();" rerender="allPage:allForm:allBlock:InstructedStaff,allPage:allForm:allBlock:Campaign_members" />
                        </td>
                    </tr>
                </table>
@@ -237,7 +310,12 @@
                        </apex:column>
                        <apex:column style="width: 10%">
                        <!-- LJPH-BVNBMM 显示当前联系人名称- start -->
                        <apex:outputLink style="resize:vertical;width: 95%" id="Name" value="/{!uncheckedIS.CamMem.Contact_ID__c}" target="LINK_{!uncheckedIS.CamMem.Contact_ID__c}"><apex:outputtext value="{!uncheckedIS.CamMem.ContactName__c}" /></apex:outputLink>
                        <apex:outputLink html-aws-api="lastName" html-aws-id="{!uncheckedIS.CamMem.Contact_ID__r.AWS_Data_Id__c}" style="resize:vertical;width: 95%" id="Name" value="/{!uncheckedIS.CamMem.Contact_ID__c}" target="LINK_{!uncheckedIS.CamMem.Contact_ID__c}">
                        <!-- 20220222 PI改造 by Bright--start -->
                        <span class="encrypt">{!uncheckedIS.CamMem.ContactName__c}</span>
                        <span class="decrypt"></span>
                        <!-- 20220222 PI改造 by Bright--end -->
                        </apex:outputLink>
                        </apex:column>
                        <!-- LJPH-BVNBMM end -->
                        <apex:column style="width: 10%">
force-app/main/default/pages/LeadIntention.page
@@ -1,31 +1,42 @@
<apex:page controller="LeadIntentionController" showHeader="false" sidebar="false" id="allPage" action="{!init}">
<head>
<title>会议询问单确认一览表</title>
        <!-- 2022/02/15 张华建 dependency start -->
<apex:stylesheet value="{!URLFOR($Resource.blockUIcss)}"/>
        <apex:includeScript value="{! URLFOR($Resource.AWSService, 'AWSService.js') }" />
<apex:includeScript value="{!URLFOR($Resource.jquery183minjs)}"/>
<apex:includeScript value="{!URLFOR($Resource.PleaseWaitDialog)}"/>
<apex:includeScript value="{!URLFOR($Resource.OpportunityPCLJs)}"/>
        <!-- 2022/02/15 张华建 dependency end -->
<style>
    td .dateFormat  {
        display: none;
    }
    
    div.inline { float:left; }
    .clearBoth { clear:both; }
            div.inline {
                float: left;
            }
            .clearBoth {
                clear: both;
            }
div#out_Div {
  position:relative;
  overflow: hidden;
  float:left;
  width: 100px;
}
div#out_Div_L {
  position:relative;
  overflow: hidden;
  float:left;
  width: 1050px;
}
div#in_Div {
  position:relative;
  overflow: auto;
@@ -33,6 +44,7 @@
  width: 100px;
  height: 100px;
}
div#in_Div_L {
  position:relative;
  overflow: hidden;
@@ -42,100 +54,343 @@
}
body .pbBody table.list tr.headerRow td {
  text-align:center;font-weight:normal;
                text-align: center;
                font-weight: normal;
  padding:0px 0px 0px 1px;
}
body .pbBody table.list tr.headerRow td.header1 {
  text-align:center;font-weight:normal;
                text-align: center;
                font-weight: normal;
  padding:0px 0px 0px 0px;
}
body .pbBody table.list tr.dataRow td {padding:0px 0px 0px 1px; border-width: 0px 0px 1px 0px; vertical-align: middle; word-break:break-all;}
            body .pbBody table.list tr.dataRow td {
                padding: 0px 0px 0px 1px;
                border-width: 0px 0px 1px 0px;
                vertical-align: middle;
                word-break: break-all;
            }
body .pbBody table.list tr.dataRow td.dataCellBorder  {
  /* いらない、使っていない */
  padding:0px 0px 0px 1px; border-width: 0px 0px 1px 0px; vertical-align: middle; word-break:break-all;
                padding: 0px 0px 0px 1px;
                border-width: 0px 0px 1px 0px;
                vertical-align: middle;
                word-break: break-all;
}
body .pbBody table.list tr.dataRow td.dataCellBorder1 {
  padding:0px 0px 0px 1px;
  border-width: 0px 0px 1px 1px; vertical-align: middle; word-break:break-all;
                border-width: 0px 0px 1px 1px;
                vertical-align: middle;
                word-break: break-all;
}
@-moz-document url-prefix() {
body .pbBody table.list tr.dataRow td.dataCellBorder1 {padding:0px 0px 0px 0px; border-width: 0px 0px 1px 1px; vertical-align: middle; word-break:break-all;}
                body .pbBody table.list tr.dataRow td.dataCellBorder1 {
                    padding: 0px 0px 0px 0px;
                    border-width: 0px 0px 1px 1px;
                    vertical-align: middle;
                    word-break: break-all;
}
table.list .col_Contract_NO {width:57px;}
table.list .checkbox {width:30px;text-align:center;}
            }
            table.list .col_Contract_NO {
                width: 57px;
            }
            table.list .checkbox {
                width: 30px;
                text-align: center;
            }
table.list .col_HP_NAME {
width:120px;
}
table.list .col_PCL_NAME {width:80px;}
table.list .col_Agency1 {width:87px;}
table.list .col_SalesDepartment {width:85px;}
table.list .col_Province {width:20px;}
table.list .col_Group {width:65px;}
table.list .col_SalesIncharge {width:80px;}
table.list .col_OrderNo {width:80px;}
table.list .col_Status_1 {width:50px;}
table.list .col_Status_2 {width:80px;}
table.list .col_BookStock {width:50px;}
table.list .col_OCM {width:80px;}
            table.list .col_PCL_NAME {
                width: 80px;
            }
            table.list .col_Agency1 {
                width: 87px;
            }
            table.list .col_SalesDepartment {
                width: 85px;
            }
            table.list .col_Province {
                width: 20px;
            }
            table.list .col_Group {
                width: 65px;
            }
            table.list .col_SalesIncharge {
                width: 80px;
            }
            table.list .col_OrderNo {
                width: 80px;
            }
            table.list .col_Status_1 {
                width: 50px;
            }
            table.list .col_Status_2 {
                width: 80px;
            }
            table.list .col_BookStock {
                width: 50px;
            }
            table.list .col_OCM {
                width: 80px;
            }
table.list .col_DEPT {
/*width:auto;*/
width:230px;
}
table.list .col_Earch {
/*width:auto;*/
width:200px;
}
table.list .col_OpportunityCategory {width:50px;}
table.list .col_QuotationCode {width:80px;}
table.list .col_NOT_PaymentAmount {width:160px;text-align:right;}
table.list .col_UnshippedAmount_wt {width:100px;text-align:left;}
table.list .col_UnshippedAmount_bingo {width:216px;text-align:right;}
table.list .col_UnshippedAmount_bingo1 {width:216px;text-align:center;}
table.list .col_X5weeksAgo {width:80px;}
table.list .col_X4weeksAgo {width:80px;}
table.list .col_X3weeksAgo {width:80px;}
table.list .col_X2weeksAgo {width:80px;}
table.list .col_X1weeksAgo {width:80px;}
table.list .col_CurrentStatus {width:87px;}
table.list .col_OverviewStatus {width:80px;}
table.list .col_EndUserContract {width:100px;}
table.list .col_PaymentStatus {width:80px;}
table.list .col_AssignmentStatus {width:80px;}
table.list .col_DeliveryStatus {width:80px;}
table.list .col_PacialShipment {width:50px;}
table.list .col_SoLatestDeliveryDate {width:80px;}
table.list .col_FirstDeliveryDate {width:80px;}
table.list .col_CurrentShippingDate {width:80px;}
table.list .col_EndUserContractSubmitDay {width:80px;}
table.list .col_PaymentScheduledDate {width:80px;}
table.list .col_PaymentAllScheduledDate {width:80px;}
table.list .col_ShippingScheduledDate {width:80px;}
table.list .col_MonthlyForecast {width:105px;}
table.list .col_ForecastShipMonthlyMannual {width:75px;}
table.list .col_FollowUpComment {width:100px;}
table.list .col_FollowUpComment1 {width:100px;}
table.list .col_ReasonNotCollectMoney {width:200px;}
table.list .col_ReasonNotShip {width:200px;}
table.list .col_ManagerFeedback {width:200px;}
table.list .col_CreateActivity {width:80px;}
table.list .col_CreateTask {width:80px;}
table.list .col_Key_tipics {width:72px;}
table.list .col_Update_situation {width:72px;}
table.list .col_FirstApproveDate {width:72px;}
            table.list .col_OpportunityCategory {
                width: 50px;
            }
            table.list .col_QuotationCode {
                width: 80px;
            }
            table.list .col_NOT_PaymentAmount {
                width: 160px;
                text-align: right;
            }
            table.list .col_UnshippedAmount_wt {
                width: 100px;
                text-align: left;
            }
            table.list .col_UnshippedAmount_bingo {
                width: 216px;
                text-align: right;
            }
            table.list .col_UnshippedAmount_bingo1 {
                width: 216px;
                text-align: center;
            }
            table.list .col_X5weeksAgo {
                width: 80px;
            }
            table.list .col_X4weeksAgo {
                width: 80px;
            }
            table.list .col_X3weeksAgo {
                width: 80px;
            }
            table.list .col_X2weeksAgo {
                width: 80px;
            }
            table.list .col_X1weeksAgo {
                width: 80px;
            }
            table.list .col_CurrentStatus {
                width: 87px;
            }
            table.list .col_OverviewStatus {
                width: 80px;
            }
            table.list .col_EndUserContract {
                width: 100px;
            }
            table.list .col_PaymentStatus {
                width: 80px;
            }
            table.list .col_AssignmentStatus {
                width: 80px;
            }
            table.list .col_DeliveryStatus {
                width: 80px;
            }
            table.list .col_PacialShipment {
                width: 50px;
            }
            table.list .col_SoLatestDeliveryDate {
                width: 80px;
            }
            table.list .col_FirstDeliveryDate {
                width: 80px;
            }
            table.list .col_CurrentShippingDate {
                width: 80px;
            }
            table.list .col_EndUserContractSubmitDay {
                width: 80px;
            }
            table.list .col_PaymentScheduledDate {
                width: 80px;
            }
            table.list .col_PaymentAllScheduledDate {
                width: 80px;
            }
            table.list .col_ShippingScheduledDate {
                width: 80px;
            }
            table.list .col_MonthlyForecast {
                width: 105px;
            }
            table.list .col_ForecastShipMonthlyMannual {
                width: 75px;
            }
            table.list .col_FollowUpComment {
                width: 100px;
            }
            table.list .col_FollowUpComment1 {
                width: 100px;
            }
            table.list .col_ReasonNotCollectMoney {
                width: 200px;
            }
            table.list .col_ReasonNotShip {
                width: 200px;
            }
            table.list .col_ManagerFeedback {
                width: 200px;
            }
            table.list .col_CreateActivity {
                width: 80px;
            }
            table.list .col_CreateTask {
                width: 80px;
            }
            table.list .col_Key_tipics {
                width: 72px;
            }
            table.list .col_Update_situation {
                width: 72px;
            }
            table.list .col_FirstApproveDate {
                width: 72px;
            }
body .pbBody table.list tr.headerRow td.colViewing {
  background-image:url('{!URLFOR($Resource.IconResizeMinus_5)}') ;
  background-repeat:no-repeat;
}
body .pbBody table.list tr.headerRow td.colUnHideIcon {
  background-image:url('{!URLFOR($Resource.IconResizePlus_5)}');
  background-repeat:no-repeat;
  width:7px;
}
body .pbBody table.list tr.headerRow td.col_Scroll {width:0px; padding:0px; border-width:0px;}
body .pbBody table.list tr.dataRow td.col_Scroll {width:0px; padding:0px; border-width:0px;}
            body .pbBody table.list tr.headerRow td.col_Scroll {
                width: 0px;
                padding: 0px;
                border-width: 0px;
            }
            body .pbBody table.list tr.dataRow td.col_Scroll {
                width: 0px;
                padding: 0px;
                border-width: 0px;
            }
</style>
<script type="text/javascript">
            //2022 02 25 张华建 display PI Data start
            var staticResource = JSON.parse('{!staticResource}');
            var awsDataIds = JSON.parse('{!awsDataIds}');
            var contact = {};
            queryPIData();
            function queryPIData(){
                blockme();
                let searchCallBack = function searchCallBack(result){
                    console.log('result = ' + JSON.stringify(result))
                    let contacts = result.object;
                    if(contacts == null){
                        return;
                    }
                    let temp = {}
                    temp.email = contacts.email;
                    temp.phone = contacts.phone;
                    if(contacts.lastName!=null){
                        temp.lastName = contacts.lastName;
                    }else{
                        temp.lastName = '';
                    }
                    contact[contacts.dataId] = temp;
                };
                for(var i = 0;i < awsDataIds.length;i++){
                    AWSService.query(staticResource.queryUrl,awsDataIds[i],searchCallBack,staticResource.token);
                }
                unblockUI();
            }
            function showPIDiv(awsDataId){
                console.log('awsDataId Value:'+awsDataId);
                let parentNode = document.getElementById(awsDataId);
                let createDiv = document.createElement("div");
                createDiv.id = awsDataId+"_PI";
                let piInformation = 'eamil:'+contact[awsDataId].email +'\n' +'Phone:'+contact[awsDataId].phone+'\n' +'Name:'+contact[awsDataId].lastName
                //let piInformation = 'Name:'+contact['943114607025717249'].lastName +'\n' +'Phone:'+contact['943114607025717249'].phone
                createDiv.innerText = piInformation;
                let x=window.event.x;
                let y=window.event.y;
                createDiv.style.left=x;
                createDiv.style.top=y;
                createDiv.style.background="#dddddd";
                createDiv.style.position = "absolute";
                parentNode.appendChild(createDiv);
            }
            function hidePIDiv(awsDataId){
                document.getElementById(awsDataId+'_PI').remove();
            }
            //2022 02 25 张华建 display PI Data end
var heightAjustment = 120;
var widthAjustment = 30;
@@ -193,12 +448,19 @@
                </table>
                <table style="border-bottom-width: 0px; font-size:12px;">
                    <tr>
                        <td width="250px">科室&nbsp;<apex:inputText value="{!accSearch}" style="width:150px"/> </td>
                        <td width="250px">科室&nbsp;
                            <apex:inputText value="{!accSearch}" style="width:150px" /> </td>
                        <td width="75px">询问单名称&nbsp;&nbsp;&nbsp;&nbsp;</td>
                        <td width="150px"><span><apex:inputText value="{!ownerSearch}" style="width:100px;" /></span></td>
                        <td width="150px">
                            <span>
                                <apex:inputText value="{!ownerSearch}" style="width:100px;" />
                            </span>
                        </td>
                        <td width="10px"></td>
                        <td width="10px"></td>
                        <td>显示 <apex:selectList id="limitNo" value="{!limits}" size="1" onchange="searchOppJs();return false;"><apex:selectOptions value="{!limitOpts}"/></apex:selectList> 条数据</td>
                        <td>显示
                            <apex:selectList id="limitNo" value="{!limits}" size="1" onchange="searchOppJs();return false;">
                                <apex:selectOptions value="{!limitOpts}" /></apex:selectList> 条数据</td>
                        <td width="10px"></td>
                        <!-- 先隐藏批量功能 -->
                        <!-- <td>原因选项 &nbsp;<apex:selectList id="reasons" value="{!reasons}" size="1" onclick="setCheckValue();" ><apex:selectOptions value="{!reasonOpts}" /></apex:selectList> </td>
@@ -212,23 +474,29 @@
                    <tr>
                        <td width="400px">
                            <font>数据字段</font>&nbsp;
                            <apex:selectList value="{!text}" size="1" style="width:110px"><apex:selectOptions value="{!textOpts}"/></apex:selectList> 
                            &nbsp;<apex:selectList value="{!condition}" size="1"><apex:selectOptions value="{!equalOpts}"/></apex:selectList> 
                            &nbsp;<apex:inputText value="{!value}" style="width:100px"/>
                            <apex:selectList value="{!text}" size="1" style="width:110px">
                                <apex:selectOptions value="{!textOpts}" /></apex:selectList>  &nbsp;
                            <apex:selectList value="{!condition}" size="1">
                                <apex:selectOptions value="{!equalOpts}" /></apex:selectList>  &nbsp;
                            <apex:inputText value="{!value}" style="width:100px" />
                        </td>
                        <td width="10px"></td>
                        <td width="400px">
                            <font>AND&nbsp;</font>&nbsp;
                            <apex:selectList value="{!text2}" size="1" style="width:110px"><apex:selectOptions value="{!textOpts2}"/></apex:selectList> 
                            &nbsp;<apex:selectList value="{!condition2}" size="1"><apex:selectOptions value="{!equalOpts2}"/></apex:selectList> 
                            &nbsp;<apex:inputText value="{!value2}" style="width:100px"/>
                            <apex:selectList value="{!text2}" size="1" style="width:110px">
                                <apex:selectOptions value="{!textOpts2}" /></apex:selectList>  &nbsp;
                            <apex:selectList value="{!condition2}" size="1">
                                <apex:selectOptions value="{!equalOpts2}" /></apex:selectList>  &nbsp;
                            <apex:inputText value="{!value2}" style="width:100px" />
                        </td>
                        <td width="10px"></td>
                        <td width="400px">
                            <font>AND&nbsp;</font>&nbsp;
                            <apex:selectList value="{!text3}" size="1" style="width:110px"><apex:selectOptions value="{!textOpts3}"/></apex:selectList> 
                            &nbsp;<apex:selectList value="{!condition3}" size="1"><apex:selectOptions value="{!equalOpts3}"/></apex:selectList> 
                            &nbsp;<apex:inputText value="{!value3}" style="width:100px"/>
                            <apex:selectList value="{!text3}" size="1" style="width:110px">
                                <apex:selectOptions value="{!textOpts3}" /></apex:selectList>  &nbsp;
                            <apex:selectList value="{!condition3}" size="1">
                                <apex:selectOptions value="{!equalOpts3}" /></apex:selectList>  &nbsp;
                            <apex:inputText value="{!value3}" style="width:100px" />
                        </td>
                        <td></td>
                    </tr>
@@ -312,12 +580,15 @@
                        <table class="list" style="border-bottom-width: 0px; font-size:11px; border-spacing:0;" border="" id="tableData_L">
                            <apex:variable value="{!1}" var="cnt" />
                            <apex:repeat value="{!pclInfos}" var="or" id="oppTable_L">
                                <tr class="dataRow {!IF(MOD(cnt, 2)==0, 'odd', 'even')} {!IF(cnt==1, 'first', '')}" onmouseover="if (window.hiOn){hiOn(this);} " onmouseout="if (window.hiOff){hiOff(this);} " onblur="if (window.hiOff){hiOff(this);}" onfocus="if (window.hiOn){hiOn(this);}">
                                <tr class="dataRow {!IF(MOD(cnt, 2)==0, 'odd', 'even')} {!IF(cnt==1, 'first', '')}" onmouseover="if (window.hiOn){hiOn(this);} "
                                    onmouseout="if (window.hiOff){hiOff(this);} " onblur="if (window.hiOff){hiOff(this);}" onfocus="if (window.hiOn){hiOn(this);}">
                                <td class="dataCellBorder1 checkbox">
                                   <input type="checkbox" id="{!or.chk}" onchange="editCheckBox();"/>
                                </td>
                                    <td class="dataCellBorder1 col_Contract_NO">
                                         <a href="https://ocsm.my.salesforce.com//{!or.rec.Id}"><apex:outputField id="Name" value="{!or.rec.Name}" /></a>
                                    <td class="dataCellBorder1 col_Contract_NO" id="{!or.rec.AWS_Data_Id__c}" onmouseover="showPIDiv('{!or.rec.AWS_Data_Id__c}')" onmouseout="hidePIDiv('{!or.rec.AWS_Data_Id__c}')">
                                        <a href="https://ocsm.my.salesforce.com//{!or.rec.Id}">
                                            <apex:outputField id="Name" value="{!or.rec.Name}" />
                                        </a>
                                         <apex:inputHidden id="Id" value="{!or.rec.Id}"/>
                                         <apex:inputHidden id="Hospital_Name__c" value="{!or.rec.Hospital_Name__r.Name}"/>
                                        <apex:inputHidden id="Hospital_ID__c" value="{!or.rec.Hospital_ID__c}"/>
@@ -347,11 +618,13 @@
                                    <apex:commandButton value="需要" style="width: 40px;" onclick="openEdit('{!or.lineNo}');return false;" />
                                    </span>
                                    <span>
                                    <apex:commandButton value="不需要" style="width: 50px;" onclick="updateStatus('{!or.rec.Id}','{!or.lineNo}');return false;" />
                                            <apex:commandButton value="不需要" style="width: 50px;" onclick="updateStatus('{!or.rec.Id}','{!or.lineNo}');return false;"
                                            />
                                    </span>
                                    <span>
                                 
                                    <apex:inputField id="Reasons_options__c"  value="{!or.rec.Reasons_options__c}" style="width: 90px;" onchange="setreasonFlg('{!or.lineNo}')" />
                                            <apex:inputField id="Reasons_options__c" value="{!or.rec.Reasons_options__c}" style="width: 90px;" onchange="setreasonFlg('{!or.lineNo}')"
                                            />
                                    </span>                        
                                 
                            </td>
@@ -364,15 +637,19 @@
                        <table class="list" style="border-bottom-width: 0px; font-size:11px; border-spacing:0;width:707px;" border="" id="tableData">
                            <apex:variable value="{!1}" var="cnt" />
                            <apex:repeat value="{!pclInfos}" var="or" id="oppTable">
                                <tr class="dataRow {!IF(MOD(cnt, 2)==0, 'odd', 'even')} {!IF(cnt==1, 'first', '')}" onmouseover="if (window.hiOn){hiOn(this);} " onmouseout="if (window.hiOff){hiOff(this);} " onblur="if (window.hiOff){hiOff(this);}" onfocus="if (window.hiOn){hiOn(this);}">
                                <tr class="dataRow {!IF(MOD(cnt, 2)==0, 'odd', 'even')} {!IF(cnt==1, 'first', '')}" onmouseover="if (window.hiOn){hiOn(this);} "
                                    onmouseout="if (window.hiOff){hiOff(this);} " onblur="if (window.hiOff){hiOff(this);}" onfocus="if (window.hiOn){hiOn(this);}">
                                    
                                    <td class="dataCellBorder1 col_NOT_PaymentAmount">
                                        <apex:outputField id="Campaign__c" value="{!or.rec.Campaign__c}" style="width:90%;"/>
                                        <apex:inputHidden id="Campaign_ID__c" value="{!or.rec.Campaign_ID__c}"/>
                                    </td>
                                    <!-- <td class="dataCellBorder1 col_Name">
                                        <apex:outputField id="Name" value="{!or.rec.Name}" style="width:90%;"/>
                                    </td> -->
                                    <td class="dataCellBorder1 col_DeliveryStatus">
                                        <apex:outputField id="Family_Name__c" value="{!or.rec.Family_Name__c}"/>
                                        <!-- <apex:outputField id="Family_Name__c" value="{!or.rec.Family_Name__c}" /> -->
                                        <apex:outputField id="Last_Name__c" value="{!or.rec.Last_Name__c}"/>
                                    </td>
                                    <!-- <td class="dataCellBorder1 col_DeliveryStatus">
force-app/main/default/pages/NewAndEditLead.page
@@ -1,49 +1,55 @@
<apex:page standardController="Lead" extensions="NewAndEditLeadController">
<apex:page standardController="Lead" extensions="NewAndEditLeadController" id="page">
    <apex:stylesheet value="{!URLFOR($Resource.blockUIcss)}"/>
    <apex:includeScript value="{! URLFOR($Resource.AWSService, 'AWSService.js') }" />
    <apex:includeScript value="{!URLFOR($Resource.jquery183minjs)}"/>
    <apex:includeScript value="{!URLFOR($Resource.PleaseWaitDialog)}"/>
    <script src="../../soap/ajax/53.0/connection.js" type="text/javascript"></script>
    <script>
        var TestToken = 'eyJhbGciOiJIUzUxMiJ9.eyJjcmVhdGVkIjoxNjQzMDk5NDgyNjA2LCJhcHBpZCI6IjZMeml6Y1JmN2g4eUx4MjgiLCJleHAiOjE2NDM3MDQyODJ9.V_94zxiDwEa1jZpOphw9W4QfjmqqKQcjCZ4z31KsDe7SjCF9sxKSKiZe6rp8ML6-namlVSyzqpTeZQ6NJi88Og';
        var AWSAppId = '6LzizcRf7h8yLx28';
        var AWSAppSecret = 'UkLohQcHNjg164SdRc7gnS4rgu4d7FjINM3mtzRbyTS6IrUP5V';
        var NewLeadURL = 'https://52.83.101.205/api/lead/insert';
        var UpdateLeadURL = '';
        var QueryLeadURL = 'https://52.83.101.205/api/lead/query';
        var TransactionURL = "https://52.83.101.205/api/tx/confirm";
        var VLookUpFields = new Set(['Hospital_Name__c', 'Department_Class__c', 'Contact_Name__c', 'Campaign__c']);
        var LeadIdPage = "https://ocsm--stagefull--c.visualforce.com/apex/NewAndEditLead?RecordType=01210000000QiRa";
        // function ProcessPI(payloadForNewPI) {
        //     let TokenURL = "https://52.83.101.205/api/token/getToken?app_id=" + AWSAppId + "&app_secret=" + AWSAppSecret;
        //     console.log('Get Token Process');
        //     fetch(TokenURL, {
        //         method: 'GET',
        //         mode: 'no-cors',
        //         headers: {
        //             'Content-Type': 'application/json'
        //         }
        //     }).then((data) => {
        //         console.log(data.text())
        //         return data.text()
        //     }).then((awsToken) => {
        //         if({!isNewMode}){
        //             NewPIToAWS(awsToken, payloadForNewPI)
        //         }else{
        //             UpdatePIToAWS(awsToken, payloadForNewPI)
        //         }
        //     });
        // }
        function loadAWSAuthentication() {
            console.log('Get Sesion Session');
            sforce.connection.sessionId = '{!GETSESSIONID()}';
            let awsConfiguration = "SELECT App_Id__c,App_Secret__c,New_Lead_URL__c FROM AWS_Integration_Info__mdt  WHERE DeveloperName = 'AWS_Integration_Configuration'";
            let awsConfigurationResult = sforce.connection.query(awsConfiguration);
            let recordsAWSConfiguration = awsConfigurationResult.getArray("records");
            if (recordsAWSConfiguration && recordsAWSConfiguration.length > 0) {
                recordAWSConfiguration = recordsAWSConfiguration[0];
                AWSAppId = recordAWSConfiguration.App_Id__c;
                AWSAppSecret = recordAWSConfiguration.App_Secret__c;
                NewLeadURL = recordAWSConfiguration.New_Lead_URL__c;
    <style>
        .disabledbutton {
            pointer-events: none;
            opacity: 0.4;
            }
            console.log('AWS Configuration:' + AWSAppId + '----- APP Secret:' + AWSAppSecret);
    </style>
    <script>
        AWSService.sfSessionId = '{!GETSESSIONID()}';
        var staticResources = JSON.parse('{!staticResource}');
        var staticResourcesContact = JSON.parse('{!staticResourceContact}');
        var requiredFieldAPIList = JSON.parse('{!requiredFieldAPIListStr}');
        var fieldAPIToLabelMap = JSON.parse('{!fieldAPIToLabelMapStr}');
        var redirectMode = 'Save';//1. Save 2. SaveAndNew
        var requiredAPIToChangedLabelMap = new Map();
        requiredAPIToChangedLabelMap.set('LastName', '{!PIPL_Name_Label}');
        console.log('{!contactsInfo}');
        var VLookUpFields = new Set(['Hospital_Name__c', 'Department_Class__c', 'Contact_Name__c', 'Campaign__c']);
        function ProcessPI(leadJson, payloadForNewPI) {
            blockme();
            if ({!isNewMode}) {
            NewPIToAWS(leadJson, payloadForNewPI)
        }else {
            UpdatePIToAWS(leadJson, payloadForNewPI)
        }
        }
        function enableButton(obj) {
            obj.classList.remove("btnDisabled");
        }
        function disableButton(obj) {
            obj.classList.add("btnDisabled");
        }
        function disableButtonStatus() {
            let btnList = document.getElementsByClassName('btn');
            for (let i = 0; i < btnList.length; i++) {
                disableButton(btnList[i]);
            }
        }
        function enableButtonStatus() {
            let btnList = document.getElementsByClassName('btn');
            for (let i = 0; i < btnList.length; i++) {
                enableButton(btnList[i]);
            }
        }
        function getPIPayload(leadJson) {
@@ -63,44 +69,40 @@
        }
        function validateFieldValueFormate() {
            let error_msg = '';
            let textEmail = "[data-id='Email']";
            let textPhone = "[data-id='Phone']";
            //Email
            let email = document.querySelector(textEmail).value;
            let phone = document.querySelector(textPhone).value;
            let email = document.querySelector(textEmail);
            if(email.value!='' && !/^[a-zA-Z0-9_.-]+@[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]+)*\.[a-zA-Z0-9]{2,6}$/.test(email.value)){
                error_msg += ';邮件格式错误';
            }
            let phone = document.querySelector(textPhone);
            let regEmail = /^[\w-]{3,12}@[\da-zA-Z]{2,6}\.[a-zA-Z]+$/;
            let regPhone = /^1[3|5|8|7][0-9]\d{4,8}$/;
            if(phone.value!='' && !/^1[3|5|8|7][0-9]\d{4,8}$/.test(phone.value)){
                error_msg += ';电话号码错误';
            }
            let emailFormate = regEmail.test(email);
            let phoneFormate = regPhone.test(phone);
            console.log(emailFormate);
            console.log(phoneFormate);
            email.oninput = function () {
                //email
                if (emailFormate) {
                    //phone
                    phone.oninput = function () {
                        if (phoneFormate) {
                            return true;
                        } else {
                            return false;
            for(let e of document.getElementsByTagName('select')){
                for(let op of e.options){
                    if(op.value == "*****" && op.selected){
                        error_msg += ';下拉框不能主动选择密文选项';
                        }
                    }
                } else {
                    return false;
                }
            if(error_msg.length>0 && error_msg[0]== ';'){
                error_msg = error_msg.substring(1);
            }
            return true;
            return error_msg;
        }
        function getLeadInformation() {
            let nodelist = document.querySelectorAll("[data-id]");
            let result = {}
            result.RecordTypeId = '{!rtTypeId}';
            for (let index = 0; index < nodelist.length; index++) {
                if (VLookUpFields.has(nodelist[index].getAttribute("data-id"))) {
                    console.log(nodelist[index].id.indexOf('lkwgt'));
@@ -109,220 +111,214 @@
                        let vlookUpNodeValue = document.getElementById(vlookUpNodeId).value;
                        result[nodelist[index].getAttribute("data-id")] = vlookUpNodeValue;
                    }
                } else if (nodelist[index].type == 'checkbox') {
                    result[nodelist[index].getAttribute("data-id")] = nodelist[index].checked;
                } else if (nodelist[index].type == 'select-multiple') {
                    //nodelist[index].getAttribute("data-id")
                    let multiple = nodelist[index].getAttribute("data-id");
                    let targets = document.querySelector("[data-id=" + multiple + "]").parentNode.children[1].children[0].children[1].children[2].children[0].innerText;
                    targets = targets.replace(/\n/g, ";");
                    console.log('targets = ' + targets);
                    result[nodelist[index].getAttribute("data-id")] = targets;
                } else {
                    result[nodelist[index].getAttribute("data-id")] = nodelist[index].value;
                }
                let x = index + 1;
                if (x <= nodelist.length - 1 && (nodelist[x].getAttribute("data-id") == nodelist[index].getAttribute("data-id"))) {
                    index++;
            }
            console.log(JSON.stringify(result));
            console.log('lead Number:' + result.Lead_No__c);
            let leadJson = JSON.stringify(result);
            let transId = "11111";
            let AWSDataId = "22222";
            // Visualforce.remoting.Manager.invokeAction(
            //     '{!$RemoteAction.NewAndEditLeadController.saveLead}',
            //     leadJson, transId,{!isNewMode},
            //     function (result, event) {
            //         console.log("result: " + result);
            //         window.open('/' + result.recordId, "_self");
            //     },
            //     { escape: true }
            // );
            }
            return result;
            //第二种
            // let leadJson = {};
            // let fieldApiList = '{!fieldApiListStr}'.substring(1, '{!fieldApiListStr}'.length - 1).replace(/\"/g, "").split(',');
            // for (var i in fieldApiList) {
            //     if(document.querySelector("[data-id=\"" + fieldApiList[i] + "\"]") != null){
            //         leadJson[fieldApiList[i]] = document.querySelector("[data-id=\"" + fieldApiList[i] + "\"]").value;
            //     }else{
            //         leadJson[fieldApiList[i]] = '';
            //     }
            // }
            // return leadJson;
        }
        function QueryLeadFromAWS(awsDataId) {
            fetch(QueryLeadURL + '?dataId=' + awsDataId, {
                method: 'GET',
                headers: {
                    'Content-Type': 'application/json',
                    'pi_token': TestToken
        function QueryLeadFromAWS() {
            AWSService.query(staticResources.queryUrl, '{!AWSDataId}', queryBack, staticResources.token);
                }
            }).then((data) => {
        var queryBack = function queryBack(data) {
                console.log('data = ' + data);
                document.querySelector("[data-id='LastName']").value = data.object[0].lastName;
                document.querySelector("[data-id='phone']").value = data.object[0].phone;
                document.querySelector("[data-id='email']").value = data.object[0].email;
            })
        }
        function UpdatePIToAWS(awsToken, payloadForNewPI) {
            fetch(UpdateLeadURL, {
                method: 'POST',
                body: payloadForNewPI,
                headers: {
                    'Content-Type': 'application/json',
                    //'token': awsToken
                }
            }).then((data) => { return data.json() }).then((result) => {
                let r = JSON.parse(result);
                console.log('Result from AWS' + r);
                leadJson.lastName = r.object[0].lastName;
                leadJson.phone = r.object[0].phone;
                leadJson.email = r.object[0].email;
                leadJson.Name_Encrypted__c = r.object[0].lastNameEncrypt;
                leadJson.Phone_Encrypted__c = r.object[0].phoneEncrypt;
                leadJson.Email_Encrypted__c = r.object[0].emailEncrypt;
                leadJson.AWS_Data_Id__c = '{!AWSDataId}';
                let transId = result.txId;
                let AWSDataId = r.object[0].dataId;
                // Assign the value to NonPII Data Payload
                //7. New NonPII Data To Salesforce
                Visualforce.remoting.Manager.invokeAction(
                    '{!$RemoteAction.NewAndEditLeadController.saveLead}',
                    leadJson, transId, {!isNewMode},
                function (result, event) {
                    if (event.status) {
                        if (result.stauts == 'success') {
                            //get Lead Id from sf backend
                            let leadId = result.recordId;
                            //8. Confirm Trans to AWS
                            transParameters = {
                                txId: transId,
                                isSuccess: event.status
            document.querySelector("[data-id='LastName']").value = data.object.lastName.replace(/"/g,"");
            document.querySelector("[data-id='Phone']").value = data.object.phone.replace(/"/g,"");
            document.querySelector("[data-id='Email']").value = data.object.email.replace(/"/g,"");
            unblockUI();
                            };
                            fetch(TransactionURL, {
                                method: 'POST',
                                body: JSON.stringify(transParameters),
                                headers: {
                                    'Content-Type': 'application/json',
                                    // 'token': awsToken
                                }
                            }).then((result) => {
                                if (JSON.parse(result).status == 0) {
                                    //9. Redirect to lead Id page.
                                    window.location.href = LeadIdPage;
                                    // let data = {
                                    //     transId:result.txId,
                                    //     dataId:dataId,
                                    //     status:result.status
                                    // }
                                    // return JSON.stringify(data);
                                }
                            })
                            // window.open(LeadIdPage);
                            // console.log(result);
                            // window.location.href = LeadIdPage;
                        } else {
                            //result.stauts == 'fail'
                        }
                    }
                },
                { escape: true }
            );
        }).catch (error => {
            console.log(error);
        });
        }
        function NewPIToAWS(leadJson,awsToken, payloadForNewPI) {
            console.log('Process New PI Data');
            console.log(JSON.stringify(payloadForNewPI));
            fetch(NewLeadURL, {
                method: 'POST',
                body: payloadForNewPI,
                headers: {
                    'Content-Type': 'application/json',
                    'pi_token': awsToken
                }
            }).then((data) => { console.log('data='+data);return data.json() }).then((result) => {
        var insertOrUpdateBack = function insertOrUpdateBack(payloadJson, result, isNewMode) {
                console.log(result);
                let r = result;
                console.log('Result from AWS' + r);
                console.log('leadJson='+leadJson);
                leadJson.lastName = r.object[0].lastName;
                leadJson.phone = r.object[0].phone;
                leadJson.email = r.object[0].email;
                leadJson.Name_Encrypted__c = r.object[0].lastNameEncrypt;
                leadJson.Phone_Encrypted__c = r.object[0].phoneEncrypt;
                leadJson.Email_Encrypted__c = r.object[0].emailEncrypt;
                leadJson.AWS_Data_Id__c = 'testAWSID';
                let transId = result.txId + '';
                let AWSDataId = r.object[0].dataId;
                // Assign the value to NonPII Data Payload
                //7. New NonPII Data To Salesforce
                Visualforce.remoting.Manager.invokeAction(
                    '{!$RemoteAction.NewAndEditLeadController.saveLead}',
                    JSON.stringify(leadJson), transId, {!isNewMode},
                function (result, event) {
                    if (event.status) {
                        console.log('Lead Id from SF Backend:'+JSON.stringify(result));
                        if (result.status == 'success') {
                            //get Lead Id from sf backend
                            let leadId = result.recordId;
                            window.open('/'+leadId,'_self');
                            //8. Confirm Trans to AWS
                            // transParameters = {
                            //     txId: transId,
                            //     isSuccess: result.status
                            // };
                            // fetch(TransactionURL, {
                            //     method: 'POST',
                            //     body: JSON.stringify(transParameters),
                            //     headers: {
                            //         'Content-Type': 'application/json',
                            //         'pi_token': TestToken
                            //     }
                            // }).then((result) => {
                            //     if (JSON.parse(result).status == 0) {
                            //         //9. Redirect to lead Id page.
                            //         window.location.href = LeadIdPage;
                            //         // let data = {
                            //         //     transId:result.txId,
                            //         //     dataId:dataId,
                            //         //     status:result.status
                            //         // }
                            //         // return JSON.stringify(data);
                            //     }
                            // })
                            // window.open(LeadIdPage);
                            // console.log(result);
                            // window.location.href = LeadIdPage;
            console.log('payloadJson=' + payloadJson);
            payloadJson.LastName = r.object[0].lastName;
            payloadJson.Phone = r.object[0].phone;
            payloadJson.Email = r.object[0].email;
            payloadJson.Name_Encrypted__c = r.object[0].lastNameEncrypt;
            payloadJson.Phone_Encrypted__c = r.object[0].phoneEncrypt;
            payloadJson.Email_Encrypted__c = r.object[0].emailEncrypt;
            //payloadJson.AWS_Data_Id__c = r.object[0].dataId;
            payloadJson.AWS_Data_Id__c = '{!AWSDataId}';
            if (isNewMode) {
                payloadJson.AWS_Data_Id__c = r.object[0].dataId;
                        } else {
                            //result.stauts == 'fail'
                payloadJson.AWS_Data_Id__c = '{!AWSDataId}';
            }
            return payloadJson;
        }
        var redirectCallBack = function redirectCallBack(sfId, errorMessage) {
            if (sfId) {
                if (redirectMode == 'Save') {
                    window.open('/' + sfId, '_self');
                } else if (redirectMode == 'SaveAndNew') {
                    window.open('/setup/ui/recordtypeselect.jsp?ent=' + '{!sobjecttypeForFrontEnd}' + '&retURL=/' + '{!sobjectPrefix}' + '/o&save_new_url=/' + '{!sobjectPrefix}' + '/e?retURL=%2F' + '{!sobjectPrefix}' + '%2Fo', '_self');
                }
            } else {
                // alert(errorMessage);
                alertErrorMessage(errorMessage);
                        }
                    }
                },
                { escape: true }
            );
        }).catch (error => {
            console.log(error);
        });
        function UpdatePIToAWS(leadJson, payloadForNewPI) {
            let controllerSaveMethod = '{!$RemoteAction.NewAndEditLeadController.saveLead}';
            let obj = JSON.parse(payloadForNewPI);
            obj[0].dataId = '{!AWSDataId}';
            let payloadForNewPIJson = JSON.stringify(obj);
            AWSService.update(staticResources.updateUrl, leadJson, payloadForNewPIJson, controllerSaveMethod, staticResources.token, staticResources.transactionUrl, false, insertOrUpdateBack, redirectCallBack);
        }
        function saveLeadProcess() {
        function NewPIToAWS(leadJson, payloadForNewPI) {
            let controllerSaveMethod = '{!$RemoteAction.NewAndEditLeadController.saveLead}';
            AWSService.insert(staticResources.newUrl, leadJson, payloadForNewPI, controllerSaveMethod, staticResources.token, staticResources.transactionUrl, true, insertOrUpdateBack, redirectCallBack);
        }
        function checkRequiredFieldMsg(formData) {
            let blankRequiredFields = '';
            for (i = 0; i < requiredFieldAPIList.length; i++) {
                if (formData[requiredFieldAPIList[i]]) {
                    continue;
                } else {
                    let fieldAPIValue = requiredFieldAPIList[i]
                    let fieldLabelValue = fieldAPIToLabelMap[fieldAPIValue];
                    if (requiredAPIToChangedLabelMap.has(fieldAPIValue)) {
                        fieldLabelValue = requiredAPIToChangedLabelMap.get(fieldAPIValue);
                    }
                    if (blankRequiredFields == '') {
                        blankRequiredFields = blankRequiredFields + fieldLabelValue;
                    } else {
                        blankRequiredFields = blankRequiredFields + ',' + fieldLabelValue;
                    }
                }
            }
            return blankRequiredFields;
        }
        function saveLeadProcess(saveMode) {
            disableButtonStatus();
            redirectMode = saveMode;
            console.log('redirectMode' + redirectMode);
            hiddenErrorMsgNode();
            //1. Get Lead Information from Form
            let leadJson = getLeadInformation();
            //2. Validate the Lead field value formate, for example the email formate or phone formate
            // let validationResultMessage = validateFieldValueFormate();
            // console.log(validationResultMessage);
            // if (!validationResultMessage) {
            //     //Popup error message.  - To Do After POC
            //     alert('邮箱或电话号码格式有误');
            // }
            // //3. Prepare the payload for New PI API To AWS - To Do
            let validationResultMessage = validateFieldValueFormate();
            console.log(validationResultMessage);
            if (validationResultMessage) {
                //Popup error message.  - To Do After POC
                alertErrorMessage(validationResultMessage);
                return
            }
            // Check Required Field
            let checkRequiredFieldMsgResult = checkRequiredFieldMsg(leadJson);
            if (checkRequiredFieldMsgResult) {
                alertErrorMessage('{!Input_Required_Field_Msg}' + checkRequiredFieldMsgResult);
                return
            }
            //3. Prepare the payload for New PI API To AWS - To Do
            let payloadForNewPI = getPIPayload(leadJson);
            // //4. Get Authentication Information for AWS
            // loadAWSAuthentication();
            //4. lead to AWS
            ProcessPI(leadJson, payloadForNewPI);
        }
            // //5. lead to AWS
            //ProcessPI(payloadForNewPI);
            awsToken = TestToken;
            NewPIToAWS(leadJson,awsToken, payloadForNewPI)
        function alertErrorMessage(errorMsg) {
            enableButtonStatus();
            let errorMsgNode = document.getElementById("page:form:block:msgContent");
            errorMsg = '错误:无效数据。' + '\n' + errorMsg;
            errorMsgNode.innerText = errorMsg;
            errorMsgNode.className = 'pbError';
            unblockUI();
        }
        function hiddenErrorMsgNode() {
            let errorMsgNode = document.getElementById("page:form:block:msgContent");
            errorMsgNode.innerText = '';
            errorMsgNode.className = '';
        }
        var newSearchContactWindow = null;
        var contactHtmlString = '<img src="/img/s.gif" onclick="searchContact(\'page:form:contactId\')" alt="Reference Document Number Lookup" class="lookupIcon"  title="Reference Document Number Lookup (New Window)"/>';
        function htmlToElement(html) {
            var template = document.createElement('template');
            html = html.trim(); // Never return a text node of whitespace as the result
            template.innerHTML = html;
            return template.content.firstChild;
        }
        function searchContact(contactNodeId) {
            //1. Check account value
            let accountNodeId = document.querySelector("[data-id='Hospital_Name__c']").id + '_lkid';
            let accountValue = document.getElementById(accountNodeId).value;
            console.log(accountValue);
            if (accountValue != '000000000000000') {
                let baseUrl = "/apex/SearchContactPage";
                let suffixUrl = "?contactId=" + contactNodeId + "&accountId=" + accountValue;
                let newSearchContactParam = 'height=600,width=800,left=100,top=100,dialogHide=true,resizable=no,scrollbars=yes,toolbar=no,status=no';
                newSearchContactWindow = window.open(baseUrl + suffixUrl, 'Popup', newSearchContactParam);
                if (window.focus) {
                    newSearchContactWindow.focus();
                }
                return false;
            } else {
                //alertErrorMessage('{!PIPL_Input_Account_Error_Msg}');
                alertErrorMessage('请先选择医院名');
            }
        }
        function closePopupWindow() {
            if (null != newSearchContactWindow) {
                newSearchContactWindow.close();
            }
            let contactInfoStr = document.getElementById('page:form:contactId').value;
            console.log('closePopup:' + contactInfoStr);
            let contactInfo = JSON.parse(contactInfoStr);
            let contactNodeId = document.querySelector("[data-id='Contact_Name__c']").id + '_lkid';
            document.getElementById(contactNodeId).value = contactInfo.ContactId;
            document.querySelector("[data-id='Contact_Name__c']").value = contactInfo.Name;
        }
        function replaceSearchContactLookup() {
            let lookUpNode = htmlToElement(contactHtmlString);
            console.log(lookUpNode);
            if (!{!isNewMode}) {
                //1. Query Contact from AWS by AWSDataId
                queryContactName()
                //document.querySelector("[data-id='Contact_Name__c']").value = '王奎';
            }
            let parentNode = document.querySelector("[data-id='Contact_Name__c']").parentNode;
            document.querySelector("[data-id='Contact_Name__c']").removeAttribute("onchange");
            parentNode.replaceChild(lookUpNode, document.querySelector("[data-id='Contact_Name__c']").parentNode.children[2]);
        }
        function queryContactName() {
            let sfId = document.getElementById(document.querySelector("[data-id='Contact_Name__c']").id + '_lkid').value;
            let contactsInfo = JSON.parse('{!contactsInfo}');
            let dataId = contactsInfo[sfId];
            let url = staticResourcesContact.queryUrl + '?dataId=' + dataId;
            fetch(url, {
                method: 'GET',
                headers: {
                    'Content-Type': 'application/json',
                    'pi-token': staticResources.token
                }
            }).then((data) => {
                return data.json();
            }).then((result) => {
                document.querySelector("[data-id='Contact_Name__c']").value = result.object.lastName;
            })
        }
    </script>
    <div class="bPageTitle">
@@ -345,10 +341,9 @@
        </div>
        <div class="ptBreadcrumb"></div>
    </div>
    <apex:form >
        <!-- Error Msg-->
        <apex:pageMessages />
        <apex:pageblock >
    <apex:form id="form">
        <apex:inputHidden value="{!contactId}" id="contactId" />
        <apex:pageblock id="block">
            <div class="pbHeader">
                <table cellspacing="0" cellpadding="0" border="0">
                    <tbody>
@@ -358,17 +353,25 @@
                                <h2 class="mainTitle">意向编辑</h2>
                            </td>
                            <td class="pbButton" id="topButtonRow">
                                <input class="btn" type="Button" value="保存" onclick="saveLeadProcess()" />
                                <input class="btn" type="Button" value="保存并新建" onclick="saveLeadProcess()" />
                                <input class="btn" type="Button" value="保存" onclick="saveLeadProcess('Save')" />
                                <input class="btn" type="Button" value="保存并新建" onclick="saveLeadProcess('SaveAndNew')" />
                                <apex:commandButton action="{!cancel}" value="取消" />
                            </td>
                        </tr>
                    </tbody>
                </table>
            </div>
            <!-- Error Msg-->
            <div style="text-align: center;">
                <apex:outputPanel id="errorMsg">
                    <apex:pageMessages id="msgContent" escape="false" />
                </apex:outputPanel>
            </div>
            <br/>
            <!-- Iterate the layoutSections, which is a list of sections -->
            <apex:repeat value="{!layoutSections}" var="layoutSection">
                <apex:pageBlockSection title="{!layoutSection.name}" collapsible="{!layoutSection.allowCollapse}" columns="{!layoutSection.columns}">
                <apex:pageBlockSection title="{!layoutSection.name}" showHeader="{!layoutSection.useHeader}" collapsible="{!layoutSection.allowCollapse}"
                    columns="{!layoutSection.columns}">
                    <!--Each section has layoutFields, let's iterate them as well-->
                    <apex:repeat value="{!layoutSection.layoutFields}" var="layoutField">
@@ -383,15 +386,18 @@
            <script>
                sfdcPage.appendToOnloadQueue(function () {
                    //1. Set Last Name label
                    document.querySelector("[data-id='LastName']").parentNode.parentNode.parentNode.children[2].children[0].innerText = '姓名';
                    console.log('NameLabel = ' + '{!PIPL_Name_Label}')
                    document.querySelector("[data-id='LastName']").parentNode.parentNode.parentNode.children[0].children[0].innerText = '{!PIPL_Name_Label}';
                    //2. Query AWS Data by dataId 
                    console.log('Mode for Lead Page:' + {!isNewMode});
                if (!{!isNewMode}) {
                    //2.1. Query AWS Data by
                    let leadPIData = QueryLeadFromAWS({!awsDataId});
                        //2.2. Update the value to Front-End
                        //document.querySelector("[data-id='LastName']").value = '234234';
                        blockme();//for loading search by Li Jun 20220218
                        QueryLeadFromAWS();
                    }   
                    //Replace Vlookup Field
                    replaceSearchContactLookup();
                    //3. Set Readonly Attribute
                    document.querySelector("[data-id='OwnerId']").classList.add("disabledbutton");
                });
            </script>
            <div class="pbBottomButtons">
@@ -400,9 +406,9 @@
                        <tr>
                            <td class="pbTitle">
                                <img src="/img/s.gif" alt="" class="minWidth" title="" width="1" height="1" />&nbsp;</td>
                            <td class="pbButtonb" id="bottomButtonRow">
                                <input class="btn" type="Button" value="保存" onclick="saveLeadProcess()" />
                                <input class="btn" type="Button" value="保存并新建" onclick="saveLeadProcess()" />
                            <td class="pbButton" id="bottomButtonRow">
                                <input class="btn" type="Button" value="保存" onclick="saveLeadProcess('Save')" />
                                <input class="btn" type="Button" value="保存并新建" onclick="saveLeadProcess('SaveAndNew')" />
                                <apex:commandButton action="{!cancel}" value="取消" />
                            </td>
                        </tr>
force-app/main/default/pages/OFSInsReportLayout.page
@@ -8,6 +8,7 @@
    <apex:includeScript value="{!URLFOR($Resource.connection20)}"/>
    <apex:includeScript value="{!URLFOR($Resource.apex20)}"/>
    <apex:stylesheet value="{!URLFOR($Resource.blockUIcss)}"/>
    <apex:includeScript value="{! URLFOR($Resource.AWSService, 'AWSService.js') }" />
    <style type="text/css">
        table#AssetTable select {
            width: 98%;
@@ -127,6 +128,147 @@
    
}
//add by rentx 20210809 全选功能 end
AWSService.sfSessionId = '{!GETSESSIONID()}';
var staticResource = JSON.parse('{!staticResource}');
var aws_data = {};
var txid = null;
function Encrypt(callback){
    blockme();
    //callback();return;
    //<input type="hidden" value="{!ir.Id}" id="IrId"/>
    //<input type="hidden" value="{!ir.Responsible_Person_Encrypted__c}" id="Responsible_Person_Encrypted__c"/>
    //<input type="hidden" value="{!ir.phone_Encrypted__c}" id="phone_Encrypted__c"/>
    let e_id = document.getElementById("IrId");
    let url = staticResource.newUrl;
    aws_data = {
        "phone":j$("[field-api='phone__c']").val(),
        "responsiblePerson":j$("[field-api='Responsible_Person__c']").val(),
    };
    if(e_id && e_id.value){
        url = staticResource.updateUrl;
        aws_data.dataId = document.getElementById("Page:Form:Block:AWS_Data_Id__c").value;
    }
    AWSService.post(url, JSON.stringify([aws_data]), function(data){
        if (!(data && data.object && data.object.length)) {
            console.log('AWSService.post failed');
            return;
        }
        let aws_data1 = data.object[0];
        txid = data.txId;
        document.getElementById("Page:Form:Block:AWS_Data_Id__c").value = aws_data1.dataId;
        j$("[field-api='phone__c']").val(aws_data1.phone);
        document.getElementById("Page:Form:Block:phone_Encrypted__c").value = aws_data1.phoneEncrypt;
        j$("[field-api='Responsible_Person__c']").val(aws_data1.responsiblePerson);
        document.getElementById("Page:Form:Block:Responsible_Person_Encrypted__c").value = aws_data1.responsiblePersonEncrypt;
        if (callback) {
            callback();
        }
    }, staticResource.token);
}
function saveBtnJs(){
    Encrypt(saveBtn);
}
function submitJs(){
    Encrypt(submit);
}
function showPDFJs(){
    Encrypt(showPDF);
}
function afterSaveBtnJs(){
    Trans();
}
function afterSubmitJs(){
    Trans();
}
function afterShowPDFJs(){
    Trans(function(){
        if (!HasError()) {
            window.location.href = '/apex/InsReportPDFOuter?id=' + document.getElementById("IrId").value;
        }
    });
}
function HasError(){
    // if (IsAddmessage) {
    //     return true;
    // }
    let e = document.getElementById("Page:Form:MessageP");
    if (!e) {
        return false;
    }
    let divs = j$(e).find("div.message");
    for (let i = 0; i < divs.length; i++) {
        for (let j = 0; j < divs[i].classList.length; j++) {
            for(let cls of divs[i].classList){
                if (cls.indexOf('error')>-1) {
                    return true;
                }
            }
        }
    }
    return false;
}
function Decrypt(data){
    j$("[field-api='phone__c']").val(data.phone);
    j$("[field-api='Responsible_Person__c']").val(data.responsiblePerson);
}
function Trans(callback){
    let payload = {
        "txId":txid,
        "sfRecordId":document.getElementById("IrId").value,
        "isSuccess":(txid && !HasError()) ? 1 : 0
    };
    AWSService.post(staticResource.transactionUrl, JSON.stringify(payload), function(result){
        Decrypt(aws_data);
        if(callback)callback();
        unblockUI();
    }, staticResource.token);
}
function Query(){
    let ele = document.getElementById("Page:Form:Block:AWS_Data_Id__c");
    if (ele && ele.value) {
        blockme();
        AWSService.query(staticResource.queryUrl, ele.value, function(data){
            if (data && data.object) {
                Decrypt(data.object);
            }
            unblockUI();
        }, staticResource.token);
    }
}
j$(function(){
    Query();
})
</script>
<title>{!ir.Name}</title>
</head>
@@ -138,6 +280,9 @@
    // 保存後、新規の報告書IDを取得
    tmpinsid = '{!ir.Id}';
    tmpinsn = '{!JSENCODE(ir.Name)}';
    //var IsAddmessage = {IsAddmessage};
    var isPDF = {!isPDF};
</script>
<apex:actionFunction name="searchfunc" action="{!searchBtn}" rerender="Form,Block,UnCheckSection" onComplete="unblockUI();"></apex:actionFunction>
@@ -149,9 +294,14 @@
<apex:actionFunction name="saveByRepair" action="{!saveBtn}" rerender="Form" onComplete="unblockUI();openRepair();"/>
<apex:actionFunction name="saveBtn" action="{!saveBtn}" rerender="Form" onComplete="afterSaveBtnJs();"/>
<apex:actionFunction name="submit" action="{!submit}" rerender="Form" onComplete="afterSubmitJs();"/>
<apex:actionFunction name="showPDF" action="{!showPDF}" rerender="Form" onComplete="afterShowPDFJs();"/>
<apex:outputPanel id="MessageP">
<apex:pageMessages />
</apex:outputPanel>
<div><apex:pageBlock mode="maindetail" Id="Block" rendered="{!initFlag}">
    <div style="position: relative;top:0;width:100%;">
@@ -162,10 +312,10 @@
                    <apex:outputLabel value="{!$ObjectType.Inspection_Report__c.fields.Name_Manual__c.Label}" for="Name_Manual"/>)
                    <apex:inputField value="{!ir.Name}" id="Ir_Name" html-disabled="disabled" style="border-width:0px;font-size:18px;font-weight:bold;padding-right:20px;-webkit-text-fill-color:black;"/>
                </td>
                <td style="text-align: center;padding-right: 100px;"><apex:commandButton style="width:80px;" value="保存" action="{!saveBtn}" onclick="blockme();" rerender="Form" onComplete="unblockUI();"/></td>
                <td style="text-align: center;padding-right: 100px;"><apex:commandButton value="提交" action="{!submit}" onclick="blockme();" style="width:80px" rerender="Form" id="submitButton" onComplete="unblockUI();"/></td>
                <td style="text-align: center;padding-right: 100px;"><input class="btn" type="Button" style="width:80px;" value="保存" action="" onclick="saveBtnJs();" rerender="Form" onComplete="unblockUI();"/></td>
                <td style="text-align: center;padding-right: 100px;"><input class="btn" type="Button" value="提交" action="" onclick="submitJs();" style="width:80px" rerender="Form" id="submitButton" onComplete="unblockUI();"/></td>
                <td style="text-align: center;padding-right: 100px;"><apex:commandButton style="width:80px;" value="关闭窗口" onclick="location.href='/apex/OFSWindowClose';return false;" id="closeButton"/></td>
                <td style="text-align: center;"><apex:commandButton style="width:80px;" value="PDF" action="{!showPDF}" onclick="blockme();" rerender="Form" onComplete="unblockUI();"/></td>
                <td style="text-align: center;"><input class="btn" type="Button" style="width:80px;" value="PDF" action="" onclick="showPDFJs();" rerender="Form" onComplete="unblockUI();"/></td>
            </tr>
        </table>
        <apex:pageBlockSection title="{!sectionList[0].title}" columns="{!sectionList[0].column}" showHeader="{!sectionList[0].showHeader}" rendered="{!sectionList.size>0}">
@@ -207,11 +357,18 @@
</div>
<div style="position: relative;top:0;height:700px;overflow:hidden;overflow-y:auto;-webkit-overflow-scrolling: touch;">
    <input type="hidden" value="{!ir.Id}" id="IrId"/>
    <apex:inputHidden value="{!ir.Responsible_Person_Encrypted__c}" id="Responsible_Person_Encrypted__c"/>
    <apex:inputHidden value="{!ir.phone_Encrypted__c}" id="phone_Encrypted__c"/>
    <apex:inputHidden value="{!ir.AWS_Data_Id__c}" id="AWS_Data_Id__c"/>
    <apex:repeat value="{!sectionList}" var="section" id="SectionList">
    <apex:pageBlockSection title="{!section.title}" columns="{!section.column}" showHeader="{!section.showHeader}" rendered="{!!section.isTop}">
    <apex:repeat value="{!section.sectionItemList}" var="sectionItem" id="SectionItemList">
    <apex:outputField value="{!ir[sectionItem.api]}" rendered="{!NOT(sectionItem.isDummy)&&NOT(sectionItem.isCustomize)&&NOT(sectionItem.isInput)}"/>
    <apex:inputField style="width:{!sectionItem.width};height:{!sectionItem.height};" value="{!ir[sectionItem.api]}" rendered="{!NOT(sectionItem.isDummy)&&NOT(sectionItem.isCustomize)&&sectionItem.isInput}" required="{!sectionItem.isRequired}" html-tabindex="{!sectionItem.index}"/>
    <apex:inputField html-field-api="{!sectionItem.api}" style="width:{!sectionItem.width};height:{!sectionItem.height};" value="{!ir[sectionItem.api]}" rendered="{!NOT(sectionItem.isDummy)&&NOT(sectionItem.isCustomize)&&sectionItem.isInput}" required="{!sectionItem.isRequired}" html-tabindex="{!sectionItem.index}"/>
    <apex:pageblockSectionItem rendered="{!NOT(sectionItem.isDummy)&&(sectionItem.isCustomize)&&Not(isNull(sectionItem.customizeLable))}">
    <apex:outputLabel value="{!sectionItem.customizeLable}"/>
    <apex:outputPanel layout="none">
@@ -222,7 +379,7 @@
</apex:outputPanel>
<apex:outputPanel layout="none" rendered="{!NOT(api == 'Hospital__c' && ir.Id != '')}">
<apex:outputLabel style="font-weight: bold; padding-right: 5px;" value="{!sectionItem.apiLabelMap[api]}"/>
<apex:inputField value="{!ir[api]}" style="{!sectionItem.apiStyleMap[api]}" rendered="{!NOT(api=='') && (sectionItem.isInput || sectionItem.apiInputMap[api])}" required="{!sectionItem.apiRequireMap[api]}" html-tabindex="{!sectionItem.index}"/>
<apex:inputField html-field-api="{!api}" value="{!ir[api]}" style="{!sectionItem.apiStyleMap[api]}" rendered="{!NOT(api=='') && (sectionItem.isInput || sectionItem.apiInputMap[api])}" required="{!sectionItem.apiRequireMap[api]}" html-tabindex="{!sectionItem.index}"/>
<apex:outputPanel style="display:inline-block;{!sectionItem.apiStyleMap[api]}" rendered="{!NOT(api=='') && NOT((sectionItem.isInput || sectionItem.apiInputMap[api]))}">
<apex:outputField value="{!ir[api]}"/>
</apex:outputPanel>
@@ -234,7 +391,7 @@
<apex:outputPanel layout="none">
<apex:repeat value="{!sectionItem.apiList}" var="api">
<apex:outputLabel style="font-weight: bold; padding-right: 5px;" value="{!sectionItem.apiLabelMap[api]}"/>
<apex:inputField value="{!ir[api]}" style="{!sectionItem.apiStyleMap[api]}" rendered="{!NOT(api=='') && (sectionItem.isInput || sectionItem.apiInputMap[api])}" required="{!sectionItem.apiRequireMap[api]}" html-tabindex="{!sectionItem.index}"/>
<apex:inputField html-field-api="api" value="{!ir[api]}" style="{!sectionItem.apiStyleMap[api]}" rendered="{!NOT(api=='') && (sectionItem.isInput || sectionItem.apiInputMap[api])}" required="{!sectionItem.apiRequireMap[api]}" html-tabindex="{!sectionItem.index}"/>
<apex:outputPanel style="display:inline-block;{!sectionItem.apiStyleMap[api]}" rendered="{!NOT(api=='') && NOT((sectionItem.isInput || sectionItem.apiInputMap[api]))}">
<apex:outputField value="{!ir[api]}"/>
</apex:outputPanel>
force-app/main/default/pages/QISPDF.page
@@ -1,5 +1,5 @@
<apex:page controller="QISPDFController" showHeader="false" sidebar="false" renderAs="pdf" action="{!init}" applyHtmlTag="false">
<!-- <apex:page controller="QISPDFController" showHeader="false" sidebar="false" action="{!init}" applyHtmlTag="false"> -->
<!-- <apex:page controller="QISPDFController" showHeader="false" sidebar="false" renderAs="pdf" action="{!init}" applyHtmlTag="false"> -->
<apex:page controller="QISPDFController" showHeader="false" sidebar="false" action="{!init}" applyHtmlTag="false">
<html>
    <head>
        <style>
@@ -19,13 +19,33 @@
        td.middle {text-align: center; font-size:120%; font-weight: bold;}
        td.label {padding-left: 10px;}
        
            /* 20220221 PI改造 by 徐亮 start */
            body{margin: 0 auto;
            width: 780px;}
            #title1{height: 30px;}
            #title2{height: 110px;}
            /* 20220221 PI改造 by 徐亮 end */
        </style>
        <!-- 20220221 PI改造 by 徐亮 start  -->
        <apex:includeScript value="{! URLFOR($Resource.AWSService, 'AWSService.js') }" />
        <script src="../../soap/ajax/53.0/connection.js" type="text/javascript"></script>
        <apex:stylesheet value="{!URLFOR($Resource.blockUIcss)}"/>
        <apex:includeScript value="{!URLFOR($Resource.jquery183minjs)}"/>
        <apex:includeScript value="{!URLFOR($Resource.PleaseWaitDialog)}"/>
        <apex:includeScript value="{!URLFOR($Resource.jspdf)}"/>
        <apex:includeScript value="{!URLFOR($Resource.html2canvas)}"/>
        <!-- 20220221 PI改造 by 徐亮 end  -->
    </head>
    
    <body style="font-family: Arial Unicode MS;">
<body style="font-family: MS Gothic;">
    <div id="pdf-wrapper">
        <div id="title1"></div>
        <table width="100%" border="0">
            <tr>
                <td width="15%">
                <td width="25%">
                    <!-- <apex:image value="{!$Resource.swmLOGO}" /> -->
                    <table width="100%" border="1" cellspacing="0" style="border-color: red;">
                        <tr><td colspan="2" style="font-size: 6px; font-weight: bold; color: red; text-align: center; padding: 0px 0px 0px 0px;">OLYMPUS</td></tr>
@@ -47,7 +67,7 @@
            </tr>
        </table>
        <div style="height:3px;"></div>
        <table width="100%" border="1" cellspacing="2" style="font-size: 8pt;">
        <table width="100%" border="0" cellspacing="2" style="font-size: 8pt;">
            <tr>
                <td>
                    <table width="100%" border="1" cellspacing="0">
@@ -102,13 +122,13 @@
                            <td width="25%" class="label" height="23px">提交者上司</td>
                            <td width="25%" class="middle">{!usr.Manager.Name}</td>
                            <td width="10%" class="label">电话号码</td>
                            <td colspan="2" class="middle">{!qr.Caller_phone__c}</td>
                            <td colspan="2" class="middle" id="Caller_phone__c">{!qr.Caller_phone__c}</td>
                        </tr>
                        <tr>
                            <td width="25%" class="label" height="23px">提交日期</td>
                            <td width="25%" class="middle"><apex:outputField value="{!qr.QIS_Submit_day__c}" /></td>
                            <td width="10%" class="label">联系人</td>
                            <td colspan="2" class="middle">{!qr.Responsible_Person_HP__c}</td>
                            <td colspan="2" class="middle" id="Responsible_Person_HP__c">{!qr.Responsible_Person_HP__c}</td>
                        </tr>
                    </table>
                </td>
@@ -203,7 +223,7 @@
                            <td colspan="3" class="middle">{!qr.Set_usage_product__c}</td>
                        </tr>
                        <tr>
                            <td colspan="4" style="height:18px; padding-top: 0px; padding-bottom: 0px; padding-left: 10px;">问题内容描述</td>
                            <td colspan="4" style="height:18px; padding-top: 0px; padding-bottom: 0px; padding-left: 10px;border-bottom: none;border-bottom: none;">问题内容描述</td>
                        </tr>
                        <tr>
                            <td colspan="4" style="height:40px; border-top-color: white; font-size:120%; font-weight: bold; vertical-align: top;"><c:PDFWbr targetStr="{!qr.problem_detail__c}" /></td>
@@ -240,13 +260,13 @@
                            <td colspan="13" class="title">OCSM服务本部</td>
                        </tr>
                        <tr>
                            <td colspan="13" style="height:18px; padding-top: 0px; padding-bottom: 0px; padding-left: 10px;">检测/分析情况详述</td>
                            <td colspan="13" style="height:18px; padding-top: 0px; padding-bottom: 0px; padding-left: 10px;border-bottom: none;">检测/分析情况详述</td>
                        </tr>
                        <tr>
                            <td colspan="13" style="height:42px; border-top-color: white; font-size:120%; font-weight: bold; vertical-align: top;"><c:PDFWbr targetStr="{!qr.QIS_Reply_Comment__c}" /></td>
                        </tr>
                        <tr>
                            <td colspan="13" style="height:18px; padding-top: 0px; padding-bottom: 0px; padding-left: 10px;">原因</td>
                            <td colspan="13" style="height:18px; padding-top: 0px; padding-bottom: 0px; padding-left: 10px;border-bottom: none;">原因</td>
                        </tr>
                        <tr>
                            <td colspan="13" style="height:42px; border-top-color: white; font-size:120%; font-weight: bold; vertical-align: top;"><c:PDFWbr targetStr="{!qr.Reason_bloken__c}" /></td>
@@ -324,7 +344,7 @@
                            <td colspan="10" class="title">OSH 医疗品质保障部</td>
                        </tr>
                        <tr>
                            <td colspan="9" style="height:18px; padding-top: 0px; padding-bottom: 0px; padding-left: 10px;">检测/分析情况详述<br/></td>
                            <td colspan="9" style="height:18px; padding-top: 0px; padding-bottom: 0px; padding-left: 10px;border-bottom: none;">检测/分析情况详述<br/></td>
                            <td style="text-align: center;">质量判定</td>
                        </tr>
                        <tr>
@@ -380,9 +400,10 @@
        
        <div style="page-break-after: always;"></div>
        
        <div id="title2"></div>
        <table width="100%" border="0">
            <tr>
                <td width="15%">
                <td width="25%">
                    <table width="100%" border="1" cellspacing="0" style="border-color: red;">
                        <tr><td colspan="2" style="font-size: 6px; font-weight: bold; color: red; text-align: center; padding: 0px 0px 0px 0px;">OLYMPUS</td></tr>
                        <tr>
@@ -403,7 +424,7 @@
            </tr>
        </table>
        <div style="height:3px;"></div>
        <table width="100%" border="1" cellspacing="2" style="font-size: 8pt;">
        <table width="100%" border="0" cellspacing="2" style="font-size: 8pt;">
            <tr>
                <td>
                    <table width="100%" border="1" cellspacing="0">
@@ -460,6 +481,89 @@
                </td>
            </tr>
        </table>
    </div>
    </body>
<!-- 20220221 PI改造 by 徐亮 start  -->
<script>
    AWSService.sfSessionId = '{!GETSESSIONID()}';
    var staticResources = JSON.parse('{!staticResource}');
    function Fun(pdf){
        var iframe = document.createElement('iframe');
        iframe.setAttribute('style', 'position:absolute;right:0; top:0; bottom:0; height:100%; width:100%');
        document.body.appendChild(iframe);
        iframe.src = pdf.output('datauristring');
        for(let e of document.body.childNodes){
            if( e != iframe && e.style){
                e.style.display = 'none';
            }
        }
    }
    let id = "pdf-wrapper";
    var target = document.getElementById(id);
    function jsPdfDownload(){
        let pdfName = "测试";
        let id = "pdf-wrapper";
        var target = document.getElementById(id);
        target.style.background = "#FFFFFF";
        if(pdfName==''||pdfName==undefined) pdfName= getNowFormatDate();
        html2canvas(target, {
            scale: 2,
            onrendered:function(canvas) {
                var contentWidth = canvas.width;
                var contentHeight = canvas.height;
                //一页pdf显示html页面生成的canvas高度;
                var pageHeight = contentWidth / 592.28 * 841.89;
                //未生成pdf的html页面高度
                var leftHeight = contentHeight;
                //页面偏移
                var position = 0;
                //a4纸的尺寸[595.28,841.89],html页面生成的canvas在pdf中图片的宽高
                var imgWidth = 515.28;//595.28//左右边距20
                var imgHeight = 515.28/contentWidth * contentHeight;//左右边距20
                var pageData = canvas.toDataURL('image/jpeg', 1.0);
                var pdf = new jsPDF('', 'pt', 'a4');
                //有两个高度需要区分,一个是html页面的实际高度,和生成pdf的页面高度(841.89)
                //当内容未超过pdf一页显示的范围,无需分页
                if (leftHeight < pageHeight) {
                    pdf.addImage(pageData, 'JPEG', 40, 0, imgWidth, imgHeight );//左右边距20
                } else {
                    while(leftHeight > 0) {
                        pdf.addImage(pageData, 'JPEG', 40, position, imgWidth, imgHeight)//左右边距20
                        leftHeight -= pageHeight;
                        position -= 841.89;
                        //避免添加空白页
                        if(leftHeight > 0) {
                            pdf.addPage();
                        }
                    }
                }
                Fun(pdf);
            }
        })
    }
    blockme();
    document.body.onload = function(){
        AWSService.query(staticResources.queryUrl, '{!qr.AWS_Data_Id__c}', function(data){
            unblockUI();
            document.getElementById("Responsible_Person_HP__c").innerHTML = data.object.responsiblePersonHP;
            document.getElementById("Caller_phone__c").innerHTML = data.object.callerPhone;
            setTimeout(() => {
                jsPdfDownload();
            }, 1500);
        }, staticResources.token);
    }
</script>
<!-- 20220221 PI改造 by 徐亮 end  -->
</html>
</apex:page>
force-app/main/default/pages/SLAReportDetails.page
@@ -1,4 +1,9 @@
<apex:page Controller="SLAReportDetailsController" showHeader="false" sidebar="false" id="allPage" action="{!init}" title="信息更新">
    <apex:stylesheet value="{!URLFOR($Resource.blockUIcss)}"/>
    <apex:includeScript value="{!URLFOR($Resource.jquery183minjs)}"/>
    <apex:includeScript value="{!URLFOR($Resource.PleaseWaitDialog)}"/>
    <apex:includeScript value="{! URLFOR($Resource.AWSService, 'AWSService.js') }" />
    <apex:includeScript value="/soap/ajax/40.0/connection.js"/>
    <script>
        function cancelJs() {
            window.opener=null;
@@ -12,6 +17,67 @@
                window.opener.document.getElementById('Page:mainForm:idDayEdit:idActivities:'+index+':EventCSLAInfoId').value = slaInfoId;
                window.close();
            }
        }
        var slaInfoStr = JSON.parse('{!slaInfoStr}');
        var staticResourceContact = JSON.parse('{!staticResourceContact}');
        var ids = [];
        var dataIds = [];
        var condition = '';
        var contact = {};
        queryContact();
        function q1(){
            var p = new Promise(function(resolve, reject){
                let queryBack = function queryBack(result) {
                    let contacts = result.object;
                    if(contacts == null){
                        return;
                    }
                    for(var i=0;i<result.object.length;i++){
                        if(result.object[i].sfRecordId != null){
                            contact[result.object[i].sfRecordId] = result.object[i].lastName
                        }
                    }
                    resolve('success');
                }
                let searchPayload = new Object();
                searchPayload.dataIds = dataIds;
                searchPayload.contactName = '';
                AWSService.search(staticResourceContact.searchUrl, JSON.stringify(searchPayload), queryBack, staticResourceContact.token);
            });
            return p;
        }
        function q2(){
            var p = new Promise(function(resolve, reject){
                for(let key in contact){
                    var k = ''+key;
                    document.getElementById(k).innerText = contact[k];
                }
            });
            return p;
        }
        function queryContact(){
            blockme();
            ids.push(slaInfoStr.Visitor1__c!=null?slaInfoStr.Visitor1__c:"")
            ids.push(slaInfoStr.Visitor2__c!=null?slaInfoStr.Visitor2__c:"")
            ids.push(slaInfoStr.Visitor3__c!=null?slaInfoStr.Visitor3__c:"")
            ids.push(slaInfoStr.Visitor4__c!=null?slaInfoStr.Visitor4__c:"")
            ids.push(slaInfoStr.Visitor5__c!=null?slaInfoStr.Visitor5__c:"")
            sforce.connection.sessionId = '{!GETSESSIONID()}';
            for(var i=0;i<ids.length;i++){
                condition += "," + "\'"+ids[i]+"\'";
            }
            condition = condition.substr(1);
            console.log('condition = ' + condition);
            var record = sforce.connection.query("select AWS_Data_Id__c from Contact where id in("+condition+")");
            var records = record.getArray("records");
            for(var i =0;i<records.length;i++){
                dataIds.push(records[i].AWS_Data_Id__c);
            }
            q1().then(function(data){
                        return q2(data);
                    });
            unblockUI();
        }
    </script>
    <apex:form id="allForm">
@@ -39,27 +105,33 @@
                    </apex:pageBlockSectionItem>
                    <apex:pageBlockSectionItem labelStyle="text-align:left;">
                        <apex:outputLabel value="访问对象1"></apex:outputLabel>
                        <apex:outputField id="Visitor1__c" value="{!slaInfo.Visitor1__c}" />
                        <!-- <apex:outputField id="{!slaInfo.Visitor1__c}" value="{!slaInfo.Visitor1__c}" />  -->
                        <span id="{!slaInfo.Visitor1__c}">{!slaInfo.Visitor1__c}</span>
                    </apex:pageBlockSectionItem>
                    <apex:pageBlockSectionItem labelStyle="text-align:left;">
                        <apex:outputLabel value="访问对象1电话"></apex:outputLabel>
                        <apex:outputField id="Visitor1Phone" value="{!slaInfo.Visitor1__r.Phone}" />
                        <!-- <apex:outputField id="{!slaInfo.Visitor1__c}_Phone" value="{!slaInfo.Visitor1__r.Phone}" />  -->
                        <span id="{!slaInfo.Visitor1__c}_Phone">{!slaInfo.Visitor1__r.Phone}</span>
                    </apex:pageBlockSectionItem>
                    <apex:pageBlockSectionItem labelStyle="text-align:left;">
                        <apex:outputLabel value="访问对象2"></apex:outputLabel>
                        <apex:outputField id="Visitor2__c" value="{!slaInfo.Visitor2__c}" />
                        <!-- <apex:outputField id="{!slaInfo.Visitor2__c}" value="{!slaInfo.Visitor2__c}" />  -->
                        <span id="{!slaInfo.Visitor2__c}">{!slaInfo.Visitor2__c}</span>
                    </apex:pageBlockSectionItem>
                    <apex:pageBlockSectionItem labelStyle="text-align:left;">
                        <apex:outputLabel value="访问对象3"></apex:outputLabel>
                        <apex:outputField id="Visitor3__c" value="{!slaInfo.Visitor3__c}" />
                        <!-- <apex:outputField id="{!slaInfo.Visitor3__c}" value="{!slaInfo.Visitor3__c}" />  -->
                        <span id="{!slaInfo.Visitor3__c}">{!slaInfo.Visitor3__c}</span>
                    </apex:pageBlockSectionItem>
                    <apex:pageBlockSectionItem labelStyle="text-align:left;">
                        <apex:outputLabel value="访问对象4"></apex:outputLabel>
                        <apex:outputField id="Visitor4__c" value="{!slaInfo.Visitor4__c}" />
                        <!-- <apex:outputField id="{!slaInfo.Visitor4__c}" value="{!slaInfo.Visitor4__c}" />  -->
                        <span id="{!slaInfo.Visitor4__c}">{!slaInfo.Visitor4__c}</span>
                    </apex:pageBlockSectionItem>
                    <apex:pageBlockSectionItem labelStyle="text-align:left;">
                        <apex:outputLabel value="访问对象5"></apex:outputLabel>
                        <apex:outputField id="Visitor5__c" value="{!slaInfo.Visitor5__c}" />
                        <!-- <apex:outputField id="{!slaInfo.Visitor5__c}" value="{!slaInfo.Visitor5__c}" /> -->
                        <span id="{!slaInfo.Visitor5__c}">{!slaInfo.Visitor5__c}</span>
                    </apex:pageBlockSectionItem>
                </apex:pageBlockSection>
                <apex:commandButton onclick="save()" rerender="goOrNot,inList" value="保存" style="width: 150px;margin-left: 50px;"/>
force-app/main/default/pages/SearchVisitor.page
@@ -1,7 +1,13 @@
<apex:page id="Page" controller="SearchVisitorController" sidebar="false" showHeader="false" >
    <apex:includeScript value="{!URLFOR($Resource.jquery183minjs)}"/>
    <apex:includeScript value="{!URLFOR($Resource.PleaseWaitDialog)}"/>
    <apex:stylesheet value="{!URLFOR($Resource.blockUIcss)}"/>
    <!-- 20220217 Li Jun for PIPL start -->
    <apex:includeScript value="{!URLFOR($Resource.AWSService, 'AWSService.js') }" />
    <script src="../../soap/ajax/53.0/connection.js" type="text/javascript"></script>
    <!-- 20220217 Li Jun for PIPL End -->
    <script type="text/javascript">
        AWSService.sfSessionId = '{!GETSESSIONID()}';
        function addContact(){
            window.opener.showModal();
            
@@ -33,8 +39,12 @@
            for(var i=0; i<5; i++){
                if(j$(escapeVfId('Page:mainForm:idSearchVisitor:idAddVisitor:' + i + ':idAddHiddenId')).value() != ''){
                    sltList[j] = new Array();
                    sltList[j][0] = document.getElementById('Page:mainForm:idSearchVisitor:idAddVisitor:' + i + ':idAddName').innerHTML;
                    sltList[j][1] = j$(escapeVfId('Page:mainForm:idSearchVisitor:idAddVisitor:' + i + ':idAddHiddenId')).value();
                    //Add by Li Jun for PIPL 20220218 Start
                    let accountId = j$(escapeVfId('Page:mainForm:idSearchVisitor:idAddVisitor:' + i + ':idAddHiddenId')).value();
                    sltList[j][0] = contactInfo[sfIdToAWSIdMapValue.get(accountId)].lastName;
                    //Add by Li Jun for PIPL 20220218 End
                    //sltList[j][0] = document.getElementById('Page:mainForm:idSearchVisitor:idAddVisitor:' + i + ':idAddName').innerHTML; // Commented by Li Jun for PIPL
                    sltList[j][1] = accountId;
                    j++;
                }
            }
@@ -47,8 +57,11 @@
            }
            
            for(var a=0; a<5; a++){
                //Updated by Li Jun 20220228
                if(window.opener.document.getElementById(setVisitor[a][0])&&window.opener.document.getElementById(setVisitor[a][1])){
                window.opener.document.getElementById(setVisitor[a][0]).value = sltList[a][0];
                window.opener.document.getElementById(setVisitor[a][1]).value = sltList[a][1];
                }
            }
            window.close();
@@ -93,6 +106,191 @@
            document.getElementById('Page:mainForm:idSearchVisitor:idAddVisitor:' + index + ':idAddMyDr').innerHTML = '<img src=\"/img/checkbox_unchecked.gif\" width=\"16\" height=\"16\" class=\"checkImg\" />';
        }
        
        //Add By Li Jun 20220228 Start for PIPL
        // var sfIdToAWSContact = new Object();
        var staticResources = JSON.parse('{!staticResource}');
        var contactAWSIds = JSON.parse('{!contactAWSIds}');
        var searchByLastName = '';
        var contactInfo = {};
        var sfIdToAWSIdMapValue = new Map();
        var aws_result = {};
        var selectedEditIndex = 0;
        var selectedAwsDataId = '';
        searchContactAll();
        function preparePayloadForSearchContact(){
            let searchPayload = new Object();
            searchPayload.dataIds = contactAWSIds;
            searchPayload.contactName = searchByLastName;
            return JSON.stringify(searchPayload);
        }
        //Search Contact From AWS
        function searchContactAll(){
            let data = preparePayloadForSearchContact();
            let searchCallBack = function searchCallBack(result){
                let contacts = result.object;
                if(contacts == null){
                    return;
                }
                for(var i=0;i<contacts.length;i++){
                    let temp = {}
                    temp.lastName = contacts[i].lastName?contacts[i].lastName:'';
                    temp.phone = contacts[i].phone?contacts[i].phone:'';
                    temp.doctorDivision1 = contacts[i].doctorDivision1? contacts[i].doctorDivision1:'';
                    temp.type = contacts[i].type? contacts[i].type:'';
                    contactInfo[contacts[i].dataId] = temp;
                    if(contacts[i].sfRecordId){
                        sfIdToAWSIdMapValue.put(contacts[i].sfRecordId,contacts[i].dataId);
                    }
                }
                console.log('AWS Contact Result:'+JSON.stringify(contactInfo));
            };
            AWSService.search(staticResources.searchUrl,data,searchCallBack,staticResources.token);
        }
        function queryContactProcess(){
            console.log('Query Contact process.');
            //1. get contact name from search box
            let searchByLastName = document.getElementById('Page:mainForm:idSearchVisitor:searchContactName').value;
            //2. inovke aws service
            let contactAwsIds = new Set();
            for(var key in contactInfo){
                if(contactInfo[key].lastName.includes(searchByLastName)){
                    contactAwsIds.add(key);
                }
            }
            if(contactAwsIds.size == 0){
                clearLineInfoList();
                return;
            }
            searchContactAll();
            //3. render the current page
            serContact(JSON.stringify(Array.from(contactAwsIds)));
        }
        function showPIDiv(dataId,obj){
            console.log('Selected Record:'+dataId);
            //check sf id
            let awsDataId = dataId;
            if(dataId.length == 1){
                let sfId = j$(escapeVfId('Page:mainForm:idSearchVisitor:idAddVisitor:' + dataId + ':idAddHiddenId')).val()
                awsDataId = sfIdToAWSIdMapValue.get(sfId); 
            }
            if(awsDataId){
                console.log('AWS Data Id:'+ awsDataId);
                console.log('AWS Data Info:'+ JSON.stringify(contactInfo));
                let parentNode = document.getElementById(obj.id);
                let createDiv = document.createElement("div");
                createDiv.id = parentNode.id+"_PI";
                let piInformation = '{!$Label.Visitor_Name}:'+contactInfo[awsDataId].lastName +'\n{!$ObjectType.Contact.fields.Doctor_Division1__c.Label}:'+contactInfo[awsDataId].doctorDivision1+'\n{!$ObjectType.Lead.fields.Phone.Label}:'+contactInfo[awsDataId].phone
                createDiv.innerText = piInformation;
                let x=window.event.x;
                let y=window.event.y;
                createDiv.style.left=x;
                createDiv.style.top=y;
                createDiv.style.background = "#dddddd";
                createDiv.style.position = "absolute";
                parentNode.appendChild(createDiv);
            }
        }
        function hidePIDiv(obj){
            document.getElementById(obj.id+'_PI').remove();
        }
        function setSelectedEditIndex(index){
            selectedEditIndex = index;
            console.log('Selected edit index:'+selectedEditIndex);
        }
        function assignDencrypted(){
            let selectedEditSFId = j$(escapeVfId('Page:mainForm:idSearchVisitor:idAddVisitor:' + selectedEditIndex + ':idAddHiddenId')).val()
            selectedAwsDataId = sfIdToAWSIdMapValue.get(selectedEditSFId);
            console.log('edit awsId:'+selectedAwsDataId);
            document.getElementById('Page:mainForm:AWS_Data_Id__c').value = selectedAwsDataId;
            if(contactInfo.hasOwnProperty(selectedAwsDataId)){
                let selectedAWSData = contactInfo[selectedAwsDataId];
                let contactTypeNode = document.getElementById("Page:mainForm:idSearchVisitor:updateContactType");
                contactTypeNode.value = selectedAWSData.type;
                if(contactTypeNode.value){
                    jQuery(contactTypeNode).change();
                }
                document.getElementById("Page:mainForm:idSearchVisitor:updateContactLastName").value = selectedAWSData.lastName;
                document.getElementById("Page:mainForm:idSearchVisitor:updateContactPhone").value = selectedAWSData.phone;
                document.getElementById("Page:mainForm:idSearchVisitor:updateContactDoctorDivision").value = selectedAWSData.doctorDivision1;
            }
        }
        function GetAWSResultObj(){
            if(aws_result && aws_result.object && aws_result.object.length > 0){
                return aws_result.object[0];
            }
            return null;
        }
        function SetEditObj(){
            let obj = GetAWSResultObj();
            if(obj){
                console.log('Result from AWS:'+JSON.stringify(obj));
                document.getElementById('Page:mainForm:AWS_Data_Id__c').value = obj.dataId;
                document.getElementById("Page:mainForm:idSearchVisitor:updateContactLastName").value = obj.lastName;
                document.getElementById("Page:mainForm:LastName_Encrypted__c").value = obj.lastNameEncrypt;
                document.getElementById("Page:mainForm:idSearchVisitor:updateContactPhone").value = obj.phone;
                document.getElementById("Page:mainForm:Phone_Encrypted__c").value = obj.phoneEncrypt;
                document.getElementById("Page:mainForm:idSearchVisitor:updateContactType").value = obj.type;
                document.getElementById("Page:mainForm:Type_Encrypted__c").value = obj.typeEncrypt;
                document.getElementById("Page:mainForm:idSearchVisitor:updateContactDoctorDivision").value = obj.doctorDivision1;
                document.getElementById("Page:mainForm:Doctor_Division1_Encrypted__c").value = obj.doctorDivision1Encrypt;
            }
        }
        function ProcessPIForAWS(sobjJson, payloadForNewPI) {
            let url = staticResources.newUrl
            let moduleName = AWSService.insertModule;
            if (selectedAwsDataId) {
                moduleName = AWSService.updateModule;
                url = staticResources.updateUrl
            }
            console.log('Payload for AWS:'+payloadForNewPI + ' Module Name:'+moduleName);
            AWSService.postAWS(url,moduleName, payloadForNewPI, function(result){
                aws_result = result;
                SetEditObj();
                saveNew();
            }, staticResources.token);
        }
        function GetEditObj(){
            return JSON.stringify([{
                lastName : document.getElementById("Page:mainForm:idSearchVisitor:updateContactLastName").value,
                phone : document.getElementById("Page:mainForm:idSearchVisitor:updateContactPhone").value,
                dataId:selectedAwsDataId
            }]);
        }
        function saveContactForAWS(){
            document.getElementById("errorMsg").innerHTML = '';
            if(!document.getElementById("Page:mainForm:idSearchVisitor:updateContactLastName").value){
                document.getElementById("errorMsg").innerHTML = '<strong>错误:</strong> 必须填写。';
                return;
            }
            blockme();
            ProcessPIForAWS({},GetEditObj());
        }
        function Trans(){
            AWSService.postAWS(staticResources.transactionUrl,AWSService.confirmTrans, JSON.stringify({
                    "txId":aws_result.txId,
                    "isSuccess":1
            }), function(result){
                window.location.reload();
            }, staticResources.token);
        }
        //Add By Li Jun 20220228 for PIPL End
    </script>
    <style type="text/css">
        div#iframelike {
@@ -111,15 +309,33 @@
    </style>
    <apex:outputPanel id="all">
        <apex:form id="mainForm">
        <!-- Search Contact By Li Jun 20220214 Start-->
        <apex:actionFunction name="serContact" action="{!serContact}" rerender="idRezultVisitor">
            <apex:param name="awsContactIds" assignTo="{!awsContactIds}" value="" />
        </apex:actionFunction>
        <apex:actionFunction name="clearLineInfoList" action="{!clearLineInfoList}" rerender="mainForm" onComplete="unblockUI();">
        </apex:actionFunction>
        <!-- Search Contact By Li Jun 20220214 End-->
        <apex:actionFunction name="updContactP" action="{!updContactP}" rerender="idRezultVisitor,idRegistration">
        <apex:param name="index" assignTo="{!index}" value="" />
        </apex:actionFunction>
        <apex:actionFunction name="updContactM" action="{!updContactM}" rerender="idRezultVisitor">
        <apex:param name="index" assignTo="{!index}" value="" />
        </apex:actionFunction>
        <apex:actionFunction name="editVistor" action="{!editVistor}" rerender="idRegistration" oncomplete="setButtonDisable(document.getElementById('Page:mainForm:idSearchVisitor:idRegSave'), false);">
        <apex:actionFunction name="editVistor" action="{!editVistor}" rerender="idRegistration" oncomplete="assignDencrypted();setButtonDisable(document.getElementById('Page:mainForm:idSearchVisitor:idRegSave'), false);">
        <apex:param name="index" assignTo="{!index}" value=""/>
        </apex:actionFunction>
        <apex:actionFunction name="saveNew" action="{!regContact}" rerender="idRegistration,idRezultVisitor,idAddVisitor,idMessage" onComplete="Trans();">
        </apex:actionFunction>
         <!-- Add By Li Jun for PIPL 20220228 Start -->
         <apex:inputHidden id="LastName_Encrypted__c" value="{!rc.LastName_Encrypted__c}"/>
         <apex:inputHidden id="Phone_Encrypted__c" value="{!rc.Phone_Encrypted__c}"/>
         <apex:inputHidden id="Type_Encrypted__c" value="{!rc.Type_Encrypted__c}"/>
         <apex:inputHidden id="Doctor_Division1_Encrypted__c" value="{!rc.Doctor_Division1_Encrypted__c}"/>
         <apex:inputHidden id="AWS_Data_Id__c" value="{!rc.AWS_Data_Id__c}"/>
         <!-- Add By Li Jun for PIPL 20220221 End -->
            <apex:pageBlock id="idSearchVisitor" >
                <table width="1060" height="50" border="0">
                    <tr>
@@ -154,7 +370,7 @@
                        <th>{!$Label.Search_Condition}</th>
                        <td>&nbsp;</td>
                        <th>{!$Label.Last_Name}</th>
                        <th>{!$Label.First_Name}</th>
                        <!-- <th>{!$Label.First_Name}</th> -->
                        <td>&nbsp;</td>
                        <th>{!$Label.Attribute}</th>
                        <td>&nbsp;</td>
@@ -170,8 +386,9 @@
                        <td>&nbsp;</td>
                        <td>&nbsp;</td>
                        <td>&nbsp;</td>
                        <td><apex:inputText value="{!sc.Search_LastName__c}" style="width:80px" required="false"/></td>
                        <td><apex:inputText value="{!sc.Search_FirstName__c}" style="width:80px" required="false"/></td>
                        <!-- Add Id for pipl by Li Jun 20220214 -->
                        <td><apex:inputText id="searchContactName" value="{!sc.Search_LastName__c}" style="width:80px" required="false"/></td>
                        <!-- <td><apex:inputText value="{!sc.Search_FirstName__c}" style="width:80px" required="false"/></td>  commented for pipl by Li Jun 20220214-->
                        <td>&nbsp;</td>
                        <th><apex:inputField value="{!sc.Type__c}" /></th>
                        <td>&nbsp;</td>
@@ -181,7 +398,9 @@
                        <td>&nbsp;</td>
                        <th>&nbsp;</th>
                        <td>&nbsp;</td>
                        <td><apex:commandButton value="{!$Label.Search}" action="{!serContact}" style="width:100px" rerender="idRezultVisitor" /></td>
                        <!-- Updated By Li Jun for PIPL 20220214 -->
                        <td><input class="btn" type="Button" value="{!$Label.Search}" onclick="queryContactProcess()" style="width:100px" /></td>
                        <!-- <td><apex:commandButton value="{!$Label.Search}" action="{!serContact}" style="width:100px" rerender="idRezultVisitor" /></td> -->
                    </tr>
                    <tr>
                        <td style="border-bottom: 1px solid #888;" colspan="15">&nbsp;</td>
@@ -198,7 +417,7 @@
                            </apex:column>
                            <apex:column >
                                <apex:facet name="header">{!$Label.Visitor_Name}</apex:facet>
                                <apex:outputLink value="/{!scw.con.Id}" id="idName" target="_blank">{!scw.con.Name}</apex:outputLink>
                                <apex:outputLink onmouseover="showPIDiv('{!scw.con.AWS_Data_Id__c}',this)"  onmouseout="hidePIDiv(this)" value="/{!scw.con.Id}" id="idName" target="_blank">{!scw.con.Name}</apex:outputLink>
                                <apex:inputText id="idHiddenId" value="{!scw.conid}" style="display:none" />
                            </apex:column>
                            <apex:column >
@@ -247,7 +466,8 @@
                            </apex:column>
                            <apex:column >
                                <apex:facet name="header">{!$Label.Visitor_Name}</apex:facet>
                                <apex:outputText id="idAddName" value="{!IF(acw.con.Name==null,' ',acw.con.Name)}" />
                                <!-- <apex:outputText id="idAddName" value="{!IF(acw.con.Name==null,' ',acw.con.Name)}" /> -->
                                <apex:outputLink onmouseover="showPIDiv('{!acw.index}',this)"  onmouseout="hidePIDiv(this)" value="/{!acw.conid}" id="idAddName" target="_blank">{!IF(acw.con.Name==null,' ',acw.con.Name)}</apex:outputLink>
                                <apex:inputText id="idAddHiddenId" value="{!acw.conid}" style="display:none" />
                            </apex:column>
                            <apex:column >
@@ -268,7 +488,7 @@
                            </apex:column>
                            <apex:column >
                                <apex:facet name="header">{!$Label.Edit}</apex:facet>
                                <input type="button" id="idEdit" value="{!$Label.Edit}" onclick="setButtonDisable(document.getElementById('Page:mainForm:idSearchVisitor:idRegSave'), true);editVistor('{!acw.index}');" class="btn" style="width:40px"/>
                                <input type="button" id="idEdit" value="{!$Label.Edit}" onclick="setSelectedEditIndex('{!acw.index}');setButtonDisable(document.getElementById('Page:mainForm:idSearchVisitor:idRegSave'), true);editVistor('{!acw.index}');" class="btn" style="width:40px"/>
                            </apex:column>
                        </apex:pageBlockTable>
                        </div>
@@ -283,7 +503,7 @@
                                <input type="button" value="{!$Label.Set}" onclick="addContact();" class="btn"/>
                            </td>
                            <td style="text-align:right">
                                <apex:commandButton id="idRegSave" value="{!$Label.Registration}" action="{!regContact}" style="width:60px" rerender="idRegistration,idRezultVisitor,idAddVisitor,idMessage"/>
                                <apex:commandButton id="idRegSave" value="{!$Label.Registration}" onclick="saveContactForAWS();" style="width:60px" rerender="dummy" />
                            </td>
                        </tr></table>
                    </td></tr>
@@ -298,13 +518,13 @@
                    <tr>
                        <td width= "20">&nbsp;</td>
                        <th width= "80">{!$Label.Attribute}</th>
                        <th width= "80" ><apex:inputField value="{!rc.Type__c}" style="width:66px"/></th>
                        <th width= "80" ><apex:inputField id="updateContactType" value="{!rc.Type__c}" style="width:66px"/></th>
                        <th width= "80" style="text-align:right">{!$Label.Last_Name}</th>
                        <td width= "80" ><span><div class="requiredInput"><div class="requiredBlock"></div><apex:inputField value="{!rc.Search_LastName__c}" style="width:70px" /></div></span></td>
                        <th width= "80" style="text-align:right">{!$Label.First_Name}</th>
                        <td width= "160" colspan="2" rowspan="2"><apex:inputField value="{!rc.FirstName}" style="width:150px" /></td>
                        <td width= "80" ><span><div class="requiredInput"><div class="requiredBlock"></div><apex:inputField id="updateContactLastName" value="{!rc.Search_LastName__c}" style="width:70px" /><div id="errorMsg" class="errorMsg"></div></div></span></td>
                        <!-- <th width= "80" style="text-align:right">{!$Label.First_Name}</th>
                        <td width= "160" colspan="2" rowspan="2"><apex:inputField value="{!rc.FirstName}" style="width:150px" /></td> -->
                        <th width= "80" style="text-align:right">{!$ObjectType.Lead.fields.Phone.Label}</th>
                        <td width= "80"><apex:inputField value="{!rc.phone}" style="width:110px" /></td>
                        <td width= "80"><apex:inputField id="updateContactPhone" value="{!rc.phone}" style="width:110px" /></td>
                        <th width= "80" style="text-align:right">{!$ObjectType.Contact.fields.Supplement__c.Label}</th>
                        <th width= "130" colspan="2" rowspan="3"><apex:inputField value="{!rc.Supplement__c}" style="width:130px" /></th>
                        
@@ -313,7 +533,7 @@
                    <tr>
                        <td>&nbsp;</td>
                        <th colspan="2">{!$ObjectType.Contact.fields.Doctor_Division1__c.Label}</th>
                        <th colspan="2"><apex:inputField value="{!rc.Doctor_Division1__c}" style="width:150px"/></th>
                        <th colspan="2"><apex:inputField id="updateContactDoctorDivision" value="{!rc.Doctor_Division1__c}" style="width:150px"/></th>
                        <th style="text-align:right">{!$Label.Department_Name}</th>
                        <th colspan="3"><apex:inputField value="{!rc.Account_Visitor_Search__c}" style="width:280px" /></th>
                        <th>{!$Label.MyDr}</th>
force-app/main/default/pages/SimpleEventRegister.page
@@ -6,6 +6,10 @@
<apex:includeScript value="{!URLFOR($Resource.jquerysuggestjs)}"/>
<apex:includeScript value="{!URLFOR($Resource.connection20)}"/>
<apex:includeScript value="{!URLFOR($Resource.apex20)}"/>
<!-- Add By Li Jun for PIPL 20220225 -->
<apex:includeScript value="{!URLFOR($Resource.AWSService, 'AWSService.js') }" />
<script src="../../soap/ajax/53.0/connection.js" type="text/javascript"></script>
<!-- Add By Li Jun for PIPL 20220225 -->
<script>
  var ros = '{!$User.State_Hospital__c}';
  var act = '病院';
@@ -282,6 +286,45 @@
    //2021-08-10  mzy  update  SWAG-C5R6GW   询价任务新增字段  end
  }
  //Add By Li Jun 20220225 for PIPL Start
  AWSService.sfSessionId = '{!GETSESSIONID()}';
    var staticResources = JSON.parse('{!staticResource}');
    var contactAWSIds = JSON.parse('{!contactAWSIds}');
    console.log('contactAWSIds:'+JSON.stringify(contactAWSIds));
    var sfIdToContactInfo = {};
    function preparePayloadForSearchContact(){
        let searchPayload = new Object();
        searchPayload.dataIds = contactAWSIds;
        searchPayload.contactName = '';
        return JSON.stringify(searchPayload);
    }
    function searchContactAll(){
        let data = preparePayloadForSearchContact();
        let searchCallBack = function searchCallBack(result){
            let contacts = result.object;
            if(contacts == null){
                return;
            }
            for(var i=0;i<contacts.length;i++){
                let temp = {}
                temp.lastName = contacts[i].lastName?contacts[i].lastName:'';
                if(contacts[i].sfRecordId){
                    sfIdToContactInfo[contacts[i].sfRecordId] = temp;
                }
            }
            console.log('AWS Result:'+JSON.stringify(sfIdToContactInfo));
            let v1Id = j$(escapeVfId('page:form:all:visitSettings:visitor1Id')).value();
            if(sfIdToContactInfo.hasOwnProperty(v1Id)){
                document.getElementById("page:form:all:visitSettings:visitor1").value = sfIdToContactInfo[v1Id].lastName;
            }
            let v2Id = j$(escapeVfId('page:form:all:visitSettings:visitor2Id')).value();
            if(sfIdToContactInfo.hasOwnProperty(v2Id)){
                document.getElementById("page:form:all:visitSettings:visitor2").value = sfIdToContactInfo[v2Id].lastName;
            }
        };
        AWSService.search(staticResources.searchUrl,data,searchCallBack,staticResources.token);
    }
    //Add By Li Jun 20220225 for PIPL End
</script>
<style>
    .visitorplace_results {
@@ -388,10 +431,20 @@
        <!-- 20200922 zh SWAG-BS6BYA 样式调整 start -->
        <!-- 访问对象1 -->
              <apex:inputText label="访问对象" value="{!targetEvent.Visitor1__c}" rendered="{!isHospital}" id="visitor1" onchange="clearVisitorId('visitor1Id');" onClick="searchVisitor2(value);"/>
              <!-- <apex:inputText label="访问对象" value="{!targetEvent.Visitor1__c}" rendered="{!isHospital}" id="visitor1" onchange="clearVisitorId('visitor1Id');" onClick="searchVisitor2(value);"/> -->
              <!-- Add by Li Jun for PIPL 20220303 Start -->
              <apex:inputText label="访问对象" value="{!idVisitor1PI}" rendered="{!isHospital}" id="visitor1" onchange="clearVisitorId('visitor1Id');" onClick="searchVisitor2(value);"/>
              <!-- Add by Li Jun for PIPL 20220303 End -->
              <apex:pageblockSectionItem />
        <!-- 访问对象2 -->
              <apex:inputText label=" " value="{!targetEvent.Visitor2__c}" rendered="{!isHospital}" id="visitor2" onchange="clearVisitorId('visitor2Id');" onClick="searchVisitor2(value);"/>
              <!-- <apex:inputText label=" " value="{!targetEvent.Visitor2__c}" rendered="{!isHospital}" id="visitor2" onchange="clearVisitorId('visitor2Id');" onClick="searchVisitor2(value);"/> -->
               <!-- Add by Li Jun for PIPL 20220303 Start -->
              <apex:inputText label=" " value="{!idVisitor2PI}" rendered="{!isHospital}" id="visitor2" onchange="clearVisitorId('visitor2Id');" onClick="searchVisitor2(value);"/>
              <!-- Add by Li Jun for PIPL 20220303 End -->
              <script>
                    console.log('Load AWS Data');
                    searchContactAll();
              </script>
              <apex:pageblockSectionItem rendered="{!isAgent}"/>
              <!-- <apex:pageblockSectionItem /> -->
        <!-- 询价1 -->
force-app/main/default/pages/StartTrading.page
@@ -1,6 +1,65 @@
<apex:page id="Page" standardController="Lead" extensions="StartTradingController" sidebar="false" action="{!init}">
    <apex:stylesheet value="{!URLFOR($Resource.blockUIcss)}" />
    <apex:includeScript value="{! URLFOR($Resource.AWSService, 'AWSService.js') }" />
    <apex:includeScript value="{!URLFOR($Resource.jquery183minjs)}"/>
    <apex:includeScript value="{!URLFOR($Resource.PleaseWaitDialog)}" />
    <script src="../../soap/ajax/53.0/connection.js" type="text/javascript"></script>
    <script type="text/javascript">
        var staticResources = JSON.parse('{!staticResource}');
        var selectedIndexContact = 0;
        function setSelectedIndex(){
            var myselect=document.getElementById("Page:mainForm:idDayEdit:idCon")
            selectedIndexContact=myselect.selectedIndex
        }
        function preparePayloadForSearchContact() {
            let accountId = document.getElementById('Page:mainForm:idDayEdit:idDep').value;
            if (accountId != '--无--') {
                blockme();
                console.log('accountId:' + accountId);
                //query contact
                sforce.connection.sessionId = '{!GETSESSIONID()}';
                let result = sforce.connection.query("SELECT Id,Name,AWS_Data_Id__c from Contact where AccountId='" + accountId + "'");//sfid,awsdataId
                let dataIds = [];
                let records = result.getArray("records");
                for (let i = 0; i < records.length; i++) {
                    dataIds.push(records[i].AWS_Data_Id__c)
                }
                let searchPayload = new Object();
                searchPayload.dataIds = dataIds;
                searchPayload.contactName = '';
                AWSService.search(staticResources.searchUrl, JSON.stringify(searchPayload), queryBack, staticResources.token);
            }
        }
        var queryBack = function queryBack(result) {
            let select = document.getElementById('Page:mainForm:idDayEdit:idCon');
            //清除select里面的值
            for (var i = select.childNodes.length - 1; i >= 1; i--) {
                select.removeChild(select.childNodes[i]);
            }
            if (select.options[0] == undefined) {
                let blankValue = new Option();
                blankValue.value = '--无--';
                blankValue.text = '--无--';
                select.options.add(blankValue);
            }
            for (var i = 0; i < result.object.length; i++) {
                if (result.object[i].sfRecordId) {
                    let a = new Option();
                    a.value = result.object[i].sfRecordId;
                    a.text = result.object[i].lastName.replace(/"/g, "");
                    select.options.add(a);
                }
            }
            if(selectedIndexContact !=0 ){
                var myselect=document.getElementById("Page:mainForm:idDayEdit:idCon").options
                myselect[selectedIndexContact].selected = true;
            }
            unblockUI();
        }
        //2021/02/21 张华建 查找客户人员 end
        function requiredCheck(){
            var val = document.getElementById('Page:mainForm:idDayEdit:idDep').selectedIndex;
            if (val == 0) {
@@ -14,11 +73,11 @@
    <!-- リード 取引の開始 -->
    <apex:sectionHeader title="{!$ObjectType.Lead.Label}" subtitle="{!$Label.StartTrading_Subtitle}"/>
        <apex:form id="mainForm">
            <apex:pageMessages />
        <apex:pageMessages id="errorMsg" />
            <apex:pageBlock id="idDayEdit" title="" mode="edit" >
                <apex:pageBlockButtons >
                    <!-- 取引の開始 -->
                    <apex:commandButton action="{!start}" value="{!$Label.StartTrading_Subtitle}" onclick="requiredCheck();" />
                <apex:commandButton action="{!start}" value="{!$Label.StartTrading_Subtitle}" onclick="requiredCheck();" reRender="mainForm"/>
                    <!-- キャンセル -->
                    <apex:commandButton action="{!cancel}" value="{!$Label.StartTrading_Cancel}"/>
                </apex:pageBlockButtons>
@@ -35,7 +94,7 @@
                        <td>
                            <apex:selectList value="{!sltDep}" multiselect="false" size="1" id="idDep" style="width:400px;" >
                                <apex:selectOptions value="{!depList}" ></apex:selectOptions>
                                <apex:actionSupport event="onchange" onsubmit="" onbeforedomupdate="" action="{!depChange}" rerender="idCon">
                            <apex:actionSupport event="onchange" onsubmit="" onbeforedomupdate="" action="{!depChange}" rerender="idCon" oncomplete="preparePayloadForSearchContact()">
                                    <apex:param name="sltD" value="{!sltDep}"/>
                                </apex:actionSupport>
                            </apex:selectList>
@@ -45,9 +104,15 @@
                        <td width="100px"></td>
                        <!-- 担当者 -->
                        <td>{!$ObjectType.Contact.Label}</td>
                        <td><apex:selectList value="{!sltCon}" multiselect="false" size="1" id="idCon" style="width:200px;">
                    <td>
                        <apex:selectList value="{!sltCon}" onchange="setSelectedIndex()" multiselect="false" size="1" id="idCon" style="width:200px;">
                                    <apex:selectOptions value="{!conList}" />
                                </apex:selectList>
                        <script>
                            sfdcPage.appendToOnloadQueue(function () {
                                preparePayloadForSearchContact();
                            });
                        </script>
                        </td>
                    </tr>
                    <tr>
force-app/main/default/pages/StraightBackAddress.page
@@ -3,8 +3,24 @@
    <apex:includeScript value="{!URLFOR($Resource.jquery183minjs)}"/>
    <apex:includeScript value="{!URLFOR($Resource.PleaseWaitDialog)}"/>
    <apex:includeScript value="{!URLFOR($Resource.CommonUtilJs)}"/>
    <apex:includeScript value="{! URLFOR($Resource.AWSService, 'AWSService.js') }" />
    <apex:includeScript value="/soap/ajax/40.0/connection.js"/>
    <script type="text/javascript">
        var checkedTrue;
        var tableDataStr = '';
        var staticResource = JSON.parse('{!staticResource}');
        var staticResourceContact = JSON.parse('{!staticResourceContact}');
        var PIData = {};
        var contactDataIds = [];
        var ObjIdDecrypt = '';
        var closeField = '';
        var add_aws_result = '';
        var con_aws_result = '';
        var isAddCon = false;
        var contactInfoStr = '';
        //替换vlookup
        var newSearchContactWindow = null;
        window.onload = () => {
            document.getElementById("tab01").style.height  =  screen.availHeight*0.07+'px';
            document.getElementById("tab02").style.height  =  screen.availHeight*0.53+'px';
@@ -12,20 +28,210 @@
        }
         //编辑按钮
         function onEditorJs(ObjId){
            ObjIdDecrypt = ObjId;
            onEditor(ObjId); 
         }
        //复制按钮
        function onCopyJs(ObjId){
            ObjIdDecrypt = ObjId;
            if(ObjId == ''){
                onCopy('空');//设置为空,便于后端做数据处理
            }else{
                onCopy(ObjId);
            }
        }
        //aws 确认
        function Trans(){
            let b = HasError();
            if(b){
                //清空电话地址邮编
                document.getElementById('allPage:allForm:oppBlock2:UpdAddressId:Telephone__c').value=''
                document.getElementById('allPage:allForm:oppBlock2:UpdAddressId:ZipCode__c').value=''
                document.getElementById('allPage:allForm:oppBlock2:UpdAddressId:Detailed_Address__c').value=''
            }
            AWSService.post(staticResource.transactionUrl, JSON.stringify({
                    "txId":add_aws_result.txId,
                    "isSuccess":b ? 0 : 1
                }), function(result){
                    if(isAddCon){
                        AWSService.post(staticResourceContact.transactionUrl, JSON.stringify({
                            "txId":con_aws_result.txId,
                            "isSuccess":b ? 0 : 1
                        }), function(result){
                            if(!b)
                            window.location.reload();
                        }, staticResourceContact.token);
                    }else{
                        if(!b)
                        window.location.reload();
                    }
                }, staticResource.token);
        }
        function HasError(){
            // if (IsAddmessage) {
            //     return true;
            // }
            let e = document.getElementById("allPage:allForm:message");
            if (!e) {
                return false;
            }
            let divs = j$(e).find("div.message");
            for (let i = 0; i < divs.length; i++) {
                for (let j = 0; j < divs[i].classList.length; j++) {
                    for(let cls of divs[i].classList){
                        if (cls.indexOf('error')>-1) {
                            return true;
                        }
                    }
                }
            }
            return false;
        }
        //解密
        function decrypt(){
            if(PIData[ObjIdDecrypt] == null){
                document.getElementById('allPage:allForm:oppBlock2:UpdAddressId:Contacts__c').value = '';
                //document.getElementById('allPage:allForm:oppBlock2:UpdAddressId:contactIdValue').value = '000000000000000';
                document.getElementById('allPage:allForm:oppBlock2:UpdAddressId:Telephone__c').value = '';
                document.getElementById('allPage:allForm:oppBlock2:UpdAddressId:ZipCode__c').value = '';
                document.getElementById('allPage:allForm:oppBlock2:UpdAddressId:Detailed_Address__c').value = '';
            }else{
                document.getElementById('allPage:allForm:oppBlock2:UpdAddressId:Contacts__c').value = PIData[ObjIdDecrypt].lastName!=null?PIData[ObjIdDecrypt].lastName:'';
                document.getElementById('allPage:allForm:oppBlock2:UpdAddressId:Telephone__c').value = PIData[ObjIdDecrypt].telephone;
                document.getElementById('allPage:allForm:oppBlock2:UpdAddressId:ZipCode__c').value = PIData[ObjIdDecrypt].zipCode;
                document.getElementById('allPage:allForm:oppBlock2:UpdAddressId:Detailed_Address__c').value = PIData[ObjIdDecrypt].detailedAddress;
            }
        }
        function getPIPayload() {
            let leadPayloadList = [];
            var telePhone = document.getElementById('allPage:allForm:oppBlock2:UpdAddressId:Telephone__c').value;
            var zipCode = document.getElementById('allPage:allForm:oppBlock2:UpdAddressId:ZipCode__c').value;
            var detailedAddress = document.getElementById('allPage:allForm:oppBlock2:UpdAddressId:Detailed_Address__c').value;
            let leadPIData = new Object();
            leadPIData.telePhone = telePhone;
            leadPIData.zipCode = zipCode;
            leadPIData.detailedAddress = detailedAddress;
            leadPIData.sfRecordId = '';
            leadPayloadList.push(leadPIData);
            console.log(JSON.stringify(leadPayloadList));
            return JSON.stringify(leadPayloadList);
        }
        //保存方法
        function savaJs(){
            //blockme();
            if(document.getElementById('allPage:allForm:oppBlock2:UpdAddressId:Create_Contacts__c').value != ''){
                isAddCon = true;
            }
            document.getElementById("errorMsg").innerHTML = '';
            if(!document.getElementById("allPage:allForm:oppBlock2:UpdAddressId:Contacts__c").value&&!document.getElementById("allPage:allForm:oppBlock2:UpdAddressId:Create_Contacts__c").value){
                document.getElementById("errorMsg").innerHTML = '<strong>【联系人】和【联系人(新建)】不能同时为空!</strong> ';
                return;
            }else if(document.getElementById("allPage:allForm:oppBlock2:UpdAddressId:Contacts__c").value&&document.getElementById("allPage:allForm:oppBlock2:UpdAddressId:Create_Contacts__c").value){
                document.getElementById("errorMsg").innerHTML = '<strong>【联系人】和【联系人(新建)】不能同时有值!</strong> ';
                return;
            }
            blockme();
            console.log('{!insUpdData}')
            if(document.getElementById("allPage:allForm:oppBlock2:UpdAddressId:Create_Contacts__c").value){
                //new contact
                ProcessPI({},GetEditObj('contact'),'contact',function(){
                    //new address
                    ProcessPI({},
                    GetEditObj('address'),'address',function(){
            save();
                    });
                });
            }else{
                //new address
                ProcessPI({},GetEditObj('address'),'address',function(){
                    save();
                });
            }
        }
        function ProcessPI(sobjJson, payloadForNewPI,type,callback) {
            var sr = ''
            if(type == 'contact'){
                sr = staticResourceContact
            }
            if(type == 'address'){
                sr = staticResource
            }
            let url = sr.newUrl
            /*if (now_edit_id) {
                url = sr.updateUrl
            }*/
            AWSService.post(url, payloadForNewPI, function(result){
                if(type == 'contact'){
                    con_aws_result = result
                }if(type == 'address'){
                    add_aws_result = result
                }
                SetEditObj(type);
                if(callback){
                    callback();
                }
            }, sr.token);
        }
        function SetEditObj(type){
            let obj = GetAWSResultObj(type);
            if(obj){
                if(type=='contact'){
                    document.getElementById("allPage:allForm:oppBlock2:UpdAddressId:Con_AWS_Data_Id__c").value      = obj.dataId;
                    document.getElementById("allPage:allForm:oppBlock2:UpdAddressId:Create_Contacts__c").value      = obj.lastName;
                    document.getElementById("allPage:allForm:oppBlock2:UpdAddressId:LastName_Encrypted__c").value   = obj.lastNameEncrypt;
                }
                if(type=='address'){
                    document.getElementById("allPage:allForm:oppBlock2:UpdAddressId:Add_AWS_Data_Id__c").value              = obj.dataId;
                    document.getElementById("allPage:allForm:oppBlock2:UpdAddressId:Telephone__c").value                    = obj.telephone;
                    document.getElementById("allPage:allForm:oppBlock2:UpdAddressId:Telephone_Encrypted__c").value          = obj.telephoneEncrypt;
                    document.getElementById("allPage:allForm:oppBlock2:UpdAddressId:ZipCode__c").value                      = obj.zipCode;
                    document.getElementById("allPage:allForm:oppBlock2:UpdAddressId:ZipCode_Encrypted__c").value            = obj.zipCodeEncrypt;
                    document.getElementById("allPage:allForm:oppBlock2:UpdAddressId:Detailed_Address__c").value             = obj.detailedAddress;
                    document.getElementById("allPage:allForm:oppBlock2:UpdAddressId:Detailed_Address_Encrypted__c").value   = obj.detailedAddressEncrypt;
                }
            }
        }
        function GetAWSResultObj(type){
            if(type == 'contact'){
                if(con_aws_result && con_aws_result.object && con_aws_result.object.length > 0){
                    return con_aws_result.object[0];
                }
            }
            if(type == 'address'){
                if(add_aws_result && add_aws_result.object && add_aws_result.object.length > 0){
                    return add_aws_result.object[0];
                }
            }
            return null;
        }
        function GetEditObj(type){
            if(type=='contact'){
                //new contact
                return JSON.stringify([{
                    lastName : document.getElementById("allPage:allForm:oppBlock2:UpdAddressId:Create_Contacts__c").value,
                    dataId : document.getElementById("allPage:allForm:oppBlock2:UpdAddressId:Con_AWS_Data_Id__c").value,
                }]);
            }
            if(type == 'address'){
                //new address
                return JSON.stringify([{
                    dataId : document.getElementById("allPage:allForm:oppBlock2:UpdAddressId:Add_AWS_Data_Id__c").value,
                    telephone : document.getElementById("allPage:allForm:oppBlock2:UpdAddressId:Telephone__c").value,
                    zipCode : document.getElementById("allPage:allForm:oppBlock2:UpdAddressId:ZipCode__c").value,
                    detailedAddress : document.getElementById("allPage:allForm:oppBlock2:UpdAddressId:Detailed_Address__c").value,
                }]);
            }
        }
        //复选框选中触发事件
@@ -48,7 +254,33 @@
        }
        function searchBtnJs(){
            blockme();
            searchBtn();
            var addressDataIds = '';
            //查询地址
            if(document.getElementById('allPage:allForm:searchBlock:txtAddressId').value != ''){
                //发送aws请求,然后再发送给controller
                new Promise(function(resolve, reject){
                    let queryBack = function queryBack(result){
                        if(result.object==null || result.object.length==0){
                            searchBtn('\''+addressName+'\'');
                            return
                        }else{
                            for(var i=0;i<result.object.length;i++){
                                addressDataIds += ',\''+ result.object[i].dataId + '\'';
                            }
                            addressDataIds = addressDataIds.substring(1);
                            resolve('success');
                        }
                    };
                    var addressName = document.getElementById('allPage:allForm:searchBlock:txtAddressId').value;
                    AWSService.queryAddress('https://sfpi-mebg-test.olympuschina.com/api/address/search',addressName.trim(),queryBack,staticResource.token);
                }).then(function(data){
                    console.log('data = '+data)
                    console.log('addressDataIds = '+addressDataIds)
                    searchBtn(addressDataIds);
                });
            }else{
                searchBtn(addressDataIds);
            }
        }
        //采用按钮
        function onAdoptJs(objId){
@@ -99,26 +331,223 @@
        function refreshJs(){
            window.location.reload();
        }
        //2022 02 28 张华建 display PI Data start
        //queryPI();
        function q1(){
            var index = 0;
            var correct = 0;
            var p = new Promise(function(resolve, reject){
                //查询地址的PI数据
                let searchCallBack = function searchCallBack(result,Id,awsDataId){
                    index++;
                    let contacts = result.object;
                    if(contacts == null){
                        console.log('contacts == null')
                        return;
                    }
                    let temp = {}
                    temp.telephone = result.object.telephone;
                    temp.zipCode = result.object.zipCode;
                    temp.detailedAddress = result.object.detailedAddress;
                    temp.awsDataId = awsDataId;
                    PIData[Id] = temp;
                };
                for(var i=0;i<tableDataStr.length;i++){
                    if(tableDataStr[i].address.Contacts__r){
                        correct++;
                        AWSService.queryRepair(staticResource.queryUrl,tableDataStr[i].address.AWS_Data_Id__c,tableDataStr[i].address.Id,tableDataStr[i].address.Contacts__r.AWS_Data_Id__c,searchCallBack,staticResource.token);
                    }
                }
                var interval=self.setInterval(function (){
                    console.log('setInterval index= ' + index);
                    if(index == correct){
                        console.log('PIDATA = ' + JSON.stringify(PIData))
                        resolve('success')
                        clearInterval(interval)
                    }
                },1000);
            });
            return p;
        }
        function q2(){
            sforce.connection.sessionId = '{!GETSESSIONID()}';
            var p = new Promise(function(resolve, reject){
                //查询联系人的数据
                let queryBack = function queryBack(result) {
                    let contacts = result.object;
                    if(contacts == null){
                        return;
                    }
                    for(var i=0;i<result.object.length;i++){
                        for(let key in PIData){
                            if(result.object[i].dataId == PIData[key].awsDataId){
                                PIData[key].lastName = result.object[i].lastName;
                            }
                        }
                    }
                }
                var condition = ''
                for(var i=0;i<tableDataStr.length;i++){
                    if(tableDataStr[i].address.Contacts__c){
                        condition += "," + "\'"+tableDataStr[i].address.Contacts__c+"\'";
                    }
                }
                condition = condition.substr(1);
                console.log('condition = ' + condition);
                var record = sforce.connection.query("select AWS_Data_Id__c from Contact where id in("+condition+")");
                var records = record.getArray("records");
                for(var i =0;i<records.length;i++){
                    if(records[i].AWS_Data_Id__c){
                        contactDataIds.push(records[i].AWS_Data_Id__c);
                    }
                }
                let searchPayload = new Object();
                searchPayload.dataIds = contactDataIds;
                searchPayload.contactName = '';
                console.log('contactDataIds = ' + contactDataIds);
                AWSService.search(staticResourceContact.searchUrl, JSON.stringify(searchPayload), queryBack, staticResourceContact.token);
            });
        }
        //查询敏感字段
        function queryPI(){
            //blockme();
            tableDataStr = JSON.parse(document.getElementById('allPage:allForm:tableValueFrontEnd').value);
            PIData = {};
            contactDataIds = [];
            console.log(tableDataStr)
            q1().then(function(data){
                        return q2(data);
                    })
            //unblockUI();
        }
        function showPIDiv(awsDataId){
            if(awsDataId.length == 0 || PIData[awsDataId]==null){
                return
            }
            console.log('awsDataId Value:'+awsDataId);
            let parentNode = document.getElementById(awsDataId);
            let createDiv = document.createElement("div");
            createDiv.id = awsDataId+"_PI";
            let piInformation = '';
            if(PIData[awsDataId].lastName){
                piInformation = '联系人: '+PIData[awsDataId].lastName+
                '\n电话: '+PIData[awsDataId].telephone+
                '\n邮编: '+PIData[awsDataId].zipCode+
                '\n详细地址: '+PIData[awsDataId].detailedAddress
            }else{
                piInformation = '联系人: null'+
                '\n电话: '+PIData[awsDataId].telephone+
                '\n邮编: '+PIData[awsDataId].zipCode+
                '\n详细地址: '+PIData[awsDataId].detailedAddress
            }
            //let piInformation = 'Name:'+contact['943114607025717249'].lastName +'\n' +'Phone:'+contact['943114607025717249'].phone
            createDiv.innerText = piInformation;
            let x=window.event.x;
            let y=window.event.y;
            createDiv.style.left=x;
            createDiv.style.top=y;
            createDiv.style.background="#dddddd";
            createDiv.style.position = "absolute";
            parentNode.appendChild(createDiv);
        }
        function hidePIDiv(awsDataId){
            if(awsDataId.length == 0 || PIData[awsDataId]==null){
                return
            }
            document.getElementById(awsDataId+'_PI').remove();
        }
        function replaceSearchContactLookup() {
            if(document.getElementById('allPage:allForm:oppBlock2:UpdAddressId:Contacts__c') != null){
                let contactHtmlString = '<img src="/img/s.gif" onclick="searchContact(\'allPage:allForm:contactId\',\'allPage:allForm:oppBlock2:UpdAddressId:Contacts__c\')" alt="Reference Document Number Lookup" class="lookupIcon"  title="Reference Document Number Lookup (New Window)"/>';
                let lookUpNode = htmlToElement(contactHtmlString);
                console.log(lookUpNode);
                let parentNode = document.getElementById('allPage:allForm:oppBlock2:UpdAddressId:Contacts__c').parentNode;
                parentNode.appendChild(lookUpNode);
                if(contactInfoStr){
                    console.log('closePopup:'+contactInfoStr);
                    let contactInfo = JSON.parse(contactInfoStr);
                    let contactNodeId = 'allPage:allForm:oppBlock2:UpdAddressId:contactIdValue';
                    document.getElementById(contactNodeId).value = contactInfo.ContactId;
                    document.getElementById(closeField).value = contactInfo.Name;
                }
            }
        }
        function htmlToElement(html) {
            var template = document.createElement('template');
            html = html.trim(); // Never return a text node of whitespace as the result
            template.innerHTML = html;
            return template.content.firstChild;
        }
        //自定义lookup查询
        function searchContact(contactNodeId,field){
            closeField = field;
            let accountValue = "";
            if (document.getElementById('allPage:allForm:oppBlock2:UpdAddressId:Customer__r_Name')!=null) {
                let accountNodeId = document.getElementById('allPage:allForm:oppBlock2:UpdAddressId:Customer__r_Name').id + '_lkid';
                accountValue = document.getElementById(accountNodeId).value;
            }
            console.log(accountValue);
            if(accountValue !='000000000000000'){
                let baseUrl = "/apex/SearchContactPage";
                let suffixUrl = "?contactId="+contactNodeId+"&accountId="+accountValue;
                let newSearchContactParam = 'height=600,width=800,left=100,top=100,dialogHide=true,resizable=no,scrollbars=yes,toolbar=no,status=no';
                newSearchContactWindow = window.open(baseUrl+suffixUrl, 'Popup', newSearchContactParam);
                if (window.focus) {
                    newSearchContactWindow.focus();
                }
                return false;
            }else{
                console.log('请先选择客户再选择联系人')
            }
        }
        function closePopupWindow() {
            if (null != newSearchContactWindow) {
                newSearchContactWindow.close();
            }
            contactInfoStr = document.getElementById('allPage:allForm:contactId').value;
            console.log('closePopup:'+contactInfoStr);
            let contactInfo = JSON.parse(contactInfoStr);
            let contactNodeId = 'allPage:allForm:oppBlock2:UpdAddressId:contactIdValue';
            document.getElementById(contactNodeId).value = contactInfo.ContactId;
            document.getElementById(closeField).value = contactInfo.Name;
        }
        //2022 02 28 张华建 display PI Data end
    </script>
    <apex:form id="allForm">
        <apex:inputHidden id="tableValueFrontEnd" value="{!tableDataStr}"/>
        <apex:inputHidden value="{!contactId}" id="contactId"/>
        <apex:inputHidden value="{!insUpdDataStr}" id="insUpdDataStr"/>
        <div id="tab01">
            <!-- 页面数据初始化方法 -->
            <apex:actionFunction name="init" action="{!init}" rerender="oppBlock1,message,checEventFrame" onComplete="unblockUI();"></apex:actionFunction>
            <!-- 检索数据查询方法 -->
            <apex:actionFunction name="searchBtn" action="{!searchBtn}" rerender="oppBlock1,message,checEventFrame" onComplete="unblockUI();"></apex:actionFunction>
            <apex:actionFunction name="searchBtn" action="{!searchBtn}" rerender="oppBlock1,message,checEventFrame,tableValueFrontEnd" onComplete="unblockUI();">
                <apex:param name="addressDataIds" assignTo="{!addressDataIds}" value=""></apex:param>
            </apex:actionFunction>
            <!-- 采用方法 -->
            <apex:actionFunction name="adoptSave" action="{!adoptSave}" rerender="oppBlock2,message" onComplete="unblockUI();">
                <apex:param name="adoptId" assignTo="{!adoptId}" value="" />
                <apex:param name="isUpload" assignTo="{!isUpload}" value="" />
            </apex:actionFunction>
            <!-- 保存和修改方法 -->
            <apex:actionFunction name="save" action="{!save}" rerender="oppBlock2,message" onComplete="unblockUI();{!IF(isSearchBtn,'searchBtnJs()',false)}"></apex:actionFunction>
            <apex:actionFunction name="save" action="{!save}" rerender="oppBlock2,message" onComplete="unblockUI();{!IF(isSearchBtn,'searchBtnJs()',false)};Trans()"></apex:actionFunction>
            <!-- 点击修改按钮获取修改数据方法 -->
            <apex:actionFunction name="onEditor" action="{!onEditor}" rerender="oppBlock2,checEventFrame" onComplete="unblockUI();">
            <apex:actionFunction name="onEditor" action="{!onEditor}" rerender="oppBlock2,checEventFrame,insUpdDataStr" onComplete="decrypt();unblockUI();">
                <apex:param name="UpdId" assignTo="{!UpdId}" value="" />
            </apex:actionFunction>
            <!-- 复制方法 -->
            <apex:actionFunction name="onCopy" action="{!onCopy}" rerender="oppBlock2,checEventFrame" onComplete="unblockUI();">
            <apex:actionFunction name="onCopy" action="{!onCopy}" rerender="oppBlock2,checEventFrame," onComplete="decrypt();unblockUI();">
                <apex:param name="UpdId" assignTo="{!UpdId}" value="" />
            </apex:actionFunction>
            <!-- 返回父页面 -->
@@ -148,7 +577,7 @@
                            </a>
                        </td>
                        <td style="width: 20%">
                            <apex:commandButton onclick="searchBtnJs();return false;"  rendered="true" value="检索" style="width:60px;"/>
                            <apex:commandButton onclick="searchBtnJs();return false;"  rendered="true" value="检索" style="width:60px;"  onComplete="unblockUI();"/>
                            &nbsp;&nbsp;
                            <!-- <apex:commandButton onclick="onAdoptJs();return false;"  rendered="true" value="采用" style="width:60px;background:#98c1fbf7"/>
                            &nbsp;&nbsp; -->
@@ -202,8 +631,9 @@
                                        <td align="left"  style="vertical-align: inherit;border-width: 0px 1px 1px 0px;">
                                            <apex:outputfield value="{!or.address.Customer__c}" />
                                        </td>
                                        <td align="left"  style="vertical-align: inherit;border-width: 0px 1px 1px 0px;">
                                            <apex:outputfield value="{!or.address.Contacts__c}" />
                                        <td align="left"  style="vertical-align: inherit;border-width: 0px 1px 1px 0px;" aws-data-id="{!or.address.AWS_Data_Id__c}">
                                            <!-- <apex:outputfield value="{!or.address.Contacts__c}" id="{!or.address.Contacts__c}_{!or.address.Id}"/> -->
                                            <a href="#" id="{!or.address.Id}" onmouseover="showPIDiv('{!or.address.Id}')" onmouseout="hidePIDiv('{!or.address.Id}')"  aws-data-id="{!or.address.Contacts__r.AWS_Data_Id__c}">{!or.address.Contacts__r.Name}</a>
                                        </td>
                                        <td align="left" style="vertical-align: inherit;border-width: 0px 1px 1px 0px;">
                                            <apex:outputText value="{!or.address.Telephone__c}" />
@@ -233,6 +663,10 @@
                                    <apex:variable value="{!cnt + 1}" var="cnt" />
                                </apex:repeat>
                            </tbody>
                            <script>
                                console.log('queryPI();')
                                queryPI();
                            </script>
                        </table>
                    </apex:outputPanel>
                </apex:pageblocksection>
@@ -243,7 +677,13 @@
                <apex:pageblocksection title="编辑地址" id="UpdAddressId" rendered="true" columns="4">
                    <apex:inputfield value="{!insUpdData.Address_Classification__c}" id="Address_Classification__c" />
                    <apex:inputfield value="{!insUpdData.Customer__c}" id="Customer__r_Name" required="false" />
                    <apex:inputfield value="{!insUpdData.Contacts__c}" id="Contacts__c" required="false"/>
                    <!-- Before PIPL 20220308 -->
                    <!-- <apex:inputfield value="{!insUpdData.Contacts__c}" id="Contacts__c" required="false"/> -->
                    <!-- Add By Li Jun for PIPL 20220308 Start -->
                    <apex:inputText label="联系人" disabled="true" value="{!contactNameValue}" id="Contacts__c">
                    </apex:inputText>
                    <apex:inputHidden id="contactIdValue" value="{!contactIdValue}"/>
                     <!-- Add By Li Jun for PIPL 20220308 End -->
                    <apex:inputfield value="{!insUpdData.Create_Contacts__c}" id="Create_Contacts__c" required="false"/>
                    <apex:inputfield value="{!insUpdData.Province__c}" id="Province__r_Name" style="" />
@@ -253,11 +693,24 @@
                    <!-- <apex:pageblockSectionItem /> -->
                    <!-- <apex:inputTextarea value="{!insUpdData.Detailed_Address__c}" id="Detailed_Address__c" style="resize:vertical;width: 90%" rows="3" cols="3"/> -->
                    <apex:inputfield value="{!insUpdData.Detailed_Address__c}" id="Detailed_Address__c" style="resize:vertical;width: 98%"/>
                    <div id="errorMsg" class="errorMsg"></div>
                    <apex:inputHidden id="LastName_Encrypted__c"         value="{!newCon.LastName_Encrypted__c}"/>
                    <apex:inputHidden id="Con_AWS_Data_Id__c"            value="{!newCon.AWS_Data_Id__c}"/>
                    <apex:inputHidden id="Add_AWS_Data_Id__c"            value="{!insUpdData.AWS_Data_Id__c}"/>
                    <apex:inputHidden id="Telephone_Encrypted__c"        value="{!insUpdData.Telephone_Encrypted__c}"/>
                    <apex:inputHidden id="ZipCode_Encrypted__c"          value="{!insUpdData.ZipCode_Encrypted__c}"/>
                    <apex:inputHidden id="Detailed_Address_Encrypted__c" value="{!insUpdData.Detailed_Address_Encrypted__c}"/>
                </apex:pageblocksection>
                <div style="text-align: center;">
                    <apex:commandButton value="保存" onclick="savaJs();return false;" rendered="true" />
                    <apex:commandButton immediate="true" value="保存" onclick="savaJs();" rerender="dummy"  />
                </div>
                <script>
                    replaceSearchContactLookup();
                </script>
            </apex:pageBlock>
        </div>
    </apex:form>
force-app/main/default/pages/XinDailyReport.page
@@ -9,6 +9,10 @@
        <apex:includeScript value="{!URLFOR($Resource.CommonUtilJs)}"/>
        <apex:includeScript value="/soap/ajax/29.0/connection.js"/>
        <apex:includeScript value="/soap/ajax/29.0/apex.js"/>
        <!-- Add By Li Jun for PIPL 20220225 -->
        <apex:includeScript value="{!URLFOR($Resource.AWSService, 'AWSService.js') }" />
        <script src="../../soap/ajax/53.0/connection.js" type="text/javascript"></script>
        <!-- Add By Li Jun for PIPL 20220225 -->
        <!-- <apex:includeScript value="{!URLFOR($Resource.connection20)}"/>
        <apex:includeScript value="{!URLFOR($Resource.apex20)}"/> -->
        <apex:includeScript value="{!URLFOR($Resource.jquerydoubletapjs)}"/>
@@ -63,6 +67,51 @@
            var hiddenDivShowFlg = false;
            var StatusCheck = '{!report.Status_With_Check__c}'; //20210426 zh
            sforce.connection.sessionId = '{!$Api.Session_ID}';
            //Add By Li Jun 20220225 for PIPL Start
            AWSService.sfSessionId = '{!GETSESSIONID()}';
            var staticResources = JSON.parse('{!staticResource}');
            var contactAWSIds = JSON.parse('{!contactAWSIds}');
            console.log('contactAWSIds:'+JSON.stringify(contactAWSIds));
            var sfIdToContactInfo = {};
            function preparePayloadForSearchContact(){
                let searchPayload = new Object();
                searchPayload.dataIds = contactAWSIds;
                searchPayload.contactName = '';
                return JSON.stringify(searchPayload);
            }
            function searchContactAll(){
                let data = preparePayloadForSearchContact();
                let searchCallBack = function searchCallBack(result){
                    let contacts = result.object;
                    if(contacts == null){
                        return;
                    }
                    for(var i=0;i<contacts.length;i++){
                        let temp = {}
                        temp.lastName = contacts[i].lastName?contacts[i].lastName:'';
                        if(contacts[i].sfRecordId){
                            sfIdToContactInfo[contacts[i].sfRecordId] = temp;
                        }
                    }
                    console.log('AWS Result:'+JSON.stringify(sfIdToContactInfo));
                    let allSizeForAct =document.getElementById('Page:mainForm:idDayEdit:AllSize').value;
                    console.log('Act size:'+allSizeForAct);
                    for(let i=0;i<allSizeForAct;i++){
                        for(let j=1;j<6;j++){
                            let contactIdForVis = document.getElementById("Page:mainForm:idDayEdit:idActivities:"+i+":idVisitor"+j+"_IdHidden").value;
                            if(contactIdForVis){
                                console.log('SFId for Contact:'+contactIdForVis);
                                if(sfIdToContactInfo.hasOwnProperty(contactIdForVis)){
                                    document.getElementById("Page:mainForm:idDayEdit:idActivities:"+i+":idVisitor"+j).value = sfIdToContactInfo[contactIdForVis].lastName;
                                }
                            }
                        }
                    }
                };
                AWSService.search(staticResources.searchUrl,data,searchCallBack,staticResources.token);
            }
            //Add By Li Jun 20220225 for PIPL End
            //window.document.onkeydown= onKeyEvent;
            function initSetPage() {
                // 2018/11/21 SWAG-B6Q8BS 初始化设置颜色使用
@@ -1051,15 +1100,24 @@
                                    <tr>
                                        <th>{!$Label.Visitor}</th><!--访问对象-->
                                        <td>&nbsp;</td>
                                        <td colspan="5"><span><div class="requiredInput"><div class="requiredBlock"></div><apex:inputField id="idVisitor1" value="{!a.act.Visitor1__c}" style="width:100px" onchange="clearVisitorId({!a.index},'idVisitor1_IdHidden');" onClick="searchVisitor2({!a.index},value);return false;" /></div></span><apex:inputText id="idVisitor1_IdHidden" value="{!a.act.Visitor1_ID__c}" style="display:none"/></td>
                                        <td colspan="5"><span><div class="requiredInput"><div class="requiredBlock"></div>
                                            <apex:inputText id="idVisitor1" value="{!idVisitor1PI}" style="width:100px" onchange="clearVisitorId({!a.index},'idVisitor1_IdHidden');" onClick="searchVisitor2({!a.index},value);return false;" /></div></span><apex:inputText id="idVisitor1_IdHidden" value="{!a.act.Visitor1_ID__c}" style="display:none"/></td>
                                        <td>&nbsp;</td>
                                        <td colspan="2"><apex:inputField id="idVisitor2" value="{!a.act.Visitor2__c}" style="width:100px" onchange="clearVisitorId({!a.index},'idVisitor2_IdHidden');" onClick="searchVisitor2({!a.index},value);return false;" /><apex:inputText id="idVisitor2_IdHidden" value="{!a.act.Visitor2_ID__c}" style="display:none"/></td>
                                        <td colspan="2">
                                            <apex:inputText id="idVisitor2" value="{!idVisitor2PI}" style="width:100px" onchange="clearVisitorId({!a.index},'idVisitor2_IdHidden');" onClick="searchVisitor2({!a.index},value);return false;" /><apex:inputText id="idVisitor2_IdHidden" value="{!a.act.Visitor2_ID__c}" style="display:none"/></td>
                                            <!-- <apex:inputField id="idVisitor2" value="{!a.act.Visitor2__c}" style="width:100px" onchange="clearVisitorId({!a.index},'idVisitor2_IdHidden');" onClick="searchVisitor2({!a.index},value);return false;" /><apex:inputText id="idVisitor2_IdHidden" value="{!a.act.Visitor2_ID__c}" style="display:none"/></td> -->
                                        <td>&nbsp;</td>
                                        <td><apex:inputField id="idVisitor3" value="{!a.act.Visitor3__c}" style="width:100px" onchange="clearVisitorId({!a.index},'idVisitor3_IdHidden');" onClick="searchVisitor2({!a.index},value);return false;" /><apex:inputText id="idVisitor3_IdHidden" value="{!a.act.Visitor3_ID__c}" style="display:none"/></td>
                                        <td>
                                            <apex:inputText id="idVisitor3" value="{!idVisitor3PI}" style="width:100px" onchange="clearVisitorId({!a.index},'idVisitor3_IdHidden');" onClick="searchVisitor2({!a.index},value);return false;" /><apex:inputText id="idVisitor3_IdHidden" value="{!a.act.Visitor3_ID__c}" style="display:none"/></td>
                                            <!-- <apex:inputField id="idVisitor3" value="{!a.act.Visitor3__c}" style="width:100px" onchange="clearVisitorId({!a.index},'idVisitor3_IdHidden');" onClick="searchVisitor2({!a.index},value);return false;" /><apex:inputText id="idVisitor3_IdHidden" value="{!a.act.Visitor3_ID__c}" style="display:none"/></td> -->
                                        <td>&nbsp;</td>
                                        <td><apex:inputField id="idVisitor4" value="{!a.act.Visitor4__c}" style="width:100px" onchange="clearVisitorId({!a.index},'idVisitor4_IdHidden');" onClick="searchVisitor2({!a.index},value);return false;" /><apex:inputText id="idVisitor4_IdHidden" value="{!a.act.Visitor4_ID__c}" style="display:none"/></td>
                                        <td>
                                            <apex:inputText id="idVisitor4" value="{!idVisitor4PI}" style="width:100px" onchange="clearVisitorId({!a.index},'idVisitor4_IdHidden');" onClick="searchVisitor2({!a.index},value);return false;" /><apex:inputText id="idVisitor4_IdHidden" value="{!a.act.Visitor4_ID__c}" style="display:none"/></td>
                                            <!-- <apex:inputField id="idVisitor4" value="{!a.act.Visitor4__c}" style="width:100px" onchange="clearVisitorId({!a.index},'idVisitor4_IdHidden');" onClick="searchVisitor2({!a.index},value);return false;" /><apex:inputText id="idVisitor4_IdHidden" value="{!a.act.Visitor4_ID__c}" style="display:none"/></td> -->
                                        <td>&nbsp;</td>
                                        <td><apex:inputField id="idVisitor5" value="{!a.act.Visitor5__c}" style="width:100px" onchange="clearVisitorId({!a.index},'idVisitor5_IdHidden');" onClick="searchVisitor2({!a.index},value);return false;" /><apex:inputText id="idVisitor5_IdHidden" value="{!a.act.Visitor5_ID__c}" style="display:none"/></td>
                                        <td>
                                            <apex:inputText id="idVisitor5" value="{!idVisitor5PI}" style="width:100px" onchange="clearVisitorId({!a.index},'idVisitor5_IdHidden');" onClick="searchVisitor2({!a.index},value);return false;" /><apex:inputText id="idVisitor5_IdHidden" value="{!a.act.Visitor5_ID__c}" style="display:none"/></td>
                                            <!-- <apex:inputField id="idVisitor5" value="{!a.act.Visitor5__c}" style="width:100px" onchange="clearVisitorId({!a.index},'idVisitor5_IdHidden');" onClick="searchVisitor2({!a.index},value);return false;" /><apex:inputText id="idVisitor5_IdHidden" value="{!a.act.Visitor5_ID__c}" style="display:none"/></td> -->
                                        <td>&nbsp;</td>
                                        <th>{!$Label.Main_Visit_Location}</th>
                                        <td>&nbsp;</td>
@@ -1535,6 +1593,10 @@
                            </fieldset>          
                             <!-- 20200420 任务日报管理 add gzw end -->
                            </apex:repeat>
                            <script>
                                console.log('Load AWS Data');
                                searchContactAll();
                            </script>
                        </apex:outputPanel>
                        <apex:outputPanel id="idAddActPanel">
                        <table class="formtable" width="1200" border="0">
force-app/main/default/triggers/ContactHpDeptUpd.trigger
@@ -3,12 +3,14 @@
    List<String> accIds = new List<String>();
    List<String> FirstNameList = new List<String>();
    List<String> LastnameList = new List<String>();
    List<String> LastnameEncryptedList = new List<String>();
    List<id> Hospital_id_list = new List<id>();
    List<id> ACCOUNT_id_list = new List<id>();
    Map<String,Contact> mapCon = new Map<String,Contact>();
//***************************************INSERT 2016-12-14 By ZDF START*************************************
//          增加“新增客户人员入例规则”
//***************************************INSERT 2016-12-14 By ZDF START*************************************
//2022-02-10    PI改造,用LastName_Encrypted__c替代原有的Name作为mapCon映射的键
    for(Contact a : Trigger.new) {
        if (Trigger.isInsert
                || (Trigger.isUpdate
@@ -21,8 +23,9 @@
        if(Trigger.isInsert&&a.Ignore_Same_Name__c==false){
            FirstNameList.add(a.firstname);
            LastnameList.add(a.Lastname);
            LastnameEncryptedList.add(a.LastName_Encrypted__c);
            ACCOUNT_id_list.add(a.Accountid);
            mapCon.put((a.firstname+a.Lastname),a);
            mapCon.put(a.LastName_Encrypted__c,a);
            system.debug('========1111111');
        }
@@ -59,9 +62,10 @@
                                        from 
                                                Contact 
                                        where   
                                                firstname  in:FirstNameList
                                        and
                                                Lastname   in:LastnameList
                                        //         firstname  in:FirstNameList
                                        // and
                                        //         Lastname   in:LastnameList
                                        LastName_Encrypted__c in : LastnameEncryptedList
                                        and     
                                            (   
                                                Account.Parent.Parentid  in:Hospital_id_list
@@ -73,21 +77,24 @@
                                ];
        system.debug('========1212121212'+FirstNameList);
        system.debug('========1212121212'+LastnameList);
        system.debug('========1212121212'+LastnameEncryptedList);
        system.debug('========1212121212'+Hospital_id_list);
        if(CntingList.size()>0){
            system.debug('========2222222'+CntingList.size());
            Contact Cnting = CntingList[0];
            for(Contact a : Trigger.new) {
                system.debug('========3333333');
                if(mapCon.containsKey(a.firstname+a.Lastname)){
                system.debug('========333333');
                if( Cnting.Account.Parent.Parent.Name   !=  null    ){
                        a.addError('该客户人员名字已存在,在'+Cnting.Account.Parent.Parent.Name+'医院下属 '+Cnting.Account.Parent.Name+'战略科室的 '+Cnting.Account.Name+'科室,请修改,或者勾选“不是重复的客户名”后,再次点击保存'+Cnting);
                    }   else if (   Cnting.Account.Parent.Name  !=null  ){
                        a.addError('该客户人员名字已存在,在'+Cnting.Account.Parent.Name+'医院的 '+Cnting.Account.Name+' 战略科室下,请修改,或者勾选“不是重复的客户名”后,再次点击保存'+Cnting);
                    }   else if (   Cnting.Account.Name !=  null    ){
                        a.addError('该客户人员名字已存在,在'+Cnting.Account.Name+'医院,请修改,或者勾选“不是重复的客户名”后,再次点击保存'+Cnting);
                    }
                if(mapCon.containsKey(a.LastName_Encrypted__c)){
                    //For PIPL testing by Li Jun 20220308 Start
                    // system.debug('========333333');
                    // if( Cnting.Account.Parent.Parent.Name   !=  null    ){
                    //         a.addError('该客户人员名字已存在,在'+Cnting.Account.Parent.Parent.Name+'医院下属 '+Cnting.Account.Parent.Name+'战略科室的 '+Cnting.Account.Name+'科室,请修改,或者勾选“不是重复的客户名”后,再次点击保存');
                    //     }   else if (   Cnting.Account.Parent.Name  !=null  ){
                    //         a.addError('该客户人员名字已存在,在'+Cnting.Account.Parent.Name+'医院的 '+Cnting.Account.Name+' 战略科室下,请修改,或者勾选“不是重复的客户名”后,再次点击保存');
                    //     }   else if (   Cnting.Account.Name !=  null    ){
                    //         a.addError('该客户人员名字已存在,在'+Cnting.Account.Name+'医院,请修改,或者勾选“不是重复的客户名”后,再次点击保存');
                    //     }
                    //For PIPL testing by Li Jun 20220308 End
                }
            }   
        }
force-app/main/default/triggers/Repair.trigger
@@ -18,10 +18,12 @@
    //wangweipeng  20210727   end
    if ((Trigger.isAfter && Trigger.isInsert) || (Trigger.isAfter && Trigger.isUpdate) || (Trigger.isAfter && Trigger.isDelete)) {
        if(!(System.isFuture()||System.isBatch())){// Add By Lijun 20220303 to avoid mutiple execute
        NFM103Controller.NFM103Trigger(Trigger.new, Trigger.newMap, Trigger.old, Trigger.oldMap);
        NFM603Controller.NFM603Trigger(Trigger.new, Trigger.newMap, Trigger.old, Trigger.oldMap);
        RepairTrigger.UpdateAssert(Trigger.new, Trigger.newMap, Trigger.old, Trigger.oldMap);
    }
    }
    // ----------------------------------------------------------------------
    // ここより、修理のサービスコントラクト項目を自動的に更新するロジック
    // ----------------------------------------------------------------------