From 2dd093d2bed65dd933ca01afb5ec1a740b05f069 Mon Sep 17 00:00:00 2001 From: YANGJIANKUAN Date: Wed, 12 Nov 2025 14:09:55 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=9B=BD=E5=86=85=E8=BF=9B=E6=B8=AF?= =?UTF-8?q?=E7=A7=BB=E5=BA=93=20ui?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .claude/settings.local.json | 22 + CLAUDE.md | 501 ++++++++++++++++++ .../aerologic/ui/fragment/HomeFragment.kt | 3 +- .../lukouguoji/module_base/LoginActivity.kt | 6 + .../module_base/bean/GnjYiKuBean.kt | 50 ++ .../lukouguoji/module_base/common/Constant.kt | 3 + .../module_base/common/ConstantEvent.kt | 3 + .../lukouguoji/module_base/http/net/Api.kt | 20 + .../module_base/router/ARouterConstants.kt | 7 +- module_gnj/src/main/AndroidManifest.xml | 26 + module_gnj/src/main/debug/AndroidManifest.xml | 19 + .../yiku/details/GnjYiKuDetailsActivity.kt | 45 ++ .../yiku/details/GnjYiKuDetailsViewModel.kt | 51 ++ .../gnj/page/yiku/edit/GnjYiKuEditActivity.kt | 72 +++ .../page/yiku/edit/GnjYiKuEditViewModel.kt | 168 ++++++ .../gnj/page/yiku/list/GnjYiKuListActivity.kt | 53 ++ .../page/yiku/list/GnjYiKuListViewHolder.kt | 23 + .../page/yiku/list/GnjYiKuListViewModel.kt | 223 ++++++++ .../src/main/release/AndroidManifest.xml | 19 + .../res/layout/activity_gnj_yiku_details.xml | 338 ++++++++++++ .../res/layout/activity_gnj_yiku_edit.xml | 277 ++++++++++ .../res/layout/activity_gnj_yiku_list.xml | 87 ++- .../main/res/layout/item_gnj_yiku_list.xml | 289 +++++----- 23 files changed, 2123 insertions(+), 182 deletions(-) create mode 100644 .claude/settings.local.json create mode 100644 module_base/src/main/java/com/lukouguoji/module_base/bean/GnjYiKuBean.kt create mode 100644 module_gnj/src/main/AndroidManifest.xml create mode 100644 module_gnj/src/main/java/com/lukouguoji/gnj/page/yiku/details/GnjYiKuDetailsActivity.kt create mode 100644 module_gnj/src/main/java/com/lukouguoji/gnj/page/yiku/details/GnjYiKuDetailsViewModel.kt create mode 100644 module_gnj/src/main/java/com/lukouguoji/gnj/page/yiku/edit/GnjYiKuEditActivity.kt create mode 100644 module_gnj/src/main/java/com/lukouguoji/gnj/page/yiku/edit/GnjYiKuEditViewModel.kt create mode 100644 module_gnj/src/main/java/com/lukouguoji/gnj/page/yiku/list/GnjYiKuListActivity.kt create mode 100644 module_gnj/src/main/java/com/lukouguoji/gnj/page/yiku/list/GnjYiKuListViewHolder.kt create mode 100644 module_gnj/src/main/java/com/lukouguoji/gnj/page/yiku/list/GnjYiKuListViewModel.kt create mode 100644 module_gnj/src/main/res/layout/activity_gnj_yiku_details.xml create mode 100644 module_gnj/src/main/res/layout/activity_gnj_yiku_edit.xml rename app/src/main/res/layout/activity_gnj_out_stash_list.xml => module_gnj/src/main/res/layout/activity_gnj_yiku_list.xml (71%) rename app/src/main/res/layout/item_gnj_out_stash_list.xml => module_gnj/src/main/res/layout/item_gnj_yiku_list.xml (76%) diff --git a/.claude/settings.local.json b/.claude/settings.local.json new file mode 100644 index 0000000..821ff7c --- /dev/null +++ b/.claude/settings.local.json @@ -0,0 +1,22 @@ +{ + "permissions": { + "allow": [ + "mcp__playwright__browser_navigate", + "mcp__chrome-devtools__new_page", + "mcp__chrome-devtools__wait_for", + "mcp__chrome-devtools__take_screenshot", + "mcp__chrome-devtools__click", + "mcp__chrome-devtools__navigate_page", + "mcp__chrome-devtools__take_snapshot", + "Bash(./gradlew:*)", + "Bash(find:*)", + "Bash(cat:*)", + "Bash(tree:*)", + "Bash(git mv:*)", + "Bash(git checkout:*)", + "Bash(tee:*)" + ], + "deny": [], + "ask": [] + } +} diff --git a/CLAUDE.md b/CLAUDE.md index cca4eeb..41c0dca 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -2509,3 +2509,504 @@ PictureSelector.create(this) - ✅ 使用DataBinding简化代码 - ✅ 利用扩展函数处理通用逻辑 - ✅ 不重复造轮子,保持架构一致性 + +--- + +## 常见编译错误及解决方案 + +### 1. DataBinding错误:Cannot resolve type 'DetailsPageType' + +**错误信息**: +``` +ERROR: Cannot resolve type 'DetailsPageType' file://app/src/main/res/layout/activity_xxx.xml Line:XX +``` + +**错误原因**: +在XML布局文件中import的包名错误。 + +**错误示例**: +```xml + +``` + +**正确写法**: +```xml + +``` + +**注意**: `DetailsPageType`位于`common`包,不是`constant`包! + +--- + +### 2. DataBinding错误:Could not find accessor DataLayoutType.INTEGER + +**错误信息**: +``` +ERROR: Could not find accessor com.lukouguoji.module_base.ui.weight.data.layout.DataLayoutType.INTEGER +``` + +**错误原因**: +`DataLayoutType`枚举中不存在`INTEGER`类型。 + +**错误示例**: +```xml + +``` + +**正确写法**: +```xml + +``` + +**可用类型**: +- `DataLayoutType.INPUT` - 文本输入(可输入数字) +- `DataLayoutType.SPINNER` - 下拉选择 +- `DataLayoutType.DATE` - 日期选择 + +--- + +### 3. Kotlin编译错误:Unresolved reference: PAGE_TYPE + +**错误信息**: +``` +e: Unresolved reference: PAGE_TYPE +``` + +**错误原因**: +`Constant.Key`对象中缺少`PAGE_TYPE`常量。 + +**解决方案**: +在`module_base/src/main/java/com/lukouguoji/module_base/common/Constant.kt`中添加: + +```kotlin +object Key { + // ... 其他常量 + + // ID + const val ID = "id" + + // 页面类型 + const val PAGE_TYPE = "pageType" + + // ... 其他常量 +} +``` + +**使用示例**: +```kotlin +val starter = Intent(context, XxxActivity::class.java) + .putExtra(Constant.Key.PAGE_TYPE, DetailsPageType.Add.name) + .putExtra(Constant.Key.ID, id) +``` + +--- + +### 4. Kotlin编译错误:Unresolved reference: Edit + +**错误信息**: +``` +e: Unresolved reference: Edit +``` + +**错误原因**: +`DetailsPageType`枚举中不存在`Edit`值。 + +**错误示例**: +```kotlin +when (viewModel.pageType) { + DetailsPageType.Add -> setBackArrow("新增") + DetailsPageType.Edit -> setBackArrow("编辑") // ❌ 错误 + DetailsPageType.Details -> setBackArrow("详情") +} +``` + +**正确写法**: +```kotlin +when (viewModel.pageType) { + DetailsPageType.Add -> setBackArrow("新增") + DetailsPageType.Modify -> setBackArrow("编辑") // ✅ 正确 + DetailsPageType.Details -> setBackArrow("详情") +} +``` + +**DetailsPageType枚举值**: +```kotlin +enum class DetailsPageType(val title: String) { + Add("新增"), // 新增页面 + Modify("编辑"), // 编辑页面(注意:不是Edit!) + Details("详情") // 详情页面 +} +``` + +--- + +### 5. Kotlin编译错误:Unresolved reference: IOnItemClickListener + +**错误信息**: +``` +e: Unresolved reference: IOnItemClickListener +``` + +**错误原因**: +import的包名错误,`IOnItemClickListener`在`interfaces`包,不是`impl`包。 + +**错误示例**: +```kotlin +import com.lukouguoji.module_base.impl.IOnItemClickListener // ❌ 错误 +``` + +**正确写法**: +```kotlin +import com.lukouguoji.module_base.interfaces.IOnItemClickListener // ✅ 正确 +``` + +**使用场景**: +```kotlin +class XxxViewModel : BaseViewModel(), IOnItemClickListener { + override fun onItemClick(position: Int, type: Int) { + // 处理点击事件 + } +} +``` + +--- + +### 6. FlowBus使用错误 + +#### 错误A:Unresolved reference: observe + +**错误信息**: +``` +e: Unresolved reference: observe +``` + +**错误原因**: +缺少`observe`扩展函数的import。 + +**解决方案**: +```kotlin +import com.lukouguoji.module_base.impl.FlowBus +import com.lukouguoji.module_base.impl.observe // ✅ 添加这一行 + +// 在Activity中使用 +FlowBus.with(ConstantEvent.EVENT_REFRESH_LIST).observe(this) { + viewModel.refresh() +} +``` + +#### 错误B:Suspend function 'emit' should be called only from a coroutine + +**错误信息**: +``` +e: Suspend function 'emit' should be called only from a coroutine or another suspend function +``` + +**错误原因**: +`emit()`是suspend函数,需要在协程中调用。 + +**错误示例**: +```kotlin +FlowBus.with(ConstantEvent.EVENT_REFRESH_LIST).emit("refresh") // ❌ 错误 +``` + +**正确写法**: +```kotlin +import androidx.lifecycle.viewModelScope +import kotlinx.coroutines.launch + +// 在ViewModel中 +viewModelScope.launch { + FlowBus.with(ConstantEvent.EVENT_REFRESH_LIST).emit("refresh") // ✅ 正确 +} +``` + +--- + +### 7. 图片上传字段错误 + +**错误信息**: +``` +e: Unresolved reference: url +``` + +**错误原因**: +`UploadBean`返回的字段名是`newName`,不是`url`。 + +**UploadBean结构**: +```kotlin +class UploadBean { + var newName: String = "" // ✅ 正确字段名 + var zipFileName: String = "" +} +``` + +**错误示例**: +```kotlin +val result = UploadUtil.upload(filePath) +if (result.verifySuccess()) { + val imageUrl = result.data?.url ?: "" // ❌ 错误:没有url字段 +} +``` + +**正确写法**: +```kotlin +val result = UploadUtil.upload(filePath) +if (result.verifySuccess()) { + val imageUrl = result.data?.newName ?: "" // ✅ 正确:使用newName +} +``` + +**完整上传示例**: +```kotlin +launchLoadingCollect({ + val uploadedUrls = mutableListOf() + imageList.forEach { fileBean -> + if (fileBean.path.startsWith("http")) { + // 已上传的图片,直接使用URL + uploadedUrls.add(fileBean.path) + } else { + // 本地图片,需要上传 + val result = UploadUtil.upload(fileBean.path) + if (result.verifySuccess()) { + uploadedUrls.add(result.data?.newName ?: "") // 使用newName + } + } + } + + // 提交时将图片URL列表用逗号拼接 + val params = mapOf( + "images" to uploadedUrls.joinToString(",") + ).toRequestBody() + + NetApply.api.saveData(params) +}) { + onSuccess = { + showToast("保存成功") + } +} +``` + +--- + +### 8. RecyclerView DataBinding items属性问题 + +**问题现象**: +在DataBinding中使用`items`属性绑定数据会导致编译错误。 + +**错误示例**: +```xml + +``` + +**正确做法**: +移除`items`属性,在Activity中手动更新adapter。 + +**XML布局**: +```xml + +``` + +**Activity代码**: +```kotlin +import com.lukouguoji.module_base.ktx.commonAdapter + +override fun initOnCreate(savedInstanceState: Bundle?) { + setBackArrow("页面标题") + binding.viewModel = viewModel + + // 监听数据变化并手动更新adapter + viewModel.imageList.observe(this) { images -> + binding.rvImages.commonAdapter()?.refresh(images) + } +} +``` + +--- + +### 9. pageType在DataBinding中的正确使用 + +**问题**: +如果`pageType`声明为普通变量,DataBinding无法正确绑定。 + +**错误示例**: +```kotlin +class XxxViewModel : BaseViewModel() { + var pageType: DetailsPageType = DetailsPageType.Add // ❌ 普通变量 +} +``` + +**正确写法**: +```kotlin +class XxxViewModel : BaseViewModel() { + val pageType = MutableLiveData(DetailsPageType.Add) // ✅ 使用LiveData +} +``` + +**ViewModel中访问**: +```kotlin +fun initOnCreated(intent: Intent) { + pageType.value = DetailsPageType.valueOf( + intent.getStringExtra(Constant.Key.PAGE_TYPE) ?: DetailsPageType.Add.name + ) + + if (pageType.value != DetailsPageType.Add) { + loadData() + } +} +``` + +**Activity中访问**: +```kotlin +override fun initOnCreate(savedInstanceState: Bundle?) { + viewModel.initOnCreated(intent) + + when (viewModel.pageType.value) { + DetailsPageType.Add -> setBackArrow("新增") + DetailsPageType.Modify -> setBackArrow("编辑") + DetailsPageType.Details -> setBackArrow("详情") + } +} +``` + +**XML中使用**: +```xml + +``` + +**注意**: 在XML的DataBinding表达式中,直接使用`viewModel.pageType`即可,不需要`.value`。 + +--- + +## 错误排查流程 + +当遇到编译错误时,按以下顺序排查: + +### 第1步:检查DataBinding错误 + +如果看到`android.databinding.tool.util.LoggedErrorException`: + +1. **检查import语句的包名** + - ✅ `com.lukouguoji.module_base.common.DetailsPageType` + - ❌ `com.lukouguoji.module_base.constant.DetailsPageType` + +2. **检查枚举值是否正确** + - ✅ `DataLayoutType.INPUT`、`SPINNER`、`DATE` + - ❌ `DataLayoutType.INTEGER`(不存在) + - ✅ `DetailsPageType.Modify`(编辑) + - ❌ `DetailsPageType.Edit`(不存在) + +3. **移除不支持的属性** + - 移除RecyclerView的`items`属性 + - 改为在Activity中手动更新adapter + +### 第2步:检查Kotlin编译错误 + +如果看到`Unresolved reference`: + +1. **检查import语句** + - `IOnItemClickListener` → `com.lukouguoji.module_base.interfaces.IOnItemClickListener` + - `observe` → `com.lukouguoji.module_base.impl.observe` + +2. **检查常量是否存在** + - 确认`Constant.Key.PAGE_TYPE`已定义 + - 确认`Constant.Key.ID`已定义 + +3. **检查字段名称** + - `UploadBean`使用`newName`,不是`url` + +### 第3步:检查协程相关错误 + +如果看到suspend function相关错误: + +1. **添加必要的import** + ```kotlin + import androidx.lifecycle.viewModelScope + import kotlinx.coroutines.launch + ``` + +2. **在协程中调用emit** + ```kotlin + viewModelScope.launch { + FlowBus.with(event).emit(data) + } + ``` + +### 第4步:清理并重新构建 + +如果上述都检查过,仍有问题: + +```bash +# 清理项目 +./gradlew clean + +# 重新构建 +./gradlew assembleDebug +``` + +--- + +## 最佳实践建议 + +### 1. 开发前检查清单 + +- [ ] 确认`DetailsPageType`在`common`包 +- [ ] 确认`IOnItemClickListener`在`interfaces`包 +- [ ] 确认`Constant.Key.PAGE_TYPE`常量已定义 +- [ ] 熟悉`DataLayoutType`和`DetailsPageType`的枚举值 + +### 2. 代码编写规范 + +- ✅ 使用`MutableLiveData`声明`pageType`,不用普通变量 +- ✅ RecyclerView不使用`items`属性,改用手动更新adapter +- ✅ FlowBus的`emit()`必须在`viewModelScope.launch`中调用 +- ✅ `observe`扩展函数需要单独import +- ✅ 图片上传使用`UploadBean.newName`字段 + +### 3. 参考已有代码 + +遇到问题时,优先参考项目中已有的类似实现: + +- 查看`AccidentVisaDetailsViewModel`了解`pageType`的LiveData用法 +- 查看`GncShouYunListActivity`了解FlowBus的正确使用 +- 查看现有的编辑页面了解图片上传的完整流程 + +--- + +## 快速修复命令 + +```bash +# 查找DetailsPageType的正确包名 +grep -r "enum class DetailsPageType" module_base/src --include="*.kt" + +# 查找IOnItemClickListener的正确包名 +find module_base/src -name "IOnItemClickListener.kt" + +# 查找DataLayoutType的枚举值 +grep -A 5 "enum class DataLayoutType" module_base/src --include="*.kt" + +# 查找UploadBean的字段定义 +grep -A 10 "class UploadBean" module_base/src --include="*.kt" +``` + +通过遵循这些规范和检查清单,可以避免大部分常见的编译错误。 \ No newline at end of file diff --git a/app/src/main/java/com/lukouguoji/aerologic/ui/fragment/HomeFragment.kt b/app/src/main/java/com/lukouguoji/aerologic/ui/fragment/HomeFragment.kt index ecf2637..7fd464b 100644 --- a/app/src/main/java/com/lukouguoji/aerologic/ui/fragment/HomeFragment.kt +++ b/app/src/main/java/com/lukouguoji/aerologic/ui/fragment/HomeFragment.kt @@ -23,7 +23,6 @@ import com.lukouguoji.aerologic.page.accident.visa.list.AccidentVisaListActivity import com.lukouguoji.aerologic.page.car.list.CarListActivity import com.lukouguoji.aerologic.page.flight.query.list.FlightQueryListActivity import com.lukouguoji.aerologic.page.gnj.jiaojie.GnjHandoverListActivity -import com.lukouguoji.aerologic.page.gnj.out.stash.list.GnjOutStashListActivity import com.lukouguoji.aerologic.page.gnj.manifest.list.GnjManifestListActivity import com.lukouguoji.aerologic.page.gnj.stash.list.GnjStashListActivity import com.lukouguoji.aerologic.page.gnj.move.stash.list.GnjMoveStashListActivity @@ -277,7 +276,7 @@ class HomeFragment : Fragment() { } //出库 Constant.AuthName.GnjChuKuList -> { - GnjOutStashListActivity.start(requireContext()) + GnjMoveStashListActivity.start(requireContext()) } //仓库管理 Constant.AuthName.GnjWareHouse -> { diff --git a/module_base/src/main/java/com/lukouguoji/module_base/LoginActivity.kt b/module_base/src/main/java/com/lukouguoji/module_base/LoginActivity.kt index 02e7fc5..08ea865 100644 --- a/module_base/src/main/java/com/lukouguoji/module_base/LoginActivity.kt +++ b/module_base/src/main/java/com/lukouguoji/module_base/LoginActivity.kt @@ -131,6 +131,12 @@ class LoginActivity : BaseActivity(), super.onCreate(savedInstanceState) setContentView(R.layout.activity_login) + // TODO: 临时跳过登录,直接进入移库列表页 + ARouter.getInstance().build(ARouterConstants.ACTIVITY_URL_GNJ_YIKU_EDIT) + .withFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK or Intent.FLAG_ACTIVITY_NEW_TASK) + .navigation() + return + checkAppUpdate() diff --git a/module_base/src/main/java/com/lukouguoji/module_base/bean/GnjYiKuBean.kt b/module_base/src/main/java/com/lukouguoji/module_base/bean/GnjYiKuBean.kt new file mode 100644 index 0000000..9d81e23 --- /dev/null +++ b/module_base/src/main/java/com/lukouguoji/module_base/bean/GnjYiKuBean.kt @@ -0,0 +1,50 @@ +package com.lukouguoji.module_base.bean + +import androidx.databinding.ObservableBoolean +import com.lukouguoji.module_base.interfaces.ICheck + +/** + * 国内进港移库数据Bean + */ +class GnjYiKuBean : ICheck { + var id: String = "" // 主键ID + var mawbId: String = "" // 主运单ID + var wbNo: String = "" // 运单号 + var pc: String = "" // 件数 + var weight: String = "" // 重量(kg) + var spCode: String = "" // 特码 + var agentCode: String = "" // 代理人 + var goods: String = "" // 品名 + var flight: String = "" // 进港航班(格式: 20240712/MU2023) + var route: String = "" // 航程(格式: LAX-PEK-HFE) + var origin: String = "" // 始发港 + var dest: String = "" // 目的港 + var awbType: String = "" // 运单类型(转国际进港/转国内出港等) + var telegramNo: String = "" // 电报号 + var remark: String = "" // 备注 + var handoverStatus: String = "" // 移交状态(未移交/已移交) + var images: String = "" // 交接图片(逗号分隔的URL列表) + var fdate: String = "" // 航班日期 + var fno: String = "" // 航班号 + var businessType: String = "" // 业务类型 + var opDate: String = "" // 操作日期 + var carrier: String = "" // 承运人 + + // 多选状态绑定 + val checked = ObservableBoolean(false) + + override fun getCheckObservable(): ObservableBoolean { + return checked + } + + /** + * 获取图片列表 + */ + fun getImageList(): List { + return if (images.isNotEmpty()) { + images.split(",").filter { it.isNotEmpty() } + } else { + emptyList() + } + } +} diff --git a/module_base/src/main/java/com/lukouguoji/module_base/common/Constant.kt b/module_base/src/main/java/com/lukouguoji/module_base/common/Constant.kt index f8010e5..9c5adc9 100644 --- a/module_base/src/main/java/com/lukouguoji/module_base/common/Constant.kt +++ b/module_base/src/main/java/com/lukouguoji/module_base/common/Constant.kt @@ -325,6 +325,9 @@ interface Constant { // ID const val ID = "id" + // 页面类型 + const val PAGE_TYPE = "pageType" + // 运单 const val WAYBILL = "waybill" diff --git a/module_base/src/main/java/com/lukouguoji/module_base/common/ConstantEvent.kt b/module_base/src/main/java/com/lukouguoji/module_base/common/ConstantEvent.kt index dba2daf..af40d14 100644 --- a/module_base/src/main/java/com/lukouguoji/module_base/common/ConstantEvent.kt +++ b/module_base/src/main/java/com/lukouguoji/module_base/common/ConstantEvent.kt @@ -31,4 +31,7 @@ object ConstantEvent { // Socket事件点击 const val SOCKET_EVENT_CLICK = "socket_event_click" + + // 国内进港移库列表刷新 + const val EVENT_REFRESH_GNJ_YIKU_LIST = "event_refresh_gnj_yiku_list" } \ No newline at end of file diff --git a/module_base/src/main/java/com/lukouguoji/module_base/http/net/Api.kt b/module_base/src/main/java/com/lukouguoji/module_base/http/net/Api.kt index e51e41b..96ecc68 100644 --- a/module_base/src/main/java/com/lukouguoji/module_base/http/net/Api.kt +++ b/module_base/src/main/java/com/lukouguoji/module_base/http/net/Api.kt @@ -52,6 +52,7 @@ import com.lukouguoji.module_base.bean.GnjQueryBean import com.lukouguoji.module_base.bean.GnjQueryDetailsBean import com.lukouguoji.module_base.bean.GnjStashBean import com.lukouguoji.module_base.bean.GnjUnloadListBean +import com.lukouguoji.module_base.bean.GnjYiKuBean import com.lukouguoji.module_base.bean.GoodsTransportBean import com.lukouguoji.module_base.bean.LogBean import com.lukouguoji.module_base.bean.MessageBean @@ -918,6 +919,25 @@ interface Api { */ @POST("DomImpMove/searchWbList") suspend fun getGnjMoveStashWbNoList(@Body data: RequestBody): BaseResultBean> + + /** + * 获取-国内进港移库-详情 + */ + @POST("DomImpMove/queryById") + suspend fun getGnjYiKuDetails(@Query("id") id: String): BaseResultBean + + /** + * 保存-国内进港移库 + */ + @POST("DomImpMove/save") + suspend fun saveGnjYiKu(@Body data: RequestBody): BaseResultBean + + /** + * 执行-国内进港移库操作 + */ + @POST("DomImpMove/move") + suspend fun transferGnjYiKu(@Body data: RequestBody): BaseResultBean + /** * 获取国内出收运同步列表 */ diff --git a/module_base/src/main/java/com/lukouguoji/module_base/router/ARouterConstants.kt b/module_base/src/main/java/com/lukouguoji/module_base/router/ARouterConstants.kt index 67962b0..9bcb357 100644 --- a/module_base/src/main/java/com/lukouguoji/module_base/router/ARouterConstants.kt +++ b/module_base/src/main/java/com/lukouguoji/module_base/router/ARouterConstants.kt @@ -97,7 +97,12 @@ object ARouterConstants { const val ACTIVITY_URL_GNJ_RU_KU = "/gnj/GnjRuKuActivity" //国内进港 入库 - const val ACTIVITY_URL_GNJ_YI_KU = "/gnj/GnjYiKuListActivity" //国内进港 移库 + const val ACTIVITY_URL_GNJ_YI_KU = "/gnj/GnjYiKuListActivity" //国内进港 移库(旧版本) + + // 国内进港移库(新版本) + const val ACTIVITY_URL_GNJ_YIKU_LIST = "/gnj/GnjYiKuListActivity" //国内进港 移库列表 + const val ACTIVITY_URL_GNJ_YIKU_DETAILS = "/gnj/GnjYiKuDetailsActivity" //国内进港 移库详情 + const val ACTIVITY_URL_GNJ_YIKU_EDIT = "/gnj/GnjYiKuEditActivity" //国内进港 移库编辑 ///////////////// 国际出港模块 /** diff --git a/module_gnj/src/main/AndroidManifest.xml b/module_gnj/src/main/AndroidManifest.xml new file mode 100644 index 0000000..7676f00 --- /dev/null +++ b/module_gnj/src/main/AndroidManifest.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + diff --git a/module_gnj/src/main/debug/AndroidManifest.xml b/module_gnj/src/main/debug/AndroidManifest.xml index bbe1536..2c3b8a2 100644 --- a/module_gnj/src/main/debug/AndroidManifest.xml +++ b/module_gnj/src/main/debug/AndroidManifest.xml @@ -20,6 +20,25 @@ + + + + + + + \ No newline at end of file diff --git a/module_gnj/src/main/java/com/lukouguoji/gnj/page/yiku/details/GnjYiKuDetailsActivity.kt b/module_gnj/src/main/java/com/lukouguoji/gnj/page/yiku/details/GnjYiKuDetailsActivity.kt new file mode 100644 index 0000000..350c905 --- /dev/null +++ b/module_gnj/src/main/java/com/lukouguoji/gnj/page/yiku/details/GnjYiKuDetailsActivity.kt @@ -0,0 +1,45 @@ +package com.lukouguoji.gnj.page.yiku.details + +import android.content.Context +import android.content.Intent +import android.os.Bundle +import com.alibaba.android.arouter.facade.annotation.Route +import com.lukouguoji.gnj.R +import com.lukouguoji.gnj.databinding.ActivityGnjYikuDetailsBinding +import com.lukouguoji.module_base.base.BaseBindingActivity +import com.lukouguoji.module_base.common.Constant +import com.lukouguoji.module_base.ktx.commonAdapter +import com.lukouguoji.module_base.router.ARouterConstants + +/** + * 国内进港移库详情页 + */ +@Route(path = ARouterConstants.ACTIVITY_URL_GNJ_YIKU_DETAILS) +class GnjYiKuDetailsActivity : + BaseBindingActivity() { + + override fun layoutId() = R.layout.activity_gnj_yiku_details + + override fun viewModelClass() = GnjYiKuDetailsViewModel::class.java + + override fun initOnCreate(savedInstanceState: Bundle?) { + setBackArrow("国内进港移库记录") + + viewModel.initOnCreated(intent) + binding.viewModel = viewModel + + // 监听图片列表变化并更新adapter + viewModel.imageList.observe(this) { images -> + binding.rvImages.commonAdapter()?.refresh(images) + } + } + + companion object { + @JvmStatic + fun start(context: Context, id: String) { + val starter = Intent(context, GnjYiKuDetailsActivity::class.java) + .putExtra(Constant.Key.ID, id) + context.startActivity(starter) + } + } +} diff --git a/module_gnj/src/main/java/com/lukouguoji/gnj/page/yiku/details/GnjYiKuDetailsViewModel.kt b/module_gnj/src/main/java/com/lukouguoji/gnj/page/yiku/details/GnjYiKuDetailsViewModel.kt new file mode 100644 index 0000000..3260ed2 --- /dev/null +++ b/module_gnj/src/main/java/com/lukouguoji/gnj/page/yiku/details/GnjYiKuDetailsViewModel.kt @@ -0,0 +1,51 @@ +package com.lukouguoji.gnj.page.yiku.details + +import android.content.Intent +import androidx.lifecycle.MutableLiveData +import com.lukouguoji.gnj.R +import com.lukouguoji.module_base.base.BaseViewModel +import com.lukouguoji.module_base.bean.FileBean +import com.lukouguoji.module_base.bean.GnjYiKuBean +import com.lukouguoji.module_base.common.Constant +import com.lukouguoji.module_base.http.net.NetApply +import com.lukouguoji.module_base.impl.ImageSelectViewHolder +import com.lukouguoji.module_base.ktx.launchLoadingCollect + +/** + * 国内进港移库详情 ViewModel + */ +class GnjYiKuDetailsViewModel : BaseViewModel() { + + var id = "" + + val dataBean = MutableLiveData() + + // 图片列表 + val imageList = MutableLiveData>(mutableListOf()) + + // 图片适配器配置 + val imageItemLayoutId = R.layout.item_image_select + val imageItemViewHolder = ImageSelectViewHolder::class.java + + fun initOnCreated(intent: Intent) { + id = intent.getStringExtra(Constant.Key.ID) ?: "" + getData() + } + + private fun getData() { + launchLoadingCollect({ + NetApply.api.getGnjYiKuDetails(id) + }) { + onSuccess = { + val bean = it.data ?: GnjYiKuBean() + dataBean.value = bean + + // 处理图片列表 + val images = bean.getImageList().map { url -> + FileBean(path = url) + } + imageList.value = images.toMutableList() + } + } + } +} diff --git a/module_gnj/src/main/java/com/lukouguoji/gnj/page/yiku/edit/GnjYiKuEditActivity.kt b/module_gnj/src/main/java/com/lukouguoji/gnj/page/yiku/edit/GnjYiKuEditActivity.kt new file mode 100644 index 0000000..22c45c4 --- /dev/null +++ b/module_gnj/src/main/java/com/lukouguoji/gnj/page/yiku/edit/GnjYiKuEditActivity.kt @@ -0,0 +1,72 @@ +package com.lukouguoji.gnj.page.yiku.edit + +import android.content.Context +import android.content.Intent +import android.os.Bundle +import com.alibaba.android.arouter.facade.annotation.Route +import com.lukouguoji.gnj.R +import com.lukouguoji.gnj.databinding.ActivityGnjYikuEditBinding +import com.lukouguoji.module_base.base.BaseBindingActivity +import com.lukouguoji.module_base.common.Constant +import com.lukouguoji.module_base.common.DetailsPageType +import com.lukouguoji.module_base.ktx.addOnItemClickListener +import com.lukouguoji.module_base.ktx.commonAdapter +import com.lukouguoji.module_base.router.ARouterConstants + +/** + * 国内进港移库编辑页 + */ +@Route(path = ARouterConstants.ACTIVITY_URL_GNJ_YIKU_EDIT) +class GnjYiKuEditActivity : + BaseBindingActivity() { + + override fun layoutId() = R.layout.activity_gnj_yiku_edit + + override fun viewModelClass() = GnjYiKuEditViewModel::class.java + + override fun initOnCreate(savedInstanceState: Bundle?) { + viewModel.initOnCreated(intent) + + // 根据页面类型设置标题 + when (viewModel.pageType.value) { + DetailsPageType.Add -> setBackArrow("国内进港移库新增") + DetailsPageType.Modify -> setBackArrow("国内进港移库编辑") + DetailsPageType.Details -> setBackArrow("国内进港移库详情") + } + + binding.viewModel = viewModel + + // 绑定图片列表点击事件 + binding.rvImages.addOnItemClickListener(viewModel) + + // 监听图片列表变化并更新adapter + viewModel.imageList.observe(this) { images -> + binding.rvImages.commonAdapter()?.refresh(images) + } + } + + companion object { + @JvmStatic + fun startForAdd(context: Context) { + val starter = Intent(context, GnjYiKuEditActivity::class.java) + .putExtra(Constant.Key.PAGE_TYPE, DetailsPageType.Add.name) + context.startActivity(starter) + } + + @JvmStatic + fun startForEdit(context: Context, id: String) { + val starter = Intent(context, GnjYiKuEditActivity::class.java) + .putExtra(Constant.Key.PAGE_TYPE, DetailsPageType.Modify.name) + .putExtra(Constant.Key.ID, id) + context.startActivity(starter) + } + + @JvmStatic + fun startForDetails(context: Context, id: String) { + val starter = Intent(context, GnjYiKuEditActivity::class.java) + .putExtra(Constant.Key.PAGE_TYPE, DetailsPageType.Details.name) + .putExtra(Constant.Key.ID, id) + context.startActivity(starter) + } + } +} diff --git a/module_gnj/src/main/java/com/lukouguoji/gnj/page/yiku/edit/GnjYiKuEditViewModel.kt b/module_gnj/src/main/java/com/lukouguoji/gnj/page/yiku/edit/GnjYiKuEditViewModel.kt new file mode 100644 index 0000000..a95fafe --- /dev/null +++ b/module_gnj/src/main/java/com/lukouguoji/gnj/page/yiku/edit/GnjYiKuEditViewModel.kt @@ -0,0 +1,168 @@ +package com.lukouguoji.gnj.page.yiku.edit + +import android.content.Intent +import androidx.lifecycle.MutableLiveData +import androidx.lifecycle.viewModelScope +import com.lukouguoji.gnj.R +import com.lukouguoji.module_base.base.BaseViewModel +import com.lukouguoji.module_base.bean.FileBean +import com.lukouguoji.module_base.bean.GnjYiKuBean +import com.lukouguoji.module_base.common.Constant +import com.lukouguoji.module_base.common.ConstantEvent +import com.lukouguoji.module_base.common.DetailsPageType +import com.lukouguoji.module_base.http.net.NetApply +import com.lukouguoji.module_base.impl.FlowBus +import com.lukouguoji.module_base.impl.ImageSelectViewHolder +import com.lukouguoji.module_base.interfaces.IOnItemClickListener +import com.lukouguoji.module_base.ktx.launchLoadingCollect +import com.lukouguoji.module_base.ktx.showToast +import com.lukouguoji.module_base.ktx.toRequestBody +import com.lukouguoji.module_base.ktx.verifyNullOrEmpty +import com.lukouguoji.module_base.util.UploadUtil +import dev.utils.app.info.KeyValue +import kotlinx.coroutines.launch + +/** + * 国内进港移库编辑 ViewModel + */ +class GnjYiKuEditViewModel : BaseViewModel(), IOnItemClickListener { + + val pageType = MutableLiveData(DetailsPageType.Add) + var id = "" + + val dataBean = MutableLiveData(GnjYiKuBean()) + + // 运单类型下拉列表 + val waybillTypeList = MutableLiveData( + listOf( + KeyValue("转国际进港", "CIII"), + KeyValue("转国内出港", "CICO"), + KeyValue("转国际出港", "CIIO"), + ) + ) + + // 图片列表(初始添加一个空的FileBean用于显示"添加图片"按钮) + val imageList = MutableLiveData>( + mutableListOf(FileBean()) + ) + + // 图片适配器配置 + val imageItemLayoutId = R.layout.item_image_select + val imageItemViewHolder = ImageSelectViewHolder::class.java + + fun initOnCreated(intent: Intent) { + // 获取页面类型 + pageType.value = DetailsPageType.valueOf( + intent.getStringExtra(Constant.Key.PAGE_TYPE) ?: DetailsPageType.Add.name + ) + + // 如果是编辑或详情,加载数据 + if (pageType.value != DetailsPageType.Add) { + id = intent.getStringExtra(Constant.Key.ID) ?: "" + loadData() + } + } + + private fun loadData() { + launchLoadingCollect({ + NetApply.api.getGnjYiKuDetails(id) + }) { + onSuccess = { + val bean = it.data ?: GnjYiKuBean() + dataBean.value = bean + + // 处理图片列表 + val images = bean.getImageList().map { url -> + FileBean(path = url) + }.toMutableList() + + // 如果是编辑模式,添加一个空的FileBean用于添加新图片 + if (pageType.value == DetailsPageType.Modify) { + images.add(FileBean()) + } + + imageList.value = images + } + } + } + + /** + * 提交保存 + */ + fun submit() { + val bean = dataBean.value ?: return + + // 验证必填项 + if (bean.wbNo.verifyNullOrEmpty("请输入运单号")) return + if (bean.pc.verifyNullOrEmpty("请输入件数")) return + if (bean.weight.verifyNullOrEmpty("请输入重量")) return + + // 获取所有非空图片 + val images = imageList.value!!.filter { it.path.isNotEmpty() } + + // 检查图片数量限制(最多7张) + if (images.size > 7) { + showToast("最多上传7张图片") + return + } + + launchLoadingCollect({ + // 1. 上传图片 + val uploadedUrls = mutableListOf() + images.forEach { fileBean -> + // 判断是否为已上传的图片(在线URL) + if (fileBean.path.startsWith("http")) { + uploadedUrls.add(fileBean.path) + } else { + // 本地图片需要上传 + val result = UploadUtil.upload(fileBean.path) + if (result.verifySuccess()) { + uploadedUrls.add(result.data?.newName ?: "") + } + } + } + + // 2. 提交表单数据 + val params = mapOf( + "id" to id, + "wbNo" to bean.wbNo, + "pc" to bean.pc, + "weight" to bean.weight, + "spCode" to bean.spCode, + "agentCode" to bean.agentCode, + "goods" to bean.goods, + "flight" to bean.flight, + "route" to bean.route, + "awbType" to bean.awbType, + "telegramNo" to bean.telegramNo, + "remark" to bean.remark, + "images" to uploadedUrls.joinToString(","), + ).toRequestBody(removeEmptyOrNull = true) + + NetApply.api.saveGnjYiKu(params) + }) { + onSuccess = { + showToast(if (pageType.value == DetailsPageType.Add) "新增成功" else "保存成功") + + // 发送刷新事件 + viewModelScope.launch { + FlowBus.with(ConstantEvent.EVENT_REFRESH_GNJ_YIKU_LIST).emit("refresh") + } + + // 关闭页面 + getTopActivity().finish() + } + } + } + + /** + * 处理图片删除点击事件 + */ + override fun onItemClick(position: Int, type: Int) { + val list = imageList.value!! + if (type == R.id.iv_delete && position < list.size) { + list.removeAt(position) + imageList.value = list + } + } +} diff --git a/module_gnj/src/main/java/com/lukouguoji/gnj/page/yiku/list/GnjYiKuListActivity.kt b/module_gnj/src/main/java/com/lukouguoji/gnj/page/yiku/list/GnjYiKuListActivity.kt new file mode 100644 index 0000000..253e0c2 --- /dev/null +++ b/module_gnj/src/main/java/com/lukouguoji/gnj/page/yiku/list/GnjYiKuListActivity.kt @@ -0,0 +1,53 @@ +package com.lukouguoji.gnj.page.yiku.list + +import android.content.Context +import android.content.Intent +import android.os.Bundle +import com.alibaba.android.arouter.facade.annotation.Route +import com.lukouguoji.gnj.R +import com.lukouguoji.gnj.databinding.ActivityGnjYikuListBinding +import com.lukouguoji.module_base.base.BaseBindingActivity +import com.lukouguoji.module_base.common.ConstantEvent +import com.lukouguoji.module_base.impl.FlowBus +import com.lukouguoji.module_base.impl.observe +import com.lukouguoji.module_base.ktx.getLifecycleOwner +import com.lukouguoji.module_base.router.ARouterConstants + +/** + * 国内进港移库列表页 + */ +@Route(path = ARouterConstants.ACTIVITY_URL_GNJ_YIKU_LIST) +class GnjYiKuListActivity : + BaseBindingActivity() { + + override fun layoutId() = R.layout.activity_gnj_yiku_list + + override fun viewModelClass() = GnjYiKuListViewModel::class.java + + override fun initOnCreate(savedInstanceState: Bundle?) { + setBackArrow("国内进港移库") + + binding.viewModel = viewModel + + // 绑定分页逻辑 + viewModel.pageModel + .bindSmartRefreshLayout(binding.srl, binding.rv, viewModel, getLifecycleOwner()) + + // 监听刷新事件 + FlowBus.with(ConstantEvent.EVENT_REFRESH_GNJ_YIKU_LIST) + .observe(this) { + viewModel.refresh() + } + + // 初始加载 + viewModel.refresh() + } + + companion object { + @JvmStatic + fun start(context: Context) { + val starter = Intent(context, GnjYiKuListActivity::class.java) + context.startActivity(starter) + } + } +} diff --git a/module_gnj/src/main/java/com/lukouguoji/gnj/page/yiku/list/GnjYiKuListViewHolder.kt b/module_gnj/src/main/java/com/lukouguoji/gnj/page/yiku/list/GnjYiKuListViewHolder.kt new file mode 100644 index 0000000..60c25c2 --- /dev/null +++ b/module_gnj/src/main/java/com/lukouguoji/gnj/page/yiku/list/GnjYiKuListViewHolder.kt @@ -0,0 +1,23 @@ +package com.lukouguoji.gnj.page.yiku.list + +import android.view.View +import com.lukouguoji.gnj.databinding.ItemGnjYikuListBinding +import com.lukouguoji.module_base.base.BaseViewHolder +import com.lukouguoji.module_base.bean.GnjYiKuBean + +/** + * 国内进港移库列表 ViewHolder + */ +class GnjYiKuListViewHolder(view: View) : + BaseViewHolder(view) { + + override fun onBind(item: Any?, position: Int) { + val bean = getItemBean(item)!! + binding.bean = bean + + // 点击checkbox切换选中状态 + binding.ivIcon.setOnClickListener { + bean.checked.set(!bean.checked.get()) + } + } +} diff --git a/module_gnj/src/main/java/com/lukouguoji/gnj/page/yiku/list/GnjYiKuListViewModel.kt b/module_gnj/src/main/java/com/lukouguoji/gnj/page/yiku/list/GnjYiKuListViewModel.kt new file mode 100644 index 0000000..cbd30d9 --- /dev/null +++ b/module_gnj/src/main/java/com/lukouguoji/gnj/page/yiku/list/GnjYiKuListViewModel.kt @@ -0,0 +1,223 @@ +package com.lukouguoji.gnj.page.yiku.list + +import android.app.Activity +import android.content.Intent +import androidx.lifecycle.MutableLiveData +import com.alibaba.fastjson.JSONArray +import com.lukouguoji.gnj.R +import com.lukouguoji.module_base.base.BasePageViewModel +import com.lukouguoji.module_base.bean.GnjYiKuBean +import com.lukouguoji.module_base.common.Constant +import com.lukouguoji.module_base.http.net.NetApply +import com.lukouguoji.module_base.ktx.commonAdapter +import com.lukouguoji.module_base.ktx.launchCollect +import com.lukouguoji.module_base.ktx.launchLoadingCollect +import com.lukouguoji.module_base.ktx.noNull +import com.lukouguoji.module_base.ktx.showConfirmDialog +import com.lukouguoji.module_base.ktx.showToast +import com.lukouguoji.module_base.ktx.toJson +import com.lukouguoji.module_base.ktx.toRequestBody +import com.lukouguoji.module_base.model.ScanModel +import com.lukouguoji.module_base.util.CheckUtil +import com.lukouguoji.module_base.util.Common +import dev.DevUtils +import dev.utils.app.info.KeyValue +import okhttp3.RequestBody + +/** + * 国内进港移库列表 ViewModel + */ +class GnjYiKuListViewModel : BasePageViewModel() { + + // 搜索条件 + val waybillType = MutableLiveData("") // 运单类型 + val carrier = MutableLiveData("") // 承运人 + val waybillNo = MutableLiveData("") // 运单号 + val handoverStatus = MutableLiveData("") // 移交状态 + + // 运单号列表(用于多条结果选择) + val wbNoList = MutableLiveData>() + + // 运单类型下拉列表 + val waybillTypeList = MutableLiveData( + listOf( + KeyValue("全部", ""), + KeyValue("转国际进港", "CIII"), + KeyValue("转国内出港", "CICO"), + KeyValue("转国际出港", "CIIO"), + ) + ) + + // 移交状态下拉列表 + val handoverStatusList = MutableLiveData( + listOf( + KeyValue("全部", ""), + KeyValue("未移交", "0"), + KeyValue("已移交", "1"), + ) + ) + + // 适配器配置 + val itemViewHolder = GnjYiKuListViewHolder::class.java + val itemLayoutId = R.layout.item_gnj_yiku_list + + // 统计数据 + val count = MutableLiveData(0) // 总票数 + val totalPc = MutableLiveData("0") // 总件数 + val totalWeight = MutableLiveData("0") // 总重量 + + /////////////////////////////////////////////////////////////////////////// + // 方法区 + /////////////////////////////////////////////////////////////////////////// + + /** + * 扫码输入运单号 + */ + fun waybillScanClick() { + ScanModel.startScan(getTopActivity(), Constant.RequestCode.WAYBILL) + } + + /** + * 获取运单号列表(用于扫码或输入后模糊查询) + */ + fun getWayBillList() { + val requestBody = mapOf( + "page" to pageModel.page, + "limit" to pageModel.limit, + "awbType" to waybillType.value!!.ifEmpty { null }, + "wbNo" to waybillNo.value!!.ifEmpty { null }, + "carrier" to carrier.value!!.ifEmpty { null }, + "handoverStatus" to handoverStatus.value!!.ifEmpty { null }, + ).toRequestBody() + + launchCollect({ + NetApply.api.getGnjMoveStashWbNoList(requestBody) + }) { + onSuccess = { + val results = it.data!! + when { + results.size == 1 -> { + waybillNo.value = results[0] + wbNoList.value = emptyList() + } + results.size > 1 -> { + wbNoList.value = results + showWbNoListSelect() + } + else -> { + wbNoList.value = emptyList() + } + } + } + onFailed = { i: Int, s: String -> + wbNoList.value = emptyList() + } + } + } + + /** + * 获取列表数据 + */ + override fun getData() { + val body = mapOf( + "page" to pageModel.page, + "limit" to pageModel.limit, + "awbType" to waybillType.value!!.ifEmpty { null }, + "wbNo" to waybillNo.value!!.ifEmpty { null }, + "carrier" to carrier.value!!.ifEmpty { null }, + "handoverStatus" to handoverStatus.value!!.ifEmpty { null }, + ).toRequestBody() + + launchLoadingCollect({ + NetApply.api.getGnjMoveStashList(body) + }) { + onSuccess = { + pageModel.handleListBean(it) + count.value = it.total + } + } + getCountData(body) + } + + /** + * 获取统计数据 + */ + private fun getCountData(body: RequestBody) { + launchCollect({ + NetApply.api.simplePost("DomImpMove/searchTotal", body) + }) { + onSuccess = { + totalPc.value = it.data?.totalPc.noNull("0") + totalWeight.value = it.data?.totalWeight.noNull("0") + } + } + } + + /** + * 处理扫码结果 + */ + override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { + if (resultCode == Activity.RESULT_OK && data != null) { + when (requestCode) { + Constant.RequestCode.WAYBILL -> { + waybillNo.value = data.getStringExtra(Constant.Result.CODED_CONTENT) + refresh() + } + } + } + } + + /** + * 批量移库操作 + */ + fun moveStashClick() { + val list = pageModel.rv!!.commonAdapter()!!.items as List + val filter = list.filter { it.checked.get() } + if (filter.isEmpty()) { + showToast("请选择数据") + return + } + getTopActivity().showConfirmDialog("确定要移库选中的 ${filter.size} 条数据吗?") { + launchLoadingCollect({ + NetApply.api.transferGnjYiKu( + mapOf( + "fid" to "0", + "ids" to filter.map { it.mawbId }, + ).toRequestBody() + ) + }) { + onSuccess = { + showToast(it.msg.noNull("移库成功")) + refresh() + } + } + } + } + + /** + * 全选/全不选 + */ + fun checkAllClick() { + val list = pageModel.rv!!.commonAdapter()!!.items as List + CheckUtil.handleAllCheck(list) + } + + /** + * 运单号选择弹窗 + */ + private fun showWbNoListSelect() { + Common.singleSelect( + DevUtils.getTopActivity(), + "选择运单号", + JSONArray.parseArray(wbNoList.value!!.map { + mapOf( + "name" to it, + "code" to it, + ) + }.toList().toJson(false)), + null + ) { position, _ -> + waybillNo.value = wbNoList.value!![position] + } + } +} diff --git a/module_gnj/src/main/release/AndroidManifest.xml b/module_gnj/src/main/release/AndroidManifest.xml index c8d5a3f..a989e04 100644 --- a/module_gnj/src/main/release/AndroidManifest.xml +++ b/module_gnj/src/main/release/AndroidManifest.xml @@ -62,6 +62,25 @@ android:configChanges="orientation|keyboardHidden" android:screenOrientation="userLandscape" android:exported="true" /> + + + + + + + \ No newline at end of file diff --git a/module_gnj/src/main/res/layout/activity_gnj_yiku_details.xml b/module_gnj/src/main/res/layout/activity_gnj_yiku_details.xml new file mode 100644 index 0000000..dc38f90 --- /dev/null +++ b/module_gnj/src/main/res/layout/activity_gnj_yiku_details.xml @@ -0,0 +1,338 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/module_gnj/src/main/res/layout/activity_gnj_yiku_edit.xml b/module_gnj/src/main/res/layout/activity_gnj_yiku_edit.xml new file mode 100644 index 0000000..2214007 --- /dev/null +++ b/module_gnj/src/main/res/layout/activity_gnj_yiku_edit.xml @@ -0,0 +1,277 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/activity_gnj_out_stash_list.xml b/module_gnj/src/main/res/layout/activity_gnj_yiku_list.xml similarity index 71% rename from app/src/main/res/layout/activity_gnj_out_stash_list.xml rename to module_gnj/src/main/res/layout/activity_gnj_yiku_list.xml index bca0367..611d708 100644 --- a/app/src/main/res/layout/activity_gnj_out_stash_list.xml +++ b/module_gnj/src/main/res/layout/activity_gnj_yiku_list.xml @@ -9,7 +9,7 @@ + type="com.lukouguoji.gnj.page.yiku.list.GnjYiKuListViewModel" /> + + - - - - - - + + + + android:layout_weight="1" + hint='@{"请输入承运人"}' + type="@{SearchLayoutType.INPUT}" + value="@={viewModel.carrier}" /> + + value="@={viewModel.waybillNo}" /> + + android:layout_weight="1" + hint='@{"请选择移交状态"}' + list="@{viewModel.handoverStatusList}" + type="@{SearchLayoutType.SPINNER}" + value="@={viewModel.handoverStatus}" /> + + + + + + tools:listitem="@layout/item_gnj_yiku_list" /> + + tools:text="合计票数:1,总件数:100,总重量:200KG" /> + android:onClick="@{()-> viewModel.moveStashClick()}" + android:text="移库" /> - \ No newline at end of file + diff --git a/app/src/main/res/layout/item_gnj_out_stash_list.xml b/module_gnj/src/main/res/layout/item_gnj_yiku_list.xml similarity index 76% rename from app/src/main/res/layout/item_gnj_out_stash_list.xml rename to module_gnj/src/main/res/layout/item_gnj_yiku_list.xml index a9ea678..f506515 100644 --- a/app/src/main/res/layout/item_gnj_out_stash_list.xml +++ b/module_gnj/src/main/res/layout/item_gnj_yiku_list.xml @@ -7,7 +7,7 @@ + type="com.lukouguoji.module_base.bean.GnjYiKuBean" /> + + loadImage="@{bean.checked ? @drawable/img_plane_s : @drawable/img_plane}" + android:src="@drawable/img_plane" /> + + - - - - - - - - + android:text="@{bean.wbNo}" + android:textColor="@color/colorPrimary" + tools:text="78109081212" /> + - - - - - - - - + android:text='@{bean.pc}' + tools:text="11" /> + + completeSpace="@{4}" + android:text="航班:" /> + android:text="@{bean.flight}" + tools:text="20240712/MU2023" /> + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + completeSpace="@{5}" + android:text="运单类型:" /> + android:text="@{bean.awbType}" + tools:text="转国际进港" /> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - \ No newline at end of file +