buli
2023-07-11 80a3f59e2d3df07805bc67e329300b8de90a5b3a
force-app/main/default/classes/AssetHandler.cls
@@ -1,19 +1,23 @@
public without sharing class AssetHandler extends Oly_TriggerHandler {
    public static Map<String , List<Rental_Apply_Equipment_Set_Detail__c>> queueRaesdMap;
    public static Map<String, List<Rental_Apply_Equipment_Set_Detail__c>> queueRaesdMap;
    private Map<Id, Asset> newMap;
    private Map<Id, Asset> oldMap;
    private List<Asset> newList;
    private List<Asset> oldList;
    @TestVisible private static Set<String> testTargetDepts;
    @TestVisible private static Id Account_Asset_Id;
     public static Boolean disabled = false;
    private static final Map<String, Schema.RecordTypeInfo> DEVELOPERNAMEMAP = Schema.SObjectType.Asset.getRecordTypeInfosByDeveloperName(); // 20230306 ljh add
    @TestVisible
    private static Set<String> testTargetDepts;
    @TestVisible
    private static Id Account_Asset_Id;
    public static Boolean disabled = false;
    public AssetHandler() {
        this.newMap = (Map<Id, Asset>) Trigger.newMap;
        this.oldMap = (Map<Id, Asset>) Trigger.oldMap;
        this.newList = (List<Asset>) Trigger.new;
        this.oldList = (List<Asset>) Trigger.old;
        Integer i = 0;
    }
    protected override void beforeInsert() {
@@ -23,21 +27,28 @@
        //第一次不加变更的时候不知道第一次是多少
        updateChangeQuantityReason();
        workflowCode();
    }
    protected override void beforeUpdate() {
        if(!disabled){
        if (!disabled) {
            beforeSetValue();
            //动态更新 Asset的 AccountId的 Logic
            beforeSetAccountId();
            updateChangeQuantityReason();
            // 20230309 gzw 优化 注释代码
            // 虚拟维修保修合同保修开始结束日期更新
            updateMaintenance_Contract_Asset();
            // updateMaintenance_Contract_Asset();
            // 20230309 gzw 优化 注释代码
            updateRentalCount();
            workflowCode();
        }
    }
    protected override void afterInsert() {
@@ -46,7 +57,7 @@
    }
    protected override void afterUpdate() {
        if(!disabled){
        if (!disabled) {
            mainAssetUpdateed_OneToOneRecord();
            // 已经改进 Must_Input_ChangeQuantityReason 的 valida before可以完成 ChangeQuantityReason__c = ''
            ////入力規則によってbeforeクリアできません,
@@ -63,19 +74,453 @@
            updateMaintenance_Contract_Asset();
        }
    }
    //20230309 sx 保有设备workflow代码化 start
    private void workflowCode() {
        /*List<Id> accIds = new List<Id>();
        List<Id> productIds = new List<Id>();
        List<Id> hospitalIds = new List<Id>();
        for(Asset nObj : newList) {
            accIds.add(nObj.Account.Id);
            productIds.add(nObj.Product2.Id);
            hospitalIds.add(nObj.Hospital__c);
        }
        //查找客户List
        Map<Id, Account> accMap = new Map<Id, Account>([SELECT Id, Name, Management_Code__c from Account where Id in :accIds]);
        Map<Id, Product2> productMap = new Map<Id, Product2>([SELECT Id, Name, RecordTypeId, RecordType.Name, Serial_Lot_No__c ,ProductCode  from Product2 where Id in :productIds]);
        Map<Id, Account> hosMap = new Map<Id, Account>([SELECT Id, Name, RecordType.Name  from Account where id in :hospitalIds]);
        Map<Id, Account> acc_assMap = new Map<Id, Account>();
        Map<Id, Product2> pro_proMap = new Map<Id, Product2>();
        Map<Id, Account> hos_assMap = new Map<Id, Account>();
        for(Asset nObj : newList){
            if(accMap.containsKey(nObj.Account.Id)) {
                acc_assMap.put(nObj.Id, accMap.get(nObj.Account.Id));
            }
            if(productMap.containsKey(nObj.Product2.Id)) {
                pro_proMap.put(nObj.Id, productMap.get(nObj.Product2.Id));
            }
            if(hosMap.containsKey(nObj.Hospital__c)) {
                hos_assMap.put(nObj.Id, hosMap.get(nObj.Id));
            }
        }*/
        Date today = Date.today();
        for (Asset nObj : newList) {
            //保有设备HPID文本化
            nObj.Asset_Year_Txt__c = nObj.Asset_Year__c;
            nObj.HP_ID_Text__c = nObj.HP_Id__c;
            nObj.Gurantee_End_day1__c = nObj.Gurantee_End_day__c;
            //覆盖设备的可选对象文本化
            if (Trigger.isInsert || (Trigger.isUpdate && nObj.Posting_Date__c != oldMap.get(nObj.Id).Posting_Date__c)) {
                if (String.isBlank(nObj.IF_Coverage_Target_Asset__c) || '0'.equals(nObj.IF_Coverage_Target_Asset__c)) {
                    nObj.IF_Coverage_Target_Asset__c = nObj.IF_Coverage_Target_Asset_FF__c + '';
                }
                if (nObj.IF_Coverage_Target_Asset_FF__c == 3 && nObj.FY23_Asset_Age__c == null) {
                    nObj.FY23_Asset_Age__c = 0;
                }
            }
            //市场对应录入时间自动录入
            if (
                (Trigger.isInsert && nObj.Market_Product_Category__c != null) ||
                (Trigger.isUpdate &&
                nObj.Market_Product_Category__c != oldMap.get(nObj.Id).Market_Product_Category__c &&
                nObj.Market_Product_Category__c != null)
            ) {
                nObj.Marketing_Input_Date__c = today;
            }
            /*//待报废变更为使用中
            if(nObj.RecordType.Name == '备品'
                && nObj.Manage_type__c == '个体管理'
                && nObj.Quantity > 0 && nObj.Status == '待报废'
                && ( (nObj.Abandoned_RealThing__c == null && nObj.Abandoned_Inventory__c == null) || (nObj.Abandoned_RealThing__c + nObj.Abandoned_Inventory__c) == 0)
                && acc_assMap.get(nObj.Id).Management_Code__c != System.Label.Account_Asset_FJZ) {
                nObj.Status = '使用中';
                nObj.Tobe_Discarded_Date__c = null;
            }*/
            /*//AssetMarkUpdate
            if(Trigger.isUpdate && nObj.IF_Information_From__c == false && nObj.AssetMark__c == null) {
                if(pro_proMap.containsKey(nObj.Id)){
                    if(pro_proMap.get(nObj.Id).RecordType.Name == '竞品-主机' ) {
                        nObj.AssetMark__c = '竞品主机';
                    }else if(pro_proMap.get(nObj.Id).RecordType.Name == '竞品-耗材') {
                        nObj.AssetMark__c = '竞品耗材';
                    }else if(pro_proMap.get(nObj.Id).Serial_Lot_No__c == 'S/N tracing') {
                        nObj.AssetMark__c = '主机';
                    }
                }
                else {
                    nObj.AssetMark__c = '耗材';
                }
            }*/
            /*//AssetName=ProductName
            if(nObj.Name.equals('*') || (nObj.Product2.Id != null && nObj.Product2 != oldMap.get(nObj.Id).Product2)) {
                nObj.Name = pro_proMap.get(nObj.Id).Name;
            }*/
            //AssetTextCopy
            if (Trigger.isInsert || (Trigger.isUpdate && nObj.Product2 != oldMap.get(nObj.Id).Product2)) {
                nObj.BSSCategory_Text__c = nObj.BSSCategory__c;
                nObj.Brand_Name_Text__c = nObj.Brand_Name__c;
                nObj.Category2_Text__c = nObj.Category2__c;
                nObj.Category3_Text__c = nObj.Category3__c;
                nObj.Category4_Text__c = nObj.Category4__c;
                nObj.Category5_Text__c = nObj.Category5__c;
            }
            //CIC安装状态确认日
            if (nObj.CIC_call_back_check__c && nObj.CIC_call_back_confirm_day__c == null) {
                nObj.CIC_call_back_confirm_day__c = today;
            }
            //Equipment_Last_confirmed_day
            if (
                (Trigger.isInsert &&
                (nObj.Status != null ||
                nObj.Installation_Site__c != null ||
                nObj.Final_Examination_Date__c != null ||
                nObj.Hospital_Manage_Number__c != null)) ||
                (Trigger.isUpdate &&
                (nObj.Status != oldMap.get(nObj.Id).Status ||
                nObj.Installation_Site__c != oldMap.get(nObj.Id).Installation_Site__c ||
                nObj.Final_Examination_Date__c != oldMap.get(nObj.Id).Final_Examination_Date__c ||
                nObj.Hospital_Manage_Number__c != oldMap.get(nObj.Id).Hospital_Manage_Number__c))
            ) {
                nObj.Equipment_Last_checking_day__c = today;
            }
            /*//Product_Code+Serial_No
            if(Trigger.isUpdate && nObj.IsCompetitorProduct == false && nObj.Manage_type__c != '数量管理' && nObj.AssetMark__c != '耗材' && nObj.Loaner_accsessary__c != true && nObj.unknow_serial_NO_product__c != false) {
                if(nObj.Product2.Id == null) {
                    nObj.Product_Serial_No__c = nObj.Id;
                }else {
                    nObj.Product_Serial_No__c = pro_proMap.get(nObj.Id).ProductCode + ' ' + nObj.SerialNumber;
                    if(nObj.Delete_Flag__c){
                        nObj.Product_Serial_No__c += ':' + acc_assMap.get(nObj.Id).Management_Code__c;
                    }
                }
            }*/
            //Product_Code+Serial_No Clear
            if (
                (Trigger.isInsert && nObj.IsCompetitorProduct) ||
                (Trigger.isUpdate &&
                nObj.IsCompetitorProduct &&
                !oldMap.get(nObj.Id).IsCompetitorProduct)
            ) {
                nObj.Product_Serial_No__c = '';
            }
            /*//Product_Code+Serial_No+Salesdepartment
            if(Trigger.isUpdate && nObj.IsCompetitorProduct == false && nObj.Manage_type__c == '数量管理' && nObj.AssetMark__c == '耗材' && nObj.Loaner_accsessary__c == true && nObj.unknow_serial_NO_product__c == false) {
                if(nObj.Product2.Id == null) {
                    nObj.Product_Serial_No__c = nObj.Id;
                }else {
                    nObj.Product_Serial_No__c = pro_proMap.get(nObj.Id).ProductCode + ' ' + nObj.SerialNumber + ':' + nObj.Salesdepartment__c.subString(0,nObj.Salesdepartment__c.indexOf(':'));
                    if(nObj.Delete_Flag__c){
                        nObj.Product_Serial_No__c += ':' + acc_assMap.get(nObj.Id).Management_Code__c;
                    }
                }
            }*/
            /*//Product_Code+Serial_No UnkownSerial
            if(Trigger.isUpdate && nObj.unknow_serial_NO_product__c == true) {
                nObj.SerialNumber = nObj.serial_past__c;
                if(nObj.Product2.Id == null) {
                    nObj.Product_Serial_No__c = nObj.Id;
                }else {
                    nObj.Product_Serial_No__c = pro_proMap.get(nObj.Id).ProductCode + ':' + nObj.serial_past__c;
                    if(nObj.Delete_Flag__c){
                        nObj.Product_Serial_No__c += ':' + acc_assMap.get(nObj.Id).Management_Code__c;
                    }
                }
            }*/
            //更新备品资产管理负责本部选项
            if (
                (Trigger.isInsert && nObj.Internal_demo_incharge_demo__c != null) ||
                (Trigger.isUpdate && nObj.Internal_demo_incharge_demo__c != oldMap.get(nObj.Id).Internal_demo_incharge_demo__c)
            ) {
                nObj.Internal_demo_incharge_demo_text__c = nObj.Internal_demo_incharge_demo__c;
            }
            /*//自动更新资产所属(医院资产)
            if(Trigger.isUpdate && nObj.RecordType.Name == '医院保有设备' && hos_assMap.containskey(nObj.Id) && hos_assMap.get(nObj.Id).RecordType.Name == '病院' && acc_assMap.get(nObj.Id).Id == '00110000015Bx0h' ) {
                nObj.Asset_Owner__c = '医院资产';
            }*/
            /*//自动更新资产所属(奥林巴斯)
            if(nObj.RecordType.Name == '医院保有设备' || (acc_assMap.containskey(nObj.Id) && acc_assMap.get(nObj.Id).Id == '00110000015Bx0h')) {
                nObj.Asset_Owner__c = '奥林巴斯';
            }*/
            /*//自动更新资产所属(经销商资产)
            if(nObj.RecordType.Name == '医院保有设备' && (acc_assMap.containskey(nObj.Id) && hos_assMap.get(nObj.Id).RecordType.Name == '販売店')) {
                nObj.Asset_Owner__c = '经销商资产';
            }*/
            //手动创建的耗材信息修改
            if (nObj.RecordTypeId == '01210000000kOPM' && nObj.Information_From__c == '手动输入' && nObj.AssetMark__c == '耗材') {
                nObj.Guarantee_period_for_products__c = nObj.Posting_Date__c;
                nObj.InstallDate = nObj.Posting_Date__c;
            }
            //出货日自动赋值
            if (Trigger.isInsert && nObj.Information_From__c == '手动输入') {
                nObj.Posting_Date__c = Date.newInstance(1900, 1, 1);
            }
            //新逻辑保修期限对应
            if (nObj.New_logic_data__c) {
                nObj.Guarantee_period_for_products__c = nObj.Guarantee_period_formula__c;
            }
            //成本中心更新编码Update
            if (
                (Trigger.isInsert && nObj.Internal_cost_center_cd__c != null) ||
                (Trigger.isUpdate && nObj.Internal_cost_center_cd__c != oldMap.get(nObj.Id).Internal_cost_center_cd__c)
            ) {
                nObj.Internal_demo_incharge_demo_text__c = nObj.Internal_cost_center_formula__c;
            }
            //成本中心更新选项Update
            if (
                (Trigger.isInsert && nObj.Internal_cost_center__c != null) ||
                (Trigger.isUpdate && nObj.Internal_cost_center__c != oldMap.get(nObj.Id).Internal_cost_center__c)
            ) {
                nObj.Internal_cost_center_text__c = nObj.Internal_cost_center__c;
            }
            //待报废日登录
            if (
                Trigger.isUpdate &&
                nObj.Fixture_Status__c != oldMap.get(nObj.Id).Fixture_Status__c &&
                nObj.Fixture_Status__c != '废弃' &&
                (nObj.Abandoned_RealThing__c > 0 ||
                nObj.Abandoned_Inventory__c > 0) &&
                nObj.Manage_type__c == '个体管理'
            ) {
                nObj.Status = '待报废';
                nObj.Tobe_Discarded_Date__c = today;
            }
            //退货转备品DEL置FALSE
            if (
                Trigger.isUpdate &&
                ((nObj.RecordType != oldMap.get(nObj.Id).RecordType && nObj.RecordTypeId == '01210000000kOPR') ||
                (nObj.AccountId != oldMap.get(nObj.Id).AccountId &&
                nObj.AccountId == '0011000000VAiwz')) &&
                nObj.Delete_Flag__c
            ) {
                nObj.Delete_Flag__c = false;
            }
            //追溯设备耗材Mark更新
            if ('追溯系统'.equals(nObj.Information_From__c) && String.isBlank(nObj.AssetMark__c)) {
                nObj.AssetMark__c = '耗材';
            }
            //納入商品状態変更(使用中)
            if (
                (Trigger.isInsert && nObj.Status == '使用中') ||
                (Trigger.isUpdate &&
                nObj.Status != oldMap.get(nObj.Id).Status &&
                nObj.Status == '使用中')
            ) {
                nObj.Status_Busy_Date__c = today;
            }
            //納入商品状態変更(廃棄)
            if (
                (Trigger.isInsert && nObj.Status == '廃棄') ||
                (Trigger.isUpdate &&
                nObj.Status != oldMap.get(nObj.Id).Status &&
                nObj.Status == '廃棄')
            ) {
                nObj.Discarded_Date__c = today;
                nObj.Quantity = 0;
                nObj.Abandoned_Inventory__c = null;
                nObj.Abandoned_RealThing__c = null;
                nObj.ChangeQuantityReason__c = '废弃';
            }
            //納入商品状態変更(不明)
            if (
                (Trigger.isInsert && nObj.Status == '不明') ||
                (Trigger.isUpdate &&
                nObj.Status != oldMap.get(nObj.Id).Status &&
                nObj.Status == '不明')
            ) {
                nObj.Indistinctness_Date__c = today;
            }
            //納入商品状態変更(未使用)
            if (
                (Trigger.isInsert && nObj.Status == '未使用') ||
                (Trigger.isUpdate &&
                nObj.Status != oldMap.get(nObj.Id).Status &&
                nObj.Status == '未使用')
            ) {
                nObj.Unused_Date__c = today;
            }
            /*//納品確認書の診療科コード_セット
            if(!(nObj.Product2.Id != null && nObj.IsCompetitorProduct == false && nObj.InstallDate != null) && nObj.Install_Account_Code__c == null) {
                nObj.Install_Account_Code__c = acc_assMap.get(nObj.Id).Management_Code__c;
                nObj.Install_Account_Name__c = acc_assMap.get(nObj.Id).Name;
                nObj.Install_Hospital_Name__c = hos_assMap.get(nObj.Id).Name;
                nObj.Install_Hospital_code__c = hos_assMap.get(nObj.Id).Management_Code__c;
            }*/
            //病院管理番号変更日
            if (
                (Trigger.isInsert && nObj.Hospital_Manage_Number__c != null) ||
                (Trigger.isUpdate && nObj.Hospital_Manage_Number__c != oldMap.get(nObj.Id).Hospital_Manage_Number__c)
            ) {
                nObj.Hospital_Manage_Number_Change_Date__c = today;
            }
            //更新-2次前点检日
            if (Trigger.isUpdate && nObj.Final_Examination_Date__c != oldMap.get(nObj.Id).Final_Examination_Date__c) {
                nObj.X2_second_past_inspection__c = oldMap.get(nObj.Id).Final_Examination_Date__c;
            }
            // 文本化 多年保修期至
            nObj.Extend_Gurantee_DateTo_Text__c = nObj.Extend_Gurantee_DateTo__c;
            // 保修天数工作流
            if (
                Trigger.isInsert ||
                (Trigger.isUpdate &&
                (nObj.Guarantee_period_for_products__c != oldMap.get(nObj.Id).Guarantee_period_for_products__c ||
                nObj.InstallDate__c != oldMap.get(nObj.Id).InstallDate__c ||
                nObj.ChangeWarrantyStartDate__c != oldMap.get(nObj.Id).ChangeWarrantyStartDate__c))
            ) {
                nObj.GuaranteePeriod__c = nObj.guarantee_period__c;
            }
            // 有安装日,更新状态到[使用中]
            if (
                (Trigger.isInsert && nObj.InstallDate != null) ||
                (Trigger.isUpdate &&
                nObj.InstallDate != null &&
                nObj.InstallDate != oldMap.get(nObj.Id).InstallDate)
            ) {
                nObj.Status_Busy_Date__c = today;
                nObj.Status = '使用中';
            }
            // 备品再退货转DEL置TRUE
            if (nObj.AccountId == '00110000015Bx0h' && nObj.RecordTypeId == '01210000000kOPM' && !nObj.Delete_Flag__c) {
                nObj.Delete_Flag__c = true;
            }
            // 设定备品所属公司(上海)FromVBA
            if (
                (Trigger.isInsert && nObj.CompanyCodeOfEquipment_txt__c == '5112') ||
                (Trigger.isUpdate &&
                nObj.CompanyCodeOfEquipment_txt__c != oldMap.get(nObj.Id).CompanyCodeOfEquipment_txt__c &&
                nObj.CompanyCodeOfEquipment_txt__c == '5112')
            ) {
                nObj.CompanyOfEquipment__c = '上海';
            }
            // 设定备品所属公司(沈阳)FromVBA
            if (
                (Trigger.isInsert && nObj.CompanyCodeOfEquipment_txt__c == '5114') ||
                (Trigger.isUpdate &&
                nObj.CompanyCodeOfEquipment_txt__c != oldMap.get(nObj.Id).CompanyCodeOfEquipment_txt__c &&
                nObj.CompanyCodeOfEquipment_txt__c == '5114')
            ) {
                nObj.CompanyOfEquipment__c = '沈阳';
            }
            // 设定备品所属公司(北京)FromVBA
            if (
                (Trigger.isInsert && nObj.CompanyCodeOfEquipment_txt__c == '5111') ||
                (Trigger.isUpdate &&
                nObj.CompanyCodeOfEquipment_txt__c != oldMap.get(nObj.Id).CompanyCodeOfEquipment_txt__c &&
                nObj.CompanyCodeOfEquipment_txt__c == '5111')
            ) {
                nObj.CompanyOfEquipment__c = '北京';
            }
            // 设定备品所属公司(广州)FromVBA
            if (
                (Trigger.isInsert && nObj.CompanyCodeOfEquipment_txt__c == '5113') ||
                (Trigger.isUpdate &&
                nObj.CompanyCodeOfEquipment_txt__c != oldMap.get(nObj.Id).CompanyCodeOfEquipment_txt__c &&
                nObj.CompanyCodeOfEquipment_txt__c == '5113')
            ) {
                nObj.CompanyOfEquipment__c = '广州';
            }
        }
    }
    //20230309 sx 保有设备workflow代码化 end
    // 借出明细更新借出_分配_数(Sys)和已借出数(Sys)
    private void updateRentalCount() {
        Set<Id> idSet = new Set<Id>();
        for(Id assId : this.newMap.keySet()) {
            if(this.newMap.get(assId).AssetManageConfirm__c &&
                this.newMap.get(assId).Account_Management_Code__c != System.Label.Account_Asset_FJZ ) {
        for (Id assId : this.newMap.keySet()) {
            if (
                this.newMap.get(assId).AssetManageConfirm__c &&
                this.newMap.get(assId).Account_Management_Code__c != System.Label.Account_Asset_FJZ
            ) {
                idSet.add(assId);
                this.newMap.get(assId).Out_of_wh_Sys__c = 0;
                this.newMap.get(assId).Rental_Count_Sys__c = 0;
            }
        }
        if(!idSet.isEmpty()) {
            for (Rental_Apply_Equipment_Set_Detail__c raesd : [
        if (!idSet.isEmpty()) {
            // 备品性能优化改修 20230312 by lc Start
            List<AggregateResult> raesdTempList2 = [
                SELECT COUNT(Id) num, Asset__c
                FROM Rental_Apply_Equipment_Set_Detail__c
                //备品发货报错对应 20230413 by lc Start
                //WHERE Detail_Finish__c = false
                WHERE
                    Detail_Not_Finish_Text__c = TRUE
                    //备品发货报错对应 20230413 by lc End
                    AND Asset__c IN :idSet
                    AND Shippment_loaner_time2__c != NULL
                GROUP BY Asset__c
            ];
            if (raesdTempList2 != null && raesdTempList2.size() > 0) {
                for (AggregateResult ar : raesdTempList2) {
                    String assetId = String.valueOf(ar.get('Asset__c'));
                    Integer tempNum = Integer.valueOf(ar.get('num'));
                    this.newMap.get(assetId).Rental_Count_Sys__c += tempNum;
                }
            }
            List<AggregateResult> raesdTempList1 = [
                SELECT COUNT(Id) num, Asset__c
                FROM Rental_Apply_Equipment_Set_Detail__c
                //备品发货报错对应 20230413 by lc Start
                //WHERE Detail_Finish__c = false
                WHERE
                    Detail_Not_Finish_Text__c = TRUE
                    //备品发货报错对应 20230413 by lc End
                    AND Asset__c IN :idSet
                GROUP BY Asset__c
            ];
            if (raesdTempList1 != null && raesdTempList1.size() > 0) {
                for (AggregateResult ar : raesdTempList1) {
                    String assetId = String.valueOf(ar.get('Asset__c'));
                    Integer tempNum = Integer.valueOf(ar.get('num'));
                    this.newMap.get(assetId).Out_of_wh_Sys__c += tempNum;
                    idSet.remove(assetId);
                }
            }
            /*for (Rental_Apply_Equipment_Set_Detail__c raesd : [
                SELECT Id, Shippment_loaner_time2__c, Asset__c
                FROM Rental_Apply_Equipment_Set_Detail__c
                WHERE Detail_Finish__c = false
@@ -86,52 +531,63 @@
                    this.newMap.get(raesd.Asset__c).Rental_Count_Sys__c += 1;
                }
                idSet.remove(raesd.Asset__c);
            }
            if(!idSet.isEmpty()) {
            }*/
            // 备品性能优化改修 20230312 by lc End
            if (!idSet.isEmpty()) {
                // 没有字段可以完全准确地区分备品设备与耗材设备,只好把备品里没出现过的设备当成耗材来查
                for (Consum_Apply_Equipment_Set_Detail__c caesd : [
                 SELECT Id, Shippment_loaner_time2__c, Asset__c
                  FROM Consum_Apply_Equipment_Set_Detail__c
                    WHERE Detail_Finish__c = false
                    AND Asset__c IN :idSet
                    SELECT Id, Shippment_loaner_time2__c, Asset__c
                    FROM Consum_Apply_Equipment_Set_Detail__c
                    WHERE Detail_Finish__c = FALSE AND Asset__c IN :idSet
                ]) {
                    this.newMap.get(caesd.Asset__c).Out_of_wh_Sys__c += 1;
                    if(caesd.Shippment_loaner_time2__c != null) {
                    if (caesd.Shippment_loaner_time2__c != null) {
                        this.newMap.get(caesd.Asset__c).Rental_Count_Sys__c += 1;
                    }
                }
            }
        }
    }
    //多年保修 start
    private void updateMaintenance_Contract_Asset(){
    private void updateMaintenance_Contract_Asset() {
        StaticParameter.EscapeMaintenanceContractAfterUpdateTrigger = true;
        Set<id> AssetIDSet = new Set<id>();
        for(Asset tempAsset : newList){
            if(String.isNotBlank(tempAsset.warrantyType__c)){
        for (Asset tempAsset : newList) {
            // 20230306 ljh update start
            Id Shipment = DEVELOPERNAMEMAP.get('Shipment').getRecordTypeId();
            // if(String.isNotBlank(tempAsset.warrantyType__c)){
            if (String.isNotBlank(tempAsset.warrantyType__c) && Shipment != tempAsset.RecordTypeId) {
                // 20230306 ljh update end
                AssetIDSet.add(tempAsset.id);
            }
        }
        if(AssetIDSet.size() > 0 ){
            list<Maintenance_Contract_Asset__c> MCAList =
            [select id,startDateGurantee__c,
             startDateGurantee_Text__c,endDateGurantee__c,
             endDateGurantee_Text__c,Return_Flag__c,ChangeAcc_flag__c,
             Maintenance_Price_Amount__c,Maintenance_Price_Amount_text__c,
             GuaranteePrice_Amount__c,GuaranteePrice_Amount_text__c
             from Maintenance_Contract_Asset__c
             where Asset__c in : AssetIDSet
             and Maintenance_Contract__r.RecordType.DeveloperName = 'VM_Contract'
             ];
            if(MCAList.size() > 0){
                list<Maintenance_Contract_Asset__c> UpdateMcaList =
                new list<Maintenance_Contract_Asset__c> ();
                for(Maintenance_Contract_Asset__c tempMCA : MCAList ){
                    if(tempMCA.startDateGurantee__c != tempMCA.startDateGurantee_Text__c
                    || tempMCA.endDateGurantee__c != tempMCA.endDateGurantee_Text__c
                    || tempMCA.Maintenance_Price_Amount__c != tempMCA.Maintenance_Price_Amount_Text__c
                    || tempMCA.GuaranteePrice_Amount__c != tempMCA.GuaranteePrice_Amount_text__c){
        if (AssetIDSet.size() > 0) {
            list<Maintenance_Contract_Asset__c> MCAList = [
                SELECT
                    id,
                    startDateGurantee__c,
                    startDateGurantee_Text__c,
                    endDateGurantee__c,
                    endDateGurantee_Text__c,
                    Return_Flag__c,
                    ChangeAcc_flag__c,
                    Maintenance_Price_Amount__c,
                    Maintenance_Price_Amount_text__c,
                    GuaranteePrice_Amount__c,
                    GuaranteePrice_Amount_text__c
                FROM Maintenance_Contract_Asset__c
                WHERE Asset__c IN :AssetIDSet AND Maintenance_Contract__r.RecordType.DeveloperName = 'VM_Contract'
            ];
            if (MCAList.size() > 0) {
                list<Maintenance_Contract_Asset__c> UpdateMcaList = new List<Maintenance_Contract_Asset__c>();
                for (Maintenance_Contract_Asset__c tempMCA : MCAList) {
                    if (
                        tempMCA.startDateGurantee__c != tempMCA.startDateGurantee_Text__c ||
                        tempMCA.endDateGurantee__c != tempMCA.endDateGurantee_Text__c ||
                        tempMCA.Maintenance_Price_Amount__c != tempMCA.Maintenance_Price_Amount_Text__c ||
                        tempMCA.GuaranteePrice_Amount__c != tempMCA.GuaranteePrice_Amount_text__c
                    ) {
                        UpdateMcaList.add(tempMCA);
                    }
                }
@@ -152,21 +608,23 @@
            if (Trigger.isInsert) {
                nObj.Last_Reserve_RAES_Detail__c = null;
                nObj.Last_Reserve_TAES_Detail__c = null;
                nObj.Pre_Reserve_RAES_Detail__c  = null;
                nObj.Pre_Reserve_TAES_Detail__c  = null;
                nObj.Fixture_OneToOne_Link__c    = null;
                nObj.Pre_Reserve_RAES_Detail__c = null;
                nObj.Pre_Reserve_TAES_Detail__c = null;
                nObj.Fixture_OneToOne_Link__c = null;
            }
            if (Trigger.isUpdate) {
                Asset oObj = oldMap.get(nObj.Id);
                if (oObj.Last_Reserve_RAES_Detail__c != null && nObj.Last_Reserve_RAES_Detail__c == null
                        && oObj.Last_Reserve_RAES_Detail_Flag__c == true) {
                if (
                    oObj.Last_Reserve_RAES_Detail__c != null &&
                    nObj.Last_Reserve_RAES_Detail__c == null &&
                    oObj.Last_Reserve_RAES_Detail_Flag__c == true
                ) {
                    nObj.Pre_Reserve_RAES_Detail__c = oObj.Last_Reserve_RAES_Detail__c;
                }
                if (oObj.Last_Reserve_TAES_Detail__c != null && nObj.Last_Reserve_TAES_Detail__c == null
                        // TODO 由于__r超20,字段建不出来
                        // && oObj.Last_Reserve_TAES_Detail_Flag__c == true
                ) {
                if (oObj.Last_Reserve_TAES_Detail__c != null && nObj.Last_Reserve_TAES_Detail__c == null) {
                    // TODO 由于__r超20,字段建不出来
                    // && oObj.Last_Reserve_TAES_Detail_Flag__c == true
                    nObj.Pre_Reserve_TAES_Detail__c = oObj.Last_Reserve_TAES_Detail__c;
                }
            }
@@ -174,17 +632,22 @@
            // 必ず最後で置く
            nObj.Fixture_Status2_text__c = nObj.Fixture_Status2__c;
            nObj.Fixture_Status3_text__c = nObj.Fixture_Status3__c;
            nObj.BTreeIndexKey__c = nObj.Asset_Owner__c
                                    + ':' + nObj.Asset_loaner_category__c
                                    + ':' + String.valueOf(nobj.Freeze_sign_Abandoned_Flag__c)
                                    + ':' + String.valueOf(nObj.Delete_Flag__c)
                                    + ':' + String.valueOf(nObj.AssetManageConfirm__c);
            nObj.BTreeIndexKey__c =
                nObj.Asset_Owner__c +
                ':' +
                nObj.Asset_loaner_category__c +
                ':' +
                String.valueOf(nobj.Freeze_sign_Abandoned_Flag__c) +
                ':' +
                String.valueOf(nObj.Delete_Flag__c) +
                ':' +
                String.valueOf(nObj.AssetManageConfirm__c);
            if (nObj.Status == FixtureUtil.assetStatusMap.get(FixtureUtil.AssetStatus.Dai_Fei_Qi.ordinal())) {
                nObj.Freeze_sign__c = false;
            }
            // gzw CHAN-CCR6MW  【委托】【保有设备】保有设备发货日逻辑 start
            if(Trigger.isInsert && nObj.Posting_Date__c == null){
            if (Trigger.isInsert && nObj.Posting_Date__c == null) {
                nObj.Posting_Date__c = Date.newInstance(1900, 1, 1);
            }
            // gzw CHAN-CCR6MW  【委托】【保有设备】保有设备发货日逻辑 end
@@ -206,8 +669,10 @@
            String nAbandoned_Inventory = nObj.Abandoned_Inventory__c == null ? '' : String.valueOf(nObj.Abandoned_Inventory__c);
            if ((oQuantity != nQuantity && String.isNotBlank(nObj.ChangeQuantityReason__c)) || Trigger.isInsert) {
                String rs = nObj.ChangeQuantityReason__c;
                nObj.ChangeQuantityHistory__c = String.format(System.Label.ChangeQuantityHistory,
                         new String[]{oQuantity, nQuantity, rs});
                nObj.ChangeQuantityHistory__c = String.format(
                    System.Label.ChangeQuantityHistory,
                    new List<String>{ oQuantity, nQuantity, rs }
                );
                // before里面入立规则过不了改到
                // 已经改进 Must_Input_ChangeQuantityReason 的 valida before可以完成 ChangeQuantityReason__c = ''
                // nObj.ChangeQuantityReason__c = '';
@@ -215,25 +680,26 @@
            if (oAbandoned_Inventory != nAbandoned_Inventory || Trigger.isInsert) {
                String rs = nObj.Giveup_Return__c;
                nObj.ChangeAbandoned_InventoryHistory__c = String.format(System.Label.ChangeAbandoned_InventoryHistory,
                         new String[]{oAbandoned_Inventory, nAbandoned_Inventory, rs});
                nObj.ChangeAbandoned_InventoryHistory__c = String.format(
                    System.Label.ChangeAbandoned_InventoryHistory,
                    new List<String>{ oAbandoned_Inventory, nAbandoned_Inventory, rs }
                );
            }
        }
    }
    //// かならず afterUpdate
    private void cleanChangeQuantityReason() {
       // TODO 更新自己table 原则需要Static的Class变量(因为会有复数的Method去更新自己的)
       List<Asset> assList = new List<Asset>();
       for (Asset nObj : newList) {
           if (String.isBlank(nObj.ChangeQuantityReason__c) == false) {
               assList.add(new Asset(Id = nObj.Id,
                       ChangeQuantityReason__c = ''));
           }
       }
       if (!assList.isEmpty()) {
           update assList;
       }
        // TODO 更新自己table 原则需要Static的Class变量(因为会有复数的Method去更新自己的)
        List<Asset> assList = new List<Asset>();
        for (Asset nObj : newList) {
            if (String.isBlank(nObj.ChangeQuantityReason__c) == false) {
                assList.add(new Asset(Id = nObj.Id, ChangeQuantityReason__c = ''));
            }
        }
        if (!assList.isEmpty()) {
            update assList;
        }
    }
    // afterUpdate
@@ -242,9 +708,7 @@
        List<Asset> assList = new List<Asset>();
        for (Asset nObj : newList) {
            if (String.isBlank(nObj.Giveup_Return__c) == false) {
                assList.add(new Asset(
                        Id = nObj.Id,
                        Giveup_Return__c = ''));
                assList.add(new Asset(Id = nObj.Id, Giveup_Return__c = ''));
            }
        }
        if (!assList.isEmpty()) {
@@ -273,8 +737,13 @@
        }
        if (!aSetIdSet.isEmpty()) {
            List<Fixture_OneToOne_Link__c> oneToOneList = [
                    SELECT Id FROM Fixture_OneToOne_Link__c WHERE Main_Asset__c IN :aSetIdSet];
            if (!oneToOneList.isEmpty()) { update oneToOneList; }
                SELECT Id
                FROM Fixture_OneToOne_Link__c
                WHERE Main_Asset__c IN :aSetIdSet
            ];
            if (!oneToOneList.isEmpty()) {
                update oneToOneList;
            }
        }
    }
@@ -291,7 +760,7 @@
    // かならず after
    private void queueRedistribution() {
        if (queueRaesdMap == null) {
            queueRaesdMap = new Map<String , List<Rental_Apply_Equipment_Set_Detail__c>>();
            queueRaesdMap = new Map<String, List<Rental_Apply_Equipment_Set_Detail__c>>();
        }
        Map<String, Set<Id>> modelNoAssetIdMap = new Map<String, Set<Id>>();
        Set<Id> raesdIdSet = new Set<Id>();
@@ -299,12 +768,13 @@
        String whkey = '';
        for (Asset nObj : newList) {
            //ToDo現在排队できるのは主体だけなので,今後个体管理の附属品も排队できるの場合があったらこのIFぶんを直す必要があります
            if (!(nObj.Loaner_accsessary__c == false
                    && nObj.Asset_Owner__c == 'Olympus'
                    && nObj.Equipment_Type__c != '检测用备品'
                    && nObj.Delete_Flag__c == False
                    && nObj.You_Xiao_Ku_Cun__c > 0
                    && nObj.Freeze_sign_Abandoned_Flag__c == False)
            if (
                !(nObj.Loaner_accsessary__c == false &&
                nObj.Asset_Owner__c == 'Olympus' &&
                nObj.Equipment_Type__c != '检测用备品' &&
                nObj.Delete_Flag__c == false &&
                nObj.You_Xiao_Ku_Cun__c > 0 &&
                nObj.Freeze_sign_Abandoned_Flag__c == false)
            ) {
                continue;
            }
@@ -325,7 +795,6 @@
                key += nObj.Product_category__c;
            }
            System.debug(LoggingLevel.INFO, '*** key: ' + key);
            //有新的Asset的时候 暂定分配
            // You_Xiao_Ku_Cun__c > 0 在上面已经做了判断
@@ -349,22 +818,27 @@
            // You_Xiao_Ku_Cun__c > 0 在上面已经做了判断
            else {
                Asset oObj = oldMap.get(nObj.Id);
                if (nObj.Loaner_accsessary__c == false && String.isBlank(nObj.Last_Reserve_RAES_Detail__c)
                        && (nObj.Last_Reserve_RAES_Detail__c != oObj.Last_Reserve_RAES_Detail__c
                            || (nObj.Asset_Owner__c != oObj.Asset_Owner__c && nObj.Asset_Owner__c == 'Olympus')
                            //备品存放地 OLY_OCM-722 恢复存放地的条件
                            || (nObj.Internal_asset_location__c != oObj.Internal_asset_location__c)
                            //备品分类并且不是 检测用备品
                            || (nObj.Equipment_Type__c != oObj.Equipment_Type__c && nObj.Equipment_Type__c != '检测用备品')
                            //销售本部
                            || (nObj.Salesdepartment__c != oObj.Salesdepartment__c)
                            //产品分类(GI/SP)
                            || (nObj.Product_category__c != oObj.Product_category__c)
                            //备品配套明细型号
                            || (nObj.Fixture_Model_No_F__c != oObj.Fixture_Model_No_F__c)
                            || (nObj.Delete_Flag__c != oObj.Delete_Flag__c && nObj.Delete_Flag__c == true)
                            || (nObj.Freeze_sign_Abandoned_Flag__c != oObj.Freeze_sign_Abandoned_Flag__c && nObj.Freeze_sign_Abandoned_Flag__c == false)
                        )
                if (
                    nObj.Loaner_accsessary__c == false &&
                    String.isBlank(nObj.Last_Reserve_RAES_Detail__c) &&
                    (nObj.Last_Reserve_RAES_Detail__c != oObj.Last_Reserve_RAES_Detail__c ||
                    (nObj.Asset_Owner__c != oObj.Asset_Owner__c &&
                    nObj.Asset_Owner__c == 'Olympus') ||
                    //备品存放地 OLY_OCM-722 恢复存放地的条件
                    (nObj.Internal_asset_location__c != oObj.Internal_asset_location__c) ||
                    //备品分类并且不是 检测用备品
                    (nObj.Equipment_Type__c != oObj.Equipment_Type__c &&
                    nObj.Equipment_Type__c != '检测用备品') ||
                    //销售本部
                    (nObj.Salesdepartment__c != oObj.Salesdepartment__c) ||
                    //产品分类(GI/SP)
                    (nObj.Product_category__c != oObj.Product_category__c) ||
                    //备品配套明细型号
                    (nObj.Fixture_Model_No_F__c != oObj.Fixture_Model_No_F__c) ||
                    (nObj.Delete_Flag__c != oObj.Delete_Flag__c &&
                    nObj.Delete_Flag__c == true) ||
                    (nObj.Freeze_sign_Abandoned_Flag__c != oObj.Freeze_sign_Abandoned_Flag__c &&
                    nObj.Freeze_sign_Abandoned_Flag__c == false))
                ) {
                    if (String.isBlank(nObj.Fixture_Model_No_F__c) == false) {
                        if (modelNoAssetIdMap.containsKey(key) == false) {
@@ -386,34 +860,45 @@
        List<String> keyList = new List<String>();
        keyList.addAll(modelNoAssetIdMap.keySet());
        System.debug(LoggingLevel.INFO, '*** keyList: ' + keyList);
       List<Rental_Apply_Sequence__c> targetSequence = [SELECT Id,Apply_Set_Detail__c,
                                                                Apply_Set_Detail_ExternalKey__c,
                                                                Demo_Purpose2__c, Equipment_Type__c, ExternalKey__c,
                                                                Fixture_Model_No__c,
                                                                Internal_asset_location__c, Invalid_Flag__c,
                                                                Product_category__c,
                                                                Rental_Apply__c,Series_No__c,
                                                                Series_Unequal_Queue_Flag__c, Salesdepartment__c
                                                        FROM Rental_Apply_Sequence__c
                                                        WHERE Series_No__c > 0 AND Invalid_Flag__c =false
                                                        AND Apply_Set_Detail__c NOT IN:raesdIdSet
                                                        AND ExternalKey__c IN:keyList
                                                        AND Apply_Set_Detail__r.Cancel_Select__c = false
                                                        ORDER BY Series_No__c ];
        List<Rental_Apply_Sequence__c> targetSequence = [
            SELECT
                Id,
                Apply_Set_Detail__c,
                Apply_Set_Detail_ExternalKey__c,
                Demo_Purpose2__c,
                Equipment_Type__c,
                ExternalKey__c,
                Fixture_Model_No__c,
                Internal_asset_location__c,
                Invalid_Flag__c,
                Product_category__c,
                Rental_Apply__c,
                Series_No__c,
                Series_Unequal_Queue_Flag__c,
                Salesdepartment__c
            FROM Rental_Apply_Sequence__c
            WHERE
                Series_No__c > 0
                AND Invalid_Flag__c = FALSE
                AND Apply_Set_Detail__c NOT IN :raesdIdSet
                AND ExternalKey__c IN :keyList
                AND Apply_Set_Detail__r.Cancel_Select__c = FALSE
            ORDER BY Series_No__c
        ];
        System.debug(LoggingLevel.INFO, '*** targetSequence: ' + targetSequence);
        Map<String,List<Rental_Apply_Sequence__c>> sequenceMap = new Map<String,List<Rental_Apply_Sequence__c>>();
        for(Rental_Apply_Sequence__c sequeuece:targetSequence){
            if(!sequenceMap.containsKey(sequeuece.Externalkey__c)){
                sequenceMap.put(sequeuece.Externalkey__c,new List<Rental_Apply_Sequence__c>());
        Map<String, List<Rental_Apply_Sequence__c>> sequenceMap = new Map<String, List<Rental_Apply_Sequence__c>>();
        for (Rental_Apply_Sequence__c sequeuece : targetSequence) {
            if (!sequenceMap.containsKey(sequeuece.Externalkey__c)) {
                sequenceMap.put(sequeuece.Externalkey__c, new List<Rental_Apply_Sequence__c>());
            }
            sequenceMap.get(sequeuece.Externalkey__c).add(sequeuece);
        }
        Map<String,Rental_Apply_Equipment_Set_Detail__c> updateMap = new Map<String,Rental_Apply_Equipment_Set_Detail__c>();
        for(String key:sequenceMap.keySet()){
            for(Rental_Apply_Sequence__c sequeuece:sequenceMap.get(key)){
                if(!updateMap.containsKey(sequeuece.Apply_Set_Detail__c)){
        Map<String, Rental_Apply_Equipment_Set_Detail__c> updateMap = new Map<String, Rental_Apply_Equipment_Set_Detail__c>();
        for (String key : sequenceMap.keySet()) {
            for (Rental_Apply_Sequence__c sequeuece : sequenceMap.get(key)) {
                if (!updateMap.containsKey(sequeuece.Apply_Set_Detail__c)) {
                    System.debug(LoggingLevel.INFO, '*** modelNoAssetIdMap: ' + JSON.serialize(modelNoAssetIdMap));
                    if(modelNoAssetIdMap.containsKey(key)){
                    if (modelNoAssetIdMap.containsKey(key)) {
                        List<Id> assIdList = new List<Id>();
                        assIdList.addAll(modelNoAssetIdMap.get(key));
                        String assIdbk = assIdList.get(0);
@@ -421,9 +906,8 @@
                        raesd.Id = sequeuece.Apply_Set_Detail__c;
                        raesd.Asset__c = assIdbk;
                        System.debug('raesd.Asset__c' + raesd.Asset__c);
                        raesd.Queue_Number__c = 0;      // 暂定分配
                        updateMap.put(raesd.Id,raesd);
                        raesd.Queue_Number__c = 0; // 暂定分配
                        updateMap.put(raesd.Id, raesd);
                        modelNoAssetIdMap.get(key).remove(assIdbk);
                        if (modelNoAssetIdMap.get(key).isEmpty()) {
@@ -432,15 +916,13 @@
                        System.debug(LoggingLevel.INFO, '*** modelNoAssetIdMap: ' + JSON.serialize(modelNoAssetIdMap));
                    }
                }
            }
        }
        System.debug(LoggingLevel.INFO, '*** updateMap.values(): ' + JSON.serialize(updateMap.values()));
        update updateMap.values();
            // Fixture_Model_No_F__c を見ることができない、データがおおいので。
            // Fixture_Set_Detail__r.Fixture_Model_No_F__c をみるか Fixture_Model_No_text__c をみるか
        // Fixture_Model_No_F__c を見ることができない、データがおおいので。
        // Fixture_Set_Detail__r.Fixture_Model_No_F__c をみるか Fixture_Model_No_text__c をみるか
        //     whkey += ' (';
        //     whkey += '   ((Fixture_Set_Detail__c != null and Fixture_Set_Detail__r.Product2__r.Fixture_Model_No_T__c =\'' + String.escapeSingleQuotes(nObj.Fixture_Model_No_F__c) + '\')';
        //     whkey += '      OR Fixture_Model_No_text__c =\'' + String.escapeSingleQuotes(nObj.Fixture_Model_No_F__c) + '\'';
@@ -467,13 +949,9 @@
        //     whkey += wher + ' ) OR';
        // }
        // if (String.isNotBlank(whkey)) {
        //     whkey = '( ' + whkey.removeEnd('OR') + ')';
        // }
        // String soql = 'SELECT Fixture_Model_No_F__c, Substitute_flag__c, Asset__c,'
        //             + ' Queue_Number__c, Fixture_Model_No_text__c, Salesdepartment_before__c,'
@@ -572,15 +1050,17 @@
    private void checkOneToOneLink() {
        Set<Id> otoIds = new Set<Id>(); // 待删除link的Id
        Set<Id> assetIds = new Set<Id>();
        Set<String> centers = new Set<String> {'北京 备品中心', '上海 备品中心', '广州 备品中心'};
        Set<String> centers = new Set<String>{ '北京 备品中心', '上海 备品中心', '广州 备品中心' };
        for (Asset nObj : newList) {
            //待废弃,废弃,和数量0的备品需要断开一对一link (目前只处理个体管理的)
            if ((nObj.Fixture_Status__c == FixtureUtil.assetFixtureStatusMap.get(FixtureUtil.AssetFixtureStatus.Fei_Qi.ordinal())
                || nObj.Fixture_Status__c == FixtureUtil.assetFixtureStatusMap.get(FixtureUtil.AssetFixtureStatus.Dai_Fei_Qi.ordinal())
                || nObj.Quantity == 0) && nObj.Manage_type__c == FixtureUtil.managetypeMap.get(FixtureUtil.Managetype.Ge_Ti_Guan_Li)){
            if (
                (nObj.Fixture_Status__c == FixtureUtil.assetFixtureStatusMap.get(FixtureUtil.AssetFixtureStatus.Fei_Qi.ordinal()) ||
                nObj.Fixture_Status__c == FixtureUtil.assetFixtureStatusMap.get(FixtureUtil.AssetFixtureStatus.Dai_Fei_Qi.ordinal()) ||
                nObj.Quantity == 0) && nObj.Manage_type__c == FixtureUtil.managetypeMap.get(FixtureUtil.Managetype.Ge_Ti_Guan_Li)
            ) {
                //是一对一主体或者是一对一个体附属品
                if (nObj.Main_OneToOne__c == true || nObj.Fixture_OneToOne_Link__c <> null) {
                    if(centers.contains(nObj.Internal_asset_location__c)) {
                    if (centers.contains(nObj.Internal_asset_location__c)) {
                        assetIds.add(nObj.Id);
                    }
                }
@@ -588,13 +1068,14 @@
        }
        if (assetIds.size() > 0) {
            Map<Id, Fixture_OneToOne_Link__c> linkMap = new Map<Id, Fixture_OneToOne_Link__c>([
                SELECT Id
                  FROM Fixture_OneToOne_Link__c
                 WHERE Main_Asset__c in :assetIds
                    OR Accessory_Asset__c IN: assetIds
            ]);
            if(!linkMap.isEmpty()){
            Map<Id, Fixture_OneToOne_Link__c> linkMap = new Map<Id, Fixture_OneToOne_Link__c>(
                [
                    SELECT Id
                    FROM Fixture_OneToOne_Link__c
                    WHERE Main_Asset__c IN :assetIds OR Accessory_Asset__c IN :assetIds
                ]
            );
            if (!linkMap.isEmpty()) {
                delete linkMap.values();
            }
        }
@@ -612,8 +1093,15 @@
     *    - 没有找的话, 不更新AccountId, 自动做 Account, Group, ApexShare
     */
    private void beforeSetAccountId() {
        Set<String> targetDepts = new Set<String> {'1.华北营业本部','2.东北营业本部','3.西北营业本部','4.华东营业本部','5.华南营业本部','6.西南营业本部'};
        Set<String> targetCenters = new Set<String> {'北京 备品中心', '上海 备品中心', '广州 备品中心'};
        Set<String> targetDepts = new Set<String>{
            '1.华北营业本部',
            '2.东北营业本部',
            '3.西北营业本部',
            '4.华东营业本部',
            '5.华南营业本部',
            '6.西南营业本部'
        };
        Set<String> targetCenters = new Set<String>{ '北京 备品中心', '上海 备品中心', '广州 备品中心' };
        if (Test.isRunningTest() && testTargetDepts != null) {
            targetDepts = testTargetDepts;
        }
@@ -627,39 +1115,42 @@
            Asset oObj = (null == this.oldMap) ? null : this.oldMap.get(nObj.Id);
            // 作成, 确认字段有没有变化
            if (Trigger.isInsert
                || (oObj != null
                    && (oObj.RecordTypeId != nObj.RecordTypeId
                        || oObj.Asset_loaner_category__c != nObj.Asset_loaner_category__c
                        || oObj.AssetManageConfirm__c != nObj.AssetManageConfirm__c
                        || oObj.Internal_asset_location__c != nObj.Internal_asset_location__c
                        || oObj.Salesdepartment__c != nObj.Salesdepartment__c
                        || oObj.OlympusAccShareName__c != nObj.OlympusAccShareName__c
                    )
                    && (targetCenters.contains(nObj.Internal_asset_location__c)
                        || targetProvs.containsKey(nObj.Internal_asset_location__c)
                    )
                    && !nObj.TransferToOther__c
                )
            if (
                Trigger.isInsert ||
                (oObj != null &&
                (oObj.RecordTypeId != nObj.RecordTypeId ||
                oObj.Asset_loaner_category__c != nObj.Asset_loaner_category__c ||
                oObj.AssetManageConfirm__c != nObj.AssetManageConfirm__c ||
                oObj.Internal_asset_location__c != nObj.Internal_asset_location__c ||
                oObj.Salesdepartment__c != nObj.Salesdepartment__c ||
                oObj.OlympusAccShareName__c != nObj.OlympusAccShareName__c) &&
                (targetCenters.contains(nObj.Internal_asset_location__c) || targetProvs.containsKey(nObj.Internal_asset_location__c)) &&
                !nObj.TransferToOther__c)
            ) {
                // 是不是备品的确认
                if (System.Label.Asset_RecordType == nObj.RecordTypeId
                    && true == nObj.AssetManageConfirm__c
                    && nObj.Asset_loaner_category__c != '耗材'
                if (
                    System.Label.Asset_RecordType == nObj.RecordTypeId &&
                    true == nObj.AssetManageConfirm__c &&
                    nObj.Asset_loaner_category__c != '耗材'
                ) {
                    // 办事处备品 → 动态设定 Asset.AccountId 的対象
                    if (targetProvs.containsKey(nObj.Internal_asset_location__c)
                        && targetDepts.contains(nObj.Salesdepartment__c)
                    ) {
                        String accShareName = '备品共享_'
                                + targetProvs.get(nObj.Internal_asset_location__c) + '_' + nObj.Salesdepartment__c.right(6);
                    if (targetProvs.containsKey(nObj.Internal_asset_location__c) && targetDepts.contains(nObj.Salesdepartment__c)) {
                        String accShareName =
                            '备品共享_' +
                            targetProvs.get(nObj.Internal_asset_location__c) +
                            '_' +
                            nObj.Salesdepartment__c.right(6);
                        nObj.OlympusAccShareName__c = accShareName;
                        assetAccShareNameMap.put(nObj, accShareName);
                    }
                    else {
                    } else {
                        if (AssetHandler.Account_Asset_Id == null) {
                            // Static 只会执行一遍
                            AssetHandler.Account_Asset_Id = [SELECT Id FROM Account WHERE AgentCode_Ext__c =: System.Label.Account_Asset].Id;
                            AssetHandler.Account_Asset_Id = [
                                SELECT Id
                                FROM Account
                                WHERE AgentCode_Ext__c = :System.Label.Account_Asset
                            ]
                            .Id;
                        }
                        nObj.OlympusAccShareName__c = '';
                        nObj.AccountId = AssetHandler.Account_Asset_Id;
@@ -675,11 +1166,11 @@
        Set<String> insertAccShareNameSet = new Set<String>();
        if (assetAccShareNameMap.size() > 0) {
            Map<String, Id> accShareId = new Map<String, Id>();
            for (Account accShare : [SELECT Id
                        , Department_Name__c
                     FROM Account
                    WHERE RecordTypeId =: System.Label.Department_OTH
                      AND Department_Name__c IN: assetAccShareNameMap.values()]) {
            for (Account accShare : [
                SELECT Id, Department_Name__c
                FROM Account
                WHERE RecordTypeId = :System.Label.Department_OTH AND Department_Name__c IN :assetAccShareNameMap.values()
            ]) {
                accShareId.put(accShare.Department_Name__c, accShare.Id);
            }
@@ -690,15 +1181,14 @@
                if (accShareId.containsKey(accShareName)) {
                    // 找到 Account 设定 AccountId, "Olympus社内 其他 备品" => "Olympus社内 其他 备品共享_XXX"
                    nObj.AccountId = accShareId.get(accShareName);
                }
                else {
                } else {
                    // 找不到 AccountId, 新建 Account, Group, ApexShare
                    insertAccShareNameSet.add(accShareName);
                }
            }
        }
        if (insertAccShareNameSet.size() > 0) {
            // AssetHandler.futureInsertAccShare(JSON.serialize(insertAccShareNameSet), execNow);
            // AssetHandler.futureInsertAccShare(JSON.serialize(insertAccShareNameSet), execNow);
            System.enqueueJob(new MyQueueableClass(JSON.serialize(insertAccShareNameSet), execNow));
        }
    }
@@ -709,24 +1199,29 @@
     */
    private static void insertAccShare(String insertAccShareNameJson, Datetime execNow) {
        Set<String> insertAccShareNameSet = (Set<String>) JSON.deserialize(insertAccShareNameJson, Set<String>.class);
        if (insertAccShareNameSet.isEmpty()) { return; }
        if (insertAccShareNameSet.isEmpty()) {
            return;
        }
        //  Olympus社内 其他
        List<Account> olympusAccount_OtherDC;
        try {
            olympusAccount_OtherDC = [SELECT Id, ParentId
                     FROM Account
                    WHERE Parent.AgentCode_Ext__c = '9999999' AND Department_Class_Name__c = '其他'
                      FOR Update];
            olympusAccount_OtherDC = [
                SELECT Id, ParentId
                FROM Account
                WHERE Parent.AgentCode_Ext__c = '9999999' AND Department_Class_Name__c = '其他'
                FOR UPDATE
            ];
        } catch (Exception e) {
            System.enqueueJob(new MyQueueableClass(insertAccShareNameJson, execNow));
            return;
        }
        List<Account> isInsertedList = [SELECT Id, Department_Name__c
                 FROM Account
                WHERE ParentId =: olympusAccount_OtherDC[0].Id
                  AND Department_Name__c IN: insertAccShareNameSet];
        List<Account> isInsertedList = [
            SELECT Id, Department_Name__c
            FROM Account
            WHERE ParentId = :olympusAccount_OtherDC[0].Id AND Department_Name__c IN :insertAccShareNameSet
        ];
        if (isInsertedList.size() > 0) {
            Map<String, Account> insertedAccount = new Map<String, Account>();
            for (Account insertedAcc : isInsertedList) {
@@ -737,27 +1232,31 @@
            AssetHandler.updateAssetAccount(insertedAccount, execNow);
        }
        if (insertAccShareNameSet.size() > 0) {
            Map<String, Account> insertAccount = new Map<String, Account>();
            for (String accShareName : insertAccShareNameSet) {
                insertAccount.put(accShareName, new Account(
                    Name = '*',
                    Hospital__c = olympusAccount_OtherDC[0].ParentId,
                    ParentId = olympusAccount_OtherDC[0].Id,
                    Department_Class__c = olympusAccount_OtherDC[0].Id,
                    Other_dept_category__c = '其他科室',
                    Department_Name__c = accShareName,
                    OwnerId = System.Label.Batch_User_Id,
                    RecordTypeId = System.Label.Department_OTH
                ));
                insertAccount.put(
                    accShareName,
                    new Account(
                        Name = '*',
                        Hospital__c = olympusAccount_OtherDC[0].ParentId,
                        ParentId = olympusAccount_OtherDC[0].Id,
                        Department_Class__c = olympusAccount_OtherDC[0].Id,
                        Other_dept_category__c = '其他科室',
                        Department_Name__c = accShareName,
                        OwnerId = System.Label.Batch_User_Id,
                        RecordTypeId = System.Label.Department_OTH
                    )
                );
            }
            AssetHandler.insertAccGrantShare(insertAccount, execNow);
        }
    }
    private static void insertAccGrantShare(Map<String, Account> insertAccountMap, Datetime execNow) {
        if (insertAccountMap.isEmpty()) { return; }
        if (insertAccountMap.isEmpty()) {
            return;
        }
        Set<String> accShareNameSet = insertAccountMap.keySet();
        // insert Account的时候, 跳过 NFM001
        // OLY_OCM-1230 需要执行NFM001Trigger
@@ -767,13 +1266,15 @@
        Map<String, Group> insertGroup = new Map<String, Group>();
        Map<String, Group> groupNameMap = new Map<String, Group>();
        for (String accShareName : accShareNameSet) {
            insertGroup.put(accShareName, new Group(
                Name = accShareName
            ));
            insertGroup.put(accShareName, new Group(Name = accShareName));
        }
        // Check 有没有 Group
        for (Group grp : [SELECT Id, Name FROM Group WHERE Type = 'Regular' AND Name IN: accShareNameSet]) {
        for (Group grp : [
            SELECT Id, Name
            FROM Group
            WHERE Type = 'Regular' AND Name IN :accShareNameSet
        ]) {
            // 已经有Group 的话 不用 insert
            insertGroup.remove(grp.Name);
            groupNameMap.put(grp.Name, grp);
@@ -787,12 +1288,14 @@
        // 赋 Account 共享权限
        List<AccountShare> insertShareList = new List<AccountShare>();
        for (String accShareName : accShareNameSet) {
            insertShareList.add(new AccountShare(
            insertShareList.add(
                new AccountShare(
                    UserOrGroupId = groupNameMap.get(accShareName).Id,
                    AccountId = insertAccountMap.get(accShareName).Id,
                    AccountAccessLevel = 'Edit',
                    OpportunityAccessLevel = 'None'
            ));
                )
            );
        }
        insert insertShareList;
        // Update Asset.AccountId
@@ -800,15 +1303,17 @@
    }
    private static void updateAssetAccount(Map<String, Account> accShareNameAccountMap, Datetime execNow) {
        if (accShareNameAccountMap.isEmpty()) { return; }
        if (accShareNameAccountMap.isEmpty()) {
            return;
        }
        Set<String> accShareNameSet = accShareNameAccountMap.keySet();
        List<Asset> updAssetAccount = new List<Asset>();
        for (Asset nObj : [SELECT Id, OlympusAccShareName__c, AccountId
                 FROM Asset
                WHERE OlympusAccShareSameFlag__c = '0'
                  AND OlympusAccShareName__c IN: accShareNameSet
                  AND LastModifiedDate >=: execNow]) {
        for (Asset nObj : [
            SELECT Id, OlympusAccShareName__c, AccountId
            FROM Asset
            WHERE OlympusAccShareSameFlag__c = '0' AND OlympusAccShareName__c IN :accShareNameSet AND LastModifiedDate >= :execNow
        ]) {
            nObj.AccountId = accShareNameAccountMap.get(nObj.OlympusAccShareName__c).Id;
            updAssetAccount.add(nObj);
        }
@@ -829,4 +1334,4 @@
            AssetHandler.insertAccShare(insertAccShareNameJson, execNow);
        }
    }
}
}