// 六个Apex方法，初始化，保存，取消，提交审批，追加品牌，追加型号
public with sharing class PCLLostReportController {

	public Product2 pro2 { get; set; }
	public string oppId { get; set; }
	public string lostReportId { get; set; }
	// 当前页面状态 Create,View and Edit, MarketEdit
	public string pageStatus { get; set; }
	// 失单，部分失单
	public string lostType {get; set;}
	public Set<ID> deleteBrandIDSet = new Set<ID>();
	public string submitFlag {get; set;}
	public LostReport LostReport {get; set;}
	public integer brandNo {get; set;}
	public integer RemoveBrandNo {get; set;}
	public integer setBrandNo {get; set;}
	public integer brandCount {get; set;}
	// add tcm 20211122 start
	public integer topNum {get; set;}
	public integer secondNum {get; set;}
	// add tcm 20211122 end
  
	public Decimal InclusionUltrasound {get; set;}     //20230506 lt DB202304618804  包含超声 add
  
  
	// 竞争对手对照关系表，key是品牌名字，value是ID
	public map<string,id> CompetitionMap;
	public PCLLostReportController(ApexPages.StandardController controller) {
	  this();
	}
	public PCLLostReportController(){
	  oppId =
		ApexPages.currentPage().getParameters().get('oppId') == null ? ''
		: ApexPages.currentPage().getParameters().get('oppId');
	  lostReportId =
		ApexPages.currentPage().getParameters().get('Id') == null ? ''
		: ApexPages.currentPage().getParameters().get('Id');
	  pageStatus =
		ApexPages.currentPage().getParameters().get('pageStatus') == null ? ''
		: ApexPages.currentPage().getParameters().get('pageStatus');
	  lostType =
		ApexPages.currentPage().getParameters().get('lostType') == null ? ''
		: ApexPages.currentPage().getParameters().get('lostType');
	  submitFlag = ApexPages.currentPage().getParameters().get('submitFlag') == null ? ''
		  : ApexPages.currentPage().getParameters().get('submitFlag');
  
	}
	// 初始化
	public void init(){
	  if(string.isblank(pageStatus)) {
		ApexPages.addmessage(new ApexPages.message(ApexPages.severity.Error, '页面出错，请刷新后重试！'));
		// 这里需要报错没有传参数
		return;
	  }
	  else if(pageStatus.equals('Create')) {
		if(string.isBlank(oppId)) {
		  // 这里报错创建时候必须有询价
		  ApexPages.addmessage(new ApexPages.message(ApexPages.severity.Error, '创建失单报告时，请重询价页面创建'));
		  return;
		}
		list<opportunity> opplist =
		[select id,Name,
		 Sales_assistant_ID__c,
		 Sales_manager_departmentID__c,Sales_owner_buchangID__c
		 from opportunity
		 where id =: oppId
					limit 1];
		if( opplist.size() == 0) {
		  ApexPages.addmessage(new ApexPages.message(ApexPages.severity.Error, '您没有询价的查看权限，无法创建失单报告！'));
		  pageStatus = null;
		  return;
		}
		Schema.DescribeSObjectResult s = Lost_cancel_report__c.sObjectType.getDescribe();
		if( !s.isCreateable()) {
		  ApexPages.addmessage(new ApexPages.message(ApexPages.severity.Error, '您不能创建失单/部分失单报告！'));
		  return;
		}
		Lost_cancel_report__c tempLostReport =
		  new Lost_cancel_report__c(LostType__c= lostType,
									Opportunity__c = oppId,
									Sales_assistant__c = opplist[0].Sales_assistant_ID__c,
									Manager_sales__c = opplist[0].Sales_manager_departmentID__c,
									Buchang_sales__c = opplist[0].Sales_owner_buchangID__c,
									Submit_Day__c = date.today(),
									Report_Status__c = '草案');
		LostReport = new LostReport(tempLostReport);
		brandCount = 1;
	  }
	  else if(pageStatus.equals('View') ||  pageStatus.equals('Edit')) {
		system.debug('edit1');
		if(string.isBlank(lostReportId)) {
		  ApexPages.addmessage(new ApexPages.message(ApexPages.severity.Error, '您没有查看这个失单/部分失单报告的权限！'));
		  pageStatus = null;
		  return;
		}
		system.debug('edit2');
		list<Lost_cancel_report__c> lostReportList =
		[select id,of_lost_system_processor__c,
		 Lost_reason_main__c,
		 Lost_Reason_Sub__c,Lost_By_Company__c,
		 LostTotalAmount__c,LostType__c,
		 TotalAmountLost__c, //20230215 lt DB202302247719
		 InclusionUltrasound__c, //20230506 lt DB202304618804  包含超声
		 ModifyAfterApproval__c,Approved_Day__c,//20230814 lt DB202308068183 失单报告审批节点增加助理审批节点 add
		 Report_Status__c,Sales_assistant__c,
		 Opportunity__c, Opportunity__r.Sales_assistant_ID__c,
		 Opportunity__r.Sales_manager_departmentID__c,
		 Manager_sales__c,recordtypeid,recordtype.DeveloperName
		 from Lost_cancel_report__c
		 where id =: lostReportId limit 1];
  
		if(lostReportList.size() == 0) {
		  ApexPages.addmessage(new ApexPages.message(ApexPages.severity.Error, '您没有查看这个失单/部分失单报告的权限！'));
		  pageStatus = null;
		  return;
		}
  
		InclusionUltrasound = lostReportList[0].InclusionUltrasound__c; //20230506 lt DB202304618804  包含超声
  
		lostReportList[0].Sales_assistant__c =
		  lostReportList[0].Opportunity__r.Sales_assistant_ID__c;
		lostReportList[0].Manager_sales__c =
		  lostReportList[0].Opportunity__r.Sales_manager_departmentID__c;
		if(lostReportList[0].recordtype.DeveloperName.equals('PCL_Lost_report')) {
		  lostReportList[0].LostType__c ='失单';
  
		}else if(lostReportList[0].recordtype.DeveloperName.equals('PCL_PartLost_report')) {
		  lostReportList[0].LostType__c ='部分失单';
		}
		// 权限，如果当前状态不是草案中，那么需要跳转到只读页面
		// 20230814 lt DB202308068183 失单报告审批节点增加助理审批节点 strat 改if条件
		//原：!'草案'.equals(lostReportList[0].Report_Status__c) && userinfo.getProfileId() != (ID) '00e10000000Y3o5AAC'
		if(
			!('草案'.equals(lostReportList[0].Report_Status__c) 
			|| userinfo.getProfileId() == (ID) '00e10000000Y3o5AAC'
			||('批准'.equals(lostReportList[0].Report_Status__c) && 
			   System.Label.PCLReportProfileId.contains(userinfo.getProfileId()))
			)
		  ) {
		// 20230814 lt DB202308068183 失单报告审批节点增加助理审批节点 end 改if条件
		  pageStatus = 'View';
		}
		oppId = lostReportList[0].Opportunity__c;
		system.debug('edit3');
		list<PCLLostBrand__c> selectlostBrandList =
		[
		  select id, LostPrice__c, Lost_By_Company__c,
		  LostPrices_ThousandY__c,  //20230215 lt DB202302247719
		  Lost_reason_main__c,Lost_Reason_Sub__c,Name,Agency__c, AgencyMannual__c,
		  Lost_cancel_report__c,Lost_By_Company_Mannual__c,
		  ( select id,PCLLostBrand__c,LostProduct__c,
			LostProductMannual__c,            //SWAG-C6P9PX lt 20210913 add
			ProductCategory__c,
			ProductClass__c, //add tcm 20211123
			Quantity__c,Name, LostBrandName__c 
			from PCLLostBrand__c.PCLLostBrandProduct__r)
		  from PCLLostBrand__c
		  where Lost_cancel_report__c =: lostReportId
		];
		if(selectlostBrandList.size() == 0 ) {
		  LostReport = new LostReport(lostReportList[0]);
		  brandCount = 1;
		}else{
		  system.debug('edit4:'+selectlostBrandList[0]);
		  brandCount = 0;
		  list<LostBrand> LostBrandList = new list<LostBrand>();
		  for(PCLLostBrand__c templostBrand : selectlostBrandList) {
			list<PCLLostProducts> tempProductList = new list<PCLLostProducts>();
			integer productCount = 0;
			system.debug('check products:'+ (templostBrand.PCLLostBrandProduct__r != null) + '|' + (templostBrand.PCLLostBrandProduct__r.size() > 0));
			if (templostBrand.PCLLostBrandProduct__r != null && templostBrand.PCLLostBrandProduct__r.size() > 0) {
			  for( PCLLostProduct__c tempProduct: templostBrand.PCLLostBrandProduct__r) {
				tempProductList.add(new PCLLostProducts(productCount,tempProduct));
				productCount++;
			  }
			} else {
			  PCLLostProducts newProduct = new PCLLostProducts();
			  if ('其他'.equals(templostBrand.Lost_By_Company__c) && 
				templostBrand.Lost_By_Company_Mannual__c != null && 
				!''.equals(templostBrand.Lost_By_Company_Mannual__c)) {
				  newProduct.LostProductss.LostBrandName__c = templostBrand.Lost_By_Company_Mannual__c;
				} else {
				  newProduct.LostProductss.LostBrandName__c = templostBrand.Lost_By_Company__c;
				}
				system.debug('aaa4+++'+templostBrand.Lost_By_Company_Mannual__c);
			  tempProductList.add(newProduct);
			  productCount++;
			}
			LostBrandList.add( new LostBrand(brandCount,tempProductList, templostBrand));
			brandCount++;
		  }
  
		  LostReport = new LostReport(lostReportList[0],LostBrandList);
		  system.debug('LostReport.LostBrands:'+LostReport.LostBrands);
		}
	  }
	  brandNo = 0;
	  // 读取竞争对手品牌
	  // BrandmapSet();
	  if(string.isNotEmpty(submitFlag)) {
		ApexPages.addmessage(new ApexPages.message(ApexPages.severity.CONFIRM,
												   '提交成功！'));
  
	  }
	}
	// 编辑 只有系统管理员或者草案中可以编辑
	public PageReference edit2(){
	  //20230814 lt DB202308068183 失单报告审批节点增加助理审批节点 start 
	  if( userinfo.getProfileId() == (ID) '00e10000000Y3o5AAC' ||
		  '草案'.equals(LostReport.LostReport.Report_Status__c) ||
		  ('批准'.equals(LostReport.LostReport.Report_Status__c) && 
		   System.Label.PCLReportProfileId.contains(userinfo.getProfileId())
		  )
		) {
		//20230814 lt DB202308068183 失单报告审批节点增加助理审批节点 end 
		pageStatus = 'Edit';
		init();
	  }
	  else{
		ApexPages.addmessage(new ApexPages.message(ApexPages.severity.Error, '只有在草案中才能进行编辑！'));
	  }
	  return null;
	}
	// 设置品牌
	public void setBrand(){
	  list<LostBrand> LostBrandlist =  LostReport.LostBrands;
	  LostBrand tempBrand = LostBrandlist.get(setBrandNo);
	  string brandName = tempBrand.lostBrand.Lost_By_Company__c;
	  // fy SWAG-CCC6F6 start
	  if(!'其他'.equals(tempBrand.lostBrand.Lost_By_Company_Mannual__c)){
		tempBrand.lostBrand.Lost_By_Company_Mannual__c = null;
	  }
	  system.debug('aaa5+++'+tempBrand.lostBrand.Lost_By_Company_Mannual__c);
	  // fy SWAG-CCC6F6 end
	  // ID compID = CompetitionMap.get(brandName);
	  for(PCLLostProducts tempLostProduct : tempBrand.LostProducts ) {
		// test
		// tempLostProduct.LostProductss.Competitor__c = compID;
		tempLostProduct.LostProductss.LostBrandName__c = brandName;
		tempLostProduct.LostProductss.LostProduct__c = null;
		tempLostProduct.LostProductss.LostProductMannual__c = null;
		tempLostProduct.LostProductss.Quantity__c = null;
		tempLostProduct.LostProductss.ProductClass__c = null;
		tempLostProduct.LostProductss.ProductCategory__c = null;
		tempLostProduct.bool=false;
	  }
	}
	// 设置品牌
	public void setbrandmannual(){
	  list<LostBrand> LostBrandlist =  LostReport.LostBrands;
	  LostBrand tempBrand = LostBrandlist.get(setBrandNo);
	  string brandName = tempBrand.lostBrand.Lost_By_Company__c;
	  String brandNameMannual = tempBrand.lostBrand.Lost_By_Company_Mannual__c;
	  // ID compID = CompetitionMap.get(brandName);
	  for(PCLLostProducts tempLostProduct : tempBrand.LostProducts ) {
		// test
		// tempLostProduct.LostProductss.Competitor__c = compID;
		system.debug('aaaa3++'+brandNameMannual);
		if ('其他'.equals(brandName) && brandNameMannual != null && !''.equals(brandNameMannual)) {
		  tempLostProduct.LostProductss.LostBrandName__c = brandNameMannual;
		  // tempLostProduct.LostProductss.LostProduct__c = null;
		  // tempLostProduct.LostProductss.LostProductMannual__c = null;
		  // tempLostProduct.LostProductss.Quantity__c = null;
		  // tempLostProduct.bool=false;
		}
	  }
	}
	// 保存
	public PageReference save(){
  
	  if(!DataCheck()) {
		return null;
	  }
	  if(!dataEntry()) {
		return null;
	  }
  
	  brandCount = LostReport.LostBrands.size();
	  pageStatus = 'View';
	  ApexPages.addmessage(new ApexPages.message(ApexPages.severity.CONFIRM, '保存成功！'));
  
	  return null;
	}
	//读取并构建竞争对手品牌
	// public void BrandmapSet(){
	//   CompetitionMap = new map<string, id>();
	//   list <Competition_Company__c> competitionList
	//       =  [select id,name from Competition_Company__c];
	//   for(Competition_Company__c tempComp : competitionList ) {
	//     CompetitionMap.put(tempComp.name, tempComp.id);
	//   }
  
	// }
	// 数据检查
	public boolean DataCheck(){
	  boolean dataCheck = true;
	  if(string.isBlank(LostReport.LostReport.LostType__c))
	  {
		LostReport.LostReport.LostType__c.addError('必须填写失单类型！');
		dataCheck = false;
	  }
	  for(LostBrand tempLostBrand : LostReport.LostBrands ) {
		system.debug('aaaa1++'+tempLostBrand.lostBrand.Lost_By_Company_Mannual__c);
		if(string.isblank(tempLostBrand.lostBrand.Lost_By_Company__c)) {
		  tempLostBrand.lostBrand.Lost_By_Company__c.addError('请填写失单品牌！');
		  dataCheck = false;
		}// fy SWAG-CCC6F6 start
		else if('其他'.equals(tempLostBrand.lostBrand.Lost_By_Company__c)&&string.isblank(tempLostBrand.lostBrand.Lost_By_Company_Mannual__c)){
		  tempLostBrand.lostBrand.Lost_By_Company_Mannual__c.addError('请填写失单品牌（手动）！');
		  dataCheck = false;
		}// fy SWAG-CCC6F6 end
		system.debug('aaaa2++'+tempLostBrand.lostBrand.Lost_By_Company_Mannual__c);
		if(tempLostBrand.lostBrand.LostPrice__c == null) {
		  tempLostBrand.lostBrand.LostPrice__c.addError('失单金额必填！');
		  dataCheck = false;
		}
		if(string.isblank(tempLostBrand.lostBrand.Lost_reason_main__c )) {
		  tempLostBrand.lostBrand.Lost_reason_main__c.addError('失单理由(主)必填！');
		  dataCheck = false;
		}
		if(string.isblank(tempLostBrand.lostBrand.Agency__c )) {
		  tempLostBrand.lostBrand.Agency__c.addError('中标经销商必填！');
		  dataCheck = false;
		}
		// 检查是否有超过1个有数的产品
		integer productCount = 0;
		for( PCLLostProducts temlostProduct : tempLostBrand.LostProducts) {
		  if (temlostProduct.LostProductss.LostProduct__c != null || temlostProduct.LostProductss.LostProductMannual__c != null) {
			System.debug('失单型号' + temlostProduct.LostProductss.LostProduct__c);
			System.debug('失单型号手动' + temlostProduct.LostProductss.LostProductMannual__c);
			productCount ++;
		  }
		  // update tcm 20211123 start
		  if((temlostProduct.LostProductss.LostProduct__c!=null || temlostProduct.LostProductss.LostProductMannual__c!=null)&&(temlostProduct.LostProductss.Quantity__c==null || temlostProduct.LostProductss.Quantity__c ==0)) {
			temlostProduct.LostProductss.Quantity__c.addError('请填写失单数量！');
			dataCheck = false;
		  }
		  if((temlostProduct.LostProductss.LostProduct__c!=null || temlostProduct.LostProductss.LostProductMannual__c!=null)&&temlostProduct.LostProductss.ProductCategory__c==null) {
			if (temlostProduct.LostProductss.ProductClass__c==null) {
			  temlostProduct.LostProductss.ProductClass__c.addError('失单产品类别必填！');
			  temlostProduct.LostProductss.ProductCategory__c.addError('失单产品必填！');
			}else {
			  temlostProduct.LostProductss.ProductCategory__c.addError('失单产品必填！');
			}
			dataCheck = false;
		  }
		  // 当失单品牌名为其他时,报错字段为失单对手型号（手动） thh 2022-01-17 start
		  if ((temlostProduct.LostProductss.LostProduct__c==null && temlostProduct.LostProductss.LostProductMannual__c==null)&&(temlostProduct.LostProductss.ProductCategory__c!=null||temlostProduct.LostProductss.Quantity__c!=null)) {
			if(tempLostBrand.lostBrand.Lost_By_Company__c != '其他'){
			  temlostProduct.LostProductss.LostProduct__c.addError('失单对手型号或失单对手型号（手动）必填！');
			} else{
			  temlostProduct.LostProductss.LostProductMannual__c.addError('失单对手型号或失单对手型号（手动）必填！');
			}
			dataCheck = false;
		  }
		  // 当失单品牌名为其他时,报错字段为失单对手型号（手动） thh 2022-01-17 end
		  // update tcm 20211123 end
		  // 20230418 ljh DB202304320022 start
		  String LostBrandNameS = tempLostBrand.lostBrand.Lost_By_Company__c != '其他'?tempLostBrand.lostBrand.Lost_By_Company__c:tempLostBrand.lostBrand.Lost_By_Company_Mannual__c;
		  String LostBrandName = temlostProduct.LostProductss.LostBrandName__c;
		  if(LostBrandNameS != LostBrandName){
			temlostProduct.LostProductss.LostBrandName__c.addError('失单品牌名不一致，请确认');
			dataCheck = false;
		  }
		  // 20230418 ljh DB202304320022 end
		  
		}
		// 当失单品牌名为其他时,报错字段为失单对手型号（手动） thh 2022-01-17 start
		if (productCount == 0 && tempLostBrand.LostProducts != null && tempLostBrand.LostProducts.size() > 0) {
		  if(tempLostBrand.lostBrand.Lost_By_Company__c != '其他'){
			tempLostBrand.LostProducts[0].LostProductss.LostProduct__c.addError('至少录入1条失单对手型号信息！');
		  }else{
			tempLostBrand.LostProducts[0].LostProductss.LostProductMannual__c.addError('至少录入1条失单对手型号信息！');
		  }
		  dataCheck = false;
		}
		// 当失单品牌名为其他时,报错字段为失单对手型号（手动） thh 2022-01-17 end
	  }
  
	  return dataCheck;
	}
	public list<LostBrand> brandcopy(){
	  list<LostBrand> tempbrands = new list<LostBrand>();
	  for(LostBrand tempbrand: LostReport.LostBrands) {
		LostBrand LostBrand =
		  new LostBrand(tempbrand.lineNo,tempbrand.LostProducts );
		LostBrand.lostBrand = tempbrand.lostBrand.clone();
		LostBrand.lostBrand.id = tempbrand.lostBrand.id;
		tempbrands.add(LostBrand);
	  }
	  return tempbrands;
	}
	// 数据录入
	public boolean dataEntry(){
	  system.debug('save---start:');
	  Savepoint sp = Database.setSavepoint();
	  Lost_cancel_report__c templostReport = LostReport.lostReport.clone();
	  templostReport.id = LostReport.lostReport.id;
	  list<LostBrand> tempBrands = brandcopy();
	  try{
		// 待完成，这里需要把第一个品牌的信息赋值到这个失单报告上去，还有需要把各个品牌金额汇总加起来；
		//system.debug('LostReport.LostBrands:'+LostReport.LostBrands);
		// 设置记录类型
		LostReport.lostReport.recordTypeID  =  LostReport.lostReport.LostType__c== '失单'?Schema.SObjectType.Lost_cancel_report__c.getRecordTypeInfosByDeveloperName().get('PCL_Lost_report').getRecordTypeId() : Schema.SObjectType.Lost_cancel_report__c.getRecordTypeInfosByDeveloperName().get('PCL_PartLost_report').getRecordTypeId();
		LostReport.lostReport.LostTotalAmount__c    = 0;
		LostReport.lostReport.TotalAmountLost__c    = 0;  //20230215 lt DB202302247719
		LostReport.lostReport.of_lost_system_processor__c   = 0;
		LostReport.lostReport.Lost_reason_main__c = null;
		LostReport.lostReport.Lost_Reason_Sub__c  = null;
		LostReport.lostReport.Lost_By_Company__c = null;
		//20230814 lt DB202308068183 失单报告审批节点增加助理审批节点 start
		//批准日不为空时给修改后再批准赋值
		if(LostReport.lostReport.Approved_Day__c != null){
			LostReport.lostReport.ModifyAfterApproval__c = true;
		}
		//20230814 lt DB202308068183 失单报告审批节点增加助理审批节点 end
		for(LostBrand tempLostBrand : LostReport.LostBrands) {
		  if(string.isNotBlank(tempLostBrand.lostBrand.Lost_By_Company__c)) {
			LostReport.lostReport.LostTotalAmount__c += tempLostBrand.lostBrand.LostPrice__c;
			//20230215 lt DB202302247719  start 
			Decimal med = tempLostBrand.lostBrand.LostPrice__c/1.13/1000;
			Decimal med1 = med.setScale(2);
			// System.debug('---lt123不含税数值(人工)Decimal---'+med);
			// System.debug('---lt123不含税数值(人工)Decimal两位小数---'+med1);
			LostReport.lostReport.TotalAmountLost__c += med1;
			//LostReport.lostReport.TotalAmountLost__c += tempLostBrand.lostBrand.LostPrices_ThousandY__c;  //20230215 lt DB202302247719
			// LostReport.lostReport.TotalAmountLost__c += tempLostBrand.lostBrand.LostPrice__c/1.13/1000;  //20230215 lt DB202302247719
			//20230215 lt DB202302247719  en
  
			LostReport.lostReport.Lost_reason_main__c =
			  LostReport.lostReport.Lost_reason_main__c == null
			  ? tempLostBrand.lostBrand.Lost_reason_main__c
			  : LostReport.lostReport.Lost_reason_main__c;
			LostReport.lostReport.Lost_Reason_Sub__c  =
			  LostReport.lostReport.Lost_Reason_Sub__c == null
			  ? tempLostBrand.lostBrand.Lost_Reason_Sub__c
			  : LostReport.lostReport.Lost_Reason_Sub__c;
			LostReport.lostReport.Lost_By_Company__c =
			  LostReport.lostReport.Lost_By_Company__c == null
			  ? tempLostBrand.lostBrand.Lost_By_Company__c
			  : LostReport.lostReport.Lost_By_Company__c;
  
			for( PCLLostProducts tempLostProduct : tempLostBrand.LostProducts) {
			  if(tempLostProduct.LostProductss.Quantity__c !=null && tempLostProduct.LostProductss.Quantity__c >0) {
				LostReport.lostReport.of_lost_system_processor__c   += tempLostProduct.LostProductss.Quantity__c;
			  }
			}
		  }
		}
		upsert LostReport.lostReport;
		// 需要插入更新的失单品牌
		map<integer,PCLLostBrand__c> upsertLostBrandMap = new map<integer,PCLLostBrand__c>();
		// 需要删掉的失单品牌
		map<integer,PCLLostBrand__c> deleteLostBrandMap = new map<integer,PCLLostBrand__c>();
		// 需要插入更新的失单型号，key是品牌编号+型号编号，value是需要更新的失单型号
		map<string,PCLLostProduct__c> upsertLostProductMap = new map<string,PCLLostProduct__c>();
		// 需要删掉的失单品牌
		list<PCLLostProduct__c> deleteLostProductList = new list<PCLLostProduct__c>();
		for(LostBrand tempLostBrand : LostReport.LostBrands ) {
		  // 如果有失单品牌，那么就要插入更新；
		  system.debug('tempLostBrand.lostBrand.Lost_By_Company__c:'+tempLostBrand.lostBrand.Lost_By_Company__c);
		  if(string.isNotBlank(tempLostBrand.lostBrand.Lost_By_Company__c)) {
			upsertLostBrandMap.put(tempLostBrand.lineNo,tempLostBrand.lostBrand);
			tempLostBrand.lostBrand.Lost_cancel_report__c = LostReport.lostReport.id;
			tempLostBrand.lostBrand.Name = tempLostBrand.lostBrand.Lost_By_Company__c;
			integer tempNo = 0;
			for( PCLLostProducts tempLostProduct : tempLostBrand.LostProducts) {
			  system.debug('Name:'+ tempLostProduct.LostProductss.Name );
			  if(tempLostProduct.LostProductss.Quantity__c !=null && tempLostProduct.LostProductss.Quantity__c >0) {
				tempLostProduct.LostProductss.Name = tempLostBrand.lostBrand.Name + tempLostProduct.LostProductss.Quantity__c;
				upsertLostProductMap.put(tempLostBrand.lineNo +':'+ tempNo,tempLostProduct.LostProductss);
			  }else if(string.isNotBlank(tempLostProduct.LostProductss.id)) {
				deleteLostProductList.add(tempLostProduct.LostProductss);
			  }
			  tempNo++;
			}
		  }
		  // 如果没有品牌，但是有id， 这样数据需要删除
		  else if(string.isNotBlank(tempLostBrand.lostBrand.id)) {
			deleteLostBrandMap.put(tempLostBrand.lineNo,tempLostBrand.lostBrand);
			// 这里可能需要也判断一下失单型号有没有需要删掉
		  }
		}
		if(upsertLostBrandMap.size()>0) {
		  upsert upsertLostBrandMap.values();
		}
		for( string productNo :upsertLostProductMap.keyset()) {
		  PCLLostProduct__c tempLostProduct = upsertLostProductMap.get(productNo);
		  integer brandNo = integer.valueof(productNo.split(':')[0]);
		  tempLostProduct.PCLLostBrand__c = upsertLostBrandMap.get(brandNo).id;
		}
		if(upsertLostProductMap.size()>0) {
		  upsert upsertLostProductMap.values();
		}
		if(deleteLostBrandMap.size()>0) {
		  delete deleteLostBrandMap.values();
		  for(PCLLostBrand__c pcl: deleteLostBrandMap.values()) {
			pcl.id = null;
		  }
		}
		if(deleteLostProductList.size()>0) {
		  delete deleteLostProductList;
		  for(PCLLostProduct__c pclp: deleteLostProductList) {
			pclp.id = null;
		  }
		}
		if(deleteBrandIDSet.size() > 0) {
		  list<id> tempdeleteIDlist = new list<id>();
		  tempdeleteIDlist.addall(deleteBrandIDSet);
		  database.delete(tempdeleteIDlist);
  
		}
  
		for(integer brandNumber =0; brandNumber< LostReport.LostBrands.size(); brandNumber++) {
  
		  LostBrand tempLostBrand = LostReport.LostBrands.get(brandNumber);
		  if(tempLostBrand.lostBrand.Id == null) {
			LostReport.LostBrands.remove(brandNumber);
			brandNumber--;
			continue;
		  }
		  for(integer productNumber = 0; productNumber< tempLostBrand.LostProducts.size(); productNumber++) {
			PCLLostProducts tempLostProduct = tempLostBrand.LostProducts.get(productNumber);
			if(tempLostProduct.LostProductss.Id == null) {
			  tempLostBrand.LostProducts.remove(productNumber);
			  productNumber--;
			  continue;
			}
		  }
		}
		lostReportId = LostReport.lostReport.id;
		system.debug('save---end:');
	  }catch (Exception ex) {
		Database.rollback(sp);
		LostReport.lostReport = templostReport;
		LostReport.LostBrands = tempBrands;
		// 这里需要写一些报错信息
		System.debug('---lt123---'+ex.getLineNumber());
		ApexPages.addmessage(new ApexPages.message(ApexPages.severity.Error,ex.getLineNumber() + ''));
		return false;
	  }
	  return true;
	}
  
	// 取消
	public PageReference cancel(){
	  PageReference page = new PageReference('/'+oppId);
	  page.setRedirect(true);
	  return page;
	}
	// 提交
	public PageReference submit(){
	  //20230814 lt DB202308068183 失单报告审批节点增加助理审批节点  update 
	  //&& LostReport.LostReport.ModifyAfterApproval__c == false
	  if(!'草案'.equals(LostReport.LostReport.Report_Status__c) && LostReport.LostReport.ModifyAfterApproval__c == false) {
		ApexPages.addmessage(new ApexPages.message(ApexPages.severity.Error, '只有在草案中才能提交申请！'));
		return null;
	  }

	  // 20230629 wkx DB202306242764  start
	  //20230814 lt DB202308068183 失单报告审批节点增加助理审批节点 add lcrlist1
	  //DB202308068183 add (不等于当前失单报告，批准后再修改用)
	  list<Lost_cancel_report__c> lcrlist1=[select id,Opportunity__c from Lost_cancel_report__c where Opportunity__c=:oppid and id!=:lostReportId limit 1];
	  list<opportunity> opplist1=[select id,cnt_lost_cancel_report__c,cnt_lost_cancel_draft__c from Opportunity where id=:oppid limit 1];
	  if (opplist1[0].cnt_lost_cancel_report__c - opplist1[0].cnt_lost_cancel_draft__c > 0  && lcrlist1.size() > 0) {
		  ApexPages.addmessage(new ApexPages.message(ApexPages.severity.Error, '已存在 询价失单/取消 报告！'));
		  return null;
	  }
	  // 20230629 wkx DB202306242764  end
  
	  Savepoint sp = Database.setSavepoint();
	  try{
		LostReport.lostReport.Report_Status__c = '提交';
		update LostReport.lostReport;
		//20230814 lt DB202308068183 失单报告审批节点增加助理审批节点 start 注释
		//DB202308068183 进 进程生成器
		// Approval.ProcessSubmitRequest psr = new Approval.ProcessSubmitRequest();
		// psr.setObjectId(lostReportId);
		// Approval.ProcessResult submitResult = Approval.process(psr);
		//20230814 lt DB202308068183 失单报告审批节点增加助理审批节点 end 注释
		PageReference page = new PageReference('/apex/PCLLostReportPage');
		page.getParameters().put('Id', lostReportId);
		page.getParameters().put('pageStatus', 'View');
		page.getParameters().put('submitFlag', '1');
  
		page.setRedirect(true);
		return page;
	  }catch(exception ex) {
		Database.rollback(sp);
		ApexPages.addmessage(new ApexPages.message(ApexPages.severity.Error,ex.getMessage()));
		return null;
	  }
	}
	// 添加品牌
	public PageReference addBrand(){
	  LostReport.LostBrands.add(new LostBrand(LostReport.LostBrands.size()));
	  brandCount = LostReport.LostBrands.size();
	  return null;
	}
	// 删除品牌 这个有参数brandNo，才知道是删除那个品牌
	public PageReference Remove(){
	  system.debug('RemoveBrandNo:'+RemoveBrandNo);
	  list<LostBrand> tempLostBrands = new List<lostBrand>();
	  Integer i = 0;
	  for(integer j = 0; j< LostReport.LostBrands.size(); j++ ) {
		LostBrand templostBrand  = LostReport.LostBrands.get(j);
		if(j != RemoveBrandNo) {
		  templostBrand.lineNo = i;
		  tempLostBrands.add(templostBrand);
		  i++;
		}else if(!string.isBlank(templostBrand.lostBrand.id)) {
		  deleteBrandIDSet.add(templostBrand.lostBrand.id);
		}
	  }
  
	  LostReport.LostBrands =  tempLostBrands;
  
	  brandCount = LostReport.LostBrands.size();
	  return null;
	}
	// 添加型号， 这个有参数brandNo，才知道是添加到那个品牌
	// update tcm 20211125 添加型号时自动带出品牌 start
	public PageReference addProduct(){
	  system.debug('brandNo:'+brandNo);
	  LostBrand tempLostBrand = LostReport.LostBrands.get(brandNo);
	  // PCLLostProduct__c plp = new PCLLostProduct__c(Competitor__c=CompetitionMap.get(LostReport.LostBrands[brandNo].lostBrand.Lost_By_Company__c));
	  // 20230418 ljh DB202304320022 start
	  // string brandName = tempLostBrand.lostBrand.Lost_By_Company__c;
	  string brandName = tempLostBrand.lostBrand.Lost_By_Company__c != '其他'?tempLostBrand.lostBrand.Lost_By_Company__c:tempLostBrand.lostBrand.Lost_By_Company_Mannual__c;    
	  // 20230418 ljh DB202304320022 end
	  PCLLostProduct__c plp = new PCLLostProduct__c();
	  plp.LostBrandName__c = brandName;
	  tempLostBrand.LostProducts.add(new PCLLostProducts(tempLostBrand.LostProducts.size(),plp));
	  tempLostBrand.ProductSize = tempLostBrand.LostProducts.size();
	  return null;
	}
	// update tcm 20211125 添加型号时自动带出品牌 end
	// 页面的数据结构
	public class LostReport {
	  public Lost_cancel_report__c lostReport { get; set; }
	  public list<LostBrand> LostBrands { get; set; }
	  public LostReport(){
		lostReport = new Lost_cancel_report__c();
		LostBrands = new list<LostBrand> {new LostBrand(0)};
	  }
	  public LostReport(Lost_cancel_report__c lostReport){
		this.lostReport = lostReport;
		LostBrands = new list<LostBrand> {new LostBrand(0)};
	  }
	  public LostReport(Lost_cancel_report__c lostReport,  list<LostBrand> LostBrands){
		this.lostReport = lostReport;
		this.LostBrands = LostBrands;
	  }
	}
  
	public class LostBrand {
	  public PCLLostBrand__c lostBrand { get; set; }
	  public Integer lineNo { get; set; }
	  public list<PCLLostProducts> LostProducts { get; set; }
	  public Integer ProductSize {get; set;}
	  public LostBrand( integer lineNo ){
		lostBrand = new PCLLostBrand__c();
		this.lineNo = lineNo;
		LostProducts = new list<PCLLostProducts> {new PCLLostProducts()};
		ProductSize = 1;
		lostBrand = new PCLLostBrand__c();
	  }
	  public LostBrand( integer lineNo, list<PCLLostProducts> LostProducts ){
		lostBrand = new PCLLostBrand__c();
		this.lineNo = lineNo;
		this.LostProducts = LostProducts;
		ProductSize = LostProducts.size();
	  }
	  public LostBrand( integer lineNo, list<PCLLostProducts> LostProducts,  PCLLostBrand__c lostBrand){
		this.lostBrand = lostBrand;
		this.lineNo = lineNo;
		this.LostProducts = LostProducts;
		ProductSize = LostProducts.size();
	  }
	}
	// add tcm 20211119 start
	public class PCLLostProducts {
	  public Integer lineNo2 { get; set; }
	  public PCLLostProduct__c LostProductss { get; set; }
	  public Boolean bool { get; set; }
  
	  public PCLLostProducts() {
		this.lineNo2 = 0;
		this.LostProductss=new PCLLostProduct__c();
	  }
  
	  public PCLLostProducts(Integer lineNo2) {
		this.lineNo2 = lineNo2;
		this.LostProductss=new PCLLostProduct__c();
	  }
  
	  public PCLLostProducts(Integer lineNo2,PCLLostProduct__c LostProductss) {
		this.lineNo2 = lineNo2;
		this.LostProductss=LostProductss;
		if (LostProductss.LostProduct__c != null) {
		  this.bool = true;
		}
	  }
	}
	// add tcm 20211119 end
  
	// add tcm 20211118 start
	public void search() {
	  if (LostReport.LostBrands[topNum].LostProducts[secondNum].LostProductss.LostProduct__c==null) {
		LostReport.LostBrands[topNum].LostProducts[secondNum].LostProductss.ProductClass__c=null;
		LostReport.LostBrands[topNum].LostProducts[secondNum].LostProductss.ProductCategory__c=null;
		LostReport.LostBrands[topNum].LostProducts[secondNum].bool=false;
  
	  }else {
		Product2 prd = [select Id,ProductClass__c
		, ProductCategory__c 
		from Product2 where Id =:LostReport.LostBrands[topNum].LostProducts[secondNum].LostProductss.LostProduct__c];
		if (prd.ProductCategory__c!=null) {
		  LostReport.LostBrands[topNum].LostProducts[secondNum].LostProductss.ProductClass__c=prd.ProductClass__c;
		  LostReport.LostBrands[topNum].LostProducts[secondNum].LostProductss.ProductCategory__c=prd.ProductCategory__c;
		  LostReport.LostBrands[topNum].LostProducts[secondNum].bool=true;
		}else {
		  LostReport.LostBrands[topNum].LostProducts[secondNum].LostProductss.ProductClass__c=null;
		  LostReport.LostBrands[topNum].LostProducts[secondNum].LostProductss.ProductCategory__c=null;
		  LostReport.LostBrands[topNum].LostProducts[secondNum].bool=false;
  
		}
	  }
	}
	// add tcm 20211118 end
  }