package com.example.smart.ui.item import android.content.Context import android.text.TextUtils import android.view.Gravity import android.view.View import android.widget.LinearLayout import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.ViewModelStore import androidx.lifecycle.ViewModelStoreOwner import com.example.basecore.util.DateUtils import com.example.basecore.util.SchemeUtils import com.example.basecore.util.ToastUtils import com.example.basecore.util.toast import com.example.smart.R import com.example.smart.bean.EntityRef import com.example.smart.bean.IdRef import com.example.smart.databinding.MissionPopLayoutBinding import com.example.smart.enumlist.CheckTaskState import com.example.smart.ui.item.contacts.bean.MemberLiveData import com.example.smart.ui.item.popup.DynamicPopupViewModel import com.example.smart.ui.item.popup.data.DriverInfo import com.example.smart.ui.item.popup.data.MissionBean import com.example.smart.ui.item.popup.widget.MissionDriverView import com.example.smart.ui.project.bean.TaskDetailInfo import com.example.smart.util.contactsScheme import com.loper7.date_time_picker.dialog.CardDatePickerDialog import razerdp.basepopup.BasePopupWindow /** * @description: 设置任务信息 * @param mode 模式:true=新建项目-设置任务流程(选择刚创建的项目),false=新建任务模式(选择计划可用的项目) */ class CreateMissionPopWindow( val mContext: Context, val planId: Int, val projectId: Int, val success: () -> Unit, val mode: Boolean = true // true=新建项目模式,false=新建任务模式 ) : BasePopupWindow(mContext), ViewModelStoreOwner { var gravity = Gravity.BOTTOM private lateinit var binding: MissionPopLayoutBinding private var customModel: CreateMissionViewModel? = null private val driverInfoList = ArrayList() private val bean = MissionBean( ArrayList(), ArrayList(), ArrayList(), ArrayList(), "", "", ArrayList() ) // 当前选中的项目ID private var selectedProjectId: Int = projectId // 项目列表(新建任务模式下使用) private val projectList = ArrayList() init { setContentView(R.layout.mission_pop_layout) } override fun onViewCreated(contentView: View) { super.onViewCreated(contentView) binding = MissionPopLayoutBinding.bind(contentView) // 支持任何 Activity,而不仅仅是 CreateItemActivity if (mContext is androidx.lifecycle.ViewModelStoreOwner) { customModel = ViewModelProvider(mContext as androidx.lifecycle.ViewModelStoreOwner).get(CreateMissionViewModel::class.java) } else { customModel = ViewModelProvider(this).get(CreateMissionViewModel::class.java) } MemberLiveData.observeForever { if (it == "leader") { bean.leader.clear() bean.leader.addAll(MemberLiveData.getLeader()) } else { bean.crew.clear() bean.crew.addAll(MemberLiveData.getCrews()) } bindUserList() } initView() // 设置默认组长为当前用户 setDefaultLeader() // 根据模式设置项目选择框的显示 if (mode) { // 新建项目模式:隐藏选择按钮,只显示项目名称 binding.projectSelectTv.visibility = View.GONE setProjectName(projectId) } else { // 新建任务模式:显示选择按钮,加载项目列表 binding.projectSelectTv.visibility = View.VISIBLE loadProjectList(planId) } addClickListener() } private fun bindUserList() { var leaderTxt = "" for (member in bean.leader) { leaderTxt += if (bean.leader.last() != member) { member.name + "," } else { member.name } } binding.leaderTv.text = leaderTxt var crewTxt = "" for (member in bean.crew) { crewTxt += if (bean.crew.last() != member) { member.name + "," } else { member.name } } binding.crewTv.text = crewTxt } private fun initView() { binding.run { if (!TextUtils.isEmpty(bean.date)) { dateTv.text = bean.date } else { dateTv.text = DateUtils.getCurDate() } if (!TextUtils.isEmpty(bean.location)) { locationTv.setText(bean.location) } bindUserList() } // addDriverView() } /** * 加载项目列表(新建任务模式) */ private fun loadProjectList(planId: Int) { customModel?.getAvailableProjects(planId) { list -> projectList.clear() projectList.addAll(list) // 如果列表中有当前项目,选中它;否则选中第一个 if (projectList.any { it.code.toIntOrNull() == projectId }) { selectedProjectId = projectId } else if (projectList.isNotEmpty()) { selectedProjectId = projectList[0].code.toIntOrNull() ?: projectId } updateProjectDisplay() } } /** * 设置项目名称(新建项目模式) */ private fun setProjectName(projectId: Int) { customModel?.getProjectDetail(projectId) { project -> binding.projectTv.text = project?.name ?: "" selectedProjectId = projectId } } /** * 设置默认组长为当前用户 */ private fun setDefaultLeader() { customModel?.getCurrentUserProfile { profile -> profile?.let { // 如果当前没有组长,则设置当前用户为默认组长 if (MemberLiveData.getLeader().isEmpty()) { val currentUser = com.example.smart.ui.item.contacts.bean.MembersBean( roleName = "", // 角色名称,如果没有可以留空 mobile = it.mobile, code = it.userId ?: "", name = it.username ) MemberLiveData.addLeader(currentUser) bean.leader.clear() bean.leader.addAll(MemberLiveData.getLeader()) bindUserList() } } } } /** * 更新项目显示 */ private fun updateProjectDisplay() { val project = projectList.find { it.code.toIntOrNull() == selectedProjectId } binding.projectTv.text = project?.name ?: "" } /** * 显示项目选择弹窗 */ private fun showProjectSelector() { if (projectList.isEmpty()) { mContext.toast("暂无项目可选") return } val popup = com.example.smart.widget.dialog.CommonPopupWindow(mContext) popup.bindData(projectList) popup.listener = object : com.example.smart.widget.dialog.CommonPopupWindow.ItemClickListener { override fun onItemClick(bean: com.example.smart.bean.CommonOptionsBean) { selectedProjectId = bean.code.toIntOrNull() ?: projectId updateProjectDisplay() popup.dismiss() } } popup.popupGravity = Gravity.BOTTOM popup.showPopupWindow() } private fun addDriverView() { if (bean.drivers.isEmpty()) { val info = DriverInfo(EntityRef(0), EntityRef(0)) generateDriverView(info) return } for (int in 0 until bean.drivers.size) { val data = bean.drivers[int] generateDriverView(data) } for (data in bean.drivers) { generateDriverView(data) } } private fun generateDriverView(driver: DriverInfo) { val params = LinearLayout.LayoutParams( LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT ) val view = MissionDriverView(mContext, driver) view.layoutParams = params binding.driverContainer.addView(view) driverInfoList.add(driver) } private fun showDatePicker() { CardDatePickerDialog.builder(mContext) .setTitle("更新日期") .showBackNow(false) .setThemeColor(mContext.getColor(R.color.tab_select)) .setOnChoose(listener = object : CardDatePickerDialog.OnChooseListener { override fun onChoose(millisecond: Long) { binding.dateTv.text = DateUtils.stampToDate(millisecond) } }).build().show() } private fun addClickListener() { binding.apply { dateImg.setOnClickListener { showDatePicker() } dateTv.setOnClickListener { showDatePicker() } leaderSelectTv.setOnClickListener { SchemeUtils.openScheme(mContext, "$contactsScheme?from=leader") } crewSelectTv.setOnClickListener { SchemeUtils.openScheme(mContext, "$contactsScheme?from=crew") } // 项目选择 projectSelectTv.setOnClickListener { showProjectSelector() } projectTv.setOnClickListener { if (!mode) { // 只有新建任务模式才能选择项目 showProjectSelector() } } addTv.setOnClickListener { val info = DriverInfo(null, null) generateDriverView(info) } closeImg.setOnClickListener { dismiss() } ensureTv.setOnClickListener { val leaderTxt = binding.leaderTv.text.toString() if (TextUtils.isEmpty(leaderTxt)) { mContext.toast("请选择组长") return@setOnClickListener } for (info in driverInfoList) { if (info.driver != null && info.driver!!.id <= 0) { ToastUtils.showToast(mContext, "请输入司机名称") return@setOnClickListener } if (info.car != null && info.car!!.id <= 0) { ToastUtils.showToast(mContext, "请输入车牌号") return@setOnClickListener } } bean.date = binding.dateTv.text.toString() bean.location = binding.locationTv.text.toString() bean.cars = ArrayList() bean.useCarInfos.addAll(driverInfoList) val leaders = ArrayList() for (leader in bean.leader) { leaders.add(EntityRef(leader.code.toInt(), leader.name)) } val crews = ArrayList() for (crew in bean.crew) { crews.add(EntityRef(crew.code.toInt(), crew.name)) } val drivers = ArrayList() val cars = ArrayList() for (info in driverInfoList) { if (info.driver != null) { drivers.add(EntityRef(info.driver!!.id, info.driver!!.name)) } if (info.car != null) { cars.add(EntityRef(info.car!!.id, info.car!!.name)) } } //id、不对需要调整 val bean = TaskDetailInfo( 0, EntityRef(planId), EntityRef(selectedProjectId), client = null, state = CheckTaskState.Published, date = bean.date, assemblePlace = bean.location, createTime = "", updateTime = "", gps = ArrayList(), location = "", creator = EntityRef(0), groupLeaders = leaders, groupMembers = crews, drivers = drivers, cars = cars ) customModel?.createTask(bean, { ToastUtils.showToast(mContext, "发布成功") dismiss() success() }, { ToastUtils.showToast(mContext, "发布失败") dismiss() }) // dismiss() } } } override fun onDestroy() { super.onDestroy() MemberLiveData.removeObserver {} } private val mViewModelStore = ViewModelStore() override val viewModelStore: ViewModelStore = mViewModelStore }