// todo 可用 report api实现
// FixtureRemindControllerTest
// FixtureRemindBatchTest
public without sharing class FixtureRemindUtil {
public Map eastMap {set;get;} // 华东
public Map eastConsumMap {set;get;} // 华东耗材
public Map southMap {set;get;} // 南方
public Map northMap {set;get;} // 北方
public Map totalMap {set;get;} // 合计
public final static List STATUS_LIST {set;get;}
public final static List CONSUM_STATUS_LIST {set;get;}
private static Map RENTAL_DETAIL_WHERE_MAP;
private static Map CONSUM_DETAIL_WHERE_MAP;
private static Map RENTAL_APPLY_WHERE_MAP;
private static Map CONSUM_APPLY_WHERE_MAP;
private static Map STATUS_NAME_MAP;
private static Map CONSUM_STATUS_NAME_MAP;
private static Map LABEL_API_MAP;
private OlympusCalendar__c today;
private String nowTimeOption;
public FixtureRemindUtil(){
northMap = new Map();
southMap = new Map();
eastMap = new Map();
eastConsumMap = new Map();
totalMap = new Map();
try{
today = [SELECT Before_1_WorkDay__c FROM OlympusCalendar__c WHERE Date__c=:System.today()];
}
catch(Exception e){
today = new OlympusCalendar__c(Date__c=System.today(), Before_1_WorkDay__c = System.today().addDays(-1));
}
nowTimeOption = nowTimeToOption();
}
public void init() {
resetAllMaps();
List raesdList = [
SELECT RAESD_Status_Text__c
, Rental_Apply__r.Loaner_centre_mail_address__c
, Lost_item_check_time_Final__c
, Repair_Status_F__c
, Return_DeliverySlip__c
, EquipmentSet_Detail_Status_Status__c
FROM Rental_Apply_Equipment_Set_Detail__c
WHERE ((Is_Body_F__c = true
AND (RAESD_Status_Text__c IN:STATUS_NAME_MAP.keySet()
// or 待欠品确认件数
OR (RAESD_Status_Text__c = '欠品中' AND Return_DeliverySlip__c != null)
// or 待回收后检测件数
OR (RAESD_Status_Text__c = '修理中' AND Repair_Status_F__c = '修理完毕')
)
)
// or 欠品中件数
//OR (RAESD_Status_Text__c = '欠品中' AND Lost_item_check_time_Final__c >= :today.Before_1_WorkDay__c)
//update lxy 2021/10/13 去掉欠品确认时间(最终)≥上一个工作日条件
//update by rentx 2021-10-18 start
OR (RAESD_Status_Text__c = '欠品中')
// or 待修理
OR (RAESD_Status_Text__c = '待修理' AND Is_Body_F__c = false))
//SFDC-BZT44W add by rentx 2021-04-07 start
AND Rental_Apply__r.RecordType.DeveloperName != 'AgencyRequest'
//SFDC-BZT44W add by rentx 2021-04-07 end
];
for(Rental_Apply_Equipment_Set_Detail__c raesd : raesdList) {
String show_status = '';
if(STATUS_NAME_MAP.containsKey(raesd.RAESD_Status_Text__c)) {
show_status = STATUS_NAME_MAP.get(raesd.RAESD_Status_Text__c);
}
else if (raesd.RAESD_Status_Text__c == '欠品中' && raesd.Return_DeliverySlip__c != null) {
show_status = '待欠品确认件数';
}
//else if(raesd.RAESD_Status_Text__c == '欠品中' && raesd.Lost_item_check_time_Final__c >= today.Before_1_WorkDay__c){
//update lxy 2021/10/13 去掉欠品确认时间(最终)≥上一个工作日条件
// else if(raesd.RAESD_Status_Text__c == '欠品中'){
// show_status = '欠品中件数';
// }
//update by rentx 欠品未回寄并且是主体或者是附属品的 状态不是 确认遗失 start
else if(raesd.RAESD_Status_Text__c == '欠品中' && raesd.EquipmentSet_Detail_Status_Status__c != '确认遗失' ){
show_status = '欠品中件数';
}
//update by rentx 欠品未回寄并且是主体或者是附属品的 状态不是 确认遗失 end
else if(raesd.RAESD_Status_Text__c == '修理中' && raesd.Repair_Status_F__c == '修理完毕'){
show_status = '待回收后检测件数';
}
else {
continue;
}
if(String.isNotBlank(raesd.Rental_Apply__r.Loaner_centre_mail_address__c)){
switch on raesd.Rental_Apply__r.Loaner_centre_mail_address__c.toLowerCase() {
when 'ocm_asset@olympus.com.cn'{
northMap.put(show_status, northMap.get(show_status) + 1);
}
when 'ocm_assetgz@olympus.com.cn'{
southMap.put(show_status, southMap.get(show_status) + 1);
}
when 'ocm_assetsh@olympus.com.cn'{
eastMap.put(show_status, eastMap.get(show_status) + 1);
}
}
}
}
// 待确认签收数
List raList = [
SELECT Id
, Loaner_centre_mail_address__c
FROM Rental_Apply__c
WHERE Bollow_Date__c != null
AND HP_received_sign_day__c != null
AND AssetManageConfirm__c = false
AND HP_received_sign_NG__c = false
AND RA_Status__c != '完了'
// SFDC-BZT44W add by rentx 2021-04-07 start
AND RecordType.DeveloperName != 'AgencyRequest'
//SFDC-BZT44W add by rentx 2021-04-07 end
];
for(Rental_Apply__c ra:raList){
if(String.isNotBlank(ra.Loaner_centre_mail_address__c)){
switch on ra.Loaner_centre_mail_address__c.toLowerCase() {
when 'ocm_asset@olympus.com.cn'{
northMap.put('待确认签收单数', northMap.get('待确认签收单数') + 1);
}
when 'ocm_assetgz@olympus.com.cn'{
southMap.put('待确认签收单数', southMap.get('待确认签收单数') + 1);
}
when 'ocm_assetsh@olympus.com.cn'{
eastMap.put('待确认签收单数', eastMap.get('待确认签收单数') + 1);
}
}
}
}
for(String show_status:totalMap.keySet()){
totalMap.put(show_status, eastMap.get(show_status) + southMap.get(show_status) + northMap.get(show_status));
}
// 耗材部分
List caesdList = [
SELECT RAESD_Status__c
, Asset_Center_Confirm_Time__c
, Consum_Apply__r.AssetManageConfirm__c
FROM Consum_Apply_Equipment_Set_Detail__c
WHERE RAESD_Status__c IN:CONSUM_STATUS_NAME_MAP.keySet()
OR (RAESD_Status__c='申请者收货NG' AND Asset_Center_Confirm_Time__c = null)
OR (RAESD_Status__c='已回寄' AND Consum_Apply__r.AssetManageConfirm__c = true)
];
Set caIdSet = new Set();
for(Consum_Apply_Equipment_Set_Detail__c caesd : caesdList){
String show_status = '';
if(CONSUM_STATUS_NAME_MAP.containsKey(caesd.RAESD_Status__c)) {
show_status = CONSUM_STATUS_NAME_MAP.get(caesd.RAESD_Status__c);
}
else if (caesd.RAESD_Status__c == '申请者收货NG'
&& caesd.Asset_Center_Confirm_Time__c == null){
show_status = '到货NG待确认数量';
}
else if(caesd.RAESD_Status__c == '已回寄'
&& caesd.Consum_Apply__r.AssetManageConfirm__c){
show_status = '待收货件数';
}
else {
continue;
}
eastConsumMap.put(show_status, eastConsumMap.get(show_status) + 1);
}
List caList = [
SELECT Id
FROM Consum_Apply__c
WHERE Bollow_Date__c != null
AND Consum_Trial_Update_Time__c != null
AND AssetManageConfirm__c = false
AND HP_received_sign_NG__c = false
AND RA_Status__c != '完了'
AND RA_Status__c != '取消'
];
eastConsumMap.put('待确认试用表数量', caList.size());
}
// 按给定状态列表初始化map
private void initStatusMap(Map tempMap, List show_status_list) {
for(String show_status : show_status_list){
tempMap.put(show_status, 0);
}
}
public void resetAllMaps() {
initStatusMap(northMap, STATUS_LIST);
initStatusMap(southMap, STATUS_LIST);
initStatusMap(eastMap, STATUS_LIST);
initStatusMap(totalMap, STATUS_LIST);
initStatusMap(eastConsumMap, CONSUM_STATUS_LIST);
}
static {
STATUS_LIST = new List {
'待分配件数',
'暂定分配件数',
'排队中件数',
'待出库指示件数',
'待下架件数',
'待出库前检测件数',
'待发货件数',
'待确认签收单数',
'待欠品确认件数',
'待CDS件数',
'待回收后检测件数',
'待上架件数',
'欠品中件数',
'待报修件数'
};
CONSUM_STATUS_LIST = new List {
'待分配件数',
'待出库指示件数',
'待发货件数',
'到货NG待确认数量',
'待确认试用表数量',
'待收货件数'
};
// 借出明细状态名 => 显示状态名
STATUS_NAME_MAP = new Map {
FixtureUtil.raesdStatusMap.get(FixtureUtil.HistoryStatus.Dai_Fen_Pei.ordinal()) => '待分配件数',
FixtureUtil.raesdStatusMap.get(FixtureUtil.HistoryStatus.Zan_Ding_Fen_Pei.ordinal()) => '暂定分配件数',
FixtureUtil.raesdStatusMap.get(FixtureUtil.HistoryStatus.Pai_Dui_Zhong.ordinal()) => '排队中件数',
FixtureUtil.raesdStatusMap.get(FixtureUtil.HistoryStatus.Yi_Fen_Pei.ordinal()) => '待出库指示件数',
FixtureUtil.raesdStatusMap.get(FixtureUtil.HistoryStatus.Yi_Chu_Ku_Zhi_Shi.ordinal()) => '待下架件数',
FixtureUtil.raesdStatusMap.get(FixtureUtil.HistoryStatus.Yi_Xia_Jia.ordinal()) => '待出库前检测件数',
FixtureUtil.raesdStatusMap.get(FixtureUtil.HistoryStatus.Chu_Ku_Qian_Yi_Jian_Ce.ordinal()) => '待发货件数',
FixtureUtil.raesdStatusMap.get(FixtureUtil.HistoryStatus.Yi_Hui_Ji.ordinal()) => '待欠品确认件数',
FixtureUtil.raesdStatusMap.get(FixtureUtil.HistoryStatus.Yi_Hui_Shou.ordinal()) => '待CDS件数',
FixtureUtil.raesdStatusMap.get(FixtureUtil.HistoryStatus.Hui_Shou_Hou_Yi_CDS.ordinal()) => '待回收后检测件数',
FixtureUtil.raesdStatusMap.get(FixtureUtil.HistoryStatus.Dai_Shang_Jia.ordinal()) => '待上架件数',
FixtureUtil.raesdStatusMap.get(FixtureUtil.HistoryStatus.Yi_Zhi_Bao_Fei_Qu.ordinal()) => '待上架件数',
FixtureUtil.raesdStatusMap.get(FixtureUtil.HistoryStatus.Dai_Xiu_Li.ordinal()) => '待报修件数'
};
// 耗材明细状态名 => 显示状态名
CONSUM_STATUS_NAME_MAP = new Map {
'待分配' => '待分配件数',
'暂定分配' => '待分配件数',
'已分配' => '待出库指示件数',
'已出库指示' => '待发货件数'
};
//
LABEL_API_MAP = createLabelApiMap();
}
// 创建快照记录
public FixtureRemindSnapshot__c createSnapshotRecord(String region) {
FixtureRemindSnapshot__c frs = new FixtureRemindSnapshot__c();
Map snapMap = null;
switch on region {
when '华东'{
for(String label : this.eastConsumMap.keySet()){
String objlabel = label + '(耗材)';
String api = LABEL_API_MAP.get(objlabel);
frs.put(api, this.eastConsumMap.get(label));
}
snapMap = this.eastMap;
}
when '北方'{
snapMap = this.northMap;
}
when '南方'{
snapMap = this.southMap;
}
}
for(String label : snapMap.keySet()){
String api = LABEL_API_MAP.get(label);
frs.put(api, snapMap.get(label));
}
frs.Date__c = System.today();
frs.Time__c = nowTimeOption;
frs.Region__c = region;
return frs;
}
// 时间=> 字段列表中选项
@TestVisible private String nowTimeToOption() {
DateTime now = System.now();
if(now.time() < Time.newInstance(11,30,0,0)) {
return '09:00';
}
else if(now.time() < Time.newInstance(13,0,0,0)) {
return '11:30';
}
else if(now.time() < Time.newInstance(14,0,0,0)){
return '13:00';
}
else if(now.time() < Time.newInstance(15,0,0,0)){
return '14:00';
}
else if(now.time() < Time.newInstance(17,30,0,0)){
return '15:00';
}
else{
return '17:30';
}
}
// label=>api
@TestVisible private static Map createLabelApiMap(){
Map apiMap = new Map();
SObjectType sotype = Schema.getGlobalDescribe().get('FixtureRemindSnapshot__c');
Map mfields = sotype.getDescribe().fields.getMap();
for(String strField:mfields.keySet()) {
SObjectField fl = mfields.get(strField);
apiMap.put(fl.getDescribe().getlabel(), strField);
}
return apiMap;
}
}