diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 36cc6f9..6fb493b 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -351,6 +351,13 @@ android:configChanges="orientation|keyboardHidden" android:screenOrientation="userLandscape"/> + + + 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 956cc7c..91dfdd0 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 @@ -427,44 +427,9 @@ class HomeFragment : Fragment() { /** * 国际进港 */ - //舱单 - Constant.AuthName.GjjCangDanListActivity -> { - ARouter.getInstance().build(ARouterConstants.ACTIVITY_URL_GJJ_CANG_DAN_LIST) - .navigation() - } - //仓库 - Constant.AuthName.GjjWareHouseActivity -> { - ARouter.getInstance().build(ARouterConstants.ACTIVITY_URL_GJJ_WARE_HOUSE) - .navigation() - } - //出库 - Constant.AuthName.GjjChuKuListActivity -> { - ARouter.getInstance().build(ARouterConstants.ACTIVITY_URL_GJJ_CHU_KU_LIST) - .navigation() - } - //查询 - Constant.AuthName.GjjQueryListActivity -> { - ARouter.getInstance().build(ARouterConstants.ACTIVITY_URL_GJJ_QUERY_LIST) - .navigation() - } - // 报文解析 - Constant.AuthName.GjjPacketParseActivity -> { - ARouter.getInstance().build(ARouterConstants.ACTIVITY_URL_GJJ_PACKET_PARSE) - .navigation() - } - // 舱单 - Constant.AuthName.GjjManifestListActivity -> { - ARouter.getInstance().build(ARouterConstants.ACTIVITY_URL_GJJ_MANIFEST) - .navigation() - } - // 理货 - Constant.AuthName.GjjTallyListActivity -> { - ARouter.getInstance().build(ARouterConstants.ACTIVITY_URL_GJJ_Tally) - .navigation() - } - // 货物交接 - Constant.AuthName.GjjGoodsListActivity -> { - ARouter.getInstance().build(ARouterConstants.ACTIVITY_URL_GJJ_GOODS) + // 电报解析(电报生成) + Constant.AuthName.IntImpMsgParseActivity -> { + ARouter.getInstance().build(ARouterConstants.ACTIVITY_URL_INT_IMP_MSG_PARSE) .navigation() } /** @@ -789,53 +754,12 @@ class HomeFragment : Fragment() { } Constant.AuthName.IntImp -> { + // 国际进港菜单 - 新版 list.add( RightMenu( - Constant.AuthName.GjjChuKuListActivity, - R.mipmap.gjj_chu_ku_icon, - "提取出库" - ) - ) - list.add( - RightMenu( - Constant.AuthName.GjjWareHouseActivity, - R.mipmap.gjj_cang_ku_icon, - "仓库管理" - ) - ) - list.add( - RightMenu( - Constant.AuthName.GjjQueryListActivity, - R.mipmap.gjj_query_icon, - "进港查询" - ) - ) - list.add( - RightMenu( - Constant.AuthName.GjjPacketParseActivity, + Constant.AuthName.IntImpMsgParseActivity, R.mipmap.img_bwjx, - "报文解析" - ) - ) - list.add( - RightMenu( - Constant.AuthName.GjjManifestListActivity, - R.mipmap.gjc_query_icon, - "进港舱单" - ) - ) - list.add( - RightMenu( - Constant.AuthName.GjjTallyListActivity, - R.mipmap.img_jglh, - "进港理货" - ) - ) - list.add( - RightMenu( - Constant.AuthName.GjjGoodsListActivity, - R.mipmap.img_hwjj, - "货物交接" + "电报解析" ) ) } diff --git a/module_base/src/main/java/com/lukouguoji/module_base/bean/MsgPoolPage.kt b/module_base/src/main/java/com/lukouguoji/module_base/bean/MsgPoolPage.kt new file mode 100644 index 0000000..cff0bb5 --- /dev/null +++ b/module_base/src/main/java/com/lukouguoji/module_base/bean/MsgPoolPage.kt @@ -0,0 +1,20 @@ +package com.lukouguoji.module_base.bean + +/** + * 电报分页查询请求参数 + */ +class MsgPoolPage( + var pageNum: Int = 1, // 页号 + var pageSize: Int = 10, // 每页显示条数 + var fdate: String = "", // 航班日期 + var fno: String = "", // 航班号 + var fid: Long? = null, // 航班id + var msgType: String = "", // 报文类型 + var sendAddress: String = "", // 发送地址(发站) + var flow: String = "", // 流向:接收0、发送1 + var teleContent: String = "", // 报文内容 + var startTime: String = "", // 时间起 + var endTime: String = "", // 时间止 + var startIndex: Int? = null, + var endIndex: Int? = null +) diff --git a/module_base/src/main/java/com/lukouguoji/module_base/bean/MsgReceivePool.kt b/module_base/src/main/java/com/lukouguoji/module_base/bean/MsgReceivePool.kt new file mode 100644 index 0000000..7a71808 --- /dev/null +++ b/module_base/src/main/java/com/lukouguoji/module_base/bean/MsgReceivePool.kt @@ -0,0 +1,50 @@ +package com.lukouguoji.module_base.bean + +import androidx.databinding.BaseObservable +import androidx.databinding.ObservableBoolean +import com.lukouguoji.module_base.interfaces.ICheck + +/** + * 国际进港电报接收池Bean + */ +class MsgReceivePool( + var id: Long? = null, + var msgType: String = "", // 报文类型 + var receiveTime: String = "", // 接收时间 + var teleContent: String = "", // 报文内容 + var anaStatus: String = "", // 生成(解析)状态:0-未生成;1-已生成 + var wbNo: String = "", // 主单号 + var hno: String = "", // 分单号 + var sendAddress: String = "", // 发报地址 + var receiveAddress: String = "", // 接收地址 + var status: String = "", // 报文状态 + var errorMsg: String = "", // 报文识别异常原因 + var key: String = "", // 关键字 + var interfaceType: String = "" // 接口类型 +) : BaseObservable(), ICheck { + + // 选中状态 + val checked = ObservableBoolean(false) + + override fun getCheckObservable() = checked + + // 兼容现有API的isSelected属性 + var isSelected: Boolean + get() = checked.get() + set(value) = checked.set(value) + + /** + * 判断是否已生成 + */ + fun isGenerated() = anaStatus == "1" + + /** + * 获取状态标签文本 + */ + fun getStatusLabel() = if (isGenerated()) "已生成" else "未生成" + + /** + * 获取状态标签颜色 + */ + fun getStatusColor() = if (isGenerated()) "#00C853" else "#FF5252" +} 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 6bdc902..aef9336 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 @@ -261,7 +261,8 @@ interface Constant { const val GjjChuKuListActivity = "AppIntImpPickUpDLV" //出库 const val GjjQueryListActivity = "AppIntImpSearch" //查询 - const val GjjPacketParseActivity = "AppIntExpPacketParse" //报文解析 + const val GjjPacketParseActivity = "AppIntExpPacketParse" //报文解析(旧) + const val IntImpMsgParseActivity = "AppIntImpMsgParse" //电报解析(电报生成) const val GjjManifestListActivity = "AppIntExpManifest" //舱单 const val GjjTallyListActivity = "AppIntExpTally" //理货 const val GjjGoodsListActivity = "AppIntExpGjjGoods" //货物交接 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 5da338e..7468331 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 @@ -74,6 +74,8 @@ import com.lukouguoji.module_base.bean.LogBean import com.lukouguoji.module_base.bean.ManifestTotalDto import com.lukouguoji.module_base.bean.MessageBean import com.lukouguoji.module_base.bean.MoveStashBean +import com.lukouguoji.module_base.bean.MsgPoolPage +import com.lukouguoji.module_base.bean.MsgReceivePool import com.lukouguoji.module_base.bean.PackageBean import com.lukouguoji.module_base.bean.PacketParseBean import com.lukouguoji.module_base.bean.PageInfo @@ -1516,4 +1518,20 @@ interface Api { @GET("file/verifyVersion") suspend fun getAppUpdate(@Query("versionCode") versionCode: Int): AppUpdateResponse + + /////////////////////////////////////////////////////////////////////////// + // 国际进港-电报解析 + /////////////////////////////////////////////////////////////////////////// + + /** + * 分页查询国际进港电报 + */ + @POST("IntImpMsg/pageQuery") + suspend fun getIntImpMsgList(@Body data: RequestBody): BaseResultBean> + + /** + * 批量生成电报 + */ + @POST("IntImpMsg/batchGenerate") + suspend fun batchGenerateMsg(@Body data: RequestBody): BaseResultBean } \ No newline at end of file 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 5fda4ff..c95aa4a 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 @@ -166,6 +166,7 @@ object ARouterConstants { const val ACTIVITY_URL_GJJ_MANIFEST = "/gjj/GjjManifestListActivity" //国际进港 舱单列表 const val ACTIVITY_URL_GJJ_Tally = "/gjj/GjjTallyListActivity" //国际进港 理货 const val ACTIVITY_URL_GJJ_GOODS = "/gjj/GjjGoodsListActivity" //国际进港 货物交接 + const val ACTIVITY_URL_INT_IMP_MSG_PARSE = "/gjj/IntImpMsgParseActivity" //国际进港 电报解析(电报生成) ///////////////// 航班查询模块 /** diff --git a/module_base/src/main/res/drawable/bg_status_error.xml b/module_base/src/main/res/drawable/bg_status_error.xml new file mode 100644 index 0000000..9f6cafb --- /dev/null +++ b/module_base/src/main/res/drawable/bg_status_error.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/module_base/src/main/res/drawable/bg_status_success.xml b/module_base/src/main/res/drawable/bg_status_success.xml new file mode 100644 index 0000000..7979acd --- /dev/null +++ b/module_base/src/main/res/drawable/bg_status_success.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/module_gjj/src/main/java/com/lukouguoji/gjj/activity/IntImpMsgParseActivity.kt b/module_gjj/src/main/java/com/lukouguoji/gjj/activity/IntImpMsgParseActivity.kt new file mode 100644 index 0000000..5341429 --- /dev/null +++ b/module_gjj/src/main/java/com/lukouguoji/gjj/activity/IntImpMsgParseActivity.kt @@ -0,0 +1,58 @@ +package com.lukouguoji.gjj.activity + +import android.content.Context +import android.content.Intent +import android.os.Bundle +import com.alibaba.android.arouter.facade.annotation.Route +import com.lukouguoji.gjj.R +import com.lukouguoji.gjj.databinding.ActivityIntImpMsgParseBinding +import com.lukouguoji.gjj.viewModel.IntImpMsgParseViewModel +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.addOnItemClickListener +import com.lukouguoji.module_base.router.ARouterConstants + +/** + * 国际进港-电报解析(电报生成)页面 + */ +@Route(path = ARouterConstants.ACTIVITY_URL_INT_IMP_MSG_PARSE) +class IntImpMsgParseActivity : + BaseBindingActivity() { + + override fun layoutId() = R.layout.activity_int_imp_msg_parse + override fun viewModelClass() = IntImpMsgParseViewModel::class.java + + override fun initOnCreate(savedInstanceState: Bundle?) { + setBackArrow("电报生成") + binding.viewModel = viewModel + + // 观察全选状态,更新图标透明度 + viewModel.isAllChecked.observe(this) { isAllChecked -> + binding.checkIcon.alpha = if (isAllChecked) 1.0f else 0.5f + } + + // 绑定分页 + viewModel.pageModel.bindSmartRefreshLayout(binding.srl, binding.rv, viewModel, this) + + // 设置item点击监听 + binding.rv.addOnItemClickListener(viewModel) + + // 监听刷新事件 + FlowBus.with(ConstantEvent.EVENT_REFRESH).observe(this) { + viewModel.refresh() + } + + // 初始加载数据 + viewModel.refresh() + } + + companion object { + @JvmStatic + fun start(context: Context) { + val starter = Intent(context, IntImpMsgParseActivity::class.java) + context.startActivity(starter) + } + } +} diff --git a/module_gjj/src/main/java/com/lukouguoji/gjj/holder/IntImpMsgParseViewHolder.kt b/module_gjj/src/main/java/com/lukouguoji/gjj/holder/IntImpMsgParseViewHolder.kt new file mode 100644 index 0000000..3016a9c --- /dev/null +++ b/module_gjj/src/main/java/com/lukouguoji/gjj/holder/IntImpMsgParseViewHolder.kt @@ -0,0 +1,32 @@ +package com.lukouguoji.gjj.holder + +import android.view.View +import com.lukouguoji.gjj.databinding.ItemIntImpMsgParseBinding +import com.lukouguoji.module_base.base.BaseViewHolder +import com.lukouguoji.module_base.bean.MsgReceivePool + +/** + * 国际进港电报解析列表项ViewHolder + */ +class IntImpMsgParseViewHolder(view: View) : + BaseViewHolder(view) { + + override fun onBind(item: Any?, position: Int) { + val bean = getItemBean(item) ?: return + binding.bean = bean + binding.position = position + binding.executePendingBindings() + + // 添加卡片点击事件 - 查看详情 + notifyItemClick(position, binding.cardView) + + // 添加选择图标点击事件 - 切换选择状态 + binding.ivCheck.setOnClickListener { + // 反转checked状态 + bean.checked.set(!bean.checked.get()) + + // 立即更新UI + binding.executePendingBindings() + } + } +} diff --git a/module_gjj/src/main/java/com/lukouguoji/gjj/viewModel/IntImpMsgParseViewModel.kt b/module_gjj/src/main/java/com/lukouguoji/gjj/viewModel/IntImpMsgParseViewModel.kt new file mode 100644 index 0000000..3dfb97d --- /dev/null +++ b/module_gjj/src/main/java/com/lukouguoji/gjj/viewModel/IntImpMsgParseViewModel.kt @@ -0,0 +1,138 @@ +package com.lukouguoji.gjj.viewModel + +import androidx.lifecycle.MutableLiveData +import androidx.lifecycle.viewModelScope +import com.lukouguoji.gjj.R +import com.lukouguoji.gjj.holder.IntImpMsgParseViewHolder +import com.lukouguoji.module_base.base.BasePageViewModel +import com.lukouguoji.module_base.bean.MsgReceivePool +import com.lukouguoji.module_base.common.ConstantEvent +import com.lukouguoji.module_base.http.net.NetApply +import com.lukouguoji.module_base.impl.FlowBus +import com.lukouguoji.module_base.ktx.commonAdapter +import com.lukouguoji.module_base.ktx.launchLoadingCollect +import com.lukouguoji.module_base.ktx.showToast +import com.lukouguoji.module_base.ktx.toRequestBody +import kotlinx.coroutines.launch + +/** + * 国际进港-电报解析 ViewModel + */ +class IntImpMsgParseViewModel : BasePageViewModel() { + + // ========== 搜索条件 ========== + val flightDate = MutableLiveData("") // 航班日期 + val flightNo = MutableLiveData("") // 航班号 + val sendAddress = MutableLiveData("") // 发站(择始发站) + val receiveAddress = MutableLiveData("HFE") // 收报地址(目的站) + val msgType = MutableLiveData("") // 报文类型 + + // ========== 统计信息 ========== + val totalCount = MutableLiveData("0") // 合计条数 + + // ========== 全选状态 ========== + val isAllChecked = MutableLiveData(false) + + init { + // 监听全选状态,自动更新所有列表项 + isAllChecked.observeForever { checked -> + val list = pageModel.rv?.commonAdapter()?.items as? List ?: return@observeForever + list.forEach { it.checked.set(checked) } + pageModel.rv?.commonAdapter()?.notifyDataSetChanged() + } + } + + // ========== 适配器配置 ========== + val itemViewHolder = IntImpMsgParseViewHolder::class.java + val itemLayoutId = R.layout.item_int_imp_msg_parse + + /** + * 搜索按钮点击 + */ + fun searchClick() { + refresh() + } + + /** + * 全选按钮点击(切换全选状态) + */ + fun checkAllClick() { + val list = pageModel.rv?.commonAdapter()?.items as? List ?: return + + // 切换全选状态 + val shouldCheckAll = !isAllChecked.value!! + list.forEach { it.checked.set(shouldCheckAll) } + isAllChecked.value = shouldCheckAll + + pageModel.rv?.commonAdapter()?.notifyDataSetChanged() + } + + /** + * 电报生成(批量操作) + */ + fun generateMsg() { + val list = pageModel.rv?.commonAdapter()?.items as? List ?: return + val selectedItems = list.filter { it.isSelected } + + if (selectedItems.isEmpty()) { + showToast("请选择要生成的电报") + return + } + + // 提取选中项的ID列表 + val ids = selectedItems.mapNotNull { it.id } + val requestData = mapOf("ids" to ids).toRequestBody() + + launchLoadingCollect({ NetApply.api.batchGenerateMsg(requestData) }) { + onSuccess = { + showToast("电报生成成功") + viewModelScope.launch { + FlowBus.with(ConstantEvent.EVENT_REFRESH).emit("refresh") + } + refresh() + } + } + } + + /** + * 获取数据(重写BasePageViewModel) + */ + override fun getData() { + // 构建搜索条件 + val filterParams = mutableMapOf( + "fdate" to flightDate.value?.ifEmpty { null }, + "fno" to flightNo.value?.ifEmpty { null }, + "sendAddress" to sendAddress.value?.ifEmpty { null }, + "msgType" to msgType.value?.ifEmpty { null } + ) + + // 列表参数(含分页) + val listParams = (filterParams + mapOf( + "pageNum" to pageModel.page, + "pageSize" to pageModel.limit + )).toRequestBody() + + // 获取列表(带Loading) + launchLoadingCollect({ NetApply.api.getIntImpMsgList(listParams) }) { + onSuccess = { result -> + // 处理PageInfo结构 + val pageInfo = result.data + if (pageInfo != null) { + val list = pageInfo.list ?: emptyList() + val pages = pageInfo.pages ?: 1 + + // 更新统计信息 + totalCount.value = (pageInfo.total ?: 0).toString() + + // 处理分页数据 + pageModel.handleDataList(list) + pageModel.haveMore.postValue(pages > pageModel.page) + } else { + pageModel.handleDataList(emptyList()) + pageModel.haveMore.postValue(false) + totalCount.value = "0" + } + } + } + } +} diff --git a/module_gjj/src/main/res/layout/activity_int_imp_msg_parse.xml b/module_gjj/src/main/res/layout/activity_int_imp_msg_parse.xml new file mode 100644 index 0000000..bf12167 --- /dev/null +++ b/module_gjj/src/main/res/layout/activity_int_imp_msg_parse.xml @@ -0,0 +1,183 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/module_gjj/src/main/res/layout/item_int_imp_msg_parse.xml b/module_gjj/src/main/res/layout/item_int_imp_msg_parse.xml new file mode 100644 index 0000000..e0e6e8e --- /dev/null +++ b/module_gjj/src/main/res/layout/item_int_imp_msg_parse.xml @@ -0,0 +1,174 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +