下面的代码中【override fun onEvent(event: JafEvent)】报错,
【Conflicting overloads:
fun onEvent(event: JafEvent): Unit
fun onEvent(event: JafEvent): Unit】,请问应该怎么解决?
package jp.or.jaf.syg.feature.jafrsho01.jafrsho01020
import androidx.compose.material3.MaterialTheme
import androidx.compose.runtime.Composable
import androidx.compose.ui.text.input.PasswordVisualTransformation
import androidx.compose.ui.text.input.VisualTransformation
import dagger.hilt.android.lifecycle.HiltViewModel
import jp.or.jaf.syg.core.common.base.JafViewModel
import jp.or.jaf.syg.core.common.event.JafAction
import jp.or.jaf.syg.core.common.event.JafEvent
import jp.or.jaf.syg.core.common.util.JsonUtils
import jp.or.jaf.syg.core.designsystem.theme.resources
import jp.or.jaf.syg.domain.exception.StandardBusinessException.BusinessException
import jp.or.jaf.syg.domain.message.Message
import jp.or.jaf.syg.domain.model.jafrshs99.SendIFInfo
import jp.or.jaf.syg.domain.model.jafrshs99.SendResultModel
import jp.or.jaf.syg.domain.model.request.JAFRSJS05580IF01Req
import jp.or.jaf.syg.domain.repository.jafrsho01.IJAFRSHO01020Repository
import jp.or.jaf.syg.domain.usecase.jafrsho01.jafrsho01020.IJAFRSHO01020E004UseCase
import jp.or.jaf.syg.domain.usecase.jafrshs99.jafrshs99020.IJAFRSHS99020P001UseCase
import jp.or.jaf.syg.feature.jafrsho01.jafrsho01020.mappers.toPwModifyInfoInModel
import javax.inject.Inject
/**
* 【画面仕様: JAFRSHO01020】パスワード変更ポップアップのViewModel実装
*/
@HiltViewModel
class JAFRSHO01020ViewModel @Inject constructor(
/** IF送信処理UseCase */
private val jAFRSHS99020P001UseCase: IJAFRSHS99020P001UseCase,
/** 確定 - 押下UseCase */
private val jAFRSHO01020E004UseCase: IJAFRSHO01020E004UseCase,
/** JAFRSHO01020 パスワード変更リポジトリ */
private val jAFRSHO01020Repository: IJAFRSHO01020Repository,
) : JafViewModel<JAFRSHO01020UiStateData>() {
/**
* 定数(設計書準拠)
*/
companion object {
/** 最小パスワード入力桁数 */
private const val MIN_INPUT_LENGTH = 8
/** 最大パスワード入力桁数 */
private const val MAX_INPUT_LENGTH = 20
/** 連続文字制限 */
private const val RENZOKU_SEIGEN_LENGTH: Int = 3
}
/**
* パスワード表示モード列挙型
* 設計書の定数に対応
*/
enum class PasswordDisplayMode {
/** マスク表示 */
MASK_DSP,
/** パスワード表示 */
PW_DSP
}
/**
* システムイベント処理
* @param event 基本イベントクラス
*/
@Composable
override fun onEvent(event: JafEvent) {
when (event) {
is JafEvent.Companion.InitializeWithParameters<*> -> {
// パラメータ付き初期化(編集画面等)
// 画面設計書記載のパラメータ付き初期表示処理
val params = event.params as? JAFRSHO01020Model
onPopupDisplay(
params?.userCdParam ?: "",
params?.henkouMaePwParam ?: "",
params?.pwValidKigenDaysParam ?: 0,
)
}
}
}
/**
* アクション処理
*
* @param action 基本アクションクラス
*/
override fun onAction(action: JafAction) {
when (action) {
// JAFRSHO01020E002 ×(閉じる) - 押下
is JAFRSHO01020Action.WindowClose -> {
onWindowClose()
}
// JAFRSHO01020E003 閉じる - 押下
is JAFRSHO01020Action.Close -> {
onClose()
}
// JAFRSHO01020E004 確定 - 押下
is JAFRSHO01020Action.Confirm -> {
launchWithLoading {
onConfirm(
action.userCdParam,
action.henkouMaePwParam,
action.pwValidKigenDaysParam,
)
}
}
// JAFRSHO01020E005 新パスワード表示切替アイコン - 押下
is JAFRSHO01020Action.NewPwDspSwitch -> {
onNewPwDspSwitch()
}
// JAFRSHO01020E006 確認用パスワード表示切替アイコン - 押下
is JAFRSHO01020Action.ConfirmPwDspSwitch -> {
onConfirmPwDspSwitch()
}
// JAFRSHO01020E007 - 新パスワード - 入力
is JAFRSHO01020Action.UpdateNewPassword -> {
val currentData: JAFRSHO01020UiStateData =
getCurrentData() ?: JAFRSHO01020UiStateData()
onNewPasswordUpdate(currentData.txtboxNewPw)
}
// JAFRSHO01020E008 - 確認用パスワード - 入力
is JAFRSHO01020Action.UpdateConfirmPassword -> {
val currentData: JAFRSHO01020UiStateData =
getCurrentData() ?: JAFRSHO01020UiStateData()
onConfirmPasswordUpdate(currentData.txtboxConfirmPw)
}
}
}
/**
* 【処理仕様: JAFRSHO01020E001】画面表示処理
* @param userCdParam ユーザーコード
* @param henkouMaePwParam 変更前パスワード
* @param pwValidKigenDaysParam パスワード有効期限日数
*/
@Composable
private fun onPopupDisplay(
userCdParam: String,
henkouMaePwParam: String,
pwValidKigenDaysParam: Int
) {
val currentData: JAFRSHO01020UiStateData = getCurrentData() ?: JAFRSHO01020UiStateData()
// パラメータ付き初期化を実行
setSuccess(
currentData.copy(
txtboxNewPw = "",
txtboxConfirmPw = "",
newPwDspSwitch = PasswordDisplayMode.MASK_DSP,
confirmPwDspSwitch = PasswordDisplayMode.MASK_DSP,
newPwDspSwitchIcon = MaterialTheme.resources.pwDspButton().toString(),
txtboxNewPwDspInfo = VisualTransformation.None,
confirmPwDspSwitchIcon = MaterialTheme.resources.pwDspButton().toString(),
txtboxConfirmPwDspInfo = VisualTransformation.None
)
)
}
/**
* 【処理仕様: JAFRSHO01020E002】×(閉じる) - 押下処理
*/
private fun onWindowClose() {
// パスワード変更ポップアップを閉じる
navigateBack()
}
/**
* 【処理仕様: JAFRSHO01020E003】閉じる - 押下処理
*/
private fun onClose() {
// パスワード変更ポップアップを閉じる
navigateBack()
}
/**
* 【処理仕様: JAFRSHO01020E004】確定 - 押下処理
*
* @param userCdParam ユーザーコード
* @param henkouMaePwParam 変更前パスワード
* @param pwValidKigenDaysParam パスワード有効期限日数
*/
private suspend fun onConfirm(
userCdParam: String,
henkouMaePwParam: String,
pwValidKigenDaysParam: Int
) {
// 入力チェックを実施する。
val currentData: JAFRSHO01020UiStateData = getCurrentData() ?: JAFRSHO01020UiStateData()
val txtboxNewPw = currentData.txtboxNewPw
val txtboxConfirmPw = currentData.txtboxConfirmPw
val userCdParam = userCdParam
val henkouMaePwParam = henkouMaePwParam
// 新パスワード未入力チェック
if (txtboxNewPw.isNullOrEmpty()) {
showMessage(
Message.JAFRSHO99010WC00005.id,
listOf("新パスワード"),
onOk = {
// 「OK」ボタンを押下した場合、処理を終了する。
}
)
return
}
// 新パスワード桁数チェック
if (txtboxNewPw.length < MIN_INPUT_LENGTH || txtboxNewPw.length > MAX_INPUT_LENGTH) {
showMessage(
Message.JAFRSHO99010WC00110.id,
listOf(""),
onOk = {
// 「OK」ボタンを押下した場合、処理を終了する。
}
)
return
}
// 新パスワード強度チェック
// 項目定義.txtboxNewPw(新パスワード)に 引数.userCdParam(ユーザーコード)の連続する3文字以上が含まれる
var isConsecutiveCharactersFlg = false
if (userCdParam.length < RENZOKU_SEIGEN_LENGTH) {
isConsecutiveCharactersFlg = false
}
for (i in 0..userCdParam.length - RENZOKU_SEIGEN_LENGTH) {
val sequence = userCdParam.substring(i, i + RENZOKU_SEIGEN_LENGTH)
if (txtboxNewPw.contains(sequence, ignoreCase = true)) {
isConsecutiveCharactersFlg = true
}
}
// 項目定義.txtboxNewPw(新パスワード).matches(Regex("^[^a-zA-Z0-9]+$")) ||
// ※(英小文字 OR 英大文字 OR 数字)が含まれていない
// 項目定義.txtboxNewPw(新パスワード)に 引数.userCdParam(ユーザーコード)の連続する3文字以上が含まれる
// 項目定義.txtboxNewPw(新パスワード) == 引数.henkouMaePwParam(変更前パスワード)
if ((txtboxNewPw.matches(Regex("^[^a-zA-Z0-9]+$"))) ||
isConsecutiveCharactersFlg ||
txtboxNewPw == henkouMaePwParam
) {
showMessage(
Message.JAFRSHO99010WC00111.id,
listOf(""),
onOk = {
// 「OK」ボタンを押下した場合、処理を終了する。
}
)
return
}
// 確認用パスワード未入力チェック
if (txtboxConfirmPw.isEmpty()) {
showMessage(
Message.JAFRSHO99010WC00005.id,
listOf("確認用パスワード"),
onOk = {
// 「OK」ボタンを押下した場合、処理を終了する。
}
)
return
}
// 新パスワードと一致するかチェック
if (txtboxNewPw != txtboxConfirmPw) {
showMessage(
Message.JAFRSHO99010WC00112.id,
listOf(""),
onOk = {
// 「OK」ボタンを押下した場合、処理を終了する。
}
)
return
}
try {
val currentData: JAFRSHO01020UiStateData = getCurrentData() ?: JAFRSHO01020UiStateData()
val txtboxNewPw = currentData.txtboxNewPw
val userCdParam = userCdParam
// 車載連携アプリにパスワード世代確認処理を送信する。
val sendIFInfoTmp1: SendIFInfo<JAFRSJS05580IF01Req> = SendIFInfo(
cdIf = "JAFRSJS05580IF01",
JSON = JAFRSJS05580IF01Req(
// ユーザーコード
cdUser = userCdParam,
// パスワード
password = txtboxNewPw,
),
serializer = JAFRSJS05580IF01Req.serializer()
)
// IF送信処理を実施する。
// TODO IF送信処理に問題がありますので、一旦送信処理コメント
val sendResultModelTmp1: SendResultModel =
invoke {
jAFRSHS99020P001UseCase(sendIFInfoTmp1)
}
if (sendResultModelTmp1.isIfSendSuccess) {
if (JsonUtils.getJsonValue(
sendResultModelTmp1.resultJSON,
"searchResult",
) == "0"
) {
// 何もしない
} else {
// 業務共通部品(メッセージダイアログ)を呼び出す
showMessage(
Message.JAFRSHO99010WC00111.id,
listOf(""),
onOk = {
// 「OK」ボタンを押下した場合、処理を終了する。
}
)
return
}
} else {
throw BusinessException(
messageId = sendResultModelTmp1.messageID,
params = listOf(sendResultModelTmp1.errCd),
operator = "IF送信処理失敗"
)
}
// 有効なユーザーか確認用件数を取得する。
// 有効なユーザーであるか確認する。
// 有効なユーザーか確認用件数を取得する。
val validUserCntTmp: Int =
jAFRSHO01020Repository.getValidUserCnt(userCdParam)
if (validUserCntTmp < 1) {
// 業務共通部品(メッセージダイアログ)を呼び出す
showMessage(
Message.JAFRSHO99010WC00113.id,
listOf(""),
onOk = {
// 「OK」ボタンを押下した場合、処理を終了する。
}
)
} else {
// 業務共通部品(メッセージダイアログ)を呼び出す
showMessage(
Message.JAFRSHO99010IC00228.id,
// 「いいえ」ボタンを押下した場合
onNo = {
// その他操作ボタンポップアップを閉じる。
},
// 「はい」ボタンを押下した場合
onYes = {
launchWithLoading("") {
val currentData: JAFRSHO01020UiStateData =
getCurrentData() ?: JAFRSHO01020UiStateData()
val txtboxNewPw = currentData.txtboxNewPw
// JAFRSHO01020E004UseCaseに渡す引数を設定する。
val pwModifyInfoInModel = currentData.toPwModifyInfoInModel(
userCdParam,
txtboxNewPw,
pwValidKigenDaysParam
)
// パスワード更新処理を行う。
invoke {
jAFRSHO01020E004UseCase(pwModifyInfoInModel)
}
}
}
)
}
// パスワード更新処理を行う。
val pwModifyInfoInModel = currentData.toPwModifyInfoInModel(
userCdParam,
txtboxNewPw,
pwValidKigenDaysParam
)
invoke {
jAFRSHO01020E004UseCase(pwModifyInfoInModel)
}
// パスワード変更ポップアップを閉じる
navigateBack()
} catch (ex: BusinessException) {
showMessage(
ex.messageId,
ex.message?.let { listOf(it) } ?: emptyList()
)
return
}
}
/**
* 【処理仕様: JAFRSHO01020E005】新パスワード表示切替アイコン - 押下処理
*/
private fun onNewPwDspSwitch() {
val currentData: JAFRSHO01020UiStateData = getCurrentData() ?: JAFRSHO01020UiStateData()
// インスタンス変数.新パスワード表示切替が定数.マスク表示の場合
if (currentData.newPwDspSwitch == PasswordDisplayMode.MASK_DSP) {
updateSuccess { currentData ->
currentData.copy(
newPwDspSwitch = PasswordDisplayMode.PW_DSP,
newPwDspSwitchIcon = MaterialTheme.resources.pwDspButton().toString(),
txtboxNewPwDspInfo = VisualTransformation.None
)
}
// インスタンス変数.新パスワード表示切替が定数.パスワード表示の場合
} else if (currentData.newPwDspSwitch == PasswordDisplayMode.PW_DSP) {
updateSuccess { currentData ->
currentData.copy(
newPwDspSwitch = PasswordDisplayMode.MASK_DSP,
newPwDspSwitchIcon = MaterialTheme.resources.maskDspButton().toString(),
txtboxNewPwDspInfo = PasswordVisualTransformation('※')
)
}
} else {
// 何もしない
}
}
/**
* 【処理仕様: JAFRSHO01020E006】確認用パスワード表示切替アイコン - 押下処理
*/
private fun onConfirmPwDspSwitch() {
val currentData: JAFRSHO01020UiStateData = getCurrentData() ?: JAFRSHO01020UiStateData()
// インスタンス変数.確認用パスワード表示切替が定数.マスク表示の場合
if (currentData.confirmPwDspSwitch == PasswordDisplayMode.MASK_DSP) {
updateSuccess { currentData ->
currentData.copy(
confirmPwDspSwitch = PasswordDisplayMode.PW_DSP,
confirmPwDspSwitchIcon = MaterialTheme.resources.pwDspButton().toString(),
txtboxConfirmPwDspInfo = VisualTransformation.None
)
}
// インスタンス変数.確認用パスワード表示切替が定数.パスワード表示の場合
} else if (currentData.confirmPwDspSwitch == PasswordDisplayMode.PW_DSP) {
updateSuccess { currentData ->
currentData.copy(
confirmPwDspSwitch = PasswordDisplayMode.MASK_DSP,
confirmPwDspSwitchIcon = MaterialTheme.resources.maskDspButton().toString(),
txtboxConfirmPwDspInfo = PasswordVisualTransformation('※')
)
}
} else {
// 何もしない
}
}
/**
* 新パスワード入力更新
* @param newPassword 新パスワード
*/
private fun onNewPasswordUpdate(newPassword: String) {
val currentData = getCurrentData()
if (currentData != null) {
setSuccess(currentData.copy(txtboxNewPw = newPassword))
}
}
/**
* 確認用パスワード入力更新
* @param confirmPassword 確認用パスワード
*/
private fun onConfirmPasswordUpdate(confirmPassword: String) {
val currentData = getCurrentData()
if (currentData != null) {
setSuccess(currentData.copy(txtboxConfirmPw = confirmPassword))
}
}
}