From d79fcb2a960e8b0e18fe039d892f98187b08866d Mon Sep 17 00:00:00 2001
From: 李彤 <litong@prec-tech.com>
Date: 星期五, 23 九月 2022 18:24:58 +0800
Subject: [PATCH] 招标项目失单报告

---
 force-app/main/default/classes/OpportunityTrigger.cls                |  407 +++++++++++++++
 force-app/main/default/aura/TenderLostApp/TenderLostApp.app          |    3 
 force-app/main/default/classes/TenderResultConfirmTaskBatch.cls      |  165 ++++++
 force-app/main/default/classes/TenderResultConfirmTaskBatchTest.cls  |  170 ++++++
 force-app/main/default/classes/CommonUtilsTest.cls                   |    7 
 force-app/main/default/classes/OpportunityTriggerTest.cls            |  160 +++++-
 force-app/main/default/aura/TenderLostApp/TenderLostAppRenderer.js   |    5 
 force-app/main/default/aura/TenderLostApp/TenderLostAppController.js |    5 
 force-app/main/default/classes/CommonUtils.cls                       |   46 
 force-app/main/default/aura/TenderLostApp/TenderLostApp.app-meta.xml |    5 
 force-app/main/default/aura/TenderLostApp/TenderLostApp.auradoc      |    6 
 force-app/main/default/aura/TenderLostApp/TenderLostAppHelper.js     |    5 
 force-app/main/default/lwc/tenderLost/tenderLost.js                  |  169 ++++++
 force-app/main/default/classes/TenderLostController.cls              |  150 +++++
 force-app/main/default/aura/TenderLostApp/TenderLostApp.svg          |    7 
 force-app/main/default/lwc/tenderLost/__tests__/tenderLost.test.js   |   25 
 force-app/main/default/aura/TenderLostApp/TenderLostApp.css          |    2 
 force-app/main/default/lwc/tenderLost/tenderLost.js-meta.xml         |    5 
 force-app/main/default/lwc/tenderLost/tenderLost.html                |   75 ++
 force-app/main/default/pages/TenderLostPage.page                     |   26 +
 force-app/main/default/classes/TenderLostControllerTest.cls          |   65 ++
 21 files changed, 1,453 insertions(+), 55 deletions(-)

diff --git a/force-app/main/default/aura/TenderLostApp/TenderLostApp.app b/force-app/main/default/aura/TenderLostApp/TenderLostApp.app
new file mode 100644
index 0000000..1080c02
--- /dev/null
+++ b/force-app/main/default/aura/TenderLostApp/TenderLostApp.app
@@ -0,0 +1,3 @@
+<aura:application access="public" extends="ltng:outApp">
+    <aura:dependency resource="c:TenderLostApp"/>
+</aura:application>
\ No newline at end of file
diff --git a/force-app/main/default/aura/TenderLostApp/TenderLostApp.app-meta.xml b/force-app/main/default/aura/TenderLostApp/TenderLostApp.app-meta.xml
new file mode 100644
index 0000000..b497bd6
--- /dev/null
+++ b/force-app/main/default/aura/TenderLostApp/TenderLostApp.app-meta.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<AuraDefinitionBundle xmlns="http://soap.sforce.com/2006/04/metadata">
+    <apiVersion>55.0</apiVersion>
+    <description>A Lightning Application Bundle</description>
+</AuraDefinitionBundle>
diff --git a/force-app/main/default/aura/TenderLostApp/TenderLostApp.auradoc b/force-app/main/default/aura/TenderLostApp/TenderLostApp.auradoc
new file mode 100644
index 0000000..d0d6eb5
--- /dev/null
+++ b/force-app/main/default/aura/TenderLostApp/TenderLostApp.auradoc
@@ -0,0 +1,6 @@
+<aura:documentation>
+	<aura:description>Documentation</aura:description>
+	<aura:example name="ExampleName" ref="exampleComponentName" label="Label">
+		Example Description
+	</aura:example>
+</aura:documentation>
\ No newline at end of file
diff --git a/force-app/main/default/aura/TenderLostApp/TenderLostApp.css b/force-app/main/default/aura/TenderLostApp/TenderLostApp.css
new file mode 100644
index 0000000..a5839d4
--- /dev/null
+++ b/force-app/main/default/aura/TenderLostApp/TenderLostApp.css
@@ -0,0 +1,2 @@
+.THIS {
+}
\ No newline at end of file
diff --git a/force-app/main/default/aura/TenderLostApp/TenderLostApp.svg b/force-app/main/default/aura/TenderLostApp/TenderLostApp.svg
new file mode 100644
index 0000000..791b3c7
--- /dev/null
+++ b/force-app/main/default/aura/TenderLostApp/TenderLostApp.svg
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg width="120px" height="120px" viewBox="0 0 120 120" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+	<g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+		<path d="M120,108 C120,114.6 114.6,120 108,120 L12,120 C5.4,120 0,114.6 0,108 L0,12 C0,5.4 5.4,0 12,0 L108,0 C114.6,0 120,5.4 120,12 L120,108 L120,108 Z" id="Shape" fill="#2A739E"/>
+		<path d="M77.7383308,20 L61.1640113,20 L44.7300055,63.2000173 L56.0543288,63.2000173 L40,99.623291 L72.7458388,54.5871812 L60.907727,54.5871812 L77.7383308,20 Z" id="Path-1" fill="#FFFFFF"/>
+	</g>
+</svg>
\ No newline at end of file
diff --git a/force-app/main/default/aura/TenderLostApp/TenderLostAppController.js b/force-app/main/default/aura/TenderLostApp/TenderLostAppController.js
new file mode 100644
index 0000000..77e406b
--- /dev/null
+++ b/force-app/main/default/aura/TenderLostApp/TenderLostAppController.js
@@ -0,0 +1,5 @@
+({
+    myAction : function(component, event, helper) {
+
+    }
+})
\ No newline at end of file
diff --git a/force-app/main/default/aura/TenderLostApp/TenderLostAppHelper.js b/force-app/main/default/aura/TenderLostApp/TenderLostAppHelper.js
new file mode 100644
index 0000000..ba7f386
--- /dev/null
+++ b/force-app/main/default/aura/TenderLostApp/TenderLostAppHelper.js
@@ -0,0 +1,5 @@
+({
+    helperMethod : function() {
+
+    }
+})
\ No newline at end of file
diff --git a/force-app/main/default/aura/TenderLostApp/TenderLostAppRenderer.js b/force-app/main/default/aura/TenderLostApp/TenderLostAppRenderer.js
new file mode 100644
index 0000000..f1f0c75
--- /dev/null
+++ b/force-app/main/default/aura/TenderLostApp/TenderLostAppRenderer.js
@@ -0,0 +1,5 @@
+({
+
+// Your renderer method overrides go here
+
+})
\ No newline at end of file
diff --git a/force-app/main/default/classes/CommonUtils.cls b/force-app/main/default/classes/CommonUtils.cls
index 8e650a6..cdb584a 100644
--- a/force-app/main/default/classes/CommonUtils.cls
+++ b/force-app/main/default/classes/CommonUtils.cls
@@ -28,27 +28,31 @@
 
 
      //鏌ヨ  鏅�氱瀹�
-    //  public static string GetPTKS(String content,String ParentId)
-    //  {
-    //      String paramYy = 'HP';
-    //      String sql = 'select ';
-    //      String props = GetSqlToPorps(account.SObjectType);
-    //      sql += props;
-    //      sql += ' from account';
-    //      sql += ' where Parent.Parent.RecordType_DeveloperName__c   = :paramYy';
-    //      if(content != null && content != '')
-    //      {
-    //          content = '%'+content+'%';
-    //          sql += ' and Name like :content ';
-    //      }
-    //      if(ParentId != null && ParentId != '')
-    //      {
-    //          sql += ' and Parentid = :ParentId ';
-    //      }
-    //      sql += ' limit 5 ';
-    //      List<account> arrays = Database.query(sql);
-    //      return JSON.serialize(arrays);  
-    //  }
+     public static string GetPTKS(String content, List<String> ParentIds, Boolean checkOwner)
+     {
+        String paramYy = 'HP';
+        String sql = 'select ';
+        String props = GetSqlToPorps(account.SObjectType);
+        sql += props;
+        sql += ' from account';
+        sql += ' where Parent.Parent.RecordType_DeveloperName__c   = :paramYy';
+        if(content != null && content != '')
+        {
+            content = '%'+content+'%';
+            sql += ' and Name like :content ';
+        }
+        if(ParentIds != null && ParentIds.size() > 0)
+        {
+            sql += ' and Parent.Parentid in :ParentIds ';
+        }
+        if (checkOwner) {
+            String userId = UserInfo.getUserId();
+            sql += ' and OwnerId = :userId';
+        }
+        sql += ' limit 5 ';
+        List<account> arrays = Database.query(sql);
+        return JSON.serialize(arrays);  
+     }
  
 
      //鏌ヨ  鏅�氱瀹�
diff --git a/force-app/main/default/classes/CommonUtilsTest.cls b/force-app/main/default/classes/CommonUtilsTest.cls
index 58c12b0..1b03e82 100644
--- a/force-app/main/default/classes/CommonUtilsTest.cls
+++ b/force-app/main/default/classes/CommonUtilsTest.cls
@@ -56,7 +56,9 @@
 	    //鏌ヨ  鍖婚櫌涓嬬殑绉戝 鍖呮嫭鎴樼暐鍜屾櫘閫氱瀹�
         CommonUtils.GetYYChilders('test',hospital.Id);
      	//鏌ヨ  鏅�氱瀹�
-        // CommonUtils.GetPTKS('test',hospital.Id);
+        List<String> hospitals = new List<String>();
+        hospitals.add(hospital.Id);
+        CommonUtils.GetPTKS('test',hospitals,false);
         //鏌ヨ  鏅�氱瀹�
         // CommonUtils.GetPTKSByYYParent('test',hospital.Id);
         //鏌ヨ  鎴樼暐绉戝
@@ -76,7 +78,8 @@
         //鑾峰彇閫夐」鍒楄〃鍊�
         CommonUtils.GetSelectedValues( Tender_information__c.irrelevantReasons__c.getDescribe());
 
-        CommonUtils.getPicklistValues( 'PCLLostBrand__c','ProductClass__c','ProductCategory__c');
+        // CommonUtils.getPicklistValues( 'PCLLostBrand__c','ProductClass__c','ProductCategory__c');
+        CommonUtils.getPicklistValues( 'Tender_information__c','InfoType__c','subInfoType__c');
 
 
     }
diff --git a/force-app/main/default/classes/OpportunityTrigger.cls b/force-app/main/default/classes/OpportunityTrigger.cls
index 15de464..3cfea75 100644
--- a/force-app/main/default/classes/OpportunityTrigger.cls
+++ b/force-app/main/default/classes/OpportunityTrigger.cls
@@ -1,5 +1,7 @@
 public without sharing class OpportunityTrigger {
 
+    public static Boolean isFirst = true;
+
     public static void lockOpportunityFile(List<Opportunity> newList, Map<Id, Opportunity> newMap, List<Opportunity> oldList, Map<Id, Opportunity> oldMap) {
 
         List<String> targetIds = new List<String>();
@@ -20,6 +22,7 @@
 
         update ofileList;
     }
+
     //CHAN-AZJ6JS 杩芥函绯荤粺鏉ョ殑璇环锛屽彇娑圵IN鏃讹紝缁忛攢鍟嗚鍗曡嚜鍔ㄦ敼鍒扳�滈┏鍥炩��
     public static void changeConsumableOrderStatus(List<Opportunity> newList, Map<Id, Opportunity> newMap, List<Opportunity> oldList, Map<Id, Opportunity> oldMap) {
         
@@ -163,10 +166,14 @@
                 //     temptender.IsReactionOpp__c = true;
                 //     tenderMap.put(temptender.id ,temptender ); 
                 // }
-                // 鍚堝苟鍒ゆ柇鏉′欢
+                // 鍚堝苟鍒ゆ柇鏉′欢 
+                //20220803 you 鎷涙爣椤圭洰澧炲姞 鍙栨秷锛屼腑鏍囩粨鏋滄洿鏂扮‘璁ゆ潯浠�
                 if((op.SAP_Send_OK__c != oldopp.SAP_Send_OK__c) || 
                     ((op.StageName__c.equals('澶卞崟') && !oldopp.StageName__c.equals('澶卞崟')) || 
-                    (!op.StageName__c.equals('澶卞崟') && oldopp.StageName__c.equals('澶卞崟')))) {
+                    (!op.StageName__c.equals('澶卞崟') && oldopp.StageName__c.equals('澶卞崟'))) ||
+                    ((op.StageName__c.equals('鍙栨秷') && !oldopp.StageName__c.equals('鍙栨秷')) || 
+                    (!op.StageName__c.equals('鍙栨秷') && oldopp.StageName__c.equals('鍙栨秷'))) ||
+                    (String.isNotBlank(op.ConfirmationofAward__c) && op.ConfirmationofAward__c!=oldopp.ConfirmationofAward__c)) {
                     for (Tender_Opportunity_Link__c link : links) {
                         if (link.Opportunity__c == op.Id) {
                             Tender_information__c temptender = new Tender_information__c();
@@ -293,5 +300,401 @@
         }
     }
     //LastBuy 棰勭暀浜у搧 lt 20220315 end
+//SWAG-CHL67J 銆愬鎵樸�戙�怓Y23璇环鏀瑰杽銆�-璇环椤甸潰/鎷涙爣椤圭洰澧炲姞缁熻瀛楁 fy start 
+// public static void UpdateBidNumber(List<Opportunity> newList, Map<Id, Opportunity> newMap, List<Opportunity> oldList, Map<Id, Opportunity> oldMap){
+//     List<Id> OpportunityIdList = new List<Id>();
+//     Boolean flag = true;
+//     for (Opportunity opp : newList) {
+//         OpportunityIdList.add(opp.Id);
+//         Opportunity oldopp = oldMap == null? null : oldMap.get(opp.Id); 
+//         if(oldopp==null){
+//             if(opp.NumberOfBids__c!=null||opp.BidWinningNumber__c!=null){
+//                 flag = true;
+//             }
+//         }else{
+//             if(opp.NumberOfBids__c!=oldopp.NumberOfBids__c||opp.NumberOfBids__c!=oldopp.NumberOfBids__c){
+//                 flag = true;
+//             }
+//         }
+//     }
+//     system.debug('newList+++'+newList);
+//     system.debug('oldList+++'+oldList);
+//     if(flag){
+//         List<Tender_Opportunity_Link__c> TenderOpportunityLinkList = [select Tender_information__c from Tender_Opportunity_Link__c where Opportunity__c in:OpportunityIdList];
+//         Set<Id> enderOpportunityId = new Set<Id>();
+//         if(TenderOpportunityLinkList.size()>0){
+//             for (Tender_Opportunity_Link__c TenderOpportunity : TenderOpportunityLinkList) {
+//                 enderOpportunityId.add(TenderOpportunity.Tender_information__c);
+//             }
+//         }
+//         system.debug('TenderOpportunityLinkList+++'+TenderOpportunityLinkList);
+//         List<Tender_Opportunity_Link__c> TenderOpportunityLinkList2 = [select Tender_information__c,Opportunity__r.NumberOfBids__c,Opportunity__r.BidWinningNumber__c from Tender_Opportunity_Link__c where Tender_information__c in:enderOpportunityId];
+//         Map<String,Tender_information__c> TenderinformationMap = new Map<String,Tender_information__c>();
+//         system.debug('TenderOpportunityLinkList2+++'+TenderOpportunityLinkList2);
+//         if(TenderOpportunityLinkList2.size()>0){
+//             for(Tender_Opportunity_Link__c TenderOpportunity2 :TenderOpportunityLinkList2){
+//                     if(TenderinformationMap.containsKey(TenderOpportunity2.Tender_information__c)){
+//                         Tender_information__c Tender_informationvalue = new Tender_information__c();
+//                         Tender_informationvalue = TenderinformationMap.get(TenderOpportunity2.Tender_information__c);
+//                         Tender_informationvalue.NumberOfBids__c=Tender_informationvalue.NumberOfBids__c+TenderOpportunity2.Opportunity__r.NumberOfBids__c;
+//                         Tender_informationvalue.BidWinningNumber__c=Tender_informationvalue.BidWinningNumber__c+TenderOpportunity2.Opportunity__r.BidWinningNumber__c;
+//                         TenderinformationMap.put(TenderOpportunity2.Tender_information__c, Tender_informationvalue);
+//                     }else{
+//                         Tender_information__c Tender_informationvalue = new Tender_information__c();
+//                         Tender_informationvalue.Id=TenderOpportunity2.Tender_information__c;
+//                         Tender_informationvalue.NumberOfBids__c=TenderOpportunity2.Opportunity__r.NumberOfBids__c;
+//                         Tender_informationvalue.BidWinningNumber__c=TenderOpportunity2.Opportunity__r.BidWinningNumber__c;
+//                         TenderinformationMap.put(TenderOpportunity2.Tender_information__c, Tender_informationvalue);
+//                     }
+//             }
+//         }
+//         List<Tender_information__c> Tender_informationList = new List<Tender_information__c>();
+//         for (Tender_information__c value : TenderinformationMap.values()) {
+//             Tender_informationList.add(value);
+//         }
+//         system.debug('Tender_informationList+++'+Tender_informationList);
+//         update Tender_informationList;
+//     }
+// }
+//SWAG-CHL67J 銆愬鎵樸�戙�怓Y23璇环鏀瑰杽銆�-璇环椤甸潰/鎷涙爣椤圭洰澧炲姞缁熻瀛楁 fy end
+    //add 璇环璺熻繘浠诲姟寮�鍙� - 3.鍒涘缓澶卞崟浠诲姟 sx 20220617 start
+    //璇环涓爣缁撴灉纭绔炰簤瀵规墜涓爣鏃跺疄鏃跺垱寤哄け鍗曚换鍔�
+    public static void createTaskByOppConfirmationofAward(List<Opportunity> newList, Map<Id, Opportunity> newMap, List<Opportunity> oldList, Map<Id, Opportunity> oldMap){
 
+        if (!isFirst) {
+            return;
+        }
+
+        Set<Id> oppoIds = new Set<Id>();
+        for(Opportunity op : newList){
+            Opportunity oldopp =  oldMap.get(op.Id);
+            //璇环涓爣缁撴灉纭绔炰簤瀵规墜涓爣鏃跺疄鏃跺垱寤哄け鍗曚换鍔� 涓� 璇环鐘舵��1绛変簬璇环
+            if (oldopp.ConfirmationofAward__c != '绔炰簤瀵规墜涓爣' && op.ConfirmationofAward__c == '绔炰簤瀵规墜涓爣' && op.StageName__c == '璇环' && op.LeakageNumber__c !=1){
+                oppoIds.add(op.Id);
+            }
+        }
+
+        if (!oppoIds.isEmpty()) {
+            // 鏈夋晥澶卞崟鐘舵�佷竴瑙�
+            List<String> validStatus = new List<String>{'鐢宠涓�', '鎻愪氦', '鎵瑰噯'};
+            // 璇环澶卞崟/鍙栨秷鎶ュ憡鏌ヨ
+            List<Lost_cancel_report__c> lostCancelReportList = [SELECT Id, Opportunity__c from Lost_cancel_report__c WHERE Opportunity__c in :oppoIds and Report_Status__c in: validStatus];
+            
+            //<璇环Id, 澶卞崟鎶ュ憡>
+            Map<String, Lost_cancel_report__c> lostCancelReportMap = new Map<String, Lost_cancel_report__c>();
+            for(Lost_cancel_report__c lcr : lostCancelReportList){
+                if (!lostCancelReportMap.isEmpty() && lostCancelReportMap.containsKey(lcr.Opportunity__c)) {
+                    // no action
+                } else {
+                    lostCancelReportMap.put(lcr.Opportunity__c, lcr);
+                }
+            }
+
+            List<Task__c> insTaskList = new List<Task__c>();
+            
+            // 瀹氫箟闇�瑕佹洿鏂扮殑璇环浠诲姟
+            List<Opportunity> updateOpportunity = new List<Opportunity>();
+            
+            // 璁板綍绫诲瀷锛氬け鍗曟姤鍛婁换鍔�
+            List<RecordType> recordTypes = [select Id from RecordType where IsActive = true and SobjectType = 'task__c' and DeveloperName = 'LoseListTask'];
+            Id loseListTask_TaskId = recordTypes.get(0).Id;
+            //String taskName = '';
+                
+            for(Opportunity opp : newList) {
+                //娌℃湁宸叉彁浜ょ殑澶卞崟鎶ュ憡
+                if(!lostCancelReportMap.containsKey(opp.Id) && oppoIds.contains(opp.Id)) {
+
+                    //鍒涘缓澶卞崟浠诲姟鎻愰啋
+                    Task__c tempTask = new Task__c();
+                    tempTask.RecordTypeId = loseListTask_TaskId;
+                    tempTask.taskDifferent__c = '琚姩浠诲姟';
+                    tempTask.taskStatus__c = '02 鎺ュ彈';       //浠诲姟鐘舵��2
+                    tempTask.assignee__c = opp.OwnerId;    //琚垎閰嶈��
+                    tempTask.account__c = opp.AccountId;
+                    tempTask.Name = '澶卞崟缁撴灉纭锛�' + opp.Opportunity_No__c;
+                    tempTask.OwnerId = opp.OwnerId;   //鎵�鏈変汉
+                    tempTask.OpportunityId__c = opp.Id;
+                    tempTask.ConfirmDate__c = Date.today();
+                    insTaskList.add(tempTask);
+                    
+                    //鏇存柊璇环  Task_createTime__c  
+                    Opportunity uopp  = new Opportunity();
+                    uopp.Id = opp.Id;
+                    uopp.LostTask_createTime__c  = Date.today();
+                    updateOpportunity.add(uopp);
+                }
+            }
+
+            if (!insTaskList.isEmpty()) {
+                insert insTaskList;
+            }
+            if (!updateOpportunity.isEmpty()) {
+                update updateOpportunity;
+            }
+        }
+        isFirst = false;
+    }
+    //add 璇环璺熻繘浠诲姟寮�鍙� - 3.鍒涘缓澶卞崟浠诲姟 sx 20220617 end
+
+
+    //璇环璺熻繘浠诲姟寮�鍙� 
+    public static void opportunityTasks(List<Opportunity> newList, Map<Id, Opportunity> newMap, List<Opportunity> oldList, Map<Id, Opportunity> oldMap){
+        Set<Id> oppoIds = new Set<Id>();
+    
+        for(Opportunity op : newList){
+            Opportunity oldopp =  oldMap.get(op.Id);
+            
+            //璇环涓爣缁撴灉纭绔炰簤瀵规墜涓爣鏃跺疄鏃跺垱寤哄け鍗曚换鍔� 涓� 璇环鐘舵��1绛変簬璇环
+            if (oldopp.ConfirmationofAward__c != 'OLY涓爣' && op.ConfirmationofAward__c == 'OLY涓爣' && op.StageName__c == '璇环'){
+                oppoIds.add(op.Id);
+                //纭涓爣缁撴灉鏃堕棿 鍒涘缓浠诲姟鏃堕棿  20220629 sx
+                op.ConfirmationofAward_createTime__c = Date.today();
+                if(op.Task_createTime__c!=null){
+                    
+                    //鏄惁鎸夋椂纭锛�3涓伐浣滄棩鍐呮寜鏃�1锛屼笉鎸夋椂0
+                    String inttemp = CalendarUtil.getWorkDayNum(String.valueOf(op.Task_createTime__c), String.valueOf(op.ConfirmationofAward_createTime__c));
+                    op.Is_ConfirmationofAward__c = Integer.valueOf(inttemp) > 3 ? 0 : 1;   
+                }
+            }
+
+            //20220628浼氳鏂伴渶姹�  瀵规墜涓爣 7.涓爣鏃ユ竻绌�
+            if(oldopp.ConfirmationofAward__c != '绔炰簤瀵规墜涓爣' && op.ConfirmationofAward__c == '绔炰簤瀵规墜涓爣'){
+                op.Closing_Bid_Date__c = null;
+                op.ConfirmationofAward_createTime__c = Date.today(); 
+                if(op.Task_createTime__c!=null){
+                   
+                    //鏄惁鎸夋椂纭锛�3涓伐浣滄棩鍐呮寜鏃�1锛屼笉鎸夋椂0
+                    String inttemp = CalendarUtil.getWorkDayNum(String.valueOf(op.Task_createTime__c), String.valueOf(op.ConfirmationofAward_createTime__c));
+                    op.Is_ConfirmationofAward__c = Integer.valueOf(inttemp) > 3 ? 0 : 1;    
+                }              
+            }
+        }
+
+        if(!oppoIds.isEmpty()){
+
+            list<Tender_Opportunity_Link__c> toppLinkList = [Select Id, Opportunity__c, Tender_information__c,Tender_information__r.ResultDate__c FROM Tender_Opportunity_Link__c WHERE Opportunity__c in :oppoIds];
+            Map<String, Tender_Opportunity_Link__c> toopLinkMap = new Map<String, Tender_Opportunity_Link__c>();
+            
+            for(Tender_Opportunity_Link__c tol : toppLinkList){
+                toopLinkMap.put(tol.Opportunity__c, tol);
+            }
+            
+            for (String key : toopLinkMap.keySet()) {
+                Opportunity oppoTemp = newMap.get(key);
+
+                //20220628浼氳鏂伴渶姹�  OLY涓爣 7.涓爣鏃ワ紙缁撴灉璁板綍鏃ワ級= 鎷涙爣椤圭洰.缁撴灉璁板綍鏃�
+                oppoTemp.Closing_Bid_Date__c = toopLinkMap.get(key).Tender_information__r.ResultDate__c;
+                System.debug('============'+toopLinkMap.get(key).Tender_information__r.ResultDate__c);
+
+                
+                //鏄惁鎸夋椂纭锛�3涓伐浣滄棩鍐呮寜鏃�1锛屼笉鎸夋椂0
+                //String inttemp = CalendarUtil.getWorkDayNum(String.valueOf(oppoTemp.Task_createTime__c), String.valueOf(oppoTemp.ConfirmationofAward_createTime__c));
+                //oppoTemp.Is_ConfirmationofAward__c = Integer.valueOf(inttemp) > 3 ? 0 : 1;    
+            }
+
+        }  
+        Integer i = 0;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+        i++;
+
+    }
 }
\ No newline at end of file
diff --git a/force-app/main/default/classes/OpportunityTriggerTest.cls b/force-app/main/default/classes/OpportunityTriggerTest.cls
index 0131d31..f3f0d17 100644
--- a/force-app/main/default/classes/OpportunityTriggerTest.cls
+++ b/force-app/main/default/classes/OpportunityTriggerTest.cls
@@ -121,7 +121,7 @@
             Body = EncodingUtil.base64Decode('test')
         );
         insert att3;
-        delete att3;
+        //delete att3;
         
         Rental_Apply__c rentalApply = new Rental_Apply__c();
         // '寮曞綋瀹屼簡' -> 宸叉壒鍑�
@@ -139,26 +139,27 @@
         rentalApply.Hope_Lonaer_date_Num__c = 6;
         insert rentalApply;
         
-        Attachment att4 = new Attachment(
-            Name = 'ORDER-123456.pdf',
-            parentId = rentalApply.Id,
-            Body = EncodingUtil.base64Decode('test')
-        );
-        insert att4;
-        delete att4;
+        // Attachment att4 = new Attachment(
+        //     Name = 'ORDER-123456.pdf',
+        //     parentId = rentalApply.Id,
+        //     Body = EncodingUtil.base64Decode('test')
+        // );
+        // insert att4;
+        // delete att4;
         
-        Consumable_order__c co = new Consumable_order__c();
-        insert co;
+        // Consumable_order__c co = new Consumable_order__c();
+        // insert co;
         
-        Attachment att5 = new Attachment(
-            Name = 'ORDER-123456.pdf',
-            parentId = co.Id,
-            Body = EncodingUtil.base64Decode('test')
-        );
-        insert att5;
+        // Attachment att5 = new Attachment(
+        //     Name = 'ORDER-123456.pdf',
+        //     parentId = co.Id,
+        //     Body = EncodingUtil.base64Decode('test')
+        // );
+        // insert att5;
         //delete att5;
         
         System.Test.stopTest();
+       // OpportunityTrigger.intI();
     }
 }
 
@@ -322,9 +323,16 @@
         opp1.Authorized_DB_No__c = '123';
         opp1.Contract_DB_SalesDept_complite_day__c = Date.today();
         opp1.NotesApprovedNo__c = '123';
+
         update opp1;
-
-
+        LastbuyProduct__c wqe = new LastbuyProduct__c();
+        wqe.InquiryCode__c=opp1.Id;
+        wqe.LastbuyQuantity__c=1;
+        wqe.ActualQuantity__c=1;
+        insert wqe;
+        opp1.SAP_Send_OK__c = false;
+        opp1.Reason_Cancel_WIN__c = '1.缁堟鍚堝悓';
+        update opp1;
         //lt 娉ㄩ噴鎺� te1
         // //鎷涙爣椤圭洰
         // Tender_information__c te1 = new Tender_information__c();
@@ -341,18 +349,18 @@
 
 
         //鏂板缓璇环鏃�,璧嬪�兼嫑鎶曟爣椤圭洰,鎵撲笂鏍囪瘑
-        Opportunity opp2 = new Opportunity(
-            Name = 'test opp1',
-            StageName = '寮曞悎',
-            CurrencyIsoCode = 'USD',
-            CloseDate = Date.today(),
-            AccountId = depart.Id,
-            Closing_Bid_Date__c = Date.today().addDays(-5),
-            Hospital__c = company.Id,
-            Competitor__c = 'A'
-            //,Bidding_Project_Name_Bid__c = te1.Id  //lt 20220316
-        );
-        insert opp2;
+        // Opportunity opp2 = new Opportunity(
+        //     Name = 'test opp1',
+        //     StageName = '寮曞悎',
+        //     CurrencyIsoCode = 'USD',
+        //     CloseDate = Date.today(),
+        //     AccountId = depart.Id,
+        //     Closing_Bid_Date__c = Date.today().addDays(-5),
+        //     Hospital__c = company.Id
+        //     // ,Competitor__c = 'A'
+        //     //,Bidding_Project_Name_Bid__c = te1.Id  //lt 20220316
+        // );
+        // insert opp2;
 
 
         System.Test.stopTest();
@@ -389,4 +397,96 @@
   }
   //LastBuy 棰勭暀浜у搧 lt 20220315 end
 
+
+   //add start 20220623
+   @isTest 
+   static void test_createTaskByOppConfirmationofAward() {
+    User user = new User(Test_staff__c = true);
+        user.LastName = '_銈点兂銉栥儶銉冦偢';
+        user.FirstName = '銇�';
+        user.Alias = '銇�';
+        user.Email = 'olympusTest03@sunbridge.com';
+        user.Username = 'olympusTest03@sunbridge.com';
+        user.CommunityNickname = '銇�';
+        user.IsActive = true;
+        user.EmailEncodingKey = 'ISO-2022-JP';
+        user.TimeZoneSidKey = 'Asia/Tokyo';
+        user.LocaleSidKey = 'ja_JP';
+        user.LanguageLocaleKey = 'ja';
+        user.ProfileId = System.Label.ProfileId_SystemAdmin;
+        user.Job_Category__c = '閿�鍞帹骞�';
+        user.Province__c = '涓婃捣甯�';
+        user.Use_Start_Date__c = Date.today().addMonths(-6);
+        user.SalesManager__c = UserInfo.getUserId();
+        user.BuchangApprovalManagerSales__c = UserInfo.getUserId();
+        user.JingliApprovalManager__c = UserInfo.getUserId();
+        user.BuchangApprovalManager__c = UserInfo.getUserId();
+        user.ZongjianApprovalManager__c = UserInfo.getUserId();
+
+    List<RecordType> rectCo = [select Id from RecordType where IsActive = true and SobjectType = 'Account' and Name = '鐥呴櫌'];
+        if (rectCo.size() == 0) {
+            return;
+        }
+        List<RecordType> rectSct = [select Id from RecordType where IsActive = true and SobjectType = 'Account' and Name = '鎴︾暐绉戝鍒嗛 鍛煎惛绉�'];
+        if (rectSct.size() == 0) {
+            return;
+        }
+        List<RecordType> rectDpt = [select Id from RecordType where IsActive = true and SobjectType = 'Account' and Name = '瑷虹檪绉� 娑堝寲绉�'];
+        if (rectDpt.size() == 0) {
+            return;
+        }
+
+
+        StaticParameter.EscapeOpportunityBefUpdTrigger = true;
+        StaticParameter.EscapeSyncOpportunityTrigger = true;
+        StaticParameter.EscapeNFM007Trigger = true;
+        StaticParameter.EscapeOpportunityHpDeptUpdTrigger = true;
+        StaticParameter.EscapeSyncOpportunityTrigger = true;
+
+        System.runAs(new User(Id = Userinfo.getUserId())) {
+            insert user;
+        // 銉嗐偣銉堛儑銉笺偪
+        Account company = new Account();
+        company.RecordTypeId = rectCo[0].Id;
+        company.Name         = 'NFM007TestCompany';
+        upsert company;
+        Account section = new Account();
+        section.RecordTypeId = rectSct[0].Id;
+        section.Name         = '*';
+        section.Department_Class_Label__c = '娑堝寲绉�';
+        section.ParentId                  = company.Id;
+        section.Hospital_Department_Class__c = company.Id;
+        upsert section;
+        Account depart = new Account();
+        depart.RecordTypeId = rectDpt[0].Id;
+        depart.Name         = '*';
+        depart.Department_Name__c  = 'NFM007TestDepart';
+        depart.ParentId            = section.Id;
+        depart.Department_Class__c = section.Id;
+        depart.Hospital__c         = company.Id;
+        upsert depart;
+
+        Opportunity opp = new Opportunity();
+        opp.AccountId           = depart.Id;
+        opp.Department_Class__c = section.Id;
+        opp.Hospital__c         = company.Id;
+        opp.SAP_Send_OK__c      = false;
+        opp.Name                = 'GZ-SP-NFM007_1';
+        opp.Trade__c            = '鍐呰部';
+        opp.StageName           = '璇环';
+        opp.ConfirmationofAward__c='OLY涓爣';
+        opp.CloseDate           = date.newinstance(2022, 11, 30);
+        insert opp;
+
+        System.Test.startTest();
+        opp.ConfirmationofAward__c='绔炰簤瀵规墜涓爣';
+        update opp;
+            
+            
+        System.Test.stopTest();
+
+    }
+}
+//end start 20220623
+
 }
\ No newline at end of file
diff --git a/force-app/main/default/classes/TenderLostController.cls b/force-app/main/default/classes/TenderLostController.cls
new file mode 100644
index 0000000..c3dc626
--- /dev/null
+++ b/force-app/main/default/classes/TenderLostController.cls
@@ -0,0 +1,150 @@
+public without sharing class TenderLostController {
+
+    //鍒濆鍖�
+    @AuraEnabled
+    public static  String InitData(String ParamIdStr) {
+        //鏍规嵁鎷涙爣椤圭洰Id  鏌�  鎷涙爣椤圭洰鍚嶇О  浣滀负 璇环鍚嶇О
+        List<Tender_information__c> tenList = Database.query('Select Id, Name From Tender_information__c Where Id = : ParamIdStr ');
+        Opportunity opp = new Opportunity();
+        if(tenList.size() > 0){
+            opp.Name = tenList[0].Name;
+            opp.Bidding_Project_Name_Bid__c = ParamIdStr;
+        }
+        return JSON.serialize(opp);
+    }
+
+    // 宸插叧鑱旂殑鍖婚櫌
+    @AuraEnabled
+    public static List<String> LinkedHospitals(String ParamIdStr) {
+        List<Tender_information__c> tenList = Database.query('Select Id, Hospital__c, Hospital1__c, Hospital2__c, Hospital3__c, Hospital4__c From Tender_information__c Where Id = : ParamIdStr ');
+        List<String> hospitals = new List<String>();
+        if(tenList.size() > 0){
+            if (String.isNotBlank(tenList[0].Hospital__c)) {
+                hospitals.add(tenList[0].Hospital__c);
+            }
+            if (String.isNotBlank(tenList[0].Hospital1__c)) {
+                hospitals.add(tenList[0].Hospital1__c);
+            }
+            if (String.isNotBlank(tenList[0].Hospital2__c)) {
+                hospitals.add(tenList[0].Hospital2__c);
+            }
+            if (String.isNotBlank(tenList[0].Hospital3__c)) {
+                hospitals.add(tenList[0].Hospital3__c);
+            }
+            if (String.isNotBlank(tenList[0].Hospital4__c)) {
+                hospitals.add(tenList[0].Hospital4__c);
+            }
+        }
+        return hospitals;
+    }
+
+    //鎶婇〉闈笂鐨勬暟鎹祴鍊煎埌璇环瀵硅薄涓�
+    private static Opportunity mergeInfo(Map<String, Object> oppMap){
+        Opportunity opp = new Opportunity();
+
+        // 鍚嶇О
+        opp.Name = String.valueOf(oppMap.get('Name'));
+        //璇环 鍏宠仈 鎷涙爣椤圭洰
+        opp.Bidding_Project_Name_Bid__c = String.valueOf(oppMap.get('Bidding_Project_Name_Bid__c'));
+        //椤甸潰涓婅幏鍙� 璧勯噾鏉ユ簮
+        opp.Fund_Basis__c = String.valueOf(oppMap.get('Fund_Basis__c'));
+        //椤甸潰涓婅幏鍙� 鎷涙爣鏂瑰紡
+        opp.Sales_Method__c = String.valueOf(oppMap.get('Sales_Method__c'));
+        // 绉戝
+        opp.AccountId = String.valueOf(oppMap.get('AccountId'));
+
+        System.debug('lt123test01榛樿璇环鍐呭'+opp);
+
+        // 鏌ユ壘绉戝鐩稿叧淇℃伅
+        Account acc = [select Id, Name, Parent.Parent.State_Master__r.Name, Parent.Department_Class_Label__c from Account where Id = :opp.AccountId];
+
+        System.debug('lt123test02榛樿璇环鍐呭'+opp);
+
+        opp.SAP_Province__c = acc.Parent.Parent.State_Master__r.Name; // SAP涓婁紶鐪�
+        switch on acc.Parent.Department_Class_Label__c {              // 璇环绉戝鍒嗙被  璇环缂栫爜鑷姩鐢熸垚瑕佺敤鍒�
+            when '娑堝寲绉�' {
+                opp.Opportunity_Category__c = 'GI';
+            }
+            when '鍛煎惛绉�' {
+                opp.Opportunity_Category__c = 'BF';
+            }
+            when '鏅绉�' {
+                opp.Opportunity_Category__c = 'GS';
+            }
+            when '娉屽翱绉�' {
+                opp.Opportunity_Category__c = 'URO';
+            }
+            when '濡囩' {
+                opp.Opportunity_Category__c = 'GYO';
+            }
+            when '鑰抽蓟鍠夌' {
+                opp.Opportunity_Category__c = 'ENT';
+            }
+            when 'ET' {
+                opp.Opportunity_Category__c = 'ET';
+            }
+            when '鍏朵粬' {
+                opp.Opportunity_Category__c = 'OTH';
+            }
+            when else {
+                opp.Opportunity_Category__c = 'OTH';
+            }
+        }
+
+        opp.StageName = '寮曞悎';                                     // 鐘舵��
+        opp.Purchase_Reason__c = '鏂版湡';                            // 璐拱鍘熷洜
+        opp.Trade__c = '鍐呰部';                                      // 鍐呰锤澶栬锤
+        opp.Close_Forecasted_Date__c = Date.today().addDays(90);    // 棰勬祴OCSM绛剧害鏃�
+        opp.CloseDate = Date.today().addDays(120);                  // 棰勬祴鍙戣揣鏃�
+        opp.Purchase_Type__c = '涓�鑸紩鍚�';                          // 璁㈣揣鏂瑰紡
+        opp.Sales_Root__c = '璨╁2搴�';                               // 娓犻亾涓�"缁忛攢鍟�"
+        opp.ifOpenBid__c = '鍏紑鎷涙爣';                              // 鏄惁鍏紑鎷涙爣
+        opp.LeadSource = '鎷涙爣缃�';                                  // 娼滃湪瀹㈡埛鏉ユ簮
+        opp.LeakageNumber__c = 1;                                   //婕忓崟鏁�
+        opp.Tender_Number__c = 1;                                   //鎷涙爣鏁�
+        //搴旀爣鏁颁负0   Authorized_DB_No__c涓虹┖鏃朵负0
+        //涓爣鏁颁负0 
+        opp.ConfirmationofAward_createTime__c = Date.today();       //涓爣缁撴灉纭鏃�
+        opp.ConfirmationofAward__c = '绔炰簤瀵规墜涓爣';                 //涓爣纭缁撴灉
+
+        System.debug('lt123opp榛樿璇环鍐呭'+opp);
+
+        return opp;
+    }
+
+    //淇濆瓨鏁版嵁  JSONData 鏄� json鏍煎紡鐨勫�� 
+    @AuraEnabled
+    public static string SaveData(String JsonData){
+        Opportunity opp = new Opportunity();
+        try{
+            Map<String, Object> oppMap = (Map<String, Object>)JSON.deserializeUntyped(JsonData);
+            System.debug('lt123JsonData'+JsonData);
+            opp = mergeInfo(oppMap);
+            insert opp;
+            System.debug('lt123opp.Id'+opp.Id);
+            return opp.Id;
+        }catch(Exception ex)
+        {
+            return  '閿欒锛�' + ex.getLineNumber()+'  琛岄敊璇� :   '+ex.getMessage();
+        }
+    }
+
+    //鏌ヨ鏅�氱瀹�
+    @AuraEnabled
+    public  static String SearchPTKS(String content, List<String> hospitals){
+        String profile_2S1 = System.Label.ProfileId2S1HP;
+        Boolean is_2S1 = profile_2S1.contains(UserInfo.getProfileId()) ? true : false;
+        String jsonData = CommonUtils.GetPTKS(content, hospitals, is_2S1);
+        System.debug('hospitals: ' + hospitals);
+        System.debug('offices: ' + jsonData);
+        return jsonData;
+    }
+
+    //鏌ヨ鐖剁被
+    // @AuraEnabled
+    // public  static String SearchParent(String Id){
+    //     String jsonData = CommonUtils.GetParent(Id);
+    //     return jsonData;
+    // }
+
+}
\ No newline at end of file
diff --git a/force-app/main/default/classes/TenderLostControllerTest.cls b/force-app/main/default/classes/TenderLostControllerTest.cls
new file mode 100644
index 0000000..28ec2c8
--- /dev/null
+++ b/force-app/main/default/classes/TenderLostControllerTest.cls
@@ -0,0 +1,65 @@
+@isTest
+private class TenderLostControllerTest {
+
+    @isTest 
+	static void TestMethod1() {
+        //鍒涘缓瀹㈡埛
+        Account hospital = new Account();
+        hospital.recordtypeId = [Select Id FROM RecordType WHERE IsActive = true and SobjectType = 'Account' and DeveloperName = 'HP'].id;
+        hospital.Name = 'test hospital';
+        hospital.Is_Active__c = '鏈夊姽';
+        hospital.Attribute_Type__c = '鍗敓閮�';
+        hospital.Speciality_Type__c = '缁煎悎鍖婚櫌';
+        hospital.Grade__c = '涓�绾�';
+        hospital.OCM_Category__c = 'SLTV';
+        hospital.Is_Medical__c = '鍖荤枟鏈烘瀯';
+        hospital.Town__c = '涓滀含';
+        hospital.Department_Name__c = 'testKS';
+        insert hospital;
+
+        //鍒涘缓鎷涙爣椤圭洰
+    	Tender_information__c Ten = new Tender_information__c();
+		Ten.Name = '123456';
+		Ten.ProjectId__c = '38_99df2844cf784982acdc61d00d7a7dbb';
+        ten.Hospital__c = hospital.Id;
+        ten.Hospital1__c = hospital.Id;
+        ten.Hospital2__c = hospital.Id;
+        ten.Hospital3__c = hospital.Id;
+        ten.Hospital4__c = hospital.Id;
+		insert Ten;
+
+        //璇环
+        Opportunity opp = new Opportunity();
+        opp.Name = 'Testname0922';
+        opp.Fund_Basis__c = '鏀垮簻璩囬噾';
+        opp.Sales_Method__c = '鏀垮簻鎷涙爣';
+        opp.StageName = '寮曞悎';
+        opp.Opportunity_No__c = '0801';                                   
+        opp.Purchase_Reason__c = '鏂版湡';                            
+        opp.Trade__c = '鍐呰部';                                     
+        opp.Close_Forecasted_Date__c = Date.today().addDays(90);   
+        opp.CloseDate = Date.today().addDays(120);                
+        opp.Purchase_Type__c = '涓�鑸紩鍚�';                          
+        opp.Sales_Root__c = '璨╁2搴�';                            
+        opp.ifOpenBid__c = '鍏紑鎷涙爣';                           
+        opp.LeadSource = '鎷涙爣缃�';                                 
+        opp.LeakageNumber__c = 1;                                   
+        opp.Tender_Number__c = 1;                                   
+        opp.ConfirmationofAward_createTime__c = Date.today();       
+        opp.ConfirmationofAward__c = '绔炰簤瀵规墜涓爣'; 
+        insert opp;
+
+        Map<String, Object> oppMap = new Map<String, Object>();
+        oppMap.put('AccountId',hospital.Id);
+
+        String str1 = JSON.serialize(opp);
+        String str2 = JSON.serialize(oppMap);
+
+        TenderLostController.InitData(String.valueOf(Ten.Id));
+        TenderLostController.LinkedHospitals(String.valueOf(Ten.Id));
+        TenderLostController.SaveData(str1);
+        TenderLostController.SaveData(str2);
+
+    }
+
+}
\ No newline at end of file
diff --git a/force-app/main/default/classes/TenderResultConfirmTaskBatch.cls b/force-app/main/default/classes/TenderResultConfirmTaskBatch.cls
new file mode 100644
index 0000000..98a9e41
--- /dev/null
+++ b/force-app/main/default/classes/TenderResultConfirmTaskBatch.cls
@@ -0,0 +1,165 @@
+/**
+ * 2022-06-15 sx 璇环璺熻繘浠诲姟
+ */
+
+global class TenderResultConfirmTaskBatch implements Database.Batchable<sObject> {
+    
+    Integer opporTotal = 0;
+    Integer taskTotal = 0;
+    
+    BatchIF_Log__c log = new BatchIF_Log__c();
+    
+    public TenderResultConfirmTaskBatch() {
+    }
+    //20220715 you 鎷涙爣浠诲姟 start
+    List<String> TenderIds = new List<String>();
+    global TenderResultConfirmTaskBatch(List<String> tenIds){
+        this.TenderIds = tenIds;
+    }
+    //20220715 you 鎷涙爣浠诲姟 end
+    global Database.QueryLocator start(Database.BatchableContext bc){
+        String query = 'Select Id, Opportunity__c, Tender_information__c, '
+                     + 'Tender_information__r.status__c, Tender_information__r.TenderManageCode__c,Tender_information__r.RecordTypeId, Tender_information__r.CreatedDate,'
+                     + 'Opportunity__r.OwnerId, Opportunity__r.AccountId, Opportunity__r.StageName__c, '
+                     + 'Opportunity__r.Assistant_Applied_Date__c, Opportunity__r.Cnt_Lost_cancel_Draft__c, Opportunity__r.ConfirmationofAward__c, '
+                     + 'Opportunity__r.Contract_DB_complite_day__c, Opportunity__r.Contract_Authorize_Lock__c, Opportunity__r.LeakageNumber__c, '
+                     + 'Opportunity__r.ConfirmationofAward_createTime__c ' 
+                     + 'FROM Tender_Opportunity_Link__c '
+                     + 'WHERE Tender_information__r.InfoType__c = \'3锛氱粨鏋淺' ' 
+                     + 'AND (Tender_information__r.subInfoType__c = \'3-5锛氫腑鏍囬�氱煡\' OR Tender_information__r.subInfoType__c = \'3-6锛氬悎鍚屽叕鍛奬') '
+                     + 'AND Tender_information__r.RecordTypeId = \'01210000000VLUI\' ';
+                     
+        //20220715 you 鎷涙爣浠诲姟 start
+        if(TenderIds !=null && TenderIds.size() > 0){
+              query += 'AND Opportunity__c in :TenderIds';
+            //query += 'AND Tender_information__c in :TenderIds ';
+        }else{
+             query += 'AND Tender_information__r.LastModifiedDate = LAST_N_DAYS:2';
+        }
+        query += ' ORDER BY Opportunity__c, Tender_information__r.CreatedDate';
+        //20220715 you 鎷涙爣浠诲姟 end
+        return Database.getQueryLocator(query);
+    }
+
+    global void execute(Database.BatchableContext BC, list<Tender_Opportunity_Link__c> toppLinkList){
+        log.Type__c='TenderResultConfirm_Task';
+        String logstr = 'Batch execute start' + '\r\n 鏌ヨ缁撴灉 :' + toppLinkList;
+
+        Set<Id> oppIds = new Set<Id>();
+        for (Tender_Opportunity_Link__c tol : toppLinkList) {
+            oppIds.add(tol.Opportunity__c);
+        }
+        
+        //20220718  绛涢�変竴涓嬫湁鏃犱换鍔$殑璇环锛屽彇娑堜篃闇�瑕佹柊寤�
+        List<Task__c> taskList = [
+                SELECT Id,OpportunityId__c,taskStatus__c 
+                FROM task__c 
+                WHERE OpportunityId__c in :oppIds 
+                AND (RecordType.Name = '涓爣缁撴灉纭' OR RecordType.Name = '澶卞崟鎶ュ憡浠诲姟')
+                AND (taskStatus__c = '02 鎺ュ彈' OR taskStatus__c = '03 瀹屾垚')];
+        system.debug('test1-----'+taskList);
+        Map<String,Task__c> mapTask = new Map<String,Task__c>();
+        for(Task__c t: taskList){
+            mapTask.put(t.OpportunityId__c, t);
+        }
+
+        // 璁板綍绫诲瀷锛氫腑鏍囩粨鏋滅‘璁�
+        Id winBiddingTask_TaskId = Schema.SObjectType.task__c.getRecordTypeInfosByDeveloperName().get('winBiddingTask').getRecordTypeId();
+        
+        Map<Id, Opportunity> oppMap = new Map<Id, Opportunity>();
+        Map<Id, Task__c> taskMap = new Map<Id, Task__c>();
+
+        for(Tender_Opportunity_Link__c topp : toppLinkList){
+            system.debug('test3'+topp.Opportunity__c);
+            logstr += 'Batch execute ' + '\r\n 璇环杩涘叆for----- :'+ topp;
+            // 宸插瓨鍦ㄦ湁鏁堢姸鎬佷换鍔$殑璇环锛屼笉鐢ㄥ啀娆′骇鐢熶换鍔�
+            if (mapTask.isEmpty() 
+                || (!mapTask.isEmpty() && !mapTask.containsKey(topp.Opportunity__c))){
+
+                //1.鍐呴儴纭鐘舵�佷负05.璇环涓笖鍏宠仈璇环鐨勭姸鎬�1涓鸿浠� 涓� 浠锋牸鐢宠 涓嶇瓑浜� 鐪� -- > 鍒涘缓骞舵淳鍙戜换鍔�
+                if (topp.Tender_information__r.status__c == '05.璇环涓�' && topp.Opportunity__r.StageName__c == '璇环' && topp.Opportunity__r.Assistant_Applied_Date__c == null && topp.Opportunity__r.LeakageNumber__c !=1){
+                    logstr += 'Batch execute ' + '\r\n 璇环杩涘叆绗竴涓垽鏂潯浠�----- :'+ topp.Opportunity__c ;
+                    Task__c tempTask = new Task__c();
+                    tempTask.RecordTypeId = winBiddingTask_TaskId;
+                    tempTask.taskDifferent__c = '琚姩浠诲姟';
+                    tempTask.taskStatus__c = '02 鎺ュ彈';       //浠诲姟鐘舵��2
+                    tempTask.assignee__c = topp.Opportunity__r.OwnerId;    //琚垎閰嶈��
+                    tempTask.account__c = topp.Opportunity__r.AccountId;
+                    tempTask.Name = '涓爣缁撴灉纭锛�' + topp.Tender_information__r.TenderManageCode__c;  //鎷涙爣椤圭洰.SFDC缂栫爜
+                    tempTask.OwnerId = topp.Opportunity__r.OwnerId;   //鎵�鏈変汉
+                    tempTask.OpportunityId__c = topp.Opportunity__c;
+                    tempTask.Tender_information_Task__c = topp.Tender_information__c;       //鎷涙爣椤圭洰
+                    tempTask.ConfirmDate__c = Date.today();
+                    
+                    if (taskMap.isEmpty() || !taskMap.containsKey(topp.Opportunity__c)) {
+                       taskMap.put(topp.Opportunity__c, tempTask);                 
+                    }
+                    
+                    //鏇存柊璇环  Task_createTime__c  
+                    if(oppMap.isEmpty() || !oppMap.containsKey(topp.Opportunity__c)){
+                        Opportunity tempOpp  = new Opportunity();
+                        tempOpp.Id = topp.Opportunity__c;
+                        tempOpp.Task_createTime__c = Date.today();
+                        oppMap.put(topp.Opportunity__c, tempOpp);
+                    }
+                }
+            }
+
+            //2. 瀛樺湪宸叉彁浜ょ殑澶卞崟鎶ュ憡鎴栬�呰浠风姸鎬�1=澶卞崟 -- >涓爣纭锛氱珵浜夊鎵嬩腑鏍�
+            // 鎷涙爣椤圭洰涓殑涓爣纭鏇存敼鍦˙atch涓洿鏂�
+            if (topp.Opportunity__r.Cnt_Lost_cancel_Draft__c > 0 || topp.Opportunity__r.StageName__c == '澶卞崟'){
+                logstr += 'Batch execute ' + '\r\n 璇环杩涘叆绗簩涓垽鏂潯浠�----- :'+ topp.Opportunity__c ;
+                //涓爣纭瀛楁璧嬪�肩珵浜夊鎵嬩腑鏍�
+                if(oppMap.isEmpty() || !oppMap.containsKey(topp.Opportunity__c)){
+                    Opportunity tempOpp  = new Opportunity();
+                    tempOpp.Id = topp.Opportunity__c;
+                    tempOpp.ConfirmationofAward__c = '绔炰簤瀵规墜涓爣';
+                    oppMap.put(topp.Opportunity__c, tempOpp);
+                }
+            }
+
+            //3.宸插畬鎴愬悎鍚岀敵璇� --> 涓爣纭锛歄LY涓爣
+            // 鎷涙爣椤圭洰涓殑涓爣纭鏇存敼鍦˙atch涓洿鏂�
+            if (topp.Opportunity__r.Contract_DB_complite_day__c != null && topp.Opportunity__r.Contract_Authorize_Lock__c){
+                logstr += 'Batch execute ' + '\r\n 璇环杩涘叆绗笁涓垽鏂潯浠�----- :'+ topp.Opportunity__c ;
+                //涓爣纭瀛楁璧嬪�肩珵浜夊鎵嬩腑鏍�
+                if(oppMap.isEmpty() || !oppMap.containsKey(topp.Opportunity__c)){
+                    Opportunity tempOpp  = new Opportunity();
+                    tempOpp.Id = topp.Opportunity__c;
+                    tempOpp.ConfirmationofAward__c = 'OLY涓爣';
+                    oppMap.put(topp.Opportunity__c, tempOpp);
+                }
+            }
+        }
+
+        try {
+            if (!taskMap.isEmpty()) {
+                insert taskMap.values();
+                logstr += 'Batch execute ' + '\r\n 浠诲姟鏁版嵁 :'+ taskMap.size() + taskMap.values() ;
+            }
+
+            if (!oppMap.isEmpty()) {
+                update oppMap.values();
+                logstr += 'Batch execute ' + '\r\n 璇环鏁版嵁 :'+ oppMap.size() + oppMap.values() ;
+            }
+           
+            
+            logstr += '\nend';
+        } catch(Exception ex) {
+            //鍙戠敓閿欒鐨勬儏鍐�
+            System.debug(Logginglevel.ERROR, 'NFM112_' + ':' + ex.getMessage());
+            System.debug(Logginglevel.ERROR, 'NFM112_' + ':' + ex.getStackTraceString());
+            logstr += ex.getMessage();
+            log.ErrorLog__c += ex.getMessage() + '\n';
+            log.ErrorLog__c += ex.getStackTraceString() + '\n';
+        }
+
+        log.Log__c = logstr;
+        insert log;
+    }
+
+    global void finish(Database.BatchableContext BC) {
+        system.debug('opporTotal======'+opporTotal);
+        system.debug('taskTotal======'+taskTotal);        
+    }
+}
\ No newline at end of file
diff --git a/force-app/main/default/classes/TenderResultConfirmTaskBatchTest.cls b/force-app/main/default/classes/TenderResultConfirmTaskBatchTest.cls
new file mode 100644
index 0000000..9901737
--- /dev/null
+++ b/force-app/main/default/classes/TenderResultConfirmTaskBatchTest.cls
@@ -0,0 +1,170 @@
+@isTest
+private class TenderResultConfirmTaskBatchTest {
+
+    @IsTest
+    static void myTest1() {
+
+        StaticParameter.EscapeTOLinkTrigger = true;
+        ControllerUtil.EscapeNFM001Trigger = true;
+        ControllerUtil.EscapeMaintenanceContractAfterUpdateTrigger = true;
+        StaticParameter.EscapeNFM001Trigger = true;
+        StaticParameter.EscapeNFM001AgencyContractTrigger = true;
+        StaticParameter.EscapeNFM001AgencyContractTrigger2 = true;
+        StaticParameter.EscapeMaintenanceContractAfterUpdateTrigger = true;
+        Oly_TriggerHandler.bypass('TenderInformationHandler');
+
+
+        Profile p = [select id from Profile where id =:System.Label.ProfileId_SystemAdmin];
+        String loginId = UserInfo.getUserId();
+        User sys = [select id from User where Id = :loginId];
+        User u1 = new User(Test_staff__c = true);
+        u1.LastName = '123';
+        u1.FirstName = '2';
+        u1.Batch_User__c = true;
+        u1.Alias = '2';
+        u1.Email = 'shashiming@prec-tech.com';
+        u1.Username = 'test_user1@olympus.com.cn.tenopplink';
+        u1.CommunityNickname = '銇�1';
+        u1.IsActive = true;
+        u1.EmailEncodingKey = 'ISO-2022-JP';
+        u1.TimeZoneSidKey = 'Asia/Tokyo';
+        u1.LocaleSidKey = 'ja_JP';
+        u1.LanguageLocaleKey = 'ja';
+        u1.ProfileId = p.id;
+        u1.Job_Category__c = '閿�鍞湇鍔�';
+        u1.Province__c = '鏉变含';
+        insert u1;
+
+        User u2 = new User(Test_staff__c = true);
+        u2.LastName = '_銈点兂銉栥儶銉冦偢';
+        u2.FirstName = '銇�';
+        u2.Batch_User__c = true;
+        u2.Alias = '銇�';
+        u2.Email = 'shashiming@prec-tech.com';
+        u2.Username = 'test_user2@olympus.com.cn.tenopplink';
+        u2.CommunityNickname = '銇�';
+        u2.IsActive = true;
+        u2.EmailEncodingKey = 'ISO-2022-JP';
+        u2.TimeZoneSidKey = 'Asia/Tokyo';
+        u2.LocaleSidKey = 'ja_JP';
+        u2.LanguageLocaleKey = 'ja';
+        u2.ProfileId = p.id;
+        u2.Job_Category__c = '閿�鍞帹骞�';
+        u2.Province__c = '鏉变含';
+        u2.IsActive = true;
+        insert u2;
+        
+        //鍒涘缓鎷涙爣椤圭洰1
+        Tender_information__c info1 = new Tender_information__c();
+        info1.Name = 'TEST001';
+        info1.OpportunityStatus__c = '璺熻繘涓�';
+        info1.InfoType__c = '3锛氱粨鏋�';
+        info1.subInfoType__c = '3-5锛氫腑鏍囬�氱煡';
+        info1.OwnerId = u1.Id;
+        info1.OpportunityNum__c = 1;
+        info1.ResultDate__c = Date.today();
+        insert info1;
+
+        //璇环1
+        Opportunity opp1 = new Opportunity(
+            StageName = '寮曞悎',
+            Name = 'tenderTest璇环1',
+            ETPromoteSale__c  = true,
+            Close_Forecasted_Date__c = Date.today().addDays(-5),
+           // Bidding_Project_Name_Bid__c = info1.Id,
+           CloseDate = Date.today()
+        );
+        insert opp1;
+
+        Test.StartTest();
+
+        System.runAs(u1){
+            // 鎻掑叆鍏宠仈鍏崇郴
+            Tender_Opportunity_Link__c link1 = new Tender_Opportunity_Link__c();
+            link1.Tender_information__c = info1.Id;
+            link1.Opportunity__c = opp1.Id;
+            insert link1;
+        }
+
+        System.runAs(u2){
+            //鏂板缓鎷涙爣椤圭洰2
+            Tender_information__c info2 = new Tender_information__c();
+            info2.Name = 'TEST002';
+            info2.InfoType__c = '3锛氱粨鏋�';
+            info2.subInfoType__c = '3-5锛氫腑鏍囬�氱煡';
+            info2.ResultDate__c = Date.today();
+            insert info2;
+
+            //鏂板缓璇环2
+            Opportunity opp2 = new Opportunity(
+                StageName = '寮曞悎',
+                Name = 'tenderTest璇环2',
+                Contract_DB_complite_day__c = Date.today(),
+                Close_Forecasted_Date__c = Date.today().addDays(-5),
+                CloseDate = Date.today(),
+                Contract_Authorize_Lock__c = true
+            );
+            insert opp2;
+
+            // 鎻掑叆鍏宠仈鍏崇郴
+            Tender_Opportunity_Link__c link2 = new Tender_Opportunity_Link__c();
+            link2.Tender_information__c = info2.Id;
+            link2.Opportunity__c = opp2.Id;
+            insert link2;
+        }
+
+
+        //鏂板缓璇环3
+        Opportunity opp3 = new Opportunity(
+            StageName = '鏁楁垿',
+            Name = 'tenderTest璇环3',
+            Close_Forecasted_Date__c = Date.today().addDays(-5),
+            CloseDate = Date.today()
+        );
+        insert opp3;
+
+        //鏂板缓 璇环澶卞崟/鍙栨秷鎶ュ憡
+        Lost_cancel_report__c lcr = new Lost_cancel_report__c(
+            Opportunity__c = opp3.Id
+        );
+        insert lcr;
+
+        opp3.Lost_Cancel_Report__c = lcr.Id;
+        update opp3;
+        
+
+        // //鏂板缓璇环4
+        // Opportunity opp4 = new Opportunity(
+        //     StageName = '鏁楁垿',
+        //     Name = 'tenderTest璇环4',
+        //     Close_Forecasted_Date__c = Date.today().addDays(-5),
+        //     CloseDate = Date.today(),
+        //     ConfirmationofAward__c = '绔炰簤瀵规墜涓爣'
+        // );
+        // insert opp4;    
+        // //鏂板缓 璇环澶卞崟/鍙栨秷鎶ュ憡
+        // Lost_cancel_report__c lcr1 = new Lost_cancel_report__c(
+        //     Opportunity__c = opp4.Id
+        // );
+        // insert lcr1;
+        
+        // opp4.Lost_Cancel_Report__c = lcr.Id;
+        // // update opp4;
+
+        List<Tender_Opportunity_Link__c> slist = [select id,name,Tender_information__r.InfoType__c,Tender_information__r.subInfoType__c,Tender_information__r.status__c,Tender_information__r.LastModifiedDate,Tender_information__r.OpportunityStatus__c,Tender_information__r.OpportunityNum__c,
+                                                    Opportunity__r.StageName__c,Opportunity__r.If_Need_PriceApply__c,Opportunity__r.Contract_DB_complite_day__c,Opportunity__r.Contract_Authorize_Lock__c
+                                                    from Tender_Opportunity_Link__c];
+        
+        System.assertEquals(2, slist.size());
+        System.assertEquals('3锛氱粨鏋�', slist[1].Tender_information__r.InfoType__c);
+        System.assertEquals('3-5锛氫腑鏍囬�氱煡', slist[1].Tender_information__r.subInfoType__c);
+        // System.assertEquals('璺熻繘涓�',slist[0].Tender_information__r.OpportunityStatus__c);
+        // System.assertEquals(1,slist[0].Tender_information__r.OpportunityNum__c);
+        // System.assertEquals('05.璇环涓�',slist[0].Tender_information__r.status__c);
+        // System.assertEquals('璇环',slist[0].Opportunity__r.StageName__c);
+        System.assertEquals(Date.today(),slist[1].Opportunity__r.Contract_DB_complite_day__c);
+        System.assertEquals(true,slist[1].Opportunity__r.Contract_Authorize_Lock__c);
+		Database.executeBatch(new TenderResultConfirmTaskBatch());
+		Test.stopTest();
+    }
+}
\ No newline at end of file
diff --git a/force-app/main/default/lwc/tenderLost/__tests__/tenderLost.test.js b/force-app/main/default/lwc/tenderLost/__tests__/tenderLost.test.js
new file mode 100644
index 0000000..39aef5e
--- /dev/null
+++ b/force-app/main/default/lwc/tenderLost/__tests__/tenderLost.test.js
@@ -0,0 +1,25 @@
+import { createElement } from 'lwc';
+import TenderLost from 'c/tenderLost';
+
+describe('c-tender-lost', () => {
+    afterEach(() => {
+        // The jsdom instance is shared across test cases in a single file so reset the DOM
+        while (document.body.firstChild) {
+            document.body.removeChild(document.body.firstChild);
+        }
+    });
+
+    it('TODO: test case generated by CLI command, please fill in test logic', () => {
+        // Arrange
+        const element = createElement('c-tender-lost', {
+            is: TenderLost
+        });
+
+        // Act
+        document.body.appendChild(element);
+
+        // Assert
+        // const div = element.shadowRoot.querySelector('div');
+        expect(1).toBe(1);
+    });
+});
\ No newline at end of file
diff --git a/force-app/main/default/lwc/tenderLost/tenderLost.html b/force-app/main/default/lwc/tenderLost/tenderLost.html
new file mode 100644
index 0000000..0cb5d38
--- /dev/null
+++ b/force-app/main/default/lwc/tenderLost/tenderLost.html
@@ -0,0 +1,75 @@
+<template>
+    <div class="exampleHolder" if:true={IsLoading} >
+      <lightning-spinner alternative-text="Loading" size="large"></lightning-spinner>
+    </div>
+    <div style="padding:30px">
+      <div style="float:right" >
+        <div class="demo-only demo-only_viewport" style="height:4.5rem;" if:true = {Tongzhishow}>
+          <div class="slds-notification-container" style={IsLeftStyle}>
+            <div aria-live="assertive" aria-atomic="true" class="slds-assistive-text">鎻愮ず</div>
+            <section class="slds-notification" role="dialog" aria-labelledby="noti77" aria-describedby="dialog-body-id-43" >
+              <div class="slds-notification__body" id="dialog-body-id-43" >
+                <a class="slds-notification__target slds-media" href="#" style={BgColorStyle}>
+                  <span class="slds-icon_container slds-icon-standard-task slds-media__figure" title="task">
+                      <lightning-icon icon-name={TongzhiIcon} alternative-text="Account" title="Account"></lightning-icon>                  
+                  </span>
+                  <div class="slds-media__body">
+                    <h2 class="slds-text-heading_small slds-m-bottom_xx-small" id="noti77">
+                      <span class="slds-assistive-text">task notification:</span>鎻愮ず</h2>
+                    <p>{SaveShowText}</p>
+                  </div>
+                </a>
+                <button class="slds-button slds-button_icon slds-button_icon-container slds-notification__close" title="close">
+                    <lightning-icon icon-name="utility:close" alternative-text="close" title="close"  size="x-small" onclick={CloseAlert}></lightning-icon>     
+                </button>
+              </div>
+            </section>
+          </div>
+        </div>
+      </div>
+  
+      <!-- 椤甸潰涓讳綋 -->
+
+      <div style="width: 495px;padding:1px">
+        <lightning-combobox
+          name="fundBasic"
+          label="璧勯噾鏉ユ簮:"
+          placeholder="璇烽�夋嫨"
+          value={opp.Fund_Basis__c}
+          options={RelateOption}
+          onchange={handleRelationFn}
+          style="width: 495px;padding:1px"
+        >
+        </lightning-combobox>
+      </div>
+
+      <div style="width: 495px;padding:1px">
+        <lightning-combobox
+          name="salesMethod"
+          label="鎷涙爣鏂瑰紡:"
+          placeholder="璇烽�夋嫨"
+          value={opp.Sales_Method__c}
+          options={RelateOption1}
+          onchange={handleRelationFn1}
+          style="width: 495px;padding:1px"
+        >
+        </lightning-combobox>
+      </div>
+
+      <div style="width: 495px;padding:1px">
+      <!-- <c-jzlookup if:true={isShi} data-parent-id="lookup3" label="鍏宠仈鏅�氱瀹�" placeholder="璇烽�夋嫨鏅�氱瀹�.."  onsearchchange={onsearchchangePTKS} searchdata={searchdataPTKS} option={optionPTKS} onselected={selectedPTKS}> </c-jzlookup> -->
+      <c-jzlookup data-parent-id="lookup3" label="绉戝:" placeholder="璇烽�夋嫨绉戝.."  onsearchchange={onsearchchangePTKS} searchdata={searchdataPTKS} option={optionPTKS} onselected={selectedPTKS} > </c-jzlookup>
+      <!-- <c-jzlookuplightning ata-parent-id="lookup1"  onsearchchange={onsearchchangePTKS} objectname="Opportunity" fieldname="AccountId"  >   </c-jzlookuplightning> -->
+    </div>
+
+      <button 
+      class="slds-button slds-button_brand" 
+      onclick={saveFn} 
+      style="margin-top: 10px">
+      淇濆瓨
+      </button>
+      
+      <!-- 椤甸潰涓讳綋 -->
+  
+    </div>
+  </template>
\ No newline at end of file
diff --git a/force-app/main/default/lwc/tenderLost/tenderLost.js b/force-app/main/default/lwc/tenderLost/tenderLost.js
new file mode 100644
index 0000000..135adca
--- /dev/null
+++ b/force-app/main/default/lwc/tenderLost/tenderLost.js
@@ -0,0 +1,169 @@
+import { LightningElement, api, track } from 'lwc';
+import SaveData from '@salesforce/apex/TenderLostController.SaveData';
+import SearchPTKS from '@salesforce/apex/TenderLostController.SearchPTKS';
+// import SearchParent from '@salesforce/apex/TenderLostController.SearchParent';
+import InitData from '@salesforce/apex/TenderLostController.InitData';
+import LinkedHospitals from '@salesforce/apex/TenderLostController.LinkedHospitals';
+
+export default class TenderLost extends LightningElement {
+
+    //璧勯噾鏉ユ簮閫夐」
+    RelateOption=[
+        {label:"鏀垮簻鎷ㄦ",value:"鏀垮簻璩囬噾"},
+        {label:"鍖婚櫌璧勯噾",value:"鐥呴櫌璩囬噾"},
+        {label:"鍥介檯璧勯噾",value:"鍥介殯璩囬噾"},
+        {label:"閾惰璧勯噾",value:"閵�琛岃硣閲�"},
+        {label:"鍏徃/涓汉鎶曡祫",value:"浼氱ぞ/鍊嬩汉璩囬噾"},
+        {label:"铻嶈祫绉熻祦",value:"铻嶈祫绉熻祦锛堛儶銉笺偣锛�"},
+        {label:"鍏朵粬",value:"銇濄伄浠�"},
+    ];
+
+    //鎷涙爣鏂瑰紡閫夐」
+    RelateOption1=[
+        {label:"鏀垮簻鎷涙爣",value:"鏀垮簻鎷涙爣"},
+        {label:"闄㈠唴鎷涙爣",value:"闄㈠唴鎷涙爣"},
+        {label:"绔熶簤鎬ц皥鍒�",value:"绔熶簤鎬ц皥鍒�(闈炴嫑鏍�)"},
+        {label:"鍗曚竴鏉ユ簮閲囪喘",value:"鍗曚竴鏉ユ簮閲囪喘"},
+        {label:"绉佺珛鍖婚櫌閲囪喘",value:"绉佺珛鍖婚櫌閲囪喘"},
+        {label:"鑰楁潗閲囪喘",value:"鑰楁潗閲囪喘"},
+    ];
+
+    // 椤甸潰瀵硅薄
+    opp = {};
+    hospitals = [];
+
+    //璧勯噾鏉ユ簮
+    handleRelationFn(event){
+        var value = event.target.value;
+        this.opp.Fund_Basis__c = value;
+    }
+    
+    //鎷涙爣鏂瑰紡
+    handleRelationFn1(event){
+        var value = event.target.value;
+        this.opp.Sales_Method__c = value;
+    }
+
+    //浠巙rl涓婂彇寰桰D
+    getQueryVariable(variable)
+    {
+        var query = window.location.search.substring(1);
+        var vars = query.split("&");
+        for (var i=0;i<vars.length;i++) {
+                var pair = vars[i].split("=");
+                if(pair[0] == variable){return pair[1];}
+        }
+        return(false);
+    }
+
+    //鍒濆鍖�
+    connectedCallback(){
+        this.tenId = this.getQueryVariable('id');
+
+        InitData({ParamIdStr:this.tenId}).then(response=>{
+            this.opp=JSON.parse(response);
+        });
+        LinkedHospitals({ParamIdStr:this.tenId}).then(response=>{
+            this.hospitals = response;
+            console.log('get linked hospital:' + this.hospitals);
+        });
+    }
+
+    //鍏宠仈鏅�氱瀹�
+    optionPTKS = [{lableOne:"Name",lableTwo:"Acc_Record_Type__c"}];
+    searchdataPTKS=[];
+    
+    onsearchchangePTKS(event){
+    var searchContentStr = event.detail.searchContent;
+    console.log('hospitals: ' + this.hospitals);
+       SearchPTKS({content:searchContentStr, hospitals:this.hospitals}).then(response=>{
+            var datas = JSON.parse(response);
+            this.searchdataPTKS = datas;
+            this.template.querySelector('[data-parent-id="lookup3"]').refreshdata(this.searchdataPTKS);
+        })
+    }
+    PTKSId = '';
+    selectedPTKS(event)
+    {
+        console.warn(event.detail.selectdata.Id);
+        this.opp.AccountId = event.detail.selectdata.Id;
+    }
+
+    // InitPTKS()
+    // {
+    //     SearchPTKS({content:undefined}).then(response=>{
+    //     var datas = JSON.parse(response);
+    //         this.searchdataPTKS = datas;
+    //         this.template.querySelector('[data-parent-id="lookup3"]').refreshdata(this.searchdataPTKS);
+    //     })
+    // }
+    //鍏宠仈鏅�氱瀹�
+
+    //淇濆瓨鏁版嵁閫昏緫
+    saveFn(){
+        if(this.opp.Fund_Basis__c == undefined || this.opp.Sales_Method__c == undefined || this.opp.AccountId == undefined){
+            this.Alert("璇蜂笉瑕佽緭鍏ョ┖鍝︺��",false,true);
+        }else{
+            this.OnLoading(true);
+            SaveData({JsonData:JSON.stringify(this.opp)}).then((response)=>{
+                if (response != '' && response.indexOf('閿欒') < 0) {
+                    this.OnLoading(false);
+                    console.log(response);
+                    this.Alert("淇濆瓨鎴愬姛",false,true); 
+                    window.open('/apex/PCLLostReportPage?pageStatus=Create&oppId=' + response + '&lostType=澶卞崟');
+                    // window.location.hash = "Refresh"+"=="+response;
+                    top.window.close();
+                }else{
+                    this.Alert(response,true);
+                }
+            });
+        }
+    }
+
+
+    //-------- 淇濆瓨鎻愮ず妗� --------
+    //鎻愮ず
+    SaveShowText="淇濆瓨鎴愬姛";//鎻愮ず妗嗙殑鏂囨湰
+    Tongzhishow=false;  //鎻愮ず鏄剧ず鐨勬爣璇�
+    TongzhiIcon = 'standard:account' //鎻愮ず妗嗙殑鍥炬爣
+    IsLeftStyle = "" //鎻愮ず妗嗙殑鏍峰紡
+    BgColorStyle = ""
+
+    //寮规鎻愮ず content 鍐呭 error 鏄惁鏄敊璇彁绀烘  left 鏄惁灞呭乏
+    Alert(content,error = false,left = false){
+        this.SaveShowText = content;
+        this.Tongzhishow = true;
+
+        if (error) {
+            this.TongzhiIcon = "standard:first_non_empty";
+            this.BgColorStyle = "background-color:#f88568";
+        }else{
+            this.TongzhiIcon = "standard:account";
+            this.BgColorStyle = "background-color:#69e669";
+        }
+        if (left) {
+            this.IsLeftStyle = "left: 0.25rem"
+        }else{
+            this.IsLeftStyle = ""
+        }
+    }
+
+    //鍏抽棴鎻愮ず妗�
+    CloseAlert(){
+        this.closeOffRefresh();
+    }
+    closeOffRefresh(){
+        if (this.Tongzhishow == true) {
+            this.Tongzhishow = false;
+        }
+        if (this.SaveShowText != "") {
+            this.SaveShowText = "";
+        }
+    }
+    //鍔犺浇
+    IsLoading = false;
+    OnLoading(flag) {
+        this.IsLoading = flag;
+    }
+    //-------- 淇濆瓨鎻愮ず妗� --------
+}
\ No newline at end of file
diff --git a/force-app/main/default/lwc/tenderLost/tenderLost.js-meta.xml b/force-app/main/default/lwc/tenderLost/tenderLost.js-meta.xml
new file mode 100644
index 0000000..eac275d
--- /dev/null
+++ b/force-app/main/default/lwc/tenderLost/tenderLost.js-meta.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<LightningComponentBundle xmlns="http://soap.sforce.com/2006/04/metadata">
+    <apiVersion>55.0</apiVersion>
+    <isExposed>false</isExposed>
+</LightningComponentBundle>
\ No newline at end of file
diff --git a/force-app/main/default/pages/TenderLostPage.page b/force-app/main/default/pages/TenderLostPage.page
new file mode 100644
index 0000000..110317d
--- /dev/null
+++ b/force-app/main/default/pages/TenderLostPage.page
@@ -0,0 +1,26 @@
+<apex:page showHeader="false" sidebar="false" id="TenderLostApp" title="鎷涙爣椤圭洰澶卞崟">
+    <apex:includeLightning />
+    <div style="width:100%;height:100%;" id="TenderLostApp" />
+
+    <script>
+        $Lightning.use("c:TenderLostApp", function () {
+            $Lightning.createComponent("c:tenderLost",
+                {},
+                "TenderLostApp",
+                function (cmp) {
+                    console.log('Component created, do something cool here');
+                });
+        });
+
+        // var interval = setInterval(()=>{
+        //     var hrefStr = window.location.href;
+        //     if (hrefStr.indexOf("Refresh") != -1) {
+        //         // var arr = hrefStr.split("==");
+        //         // window.open('/a1U/e?retURL=%2F' + arr[1] + '&RecordType=01210000000R4hM');
+        //         top.window.close();
+        //         clearInterval(interval);
+        //     }
+        // },1000);
+    </script>
+
+</apex:page>
\ No newline at end of file

--
Gitblit v1.9.1