denny chen
2023-04-24 6896a6021f9fa609c6a284aafc3d7229d62c400e
页面描述(批量选择修理)-对象(修理)
6个文件已添加
1003 ■■■■■ 已修改文件
force-app/main/default/classes/lexBatchSelectRepairLWCController.cls 295 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
force-app/main/default/classes/lexBatchSelectRepairLWCController.cls-meta.xml 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
force-app/main/default/lwc/lexBatchSelectRepairLWC/lexBatchSelectRepairLWC.css 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
force-app/main/default/lwc/lexBatchSelectRepairLWC/lexBatchSelectRepairLWC.html 107 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
force-app/main/default/lwc/lexBatchSelectRepairLWC/lexBatchSelectRepairLWC.js 576 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
force-app/main/default/lwc/lexBatchSelectRepairLWC/lexBatchSelectRepairLWC.js-meta.xml 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
force-app/main/default/classes/lexBatchSelectRepairLWCController.cls
New file
@@ -0,0 +1,295 @@
/**
 * 2023-04-07
 * 批量选择修理LWC处理
 */
public with sharing class lexBatchSelectRepairLWCController {
    public static List<Repair__c> RepairList;
    public static List<RepairData> RAInfoList;
    public static List<String> repairIdList;
    // public static String pdfURL;
    //查询Repair数据
    @AuraEnabled
    public static ReturnData search(String json) {
        //2023/04/07 LWC
        ReturnData returnData = new ReturnData();
        RetrievalData RevalInfo = (RetrievalData)System.JSON.deserialize(json,RetrievalData.class);
        System.debug(LoggingLevel.INFO, '*** RevalInfo: ' + RevalInfo);
        //pageController 逻辑
        RepairList = new List<Repair__c>();
        RAInfoList = new List<RepairData>();
        if(String.isBlank(RevalInfo.Status1) && String.isBlank(RevalInfo.Status2) && String.isBlank(RevalInfo.RepairName) && String.isBlank(RevalInfo.SAPRepairNo)
            && String.isBlank(RevalInfo.SerialNumber) && String.isBlank(RevalInfo.repair.Incharge_Staff__c) && String.isBlank(RevalInfo.onSiteRepair)
            && String.isBlank(String.valueOf(RevalInfo.repair.Aware_date__c)) && String.isBlank(String.valueOf(RevalInfo.repair.Aware_date2__c)) && String.isBlank(RevalInfo.workLocationSelect)
            && String.isBlank(RevalInfo.State_Hospital)){
            // ApexPages.addmessage(new ApexPages.message(ApexPages.severity.INFO, '请至少添加一个检索条件!'));
            return null;
        }
        // 2023/04/10 add 型号,修理委托者 名称
        String sql = 'select Id, Name, SAP_Service_Repair_No__c, Status1__c, Status2__c, Delivered_Product__c, SerialNumber__c, Delivered_Product__r.Name,Incharge_Staff__r.Name,';
        sql += 'HP_Name__c, State_Hospital__c, Incharge_Staff__c, FSE_ApplyForRepair_Day__c, work_location_select__c, On_site_repair__c,';
        sql += 'Number_of_EffectiveContract__c, NewProductGuaranteeObject__c from Repair__c where Id != null ';
        if(String.isNotBlank(RevalInfo.Status2)){
            sql += ' and Status2__c = \'' + RevalInfo.Status2 + '\'';
        }
        if(String.isNotBlank(RevalInfo.Status1)){
            sql += ' and Status1__c = \'' + RevalInfo.Status1 + '\'';
        }
        if(String.isNotBlank(RevalInfo.HospitalName)){
            sql += ' and HP_Name__c like \'%' + RevalInfo.HospitalName.trim() + '%\'';
        }
        if(String.isNotBlank(RevalInfo.RepairName)){
            System.debug(LoggingLevel.INFO, '***RevalInfo.RepairName.contains(): ' + RevalInfo.RepairName.contains(' '));
            String splitStr = null;
            if(RevalInfo.RepairName.contains(' ')){
                splitStr = ' ';
            }else if(RevalInfo.RepairName.contains(',')){
                splitStr = ',';
            }
            if(splitStr != null && RevalInfo.RepairName.contains(splitStr)){
                sql += ' and (';
                list <String> nameList = RevalInfo.RepairName.split(splitStr);
                for(String name: nameList){
                   sql += 'Name like \'%' + name + '%\' or ';
                }
                sql = sql.removeEnd('or ');
                sql += ')';
            }else{
                sql += ' and Name like \'%' + RevalInfo.RepairName.trim() + '%\'';
            }
            System.debug(LoggingLevel.INFO, '*** sql: ' + sql);
        }
        if(String.isNotBlank(RevalInfo.SAPRepairNo)){
            System.debug(LoggingLevel.INFO, '***RevalInfo.SAPRepairNo.contains(): ' + RevalInfo.SAPRepairNo.contains(' '));
            String splitStr = null;
            if(RevalInfo.SAPRepairNo.contains(' ')){
                splitStr = ' ';
            }else if(RevalInfo.SAPRepairNo.contains(',')){
                splitStr = ',';
            }
            if(splitStr != null && RevalInfo.SAPRepairNo.contains(splitStr)){
                sql += ' and (';
                list <String> noList = RevalInfo.SAPRepairNo.split(splitStr);
                for(String no: noList){
                   sql += 'SAP_Service_Repair_No__c like \'%' + no + '%\' or ';
                }
                sql = sql.removeEnd('or ');
                sql += ')';
            }else{
                sql += ' and SAP_Service_Repair_No__c like \'%' + RevalInfo.SAPRepairNo.trim() + '%\'';
            }
            System.debug(LoggingLevel.INFO, '*** sql: ' + sql);
        }
        if(String.isNotBlank(RevalInfo.SerialNumber)){
            List<String> SerialNumberList = new List<String>();
            if(RevalInfo.SerialNumber.indexOf(',') != -1){
                SerialNumberList = RevalInfo.SerialNumber.split(',');
            }
            System.debug('SerialNumberList1:' + SerialNumberList);
            // 支持模糊查询多个,文本框输入用英文半角逗号分隔
            if(SerialNumberList.size() > 0){
                sql += ' and (SerialNumber__c like \'%';
                Integer i = 0;
                for(String SerialNumber : SerialNumberList){
                    if(i == 0){
                        sql += SerialNumber.trim() + '%\'';
                    }else{
                        sql += 'or SerialNumber__c like \'%' + SerialNumber.trim() + '%\'';
                    }
                    i++;
                }
                sql += ')';
            } else{
                sql += ' and SerialNumber__c like \'%' + RevalInfo.SerialNumber.trim() + '%\'';
            }
        }
        if(String.isNotBlank(RevalInfo.repair.Incharge_Staff__c)){
            sql += ' and Incharge_Staff__c = \'' + RevalInfo.repair.Incharge_Staff__c + '\'';
        }
        if(String.isNotBlank(String.valueof(RevalInfo.repair.Aware_date__c))&&String.isNotBlank(String.valueof(RevalInfo.repair.Aware_date2__c))){
            String day = String.valueof(RevalInfo.repair.Aware_date__c);
            String day2 = String.valueof(RevalInfo.repair.Aware_date2__c);
            day = day.substring(0,10);
            day2 = day2.substring(0,10);
            sql += ' and FSE_ApplyForRepair_Day__c >= ' + day + 'and FSE_ApplyForRepair_Day__c <=' +day2;
        }
        if(String.isNotBlank(RevalInfo.onSiteRepair)){
            sql += ' and On_site_repair__c = \'' + RevalInfo.onSiteRepair + '\'';
        }
        if(String.isNotBlank(RevalInfo.workLocationSelect)){
            List<String> workLocationSelectList = new List<String>();
            if(RevalInfo.workLocationSelect.indexOf(',') != -1){
                workLocationSelectList = RevalInfo.workLocationSelect.split(',');
            }
            System.debug('workLocationSelectList1:' + workLocationSelectList);
            if(workLocationSelectList.size() > 0){
                sql += ' and (work_location_select__c like \'%';
                Integer i = 0;
                for(String workLocationSelect : workLocationSelectList){
                    if(i == 0){
                        sql += workLocationSelect.trim() + '%\'';
                    }else{
                        sql += 'or work_location_select__c like \'%' + workLocationSelect.trim() + '%\'';
                    }
                    i++;
                }
                sql += ')';
            } else{
                sql += ' and work_location_select__c like \'%' + RevalInfo.workLocationSelect.trim() + '%\'';
            }
        }
        if(String.isNotBlank(RevalInfo.State_Hospital)){
            sql += ' and State_Hospital__c like \'%' + RevalInfo.State_Hospital.trim() + '%\'';
        }
        sql += 'and Status1__c not in(\'0.删除\',\'0.取消\') limit 200';
        System.debug('sql1LWC:' + sql);
        if(String.isNotBlank(sql)){
            RepairList = Database.query(sql);
        }
        if(RepairList.size() == 200){
            // ApexPages.addmessage(new ApexPages.message(ApexPages.severity.ERROR, '检索数据太多,请缩小检索范围!'));
            //2023/04/07 returnData
            returnData.status = '检索数据太多,请缩小检索范围!';
        }
        if(RepairList.size() <= 0){
            // ApexPages.addmessage(new ApexPages.message(ApexPages.severity.INFO, '没检索到任何修理'));
            //2023/04/07 returnData
            returnData.status = '没检索到任何修理';
            return returnData;
        }
        for(Repair__c ra : RepairList){
            RepairData raData = new RepairData(ra);
            RAInfoList.add(raData);
        }
        // return RAInfoList;
        returnData.repairData = RAInfoList;
        System.debug(LoggingLevel.INFO, '*** returnData: ' + returnData);
        return returnData;
    }
    //打印PDF
    @AuraEnabled
    public static String showPDF(String json) {
        System.debug(LoggingLevel.INFO, '*** joinshoPDF: ');
        List<Repair__c> RepairList = (List<Repair__c>)System.JSON.deserialize(json,List<Repair__c>.class);
        if(RepairList == null || RepairList.isEmpty()){
            return '请先检索修理';
        }
        repairIdList = new List<String>();
        for(Repair__c rd : RepairList) {
            System.debug(LoggingLevel.INFO, '*** rd: ' + rd);
                repairIdList.add(rd.Id);
        }
        // RepairList = new List<Repair__c>();
        String url = '=';
        /*System.debug('RAInfoList:' + RAInfoList);
        if(RAInfoList == null || RAInfoList.isEmpty()){
            // ApexPages.addmessage(new ApexPages.message(ApexPages.severity.INFO, '请先检索修理'));
            return '请先检索修理';
        }*/
        /*for(RepairData rd : RAInfoList) {
            System.debug(LoggingLevel.INFO, '*** rd: ' + rd);
            //选中的repair
            if(rd.IFCheck){
                repairIdList.add(rd.repair.Id);
                RepairList.add(rd.repair);
            }
        }*/
        System.debug(LoggingLevel.INFO, '***repairIdList : ' + repairIdList);
        System.debug(LoggingLevel.INFO, '***RepairList : ' + RepairList);
        if(repairIdList.size() > 0){
            if(repairIdList.size() <= 50){
                if(RepairList.size() > 0){
                    System.debug(LoggingLevel.INFO, '*** if size>0 generateAttachment: ');
                    generateAttachment(RepairList);
                }
                for(String Id : repairIdList){
                    url += Id + '=';
                }
                url = url.substring(0, url.lastIndexOf('='));
                // PageReference pageRef = new PageReference('/apex/MaintenanceCommissionPDF?id' + url);
                // pageRef.setRedirect(true);
                // return pageRef;
                String pdfURL = '';
                if(isSandbox()){
                    pdfURL = 'https://ocsm--stagefull--c.visualforce.com/apex/MaintenanceCommissionPDF?id' + url;
                } else{
                    pdfURL = 'https://ocsm.my.salesforce.com/apex/MaintenanceCommissionPDF?id' + url;
                }
                return pdfURL;
            } else{
                // ApexPages.addmessage(new ApexPages.message(ApexPages.severity.ERROR, '多单打印最大数量为50,请选择少于50个修理!'));
                return '多单打印最大数量为50,请选择少于50个修理!';
            }
        } else{
            // ApexPages.addmessage(new ApexPages.message(ApexPages.severity.INFO, '请至少选择一个修理'));
            return '请至少选择一个修理';
        }
    }
    // 生成pdf添加到对应的修理中
    public static PageReference generateAttachment(List<Repair__c> repList){
        System.debug(LoggingLevel.INFO, '*** generateAttachment: ');
        BatchSelectRepairPDFDelete pdf = new BatchSelectRepairPDFDelete();
        pdf.deletePDF(repList);
        pdf.createPDF(repList);
        return null;
    }
    // 判断是否是测试环境
    public static Boolean isSandbox() {
        return [SELECT IsSandbox FROM Organization LIMIT 1].IsSandbox;
    }
    public class RetrievalData {
        @AuraEnabled
        public String Status1;
        @AuraEnabled
        public String Status2;
        @AuraEnabled
        public String RepairName;
        @AuraEnabled
        public String SAPRepairNo;
        @AuraEnabled
        public String SerialNumber;
        @AuraEnabled
        public String onSiteRepair;
        @AuraEnabled
        public String workLocationSelect;
        @AuraEnabled
        public String State_Hospital;
        @AuraEnabled
        public String HospitalName;
        @AuraEnabled
        public Repair__c repair;
        public RetrievalData(){
            repair = new Repair__c();
        }
    }
    public class RepairData {
        @AuraEnabled
        public Boolean IFCheck;
        @AuraEnabled
        public Repair__c repair;
        public RepairData(Repair__c RepairInfo){
            IFCheck = null;
            repair = RepairInfo;
        }
    }
    //2023/04/07 返回查询结果和状态
    public class ReturnData {
        @AuraEnabled
        public String status;
        @AuraEnabled
        public List<RepairData> repairData;
    }
}
force-app/main/default/classes/lexBatchSelectRepairLWCController.cls-meta.xml
New file
@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<ApexClass xmlns="http://soap.sforce.com/2006/04/metadata">
    <apiVersion>52.0</apiVersion>
    <status>Active</status>
</ApexClass>
force-app/main/default/lwc/lexBatchSelectRepairLWC/lexBatchSelectRepairLWC.css
New file
@@ -0,0 +1,9 @@
.Narrow{
    padding: 20px;
}
.searchField,.searchField .input-text{
    /*display: flex;*/
}
.searchField .slds-combobox_container{
    width: 160px !important;
}
force-app/main/default/lwc/lexBatchSelectRepairLWC/lexBatchSelectRepairLWC.html
New file
@@ -0,0 +1,107 @@
<template>
 <!--  <div class="slds-box slds-theme--default">
        Click on the link Below to Export data as csv/xls.
        <p class="slds-m-top--large">
            <a onclick={exportContactData}>Export Contact Data</a>
            <lightning-button variant="brand" label="Export Contact data" title="Export Contact Data" onclick={exportContactData}></lightning-button>
        </p>
    </div> -->
  <lightning-card  variant="Narrow">
    <div style="padding: 0 20px">
      <div>
          <div style="padding: 10px 3px;border-bottom: 1px solid;font: 16px;font-size: blod;">检索列</div>
          <div style="margin-top: 5px">
             <lightning-layout>
              <!-- cancelPaddingLeft -->
                  <lightning-layout-item flexibility="auto" padding="around-small">
                      <lightning-combobox name="progress" label="状态1" value={searchObj.Status1} options={status1Options}
                          onchange={handleStatus1Change} class="searchField"></lightning-combobox>
                  </lightning-layout-item>
                  <lightning-layout-item flexibility="auto" padding="around-small">
                      <lightning-combobox
                      name="progress" label="状态2" value={searchObj.Status2} options={status2Options} onchange={handleStatus2Change}
                      class="searchField"></lightning-combobox>
                  </lightning-layout-item>
                  <lightning-layout-item flexibility="auto" padding="around-small">
                      <lightning-combobox
                      name="progress" label="服务方式" value={searchObj.onSiteRepair} options={siteRepairItems} onchange={handleSiteChange}
                      class="searchField"></lightning-combobox>
                  </lightning-layout-item>
              </lightning-layout>
              <lightning-layout>
                  <lightning-layout-item size="4" padding="horizontal-small">
                    <lightning-input value={searchObj.RepairName} type="text" label="RS修理单号" class="searchField" onchange={handleRepairNameChange}></lightning-input>
                  </lightning-layout-item>
                  <lightning-layout-item size="4" padding="horizontal-small">
                    <lightning-input value={searchObj.SAPRepairNo} type="text" label="SAP修理单号" class="searchField" onchange={handleSAPRepairNoChange}></lightning-input>
                  </lightning-layout-item>
                  <lightning-layout-item size="4" padding="horizontal-small">
                    <lightning-input value={searchObj.workLocationSelect} type="text" label="维修中心" class="searchField" onchange={handleWorkLocationChange}></lightning-input>
                  </lightning-layout-item>
              </lightning-layout>
              <lightning-layout>
                  <lightning-layout-item size="4" padding="horizontal-small">
                    <lightning-input value={searchObj.SerialNumber} type="text" label="机身编码" class="searchField" onchange={handleSerialNumberChange}></lightning-input>
                  </lightning-layout-item>
                  <lightning-layout-item size="4" padding="horizontal-small">
                    <lightning-input value={searchObj.State_Hospital} type="text" label="省份" class="searchField" onchange={handleStateHospitalChange}></lightning-input>
                  </lightning-layout-item>
                  <lightning-layout-item size="4" padding="horizontal-small">
                    <lightning-input value={searchObj.HospitalName} type="text" label="医院名称" class="searchField" onchange={handleHospitalChange}></lightning-input>
                  </lightning-layout-item>
              </lightning-layout>
              <lightning-layout>
                  <lightning-layout-item size="2" padding="horizontal-small">
                    <lightning-input type="date" label="FSE申请日(开始)" value={repair.Aware_date__c} onchange={handleAwareDateDStart}></lightning-input>
                  </lightning-layout-item>
                  <!-- cancelPaddingLeft -->
                  <lightning-layout-item size="2" padding="horizontal-small">
                    <!-- variant="label-hidden" -->
                    <lightning-input type="date" label="FSE申请日(结束)" value={repair.Aware_date2__c} onchange={handleAwareDateDEnd}></lightning-input>
                  </lightning-layout-item>
                  <lightning-layout-item size="4" padding="horizontal-small">
                    <!-- record-id={recordId} 修理委托者  Incharge_Staff__c-->
                    <!-- <lightning-record-edit-form
                        object-api-name={objectApiName}
                        record-id=''
                    >
                        <lightning-input-field field-name={nameField} onclick={handleInchargeStaffChange}> </lightning-input-field>
                    </lightning-record-edit-form> -->
                    <lightning-record-edit-form
                        object-api-name='Repair__c'
                        record-id=''
                    >
                        <lightning-input-field field-name='Incharge_Staff__c' onclick={handleInchargeStaffChange}> </lightning-input-field>
                    </lightning-record-edit-form>
                  </lightning-layout-item>
              </lightning-layout>
              <lightning-layout>
                  <lightning-layout-item flexibility="auto" padding="around-small">
                    <lightning-button label="检索" onclick={searchRepair}></lightning-button>
                  </lightning-layout-item>
              </lightning-layout>
          </div>
      </div>
      <div>
          <div style="padding: 10px 5px;border-bottom: 1px solid">详细信息</div>
          <div style="padding: 10px 0;">
            <lightning-button label="打印PDF" onclick={skipPage}></lightning-button>
            <lightning-button label="导出Excel" onclick={exportContactData}></lightning-button>
            <!-- <lightning-button label="导出Excel" onclick={downloadCSVFile}></lightning-button> -->
          </div>
          <div>
            <lightning-datatable
              key-field="id"
              data={data}
              columns={columns}
              onrowselection={getSelectedRows}
              onrowaction={handleRowAction}>
            </lightning-datatable>
          </div>
      </div>
    </div>
  </lightning-card>
</template>
force-app/main/default/lwc/lexBatchSelectRepairLWC/lexBatchSelectRepairLWC.js
New file
@@ -0,0 +1,576 @@
import { LightningElement,wire,track,api} from 'lwc';
import { CurrentPageReference } from "lightning/navigation";
import { CloseActionScreenEvent } from 'lightning/actions';
import { NavigationMixin } from 'lightning/navigation';
import { ShowToastEvent } from 'lightning/platformShowToastEvent';
import NAME_FIELD from '@salesforce/schema/Repair__c.Incharge_Staff__c';
import MY_CUSTOM_OBJECT from '@salesforce/schema/Repair__c';
import search from '@salesforce/apex/lexBatchSelectRepairLWCController.search';
import showPDF from '@salesforce/apex/lexBatchSelectRepairLWCController.showPDF';
/*
const actions = [
    { label: 'Show details', name: 'show_details' },
    { label: 'Delete', name: 'delete' },
    ];*/
const columns = [
        { label: '状态1', fieldName: 'Status1__c'},
        { label: '状态2', fieldName: 'Status2__c' },
        { label: 'RS修理单号', fieldName: 'Name' },
        { label: 'SAP修理单号', fieldName: 'SAP_Service_Repair_No__c' },
        // { label: '型号', fieldName: 'deliveredProductName' },
        { label: '型号', fieldName: 'deliveredProductUrl',type:'url',
            typeAttributes:{
                label:{
                    fieldName:'deliveredProductName'
                },
                target:'_balank'
            }
        },
        { label: '机身编号', fieldName: 'SerialNumber__c' },
        { label: '医院名称', fieldName: 'HP_Name__c' },
        { label: '省份', fieldName: 'State_Hospital__c' },
        // { label: '修理委托者', fieldName: 'Incharge_Staff_Name' },
        { label: '修理委托者', fieldName: 'inchargeStaffUrl',type:'url',
            typeAttributes:{
                label:{
                    fieldName:'inchargeStaffName'
                },
                target:'_balank'
            }
        },
        { label: 'FSE申请日期', fieldName: 'FSE_ApplyForRepair_Day__c' },
        { label: '维修中心', fieldName: 'work_location_select__c' },
        { label: '服务方式', fieldName: 'On_site_repair__c' },
        { label: '有无维修合同对象', fieldName: 'Number_of_EffectiveContract__c' },
        { label: '无偿区别标志', fieldName: 'NewProductGuaranteeObject__c' }
   /* {
    type: 'action',
    typeAttributes: { rowActions: actions },
    },*/
    ];
export default class lexBatchSelectRepairLWC extends LightningElement {
    // Expose a field to make it available in the template
    nameField = NAME_FIELD;
    // Flexipage provides recordId and objectApiName
    @api recordId;
    @api objectApiName;
    data = [];
    columns = columns;
    //状态1
    status1Options = [{ label: '--无--', value: '' },
                    { label: '0.申请完毕', value: '0.申请完毕' },
                    { label: '2.维修报价阶段', value: '2.维修报价阶段' },
                    { label: '3.维修阶段', value: '3.维修阶段' },
                    { label: '4.修理品返送阶段', value: '4.修理品返送阶段' },
                    { label: '5.完毕', value: '5.完毕' },
                    { label: '0.删除', value: '0.删除' },
                    { label: '0.取消', value: '0.取消' }];
    //状态2
    status2Options = [{label:'00.申请完毕', value:'00.申请完毕'},
                    {label:'01.分公司受理完毕', value:'01.分公司受理完毕'},
                    {label:'02.RC受理完毕', value:'02.RC受理完毕'},
                    {label:'03.报价检查结束', value:'03.报价检查结束'},
                    {label:'04.报价跟进中', value:'04.报价跟进中'},
                    {label:'05.报价同意完备', value:'05.报价同意完备'},
                    {label:'06.零件齐备', value:'06.零件齐备'},
                    {label:'07.修理開始', value:'07.修理開始'},
                    {label:'08.修理预计完成', value:'08.修理预计完成'},
                    {label:'09.修理完成', value:'09.修理完成'},
                    {label:'10.最终检查完成', value:'10.最终检查完成'},
                    {label:'11.RC修理品已返送', value:'11.RC修理品已返送'},
                    {label:'12.发票已发送', value:'12.发票已发送'},
                    {label:'13.已返送到用户', value:'13.已返送到用户'},
                    {label:'14.收到验收单', value:'14.收到验收单'},
                    {label:'15.验收单签收复核通过', value:'15.验收单签收复核通过'},
                    {label:'16.部分付款', value:'16.部分付款'},
                    {label:'16.完毕', value:'16.完毕'},
                    {label:'17.付款完毕', value:'17.付款完毕'},
                    {label:'00.取消', value:'00.取消'},
                    {label:'00.删除', value:'00.删除'},
                    {label:'00.关闭', value:'00.关闭'}];
    //服务方式
    siteRepairItems = [{label:'--无--',value:''},
        {label:'RC修理',value:'RC修理'},
        {label:'直送SORC修理',value:'直送SORC修理'},
        {label:'直送OGZ修理',value:'直送OGZ修理'},
        {label:'办事处修理',value:'办事处修理'},
        {label:'现场修理',value:'现场修理'}];
    searchObj = {};
    repair = {};
    selectedRepairs;
    /* @wire(CurrentPageReference)
     getStateParameters(currentPageReference) {
             console.log(111);
             console.log(currentPageReference);
         if (currentPageReference) {
           const urlValue = currentPageReference.state.recordId;
           if (urlValue) {
             let str = `${urlValue}`;
             console.log("str");
             console.log(str);
             this.recordId = str;
           }
         }
     }*/
    connectedCallback(){
        // console.log(this.recordId);
    }
    //状态1
    handleStatus1Change(event){
        /*console.log(event);
        console.log(event.detail);*/
        this.searchObj.Status1 = event.detail.value;
        // console.log(JSON.stringify(this.searchObj));
    }
    //状态2
    handleStatus2Change(event){
        this.searchObj.Status2 = event.detail.value;
        // console.log(this.searchObj);
    }
    //服务方式
    handleSiteChange(event){
        this.searchObj.onSiteRepair = event.detail.value;
        // console.log(this.searchObj);
    }
    //RS修理单号 RepairName
    handleRepairNameChange(event){
        this.searchObj.RepairName = event.detail.value;
        // console.log(this.searchObj);
    }
    //SAP修理单号 SAPRepairNo
    handleSAPRepairNoChange(event){
        this.searchObj.SAPRepairNo = event.detail.value;
        // console.log(this.searchObj);
    }
    //维修中心 workLocationSelect
    handleWorkLocationChange(event){
        this.searchObj.workLocationSelect = event.detail.value;
    }
    //机身编码 SerialNumber
    handleSerialNumberChange(event){
        this.searchObj.SerialNumber = event.detail.value;
    }
    // 省份  State_Hospital
    handleStateHospitalChange(event){
        this.searchObj.State_Hospital = event.detail.value;
    }
    //医院名称  HospitalName
    handleHospitalChange(event){
        this.searchObj.HospitalName = event.detail.value;
    }
    //FSE申请日 repair.Aware_date__c
    handleAwareDateDStart(event){
        this.repair.Aware_date__c = event.detail.value;
        console.log(this.repair.Aware_date__c);
    }
    // repair.Aware_date2__c
    handleAwareDateDEnd(event){
        this.repair.Aware_date2__c = event.detail.value;
        // console.log(this.repair.Aware_date2__c);
    }
    // 修理委托者 repair.Incharge_Staff__c
    handleInchargeStaffChange(event){
        this.repair.Incharge_Staff__c = event.detail.value;
        // console.log(this.repair.Aware_date2__c);
    }
   //检索
    searchRepair(event) {
        console.log(this.repair.Aware_date__c);
        if (JSON.stringify(this.repair) != "{}") {
            console.log('this.repair');
            this.searchObj.repair = this.repair;
            // fse 时间条件
            /*if (!(this.repair.Aware_date__c != null && this.repair.Aware_date2__c != null) || this.repair.Aware_date__c > this.repair.Aware_date2__c) {
                const event = new ShowToastEvent({
                             title: 'error',
                             message: 'FSE申请日输入有误',
                             variant:'error',
                            });
                this.dispatchEvent(event);
                return;
            }*/
        }
        let jsonStr = JSON.stringify(this.searchObj);
        if (jsonStr === "{}") {
            const event = new ShowToastEvent({
                             title: 'error',
                             message: '请至少添加一个检索条件!',
                             variant:'error',
                            });
            this.dispatchEvent(event);
        }else{
            console.log(jsonStr);
            search({
                json: jsonStr
            }).then(result => {
                console.log(result.repairData);
                console.log('length:'+result.repairData.length);
                if (result.repairData.length == 0 || result.repairData.length == 200) {
                    const event = new ShowToastEvent({
                             title: 'warning',
                             message: result.status,
                             variant:'warning',
                            });
                    this.dispatchEvent(event);
                }
                let returnArr = [];
                result.repairData.forEach(function(v){
                    let objRepair = v.repair;
                    //添加修理委托者和型号名称
                    objRepair.deliveredProductName = objRepair.Delivered_Product__r.Name;
                    objRepair.deliveredProductUrl = "/"+objRepair.Delivered_Product__c;
                    objRepair.inchargeStaffName = objRepair.Incharge_Staff__r.Name;
                    objRepair.inchargeStaffUrl = "/"+objRepair.Incharge_Staff__c;
                    // console.log(objRepair);
                    returnArr.push(objRepair);
                });
                /*console.log('arr');
                console.log(arr);
                console.log(arr.length);*/
                this.data = returnArr;
                // console.log(this.data);
            }).catch(error => {
                console.log("error");
                console.log(error);
            }).finally(() => {
            });
        }
    }
    //导出为Excel  画table
    exportContactData(){
        // Prepare a html table
        let doc = '<table>';
        // Add styles for the table
        doc += '<style>';
        doc += 'table, th, td {';
        doc += '    border: 1px solid black;';
        doc += '    border-collapse: collapse;';
        doc += '}';
        doc += '</style>';
        // Add all the Table Headers
        doc += '<tr>';
        this.columns.forEach(element => {
            doc += '<th>'+ element.label +'</th>'
        });
        doc += '</tr>';
        // Add the data rows
        let fieldNameArr =[];
        this.columns.forEach(function(v){
            if (v['typeAttributes']) {
                fieldNameArr.push(v['typeAttributes'].label.fieldName);
            }else{
                fieldNameArr.push(v.fieldName);
            }
        });
        console.log(fieldNameArr);
        fieldNameArr.forEach(v=>{
            console.log(v);
            // console.log(this.data[0].v);
        })
        this.data.forEach(record => {
            doc += '<tr>';
            if (record.Status1__c != null) {
                doc += '<th>'+record.Status1__c+'</th>';
            }else{
                doc += '<th></th>'
            }
            if (record.Status2__c != null) {
            doc += '<th>'+record.Status2__c+'</th>';
            }else{
                doc += '<th></th>'
            }
            if (record.Name != null) {
            doc += '<th>'+record.Name+'</th>';
            }else{
                doc += '<th></th>'
            }
            if (record.SAP_Service_Repair_No__c != null) {
            doc += '<th>'+record.SAP_Service_Repair_No__c+'</th>';
            }else{
                doc += '<th></th>'
            }
            if (record.deliveredProductName != null) {
            doc += '<th>'+record.deliveredProductName+'</th>';
            }else{
                doc += '<th></th>'
            }
            if (record.SerialNumber__c != null) {
            doc += '<th>'+record.SerialNumber__c+'</th>';
            }else{
                doc += '<th></th>'
            }
            if (record.HP_Name__c != null) {
            doc += '<th>'+record.HP_Name__c+'</th>';
            }else{
                doc += '<th></th>'
            }
            if (record.State_Hospital__c != null) {
            doc += '<th>'+record.State_Hospital__c+'</th>';
            }else{
                doc += '<th></th>'
            }
            if (record.inchargeStaffName != null) {
            doc += '<th>'+record.inchargeStaffName+'</th>';
            }else{
                doc += '<th></th>'
            }
            if (record.FSE_ApplyForRepair_Day__c != null) {
            doc += '<th>'+record.FSE_ApplyForRepair_Day__c+'</th>';
            }else{
                doc += '<th></th>'
            }
            if (record.work_location_select__c != null) {
            doc += '<th>'+record.work_location_select__c+'</th>';
            }else{
                doc += '<th></th>'
            }
            if (record.On_site_repair__c != null) {
            doc += '<th>'+record.On_site_repair__c+'</th>';
            }else{
                doc += '<th></th>'
            }
            if (record.Number_of_EffectiveContract__c != null) {
            doc += '<th>'+record.Number_of_EffectiveContract__c+'</th>';
            }else{
                doc += '<th></th>'
            }
            if (record.NewProductGuaranteeObject__c != null) {
            doc += '<th>'+record.NewProductGuaranteeObject__c+'</th>';
            }else{
                doc += '<th></th>'
            }
                // fieldNameArr.forEach(fieldName =>{
                //     doc += '<th>'+record.fieldName+'</th>';
                // });
                doc += '</tr>';
        });
        doc += '</table>';
        var element = 'data:application/vnd.ms-excel,' + encodeURIComponent(doc);
        let downloadElement = document.createElement('a');
        downloadElement.href = element;
        downloadElement.target = '_self';
        // use .csv as extension on below line if you want to export data as csv
        downloadElement.download = '修理明细表.xls';
        document.body.appendChild(downloadElement);
        downloadElement.click();
    }
    // this method validates the data and creates the csv file to download  this.data的所有字段
     downloadCSVFile1() {
        console.log("downloadCSVFile1");
        let rowEnd = '\n';
        let csvString = '';
        // this set elminates the duplicates if have any duplicate keys
        let rowData = new Set();
        let columnsData = new Set();
        let columnsLabelData = new Set();
        // getting keys from data
        this.data.forEach(function (record) {
            Object.keys(record).forEach(function (key) {
                rowData.add(key);
            });
        });
        console.log(rowData);
        // Array.from() method returns an Array object from any object with a length property or an iterable object.
        rowData = Array.from(rowData);
        console.log(rowData);
        // splitting using ','
        csvString += rowData.join(',');
        csvString += rowEnd;
        console.log(csvString);
        this.columns.forEach(function(v){
            columnsLabelData.add(v.label);
            if (v['typeAttributes']) {
                columnsData.add(v['typeAttributes'].label.fieldName);
            }else{
                columnsData.add(v.fieldName);
            }
        });
        console.log("columnsData");
        console.log(columnsLabelData);
        console.log(columnsData);
        console.log(rowData[1]);
        console.log(Array.from(columnsData));
        console.log(Array.from(columnsData).hasOwnProperty(rowData[1]));
        console.log(this.data[0].Name);
        console.log(this.data[0][rowData[1]]);
        // main for loop to get the data based on key value
        for(let i=0; i < this.data.length; i++){
            let colValue = 0;
            // validating keys in data
            for(let key in rowData) {
                if(rowData.hasOwnProperty(key)) {
                    // Key value
                    // Ex: Id, Name
                    let rowKey = rowData[key];
                    // add , after every value except the first.
                    if(colValue > 0){
                        csvString += ',';
                    }
                    // If the column is undefined, it as blank in the CSV file.
                    let value = this.data[i][rowKey] === undefined ? '' : this.data[i][rowKey];
                    csvString += '"'+ value +'"';
                    colValue++;
                }
            }
            csvString += rowEnd;
        }
        // Creating anchor element to download
        let downloadElement = document.createElement('a');
        // This  encodeURI encodes special characters, except: , / ? : @ & = + $ # (Use encodeURIComponent() to encode these characters).
        downloadElement.href = 'data:text/csv;charset=utf-8,' + encodeURI(csvString);
        downloadElement.target = '_self';
        // CSV File Name
        downloadElement.download = 'Account Data.csv';
        // below statement is required if you are using firefox browser
        document.body.appendChild(downloadElement);
        // click() Javascript function to download CSV file
        downloadElement.click();
    }
    //导出为Excel
    downloadCSVFile() {
        console.log("downloadCSVFile");
        let rowEnd = '\n';
        let csvString = '';
        // this set elminates the duplicates if have any duplicate keys
        //表格标题
        let columnsData = new Set();
        //表格字段
        let rowData = new Set();
        // getting keys from data
        this.columns.forEach(function(v){
            columnsData.add(v.label);
            if (v['typeAttributes']) {
                rowData.add(v['typeAttributes'].label.fieldName);
            }else{
                rowData.add(v.fieldName);
            }
        });
        console.log(columnsData);
        console.log(rowData);
        // Array.from() method returns an Array object from any object with a length property or an iterable object.
        rowData = Array.from(rowData);
        columnsData = Array.from(columnsData);
        // getting keys from data
       /* console.log("rowData");
        rowData.forEach(function(v){
            console.log(v);
        });
        console.log("columnsData");
        columnsData.forEach(function(v){
            console.log(v);
        }); */
        // splitting using ','
        csvString += columnsData.join(',');
        csvString += rowEnd;
        // console.log(csvString);
        // main for loop to get the data based on key value
        for(let i=0; i < this.data.length; i++){
            let colValue = 0;
            // validating keys in data
            for(let key in rowData) {
                if(rowData.hasOwnProperty(key)) {//del
                    // Key value
                    // Ex: Id, Name
                    let rowKey = rowData[key];
                    // add , after every value except the first.
                    if(colValue > 0){
                        csvString += ',';
                    }
                    // If the column is undefined, it as blank in the CSV file.
                    let value = this.data[i][rowKey] === undefined ? '' : this.data[i][rowKey];
                    csvString += '"'+ value +'"';
                    colValue++;
                }
            }
            csvString += rowEnd;
        }
        // Creating anchor element to download
        let downloadElement = document.createElement('a');
        // This  encodeURI encodes special characters, except: , / ? : @ & = + $ # (Use encodeURIComponent() to encode these characters).
        downloadElement.href = 'data:text/csv;charset=utf-8,' + encodeURI(csvString);
        downloadElement.target = '_self';
        // CSV File Name
        downloadElement.download = '修理明细表.csv';
        // below statement is required if you are using firefox browser
        document.body.appendChild(downloadElement);
        // click() Javascript function to download CSV file
        downloadElement.click();
    }
    //获取选中Repair
    getSelectedRows(event) {
        const selectedRows = event.detail.selectedRows;
        console.log(selectedRows);
        //Repair__c   selectedRepairs
        // Display that fieldName of the selected rows
        let selectedRepairsArr = [];
        for (let i = 0; i < selectedRows.length; i++) {
            selectedRepairsArr.push(selectedRows[i]);
        }
        this.selectedRepairs = selectedRepairsArr;
    }
    //跳转到pdf页面
    skipPage() {
        console.log("selectedRows");
        // console.log(jsonStr);
        if (this.selectedRepairs.length <= 0 ) {
            const event = new ShowToastEvent({
                                     title: 'error',
                                     message: '请至少选择一个修理',
                                     variant:'error',
                                    });
            this.dispatchEvent(event);
            return;
        }
        let jsonStr = JSON.stringify(this.selectedRepairs);
        showPDF({
            json: jsonStr
            }).then(result => {
                console.log(result);
                if (result.indexOf("https://ocsm") != -1) {
                     window.open(result, "维修委托书PDF", "");
                }else{
                    const event = new ShowToastEvent({
                                     title: 'error',
                                     message: result,
                                     variant:'error',
                                    });
                    this.dispatchEvent(event);
                }
            }).catch(error => {
                console.log("error");
                console.log(error);
            }).finally(() => {
            });
    }
}
force-app/main/default/lwc/lexBatchSelectRepairLWC/lexBatchSelectRepairLWC.js-meta.xml
New file
@@ -0,0 +1,11 @@
<?xml version="1.0"?>
<LightningComponentBundle xmlns="http://soap.sforce.com/2006/04/metadata">
    <apiVersion>54.0</apiVersion>
    <isExposed>true</isExposed>
    <targets>
        <target>lightning__RecordPage</target>
        <target>lightning__AppPage</target>
        <target>lightning__HomePage</target>
        <target>lightning__RecordAction</target>
    </targets>
</LightningComponentBundle>