using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Otsuka.Application.Dal;
using Otsuka.Application.Bll.Common;
using Otsuka.Application.Common;
using Otsuka.Application.Bll.Dialog.ApplicationFind;
namespace Otsuka.Application.Bll.Dialog.ApplicationFind
{
public class SearchApplicationBll : BllBaseEx
{
/// <summary>
/// 要求キー-申請検索条件
/// </summary>
public const string REQUEST_KEY_APPLICATION_REQUEST = "APPLICATION_REQUEST";
/// <summary>
/// 返却キー-申請情報(複数件)
/// </summary>
public const string RESPONSE_KEY_APPLICATION_LIST = "APPLICATION_LIST";
/// <summary>
///
/// </summary>
/// <returns></returns>
protected override Dictionary<string, object> Perform()
{
// 検索条件の取得
SearchApplicationRequest request = (SearchApplicationRequest)Request[REQUEST_KEY_APPLICATION_REQUEST];
var query = DataContext.TBAATR_APPLICATION.AsQueryable();
var productsQuery = DataContext.TBAATR_PRODUCT.AsQueryable();
if (!CheckUtility.IsEmpty(request.ApplicationNo))
{
// 申請番号
query = query.Where(item => item.APPLI_NO == request.ApplicationNo);
productsQuery = productsQuery.Where(item => item.APPLI_NO == request.ApplicationNo);
}
if (!CheckUtility.IsEmpty(request.MaterialsInfoCode))
{
// 資材媒体
query = query.Where(item => item.MATERIALS_CODE == request.MaterialsInfoCode);
}
if (!CheckUtility.IsEmpty(request.MaterialsClassInfoCode))
{
// 資材分類
query = query.Where(item => item.MATERIALS_CLASS_CODE == request.MaterialsClassInfoCode);
}
if (!CheckUtility.IsEmpty(request.UniformCode))
{
// 統一コード
query = query.Where(item => item.UNIFORM_CODE == request.UniformCode);
}
if (!CheckUtility.IsEmpty(request.OrderPartCode))
{
// 発注品番
query = query.Where(item => item.ORDER_PART_CODE == request.OrderPartCode);
}
if (!CheckUtility.IsEmpty(request.ApplicantDivisionCode))
{
// 申請部署
query = query.Where(item => item.APPLICANT_DIVISION == request.ApplicantDivisionCode);
}
if (!CheckUtility.IsEmpty(request.ApplicantStaffCode))
{
// 申請者
query = query.Where(item => item.APPLICANT_STF_CODE == request.ApplicantStaffCode);
}
if (!CheckUtility.IsEmpty(request.ApplicationDateStart))
{
// 申請日開始
query = query.Where(item => item.APPLICATION_DATE.CompareTo(request.ApplicationDateStart.Replace("/", "") + "00") >= 0);
}
if (!CheckUtility.IsEmpty(request.ApplicationDateEnd))
{
// 申請日終了
query = query.Where(item => item.APPLICATION_DATE.CompareTo(request.ApplicationDateEnd.Replace("/", "") + "99") <= 0);
}
if (!CheckUtility.IsEmpty(request.DrugCode))
{
// 薬剤
query = query.Where(item => item.DRUG == request.DrugCode);
}
if (!CheckUtility.IsEmpty<string>(request.ProductCodes))
{
// 製品
productsQuery = productsQuery.Where(item => request.ProductCodes.Contains(item.PROD_GRP_CODE));
}
if (!CheckUtility.IsEmpty(request.MaterialsName))
{
// 資材名称
query = query.Where(item => item.MATERIALS_NM_KNJ.Contains(request.MaterialsName));
}
if (!CheckUtility.IsEmpty(request.Mode))
{
if (request.Mode == ConstValue.APPLICATION_FIND_MODE_APPLICATION)
{
// ステータス(公開許可)
query = query.Where(item => item.STATUS_NO == ((int)Status.SecretariatPermitPublic).ToString());
}
else if (request.Mode == ConstValue.APPLICATION_FIND_MODE_COMMITTEE)
{
// ステータス(受理、審議Ⅰ、Ⅱ、事前審議)
query = query.Where(item => new[] {
((int)Status.SecretariatAccept).ToString(),
((int)Status.SecretariatAcceptDiscuss).ToString(),
((int)Status.SecretariatAcceptNoDiscuss).ToString()
}.Contains(item.STATUS_NO));
}
}
//ADD:SCSK:20141128:IT指摘事項No.16:START
string yyyymmdd = DateTime.Now.ToString("yyyyMMdd");
//ADD:SCSK:20141128:IT指摘事項No.16:END
List<SearchApplicationResult> results = (from row in query.Where(item => item.DEL_FLG == '0')
//MOD:SCSK:20141128:IT指摘事項No.16:START
//join row_temp in DataContext.TBAARS_COMMITTEE_APPLICATION.AsQueryable().Where(item => item.DEL_FLG == '0') on row.APPLI_NO equals row_temp.APPLI_NO into row_temp2
//from committeeApplication in row_temp2.DefaultIfEmpty()
//MOD:SCSK:20141128:IT指摘事項No.16:END
join products_temp in productsQuery.Where(item => item.DEL_FLG == '0') on row.APPLI_NO equals products_temp.APPLI_NO into products_temp2
from products in products_temp2.DefaultIfEmpty()
join staffs_temp in DataContext.TBCMRS_STF_INFO on row.APPLICANT_STF_CODE equals staffs_temp.STF_CODE into staffs_temp2
from staffs in staffs_temp2.DefaultIfEmpty()
join divisions_tmp in DataContext.TBCMRS_CST_INFO on row.APPLICANT_DIVISION equals divisions_tmp.CST_CODE into divisions_temp2
from divisions in divisions_temp2.DefaultIfEmpty()
join drugs_temp in DataContext.TBCMRS_DRUG_INFO.AsQueryable().Where(item => item.DEL_FLG == '0') on row.DRUG equals drugs_temp.DRUG_CODE into drugs_temp2
from drugs in drugs_temp2.DefaultIfEmpty()
join materialsInfo in DataContext.MATERIALS_INFO on row.MATERIALS_CODE equals materialsInfo.MATERIALS_CODE
join materialsClassInfo in DataContext.MATERIALS_CLASS_INFO on row.MATERIALS_CLASS_CODE equals materialsClassInfo.MATERIALS_CLASS_CODE
//join materialsattributes_temp in DataContext.MATERIALS_ATTRIBUTES.AsQueryable().Where(item => item.ABOLITION_FLG != "1") on row.MATERIALS_NO equals materialsattributes_temp.MATERIALS_NO into materialsattributes_temp2
join materialsattributes_temp in DataContext.MATERIALS_ATTRIBUTES on row.MATERIALS_NO equals materialsattributes_temp.MATERIALS_NO into materialsattributes_temp2
from materialsattributes in materialsattributes_temp2.DefaultIfEmpty()
//ADD:SCSK:20141128:IT指摘事項No.16:START
from committeeApplication in DataContext.TBAARS_COMMITTEE_APPLICATION
//ADD:SCSK:20141128:IT指摘事項No.16:END
where
materialsInfo.DEL_FLG == '0'
&& materialsClassInfo.DEL_FLG == '0'
//ADD:SCSK:20141128:IT指摘事項No.16:START
&& divisions.STA_YMD.CompareTo(yyyymmdd) <= 0
&& divisions.END_YMD.CompareTo(yyyymmdd) >= 0
&& row.APPLI_NO == committeeApplication.APPLI_NO
&& row.REVISION_NO == committeeApplication.REVISION_NO
&& committeeApplication.DEL_FLG == '0'
//ADD:SCSK:20141128:IT指摘事項No.16:END
select new SearchApplicationResult()
{
ApplicationNo = row.APPLI_NO,
ApplicantDivisionName = divisions.SCN_NM_KNJ,
ApplicantStaffName = staffs.STF_NM_KNJ,
ApplicationDate = row.APPLICATION_DATE,
DrugName = drugs.DRUG_NM_KNJ,
MaterialsInfoName = materialsInfo.MATERIALS_NM_KNJ,
MaterialsClassInfoName = materialsClassInfo.MATERIALS_CLASS_NM_KNJ,
MaterialsName = row.MATERIALS_NM_KNJ,
DiscussionClassName = row.DISCUSSION_CLASS.ToString(),
UniformCode = row.UNIFORM_CODE,
OrderPartCode = row.ORDER_PART_CODE,
CommitteeNo = committeeApplication.COMMITTEE_NO,
CommitteeDelFlg = committeeApplication.DEL_FLG,
StaffStaYmd = divisions.STA_YMD,
StaffEndYmd = divisions.END_YMD,
ApplicationDivRegDate = row.APPLICANT_DIV_REG_DATE,
AbolitionFlg = materialsattributes.ABOLITION_FLG,
//ADD:SCSK:20141028:2-3:START
PurposeBackground = row.PURPOSE_BACKGROUND
//ADD:SCSK:20141028:2-3:END
}).Distinct().ToList<SearchApplicationResult>();
List<SearchApplicationResult> searchResults = new List<SearchApplicationResult>();
foreach (SearchApplicationResult result in results)
{
if (((result.CommitteeNo != null && result.CommitteeDelFlg == '0') && !request.IsContainSettedCommittee) || result.AbolitionFlg == "1")
{
// 委員会設定済み申請を検索に含めないときで、委員会番号がnull のとき
continue;
}
if (CheckUtility.IsEmpty(result.ApplicantStaffName)
|| (!CheckUtility.IsEmpty(result.StaffStaYmd)
&& (result.StaffStaYmd.CompareTo(result.ApplicationDivRegDate) <= 0
&& result.StaffEndYmd.CompareTo(result.ApplicationDivRegDate) >= 0)))
{
// 申請者が空文字、もしくは有効な申請者が存在する
result.DiscussionClassName = this.GetDiscussionClassName(result.DiscussionClassName);
searchResults.Add(result);
}
}
Dictionary<string, object> response = new Dictionary<string, object>();
response.Add(RESPONSE_KEY_APPLICATION_LIST, searchResults);
return response;
}
/// <summary>
/// 審議種別コードから審議種別名を朱得する
/// </summary>
/// <param name="discussionClassCode"></param>
/// <returns></returns>
private string GetDiscussionClassName(string discussionClassCode)
{
if (discussionClassCode == "1")
{
return "審議Ⅰ";
}
else if (discussionClassCode == "2")
{
return "審議Ⅱ";
}
else if (discussionClassCode == "3")
{
return "事前審議";
}
else if (discussionClassCode == "0")
{
return "未判定";
}
return string.Empty;
}
}
}