Skip to content

Commit

Permalink
#187 의약품 상세 정보 응답 시 재심사 날짜로 인해 발생하는 데이터 오류 수정, UI에 표시할 데이터 구조 수정하였고 M…
Browse files Browse the repository at this point in the history
…apper클래스를 만들어서 적절한 값으로 변경하여 주는 기능 추가 및 지속 작업 중
  • Loading branch information
pknujsp committed Aug 1, 2023
1 parent bf3dbac commit 9ba3020
Show file tree
Hide file tree
Showing 21 changed files with 190 additions and 86 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ import androidx.core.view.isVisible
import androidx.core.widget.TextViewCompat
import androidx.databinding.BindingAdapter
import com.android.mediproject.core.common.R
import com.android.mediproject.core.model.constants.MedicationType
import com.android.mediproject.core.model.medicine.common.producttype.MedicationProductType
import com.bumptech.glide.annotation.GlideModule
import com.bumptech.glide.module.AppGlideModule

Expand All @@ -21,7 +21,7 @@ class GlideAppModule : AppGlideModule()
object BindingAdapter {
@JvmStatic
@BindingAdapter("medicationTypeText")
fun setMedicationTypeText(textView: TextView, type: MedicationType) {
fun setMedicationTypeText(textView: TextView, type: MedicationProductType) {
val arr = textView.context.resources.getStringArray(R.array.medicationTypes)
textView.text = arr[type.ordinal]
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,8 @@ import android.text.style.UnderlineSpan
import androidx.core.content.ContextCompat
import androidx.core.text.toSpanned
import com.android.mediproject.core.common.R
import com.android.mediproject.core.model.medicine.medicinedetailinfo.MedicineDetail
import com.android.mediproject.core.model.granule.GranuleIdentificationInfo
import com.android.mediproject.core.model.medicine.medicinedetailinfo.MedicineDetail
import com.android.mediproject.core.model.util.XMLParsedResult
import java.lang.ref.WeakReference
import javax.inject.Inject
Expand Down Expand Up @@ -76,7 +76,7 @@ class MedicineInfoMapper @Inject constructor() {
return WeakReference(StringBuilder()).get()?.let { builder ->
with(medicineDetail) {
builder.append("<p><b>의약품 이름:</b> $itemName</p>").append("<p><b>의약품 영문 이름:</b> $itemEnglishName</p>")
.append("<p><b>의약품 시퀀스 번호:</b> $itemSequence</p>").append("<p><b>의약품 허가 날짜:</b> $itemPermitDate</p>")
.append("<p><b>의약품 시퀀스 번호:</b> $itemSequence</p>").append("<p><b>의약품 허가 날짜:</b> ${itemPermitDate.value}</p>")
.append("<p><b>제조사 이름:</b> $entpName</p>").append("<p><b>제조사 영문 이름:</b> $entpEnglishName</p>")
.append("<p><b>제조및수입사:</b> $consignmentManufacturer</p>").append("<p><b>성분 이름:</b> $ingredientName</p>")
.append("<p><b>주성분의 영문 이름:</b> $mainIngredientEnglish</p>").append("<p><b>총 함량:</b> $totalContent</p>")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ package com.android.mediproject.core.domain

import androidx.paging.map
import com.android.mediproject.core.data.medicineapproval.MedicineApprovalRepository
import com.android.mediproject.core.model.constants.MedicationType
import com.android.mediproject.core.model.medicine.common.producttype.FilterMedicationProductType
import com.android.mediproject.core.model.medicine.medicineapproval.toApprovedMedicine
import com.android.mediproject.core.model.requestparameters.ApprovalListSearchParameter
import kotlinx.coroutines.flow.map
Expand All @@ -20,9 +20,9 @@ class GetMedicineApprovalListUseCase @Inject constructor(
) = medicineApprovalRepository.getMedicineApprovalList(
itemName = parameter.itemName,
entpName = parameter.entpName,
medicationType = when (parameter.medicationType) {
MedicationType.ALL -> null
else -> parameter.medicationType.description
medicationType = when (parameter.medicationProductType) {
FilterMedicationProductType.ALL -> null
else -> parameter.medicationProductType.text
},
).map { pagingData ->
pagingData.map { item ->
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,15 @@
package com.android.mediproject.core.model

import com.android.mediproject.core.model.common.UiValue
import java.time.LocalDate
import java.time.LocalDateTime
import java.time.format.DateTimeFormatter

fun String.toLocalDate(format: String): LocalDate? = if (isEmpty()) null else LocalDate.parse(this, DateTimeFormatter.ofPattern(format))
fun String?.toLocalDate(format: String): DateTimeValue = DateTimeValue(this, format)

fun String.toLocalDateTime(format: String): LocalDateTime = LocalDateTime.parse(this, DateTimeFormatter.ofPattern(format))

class DateTimeValue(dateTime: String?, format: String) : UiValue<LocalDate> {
override val value: LocalDate = dateTime?.run { LocalDate.parse(this, DateTimeFormatter.ofPattern(format)) } ?: LocalDate.MIN
override val isEmpty: Boolean = value.isEqual(LocalDate.MIN)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package com.android.mediproject.core.model.common

/**
* UI에서 사용하는 값을 나타내기 위한 자료형
*
* @param T UI에서 사용하는 값의 자료형
* @property value UI에서 사용하는 값
* @property isEmpty UI에서 사용하는 값이 비어있는지 여부
*
* LocalDate와 같이 Date값의 존재 여부를 Null대신 구분짓기 위해 사용한다.
*/
interface UiValue<T> {
val value: T
val isEmpty: Boolean
}

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package com.android.mediproject.core.model.granule

import com.android.mediproject.core.model.DateTimeValue
import com.android.mediproject.core.model.toLocalDate
import java.time.LocalDate


/**
Expand Down Expand Up @@ -43,7 +43,7 @@ import java.time.LocalDate
*/
data class GranuleIdentificationInfo(
val bizrNo: String, // 3038117108
val changeDate: LocalDate?, // 20230419
val changeDate: DateTimeValue, // 20230419
val chart: String, // 무색 내지 연보라색의 내용물이 든 보라색의 투명한 타원형 연질캡슐
val className: String, // 항히스타민제
val classNo: String, // 01410
Expand All @@ -55,11 +55,11 @@ data class GranuleIdentificationInfo(
val entpSeq: String, // 19910005
val etcOtcName: String, // 일반의약품
val formCodeName: String, // 연질캡슐제, 액상
val imgRegistTs: LocalDate?, // 20100305
val imgRegistTs: DateTimeValue, // 20100305
val itemEngName: String, // Allershot Soft Cap.
val itemImage: String, // https://nedrug.mfds.go.kr/pbp/cmn/itemImageDownload/154661648918800015
val itemName: String, // 알러샷연질캡슐(세티리진염산염)
val itemPermitDate: LocalDate?, // 20090812
val itemPermitDate: DateTimeValue, // 20090812
val itemSeq: String, // 200906254
val lengLong: String, // 12.50
val lengShort: String, // 7.58
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package com.android.mediproject.core.model.medicine.common.cancel

import com.android.mediproject.core.model.toLocalDate

class MedicineCancelStatusMapper {
companion object {
private const val cancelDateFormat = "yyyyMMdd"
fun map(cancelName: String, cancelDate: String? = null): MedicineCancelStatus {
return when (MedicineCancelStatusType.statusOf(cancelName)) {
MedicineCancelStatusType.CANCELED -> Canceled(cancelDate.toLocalDate(cancelDateFormat))
MedicineCancelStatusType.EXPIRED -> Expired(cancelDate.toLocalDate(cancelDateFormat))
MedicineCancelStatusType.NORMAL -> Normal()
}
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package com.android.mediproject.core.model.medicine.common.cancel

import androidx.annotation.StringRes
import com.android.mediproject.core.model.DateTimeValue
import com.android.mediproject.core.model.R

enum class MedicineCancelStatusType(val status: String, @StringRes val statusStringResId: Int) {
CANCELED("취하", R.string.medicineCancelStatus_canceled), EXPIRED(
"유효기간만료",
R.string.medicineCancelStatus_expired,
),
NORMAL("정상", R.string.medicineCancelStatus_normal);

companion object {
fun statusOf(status: String) = values().find { it.status == status } ?: throw IllegalArgumentException()
}
}

interface MedicineCancelStatus {
@get:StringRes val statusStringId: Int
}

data class Canceled(val cancelDate: DateTimeValue) : MedicineCancelStatus {
override val statusStringId: Int = MedicineCancelStatusType.CANCELED.statusStringResId
}

class Expired(val cancelDate: DateTimeValue) : MedicineCancelStatus {
override val statusStringId: Int = MedicineCancelStatusType.EXPIRED.statusStringResId
}

class Normal : MedicineCancelStatus {
override val statusStringId: Int = MedicineCancelStatusType.NORMAL.statusStringResId
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package com.android.mediproject.core.model.medicine.common.producttype

import androidx.annotation.StringRes
import com.android.mediproject.core.model.R
import com.android.mediproject.core.model.medicine.common.producttype.FilterMedicationProductType.ALL
import com.android.mediproject.core.model.medicine.common.producttype.FilterMedicationProductType.GENERAL
import com.android.mediproject.core.model.medicine.common.producttype.FilterMedicationProductType.SPECIALTY

/**
* 표시할 의약품 타입
*
* @property SPECIALTY 전문의약품
* @property GENERAL 일반의약품
* @property ALL 전체
*/
enum class FilterMedicationProductType(val text: String, @StringRes val stringResId: Int) {
ALL("", R.string.medicineProductType_all), SPECIALTY("전문", R.string.medicineProductType_specialty), GENERAL(
"일반",
R.string.medicineProductType_general,
);

companion object {

fun FilterMedicationProductType.text() = text
fun FilterMedicationProductType.stringResId() = stringResId
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package com.android.mediproject.core.model.medicine.common.producttype

import androidx.annotation.StringRes
import com.android.mediproject.core.model.R
import com.android.mediproject.core.model.medicine.common.producttype.MedicationProductType.GENERAL
import com.android.mediproject.core.model.medicine.common.producttype.MedicationProductType.SPECIALTY

/**
* 의약품 타입
*
* @property SPECIALTY 전문의약품
* @property GENERAL 일반의약품
*/
enum class MedicationProductType(val description: String, @StringRes val stringResId: Int) {
SPECIALTY("전문", R.string.medicineProductType_specialty),
GENERAL("일반", R.string.medicineProductType_general);

companion object {
fun valueOf(description: String) = values().find { description.contains(it.name) } ?: throw IllegalArgumentException()
}
}
Original file line number Diff line number Diff line change
@@ -1,18 +1,20 @@
package com.android.mediproject.core.model.medicine.medicinedetailinfo

import com.android.mediproject.core.model.DateTimeValue
import com.android.mediproject.core.model.medicine.common.cancel.MedicineCancelStatus
import com.android.mediproject.core.model.medicine.common.cancel.MedicineCancelStatusMapper
import com.android.mediproject.core.model.medicine.common.producttype.MedicationProductType
import com.android.mediproject.core.model.toLocalDate
import com.android.mediproject.core.model.util.XMLParsedResult
import com.android.mediproject.core.model.util.parseXmlString
import com.android.mediproject.core.model.toLocalDate
import java.time.LocalDate

/**
* 의약품 상세 허가 정보
*
* @param atcCode ATC 코드
* @param barCode 바코드
* @param businessRegistrationNumber 사업자등록번호
* @param cancelDate 취소일자
* @param cancelName 취소명
* @param cancelStatus 취소 상태
* @param changeDate 변경일자
* @param chart 성상
* @param consignmentManufacturer 제조및수입사
Expand All @@ -22,7 +24,7 @@ import java.time.LocalDate
* @param entpEnglishName 제조사의 영문 이름입니다.
* @param entpName 제조사의 이름입니다.
* @param entpNumber 제조사의 번호입니다.
* @param etcOtcCode 전문의약품 코드입니다.
* @param medicationProductType 전문의약품 코드입니다.
* @param gbnName GBN(General Batch Number)의 이름입니다.
* @param industryType 산업 유형입니다. 이 경우에는 '의약품'이라고 명시되어 있습니다.
* @param ingredientName 성분 이름입니다.
Expand All @@ -42,12 +44,10 @@ import java.time.LocalDate
* @param packUnit 패키지 단위입니다.
* @param permitKindName 허가 종류 이름입니다.
* @param pnDocData PN 문서 데이터입니다.
* @param reexamDate 재심사 날짜입니다.
* @param reexamTarget 재심사 대상입니다.
* @param storageMethod 저장 방법입니다.
* @param totalContent 총 함량입니다.
* @param udDocData 용법 용량
* @param uDocUid UD 문서의 식별자(ID)입니다.
* @param validTerm 유효 기간입니다. 제조일로부터의 개월 수를 나타냅니다.
* @param medicineIdInServer AWS에 저장된 의약품 ID
* @param existsMedicineIdInServer AWS에 저장된 의약품 ID가 있는지 여부
Expand All @@ -56,9 +56,8 @@ data class MedicineDetail(
val atcCode: String,
val barCode: String,
val businessRegistrationNumber: String,
val cancelDate: LocalDate,
val cancelName: String,
val changeDate: LocalDate,
val cancelStatus: MedicineCancelStatus,
val changeDate: DateTimeValue,
val chart: String,
val consignmentManufacturer: String,
val docText: String,
Expand All @@ -67,14 +66,14 @@ data class MedicineDetail(
val entpEnglishName: String,
val entpName: String,
val entpNumber: String,
val etcOtcCode: String,
val medicationProductType: MedicationProductType,
val gbnName: String,
val industryType: String,
val ingredientName: String,
val insertFileUrl: String,
val itemEnglishName: String,
val itemName: String,
val itemPermitDate: LocalDate,
val itemPermitDate: DateTimeValue,
val itemSequence: String,
val mainIngredientEnglish: String,
val mainItemIngredient: String,
Expand All @@ -87,12 +86,10 @@ data class MedicineDetail(
val packUnit: String,
val permitKindName: String,
val pnDocData: XMLParsedResult,
val reexamDate: LocalDate,
val reexamTarget: String,
val storageMethod: String,
val totalContent: String,
val udDocData: XMLParsedResult,
val uDocUid: String,
val validTerm: String,
val medicineIdInServer: Long,
val existsMedicineIdInServer: Boolean,
Expand All @@ -102,44 +99,41 @@ fun MedicineDetailInfoResponse.Item.toMedicineDetail(medicineIdInServer: Long =
atcCode = atcCode,
barCode = barCode,
businessRegistrationNumber = businessRegistrationNumber,
cancelDate = cancelDate.toLocalDate("yyyyMMdd") ?: LocalDate.MIN,
cancelName = cancelName,
changeDate = changeDate.toLocalDate("yyyyMMdd") ?: LocalDate.MIN,
chart = chart,
consignmentManufacturer = consignmentManufacturer,
docText = docText,
ediCode = ediCode,
eeDocData = if (eeDocData.isNotEmpty()) eeDocData.parseXmlString() else XMLParsedResult("", emptyList()),
eeDocData = eeDocData.parseXmlString(),
entpEnglishName = entpEnglishName,
entpName = entpName,
entpNumber = entpNumber,
etcOtcCode = etcOtcCode,
medicationProductType = MedicationProductType.valueOf(etcOtcCode),
gbnName = gbnName,
industryType = industryType,
ingredientName = ingredientName,
insertFileUrl = insertFileUrl,
itemEnglishName = itemEnglishName,
itemName = itemName,
itemPermitDate = itemPermitDate.toLocalDate("yyyyMMdd") ?: LocalDate.MIN,
itemPermitDate = itemPermitDate.toLocalDate("yyyyMMdd"),
itemSequence = itemSequence,
mainIngredientEnglish = mainIngredientEnglish,
mainItemIngredient = mainItemIngredient,
makeMaterialFlag = makeMaterialFlag,
materialName = materialName,
narcoticKindCode = narcoticKindCode,
nbDocData = if (nbDocData.isNotEmpty()) nbDocData.parseXmlString() else XMLParsedResult("", emptyList()),
nbDocData = nbDocData.parseXmlString(),
nbDocId = nbDocId,
newDrugClassName = newDrugClassName,
packUnit = packUnit,
permitKindName = permitKindName,
pnDocData = if (pnDocData.isNotEmpty()) pnDocData.parseXmlString() else XMLParsedResult("", emptyList()),
reexamDate = reexamDate.toLocalDate("yyyyMMdd") ?: LocalDate.MIN,
pnDocData = pnDocData.parseXmlString(),
reexamTarget = reexamTarget,
storageMethod = storageMethod,
totalContent = totalContent,
udDocData = udDocData.parseXmlString(),
uDocUid = uDDOCID,
validTerm = validTerm,
medicineIdInServer = medicineIdInServer,
existsMedicineIdInServer = medicineIdInServer != 0L,
cancelStatus = MedicineCancelStatusMapper.map(cancelName, cancelDate),
changeDate = changeDate.toLocalDate("yyyyMMdd"),
)
Loading

0 comments on commit 9ba3020

Please sign in to comment.