Compare commits

...

2 Commits

Author SHA1 Message Date
60478327e2 fix: 修复图片二次编辑丢失旧图及预览模糊问题
- 国内进港移交编辑:loadData 时同时从 pic/originalPic 构建
  FileBean,确保二次编辑保存时原有图片不被覆盖
- 国际事故签证:loadDetail 改用 originalPic URL 作为 FileBean.path,
  保证全屏预览取原图而非缩略图;同时修正保存时 pic/originalPic 字段赋值颠倒的问题

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-15 15:02:54 +08:00
1d2b11bfd2 refactor: 确保舱单编辑页保存时始终传递 no 和 prefix 参数
重构 GjjManifestAddViewModel 的参数构建方式:
- 改用 mutableMapOf 手动处理可选字段,替代 removeEmptyOrNull = true
- 编辑模式下 mfId、no、prefix 单独追加,不受空字符串过滤影响

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-15 14:50:28 +08:00
3 changed files with 52 additions and 30 deletions

View File

@@ -373,11 +373,10 @@ class GjjManifestAddViewModel : BaseViewModel() {
return return
} }
val params = mapOf( val isModify = pageType.value == DetailsPageType.Modify
"mfId" to if (pageType.value == DetailsPageType.Modify) mfId else null,
val paramsMap = mutableMapOf<String, Any?>(
"fid" to fid, "fid" to fid,
"no" to if (pageType.value == DetailsPageType.Modify) no else null,
"prefix" to if (pageType.value == DetailsPageType.Modify) prefix else null,
"wbNo" to waybillNo.value, "wbNo" to waybillNo.value,
"agentCode" to agent.value, "agentCode" to agent.value,
"spCode" to specialCode.value.let { if (it.isNullOrEmpty()) "NOR" else it }, "spCode" to specialCode.value.let { if (it.isNullOrEmpty()) "NOR" else it },
@@ -386,19 +385,30 @@ class GjjManifestAddViewModel : BaseViewModel() {
"pc" to actualNum.value, "pc" to actualNum.value,
"weight" to actualWeight.value, "weight" to actualWeight.value,
"cashWeight" to billingWeight.value, "cashWeight" to billingWeight.value,
"packageType" to packageType.value,
"origin" to departure.value, "origin" to departure.value,
"dest" to destination.value, "dest" to destination.value,
"goods" to goodsNameEn.value, "goods" to goodsNameEn.value,
"goodsCn" to goodsNameCn.value, "goodsCn" to goodsNameCn.value,
"awbType" to waybillType.value, "awbType" to waybillType.value,
"cargoType" to goodsType.value, )
"unNumber" to unNumber.value,
"remark" to remark.value, // 可选字段:非空时才传
).toRequestBody(removeEmptyOrNull = true) if (!packageType.value.isNullOrEmpty()) paramsMap["packageType"] = packageType.value
if (!goodsType.value.isNullOrEmpty()) paramsMap["cargoType"] = goodsType.value
if (!unNumber.value.isNullOrEmpty()) paramsMap["unNumber"] = unNumber.value
if (!remark.value.isNullOrEmpty()) paramsMap["remark"] = remark.value
// 编辑模式:必须传 mfId、no、prefix不受空字符串过滤影响
if (isModify) {
paramsMap["mfId"] = mfId
paramsMap["no"] = no
paramsMap["prefix"] = prefix
}
val params = paramsMap.toRequestBody()
launchLoadingCollect({ launchLoadingCollect({
if (pageType.value == DetailsPageType.Modify) { if (isModify) {
NetApply.api.gjjManifestUpdate(params) NetApply.api.gjjManifestUpdate(params)
} else { } else {
NetApply.api.gjjManifestInsert(params) NetApply.api.gjjManifestInsert(params)
@@ -406,7 +416,7 @@ class GjjManifestAddViewModel : BaseViewModel() {
}) { }) {
onSuccess = { onSuccess = {
if (it.verifySuccess()) { if (it.verifySuccess()) {
val successMsg = if (pageType.value == DetailsPageType.Modify) "修改成功" else "保存成功" val successMsg = if (isModify) "修改成功" else "保存成功"
showToast(successMsg) showToast(successMsg)
// 发送刷新事件 // 发送刷新事件

View File

@@ -144,20 +144,19 @@ class IntImpAccidentVisaEditViewModel : BaseViewModel(), IOnItemClickListener {
onSuccess = { onSuccess = {
dataBean.value = it.data ?: GjAccidentVisaEditBean() dataBean.value = it.data ?: GjAccidentVisaEditBean()
// 渲染图片 // 渲染图片path 取原图 URL 确保预览清晰url 取缩略图用于提交
val bean = dataBean.value!! val bean = dataBean.value!!
val picList = bean.pic.split(",") val picList = bean.pic.split(",").filter { it.isNotEmpty() }
.filter { url -> url.isNotEmpty() } val originalList = bean.originalPic.split(",").filter { it.isNotEmpty() }
.map { url -> FileBean(MediaUtil.fillUrl(url), url) } val images = picList.mapIndexed { index, picUrl ->
val originalList = bean.originalPic.split(",") val originalUrl = originalList.getOrElse(index) { picUrl }
.filter { url -> url.isNotEmpty() } FileBean(
.map { url -> FileBean(MediaUtil.fillUrl(url)) } path = MediaUtil.fillUrl(originalUrl),
for ((index, fileBean) in picList.withIndex()) { url = picUrl,
if (index < originalList.size) { originalPic = originalUrl
picList[index].originalPic = originalList[index].path )
}
} }
rv?.commonAdapter()?.loadMore(picList) rv?.commonAdapter()?.loadMore(images)
// 详情模式下无图片时显示占位提示 // 详情模式下无图片时显示占位提示
if (isDetailMode.value == true && picList.isEmpty()) { if (isDetailMode.value == true && picList.isEmpty()) {
@@ -292,8 +291,8 @@ class IntImpAccidentVisaEditViewModel : BaseViewModel(), IOnItemClickListener {
val list = (rv?.commonAdapter()?.items as List<FileBean>) val list = (rv?.commonAdapter()?.items as List<FileBean>)
.filter { it.path.isNotEmpty() } .filter { it.path.isNotEmpty() }
bean.picNumber = list.size.toString() bean.picNumber = list.size.toString()
bean.originalPic = list.joinToString(separator = ",") { MediaUtil.removeUrl(it.url) } bean.pic = list.joinToString(separator = ",") { MediaUtil.removeUrl(it.url) }
bean.pic = list.joinToString(separator = ",") { MediaUtil.removeUrl(it.originalPic) } bean.originalPic = list.joinToString(separator = ",") { MediaUtil.removeUrl(it.originalPic) }
bean.idFlag = "1" bean.idFlag = "1"
if (pageType.value == DetailsPageType.Add) { if (pageType.value == DetailsPageType.Add) {

View File

@@ -62,10 +62,23 @@ class GnjYiKuHandoverViewModel : BaseViewModel(), IOnItemClickListener {
val bean = it.data ?: GnjYiKuBean() val bean = it.data ?: GnjYiKuBean()
dataBean.value = bean dataBean.value = bean
// 处理图片列表(拼接完整 URL // 处理图片列表(同时保留缩略图和原图信息,确保二次编辑时不丢失
val images = bean.getImageList().map { url -> val picList = bean.pic.split(",").filter { it.isNotEmpty() }
FileBean(path = MediaUtil.fillUrl(url), url = url) val originalPicList = bean.originalPic.split(",").filter { it.isNotEmpty() }
}.toMutableList() val images = if (picList.isNotEmpty()) {
picList.mapIndexed { index, picUrl ->
val originalUrl = originalPicList.getOrElse(index) { picUrl }
FileBean(
path = MediaUtil.fillUrl(originalUrl),
url = picUrl,
originalPic = originalUrl
)
}.toMutableList()
} else {
originalPicList.map { url ->
FileBean(path = MediaUtil.fillUrl(url), url = url, originalPic = url)
}.toMutableList()
}
// 编辑模式添加空 FileBean 用于显示"添加照片"按钮 // 编辑模式添加空 FileBean 用于显示"添加照片"按钮
if (pageType.value == DetailsPageType.Modify) { if (pageType.value == DetailsPageType.Modify) {
@@ -75,7 +88,7 @@ class GnjYiKuHandoverViewModel : BaseViewModel(), IOnItemClickListener {
imageList.value = images imageList.value = images
// 详情模式下无图片时显示占位提示 // 详情模式下无图片时显示占位提示
if (pageType.value == DetailsPageType.Details && bean.getImageList().isEmpty()) { if (pageType.value == DetailsPageType.Details && images.isEmpty()) {
showNoImage.value = true showNoImage.value = true
} }
} }