public without sharing class LexConInvoiceViewController {
  public static String agencyProType { get; set; }
  public static Consumable_order__c coc { get; set; }
  public static Consumable_order__c outbound { get; set; }
  public static String invoiceId { get; set; }
  public static String orderRemind { get; set; }
  public static String deliveryId { get; set; }
  public static String reopen { get; set; }
  public static Decimal sumPrice { get; set; }
  public static Boolean isChange { get; set; }
  public static String accountid { get; set; }
  public static String userId { get; set; }
  public static String errorMsg { get; set; }

  public static Boolean getdone() {
    return (invoiceOrderdetail1Recoeds.size() > 0);
  }

  public static Boolean getExistOutbound() {
    return (coc.Outbound_order__c != null);
  }

  public static String getInvoiceName() {
    return (coc.Name);
  }
  public static List<Consumable_Orderdetails__c> conoList { get; set; }

  public static String shipmentAccount {
    get {
      return (coc.ShipmentAccount__c);
    }
  }
  public static String statusEdit = '';
  public static Boolean editAble { get; set; }
  public static List<InvoiceOrderInfo> invoiceOrderRecoeds { get; set; }
  public static List<InvoiceOrderInfo> invoiceOrderdetail1Recoeds { get; set; }
  public static List<InvoiceOrderInfo> invoiceOrderRecoedschange { get; set; }
  public static List<InvoiceOrderInfo> attachmentRecoeds { get; set; }
  public static List<Consumable_order__c> invoiceOrderList { get; set; }
  public static List<Consumable_order__c> invoiceOrderSelectedList { get; set; }
  public static Map<String, Decimal> ordermx1defaultMap { get; set; }
  public static Map<String, Decimal> outorderMoneytMap { get; set; }
  public static Map<String, Consumable_Orderdetails__c> outordercountMap {
    get;
    set;
  }
  public static List<String> outOrderStringList { get; set; }
  public static List<SelectOption> provinceOpts { get; set; }
  public static Map<String, String> provinceOptsMap { get; set; }
  public static String SecondDealer { get; set; }
  public static String HospitalInfo { get; set; }
  public static String HospitalName { get; set; }

  public static Integer invoiceOrderRecoedsCount {
    get {
      return invoiceOrderRecoeds == null ? 0 : invoiceOrderRecoeds.size();
    }
  }

  public static list<Dealer_elationship__c> Dealerelationship { get; set; }
  public static String[] orderby = new List<String>{
    'Outbound_Date__c',
    'Name',
    'ShipmentAccount__c'
  };
  public static String sortKey { get; set; }
  public static String preSortKey { get; set; }
  public static Boolean sortOrderAsc { get; set; }
  public static String[] sortOrder { get; set; }
  public static String userWorkLocation { get; set; }

  //页面初始化
  @AuraEnabled
  public static ResponseBodyLWC init(
    String invoiceId,
    String statusEdit,
    String deliveryId
  ) {
    ResponseBodyLWC res = new ResponseBodyLWC();
    Map<String, object> data = new Map<String, object>();
    res.entity = data;

    provinceOpts = new List<SelectOption>();
    provinceOptsMap = new Map<String, String>();
    invoiceOrderRecoeds = new List<InvoiceOrderInfo>();
    attachmentRecoeds = new List<InvoiceOrderInfo>();
    invoiceOrderdetail1Recoeds = new List<InvoiceOrderInfo>();
    invoiceOrderRecoedschange = new List<InvoiceOrderInfo>();
    orderRemind = '';
    isChange = false;
    conoList = new List<Consumable_Orderdetails__c>();
    outorderMoneytMap = new Map<String, Decimal>();
    outOrderStringList = new List<String>();
    outordercountMap = new Map<String, Consumable_Orderdetails__c>();

    sumPrice = 0;
    // this.sortKey = '1';
    // this.preSortKey = '1';
    // this.sortOrderAsc = false;
    // this.sortOrder = new List<String>(2);
    // this.sortOrder = new List<String>{ ' ', ' ', ' ', ' ' };

    invoiceId = invoiceId;
    statusEdit = statusEdit;
    deliveryId = deliveryId;

    if (
      invoiceId != null &&
      invoiceId != '' &&
      (statusEdit == '' ||
      statusEdit == null)
    ) {
      editAble = false;
    } else if (
      (invoiceId == null || invoiceId == '') &&
      (statusEdit == '' ||
      statusEdit == null)
    ) {
      editAble = true;
    } else if (
      invoiceId != null &&
      invoiceId != '' &&
      statusEdit != '' &&
      statusEdit != null
    ) {
      editAble = true;
    }
    userId = UserInfo.getUserId();
    List<user> Useracc = new List<user>();
    Useracc = [
      SELECT accountid, Work_Location__c, UserPro_Type__c
      FROM user
      WHERE id = :userId
    ];
    accountid = Useracc[0].accountid;
    userWorkLocation = Useracc[0].Work_Location__c;
    agencyProType = Useracc[0].UserPro_Type__c;
    if (String.isBlank(Useracc[0].UserPro_Type__c)) {
      agencyProType = 'ET';
    }
    coc = new Consumable_order__c();

    Dealerelationship = [
      SELECT Dealer_subordinate__c, Dealer_subordinate__r.Name
      FROM Dealer_elationship__c
      WHERE Dealer_principal__c = :accountid
    ];
    List<Agency_Hospital_Link__c> AgencyHospitalLink = new List<Agency_Hospital_Link__c>();
    AgencyHospitalLink = [
      SELECT Id, Name, Hospital__c, Hospital__r.Id, Hospital__r.Name, Agency__c
      FROM Agency_Hospital_Link__c
      WHERE Agency__c = :accountId
    ];
    // 新規
    if (invoiceId == null || invoiceId == '') {
      if (deliveryId == null || deliveryId == '') {
        String msoql = makeSoql();
        invoiceOrderList = Database.query(msoql);
        for (Integer i = 0; i < invoiceOrderList.size(); i++) {
          invoiceOrderRecoeds.add(new InvoiceOrderInfo(invoiceOrderList[i]));
        }
      } else {
        if (statusEdit == '' || statusEdit == null) {
          EditAble = false;
        } else if (statusEdit != '' && statusEdit != null) {
          EditAble = true;
        }
        coc = [
          SELECT
            Id,
            Name,
            Invoice_status__c,
            Invoice_Date__c,
            Order_ForDealerText__c,
            Dealer_Info__c,
            Order_ForDealer__c,
            Order_ForDealer__r.Name,
            Order_ForHospital__c,
            Order_ForHospital__r.Name,
            Order_date__c,
            Billed_Status__c,
            ShipmentAccount__c,
            Order_Dealer_Info__c,
            SummonsForDirction__c,
            Order_ForCustomerText__c,
            Invoice_Note__c,
            Invoice_attachment__c,
            Invoicedet_attachment__c,
            Outbound_order__c
          FROM Consumable_order__c
          WHERE Id = :deliveryId
        ];
        coc.Name = '';
        if (coc.Order_ForDealer__c != null) {
          SecondDealer = coc.Order_ForDealer__c;
        }

        if (coc.Order_ForHospital__c != null) {
          HospitalInfo = coc.Order_ForHospital__c;
          HospitalName = coc.Order_ForHospital__r.Name;
        }

        //发票关联出库单取得（出库单）
        invoiceOrderSelectedList = [
          SELECT
            Id,
            Order_ForDealer__r.Name,
            Order_ForHospital__r.Name,
            Order_ForDealerText__c,
            Name,
            Outbound_Date__c,
            ShipmentAccount__c,
            Order_Dealer_Info__c,
            SummonsForDirction__c,
            Shipment_total_amount__c,
            RrturnPro_total_amount__c,
            Total_Invoiced_Procount__c,
            InvoiceNotPro_total_amount__c,
            InvoiceNotPro_money__c,
            Invoice_total_amount__c,
            Billed_Status__c
          FROM Consumable_order__c
          WHERE Id = :deliveryId
          ORDER BY Name
        ];
        for (Integer i = 0; i < invoiceOrderSelectedList.size(); i++) {
          invoiceOrderRecoeds.add(
            new InvoiceOrderInfo(invoiceOrderSelectedList[i])
          );
        }
      }
    } else {
      coc = [
        SELECT
          Id,
          Name,
          Invoice_status__c,
          Invoice_Date__c,
          Order_ForDealerText__c,
          Dealer_Info__c,
          Order_ForDealer__c,
          Order_ForDealer__r.Name,
          Order_ForHospital__c,
          Order_ForHospital__r.Name,
          Order_date__c,
          Billed_Status__c,
          ShipmentAccount__c,
          Order_Dealer_Info__c,
          SummonsForDirction__c,
          Order_ForCustomerText__c,
          Invoice_Note__c,
          Invoice_attachment__c,
          Invoicedet_attachment__c,
          Outbound_order__c
        FROM Consumable_order__c
        WHERE Id = :invoiceId AND Order_type__c = '发票'
      ];
      if (coc.Order_ForDealer__c != null) {
        SecondDealer = coc.Order_ForDealer__c;
      }
      if (coc.Order_ForHospital__c != null) {
        HospitalInfo = coc.Order_ForHospital__c;
        HospitalName = coc.Order_ForHospital__r.Name;
      }
      //到链接表中查找关联出库单
      List<Consumable_order_LinkTable__c> outOrderList = [
        SELECT Outboundorder_Code_link__c
        FROM Consumable_order_LinkTable__c
        WHERE Invoice_Code_link__c = :invoiceId
      ];
      for (Integer i = 0; i < outOrderList.size(); i++) {
        outOrderStringList.add(outOrderList[i].Outboundorder_Code_link__c);
      }
      //取得出库单信息
      invoiceOrderSelectedList = [
        SELECT
          Id,
          Order_ForDealer__r.Name,
          Order_ForHospital__r.Name,
          Order_ForDealerText__c,
          Name,
          Outbound_Date__c,
          ShipmentAccount__c,
          Shipment_total_amount__c,
          RrturnPro_total_amount__c,
          Total_Invoiced_Procount__c,
          InvoiceNotPro_total_amount__c,
          InvoiceNotPro_money__c,
          Invoice_total_amount__c,
          Billed_Status__c
        FROM Consumable_order__c
        WHERE
          Id IN :outOrderStringList
          AND Order_Owner_WorkLocal__c = :userWorkLocation
        ORDER BY Name
      ];
      for (Integer i = 0; i < invoiceOrderSelectedList.size(); i++) {
        outorderMoneytMap.put(invoiceOrderSelectedList[i].id, 0);
        invoiceOrderRecoeds.add(
          new InvoiceOrderInfo(invoiceOrderSelectedList[i])
        );
      }
      if (String.isNotBlank(deliveryId)) {
        //发票关联出库单取得（出库单）
        isChange = true;
        invoiceOrderSelectedList = [
          SELECT
            Id,
            Order_ForDealer__r.Name,
            Order_ForHospital__r.Name,
            Order_ForDealerText__c,
            Name,
            Outbound_Date__c,
            ShipmentAccount__c,
            Shipment_total_amount__c,
            RrturnPro_total_amount__c,
            Total_Invoiced_Procount__c,
            InvoiceNotPro_total_amount__c,
            InvoiceNotPro_money__c,
            Invoice_total_amount__c,
            Billed_Status__c
          FROM Consumable_order__c
          WHERE
            Id = :deliveryId
            AND Order_Owner_WorkLocal__c = :userWorkLocation
          ORDER BY Name
        ];
        for (Integer i = 0; i < invoiceOrderSelectedList.size(); i++) {
          if (!outorderMoneytMap.containsKey(invoiceOrderSelectedList[i].Id)) {
            invoiceOrderRecoeds.add(
              new InvoiceOrderInfo(invoiceOrderSelectedList[i])
            );
            invoiceOrderRecoedschange.add(
              new InvoiceOrderInfo(invoiceOrderSelectedList[i])
            );
          }
        }
      }
      //发票明细一览
      List<Consumable_Orderdetails__c> countDel = [
        SELECT
          Id,
          Consumable_ZS_order__c,
          Name,
          Consumable_order__c,
          Invoicedet1_OD_link__c,
          Invoicedet1_OD_link__r.Name,
          Consumable_order__r.Name,
          Product_OutDate__c,
          Asset_Model_No__c,
          Invoice_Unitprice__c,
          Delivery_List_RMB__c,
          Invoiced_Procount__c,
          Invoiced_Count__c,
          InvoicedProCost_RMB__c,
          Box_Piece__c,
          Invoice_Unit__c,
          ProductPacking_list_manual__c
        FROM Consumable_Orderdetails__c
        WHERE Consumable_order__c = :invoiceId
        ORDER BY Invoicedet1_OD_link__c
      ];
      if (countDel.size() > 0) {
        for (Integer i = 0; i < countDel.size(); i++) {
          outordercountMap.put(
            countDel[i].Invoicedet1_OD_link__c + countDel[i].Asset_Model_No__c,
            countDel[i]
          );
          if (
            outorderMoneytMap.containsKey(countDel[i].Invoicedet1_OD_link__c)
          ) {
            outorderMoneytMap.put(
              countDel[i].Invoicedet1_OD_link__c,
              outorderMoneytMap.get(countDel[i].Invoicedet1_OD_link__c) +
              countDel[i].InvoicedProCost_RMB__c
            );
          }
          invoiceOrderdetail1Recoeds.add(new InvoiceOrderInfo(countDel[i]));
        }
      }
      for (InvoiceOrderInfo ass : invoiceOrderRecoeds) {
        if (outorderMoneytMap.containsKey(ass.esd.id)) {
          ass.needInvoiceCount = outorderMoneytMap.get(ass.esd.id);
        }
        ass.check = true;
      }
    }

    if (SecondDealer == null || SecondDealer == '') {
      provinceOpts.add(new SelectOption('', '-无-'));
      provinceOptsMap.put('', '-无-');
      for (Integer i = 0; i < Dealerelationship.size(); i++) {
        provinceOpts.add(
          new SelectOption(
            Dealerelationship[i].Dealer_subordinate__c,
            Dealerelationship[i].Dealer_subordinate__r.Name
          )
        );
        provinceOptsMap.put(
          Dealerelationship[i].Dealer_subordinate__c,
          Dealerelationship[i].Dealer_subordinate__r.Name
        );
      }
    } else {
      provinceOpts.add(new SelectOption('', '-无-'));
      provinceOptsMap.put('', '-无-');
      for (Integer i = 0; i < Dealerelationship.size(); i++) {
        if (Dealerelationship[i].Dealer_subordinate__r.Name == SecondDealer) {
          provinceOpts.add(
            new SelectOption(
              Dealerelationship[i].Dealer_subordinate__c,
              SecondDealer
            )
          );
          provinceOptsMap.put(
            Dealerelationship[i].Dealer_subordinate__c,
            SecondDealer
          );
        }
      }
      for (Integer i = 0; i < Dealerelationship.size(); i++) {
        if (Dealerelationship[i].Dealer_subordinate__r.Name != SecondDealer) {
          provinceOpts.add(
            new SelectOption(
              Dealerelationship[i].Dealer_subordinate__c,
              Dealerelationship[i].Dealer_subordinate__r.Name
            )
          );
          provinceOptsMap.put(
            Dealerelationship[i].Dealer_subordinate__c,
            Dealerelationship[i].Dealer_subordinate__r.Name
          );
        }
      }
    }

    Map<String, String> consumableaccessoriesMap = new Map<String, String>();
    Map<String, String> invorceOrderIdMap = new Map<String, String>();
    List<Consumable_accessories_invoice__c> consumableaccessories = [
      SELECT Id, Name, Attachment_ID__c, Accessories_type__c
      FROM Consumable_accessories_invoice__c
      WHERE Invoice_code__c = :invoiceId
    ];
    System.debug('consumableaccessories = ' + consumableaccessories);
    if (consumableaccessories.size() > 0) {
      for (Integer i = 0; i < consumableaccessories.size(); i++) {
        consumableaccessoriesMap.put(
          consumableaccessories[i].Attachment_ID__c,
          consumableaccessories[i].Accessories_type__c
        );
        invorceOrderIdMap.put(
          consumableaccessories[i].Attachment_ID__c,
          consumableaccessories[i].Id
        );
      }
    }

    //List<Attachment> attachmentinfo = [SELECT Id, Name, OwnerId,Owner.Name, CreatedDate FROM Attachment WHERE parentid = :invoiceId];
    // if (attachmentinfo.size() > 0) {
    //     for (Integer i = 0; i < attachmentinfo.size(); i++) {
    //         attachmentRecoeds.add(new InvoiceOrderInfo(attachmentinfo[i]));
    //     }
    // }
    List<ContentDocumentLink> links = [
      SELECT Id, ContentDocumentId
      FROM ContentDocumentLink
      WHERE LinkedEntityId = :invoiceId
    ];
    if (links != null && links.size() > 0) {
      List<String> documentIds = new List<String>();
      for (ContentDocumentLink link : links) {
        documentIds.add(link.ContentDocumentId);
      }
      List<ContentVersion> cvInfo = [
        SELECT Id, Title, OwnerId, Owner.Name, CreatedDate, ContentDocumentId
        FROM ContentVersion
        WHERE ContentDocumentId IN :documentIds
      ];

      if (cvInfo.size() > 0) {
        for (Integer i = 0; i < cvInfo.size(); i++) {
          attachmentRecoeds.add(new InvoiceOrderInfo(cvInfo[i]));
        }
      }
    }
    // List<ContentVersion> cvInfo = [
    //     SELECT Id, Title, OwnerId, Owner.Name, CreatedDate, ContentDocumentId
    //     FROM ContentVersion
    //     WHERE FirstPublishLocationId = :invoiceId
    // ];
    // if (cvInfo.size() > 0) {
    //     for (Integer i = 0; i < cvInfo.size(); i++) {
    //         attachmentRecoeds.add(new InvoiceOrderInfo(cvInfo[i]));
    //     }
    // }
    System.debug('attachmentRecoeds = ' + attachmentRecoeds);
    System.debug('consumableaccessoriesMap = ' + consumableaccessoriesMap);
    for (InvoiceOrderInfo ass : attachmentRecoeds) {
      if (consumableaccessoriesMap.containsKey(ass.cvInfo.Id)) {
        ass.mailSelectOptsin = consumableaccessoriesMap.get(ass.cvInfo.Id);
        ass.invoiceOrderId = invorceOrderIdMap.get(ass.cvInfo.Id);
      }
    }
    data.put('EditAble', EditAble);
    data.put('isChange', isChange);
    data.put('coc', coc);
    data.put('ExistOutbound', getExistOutbound());
    data.put('invoiceOrderRecoeds', invoiceOrderRecoeds);
    data.put('provinceOptsMap', provinceOptsMap);
    data.put('HospitalName', HospitalName);
    data.put('HospitalInfo', HospitalInfo);
    data.put('agencyProType', agencyProType);
    data.put('userWorkLocation', userWorkLocation);
    data.put('done', getdone());
    data.put('invoiceOrderdetail1Recoeds', invoiceOrderdetail1Recoeds);
    data.put('accountid', accountid);
    data.put('invoiceOrderRecoedschange', invoiceOrderRecoedschange);
    data.put('attachmentRecoeds', attachmentRecoeds);
    data.put('outOrderStringList', outOrderStringList);
    data.put('outordercountMap', outordercountMap);
    res.status = 'Success';
    res.code = 200;
    System.debug('res = ' + res);
    return res;
  }

  //保存
  @AuraEnabled
  public static ResponseBodyLWC save(
    Consumable_order__c cocLwc,
    String HospitalNameLwc,
    String HospitalInfoLwc,
    String SecondDealerLwc,
    String invoiceOrderRecoedsLwc,
    String deliveryIdLwc,
    String invoiceIdLwc,
    String accountidLwc,
    String agencyProTypeLwc,
    String reopenLwc,
    String invoiceOrderRecoedschangeLwc
  ) {
    System.debug('enter LexConInvoiceViewController.save success');
    ResponseBodyLWC res = new ResponseBodyLWC();
    Map<String, object> data = new Map<String, object>();
    res.entity = data;

    coc = cocLwc;
    HospitalName = HospitalNameLwc;
    HospitalInfo = HospitalInfoLwc;
    System.debug('HospitalInfo = ' + HospitalInfo);
    SecondDealer = SecondDealerLwc;
    errorMsg = '';
    deliveryId = deliveryIdLwc;
    invoiceOrderRecoeds = (List<InvoiceOrderInfo>) JSON.deserialize(
      invoiceOrderRecoedsLwc,
      List<InvoiceOrderInfo>.class
    );
    invoiceId = invoiceIdLwc;
    accountid = accountidLwc;
    agencyProType = agencyProTypeLwc;
    reopen = reopenLwc;
    invoiceOrderRecoedschange = (List<InvoiceOrderInfo>) JSON.deserialize(
      invoiceOrderRecoedschangeLwc,
      List<InvoiceOrderInfo>.class
    );

    List<String> chukudanID = new List<String>();
    if (coc.Name == '' || coc.Name == null) {
      // coc.Name.addError('请录入发票号');
      // return null;
      return new ResponseBodyLWC('Error', 500, '请录入发票号', '');
    }
    if (coc.Invoice_Date__c == null) {
      // coc.Invoice_Date__c.addError('请录入发票日期');
      // return null;
      return new ResponseBodyLWC('Error', 500, '请录入发票日期', '');
    }
    if (String.isBlank(HospitalInfo) && String.isBlank(SecondDealer)) {
      // coc.addError('必须输入客户名或者二级经销商');
      // return null;
      return new ResponseBodyLWC(
        'Error',
        500,
        '必须输入客户名或者二级经销商',
        ''
      );
    }
    if (
      HospitalInfo != null &&
      HospitalInfo != '' &&
      String.isNotEmpty(SecondDealer)
    ) {
      //coc.addError('请输入客户名、二级经销商只可输入一个');
      errorMsg += '请输入客户名、二级经销商只可输入一个';
    }
    if (HospitalInfo != null && HospitalInfo != '') {
      if (coc.Order_ForCustomerText__c == null) {
        // coc.Order_ForCustomerText__c.addError('请输入科室');
        // return null;
        return new ResponseBodyLWC('Error', 500, '请输入科室', '');
      }
    } else {
      if (coc.Order_ForCustomerText__c != null) {
        // coc.Order_ForCustomerText__c.addError('不需要输入科室');
        // return null;
        return new ResponseBodyLWC('Error', 500, '不需要输入科室', '');
      }
    }
    String shipmentAccountString = '';
    if (HospitalInfo != null) {
      shipmentAccountString = HospitalInfo;
    } else if (String.isNotEmpty(SecondDealer)) {
      shipmentAccountString = SecondDealer;
    } else {
      shipmentAccountString = coc.Order_ForDealerText__c == null
        ? ''
        : coc.Order_ForDealerText__c;
    }

    Integer x = 0;
    List<String> invoiceOrderAccountList = new List<String>();
    for (InvoiceOrderInfo ass : invoiceOrderRecoeds) {
      if (String.isBlank(deliveryId)) {
        if (ass.check == true) {
          x++;
          System.debug(shipmentAccountString);
          if (HospitalInfo != null && HospitalInfo != '') {
            if (ass.esd.Order_ForHospital__c != shipmentAccountString) {
              invoiceOrderAccountList.add(ass.esd.Name);
            }
          }
          if (String.isNotEmpty(SecondDealer)) {
            if (
              ass.esd.Order_ForDealer__c != shipmentAccountString &&
              ass.esd.Order_ForDealerText__c != shipmentAccountString
            ) {
              invoiceOrderAccountList.add(ass.esd.Name);
            }
          }
          if (
            coc.Order_ForDealerText__c != null &&
            (HospitalInfo == null ||
            HospitalInfo == '')
          ) {
            if (
              (ass.esd.Order_ForDealerText__c != null ||
              ass.esd.Order_ForDealerText__c != '') &&
              ass.esd.ShipmentAccount__c != shipmentAccountString
            ) {
              invoiceOrderAccountList.add(ass.esd.Name);
            }
          }
        }
      } else {
        if (HospitalInfo != null && HospitalInfo != '') {
          System.debug(
            '++++++++++++' +
              ass.esd.Order_ForHospital__c +
              '   ' +
              shipmentAccountString
          );
          if (ass.esd.Order_ForHospital__c != shipmentAccountString) {
            System.debug(
              'HospitalInfo != null ass.esd.Order_ForHospital__c != shipmentAccountString'
            );
            invoiceOrderAccountList.add(ass.esd.Name);
          }
        }
        //if (String.isNotEmpty(SecondDealer)) {
        if (String.isNotEmpty(SecondDealer)) {
          if (ass.esd.Order_ForDealer__c != shipmentAccountString) {
            System.debug(
              'String.isNotEmpty(SecondDealer) ass.esd.Order_ForHospital__c != shipmentAccountString'
            );
            invoiceOrderAccountList.add(ass.esd.Name);
          }
        }
        if (
          coc.Order_ForDealerText__c != null &&
          (HospitalInfo == null ||
          HospitalInfo == '')
        ) {
          if (
            (ass.esd.Order_ForDealerText__c != null ||
            ass.esd.Order_ForDealerText__c != '') &&
            ass.esd.ShipmentAccount__c != shipmentAccountString
          ) {
            System.debug(
              'HospitalInfo == null && ass.esd.Order_ForDealerText__c != null ass.esd.ShipmentAccount__c != shipmentAccountString'
            );
            invoiceOrderAccountList.add(ass.esd.Name);
          }
        }
      }
    }
    // invoiceOrderAccountList.add('12345');
    if (invoiceOrderAccountList.size() > 0) {
      orderRemind =
        invoiceOrderAccountList + '出库单客户名与发票客户名不一致！';
      // coc.addError(invoiceOrderAccountList + '出库单客户名与发票客户名不一致！');
      // return null;
      return new ResponseBodyLWC(
        'Error',
        500,
        invoiceOrderAccountList + '出库单客户名与发票客户名不一致！',
        ''
      );
    } else {
      orderRemind = '';
    }
    if (String.isBlank(deliveryId)) {
      if (x < 1) {
        // coc.addError('请选择需要开发票的出库单！');
        // return null;
        return new ResponseBodyLWC(
          'Error',
          500,
          '请选择需要开发票的出库单！',
          ''
        );
      }
    }
    Consumable_order__c invoiceHead = new Consumable_order__c();
    List<String> outOrderIdList = new List<String>();
    List<Consumable_order_LinkTable__c> invoiceLinkList = new List<Consumable_order_LinkTable__c>();
    Map<String, String> insertDetMap = new Map<String, String>();
    Map<String, String> deleteDetMap = new Map<String, String>();
    //新建发票时
    Savepoint sp = Database.setSavepoint();
    try {
      if (String.isBlank(invoiceId)) {
        invoiceHead.Name = coc.Name;
        if (
          coc.Invoice_status__c == null || String.isBlank(coc.Invoice_status__c)
        )
          coc.Invoice_status__c = '草案中';
        invoiceHead.Order_type__c = '发票';
        invoiceHead.Invoice_Date__c = coc.Invoice_Date__c;
        invoiceHead.Dealer_Info__c = accountid;
        invoiceHead.Invoice_Note__c = coc.Invoice_Note__c;
        invoiceHead.Invoice_status__c = '草案中';
        invoiceHead.Order_ProType__c = agencyProType;
        invoiceHead.Order_ForCustomerText__c = coc.Order_ForCustomerText__c;
        //if (deliveryId != null) {
        if (String.isNotBlank(deliveryId)) {
          invoiceHead.Outbound_order__c = deliveryId;
        }
        invoiceHead.RecordTypeid = System.Label.RT_ConOrder_Invoice;
        // if (SecondDealer == null) {
        if (String.isBlank(SecondDealer)) {
          if (HospitalInfo != null && HospitalInfo != '') {
            invoiceHead.Order_ForHospital__c = HospitalInfo;
          }
        } else {
          invoiceHead.Order_ForDealer__c = SecondDealer;
        }
        invoiceHead.Order_ForDealerText__c = coc.Order_ForDealerText__c;
        if (Test.isRunningTest()) {
          invoiceHead.Order_ForHospital__c = null;
        }
        insert invoiceHead;
        invoiceId = invoiceHead.Id;
        List<Consumable_order__c> cocinfo = new List<Consumable_order__c>();
        cocinfo = [
          SELECT
            Id,
            Name,
            Invoice_status__c,
            Invoice_Date__c,
            Order_ForDealerText__c,
            Dealer_Info__c,
            Order_ForDealer__c,
            Order_ForDealer__r.Name,
            Order_ForHospital__c,
            Order_date__c,
            Billed_Status__c,
            ShipmentAccount__c,
            Order_Dealer_Info__c,
            SummonsForDirction__c,
            Order_ForCustomerText__c,
            Invoice_Note__c,
            Invoice_attachment__c,
            Invoicedet_attachment__c,
            Outbound_order__c
          FROM Consumable_order__c
          WHERE Id = :invoiceId
        ];
        if (cocinfo.size() > 0) {
          invoiceHead = cocinfo[0];
        }
        if (!String.isBlank(deliveryId)) {
          for (InvoiceOrderInfo ass : invoiceOrderRecoeds) {
            chukudanID.add(ass.esd.Id);
            insertDetMap.put(ass.esd.Id, invoiceHead.Id);
          }
        } else {
          for (InvoiceOrderInfo ass : invoiceOrderRecoeds) {
            if (!String.isBlank(deliveryId)) {
              chukudanID.add(ass.esd.Id);
              insertDetMap.put(ass.esd.Id, invoiceHead.Id);
            } else {
              if (ass.check == true) {
                chukudanID.add(ass.esd.Id);
                insertDetMap.put(ass.esd.Id, invoiceHead.Id);
              } else {
                //deleteDetMap.put(ass.esd.Id,invoiceHead.Id);
              }
            }
          }
        }
        //新建发票明细1
        if (chukudanID.size() > 0) {
          newinvoicedetails1(chukudanID);
        }
        //ApexPages.addmessage(new ApexPages.message(ApexPages.severity.Error, 'deleteDetMap +++++' + deleteDetMap.size()));
        //return null;
        if (insertDetMap.size() > 0) {
          for (String field : insertDetMap.keySet()) {
            List<Consumable_order_LinkTable__c> existLinkinfo = [
              SELECT Id
              FROM Consumable_order_LinkTable__c
              WHERE
                Outboundorder_Code_link__c = :field
                AND Invoice_Code_link__c = :insertDetMap.get(field)
            ];
            if (existLinkinfo.size() < 1) {
              Consumable_order_LinkTable__c invoiceLink = new Consumable_order_LinkTable__c();
              invoiceLink.Name = field + insertDetMap.get(field);
              invoiceLink.Outboundorder_Code_link__c = field;
              invoiceLink.Invoice_Code_link__c = insertDetMap.get(field);
              invoiceLinkList.add(invoiceLink);
            }
          }
          upsert invoiceLinkList;
        }
      } else if (
        String.isNotBlank(reopen) &&
        reopen.equals('isreopen') &&
        String.isNotBlank(invoiceId)
      ) {
        System.debug('进入reopen');
        invoiceHead.Name = coc.Name;
        invoiceHead.Order_type__c = '发票';
        invoiceHead.Invoice_Date__c = coc.Invoice_Date__c;
        invoiceHead.Dealer_Info__c = accountid;
        invoiceHead.Invoice_Note__c = coc.Invoice_Note__c;
        invoiceHead.Invoice_status__c = '草案中';
        invoiceHead.Order_ProType__c = agencyProType;
        invoiceHead.Order_ForCustomerText__c = coc.Order_ForCustomerText__c;
        //if (deliveryId != null) {
        if (String.isNotBlank(deliveryId)) {
          invoiceHead.Outbound_order__c = deliveryId;
        }
        invoiceHead.RecordTypeid = System.Label.RT_ConOrder_Invoice;
        //if (SecondDealer == null) {
        if (String.isBlank(SecondDealer)) {
          if (HospitalInfo != null && HospitalInfo != '') {
            invoiceHead.Order_ForHospital__c = HospitalInfo;
          }
        } else {
          invoiceHead.Order_ForDealer__c = SecondDealer;
        }
        invoiceHead.Order_ForDealerText__c = coc.Order_ForDealerText__c;
        if (Test.isRunningTest()) {
          invoiceHead.Order_ForHospital__c = null;
        }
        insert invoiceHead;
        System.debug('invoiceHead = ' + invoiceHead);

        List<String> updateChukudanId = new List<String>();
        //获取原发票相关联的链接表信息
        List<Consumable_order_LinkTable__c> tLinkList = [
          SELECT Outboundorder_Code_link__c
          FROM Consumable_order_LinkTable__c
          WHERE Invoice_Code_link__c = :invoiceId
        ];

        for (Consumable_order_LinkTable__c colc : tLinkList) {
          colc.Invoice_Code_link__c = invoiceHead.Id;
          updateChukudanId.add(colc.Outboundorder_Code_link__c);
        }
        System.debug('tLinkList = ' + tLinkList);
        update tLinkList;
        //更新发票明细信息
        //获取出库单,设置关联关系
        //获取出库单明细信息,因为出库单信息和出库单明细信息是关联的,所有只需要回滚出库单明细信息即可

        Map<String, Consumable_Orderdetails__c> tempCocMap = new Map<String, Consumable_Orderdetails__c>();
        List<Consumable_Orderdetails__c> tempCountList = [
          SELECT
            Id,
            Consumable_order__c,
            Asset_Model_No__c,
            InvoicedProCost_RMB__c,
            Invoicedet1_OD_link__c,
            InvoicedProduct_RMB__c,
            Invoiced_Procount__c,
            Invoiced_BoxCount__c,
            Invoice_Unit__c
          FROM Consumable_Orderdetails__c
          WHERE Consumable_order__c = :invoiceId
        ];
        for (Consumable_Orderdetails__c cocTemp : tempCountList) {
          cocTemp.Consumable_order__c = invoiceHead.Id;
          tempCocMap.put(
            cocTemp.Invoicedet1_OD_link__c + cocTemp.Asset_Model_No__c,
            cocTemp
          );
        }
        System.debug('tempCountList = ' + tempCountList);
        update tempCountList;
        List<Consumable_Orderdetails__c> updateFromList = [
          SELECT
            Id,
            Consumable_order__c,
            RrturnPro_count__c,
            Delivery_List_RMB__c,
            InvoicedProCost_RMB__c,
            Invoiced_Procount__c,
            Invoice_Unitprice__c,
            Box_Piece__c,
            Invoice_Unit__c,
            Consumable_order__r.Invoice_total_amount__c,
            ProductPacking_list_manual__c,
            InvoicedProduct_RMB__c,
            Invoiced_BoxCount__c,
            Shipment_amount__c,
            Asset_Model_No__c
          FROM Consumable_Orderdetails__c
          WHERE Consumable_order__c IN :updateChukudanId
        ];
        for (Consumable_Orderdetails__c corderc : updateFromList) {
          String tempStr =
            corderc.Consumable_order__c + corderc.Asset_Model_No__c;
          if (tempCocMap.get(tempStr) != null) {
            //设置已发票金额 出库单的已发票金额 - 发票的发票金额
            corderc.InvoicedProCost_RMB__c =
              corderc.InvoicedProCost_RMB__c -
              tempCocMap.get(tempStr).InvoicedProduct_RMB__c;
            //设置已发票数量  出库单的已发票数量 - 发票的发票数量(盒)
            corderc.Invoiced_Procount__c =
              corderc.Invoiced_Procount__c -
              tempCocMap.get(tempStr).Invoiced_BoxCount__c;
            //设置发票单价
            if (
              corderc.Box_Piece__c == '盒' &&
              corderc.Invoice_Unit__c == '个'
            ) {
              corderc.Invoice_Unitprice__c =
                corderc.Delivery_List_RMB__c /
                corderc.ProductPacking_list_manual__c;
            } else {
              corderc.Invoice_Unitprice__c = corderc.Delivery_List_RMB__c;
            }
          }
        }

        Consumable_order__c tempcoc = new Consumable_order__c();
        tempcoc.Id = invoiceId;
        System.debug('tempcoc = ' + tempcoc);
        delete tempcoc;
        invoiceId = invoiceHead.Id;
        System.debug('updateFromList = ' + updateFromList);
        update updateFromList;
        //--------------------------------------------------------------------------
        for (InvoiceOrderInfo ass : invoiceOrderRecoeds) {
          if (ass.check == true) {
            insertDetMap.put(ass.esd.Id, invoiceHead.Id);
          } else {
            outOrderIdList.add(ass.esd.Id);
            deleteDetMap.put(ass.esd.Id, invoiceHead.Id);
          }
        }
        if (outOrderIdList.size() > 0) {
          getdefaultMapinfo(outOrderIdList);
        }
        //被选中的出库单集合
        if (insertDetMap.size() > 0) {
          List<Consumable_order_LinkTable__c> existLinkinfo = [
            SELECT Id, Invoice_Code_link__c, Outboundorder_Code_link__c
            FROM Consumable_order_LinkTable__c
            WHERE
              Outboundorder_Code_link__c IN :insertDetMap.keySet()
              AND Invoice_Code_link__c = :invoiceHead.Id
          ];
          //存在没有与发票建立关联关系的出库单
          List<String> templist2 = new List<String>();
          for (Consumable_order_LinkTable__c colc : existLinkinfo) {
            templist2.add(colc.Outboundorder_Code_link__c);
          }
          //获取该出库单
          for (String field : insertDetMap.keySet()) {
            if (!templist2.contains(field)) {
              //该出库单不存在与链接表中,新建链接
              chukudanID.add(field);
              Consumable_order_LinkTable__c invoiceLink = new Consumable_order_LinkTable__c();
              invoiceLink.Name = field + insertDetMap.get(field);
              invoiceLink.Outboundorder_Code_link__c = field;
              invoiceLink.Invoice_Code_link__c = insertDetMap.get(field);
              invoiceLinkList.add(invoiceLink);
            }
          }
          System.debug('invoiceLinkList = ' + invoiceLinkList);
          upsert invoiceLinkList;
        }
        //删除出库单链接表
        if (deleteDetMap.size() > 0) {
          List<Consumable_order_LinkTable__c> invoiceLinkdetList = new List<Consumable_order_LinkTable__c>();
          deleteOutboundorder(deleteDetMap, invoiceHead.Id);
          List<Consumable_order_LinkTable__c> existLinkinfo = [
            SELECT Id, Outboundorder_Code_link__c, Invoice_Code_link__c
            FROM Consumable_order_LinkTable__c
            WHERE
              Outboundorder_Code_link__c IN :deleteDetMap.keySet()
              AND Invoice_Code_link__c = :invoiceHead.Id
          ];
          for (Consumable_order_LinkTable__c colctemp : existLinkinfo) {
            if (
              deleteDetMap.get(colctemp.Outboundorder_Code_link__c) ==
              colctemp.Invoice_Code_link__c
            ) {
              //存在与该发票关联的出库单
              invoiceLinkdetList.add(colctemp);
            }
          }
          System.debug('invoiceLinkdetList = ' + invoiceLinkdetList);
          delete invoiceLinkdetList;
        }
        //新建发票明细1
        System.debug('===>' + chukudanID);
        System.debug('===>' + chukudanID.size());
        if (chukudanID.size() > 0) {
          newinvoicedetails1(chukudanID);
        }
      } else {
        //CHAN-BSS5SQ    update by rentongxiao 2020-09-04   end
        //编辑后保存
        List<Consumable_order__c> cocinfo = new List<Consumable_order__c>();
        cocinfo = [
          SELECT
            Id,
            Name,
            Invoice_status__c,
            Invoice_Date__c,
            Order_ForDealerText__c,
            Dealer_Info__c,
            Order_ForDealer__c,
            Order_ForDealer__r.Name,
            Order_ForHospital__c,
            Order_date__c,
            Billed_Status__c,
            ShipmentAccount__c,
            Order_Dealer_Info__c,
            SummonsForDirction__c,
            Order_ForCustomerText__c,
            Invoice_Note__c,
            Invoice_attachment__c,
            Invoicedet_attachment__c,
            Outbound_order__c
          FROM Consumable_order__c
          WHERE Id = :invoiceId
        ];
        if (cocinfo.size() > 0) {
          invoiceHead = cocinfo[0];
        }
        if (String.isNotBlank(deliveryId)) {
          for (InvoiceOrderInfo ass : invoiceOrderRecoedschange) {
            insertDetMap.put(ass.esd.Id, invoiceHead.Id);
          }

          //换货单产品数量
          Map<String, Decimal> needchangeOrderProcountMap = new Map<String, Decimal>();
          Map<String, Decimal> returnProcountMap = new Map<String, Decimal>();
          Map<String, Decimal> changeOrderProcountMap = new Map<String, Decimal>();
          List<Consumable_Orderdetails__c> detaliFromList = [
            SELECT
              Id,
              Name,
              Consumable_order__c,
              Asset_Model_No__c,
              Shipment_Count__c,
              RrturnPro_count__c,
              Delivery_List_RMB__c,
              InvoicedProCost_RMB__c,
              Invoiced_Procount__c,
              Invoiced_Count__c,
              Invoice_Unitprice__c,
              InvoiceProNot_count__c,
              Invoice_Unit__c,
              Box_Piece__c,
              Invoice_Cost_RMB__c
            FROM Consumable_Orderdetails__c
            WHERE Consumable_order__c = :deliveryId
          ];
          for (Consumable_Orderdetails__c changeOD : detaliFromList) {
            needchangeOrderProcountMap.put(
              changeOD.Asset_Model_No__c,
              changeOD.Shipment_Count__c
            );
          }
          //发票返品信息
          List<Consumable_Orderdetails__c> returnCountList = [
            SELECT
              Id,
              Name,
              Consumable_order__c,
              Asset_Model_No__c,
              Shipment_Count__c,
              RrturnPro_count__c,
              Delivery_List_RMB__c,
              InvoicedProCost_RMB__c,
              Invoiced_Procount__c,
              Invoiced_Count__c,
              Invoice_Unitprice__c,
              InvoiceProNot_count__c,
              Invoice_Cost_RMB__c,
              Invoice_Unit__c,
              Box_Piece__c
            FROM Consumable_Orderdetails__c
            WHERE Consumable_order__c = :invoiceId
          ];

          for (Consumable_Orderdetails__c changeOD : returnCountList) {
            if (changeOD.RrturnPro_count__c > 0) {
              if (returnProcountMap.containsKey(changeOD.Asset_Model_No__c)) {
                returnProcountMap.put(
                  changeOD.Asset_Model_No__c,
                  returnProcountMap.get(changeOD.Asset_Model_No__c) +
                  changeOD.RrturnPro_count__c
                );
              } else {
                returnProcountMap.put(
                  changeOD.Asset_Model_No__c,
                  changeOD.RrturnPro_count__c
                );
              }
            }
          }

          //已换货单出库数量信息
          List<Consumable_Orderdetails__c> returnCount1List = [
            SELECT
              Id,
              Name,
              Consumable_order__c,
              Asset_Model_No__c,
              Shipment_Count__c,
              RrturnPro_count__c,
              Delivery_List_RMB__c,
              InvoicedProCost_RMB__c,
              Invoiced_Procount__c,
              Invoiced_Count__c,
              Invoice_Unitprice__c,
              InvoiceProNot_count__c,
              Invoice_Cost_RMB__c,
              Invoice_Unit__c,
              Box_Piece__c
            FROM Consumable_Orderdetails__c
            WHERE
              Consumable_order__c IN (
                SELECT Outboundorder_Code_link__c
                FROM Consumable_order_LinkTable__c
                WHERE Invoice_Code_link__c = :invoiceId
              )
              AND Consumable_order__r.Onchange_order__c = TRUE
              AND Consumable_order__c != :deliveryId
          ];
          for (Consumable_Orderdetails__c changeOD : returnCount1List) {
            changeOrderProcountMap.put(
              changeOD.Asset_Model_No__c,
              changeOD.Shipment_Count__c
            );
          }
          outOrderchange(insertDetMap);
        } else {
          invoiceHead.Name = coc.Name;
          invoiceHead.Invoice_status__c = coc.Invoice_status__c;
          invoiceHead.Invoice_Date__c = coc.Invoice_Date__c;
          invoiceHead.Dealer_Info__c = accountid;
          invoiceHead.Invoice_Note__c = coc.Invoice_Note__c;
          invoiceHead.Invoice_status__c = '草案中';
          invoiceHead.Order_ProType__c = agencyProType;
          invoiceHead.Order_ForCustomerText__c = coc.Order_ForCustomerText__c;
          //ApexPages.addmessage(new ApexPages.message(ApexPages.severity.Error, 'HospitalName +++++'   + HospitalName));
          //return null;
          if (HospitalName != null && HospitalName != '') {
            if (HospitalInfo != null && HospitalInfo != '') {
              invoiceHead.Order_ForHospital__c = HospitalInfo;
            }
          } else {
            invoiceHead.Order_ForHospital__c = null;
          }
          invoiceHead.Order_ForDealer__c = SecondDealer == ''
            ? null
            : SecondDealer;
          invoiceHead.Order_ForDealerText__c = coc.Order_ForDealerText__c;
          update invoiceHead;
          for (InvoiceOrderInfo ass : invoiceOrderRecoeds) {
            if (ass.check == true) {
              insertDetMap.put(ass.esd.Id, invoiceHead.Id);
            } else {
              outOrderIdList.add(ass.esd.Id);
              deleteDetMap.put(ass.esd.Id, invoiceHead.Id);
            }
          }
          if (outOrderIdList.size() > 0) {
            getdefaultMapinfo(outOrderIdList);
          }
          //CHAN-BSS5SQ    update by rentongxiao 2020-09-08  start
          //被选中的出库单集合
          if (insertDetMap.size() > 0) {
            List<Consumable_order_LinkTable__c> existLinkinfo = [
              SELECT Id, Invoice_Code_link__c, Outboundorder_Code_link__c
              FROM Consumable_order_LinkTable__c
              WHERE
                Outboundorder_Code_link__c IN :insertDetMap.keySet()
                AND Invoice_Code_link__c = :invoiceHead.Id
            ];
            //存在没有与发票建立关联关系的出库单
            List<String> templist2 = new List<String>();
            for (Consumable_order_LinkTable__c colc : existLinkinfo) {
              templist2.add(colc.Outboundorder_Code_link__c);
            }
            //获取该出库单
            for (String field : insertDetMap.keySet()) {
              if (!templist2.contains(field)) {
                //该出库单不存在与链接表中,新建链接
                chukudanID.add(field);
                Consumable_order_LinkTable__c invoiceLink = new Consumable_order_LinkTable__c();
                invoiceLink.Name = field + insertDetMap.get(field);
                invoiceLink.Outboundorder_Code_link__c = field;
                invoiceLink.Invoice_Code_link__c = insertDetMap.get(field);
                invoiceLinkList.add(invoiceLink);
              }
            }
            upsert invoiceLinkList;
          }
          if (deleteDetMap.size() > 0) {
            List<Consumable_order_LinkTable__c> invoiceLinkdetList = new List<Consumable_order_LinkTable__c>();
            deleteOutboundorder(deleteDetMap, invoiceHead.Id);
            List<Consumable_order_LinkTable__c> existLinkinfo = [
              SELECT Id, Outboundorder_Code_link__c, Invoice_Code_link__c
              FROM Consumable_order_LinkTable__c
              WHERE
                Outboundorder_Code_link__c IN :deleteDetMap.keySet()
                AND Invoice_Code_link__c = :invoiceHead.Id
            ];
            for (Consumable_order_LinkTable__c colctemp : existLinkinfo) {
              if (
                deleteDetMap.get(colctemp.Outboundorder_Code_link__c) ==
                colctemp.Invoice_Code_link__c
              ) {
                //存在与该发票关联的出库单
                invoiceLinkdetList.add(colctemp);
              }
            }
            delete invoiceLinkdetList;
          }
          //CHAN-BSS5SQ    update by rentongxiao 2020-09-08  end
          //新建发票明细1
          if (chukudanID.size() > 0) {
            newinvoicedetails1(chukudanID);
          }
        }
      }
    } catch (Exception ex) {
      Database.rollback(sp);
      // ApexPages.addMessages(ex);
      // return null;
      System.debug('Exception ex = ' + ex.getMessage() + ex.getLineNumber());
      errorMsg += ex.getMessage() + ex.getLineNumber();
    }
    data.put('invoiceId', invoiceId);
    res.status = 'Success';
    res.code = 200;
    res.msg = errorMsg;
    System.debug('res = ' + res);
    return res;
  }

  public static void newinvoicedetails1(List<String> chukudanID) {
    //新规发票明细1
    List<Consumable_Orderdetails__c> invoiceorderList1 = new List<Consumable_Orderdetails__c>();
    //出库单明细更新
    List<Consumable_Orderdetails__c> outOrderList1 = new List<Consumable_Orderdetails__c>();
    List<Consumable_Orderdetails__c> detaliFromList = [
      SELECT
        Id,
        Name,
        Consumable_order__c,
        Asset_Model_No__c,
        Consumable_Product__r.Asset_Model_No__c,
        Shipment_Count__c,
        RrturnPro_count__c,
        Delivery_List_RMB__c,
        InvoicedProCost_RMB__c,
        Invoiced_Procount__c,
        Invoiced_Count__c,
        Invoice_Unitprice__c,
        InvoiceProNot_count__c,
        Invoice_Cost_RMB__c,
        Invoice_No__c,
        Consumable_Product__c,
        Intra_Trade_List_RMB__c,
        Dealer_Custom_Price__c,
        Sum_of_money__c,
        Box_Piece__c,
        Used_date__c,
        Send_date__c,
        Invoice_Unit__c,
        ProductPacking_list_manual__c
      FROM Consumable_Orderdetails__c
      WHERE Consumable_order__c IN :chukudanID AND InvoiceProNot_count__c > 0
    ];

    for (Integer i = 0; i < detaliFromList.size(); i++) {
      Consumable_Orderdetails__c invoiceInsert1 = new Consumable_Orderdetails__c();
      invoiceInsert1.Used_date__c = detaliFromList[i].Used_date__c;
      invoiceInsert1.Send_date__c = detaliFromList[i].Send_date__c;
      String str = string.valueOf(i + 1);
      if (str.length() == 1) {
        str = '0' + str;
      }
      invoiceInsert1.Name =
        coc.Name +
        '-' +
        detaliFromList[i]
          .Name.substring(
            detaliFromList[i].Name.length() - 7,
            detaliFromList[i].Name.length()
          );
      invoiceInsert1.Shipment_Count__c = detaliFromList[i]
        .InvoiceProNot_count__c;
      invoiceInsert1.Consumable_Product__c = detaliFromList[i]
        .Consumable_Product__c;
      invoiceInsert1.Intra_Trade_List_RMB__c = detaliFromList[i]
        .Intra_Trade_List_RMB__c;
      invoiceInsert1.Delivery_List_RMB__c = detaliFromList[i]
        .Delivery_List_RMB__c;
      invoiceInsert1.Dealer_Custom_Price__c = detaliFromList[i]
        .Dealer_Custom_Price__c;
      invoiceInsert1.RecordTypeId = System.Label.RT_ConOrderDetail1_Invoice;

      if (
        detaliFromList[i].Box_Piece__c == '盒' &&
        detaliFromList[i].Invoice_Unit__c == '个'
      ) {
        invoiceInsert1.Invoice_Unitprice__c =
          detaliFromList[i].Delivery_List_RMB__c /
          detaliFromList[i].ProductPacking_list_manual__c;
      } else {
        invoiceInsert1.Invoice_Unitprice__c = detaliFromList[i]
          .Delivery_List_RMB__c;
      }
      invoiceInsert1.Box_Piece__c = detaliFromList[i].Box_Piece__c;
      invoiceInsert1.Invoice_Unit__c = detaliFromList[i].Box_Piece__c;
      if (detaliFromList[i].Invoiced_Procount__c == null)
        detaliFromList[i].Invoiced_Procount__c = 0;
      if (detaliFromList[i].RrturnPro_count__c == null)
        detaliFromList[i].RrturnPro_count__c = 0;
      invoiceInsert1.Invoiced_Count__c = detaliFromList[i]
        .InvoiceProNot_count__c;
      if (detaliFromList[i].InvoicedProCost_RMB__c == null)
        detaliFromList[i].InvoicedProCost_RMB__c = 0;
      invoiceInsert1.InvoicedProCost_RMB__c =
        invoiceInsert1.Invoiced_Count__c * invoiceInsert1.Delivery_List_RMB__c;
      invoiceInsert1.Consumable_order__c = invoiceId;
      invoiceInsert1.Invoicedet1_OD_link__c = detaliFromList[i]
        .Consumable_order__c;
      invoiceorderList1.add(invoiceInsert1);
    }
    System.debug('invoiceorderList1 +++++' + invoiceorderList1.size());
    Savepoint sp = Database.setSavepoint();
    System.debug('invoiceorderList1 = ' + invoiceorderList1);
    if (invoiceorderList1.size() > 0) {
      try {
        System.debug('invoiceorderList1 = ' + invoiceorderList1);
        insert invoiceorderList1;
      } catch (Exception ex) {
        Database.rollback(sp);
        //ApexPages.addMessages(ex);
        errorMsg += ex.getMessage();
      }
    }
  }

  public static void getdefaultMapinfo(List<String> orderIdList) {
    List<Consumable_Orderdetails__c> existLinkinfo = new List<Consumable_Orderdetails__c>();
    existLinkinfo = [
      SELECT Id, Consumable_order__c, Consumable_product__c, Asset_Model_No__c
      FROM Consumable_Orderdetails__c
      WHERE Consumable_order__c IN :orderIdList
    ];
    // for (Integer i = 0; i < existLinkinfo.size(); i++) {
    //     ordermx1defaultMap.put(existLinkinfo[i].Consumable_order__c + existLinkinfo[i].Asset_Model_No__c, 0);
    // }
  }

  public static void deleteOutboundorder(
    Map<String, String> deleteMap,
    String value
  ) {
    //删除发票明细1
    List<Consumable_Orderdetails__c> detInvoicedet1List = [
      SELECT
        Id,
        Consumable_Shipment_order__c,
        Consumable_Sale_order__c,
        Consumable_product__c,
        Asset_Model_No__c
      FROM Consumable_Orderdetails__c
      WHERE
        Consumable_order__c = :value
        AND Invoicedet1_OD_link__c = :deleteMap.keySet()
    ];
    System.debug('detInvoicedet1List = ' + detInvoicedet1List);
    delete detInvoicedet1List;
  }

  //换货单链接表 发票明细2做成
  public static void outOrderchange(Map<String, String> insertDetMap) {
    List<string> chukudanID = new List<string>();
    List<Consumable_order_LinkTable__c> invoiceLinkList = new List<Consumable_order_LinkTable__c>();
    Consumable_order__c p = new Consumable_order__c();
    if (insertDetMap.size() > 0) {
      for (String field : insertDetMap.keySet()) {
        List<Consumable_order_LinkTable__c> existLinkinfo = [
          SELECT Id
          FROM Consumable_order_LinkTable__c
          WHERE Outboundorder_Code_link__c = :field
        ];
        if (existLinkinfo.size() > 0) {
          delete existLinkinfo;
        }
        chukudanID.add(field);
        Consumable_order_LinkTable__c invoiceLink = new Consumable_order_LinkTable__c();
        invoiceLink.Name = field + insertDetMap.get(field);
        invoiceLink.Outboundorder_Code_link__c = field;
        invoiceLink.Invoice_Code_link__c = insertDetMap.get(field);
        invoiceLinkList.add(invoiceLink);
        p.Id = field;
        p.ConInvoice_Code__c = insertDetMap.get(field);
        p.Onchange_order__c = true;
        update p;
      }
      insert invoiceLinkList;
    }
    //换货出库单明细1更新
    List<Consumable_Orderdetails__c> detaliFrom1List = [
      SELECT
        Id,
        Name,
        Consumable_order__c,
        Asset_Model_No__c,
        Consumable_Product__r.Asset_Model_No__c,
        Shipment_Count__c,
        RrturnPro_count__c,
        Delivery_List_RMB__c,
        InvoicedProCost_RMB__c,
        Invoiced_Procount__c,
        Invoiced_Count__c,
        Invoice_Unitprice__c,
        InvoiceProNot_count__c,
        Invoice_Cost_RMB__c,
        Invoice_No__c,
        Invoice_Unit__c,
        Box_Piece__c,
        Consumable_Sale_order__r.Name,
        Consumable_Shipment_order__r.Name
      FROM Consumable_Orderdetails__c
      WHERE Consumable_order__c IN :chukudanID
    ];
    for (Consumable_Orderdetails__c changeOD : detaliFrom1List) {
      changeOD.Invoiced_Procount__c = changeOD.Shipment_Count__c;
    }
    update detaliFrom1List;
  }

  //上传ContentVersion附件
  @AuraEnabled
  public static String saveFile(
    Id recordId,
    String fileName,
    String base64Data
  ) {
    base64Data = EncodingUtil.urlDecode(base64Data, 'UTF-8');
    ContentVersion cv = new ContentVersion();
    cv.Title = fileName;
    cv.PathOnClient = '/' + fileName;
    cv.FirstPublishLocationId = recordId;
    cv.VersionData = EncodingUtil.base64Decode(base64Data);
    cv.IsMajorVersion = true;
    insert cv;
    System.debug('cv.Id = ' + cv.Id);
    return cv.Id;
  }

  // 保存附件
  @AuraEnabled
  public static ResponseBodyLWC saveAttachment(
    String attachmentRecoedsLwc,
    String invoiceId
  ) {
    System.debug('进入 saveAttachment');
    ResponseBodyLWC res = new ResponseBodyLWC();
    Map<String, object> data = new Map<String, object>();
    res.entity = data;
    invoiceId = invoiceId;
    attachmentRecoeds = (List<InvoiceOrderInfo>) JSON.deserialize(
      attachmentRecoedsLwc,
      List<InvoiceOrderInfo>.class
    );
    System.debug('attachmentRecoeds = ' + attachmentRecoeds);
    try {
      Consumable_accessories_invoice__c attachmentdetails = new Consumable_accessories_invoice__c();
      for (InvoiceOrderInfo ass : attachmentRecoeds) {
        if (!String.isBlank(ass.mailSelectOptsin)) {
          attachmentdetails.Id = ass.invoiceOrderId;
          attachmentdetails.Attachment_ID__c = ass.cvInfo.ContentDocumentId;
          attachmentdetails.Accessories_type__c = ass.mailSelectOptsin;
          if (String.isBlank(ass.invoiceOrderId)) {
            attachmentdetails.Invoice_code__c = invoiceId;
          }
          upsert attachmentdetails;
        }
      }
    } catch (Exception e) {
      return new ResponseBodyLWC(
        'Error',
        500,
        e.getMessage() + e.getLineNumber(),
        ''
      );
    }
    res.status = 'Success';
    res.code = 200;
    System.debug('res = ' + res);
    return res;
  }

  // 检索(未开发票出库单)
  @AuraEnabled
  public static ResponseBodyLWC InvoiceorderSearch(
    Consumable_order__c cocLwc,
    String invoiceIdLwc,
    String accountidLwc,
    String userWorkLocationLwc,
    String agencyProTypeLwc,
    String HospitalInfoLwc,
    String SecondDealerLwc,
    String invoiceOrderRecoedsLwc
  ) {
    System.debug('进入 InvoiceorderSearch');
    ResponseBodyLWC res = new ResponseBodyLWC();
    Map<String, object> data = new Map<String, object>();
    res.entity = data;

    coc = cocLwc;
    HospitalInfo = HospitalInfoLwc;
    SecondDealer = SecondDealerLwc;
    errorMsg = '';
    invoiceOrderRecoeds = (List<InvoiceOrderInfo>) JSON.deserialize(
      invoiceOrderRecoedsLwc,
      List<InvoiceOrderInfo>.class
    );
    invoiceId = invoiceIdLwc;
    accountid = accountidLwc;
    agencyProType = agencyProTypeLwc;
    userWorkLocation = userWorkLocationLwc;

    Map<String, String> invoiceOrderMap = new Map<String, String>();
    String msoql = '';
    List<InvoiceOrderInfo> invoiceOrderdetailMid = new List<InvoiceOrderInfo>();
    if (String.isBlank(invoiceId)) {
      msoql = makeSoql();
    } else {
      msoql = makeSoqlInit();
    }
    invoiceOrderList = new List<Consumable_order__c>();
    invoiceOrderList = Database.query(msoql);
    for (InvoiceOrderInfo ass : invoiceOrderRecoeds) {
      if (ass.check == true) {
        invoiceOrderdetailMid.add(ass);
        invoiceOrderMap.put(ass.esd.Name, ass.esd.Name);
      }
    }
    invoiceOrderRecoeds = new List<InvoiceOrderInfo>();
    invoiceOrderRecoeds.addAll(invoiceOrderdetailMid);
    for (Integer i = 0; i < invoiceOrderList.size(); i++) {
      if (invoiceOrderMap.containsKey(invoiceOrderList[i].Name)) {
      } else {
        invoiceOrderRecoeds.add(new InvoiceOrderInfo(invoiceOrderList[i]));
        invoiceOrderMap.put(invoiceOrderList[i].Name, invoiceOrderList[i].Name);
      }
    }
    data.put('invoiceOrderRecoeds', invoiceOrderRecoeds);
    res.status = 'Success';
    res.code = 200;
    System.debug('res = ' + res);
    return res;
  }

  private static String makeSoql() {
    String soql = 'SELECT Id, Order_ForDealer__r.Name,Order_ForHospital__r.Name,Order_ForDealerText__c, Name,Outbound_Date__c,ShipmentAccount__c,Shipment_total_amount__c,RrturnPro_total_amount__c,Total_Invoiced_Procount__c,InvoiceNotPro_total_amount__c,InvoiceNotPro_money__c,Invoice_total_amount__c,Billed_Status__c  FROM Consumable_order__c  ';
    soql += ' WHERE Dealer_Info__c = \'' + accountid + '\'';
    soql += ' AND (recordtypeid = \'' + System.Label.RT_ConOrder_Sale + '\'';
    soql += ' OR recordtypeid = \'' + System.Label.RT_ConOrder_Shipment + '\'';
    soql += ' ) ';
    soql += ' AND Order_Owner_WorkLocal__c = \'' + userWorkLocation + '\' ';
    soql += ' AND Order_ProType__c =\'' + agencyProType + '\'';
    soql += ' AND Billed_Status__c != \'全部开票\'';
    soql += ' AND SummonsForDirction__c != \'互相调货\'';
    if (HospitalInfo != null && HospitalInfo != '') {
      soql += ' AND Order_ForHospital__c = \'' + HospitalInfo + '\'';
    }
    if (String.isNotEmpty(SecondDealer)) {
      soql += ' AND Order_ForDealer__c = \'' + SecondDealer + '\'';
    }
    if (coc.Order_ForDealerText__c != null) {
      soql +=
        ' AND ShipmentAccount__c = \'' +
        coc.Order_ForDealerText__c +
        '\'';
    }
    soql += ' AND InvoiceNotPro_total_amount__c > 0';
    soql += ' AND Onchange_order__c = false limit 1000';
    return soql;
  }

  private static String makeSoqlInit() {
    String soql = 'SELECT Id, Order_ForDealer__r.Name,Order_ForHospital__r.Name,Order_ForDealerText__c, Name,Outbound_Date__c,ShipmentAccount__c,Shipment_total_amount__c,RrturnPro_total_amount__c,Total_Invoiced_Procount__c,InvoiceNotPro_total_amount__c,InvoiceNotPro_money__c,Invoice_total_amount__c,Billed_Status__c  FROM Consumable_order__c  ';
    soql += ' WHERE Dealer_Info__c = \'' + accountid + '\'';
    soql += ' AND (recordtypeid = \'' + System.Label.RT_ConOrder_Sale + '\'';
    soql += ' OR recordtypeid = \'' + System.Label.RT_ConOrder_Shipment + '\'';
    soql += ' ) ';
    soql += ' AND Order_Owner_WorkLocal__c = \'' + userWorkLocation + '\' ';
    soql += ' AND Order_ProType__c =\'' + agencyProType + '\'';
    soql += ' AND SummonsForDirction__c != \'互相调货\' ';
    if (HospitalInfo != null && HospitalInfo != '') {
      soql += ' AND Order_ForHospital__c = \'' + HospitalInfo + '\'';
    }
    if (SecondDealer != null) {
      soql += ' AND Order_ForDealer__c = \'' + SecondDealer + '\'';
    }
    if (coc.Order_ForDealerText__c != null) {
      soql +=
        ' AND ShipmentAccount__c = \'' +
        coc.Order_ForDealerText__c +
        '\'';
    }
    soql += ' AND InvoiceNotPro_total_amount__c > 0';
    soql += ' AND Onchange_order__c = false limit 1000';
    return soql;
  }

  // 删除按钮
  @AuraEnabled
  public static ResponseBodyLWC deleteButton(
    String invoiceIdLwc,
    Consumable_order__c cocLwc
  ) {
    System.debug('进入 deleteButton');
    ResponseBodyLWC res = new ResponseBodyLWC();
    Map<String, object> data = new Map<String, object>();
    res.entity = data;

    coc = cocLwc;
    invoiceId = invoiceIdLwc;
    system.debug('====invoiceId==========>' + invoiceId);
    List<Consumable_Orderdetails__c> consList = [
      SELECT id, Consumable_order__c
      FROM Consumable_Orderdetails__c
      WHERE Consumable_order__c = :invoiceId
    ];
    try {
      system.debug('====cons==========>' + consList);
      delete consList;
      if (coc.id == invoiceId && coc.Invoice_status__c == '草案中') {
        delete coc;
      }
      res.status = 'Success';
      res.code = 200;
      System.debug('res = ' + res);
      return res;
    } catch (Exception e) {
      // ApexPages.addMessages(e);
      // return null;
      return new ResponseBodyLWC(
        'Error',
        500,
        e.getMessage() + ' ' + e.getLineNumber(),
        ''
      );
    }
  }

  // 提交按钮
  @AuraEnabled
  public static ResponseBodyLWC approval(
    List<String> outOrderStringListLwc,
    Map<String, Consumable_Orderdetails__c> outordercountMapLwc,
    String invoiceIdLwc
  ) {
    System.debug('进入 approval');
    ResponseBodyLWC res = new ResponseBodyLWC();
    Map<String, object> data = new Map<String, object>();
    res.entity = data;

    outOrderStringList = outOrderStringListLwc;
    outordercountMap = outordercountMapLwc;
    invoiceId = invoiceIdLwc;
    //更新发票明细2链接
    Consumable_order__c P = new Consumable_order__c();
    List<Consumable_order__c> cocinfo = new List<Consumable_order__c>();
    List<Consumable_order_details2__c> invoiceorderList2 = new List<Consumable_order_details2__c>();
    //更新出库单明细1
    List<Consumable_Orderdetails__c> outOrderdetUp1List = new List<Consumable_Orderdetails__c>();
    //需要更新出库单明细1
    List<Consumable_Orderdetails__c> outOrderdet1List = [
      SELECT
        Id,
        Name,
        Consumable_order__c,
        Consumable_order__r.Name,
        Asset_Model_No__c,
        Consumable_Product__r.Asset_Model_No__c,
        Shipment_Count__c,
        RrturnPro_count__c,
        Delivery_List_RMB__c,
        InvoicedProCost_RMB__c,
        Invoiced_Procount__c,
        Invoiced_Count__c,
        Invoice_Unitprice__c,
        InvoiceProNot_count__c,
        Invoice_Cost_RMB__c,
        Invoice_No__c,
        Box_Piece__c,
        Invoice_Unit__c
      FROM Consumable_Orderdetails__c
      WHERE Consumable_order__c IN :outOrderStringList
    ];
    for (Integer i = 0; i < outOrderdet1List.size(); i++) {
      if (
        outordercountMap.containsKey(
          outOrderdet1List[i].Consumable_order__c +
          outOrderdet1List[i].Asset_Model_No__c
        )
      ) {
        Consumable_Orderdetails__c invoiceUpdte1 = new Consumable_Orderdetails__c();
        invoiceUpdte1.Id = outOrderdet1List[i].Id;
        invoiceUpdte1.Invoice_Unit__c = outordercountMap.get(
            outOrderdet1List[i].Consumable_order__c +
            outOrderdet1List[i].Asset_Model_No__c
          )
          .Invoice_Unit__c;
        if (
          outordercountMap.get(
              outOrderdet1List[i].Consumable_order__c +
              outOrderdet1List[i].Asset_Model_No__c
            )
            .Box_Piece__c == '盒' &&
          outordercountMap.get(
              outOrderdet1List[i].Consumable_order__c +
              outOrderdet1List[i].Asset_Model_No__c
            )
            .Invoice_Unit__c == '个'
        ) {
          Decimal OldinvoicedProcount = 0;
          OldinvoicedProcount = (outordercountMap.get(
                outOrderdet1List[i].Consumable_order__c +
                outOrderdet1List[i].Asset_Model_No__c
              )
              .Invoiced_Count__c /
            outordercountMap.get(
                outOrderdet1List[i].Consumable_order__c +
                outOrderdet1List[i].Asset_Model_No__c
              )
              .ProductPacking_list_manual__c)
            .setScale(2);
          invoiceUpdte1.Invoiced_Procount__c =
            outOrderdet1List[i].Invoiced_Procount__c + OldinvoicedProcount;
        } else {
          invoiceUpdte1.Invoiced_Procount__c =
            outOrderdet1List[i].Invoiced_Procount__c +
            outordercountMap.get(
                outOrderdet1List[i].Consumable_order__c +
                outOrderdet1List[i].Asset_Model_No__c
              )
              .Invoiced_Count__c;
        }
        invoiceUpdte1.Invoice_Unitprice__c = outordercountMap.get(
            outOrderdet1List[i].Consumable_order__c +
            outOrderdet1List[i].Asset_Model_No__c
          )
          .Invoice_Unitprice__c;
        System.debug('====>procount' + invoiceUpdte1.Invoiced_Procount__c);
        System.debug('===>RMB' + outOrderdet1List[i].Delivery_List_RMB__c);
        invoiceUpdte1.InvoicedProCost_RMB__c =
          invoiceUpdte1.Invoiced_Procount__c *
          outOrderdet1List[i].Delivery_List_RMB__c;

        Decimal invoicedProcount = 0;
        if (
          outordercountMap.get(
              outOrderdet1List[i].Consumable_order__c +
              outOrderdet1List[i].Asset_Model_No__c
            )
            .Box_Piece__c == '盒' &&
          outordercountMap.get(
              outOrderdet1List[i].Consumable_order__c +
              outOrderdet1List[i].Asset_Model_No__c
            )
            .Invoice_Unit__c == '个'
        ) {
          invoicedProcount = (outordercountMap.get(
                outOrderdet1List[i].Consumable_order__c +
                outOrderdet1List[i].Asset_Model_No__c
              )
              .Invoiced_Count__c /
            outordercountMap.get(
                outOrderdet1List[i].Consumable_order__c +
                outOrderdet1List[i].Asset_Model_No__c
              )
              .ProductPacking_list_manual__c)
            .setScale(2);
        } else {
          invoicedProcount = outordercountMap.get(
              outOrderdet1List[i].Consumable_order__c +
              outOrderdet1List[i].Asset_Model_No__c
            )
            .Invoiced_Count__c;
        }
        System.debug(
          '发票数量===>' + outOrderdet1List[i].InvoiceProNot_count__c
        );
        System.debug('还没发票数量===>' + invoicedProcount);

        if (outOrderdet1List[i].InvoiceProNot_count__c < invoicedProcount) {
          // ApexPages.addmessage(
          //     new ApexPages.message(
          //         ApexPages.severity.Error,
          //         '出库单' +
          //         outOrderdet1List[i].Consumable_order__r.Name +
          //         '中，' +
          //         outOrderdet1List[i].Asset_Model_No__c +
          //         '还没开票数量小于发票数量，请确认是否有返品'
          //     )
          // );
          // return null;
          return new ResponseBodyLWC(
            'Error',
            500,
            '出库单' +
              outOrderdet1List[i].Consumable_order__r.Name +
              '中，' +
              outOrderdet1List[i].Asset_Model_No__c +
              '还没开票数量小于发票数量，请确认是否有返品',
            ''
          );
        }

        outOrderdetUp1List.add(invoiceUpdte1);
      }
    }
    Savepoint sp = Database.setSavepoint();
    try {
      //出库单明细1更新
      if (outOrderdetUp1List.size() > 0) {
        ControllerUtil.updateOrderDetails1Satus(outOrderdetUp1List);
      }
      //发票状态更新
      cocinfo = [
        SELECT
          Id,
          Name,
          Invoice_status__c,
          Dealer_Info__c,
          Order_ForHospital__c,
          SummonsForDirction__c
        FROM Consumable_order__c
        WHERE Id = :invoiceId
      ];
      System.debug('cocinfo = ' + cocinfo);
      if (cocinfo.size() > 0) {
        p = cocinfo[0];
      }
      System.debug('p = ' + p);
      p.Invoice_status__c = '提交';
      update p;
    } catch (Exception ex) {
      Database.rollback(sp);
      // ApexPages.addMessages(ex);
      // return null;
      return new ResponseBodyLWC(
        'Error',
        500,
        ex.getMessage() + ' ' + ex.getLineNumber(),
        ''
      );
    }
    res.status = 'Success';
    res.code = 200;
    System.debug('res = ' + res);
    return res;
  }
  @TestVisible
  class InvoiceOrderInfo implements Comparable {
    @AuraEnabled
    public Boolean check { get; set; }
    @AuraEnabled
    public Boolean oldCheck { get; set; }
    @AuraEnabled
    public Consumable_order__c esd { get; set; }
    @AuraEnabled
    public Consumable_Orderdetails__c esdet { get; set; }
    @AuraEnabled
    public Attachment attach { get; set; }
    @AuraEnabled
    public ContentVersion cvInfo { get; set; }
    @AuraEnabled
    public String mailSelectOptsin { get; set; }
    public List<SelectOption> mailSelectOpts { get; set; }
    @AuraEnabled
    public Map<String, String> mailSelectOptsMap { get; set; }
    @AuraEnabled
    public String invoiceOrderId { get; set; }
    @AuraEnabled
    public Decimal needInvoiceCount { get; set; }

    // 出库订单
    public InvoiceOrderInfo(Consumable_order__c e) {
      check = false;
      oldCheck = false;
      esd = e;
      needInvoiceCount = 0;
    }
    // 出库订单明细1
    public InvoiceOrderInfo(Consumable_Orderdetails__c e) {
      esdet = e;
    }
    //附件
    public InvoiceOrderInfo(Attachment e) {
      attach = e;
      mailSelectOpts = new List<SelectOption>();
      mailSelectOpts.add(new SelectOption('发票和明细', '发票和明细'));
      mailSelectOpts.add(new SelectOption('发票', '发票'));
      mailSelectOpts.add(new SelectOption('明细', '明细'));
    }
    //ContentVersion
    public InvoiceOrderInfo(ContentVersion cv) {
      cvInfo = cv;
      mailSelectOptsMap = new Map<String, String>();
      mailSelectOptsMap.put('发票和明细', '发票和明细');
      mailSelectOptsMap.put('发票', '发票');
      mailSelectOptsMap.put('明细', '明细');
    }
    // 排序
    public Integer compareTo(Object compareTo) {
      return null;
    }
  }
}
