buli
2023-07-14 744f42c5496e656a1f9927740a3b37c0b97a6cba
force-app/main/default/classes/LexConInvoiceViewController.cls
@@ -1,1962 +1,1683 @@
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 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 Boolean getdone() {
        return (invoiceOrderdetail1Recoeds.size() > 0);
    }
  }
  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 Boolean getExistOutbound() {
        return (coc.Outbound_order__c != null);
    }
  }
  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;
    public static String getInvoiceName() {
        return (coc.Name);
    }
    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();
    public static List<Consumable_Orderdetails__c> conoList { get; set; }
    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]));
    public static String shipmentAccount {
        get {
            return (coc.ShipmentAccount__c);
        }
      } else {
        if (statusEdit == '' || statusEdit == null) {
          EditAble = false;
        } else if (statusEdit != '' && statusEdit != null) {
          EditAble = true;
    }
    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();
        }
        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
    }
    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
        ];
        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
        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
        ];
        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);
        // 新規
        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 (ass.check == true) {
                chukudanID.add(ass.esd.Id);
                insertDetMap.put(ass.esd.Id, invoiceHead.Id);
              } else {
                //deleteDetMap.put(ass.esd.Id,invoiceHead.Id);
              }
                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]));
                }
            }
          }
        }
        //新建发票明细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)
        } 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 (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);
            if (coc.Order_ForDealer__c != null) {
                SecondDealer = coc.Order_ForDealer__c;
            }
          }
          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;
            if (coc.Order_ForHospital__c != null) {
                HospitalInfo = coc.Order_ForHospital__c;
                HospitalName = coc.Order_ForHospital__r.Name;
            }
          }
        }
        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 (
            //到链接表中查找关联出库单
            List<Consumable_order_LinkTable__c> outOrderList = [
                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 (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()) {
              if (!templist2.contains(field)) {
                //该出库单不存在与链接表中,新建链接
                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;
            }
            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);
          }
            insert invoiceLinkList;
        }
      }
    } 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
        //换货出库单明细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
        ];
        if (existLinkinfo.size() > 0) {
          delete existLinkinfo;
        for (Consumable_Orderdetails__c changeOD : detaliFrom1List) {
            changeOD.Invoiced_Procount__c = changeOD.Shipment_Count__c;
        }
        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;
        update detaliFrom1List;
    }
    //换货出库单明细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;
    //上传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;
    }
    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;
    // 保存附件
    @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(), '');
        }
      }
    } catch (Exception e) {
      return new ResponseBodyLWC(
        'Error',
        500,
        e.getMessage() + e.getLineNumber(),
        ''
      );
        res.status = 'Success';
        res.code = 200;
        System.debug('res = ' + res);
        return res;
    }
    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;
    // 检索(未开发票出库单)
    @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;
        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;
        Map<String, String> invoiceOrderMap = new Map<String, String>();
        String msoql = '';
        List<InvoiceOrderInfo> invoiceOrderdetailMid = new List<InvoiceOrderInfo>();
        if (String.isBlank(invoiceId)) {
            msoql = makeSoql();
        } 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;
            msoql = makeSoqlInit();
        }
        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;
        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);
            }
        }
        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 +
              '还没开票数量小于发票数量,请确认是否有返品',
            ''
          );
        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;
    }
        outOrderdetUp1List.add(invoiceUpdte1);
      }
    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;
    }
    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;
    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;
    }
    // 出库订单明细1
    public InvoiceOrderInfo(Consumable_Orderdetails__c e) {
      esdet = e;
    // 删除按钮
    @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(), '');
        }
    }
    //附件
    public InvoiceOrderInfo(Attachment e) {
      attach = e;
      mailSelectOpts = new List<SelectOption>();
      mailSelectOpts.add(new SelectOption('发票和明细', '发票和明细'));
      mailSelectOpts.add(new SelectOption('发票', '发票'));
      mailSelectOpts.add(new SelectOption('明细', '明细'));
    // 提交按钮
    @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;
    }
    //ContentVersion
    public InvoiceOrderInfo(ContentVersion cv) {
      cvInfo = cv;
      mailSelectOptsMap = new Map<String, String>();
      mailSelectOptsMap.put('发票和明细', '发票和明细');
      mailSelectOptsMap.put('发票', '发票');
      mailSelectOptsMap.put('明细', '明细');
    @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;
        }
    }
    // 排序
    public Integer compareTo(Object compareTo) {
      return null;
    }
  }
}
}