diff --git a/core/common/src/main/java/com/android/mediproject/core/common/bindingadapter/BindingAdapter.kt b/core/common/src/main/java/com/android/mediproject/core/common/bindingadapter/BindingAdapter.kt index 2b34a8a88..dac34297f 100644 --- a/core/common/src/main/java/com/android/mediproject/core/common/bindingadapter/BindingAdapter.kt +++ b/core/common/src/main/java/com/android/mediproject/core/common/bindingadapter/BindingAdapter.kt @@ -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 @@ -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] } diff --git a/core/common/src/main/java/com/android/mediproject/core/common/mapper/MedicineInfoMapper.kt b/core/common/src/main/java/com/android/mediproject/core/common/mapper/MedicineInfoMapper.kt index 29e702f5e..36d045421 100644 --- a/core/common/src/main/java/com/android/mediproject/core/common/mapper/MedicineInfoMapper.kt +++ b/core/common/src/main/java/com/android/mediproject/core/common/mapper/MedicineInfoMapper.kt @@ -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 @@ -76,7 +76,7 @@ class MedicineInfoMapper @Inject constructor() { return WeakReference(StringBuilder()).get()?.let { builder -> with(medicineDetail) { builder.append("

의약품 이름: $itemName

").append("

의약품 영문 이름: $itemEnglishName

") - .append("

의약품 시퀀스 번호: $itemSequence

").append("

의약품 허가 날짜: $itemPermitDate

") + .append("

의약품 시퀀스 번호: $itemSequence

").append("

의약품 허가 날짜: ${itemPermitDate.value}

") .append("

제조사 이름: $entpName

").append("

제조사 영문 이름: $entpEnglishName

") .append("

제조및수입사: $consignmentManufacturer

").append("

성분 이름: $ingredientName

") .append("

주성분의 영문 이름: $mainIngredientEnglish

").append("

총 함량: $totalContent

") diff --git a/core/domain/src/main/java/com/android/mediproject/core/domain/GetMedicineApprovalListUseCase.kt b/core/domain/src/main/java/com/android/mediproject/core/domain/GetMedicineApprovalListUseCase.kt index fd81a8858..5ef0329b8 100644 --- a/core/domain/src/main/java/com/android/mediproject/core/domain/GetMedicineApprovalListUseCase.kt +++ b/core/domain/src/main/java/com/android/mediproject/core/domain/GetMedicineApprovalListUseCase.kt @@ -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 @@ -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 -> diff --git a/core/model/src/main/java/com/android/mediproject/core/model/DateTime.kt b/core/model/src/main/java/com/android/mediproject/core/model/DateTime.kt index 226f17556..f852f5366 100644 --- a/core/model/src/main/java/com/android/mediproject/core/model/DateTime.kt +++ b/core/model/src/main/java/com/android/mediproject/core/model/DateTime.kt @@ -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 { + override val value: LocalDate = dateTime?.run { LocalDate.parse(this, DateTimeFormatter.ofPattern(format)) } ?: LocalDate.MIN + override val isEmpty: Boolean = value.isEqual(LocalDate.MIN) +} diff --git a/core/model/src/main/java/com/android/mediproject/core/model/common/UiValue.kt b/core/model/src/main/java/com/android/mediproject/core/model/common/UiValue.kt new file mode 100644 index 000000000..0a2339656 --- /dev/null +++ b/core/model/src/main/java/com/android/mediproject/core/model/common/UiValue.kt @@ -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 { + val value: T + val isEmpty: Boolean +} diff --git a/core/model/src/main/java/com/android/mediproject/core/model/constants/MedicationType.kt b/core/model/src/main/java/com/android/mediproject/core/model/constants/MedicationType.kt deleted file mode 100644 index f73f3ef13..000000000 --- a/core/model/src/main/java/com/android/mediproject/core/model/constants/MedicationType.kt +++ /dev/null @@ -1,14 +0,0 @@ -package com.android.mediproject.core.model.constants - -/** - * 약품 타입 - * - * @property SPECIALTY 전문의약품 - * @property GENERAL 일반의약품 - * @property ALL 전체 - */ -enum class MedicationType(val description: String) { - ALL(""), - SPECIALTY("전문"), - GENERAL("일반"), -} \ No newline at end of file diff --git a/core/model/src/main/java/com/android/mediproject/core/model/granule/GranuleIdentificationInfo.kt b/core/model/src/main/java/com/android/mediproject/core/model/granule/GranuleIdentificationInfo.kt index 93502babc..690738a8f 100644 --- a/core/model/src/main/java/com/android/mediproject/core/model/granule/GranuleIdentificationInfo.kt +++ b/core/model/src/main/java/com/android/mediproject/core/model/granule/GranuleIdentificationInfo.kt @@ -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 /** @@ -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 @@ -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 diff --git a/core/model/src/main/java/com/android/mediproject/core/model/medicine/common/cancel/MedicineCancelStatusMapper.kt b/core/model/src/main/java/com/android/mediproject/core/model/medicine/common/cancel/MedicineCancelStatusMapper.kt new file mode 100644 index 000000000..98a637b92 --- /dev/null +++ b/core/model/src/main/java/com/android/mediproject/core/model/medicine/common/cancel/MedicineCancelStatusMapper.kt @@ -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() + } + } + } +} diff --git a/core/model/src/main/java/com/android/mediproject/core/model/medicine/common/cancel/MedicineCancelStatusType.kt b/core/model/src/main/java/com/android/mediproject/core/model/medicine/common/cancel/MedicineCancelStatusType.kt new file mode 100644 index 000000000..40902604a --- /dev/null +++ b/core/model/src/main/java/com/android/mediproject/core/model/medicine/common/cancel/MedicineCancelStatusType.kt @@ -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 +} diff --git a/core/model/src/main/java/com/android/mediproject/core/model/medicine/common/producttype/FilterMedicationProductType.kt b/core/model/src/main/java/com/android/mediproject/core/model/medicine/common/producttype/FilterMedicationProductType.kt new file mode 100644 index 000000000..e6353e5ec --- /dev/null +++ b/core/model/src/main/java/com/android/mediproject/core/model/medicine/common/producttype/FilterMedicationProductType.kt @@ -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 + } +} diff --git a/core/model/src/main/java/com/android/mediproject/core/model/medicine/common/producttype/MedicationProductType.kt b/core/model/src/main/java/com/android/mediproject/core/model/medicine/common/producttype/MedicationProductType.kt new file mode 100644 index 000000000..8aa0dac4e --- /dev/null +++ b/core/model/src/main/java/com/android/mediproject/core/model/medicine/common/producttype/MedicationProductType.kt @@ -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() + } +} diff --git a/core/model/src/main/java/com/android/mediproject/core/model/medicine/medicinedetailinfo/MedicineDetail.kt b/core/model/src/main/java/com/android/mediproject/core/model/medicine/medicinedetailinfo/MedicineDetail.kt index a1f8186a0..4de7d16d4 100644 --- a/core/model/src/main/java/com/android/mediproject/core/model/medicine/medicinedetailinfo/MedicineDetail.kt +++ b/core/model/src/main/java/com/android/mediproject/core/model/medicine/medicinedetailinfo/MedicineDetail.kt @@ -1,9 +1,12 @@ 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 /** * 의약품 상세 허가 정보 @@ -11,8 +14,7 @@ import java.time.LocalDate * @param atcCode ATC 코드 * @param barCode 바코드 * @param businessRegistrationNumber 사업자등록번호 - * @param cancelDate 취소일자 - * @param cancelName 취소명 + * @param cancelStatus 취소 상태 * @param changeDate 변경일자 * @param chart 성상 * @param consignmentManufacturer 제조및수입사 @@ -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 성분 이름입니다. @@ -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가 있는지 여부 @@ -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, @@ -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, @@ -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, @@ -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"), ) diff --git a/core/model/src/main/java/com/android/mediproject/core/model/recall/RecallSuspension.kt b/core/model/src/main/java/com/android/mediproject/core/model/recall/RecallSuspension.kt index db5a2d142..53c0cd96b 100644 --- a/core/model/src/main/java/com/android/mediproject/core/model/recall/RecallSuspension.kt +++ b/core/model/src/main/java/com/android/mediproject/core/model/recall/RecallSuspension.kt @@ -1,8 +1,8 @@ package com.android.mediproject.core.model.recall +import com.android.mediproject.core.model.DateTimeValue import com.android.mediproject.core.model.toLocalDate -import java.time.LocalDate /** @@ -22,8 +22,8 @@ data class RecallSuspension( val entrps: String, // 동국제약(주) val itemSeq: String, // 201208461 val product: String, // 니자틴캡슐(니자티딘) - val recallCommandDate: LocalDate?, // 20230504 - val destructionOrderDate: LocalDate?, // 20230503000000 + val recallCommandDate: DateTimeValue, // 20230504 + val destructionOrderDate: DateTimeValue, // 20230503000000 val reason: String, // 안정성 시험결과 NDMA 기준 초과에 따른 사전예방적 조치로 시중 유통품에 대해 영업자회수 var onClick: ((RecallSuspension) -> Unit)? = null, ) @@ -33,7 +33,7 @@ fun RecallSuspensionListResponse.Item.Item.toRecallSuspension() = RecallSuspensi entrps = entrps ?: "", itemSeq = itemSeq ?: "", product = product ?: "", - recallCommandDate = recallCommandDate?.toLocalDate("yyyyMMdd"), - destructionOrderDate = rtrlCommandDt?.toLocalDate("yyyyMMddHHmmss"), + recallCommandDate = recallCommandDate.toLocalDate("yyyyMMdd"), + destructionOrderDate = rtrlCommandDt.toLocalDate("yyyyMMddHHmmss"), reason = rtrvlResn ?: "", ) diff --git a/core/model/src/main/java/com/android/mediproject/core/model/requestparameters/ApprovalListSearchParameter.kt b/core/model/src/main/java/com/android/mediproject/core/model/requestparameters/ApprovalListSearchParameter.kt index 5060b1da7..97017f480 100644 --- a/core/model/src/main/java/com/android/mediproject/core/model/requestparameters/ApprovalListSearchParameter.kt +++ b/core/model/src/main/java/com/android/mediproject/core/model/requestparameters/ApprovalListSearchParameter.kt @@ -1,10 +1,10 @@ package com.android.mediproject.core.model.requestparameters -import com.android.mediproject.core.model.constants.MedicationType +import com.android.mediproject.core.model.medicine.common.producttype.FilterMedicationProductType import java.io.Serializable data class ApprovalListSearchParameter( val itemName: String?, val entpName: String?, - val medicationType: MedicationType, -) : Serializable \ No newline at end of file + val medicationProductType: FilterMedicationProductType, +) : Serializable diff --git a/core/model/src/main/java/com/android/mediproject/core/model/util/XMLParser.kt b/core/model/src/main/java/com/android/mediproject/core/model/util/XMLParser.kt index 4618c05cf..d37548342 100644 --- a/core/model/src/main/java/com/android/mediproject/core/model/util/XMLParser.kt +++ b/core/model/src/main/java/com/android/mediproject/core/model/util/XMLParser.kt @@ -19,8 +19,8 @@ private val factory = DocumentBuilderFactory.newInstance() * @return XML 파싱 결과 * */ -fun String?.parseXmlString(): XMLParsedResult { - if (this == null) return XMLParsedResult("", emptyList()) +fun String.parseXmlString(): XMLParsedResult { + if (isEmpty()) return XMLParsedResult() val doc = WeakReference(factory.newDocumentBuilder().parse(InputSource(StringReader(this)))).get()!! doc.documentElement.normalize() @@ -59,10 +59,11 @@ private fun getElementsByTagName(element: Element, tagName: String): List, + val title: String = "", + val articleList: List
= emptyList(), ) { + fun isEmpty(): Boolean = articleList.isEmpty() data class Article( diff --git a/core/model/src/main/res/values/strings.xml b/core/model/src/main/res/values/strings.xml new file mode 100644 index 000000000..6590e3014 --- /dev/null +++ b/core/model/src/main/res/values/strings.xml @@ -0,0 +1,9 @@ + + + 취하 + 유효기간만료 + 정상 + 일반 의약품 + 전문 의약품 + 모두 + diff --git a/feature/search/src/main/java/com/android/mediproject/feature/search/result/ai/AiSearchResultViewModel.kt b/feature/search/src/main/java/com/android/mediproject/feature/search/result/ai/AiSearchResultViewModel.kt index 0f3c3ae88..87e8423e1 100644 --- a/feature/search/src/main/java/com/android/mediproject/feature/search/result/ai/AiSearchResultViewModel.kt +++ b/feature/search/src/main/java/com/android/mediproject/feature/search/result/ai/AiSearchResultViewModel.kt @@ -80,7 +80,7 @@ class AiSearchResultViewModel @Inject constructor( itemEngName = e.itemEnglishName, itemSeq = e.itemSequence.toLong(), productType = e.industryType, - medicineType = e.etcOtcCode, + medicineType = e.medicationProductType, imgUrl = e.insertFileUrl, ), ), diff --git a/feature/search/src/main/java/com/android/mediproject/feature/search/result/manual/ManualSearchResultFragment.kt b/feature/search/src/main/java/com/android/mediproject/feature/search/result/manual/ManualSearchResultFragment.kt index 4a4f33784..11060a18d 100644 --- a/feature/search/src/main/java/com/android/mediproject/feature/search/result/manual/ManualSearchResultFragment.kt +++ b/feature/search/src/main/java/com/android/mediproject/feature/search/result/manual/ManualSearchResultFragment.kt @@ -9,7 +9,8 @@ import androidx.navigation.findNavController import androidx.recyclerview.widget.DividerItemDecoration import com.android.mediproject.core.common.paging.setOnStateChangedListener import com.android.mediproject.core.common.util.deepNavigate -import com.android.mediproject.core.model.constants.MedicationType +import com.android.mediproject.core.common.viewmodel.repeatOnStarted +import com.android.mediproject.core.model.medicine.common.producttype.FilterMedicationProductType import com.android.mediproject.core.model.navargs.MedicineInfoArgs import com.android.mediproject.core.ui.base.BaseFragment import com.android.mediproject.core.ui.base.view.listfilter.MediPopupMenu @@ -20,7 +21,6 @@ import com.android.mediproject.feature.search.result.EventState import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.launch -import com.android.mediproject.core.common.viewmodel.repeatOnStarted @AndroidEntryPoint class ManualSearchResultFragment : @@ -65,11 +65,11 @@ class ManualSearchResultFragment : MediPopupMenu.showMenu(it, R.menu.search_result_list_filter_menu) { menuItem -> when (menuItem.itemId) { - R.id.listOnlySpecialtyMedicines -> fragmentViewModel.searchMedicinesByMedicationType(MedicationType.SPECIALTY) + R.id.listOnlySpecialtyMedicines -> fragmentViewModel.searchMedicinesByMedicationType(FilterMedicationProductType.SPECIALTY) - R.id.listOnlyGenericMedicines -> fragmentViewModel.searchMedicinesByMedicationType(MedicationType.GENERAL) + R.id.listOnlyGenericMedicines -> fragmentViewModel.searchMedicinesByMedicationType(FilterMedicationProductType.GENERAL) - R.id.listAllMedicines -> fragmentViewModel.searchMedicinesByMedicationType(MedicationType.ALL) + R.id.listAllMedicines -> fragmentViewModel.searchMedicinesByMedicationType(FilterMedicationProductType.ALL) } true } diff --git a/feature/search/src/main/java/com/android/mediproject/feature/search/result/manual/ManualSearchResultViewModel.kt b/feature/search/src/main/java/com/android/mediproject/feature/search/result/manual/ManualSearchResultViewModel.kt index 7acedb371..f88719cf9 100644 --- a/feature/search/src/main/java/com/android/mediproject/feature/search/result/manual/ManualSearchResultViewModel.kt +++ b/feature/search/src/main/java/com/android/mediproject/feature/search/result/manual/ManualSearchResultViewModel.kt @@ -9,9 +9,9 @@ import com.android.mediproject.core.common.network.MediDispatchers import com.android.mediproject.core.common.viewmodel.MutableEventFlow import com.android.mediproject.core.common.viewmodel.asEventFlow import com.android.mediproject.core.domain.GetMedicineApprovalListUseCase -import com.android.mediproject.core.model.constants.MedicationType -import com.android.mediproject.core.model.navargs.MedicineInfoArgs +import com.android.mediproject.core.model.medicine.common.producttype.FilterMedicationProductType import com.android.mediproject.core.model.medicine.medicineapproval.ApprovedMedicine +import com.android.mediproject.core.model.navargs.MedicineInfoArgs import com.android.mediproject.core.model.requestparameters.ApprovalListSearchParameter import com.android.mediproject.core.ui.base.BaseViewModel import com.android.mediproject.feature.search.result.EventState @@ -40,7 +40,7 @@ class ManualSearchResultViewModel @Inject constructor( ) : BaseViewModel(), ISendEvent { private val _searchParameter = - MutableStateFlow(ApprovalListSearchParameter(itemName = null, entpName = null, medicationType = MedicationType.ALL)) + MutableStateFlow(ApprovalListSearchParameter(itemName = null, entpName = null, medicationProductType = FilterMedicationProductType.ALL)) val searchParameter = _searchParameter.asStateFlow() val searchResultFlow = searchParameter.flatMapLatest { @@ -83,10 +83,10 @@ class ManualSearchResultViewModel @Inject constructor( /** * 의약품 유형으로 검색 */ - fun searchMedicinesByMedicationType(medicationType: MedicationType) { + fun searchMedicinesByMedicationType(medicationProductType: FilterMedicationProductType) { viewModelScope.launch { _searchParameter.update { - it.copy(medicationType = medicationType) + it.copy(medicationProductType = medicationProductType) } } } diff --git a/feature/search/src/main/res/layout/ai_medicine_item.xml b/feature/search/src/main/res/layout/ai_medicine_item.xml index dc69b808f..365ecc666 100644 --- a/feature/search/src/main/res/layout/ai_medicine_item.xml +++ b/feature/search/src/main/res/layout/ai_medicine_item.xml @@ -113,7 +113,7 @@ android:layout_height="wrap_content" android:background="@drawable/medicine_type_background" android:maxLines="1" - android:text="@{item.medicineDetail.etcOtcCode}" + android:text="@{item.medicineDetail.medicationProductType}" android:textColor="@color/medicineType" android:textSize="11sp" app:layout_constraintLeft_toRightOf="@id/medicineNameTextView" diff --git a/feature/search/src/main/res/layout/fragment_manual_search_result.xml b/feature/search/src/main/res/layout/fragment_manual_search_result.xml index 82cf6ed05..f84557973 100644 --- a/feature/search/src/main/res/layout/fragment_manual_search_result.xml +++ b/feature/search/src/main/res/layout/fragment_manual_search_result.xml @@ -1,22 +1,19 @@ + xmlns:app="http://schemas.android.com/apk/res-auto"> - + + type="com.android.mediproject.feature.search.result.manual.ManualSearchResultViewModel" /> + android:layout_height="match_parent"> + app:medicationTypeText="@{viewModel.searchParameter.medicationProductType}" /> + app:layout_constraintTop_toBottomOf="@id/filterBtn" /> - \ No newline at end of file +