From e4185f503d973b28f95725908e3fad155cfbf088 Mon Sep 17 00:00:00 2001
From: 沙世明 <shashiming@prec-tech.com>
Date: 星期三, 22 三月 2023 11:55:32 +0800
Subject: [PATCH] 进口单证发货日逻辑

---
 force-app/main/default/classes/FrameNumUploadControllerTest.cls-meta.xml |    5 
 force-app/main/default/classes/FrameNumManageHandler.cls                 |   93 ++++
 force-app/main/default/classes/SetFrameNumManageBatch.cls                |  276 ++++++++++--
 force-app/main/default/classes/FrameNumManageHandler.cls-meta.xml        |    5 
 force-app/main/default/classes/DNDetailsHandler.cls-meta.xml             |    5 
 force-app/main/default/classes/ESignFormHandler.cls                      |  132 +++++
 force-app/main/default/classes/DNDetailsHandler.cls                      |  121 +++++
 force-app/main/default/classes/FrameNumUploadControllerTest.cls          |  654 +++++++++++++++++++++++++++++
 8 files changed, 1,218 insertions(+), 73 deletions(-)

diff --git a/force-app/main/default/classes/DNDetailsHandler.cls b/force-app/main/default/classes/DNDetailsHandler.cls
new file mode 100644
index 0000000..1ad9d58
--- /dev/null
+++ b/force-app/main/default/classes/DNDetailsHandler.cls
@@ -0,0 +1,121 @@
+/**
+     * @Author    lijinhuan
+     * @DateTime  2023-02-07T17:49:45+0800
+     * 娴嬭瘯绫伙細FrameNumUploadControllerTest
+*/
+public without sharing class DNDetailsHandler  extends Oly_TriggerHandler {
+
+    private Map<Id, Statu_Achievements_DN_details__c > newMap;
+    private Map<Id, Statu_Achievements_DN_details__c > oldMap;
+    private List<Statu_Achievements_DN_details__c > newList;
+    private List<Statu_Achievements_DN_details__c > oldList;
+    public DNDetailsHandler() {
+        this.newMap = (Map<Id, Statu_Achievements_DN_details__c >) Trigger.newMap;
+        this.oldMap = (Map<Id, Statu_Achievements_DN_details__c >) Trigger.oldMap;
+        this.newList = (List<Statu_Achievements_DN_details__c >) Trigger.new;
+        this.oldList = (List<Statu_Achievements_DN_details__c >) Trigger.old;
+    }
+    protected override void afterInsert() {
+        insertFrameNumManag();
+    }
+    protected override void afterUpdate() {
+        // insertFrameNumManag(); // 娴嬭瘯鐢�   
+    }
+
+    protected override void afterDelete() {
+        
+    }
+
+    protected override void beforeInsert() {
+    }
+    
+    protected override void beforeUpdate() {
+
+    }
+
+    protected override void beforeDelete() {
+        // 杩涘彛鍗曡瘉 start
+        // 鍒犻櫎杩涘彛鍗曡瘉鏁版嵁
+        deleteFrameNumManage();
+        // 杩涘彛鍗曡瘉 end
+    }
+
+    private Void insertFrameNumManag(){
+    Set<String> IdSet = new Set<String>();
+    // 杩涘彛鍗曡瘉 澧炲姞鍙戣揣鏃ヨ缃� start
+    Set<Date> dateset = new Set<Date>();
+    Map<Date, String> olycals = new Map<Date, String>();
+    // 杩涘彛鍗曡瘉 澧炲姞鍙戣揣鏃ヨ缃� end
+    Map<String,Id> eSignFormMap = new Map<String,Id>();
+    Map<String,String> DNMap  = new Map<String,String>();
+    for (Statu_Achievements_DN_details__c nObj : newList) {
+        IdSet.add(nObj.Id);
+    }
+    Map<String,Statu_Achievements_DN_details__c> sandMap = new Map<String,Statu_Achievements_DN_details__c>();
+        // 鏌ヨ鏄庣粏 鍦ㄦ満韬紪鐮佷腑鏈夋病锛屾病鏈夌敓鎴�
+        for(Statu_Achievements_DN_details__c dn:[SELECT Id,SerialNumber__c,asset__c,
+                 Statu_Achievements_DN__c,SerialNoorLotNo_Raw__c,TracingCode_Raw__c,
+                 OTCode_Raw__c,asset__r.Name,QTY__c,Statu_Achievements_DN__r.Name 
+                 // 杩涘彛鍗曡瘉 澧炲姞鍙戣揣鏃ヨ缃� start
+                 , Statu_Achievements_DN__r.DeliveryDate__c 
+                 // 杩涘彛鍗曡瘉 澧炲姞鍙戣揣鏃ヨ缃� end
+                 FROM Statu_Achievements_DN_details__c
+                 WHERE Id =:IdSet ]){
+            sandMap.put(dn.TracingCode_Raw__c,dn);
+            DNMap.put(dn.TracingCode_Raw__c,dn.Statu_Achievements_DN__r.Name);
+            // 鍙栨墍鏈夊彂璐ф棩
+            dateset.add(dn.Statu_Achievements_DN__r.DeliveryDate__c);
+        }
+        for(FrameNumManage__c f:[SELECT ManagementCode__c  FROM FrameNumManage__c WHERE ManagementCode__c in :sandMap.keySet()]){
+            sandMap.remove(f.ManagementCode__c);
+        }
+        for(eSignForm__c es:[SELECT Id,DNName__c FROM eSignForm__c WHERE DNName__c IN: DNMap.values()]){
+            for(String key:DNMap.keySet()){
+                if(DNMap.get(key) == es.DNName__c){
+                    eSignFormMap.put(key,es.Id);
+                }
+            } 
+        }
+        // 鍙栧彂璐ф棩鐨勫ゥ鏋楀反鏂棩鍘�
+        for (OlympusCalendar__c oc : [select Id, Date__c from OlympusCalendar__c where Date__c in :dateset]) {
+            olycals.put(oc.Date__c, oc.Id);
+        }
+
+        if(sandMap.size() > 0){
+            List<FrameNumManage__c> infnmList = new List<FrameNumManage__c>();
+            for (Statu_Achievements_DN_details__c s:sandMap.values()) {
+                if(eSignFormMap.get(s.TracingCode_Raw__c) != null){
+                    FrameNumManage__c temp = new FrameNumManage__c();
+                    temp.Name = s.TracingCode_Raw__c;
+                    temp.ManagementCode__c = s.TracingCode_Raw__c;
+                    temp.SerialNumberS__c = s.SerialNoorLotNo_Raw__c+'('+s.TracingCode_Raw__c+')';
+                    temp.SerialNumber__c = s.SerialNoorLotNo_Raw__c;
+                    temp.Num__c = s.QTY__c;
+                    temp.CheckOutNo__c  = s.Statu_Achievements_DN__r.Name.subString(2);//鍙戣揣DN 鐨刵ame鍘绘帀鍓嶄袱浣嶇殑 00
+
+                    temp.Statu_Achievements_DN_details__c = s.Id;
+                    temp.Asset__c = s.asset__c;
+                    temp.signInForm__c = eSignFormMap.get(s.TracingCode_Raw__c);
+
+                    // 璁剧疆鍙戣揣鏃ュ拰濂ユ灄宸存柉鏃ュ巻
+                    temp.DeliveryDate__c = s.Statu_Achievements_DN__r.DeliveryDate__c;
+                    temp.DeliveryDate_select__c = temp.DeliveryDate__c != null && olycals.size() > 0 && String.isNotBlank(olycals.get(temp.DeliveryDate__c)) ? olycals.get(temp.DeliveryDate__c) : null;
+                    
+                    temp.Material__c = s.OTCode_Raw__c;
+                    temp.MaterialDepict__c = s.asset__r.Name;
+                    infnmList.add(temp);
+                }
+            }
+            if(infnmList.size() > 0){
+                insert infnmList;
+            }    
+        }
+    }
+
+    private void deleteFrameNumManage() {
+        List<FrameNumManage__c> rnmList = [select Id from FrameNumManage__c where Statu_Achievements_DN_details__c in :oldMap.keySet()];
+        if (rnmList != null && rnmList.size() > 0) {
+            delete rnmList;
+        }
+    }
+}
\ No newline at end of file
diff --git a/force-app/main/default/classes/DNDetailsHandler.cls-meta.xml b/force-app/main/default/classes/DNDetailsHandler.cls-meta.xml
new file mode 100644
index 0000000..db9bf8c
--- /dev/null
+++ b/force-app/main/default/classes/DNDetailsHandler.cls-meta.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ApexClass xmlns="http://soap.sforce.com/2006/04/metadata">
+    <apiVersion>48.0</apiVersion>
+    <status>Active</status>
+</ApexClass>
diff --git a/force-app/main/default/classes/ESignFormHandler.cls b/force-app/main/default/classes/ESignFormHandler.cls
index 85b0ad6..e474d4c 100644
--- a/force-app/main/default/classes/ESignFormHandler.cls
+++ b/force-app/main/default/classes/ESignFormHandler.cls
@@ -1,8 +1,11 @@
+/*
+  20230302 ljh 娴嬭瘯绫� ESignFormHandlerTest 鍙互 FrameNumUploadControllerTest 涔熷彲浠�
+ */
 public without sharing class ESignFormHandler extends Oly_TriggerHandler {
-	private Map<Id, eSignForm__c> newMap;
-	    private Map<Id, eSignForm__c> oldMap;
-	    private List<eSignForm__c> newList;
-	    private List<eSignForm__c> oldList;
+    private Map<Id, eSignForm__c> newMap;
+        private Map<Id, eSignForm__c> oldMap;
+        private List<eSignForm__c> newList;
+        private List<eSignForm__c> oldList;
 
     public ESignFormHandler() {
 
@@ -20,11 +23,15 @@
         beforeExecute();
     }
     protected override void afterInsert() {
-        afterExecute();
+        // afterExecute();
+        // 杩涘彛鍗曡瘉 start
+        // 绛炬敹鍗曠敓鎴愬悗鎻掑叆杩涘彛鍗曡瘉瀵瑰簲鐨勬暟鎹�
+        insertFrameNumManage();
+        // 杩涘彛鍗曡瘉 end
     }
 
      protected override void afterUpdate() {
-        afterExecute();
+        // afterExecute();
     }
 
     private void beforeExecute() {
@@ -32,7 +39,7 @@
         for(eSignForm__c nObj : newList) {
             //DN鍙蜂笉涓虹┖
             if(String.isNotBlank(nObj.DNNameNo0__c)){
-            	Blob bodyBlob=Blob.valueOf(nObj.DNNameNo0__c);
+                Blob bodyBlob=Blob.valueOf(nObj.DNNameNo0__c);
                 nObj.DNName0_base64__c =String.valueOf(EncodingUtil.base64Encode(bodyBlob));
             }
             //缁忛攢鍟嗙鐞嗙紪鐮佷笉涓虹┖
@@ -43,22 +50,109 @@
         }
     }
 
-    private void afterExecute() {
-        List<eSignFormEntry__c>  eSignFormEntryList = new List<eSignFormEntry__c>();
+    // private void afterExecute() {
+    //     List<eSignFormEntry__c>  eSignFormEntryList = new List<eSignFormEntry__c>();
 
-        for (eSignForm__c eSignForm : newList) {
+    //     for (eSignForm__c eSignForm : newList) {
 
-                if(eSignForm.finalUpadteFrom__c != null){
-                    eSignFormEntry__c es = new eSignFormEntry__c();
-                    es.id = eSignForm.finalUpadteFrom__c;
-                    es.IsHandled__c = true;
-                    eSignFormEntryList.add(es);
-                }
+    //             if(eSignForm.finalUpadteFrom__c != null){
+    //                 eSignFormEntry__c es = new eSignFormEntry__c();
+    //                 es.id = eSignForm.finalUpadteFrom__c;
+    //                 es.IsHandled__c = true;
+    //                 eSignFormEntryList.add(es);
+    //             }
 
             
+    //         }
+    //     if(eSignFormEntryList.size() > 0){
+    //         update eSignFormEntryList;
+    //     }        
+    // }
+
+    private void insertFrameNumManage() {
+        Set<String> IdSet = new Set<String>();
+        // 杩涘彛鍗曡瘉 澧炲姞鍙戣揣鏃ヨ缃� start
+        Set<Date> dateset = new Set<Date>();
+        Map<Date, String> olycals = new Map<Date, String>();
+        // 杩涘彛鍗曡瘉 澧炲姞鍙戣揣鏃ヨ缃� end
+        Map<String,Id> eSignFormMap = new Map<String,Id>();
+        Map<String,String> DNMap  = new Map<String,String>();
+        for (eSignForm__c nObj : newList) {
+            IdSet.add(nObj.Statu_Achievements_DN__c);
+        }
+        Map<String,Statu_Achievements_DN_details__c> sandMap = new Map<String,Statu_Achievements_DN_details__c>();
+        Map<String,Statu_Achievements_DN_details__c> UpdateSandMap = new Map<String,Statu_Achievements_DN_details__c>();
+        Map<String,String> UpdateFIdMap = new Map<String,String>();
+        // 鏌ヨ鏄庣粏 鍦ㄦ満韬彿绠$悊涓湁娌★紝娌℃湁鐢熸垚,鏈夋洿鏂� 绛炬敹鍗曘�佸彂璐N鏄庣粏銆佷繚鏈夎澶�
+        for(Statu_Achievements_DN_details__c dn:[SELECT Id,SerialNumber__c,asset__c,
+                    Statu_Achievements_DN__c,SerialNoorLotNo_Raw__c,TracingCode_Raw__c,
+                    OTCode_Raw__c,asset__r.Name,QTY__c,Statu_Achievements_DN__r.Name 
+                    // 杩涘彛鍗曡瘉 澧炲姞鍙戣揣鏃ヨ缃� start
+                    , Statu_Achievements_DN__r.DeliveryDate__c 
+                    // 杩涘彛鍗曡瘉 澧炲姞鍙戣揣鏃ヨ缃� end
+                    FROM Statu_Achievements_DN_details__c
+                    WHERE Statu_Achievements_DN__c =:IdSet ]){
+            sandMap.put(dn.TracingCode_Raw__c,dn);
+            DNMap.put(dn.TracingCode_Raw__c,dn.Statu_Achievements_DN__r.Name);
+            // 鍙栨墍鏈夊彂璐ф棩
+            dateset.add(dn.Statu_Achievements_DN__r.DeliveryDate__c);
+        }
+        for(FrameNumManage__c f:[SELECT Id,ManagementCode__c  FROM FrameNumManage__c WHERE ManagementCode__c in :sandMap.keySet()]){
+            // 鏇存柊鏈鸿韩鍙风鐞�
+            UpdateSandMap.put(f.ManagementCode__c,sandMap.get(f.ManagementCode__c));
+            UpdateFIdMap.put(f.ManagementCode__c, f.Id);
+            sandMap.remove(f.ManagementCode__c);
+        }
+        for(eSignForm__c es: newList){
+            for(String key:DNMap.keySet()){
+                if(DNMap.get(key) == es.DNName__c){
+                    eSignFormMap.put(key,es.Id);
+                }
+            } 
+        }
+        // 鍙栧彂璐ф棩鐨勫ゥ鏋楀反鏂棩鍘�
+        for (OlympusCalendar__c oc : [select Id, Date__c from OlympusCalendar__c where Date__c in :dateset]) {
+            olycals.put(oc.Date__c, oc.Id);
+        }
+        if(sandMap.size() > 0){
+            List<FrameNumManage__c> infnmList = new List<FrameNumManage__c>();
+            for (Statu_Achievements_DN_details__c s:sandMap.values()) {
+                FrameNumManage__c temp = new FrameNumManage__c();
+                temp.Name = s.TracingCode_Raw__c;
+                temp.ManagementCode__c = s.TracingCode_Raw__c;
+                temp.SerialNumberS__c = s.SerialNoorLotNo_Raw__c+'('+s.TracingCode_Raw__c+')';
+                temp.SerialNumber__c = s.SerialNoorLotNo_Raw__c;
+                temp.Num__c = s.QTY__c;
+                temp.CheckOutNo__c  = s.Statu_Achievements_DN__r.Name.subString(2);//鍙戣揣DN 鐨刵ame鍘绘帀鍓嶄袱浣嶇殑 00
+
+                temp.Statu_Achievements_DN_details__c = s.Id;
+                temp.Asset__c = s.asset__c;
+                temp.signInForm__c = eSignFormMap.get(s.TracingCode_Raw__c);
+                
+                // 璁剧疆鍙戣揣鏃ュ拰濂ユ灄宸存柉鏃ュ巻
+                temp.DeliveryDate__c = s.Statu_Achievements_DN__r.DeliveryDate__c;
+                temp.DeliveryDate_select__c = temp.DeliveryDate__c != null && olycals.size() > 0 && String.isNotBlank(olycals.get(temp.DeliveryDate__c)) ? olycals.get(temp.DeliveryDate__c) : null;
+                
+                temp.Material__c = s.OTCode_Raw__c;
+                temp.MaterialDepict__c = s.asset__r.Name;
+                infnmList.add(temp);
             }
-        if(eSignFormEntryList.size() > 0){
-            update eSignFormEntryList;
-        }        
+            if(infnmList.size() > 0){
+                insert infnmList;
+                // Database.executeBatch(new SetFrameNumManageBatch(), 100);
+            }    
+        }
+        if(UpdateSandMap.size() > 0){
+            List<FrameNumManage__c> upfnmList = new List<FrameNumManage__c>();
+            for (Statu_Achievements_DN_details__c s:UpdateSandMap.values()) {
+                FrameNumManage__c temp = new FrameNumManage__c();
+                temp.id = UpdateFIdMap.get(s.TracingCode_Raw__c);
+                temp.Statu_Achievements_DN_details__c = s.Id;
+                temp.Asset__c = s.asset__c;
+                temp.signInForm__c = eSignFormMap.get(s.TracingCode_Raw__c);
+                upfnmList.add(temp);
+            }
+            update upfnmList;
+        }
     }
 }
\ No newline at end of file
diff --git a/force-app/main/default/classes/FrameNumManageHandler.cls b/force-app/main/default/classes/FrameNumManageHandler.cls
new file mode 100644
index 0000000..e99d708
--- /dev/null
+++ b/force-app/main/default/classes/FrameNumManageHandler.cls
@@ -0,0 +1,93 @@
+/**
+     * @Author    lijinhuan
+     * @DateTime  2022-12-14T17:01:14+0800
+     * 娴嬭瘯绫伙細FrameNumUploadControllerTest
+*/
+public without sharing class FrameNumManageHandler  extends Oly_TriggerHandler {
+
+    private Map<Id, FrameNumManage__c > newMap;
+    private Map<Id, FrameNumManage__c > oldMap;
+    private List<FrameNumManage__c > newList;
+    private List<FrameNumManage__c > oldList;
+    public FrameNumManageHandler() {
+        this.newMap = (Map<Id, FrameNumManage__c >) Trigger.newMap;
+        this.oldMap = (Map<Id, FrameNumManage__c >) Trigger.oldMap;
+        this.newList = (List<FrameNumManage__c >) Trigger.new;
+        this.oldList = (List<FrameNumManage__c >) Trigger.old;
+    }
+    protected override void afterInsert() {
+        // 杩涘彛鍗曡瘉 澧炲姞鍙戣揣鏃ヨ缃� start
+        updateAsset();
+        // 杩涘彛鍗曡瘉 澧炲姞鍙戣揣鏃ヨ缃� end
+    }
+    protected override void afterUpdate() {
+        updateAsset();
+    }
+
+    protected override void beforeInsert() {
+    }
+    
+    protected override void beforeUpdate() {
+        IsChange();
+    }
+    private Void updateAsset(){
+        Map<String,FrameNumManage__c> FrameNumManageMap = new Map<String,FrameNumManage__c>();
+        for (FrameNumManage__c nObj : newList) {
+            FrameNumManage__c oObj = oldMap != null ? oldMap.get(nObj.Id) : null;
+            if( String.isNotBlank(nObj.Asset__c) 
+            && ( oObj == null 
+                ||  nObj.Asset__c != oObj.Asset__c 
+                ||  nObj.ApplyList_Select__c != oObj.ApplyList_Select__c 
+                ||  nObj.InspectionCard_Select__c != oObj.InspectionCard_Select__c
+                ||  nObj.ApplyList__c != oObj.ApplyList__c
+                ||  nObj.InspectionCard__c != oObj.InspectionCard__c
+                ||  nObj.ScanDate__c != oObj.ScanDate__c
+                ||  nObj.ScanDate_select__c  != oObj.ScanDate_select__c 
+                ||  nObj.DeliveryDate__c != oObj.DeliveryDate__c 
+                ||  nObj.DeliveryDate_select__c != oObj.DeliveryDate_select__c 
+                ) 
+            ){
+                FrameNumManageMap.put(nObj.Asset__c,nObj);
+            }
+        }
+        if(FrameNumManageMap.size() > 0 ){
+            List<Asset> AssetList = [select id,ApplyList__c,InspectionCard__c from Asset where id in :FrameNumManageMap.keySet()];
+            List<Asset> upAssetList = new List<Asset>();
+            for(Asset ass:AssetList){
+                if( (ass.ApplyList__c == null ||
+                    (ass.ApplyList__c != null && ass.ApplyList__c != FrameNumManageMap.get(ass.Id).ApplyList_NoHave__c))
+                || (ass.InspectionCard__c == null || 
+                    (ass.InspectionCard__c != null && ass.InspectionCard__c != FrameNumManageMap.get(ass.Id).InspectionCard_NoHave__c))
+                ){
+                    Asset tempAsset = new Asset();
+                    tempAsset.Id = ass.Id;
+                    if(ass.ApplyList__c == null ||
+                    (ass.ApplyList__c != null && ass.ApplyList__c != FrameNumManageMap.get(ass.Id).ApplyList_NoHave__c)){
+                        tempAsset.ApplyList__c = FrameNumManageMap.get(ass.Id).ApplyList_NoHave__c;
+                    }
+                    if(ass.InspectionCard__c == null || 
+                    (ass.InspectionCard__c != null && ass.InspectionCard__c != FrameNumManageMap.get(ass.Id).InspectionCard_NoHave__c)){
+                        tempAsset.InspectionCard__c = FrameNumManageMap.get(ass.Id).InspectionCard_NoHave__c;   
+                    }
+
+                    upAssetList.add(tempAsset);
+                }
+            }
+            if(upAssetList.size() > 0){
+                StaticParameter.EscapeVMCTrigger = true;
+                update upAssetList;
+                StaticParameter.EscapeVMCTrigger = false;
+            }
+        }
+    }
+    private Void IsChange(){ 
+        for (FrameNumManage__c nObj : newList) {
+            FrameNumManage__c oObj = oldMap.get(nObj.Id);
+            if((nObj.ApplyList__c != oObj.ApplyList__c)
+            ||(nObj.InspectionCard__c != oObj.InspectionCard__c)
+             ){
+                nObj.IsChange__c = true;
+            }
+        }
+    }
+}
\ No newline at end of file
diff --git a/force-app/main/default/classes/FrameNumManageHandler.cls-meta.xml b/force-app/main/default/classes/FrameNumManageHandler.cls-meta.xml
new file mode 100644
index 0000000..db9bf8c
--- /dev/null
+++ b/force-app/main/default/classes/FrameNumManageHandler.cls-meta.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ApexClass xmlns="http://soap.sforce.com/2006/04/metadata">
+    <apiVersion>48.0</apiVersion>
+    <status>Active</status>
+</ApexClass>
diff --git a/force-app/main/default/classes/FrameNumUploadControllerTest.cls b/force-app/main/default/classes/FrameNumUploadControllerTest.cls
new file mode 100644
index 0000000..ad4c03f
--- /dev/null
+++ b/force-app/main/default/classes/FrameNumUploadControllerTest.cls
@@ -0,0 +1,654 @@
+/**
+     * @Author    lijinhuan
+*/
+@isTest
+private class FrameNumUploadControllerTest {
+    static testMethod void testMethod1() {
+        StaticParameter.EscapeNFM001AgencyContractTrigger = true;
+        StaticParameter.EscapeNFM001Trigger = true;
+        Oly_TriggerHandler.bypass(ContactTriggerHandler.class.getName());
+        Oly_TriggerHandler.bypass(AgencyHospitalHandler.class.getName());
+
+        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;
+        }
+        //绛炬敹鍗曟渶缁堢敤鎴疯褰曠被鍨�
+        List < RecordType > recordTypeList = [select Id from RecordType where IsActive = true and SobjectType = 'Account'
+            and Name = '鎴︾暐绉戝鍒嗛 鍛煎惛绉�'
+        ];
+        if (recordTypeList.size() == 0) {
+            return;
+        }
+        // 鐪�
+        Address_Level__c al = new Address_Level__c();
+        al.Name = '鏉变含';
+        al.Level1_Code__c = 'CN-99';
+        al.Level1_Sys_No__c = '999999';
+        upsert al;
+        // 甯�
+        Address_Level2__c al2 = new Address_Level2__c();
+        al2.Level1_Code__c = 'CN-99';
+        al2.Level1_Sys_No__c = '999999';
+        al2.Level1_Name__c = '鏉变含';
+        al2.Name = '娓嬭胺鍖�';
+        al2.Level2_Code__c = 'CN-9999';
+        al2.Level2_Sys_No__c = '9999999';
+        al2.Address_Level__c = al.id;
+        upsert al2;
+        // 浜у搧
+        Product2 prd = new Product2();
+        prd.ProductCode_Ext__c = 'N2656630';
+        prd.ProductCode = 'N2656630';
+        prd.Name = 'N2656630';
+        prd.Manual_Entry__c = false;
+        upsert prd;
+        //瀹㈡埛鍖婚櫌
+        Account company = new Account();
+        company.RecordTypeId = rectCo[0].Id;
+        company.Name = 'NFM008TestCompany';
+        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 = 'NFM008TestDepart';
+        depart.ParentId = section.Id;
+        depart.Department_Class__c = section.Id;
+        depart.Hospital__c = company.Id;
+        upsert depart;
+        //绛炬敹鍗曟渶缁堢敤鎴疯褰曠被鍨�
+        Account recordType = new Account();
+        recordType.RecordTypeId = recordTypeList[0].Id;
+        recordType.Name = '*';
+        recordType.Department_Class_Label__c = '娑堝寲绉�';
+        recordType.ParentId = company.Id;
+        recordType.Hospital_Department_Class__c = company.Id;
+        upsert recordType;
+        RecordType rectOpp = [select id from RecordType where IsActive = true and SobjectType = 'Opportunity'
+            and DeveloperName = 'Opportunity'
+        ];
+        //璇环
+        Opportunity opp = new Opportunity(Name = 'testOpp1', StageName = '寮曞悎', CloseDate = Date.today(), AccountId = depart.Id, Sales_Root__c = '璨╁2搴�', Competitor__c = 'A', Click_Close_Date__c = null, RecordType = rectOpp);
+        upsert opp;
+        //娉ㄦ畫
+        Statu_Achievements__c Sac = new Statu_Achievements__c(name = 'zhucan_one', Opportunity__c = opp.id, DeliveryDate__c = Date.today(), ContractNO__c = 'ContractNO1', ContractAmount__c = 100);
+        insert Sac;
+        //淇濇湁璁惧
+        Asset assnew = new Asset(Asset_Owner__c = 'Olympus');
+        assnew.Backorder__c = Sac.Id;
+        // assnew.Order_number__c = Sac.Id;
+        assnew.RecordTypeId = System.Label.Asset_RecordType;
+        assnew.SerialNumber = '22K';
+        assnew.Name = 'NA-201SX-4021:涓�娆℃�т娇鐢ㄥ惛寮曟椿妫�閽�';
+        assnew.Product2Id = prd.Id;
+        assnew.Hospital__c = company.Id;
+        assnew.Department_Class__c = section.Id;
+        assnew.AccountId = depart.Id;
+        assnew.Asset_Owner__c = '鍖婚櫌璧勪骇';
+        assnew.Quantity = 1;
+        assnew.Status = '鏈夊簱瀛�';
+        assnew.Manage_type__c = '涓綋绠$悊';
+        assnew.Internal_asset_location__c = '鍖椾含 澶囧搧涓績';
+        assnew.Loaner_accsessary__c = true;
+        assnew.Delete_Flag__c = false;
+        assnew.Freeze_sign__c = false;
+        assnew.Out_of_wh__c = 0;
+        assnew.CIC_call_back_check__c = true;
+        assnew.Product_Serial_No__c = 'N2656630:22K(KVWMX)';
+        assnew.TracingCode__c = 'KVWMX'; // 鈥�
+        assnew.Posting_Date__c = Date.valueOf('2021-08-20');
+        
+        upsert assnew;
+        //鍙戣揣DN
+        Statu_Achievements_DN__c statuAchievementsDN = new Statu_Achievements_DN__c();
+        statuAchievementsDN.Statu_Achievements__c = Sac.Id;
+        statuAchievementsDN.DeliveryDate__c = Date.valueOf('2021-08-20');
+        statuAchievementsDN.Name = '2021082049';
+        statuAchievementsDN.endUser__c = recordType.Id;
+        upsert statuAchievementsDN;
+        //鍙戣揣DN鏄庣粏
+        Statu_Achievements_DN_details__c statuAchievementsDNDetails = new Statu_Achievements_DN_details__c();
+        statuAchievementsDNDetails.Statu_Achievements_DN__c = statuAchievementsDN.Id;
+        statuAchievementsDNDetails.Name = 'z1c200000292wse';
+        statuAchievementsDNDetails.asset__c = assnew.Id;
+        statuAchievementsDNDetails.SerialNoorLotNo_Raw__c = '22K'; // 鈥�
+        statuAchievementsDNDetails.TracingCode_Raw__c = 'KVWMX'; // 鈥�
+        upsert statuAchievementsDNDetails;
+        // Olympus鏃ュ巻
+        OlympusCalendar__c OlympusCalendar = new OlympusCalendar__c();
+        OlympusCalendar.Date__c = Date.valueOf('2021-08-20');
+        upsert OlympusCalendar;
+        OlympusCalendar__c OlympusCalendar2 = new OlympusCalendar__c();
+        OlympusCalendar2.Date__c = Date.valueOf('2022-05-10');
+        upsert OlympusCalendar2;
+        // 
+        FileAddress__c file = new FileAddress__c();
+
+        file.DownloadLink__c ='url123&fileName=Contact';
+        file.FileName__c ='FY2305-ET01-3.pdf';//鈥�
+        file.ViewLink__c ='url123';
+        file.ParentRecordId__c ='FrameNumManage'; // 鈥�
+        file.AWS_File_Key__c = '123';
+        insert file;
+
+        PageReference ref =  new PageReference('/apex/FrameNumUpload');
+        String csvStr = '鍑哄簱鍗曞彿,鐗╂枡,鐗╂枡鎻忚堪,鏈鸿韩鍙�/鎵规鍙�,鏁伴噺,鎵弿鏃ユ湡,绠$悊缂栧彿,鎶ュ叧鍝佸悕,鍒嗙被,鍑鸿瘉,鎶ュ叧鍗�,鍟嗘璇�,璧峰鏃�,缁撴潫鏃�';
+        csvStr += '\r\n';
+        String csvStrOk = csvStr+ '65289024,N2656630,NA-201SX-4021:涓�娆℃�т娇鐢ㄥ惛寮曟椿妫�閽�,22K,1,2022/05/10,KVWMX,涓�娆℃�т娇鐢ㄥ惛寮曟椿妫�閽�,ET,鏄�,FY2305-ET01-3,FY2305-ET01-3,2022/05/10,2022/05/14';
+        String csvStrErr = csvStr+ '65289024,N2656630,NA-201SX-4021:涓�娆℃�т娇鐢ㄥ惛寮曟椿妫�閽�,22K,1,2022/05/10,KVWMX,涓�娆℃�т娇鐢ㄥ惛寮曟椿妫�閽�,ET1111,鏄笉鏄�,FY2305-ET01-3,FY2305-ET01-3,2022/05/10,2022/05/14';
+        
+        FrameNumUploadController Controller = new FrameNumUploadController();
+        ref.getParameters().put('csvData', csvStrErr);
+        Test.setCurrentPage(ref);
+        Controller.importCSVFile();
+
+        ref.getParameters().put('csvData', csvStrOk);
+        Test.setCurrentPage(ref);
+        Controller.importCSVFile();
+
+        List<FrameNumManage__c> FrameNumManageList = [select Id,InspectionCard__c from FrameNumManage__c];
+        System.assertEquals(1, FrameNumManageList.size());
+        FrameNumManageList[0].InspectionCard__c = '涓嶈';
+        update FrameNumManageList;
+        SetFrameNumManageWebService.updateFrameNumManag(FrameNumManageList[0].Id);// 鍏宠仈鏁版嵁 鎸夐挳      
+    }
+
+    // 涓轰簡 SetFrameNumManageWebService 鎵归噺鍒犻櫎鎸夐挳
+    static testMethod void testMethod2() {
+        StaticParameter.EscapeNFM001AgencyContractTrigger = true;
+        StaticParameter.EscapeNFM001Trigger = true;
+        Oly_TriggerHandler.bypass(ContactTriggerHandler.class.getName());
+        Oly_TriggerHandler.bypass(AgencyHospitalHandler.class.getName());
+
+        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;
+        }
+        //绛炬敹鍗曟渶缁堢敤鎴疯褰曠被鍨�
+        List < RecordType > recordTypeList = [select Id from RecordType where IsActive = true and SobjectType = 'Account'
+            and Name = '鎴︾暐绉戝鍒嗛 鍛煎惛绉�'
+        ];
+        if (recordTypeList.size() == 0) {
+            return;
+        }
+        // 鐪�
+        Address_Level__c al = new Address_Level__c();
+        al.Name = '鏉变含';
+        al.Level1_Code__c = 'CN-99';
+        al.Level1_Sys_No__c = '999999';
+        upsert al;
+        // 甯�
+        Address_Level2__c al2 = new Address_Level2__c();
+        al2.Level1_Code__c = 'CN-99';
+        al2.Level1_Sys_No__c = '999999';
+        al2.Level1_Name__c = '鏉变含';
+        al2.Name = '娓嬭胺鍖�';
+        al2.Level2_Code__c = 'CN-9999';
+        al2.Level2_Sys_No__c = '9999999';
+        al2.Address_Level__c = al.id;
+        upsert al2;
+        // 浜у搧
+        Product2 prd = new Product2();
+        prd.ProductCode_Ext__c = 'N2656630';
+        prd.ProductCode = 'N2656630';
+        prd.Name = 'N2656630';
+        prd.Manual_Entry__c = false;
+        upsert prd;
+        //瀹㈡埛鍖婚櫌
+        Account company = new Account();
+        company.RecordTypeId = rectCo[0].Id;
+        company.Name = 'NFM008TestCompany';
+        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 = 'NFM008TestDepart';
+        depart.ParentId = section.Id;
+        depart.Department_Class__c = section.Id;
+        depart.Hospital__c = company.Id;
+        upsert depart;
+        //绛炬敹鍗曟渶缁堢敤鎴疯褰曠被鍨�
+        Account recordType = new Account();
+        recordType.RecordTypeId = recordTypeList[0].Id;
+        recordType.Name = '*';
+        recordType.Department_Class_Label__c = '娑堝寲绉�';
+        recordType.ParentId = company.Id;
+        recordType.Hospital_Department_Class__c = company.Id;
+        upsert recordType;
+        RecordType rectOpp = [select id from RecordType where IsActive = true and SobjectType = 'Opportunity'
+            and DeveloperName = 'Opportunity'
+        ];
+        //璇环
+        Opportunity opp = new Opportunity(Name = 'testOpp1', StageName = '寮曞悎', CloseDate = Date.today(), AccountId = depart.Id, Sales_Root__c = '璨╁2搴�', Competitor__c = 'A', Click_Close_Date__c = null, RecordType = rectOpp);
+        upsert opp;
+        //娉ㄦ畫
+        Statu_Achievements__c Sac = new Statu_Achievements__c(name = 'zhucan_one', Opportunity__c = opp.id, DeliveryDate__c = Date.today(), ContractNO__c = 'ContractNO1', ContractAmount__c = 100);
+        insert Sac;
+        //淇濇湁璁惧
+        Asset assnew = new Asset(Asset_Owner__c = 'Olympus');
+        assnew.Backorder__c = Sac.Id;
+        // assnew.Order_number__c = Sac.Id;
+        assnew.RecordTypeId = System.Label.Asset_RecordType;
+        assnew.SerialNumber = '22K';
+        assnew.Name = 'NA-201SX-4021:涓�娆℃�т娇鐢ㄥ惛寮曟椿妫�閽�';
+        assnew.Product2Id = prd.Id;
+        assnew.Hospital__c = company.Id;
+        assnew.Department_Class__c = section.Id;
+        assnew.AccountId = depart.Id;
+        assnew.Asset_Owner__c = '鍖婚櫌璧勪骇';
+        assnew.Quantity = 1;
+        assnew.Status = '鏈夊簱瀛�';
+        assnew.Manage_type__c = '涓綋绠$悊';
+        assnew.Internal_asset_location__c = '鍖椾含 澶囧搧涓績';
+        assnew.Loaner_accsessary__c = true;
+        assnew.Delete_Flag__c = false;
+        assnew.Freeze_sign__c = false;
+        assnew.Out_of_wh__c = 0;
+        assnew.CIC_call_back_check__c = true;
+        assnew.Product_Serial_No__c = 'N2656630:22K(KVWMX)';
+        
+        upsert assnew;
+        //鍙戣揣DN
+        Statu_Achievements_DN__c statuAchievementsDN = new Statu_Achievements_DN__c();
+        statuAchievementsDN.Statu_Achievements__c = Sac.Id;
+        statuAchievementsDN.Name = '2021082049';
+        statuAchievementsDN.endUser__c = recordType.Id;
+        upsert statuAchievementsDN;
+        //鍙戣揣DN鏄庣粏
+        Statu_Achievements_DN_details__c statuAchievementsDNDetails = new Statu_Achievements_DN_details__c();
+        statuAchievementsDNDetails.Statu_Achievements_DN__c = statuAchievementsDN.Id;
+        statuAchievementsDNDetails.Name = 'z1c200000292wse';
+        statuAchievementsDNDetails.asset__c = assnew.Id;
+        statuAchievementsDNDetails.SerialNoorLotNo_Raw__c = '22K'; // 鈥�
+        statuAchievementsDNDetails.TracingCode_Raw__c = 'KVWMX'; // 鈥�
+        upsert statuAchievementsDNDetails;
+      
+        // 
+        FileAddress__c file = new FileAddress__c();
+
+        file.DownloadLink__c ='url123&fileName=Contact';
+        file.FileName__c ='FY2305-ET01-3.pdf';//鈥�
+        file.ViewLink__c ='url123';
+        file.ParentRecordId__c ='FrameNumManage'; // 鈥�
+        file.AWS_File_Key__c = '123';
+        insert file;
+
+        PageReference ref =  new PageReference('/apex/FrameNumUpload');
+        String csvStr = '鍑哄簱鍗曞彿,鐗╂枡,鐗╂枡鎻忚堪,鏈鸿韩鍙�/鎵规鍙�,鏁伴噺,鎵弿鏃ユ湡,绠$悊缂栧彿,鎶ュ叧鍝佸悕,鍒嗙被,鍑鸿瘉,鎶ュ叧鍗�,鍟嗘璇�,璧峰鏃�,缁撴潫鏃�,涓婁紶鏃�';
+        csvStr += '\r\n';
+        String csvStrOk = csvStr+ '65289024,N2656630,NA-201SX-4021    : 涓�娆℃�т娇鐢ㄥ惛寮曟椿妫�閽�,22K,1,2022/5/10,KVWMX,涓�娆℃�т娇鐢ㄥ惛寮曟椿妫�閽�,ET,鏄�,FY2305-ET01-3,FY2305-ET01-3,2022/5/10,2022/5/14,2022/6/14';
+        String csvStrErr = csvStr+ '65289024,N2656630,NA-201SX-4021    : 涓�娆℃�т娇鐢ㄥ惛寮曟椿妫�閽�,22K,1,2022/5/10,KVWMX,涓�娆℃�т娇鐢ㄥ惛寮曟椿妫�閽�,ET1111,鏄�,FY2305-ET01-3,FY2305-ET01-3,2022/5/10,2022/5/14,2022/6/14';
+        
+        ref.getParameters().put('csvData', csvStrErr);
+        Test.setCurrentPage(ref);
+        FrameNumUploadController Controller = new FrameNumUploadController();
+        Controller.importCSVFile();
+
+        ref.getParameters().put('csvData', csvStrOk);
+        Test.setCurrentPage(ref);
+        Controller.importCSVFile();
+
+        List<FrameNumManage__c> FrameNumManageList = [select Id,InspectionCard__c from FrameNumManage__c];
+        System.assertEquals(1, FrameNumManageList.size());
+        // 姝e父鍒犻櫎
+        List<String> Ids = new List<String>{FrameNumManageList[0].Id};
+        SetFrameNumManageWebService.BatchDelete(Ids); // 鎵归噺鍒犻櫎 鎸夐挳 
+        // catch 
+        List<String> IdsErr = new List<String>{'aaaaaaaaaaaaa'};
+        SetFrameNumManageWebService.BatchDelete(IdsErr);     
+    }
+
+    // 鍏宠仈杩涘彛鍗曡瘉  鎸夐挳
+    static testMethod void testMethod3() {
+        StaticParameter.EscapeNFM001AgencyContractTrigger = true;
+        StaticParameter.EscapeNFM001Trigger = true;
+        Oly_TriggerHandler.bypass(ContactTriggerHandler.class.getName());
+        Oly_TriggerHandler.bypass(AgencyHospitalHandler.class.getName());
+
+        Oly_TriggerHandler.bypass(ESignFormHandler.class.getName());
+
+        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;
+        }
+        //绛炬敹鍗曟渶缁堢敤鎴疯褰曠被鍨�
+        List < RecordType > recordTypeList = [select Id from RecordType where IsActive = true and SobjectType = 'Account'
+            and Name = '鎴︾暐绉戝鍒嗛 鍛煎惛绉�'
+        ];
+        if (recordTypeList.size() == 0) {
+            return;
+        }
+        // 鐪�
+        Address_Level__c al = new Address_Level__c();
+        al.Name = '鏉变含';
+        al.Level1_Code__c = 'CN-99';
+        al.Level1_Sys_No__c = '999999';
+        upsert al;
+        // 甯�
+        Address_Level2__c al2 = new Address_Level2__c();
+        al2.Level1_Code__c = 'CN-99';
+        al2.Level1_Sys_No__c = '999999';
+        al2.Level1_Name__c = '鏉变含';
+        al2.Name = '娓嬭胺鍖�';
+        al2.Level2_Code__c = 'CN-9999';
+        al2.Level2_Sys_No__c = '9999999';
+        al2.Address_Level__c = al.id;
+        upsert al2;
+        // 浜у搧
+        Product2 prd = new Product2();
+        prd.ProductCode_Ext__c = 'N2656630';
+        prd.ProductCode = 'N2656630';
+        prd.Name = 'N2656630';
+        prd.Manual_Entry__c = false;
+        upsert prd;
+        //瀹㈡埛鍖婚櫌
+        Account company = new Account();
+        company.RecordTypeId = rectCo[0].Id;
+        company.Name = 'NFM008TestCompany';
+        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 = 'NFM008TestDepart';
+        depart.ParentId = section.Id;
+        depart.Department_Class__c = section.Id;
+        depart.Hospital__c = company.Id;
+        upsert depart;
+        //绛炬敹鍗曟渶缁堢敤鎴疯褰曠被鍨�
+        Account recordType = new Account();
+        recordType.RecordTypeId = recordTypeList[0].Id;
+        recordType.Name = '*';
+        recordType.Department_Class_Label__c = '娑堝寲绉�';
+        recordType.ParentId = company.Id;
+        recordType.Hospital_Department_Class__c = company.Id;
+        upsert recordType;
+        RecordType rectOpp = [select id from RecordType where IsActive = true and SobjectType = 'Opportunity'
+            and DeveloperName = 'Opportunity'
+        ];
+        //璇环
+        Opportunity opp = new Opportunity(Name = 'testOpp1', StageName = '寮曞悎', CloseDate = Date.today(), AccountId = depart.Id, Sales_Root__c = '璨╁2搴�', Competitor__c = 'A', Click_Close_Date__c = null, RecordType = rectOpp);
+        upsert opp;
+        //娉ㄦ畫
+        Statu_Achievements__c Sac = new Statu_Achievements__c(name = 'zhucan_one', Opportunity__c = opp.id, DeliveryDate__c = Date.today(), ContractNO__c = 'ContractNO1', ContractAmount__c = 100);
+        insert Sac;
+        //淇濇湁璁惧
+        Asset assnew = new Asset(Asset_Owner__c = 'Olympus');
+        assnew.Backorder__c = Sac.Id;
+        // assnew.Order_number__c = Sac.Id;
+        assnew.RecordTypeId = System.Label.Asset_RecordType;
+        assnew.SerialNumber = '22K';
+        assnew.Name = 'NA-201SX-4021:涓�娆℃�т娇鐢ㄥ惛寮曟椿妫�閽�';
+        assnew.Product2Id = prd.Id;
+        assnew.Hospital__c = company.Id;
+        assnew.Department_Class__c = section.Id;
+        assnew.AccountId = depart.Id;
+        assnew.Asset_Owner__c = '鍖婚櫌璧勪骇';
+        assnew.Quantity = 1;
+        assnew.Status = '鏈夊簱瀛�';
+        assnew.Manage_type__c = '涓綋绠$悊';
+        assnew.Internal_asset_location__c = '鍖椾含 澶囧搧涓績';
+        assnew.Loaner_accsessary__c = true;
+        assnew.Delete_Flag__c = false;
+        assnew.Freeze_sign__c = false;
+        assnew.Out_of_wh__c = 0;
+        assnew.CIC_call_back_check__c = true;
+        assnew.Product_Serial_No__c = 'N2656630:22K(KVWMX)';
+        
+        upsert assnew;
+        //鍙戣揣DN
+        Statu_Achievements_DN__c statuAchievementsDN = new Statu_Achievements_DN__c();
+        statuAchievementsDN.Statu_Achievements__c = Sac.Id;
+        statuAchievementsDN.Name = '2021082049';
+        statuAchievementsDN.endUser__c = recordType.Id;
+        upsert statuAchievementsDN;
+        //鍙戣揣DN鏄庣粏
+        Statu_Achievements_DN_details__c statuAchievementsDNDetails = new Statu_Achievements_DN_details__c();
+        statuAchievementsDNDetails.Statu_Achievements_DN__c = statuAchievementsDN.Id;
+        statuAchievementsDNDetails.Name = 'z1c200000292wse';
+        statuAchievementsDNDetails.asset__c = assnew.Id;
+        statuAchievementsDNDetails.SerialNoorLotNo_Raw__c = '22K'; // 鈥�
+        statuAchievementsDNDetails.TracingCode_Raw__c = 'KVWMX'; // 鈥�
+        upsert statuAchievementsDNDetails;
+      
+        // 绛炬敹鍗�
+        //鏂板缓鐢靛瓙绛炬敹鍗�
+        eSignForm__c eSignForm = new eSignForm__c();
+        eSignForm.Statu_Achievements__c = Sac.Id;
+        eSignForm.Statu_Achievements_DN__c = statuAchievementsDN.Id;
+        eSignForm.Name = '::娴嬭瘯鐢靛瓙绛炬敹鍗�';
+        eSignForm.DNName__c = '2021082049';
+        eSignForm.AccessoriesQualified__c = true;
+        eSignForm.handleOpinionAgency__c = '鍝囧搱鍝堝搱鍝堝搱鍝堝搱鍝�';
+        eSignForm.agencyScanDay__c = Date.today();
+        eSignForm.agencySignUpDate__c =Date.today();
+        eSignForm.agencyConfirmDate__c = Date.today();
+
+        insert eSignForm;
+
+        SetFrameNumManageWebService.insertFrameNumManag(statuAchievementsDN.Id,eSignForm.Id);// 鎻掑叆
+        SetFrameNumManageWebService.insertFrameNumManag(statuAchievementsDN.Id,eSignForm.Id);// 鏇存柊
+        // 瑙﹀彂鍣� DNDetailsHandler 娴嬭瘯绫�
+        update statuAchievementsDNDetails;
+        // delete statuAchievementsDNDetails;
+        List<Statu_Achievements_DN_details__c> temList =  [select Id from Statu_Achievements_DN_details__c where id = :statuAchievementsDNDetails.Id];
+        System.assertEquals(1, temList.size());
+        delete temList;
+        List<Statu_Achievements_DN_details__c> temList1 =  [select Id from Statu_Achievements_DN_details__c where id = :statuAchievementsDNDetails.Id];
+        System.assertEquals(0, temList1.size());
+
+    }
+    // 瑙﹀彂鍣� DNDetailsHandler 娴嬭瘯绫�
+    static testMethod void testMethod4() {
+        StaticParameter.EscapeNFM001AgencyContractTrigger = true;
+        StaticParameter.EscapeNFM001Trigger = true;
+        Oly_TriggerHandler.bypass(ContactTriggerHandler.class.getName());
+        Oly_TriggerHandler.bypass(AgencyHospitalHandler.class.getName());
+
+        Oly_TriggerHandler.bypass(ESignFormHandler.class.getName());
+
+        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;
+        }
+        //绛炬敹鍗曟渶缁堢敤鎴疯褰曠被鍨�
+        List < RecordType > recordTypeList = [select Id from RecordType where IsActive = true and SobjectType = 'Account'
+            and Name = '鎴︾暐绉戝鍒嗛 鍛煎惛绉�'
+        ];
+        if (recordTypeList.size() == 0) {
+            return;
+        }
+        // 鐪�
+        Address_Level__c al = new Address_Level__c();
+        al.Name = '鏉变含';
+        al.Level1_Code__c = 'CN-99';
+        al.Level1_Sys_No__c = '999999';
+        upsert al;
+        // 甯�
+        Address_Level2__c al2 = new Address_Level2__c();
+        al2.Level1_Code__c = 'CN-99';
+        al2.Level1_Sys_No__c = '999999';
+        al2.Level1_Name__c = '鏉变含';
+        al2.Name = '娓嬭胺鍖�';
+        al2.Level2_Code__c = 'CN-9999';
+        al2.Level2_Sys_No__c = '9999999';
+        al2.Address_Level__c = al.id;
+        upsert al2;
+        // 浜у搧
+        Product2 prd = new Product2();
+        prd.ProductCode_Ext__c = 'N2656630';
+        prd.ProductCode = 'N2656630';
+        prd.Name = 'N2656630';
+        prd.Manual_Entry__c = false;
+        upsert prd;
+        //瀹㈡埛鍖婚櫌
+        Account company = new Account();
+        company.RecordTypeId = rectCo[0].Id;
+        company.Name = 'NFM008TestCompany';
+        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 = 'NFM008TestDepart';
+        depart.ParentId = section.Id;
+        depart.Department_Class__c = section.Id;
+        depart.Hospital__c = company.Id;
+        upsert depart;
+        //绛炬敹鍗曟渶缁堢敤鎴疯褰曠被鍨�
+        Account recordType = new Account();
+        recordType.RecordTypeId = recordTypeList[0].Id;
+        recordType.Name = '*';
+        recordType.Department_Class_Label__c = '娑堝寲绉�';
+        recordType.ParentId = company.Id;
+        recordType.Hospital_Department_Class__c = company.Id;
+        upsert recordType;
+        RecordType rectOpp = [select id from RecordType where IsActive = true and SobjectType = 'Opportunity'
+            and DeveloperName = 'Opportunity'
+        ];
+        //璇环
+        Opportunity opp = new Opportunity(Name = 'testOpp1', StageName = '寮曞悎', CloseDate = Date.today(), AccountId = depart.Id, Sales_Root__c = '璨╁2搴�', Competitor__c = 'A', Click_Close_Date__c = null, RecordType = rectOpp);
+        upsert opp;
+        //娉ㄦ畫
+        Statu_Achievements__c Sac = new Statu_Achievements__c(name = 'zhucan_one', Opportunity__c = opp.id, DeliveryDate__c = Date.today(), ContractNO__c = 'ContractNO1', ContractAmount__c = 100);
+        insert Sac;
+        //淇濇湁璁惧
+        Asset assnew = new Asset(Asset_Owner__c = 'Olympus');
+        assnew.Backorder__c = Sac.Id;
+        // assnew.Order_number__c = Sac.Id;
+        assnew.RecordTypeId = System.Label.Asset_RecordType;
+        assnew.SerialNumber = '22K';
+        assnew.Name = 'NA-201SX-4021:涓�娆℃�т娇鐢ㄥ惛寮曟椿妫�閽�';
+        assnew.Product2Id = prd.Id;
+        assnew.Hospital__c = company.Id;
+        assnew.Department_Class__c = section.Id;
+        assnew.AccountId = depart.Id;
+        assnew.Asset_Owner__c = '鍖婚櫌璧勪骇';
+        assnew.Quantity = 1;
+        assnew.Status = '鏈夊簱瀛�';
+        assnew.Manage_type__c = '涓綋绠$悊';
+        assnew.Internal_asset_location__c = '鍖椾含 澶囧搧涓績';
+        assnew.Loaner_accsessary__c = true;
+        assnew.Delete_Flag__c = false;
+        assnew.Freeze_sign__c = false;
+        assnew.Out_of_wh__c = 0;
+        assnew.CIC_call_back_check__c = true;
+        assnew.Product_Serial_No__c = 'N2656630:22K(KVWMX)';
+        
+        upsert assnew;
+        
+        //鍙戣揣DN
+        Statu_Achievements_DN__c statuAchievementsDN = new Statu_Achievements_DN__c();
+        statuAchievementsDN.Statu_Achievements__c = Sac.Id;
+        statuAchievementsDN.Name = '2021082049';
+        statuAchievementsDN.endUser__c = recordType.Id;
+        upsert statuAchievementsDN;
+        // 绛炬敹鍗�
+        //鏂板缓鐢靛瓙绛炬敹鍗�
+        eSignForm__c eSignForm = new eSignForm__c();
+        eSignForm.Statu_Achievements__c = Sac.Id;
+        eSignForm.Statu_Achievements_DN__c = statuAchievementsDN.Id;
+        eSignForm.Name = '::娴嬭瘯鐢靛瓙绛炬敹鍗�';
+        eSignForm.DNName__c = '2021082049';
+        eSignForm.AccessoriesQualified__c = true;
+        eSignForm.handleOpinionAgency__c = '鍝囧搱鍝堝搱鍝堝搱鍝堝搱鍝�';
+        eSignForm.agencyScanDay__c = Date.today();
+        eSignForm.agencySignUpDate__c =Date.today();
+        eSignForm.agencyConfirmDate__c = Date.today();
+
+        insert eSignForm;
+
+        
+        //鍙戣揣DN鏄庣粏
+        Statu_Achievements_DN_details__c statuAchievementsDNDetails = new Statu_Achievements_DN_details__c();
+        statuAchievementsDNDetails.Statu_Achievements_DN__c = statuAchievementsDN.Id;
+        statuAchievementsDNDetails.Name = 'z1c200000292wse';
+        statuAchievementsDNDetails.asset__c = assnew.Id;
+        statuAchievementsDNDetails.SerialNoorLotNo_Raw__c = '22K'; // 鈥�
+        statuAchievementsDNDetails.TracingCode_Raw__c = 'KVWMX'; // 鈥�
+        upsert statuAchievementsDNDetails;
+    }
+        
+}
\ No newline at end of file
diff --git a/force-app/main/default/classes/FrameNumUploadControllerTest.cls-meta.xml b/force-app/main/default/classes/FrameNumUploadControllerTest.cls-meta.xml
new file mode 100644
index 0000000..db9bf8c
--- /dev/null
+++ b/force-app/main/default/classes/FrameNumUploadControllerTest.cls-meta.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ApexClass xmlns="http://soap.sforce.com/2006/04/metadata">
+    <apiVersion>48.0</apiVersion>
+    <status>Active</status>
+</ApexClass>
diff --git a/force-app/main/default/classes/SetFrameNumManageBatch.cls b/force-app/main/default/classes/SetFrameNumManageBatch.cls
index 4125e8a..5950b1e 100644
--- a/force-app/main/default/classes/SetFrameNumManageBatch.cls
+++ b/force-app/main/default/classes/SetFrameNumManageBatch.cls
@@ -2,27 +2,57 @@
      * [SetFrameNumManageBatch 杩涘彛鍗曡瘉涓婁紶鍚庢煡鎵惧瓧娈礲atch鏇存柊]
      * @Author   lijinhuan
      * @DateTime 2022-11-04T18:31:03+0800
-     * @return   []
+     * 娴嬭瘯绫伙細FrameNumUploadControllerTest
 */
-global  without sharing  class SetFrameNumManageBatch implements Database.Batchable<sObject> {
+global  without sharing  class SetFrameNumManageBatch implements Database.Batchable<sObject>, Database.Stateful{
     public String query;
+    public String Id;
+
+    //閭欢淇℃伅
+    List<String> emailMessages = new List<String>();
+
+    //鎶ラ敊鐨勮繘鍙e崟璇両d
+    String logStr = '杩涘彛鍗曡瘉 : ';
+    //鎶ラ敊淇℃伅
+    String errorStr = '';
+    //鎬讳欢鏁�
+    Integer totalCount = 0;
+    // 澶辫触浠舵暟
+    Integer failedCount = 0;
 
     global SetFrameNumManageBatch() {
         this.query = query;
     }
 
+    global SetFrameNumManageBatch(String Id) {
+        this.query = query;
+        this.Id = Id;
+    }
+
     global Database.QueryLocator start(Database.BatchableContext bc) {
-        query = 'select Id,SerialNumberS__c,InspectionCard__c,ApplyList__c  from FrameNumManage__c where ';
-        // query += '(';
-        query += ' signInForm__c = null  ';
-        query += ' OR Statu_Achievements_DN_details__c = null ';
-        query += ' OR Asset__c = null ';
-        query += ' OR (InspectionCard_Select__c = null AND InspectionCard__c != null AND InspectionCard__c !=\'涓嶅嚭璇乗')';
-        query += ' OR (InspectionCard_Select__c != null AND (InspectionCard__c =\'涓嶅嚭璇乗' OR InspectionCard__c = null))';// 娓呯┖
-        query += ' OR (ApplyList_Select__c = null AND ApplyList__c != null)';
-        query += ' OR (ApplyList_Select__c != null AND ApplyList__c = null)';// 娓呯┖
-        // query += ')';
-        // query += ' AND id = \'a5D9D0000000WqF\'';
+        query = 'select Id,ManagementCode__c,InspectionCard__c,InspectionCard_Select__c,ApplyList__c,ApplyList_Select__c,';
+        // query += 'Statu_Achievements_DN_details__c,signInForm__c,Asset__c,ManagementCode__c,IsChange__c ';
+        query += 'Asset__c,ScanDate__c,ScanDate_select__c,IsChange__c, DeliveryDate__c, DeliveryDate_select__c ';
+        // query += 'IsChange__c ';
+        query += ' from FrameNumManage__c where ';
+        if(String.isNotBlank(Id)){
+            query += ' id = :Id';
+        }else{
+            // query += ' signInForm__c = null  ';
+            // query += ' OR Statu_Achievements_DN_details__c = null ';
+             
+            // query += '((signInForm__c = null OR Statu_Achievements_DN_details__c = null) AND AssertRecordType__c != \'Shipment\') ';
+            // query += ' OR Asset__c = null ';
+            // 
+            query += ' Asset__c = null ';
+            query += ' OR (InspectionCard_Select__c = null AND InspectionCard__c != null AND InspectionCard__c !=\'涓嶈\')';
+            // query += ' (InspectionCard_Select__c = null AND InspectionCard__c != null AND InspectionCard__c != \'\' AND InspectionCard__c !=\'涓嶈\')';
+            query += ' OR (InspectionCard_Select__c != null AND (InspectionCard__c =\'涓嶈\' OR InspectionCard__c = null OR InspectionCard__c = \'\'))';// 娓呯┖
+            query += ' OR (ApplyList_Select__c = null AND ApplyList__c != null AND ApplyList__c != \'\')';
+            query += ' OR (ApplyList_Select__c != null AND (ApplyList__c = null OR ApplyList__c =\'\'))';// 娓呯┖
+            query += ' OR (ScanDate__c !=  null AND ScanDate_select__c = null)';
+            query += ' OR IsChange__c = true';
+        }
         return Database.getQueryLocator(query);
     }
 
@@ -31,48 +61,82 @@
         Map<String,String> ApplyListMap = new Map<String,String>();
         Map<String,Id> InspectionCardIdMap = new Map<String,Id>();
         Map<String,Id> ApplyListIdMap = new Map<String,Id>();
-        Set<String> SerialNumberSet = new Set<String>();
-        Set<Id> clearSet = new Set<Id>();
+        Set<String> TracingCodeSet = new Set<String>();
+        Set<String> TracingCodeAssetSet = new Set<String>();
+        Map<Id,String> clearMap = new Map<Id,String>();
+        Set<Date> ScanDateSet = new Set<Date>();
+        Map<Id,FrameNumManage__c> oldMap = new Map<Id,FrameNumManage__c>();
+        try{
         for(FrameNumManage__c fnm:fnmList){
             // 娓呯┖
-            if(String.isBlank(fnm.ApplyList__c) 
-                || String.isBlank(fnm.InspectionCard__c) 
-                ||(!String.isBlank(fnm.InspectionCard__c) && fnm.InspectionCard__c == '涓嶅嚭璇�')){
-                clearSet.add(fnm.Id);
-            }else{
-                //璧嬪��
-                SerialNumberSet.add(fnm.SerialNumberS__c);
-                InspectionCardMap.put(fnm.SerialNumberS__c,fnm.InspectionCard__c);
-                ApplyListMap.put(fnm.SerialNumberS__c,fnm.ApplyList__c);
+            // 0 all 1:ApplyList_Select__c 2:InspectionCard_Select__c 
+            if(
+                ((String.isBlank(fnm.ApplyList__c) ||(!String.isBlank(fnm.ApplyList__c) && fnm.ApplyList__c == '涓嶈')) &&!String.isBlank(fnm.ApplyList_Select__c))
+                && ((String.isBlank(fnm.InspectionCard__c) ||(!String.isBlank(fnm.InspectionCard__c) && fnm.InspectionCard__c == '涓嶈')) &&!String.isBlank(fnm.InspectionCard_Select__c))
+            ){
+                clearMap.put(fnm.Id,'0');
+            }else if((String.isBlank(fnm.ApplyList__c) ||(!String.isBlank(fnm.ApplyList__c) && fnm.ApplyList__c == '涓嶈')) &&!String.isBlank(fnm.ApplyList_Select__c)){
+                clearMap.put(fnm.Id,'1');
+            }else if((String.isBlank(fnm.InspectionCard__c) ||(!String.isBlank(fnm.InspectionCard__c) && fnm.InspectionCard__c == '涓嶈')) &&!String.isBlank(fnm.InspectionCard_Select__c)){
+                clearMap.put(fnm.Id,'2');
+            }                
+            //璧嬪��
+            // if(String.isBlank(fnm.signInForm__c) || String.isBlank(fnm.Statu_Achievements_DN_details__c)){
+            //     TracingCodeSet.add(fnm.ManagementCode__c); //绛炬敹鍗� 鍙戣揣DN鏄庣粏鐢�
+            // }
+            // System.debug('zheli03:'+String.isBlank(fnm.Asset__c));
+            if(String.isBlank(fnm.Asset__c)){
+                TracingCodeAssetSet.add(fnm.ManagementCode__c);// 淇濇湁璁惧鐢�
             }
             
+            // System.debug('zheli02:'+TracingCodeAssetSet);
+            InspectionCardMap.put(fnm.ManagementCode__c,fnm.InspectionCard__c);
+            ApplyListMap.put(fnm.ManagementCode__c,fnm.ApplyList__c);
+            if(fnm.ScanDate__c != null){
+                ScanDateSet.add(fnm.ScanDate__c);
+            }
+            oldMap.put(fnm.Id,fnm);
         }
         // 鍙戣揣DN鏄庣粏
-        Map<String,Id> DNdetailMap = new Map<String,Id>();
-        Map<String,String> DNMap  = new Map<String,String>();
-        for(Statu_Achievements_DN_details__c dn:[SELECT Id,SerialNumber__c,Statu_Achievements_DN__c,Statu_Achievements_DN__r.Name FROM Statu_Achievements_DN_details__c WHERE SerialNumber__c IN: SerialNumberSet]){
-            DNdetailMap.put(dn.SerialNumber__c,dn.Id);
-            DNMap.put(dn.SerialNumber__c,dn.Statu_Achievements_DN__r.Name);
-        }
-        // 绛炬敹鍗�
-        Map<String,Id> eSignFormMap = new Map<String,Id>();
-        for(eSignForm__c es:[SELECT Id,DNName__c FROM eSignForm__c WHERE DNName__c IN: DNMap.values()]){
-            for(String key:DNMap.keySet()){
-                if(DNMap.get(key) == es.DNName__c){
-                    eSignFormMap.put(key,es.Id);
-                }
-            } 
-        }
+        // Map<String,Id> DNdetailMap = new Map<String,Id>();
+        // Map<String,String> DNMap  = new Map<String,String>();
+        // Map<String,Id> AssetMap = new Map<String,Id>();
+        // for(Statu_Achievements_DN_details__c dn:[SELECT Id,TracingCode_Raw__c,Statu_Achievements_DN__c,Statu_Achievements_DN__r.Name,asset__c FROM Statu_Achievements_DN_details__c WHERE TracingCode_Raw__c IN: TracingCodeSet]){
+        //     DNdetailMap.put(dn.TracingCode_Raw__c,dn.Id);
+        //     AssetMap.put(dn.TracingCode_Raw__c,dn.asset__c);
+        //     DNMap.put(dn.TracingCode_Raw__c,dn.Statu_Achievements_DN__r.Name);
+        // }
+        // // 绛炬敹鍗�
+        // Map<String,Id> eSignFormMap = new Map<String,Id>();
+        // for(eSignForm__c es:[SELECT Id,DNName__c FROM eSignForm__c WHERE DNName__c IN: DNMap.values()]){
+        //     for(String key:DNMap.keySet()){
+        //         if(DNMap.get(key) == es.DNName__c){
+        //             eSignFormMap.put(key,es.Id);
+        //         }
+        //     } 
+        // }
+        // System.debug('zheli01:'+TracingCodeAssetSet);
         // 淇濇湁璁惧
         Map<String,Id> AssetMap = new Map<String,Id>();
-        for(Asset ass:[SELECT Id,SerialNumber FROM Asset WHERE SerialNumber IN: SerialNumberSet]){
-            AssetMap.put(ass.SerialNumber,ass.Id);
+        Map<String, Asset> AssetDatas = new Map<String, Asset>();
+        // 杩涘彛鍗曡瘉 澧炲姞鍙戣揣鏃ヨ缃� start
+        for(Asset ass:[SELECT Id,TracingCode__c,Posting_Date__c FROM Asset WHERE TracingCode__c IN: TracingCodeAssetSet]){
+            if(!AssetMap.containsKey(ass.TracingCode__c)){
+                AssetMap.put(ass.TracingCode__c,ass.Id);
+                AssetDatas.put(ass.TracingCode__c,ass);
+            }
+            if (ass.Posting_Date__c != null) {
+                ScanDateSet.add(ass.Posting_Date__c);
+            }
+            // AssetMap.put(ass.TracingCode__c,ass.Id);
         }
+        // 杩涘彛鍗曡瘉 澧炲姞鍙戣揣鏃ヨ缃� end
+        // System.debug('zheli00:'+AssetMap);
+        // 鍟嗘璇�   InspectionCard_Select__c 鎶ュ叧鍗�   ApplyList_Select__c
         Set<String> FilesNameSet = new Set<String>();
         FilesNameSet.addAll(InspectionCardMap.values());
         FilesNameSet.addAll(ApplyListMap.values());
-        // 鍟嗘璇�   InspectionCard_Select__c 鎶ュ叧鍗�   ApplyList_Select__c
-        for(FileAddress__c fa:[SELECT Id,OnlyFileName__c FROM FileAddress__c WHERE OnlyFileName__c IN: FilesNameSet]){
+        for(FileAddress__c fa:[SELECT Id,OnlyFileName__c FROM FileAddress__c WHERE ParentRecordId__c = 'FrameNumManage' AND OnlyFileName__c IN: FilesNameSet]){
             for(String key:InspectionCardMap.keySet()){
                 if(InspectionCardMap.get(key) == fa.OnlyFileName__c){
                     InspectionCardIdMap.put(key,fa.Id);
@@ -82,31 +146,135 @@
                 }
             }
         }
+        // 鎵弿鏃ユ湡
+        Map<Date,Id> ScanDateMap = new Map<Date,Id>();
+        for(OlympusCalendar__c oc:[SELECT Id,Date__c FROM OlympusCalendar__c WHERE Date__c IN: ScanDateSet]){
+            ScanDateMap.put(oc.Date__c,oc.Id);
+        }
         // 鏈�鍚庢暣鍚�
         List<FrameNumManage__c> upFnmList = new List<FrameNumManage__c>();
         for(FrameNumManage__c fnm:fnmList){
             FrameNumManage__c temp = new FrameNumManage__c();
             temp.Id = fnm.Id;
-            if(clearSet.contains(fnm.Id)){
-                temp.InspectionCard_Select__c = null;
-                temp.ApplyList_Select__c = null;
-            }else{
-                temp.Statu_Achievements_DN_details__c = DNdetailMap.get(fnm.SerialNumberS__c);
-                temp.signInForm__c  = eSignFormMap.get(fnm.SerialNumberS__c);
-                temp.Asset__c = AssetMap.get(fnm.SerialNumberS__c);
-                temp.InspectionCard_Select__c = InspectionCardIdMap.get(fnm.SerialNumberS__c);
-                temp.ApplyList_Select__c = ApplyListIdMap.get(fnm.SerialNumberS__c);
+            // if(DNdetailMap.size() > 0 && DNdetailMap.containsKey(fnm.ManagementCode__c)){
+            //     temp.Statu_Achievements_DN_details__c = DNdetailMap.get(fnm.ManagementCode__c);
+            // }
+            // if(eSignFormMap.size() > 0 && eSignFormMap.containsKey(fnm.ManagementCode__c)){
+            //     temp.signInForm__c  = eSignFormMap.get(fnm.ManagementCode__c);
+            // }
+            if(AssetMap.size() > 0 && AssetMap.containsKey(fnm.ManagementCode__c)){
+                temp.Asset__c = AssetMap.get(fnm.ManagementCode__c);
+                // 杩涘彛鍗曡瘉 澧炲姞鍙戣揣鏃ヨ缃� start
+                if(String.isNotBlank(temp.Asset__c) && AssetDatas.get(fnm.ManagementCode__c) != null && AssetDatas.get(fnm.ManagementCode__c).Posting_Date__c != null){
+                    temp.DeliveryDate__c = AssetDatas.get(fnm.ManagementCode__c).Posting_Date__c;
+                    temp.DeliveryDate_select__c = ScanDateMap.get(AssetDatas.get(fnm.ManagementCode__c).Posting_Date__c);
+                }
+                // 杩涘彛鍗曡瘉 澧炲姞鍙戣揣鏃ヨ缃� end
             }
-            upFnmList.add(temp);
+            if(ScanDateMap.size() > 0 && ScanDateMap.containsKey(fnm.ScanDate__c)){
+                temp.ScanDate_Select__c = ScanDateMap.get(fnm.ScanDate__c);
+            }
+            if(clearMap.containsKey(fnm.Id)){
+                if(clearMap.get(fnm.Id) == '0'){
+                    temp.ApplyList_Select__c = null;
+                    temp.InspectionCard_Select__c = null;
+                }else if(clearMap.get(fnm.Id) == '1'){
+                    temp.ApplyList_Select__c = null;
+                }else if(clearMap.get(fnm.Id) == '2'){
+                    temp.InspectionCard_Select__c = null;
+                }
+            }else{
+                temp.InspectionCard_Select__c = InspectionCardIdMap.get(fnm.ManagementCode__c);
+                temp.ApplyList_Select__c = ApplyListIdMap.get(fnm.ManagementCode__c);
+            }
+            temp.IsChange__c = false;
+            // 鏈夊彉鍖栨墠鏇存柊
+            // if(!(temp.Statu_Achievements_DN_details__c == oldMap.get(temp.Id).Statu_Achievements_DN_details__c 
+            // && temp.signInForm__c == oldMap.get(temp.Id).signInForm__c 
+            // && temp.Asset__c == oldMap.get(temp.Id).Asset__c
+            // && temp.ApplyList_Select__c == oldMap.get(temp.Id).ApplyList_Select__c
+            // && temp.InspectionCard_Select__c == oldMap.get(temp.Id).InspectionCard_Select__c
+            // && temp.IsChange__c == oldMap.get(temp.Id).IsChange__c
+            // )){
+            // if(!(temp.ApplyList_Select__c == oldMap.get(temp.Id).ApplyList_Select__c
+            // && temp.InspectionCard_Select__c == oldMap.get(temp.Id).InspectionCard_Select__c
+            // && temp.IsChange__c == oldMap.get(temp.Id).IsChange__c
+            // )){
+            if(!(temp.ApplyList_Select__c == oldMap.get(temp.Id).ApplyList_Select__c
+            && temp.InspectionCard_Select__c == oldMap.get(temp.Id).InspectionCard_Select__c
+            && temp.IsChange__c == oldMap.get(temp.Id).IsChange__c
+            && temp.Asset__c == oldMap.get(temp.Id).Asset__c
+            && temp.ScanDate_Select__c == oldMap.get(temp.Id).ScanDate_Select__c
+            )){
+                // System.debug('zheli99');
+                upFnmList.add(temp);
+            }            
         }
         // System.debug('zhelieupFnmList:'+upFnmList.size());
         if(upFnmList.size() > 0){
-            update upFnmList;
+            // update upFnmList;
+            List<Database.SaveResult> saveResults = Database.update(upFnmList,false);
+            //鎬绘暟
+            totalCount += saveResults.size();
+            for(Integer i = 0;i<saveResults.size();i++) {
+                if(!saveResults.get(i).isSuccess() ){
+                    logStr += upFnmList.get(i).id +' ,';
+                    errorStr += '澶辫触杩涘彛鍗曡瘉 :'+upFnmList.get(i).id+'  澶辫触鍘熷洜:'+ String.ValueOf(saveResults.get(i).getErrors()[0]).split(';')[2].split('=')[1] 
+                    +' : '+String.ValueOf(saveResults.get(i).getErrors()[0]).split(';')[1].split('=')[1] + '\r\n';
+                    failedCount++ ;
+                }
+            }
+        }
+        
+        }catch(Exception ex){
+            errorStr += 'Batch鎵ц杩囩▼涓嚭鐜伴敊璇�: ' + ex.getStackTraceString();
         }
         
     }
 
     global void finish(Database.BatchableContext BC) {
+        BatchIF_Log__c IfLog = new BatchIF_Log__c();
+        IfLog.Type__c = 'SetFrameNumManageBatchErrorLog';
 
+        if (logStr.length() > 60000) {
+            logStr = logStr.substring(0, 60000);
+        }
+        IfLog.Log__c = logStr;
+        IfLog.Log__c += '\n end';
+        if (errorStr.length() > 60000) {
+            IfLog.ErrorLog__c = errorStr.substring(0, 60000);
+        } else {
+            IfLog.ErrorLog__c = errorStr.substring(0, errorStr.length());
+        }
+
+        insert IfLog;
+
+        emailMessages.add('澶辫触鏃ュ織ID涓猴細' + IfLog.Id + '\r\n澶辫触淇℃伅:\r\n'+errorStr);
+
+        //鍙戦�侀偖浠�
+        sendFieldEmail();
+    }
+    // 鍙戦�佹彁閱掗偖浠�
+    private void sendFieldEmail() {
+        PretechBatchEmailUtil be = new PretechBatchEmailUtil();
+        String[] toList = new String[] {UserInfo.getUserEmail()};
+        String title = '杩涘彛鍗曡瘉鏁版嵁鍏宠仈鏇存柊澶辫触';
+        String[] ccList = new String[]{};
+        String ccEmail = System.Label.EmailAlert;
+        if(ccEmail.length() > 0){
+            for(String email : ccEmail.split(',')){
+                ccList.add(email);
+            }
+        }
+        if (System.Test.isRunningTest()) {
+            be.successMail('', 1);
+        }
+        if (emailMessages.size() > 0 && failedCount > 0) {
+            be.failedMail(toList, ccList, title, this.emailMessages.get(0)+'\n',
+                            totalCount, totalCount - failedCount, failedCount,'',false);
+            if(!Test.isRunningTest()){
+                be.send();
+            }
+        }      
     }
 }
\ No newline at end of file

--
Gitblit v1.9.1