diff --git a/app/build.gradle b/app/build.gradle index fdf5fc7..804f233 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -102,8 +102,6 @@ implementation 'com.google.code.gson:gson:2.8.6' //上拉加载下拉刷新 implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' - //高德地图搜索 - implementation 'com.amap.api:search:8.1.0' //高德导航 implementation 'com.amap.api:navi-3dmap:8.1.0_3dmap8.1.0' //日期选择器 diff --git a/app/build.gradle b/app/build.gradle index fdf5fc7..804f233 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -102,8 +102,6 @@ implementation 'com.google.code.gson:gson:2.8.6' //上拉加载下拉刷新 implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' - //高德地图搜索 - implementation 'com.amap.api:search:8.1.0' //高德导航 implementation 'com.amap.api:navi-3dmap:8.1.0_3dmap8.1.0' //日期选择器 diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 3fcef8b..460648b 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -9,6 +9,7 @@ + @@ -51,6 +52,7 @@ android:name=".view.BigImageActivity" android:theme="@style/Theme.BigImageActivity" /> + + @@ -51,6 +52,7 @@ android:name=".view.BigImageActivity" android:theme="@style/Theme.BigImageActivity" /> + () { + + private val countLimit = 4 + private var imageData: ArrayList = ArrayList() + + fun setupImage(images: ArrayList) { + this.imageData = images + notifyDataSetChanged() + } + + fun deleteImage(position: Int) { + if (imageData.size != 0) { + imageData.removeAt(position) + notifyDataSetChanged() + } + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { + val imageView = ImageView(context) + val screenWidth: Int = SizeUtil.getScreenWidth(context) - SizeUtil.dp2px(context, 40f) + val margins: Int = SizeUtil.dp2px(context, 3f) + val itemSize = (screenWidth - 6 * margins) / 3 + val params = LinearLayout.LayoutParams(itemSize, itemSize) + params.setMargins(margins, margins, margins, margins) + params.gravity = Gravity.CENTER + imageView.scaleType = ImageView.ScaleType.CENTER_CROP + imageView.layoutParams = params + return ItemViewHolder(imageView) + } + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + if (position == itemCount - 1 && imageData.size < countLimit) { + holder.imageView.setImageResource(R.drawable.ic_add_pic) + holder.imageView.setOnClickListener { //添加图片 + mOnItemClickListener!!.onAddImageClick() + } + } else { + Glide.with(context).load(imageData[position]).into(holder.imageView) + holder.imageView.setOnClickListener { // 点击操作,查看大图 + mOnItemClickListener!!.onItemClick(position) + } + // 长按监听 + holder.imageView.setOnLongClickListener { v -> //长按删除 + mOnItemClickListener!!.onItemLongClick(v, position) + true + } + } + } + + override fun getItemCount(): Int { + // 满3张图就不让其添加新图 + return if (imageData.size != 0 && imageData.size >= countLimit) { + countLimit + } else { + if (imageData.size == 0) 1 else imageData.size + 1 + } + } + + private var mOnItemClickListener: OnItemClickListener? = null + + fun setOnItemClickListener(onItemClickListener: OnItemClickListener?) { + mOnItemClickListener = onItemClickListener + } + + interface OnItemClickListener { + fun onAddImageClick() + fun onItemClick(position: Int) + fun onItemLongClick(view: View?, position: Int) + } + + inner class ItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val imageView: ImageView = itemView as ImageView + } +} \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index fdf5fc7..804f233 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -102,8 +102,6 @@ implementation 'com.google.code.gson:gson:2.8.6' //上拉加载下拉刷新 implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' - //高德地图搜索 - implementation 'com.amap.api:search:8.1.0' //高德导航 implementation 'com.amap.api:navi-3dmap:8.1.0_3dmap8.1.0' //日期选择器 diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 3fcef8b..460648b 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -9,6 +9,7 @@ + @@ -51,6 +52,7 @@ android:name=".view.BigImageActivity" android:theme="@style/Theme.BigImageActivity" /> + () { + + private val countLimit = 4 + private var imageData: ArrayList = ArrayList() + + fun setupImage(images: ArrayList) { + this.imageData = images + notifyDataSetChanged() + } + + fun deleteImage(position: Int) { + if (imageData.size != 0) { + imageData.removeAt(position) + notifyDataSetChanged() + } + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { + val imageView = ImageView(context) + val screenWidth: Int = SizeUtil.getScreenWidth(context) - SizeUtil.dp2px(context, 40f) + val margins: Int = SizeUtil.dp2px(context, 3f) + val itemSize = (screenWidth - 6 * margins) / 3 + val params = LinearLayout.LayoutParams(itemSize, itemSize) + params.setMargins(margins, margins, margins, margins) + params.gravity = Gravity.CENTER + imageView.scaleType = ImageView.ScaleType.CENTER_CROP + imageView.layoutParams = params + return ItemViewHolder(imageView) + } + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + if (position == itemCount - 1 && imageData.size < countLimit) { + holder.imageView.setImageResource(R.drawable.ic_add_pic) + holder.imageView.setOnClickListener { //添加图片 + mOnItemClickListener!!.onAddImageClick() + } + } else { + Glide.with(context).load(imageData[position]).into(holder.imageView) + holder.imageView.setOnClickListener { // 点击操作,查看大图 + mOnItemClickListener!!.onItemClick(position) + } + // 长按监听 + holder.imageView.setOnLongClickListener { v -> //长按删除 + mOnItemClickListener!!.onItemLongClick(v, position) + true + } + } + } + + override fun getItemCount(): Int { + // 满3张图就不让其添加新图 + return if (imageData.size != 0 && imageData.size >= countLimit) { + countLimit + } else { + if (imageData.size == 0) 1 else imageData.size + 1 + } + } + + private var mOnItemClickListener: OnItemClickListener? = null + + fun setOnItemClickListener(onItemClickListener: OnItemClickListener?) { + mOnItemClickListener = onItemClickListener + } + + interface OnItemClickListener { + fun onAddImageClick() + fun onItemClick(position: Int) + fun onItemLongClick(view: View?, position: Int) + } + + inner class ItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val imageView: ImageView = itemView as ImageView + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt index 3a098be..ad20c8b 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt @@ -31,7 +31,10 @@ setContentView(initLayoutView()) ImmersionBar.with(this).statusBarDarkFont(false).init() //沉浸式状态栏 when (this.javaClass.simpleName) { - "WelcomeActivity" -> ImmersionBar.with(this).statusBarDarkFont(true).init() + "WelcomeActivity" -> { + ImmersionBar.with(this).statusBarDarkFont(true).init() + StatusBarColorUtil.setColor(this, R.color.white.convertColor(this)) + } "SplashScreenActivity" -> ImmersionBar.with(this).statusBarDarkFont(false).init() "LoginActivity" -> ImmersionBar.with(this).statusBarDarkFont(true).init() else -> StatusBarColorUtil.setColor(this, R.color.mainThemeColor.convertColor(this)) diff --git a/app/build.gradle b/app/build.gradle index fdf5fc7..804f233 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -102,8 +102,6 @@ implementation 'com.google.code.gson:gson:2.8.6' //上拉加载下拉刷新 implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' - //高德地图搜索 - implementation 'com.amap.api:search:8.1.0' //高德导航 implementation 'com.amap.api:navi-3dmap:8.1.0_3dmap8.1.0' //日期选择器 diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 3fcef8b..460648b 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -9,6 +9,7 @@ + @@ -51,6 +52,7 @@ android:name=".view.BigImageActivity" android:theme="@style/Theme.BigImageActivity" /> + () { + + private val countLimit = 4 + private var imageData: ArrayList = ArrayList() + + fun setupImage(images: ArrayList) { + this.imageData = images + notifyDataSetChanged() + } + + fun deleteImage(position: Int) { + if (imageData.size != 0) { + imageData.removeAt(position) + notifyDataSetChanged() + } + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { + val imageView = ImageView(context) + val screenWidth: Int = SizeUtil.getScreenWidth(context) - SizeUtil.dp2px(context, 40f) + val margins: Int = SizeUtil.dp2px(context, 3f) + val itemSize = (screenWidth - 6 * margins) / 3 + val params = LinearLayout.LayoutParams(itemSize, itemSize) + params.setMargins(margins, margins, margins, margins) + params.gravity = Gravity.CENTER + imageView.scaleType = ImageView.ScaleType.CENTER_CROP + imageView.layoutParams = params + return ItemViewHolder(imageView) + } + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + if (position == itemCount - 1 && imageData.size < countLimit) { + holder.imageView.setImageResource(R.drawable.ic_add_pic) + holder.imageView.setOnClickListener { //添加图片 + mOnItemClickListener!!.onAddImageClick() + } + } else { + Glide.with(context).load(imageData[position]).into(holder.imageView) + holder.imageView.setOnClickListener { // 点击操作,查看大图 + mOnItemClickListener!!.onItemClick(position) + } + // 长按监听 + holder.imageView.setOnLongClickListener { v -> //长按删除 + mOnItemClickListener!!.onItemLongClick(v, position) + true + } + } + } + + override fun getItemCount(): Int { + // 满3张图就不让其添加新图 + return if (imageData.size != 0 && imageData.size >= countLimit) { + countLimit + } else { + if (imageData.size == 0) 1 else imageData.size + 1 + } + } + + private var mOnItemClickListener: OnItemClickListener? = null + + fun setOnItemClickListener(onItemClickListener: OnItemClickListener?) { + mOnItemClickListener = onItemClickListener + } + + interface OnItemClickListener { + fun onAddImageClick() + fun onItemClick(position: Int) + fun onItemLongClick(view: View?, position: Int) + } + + inner class ItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val imageView: ImageView = itemView as ImageView + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt index 3a098be..ad20c8b 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt @@ -31,7 +31,10 @@ setContentView(initLayoutView()) ImmersionBar.with(this).statusBarDarkFont(false).init() //沉浸式状态栏 when (this.javaClass.simpleName) { - "WelcomeActivity" -> ImmersionBar.with(this).statusBarDarkFont(true).init() + "WelcomeActivity" -> { + ImmersionBar.with(this).statusBarDarkFont(true).init() + StatusBarColorUtil.setColor(this, R.color.white.convertColor(this)) + } "SplashScreenActivity" -> ImmersionBar.with(this).statusBarDarkFont(false).init() "LoginActivity" -> ImmersionBar.with(this).statusBarDarkFont(true).init() else -> StatusBarColorUtil.setColor(this, R.color.mainThemeColor.convertColor(this)) diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/extensions/ArrayList.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/extensions/ArrayList.kt index e77dbaa..3affed7 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/extensions/ArrayList.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/extensions/ArrayList.kt @@ -13,7 +13,7 @@ if (index == this.size - 1) { builder.append(s) } else { - builder.append(s).append(",") + builder.append(s).append(";") } } return builder.toString() diff --git a/app/build.gradle b/app/build.gradle index fdf5fc7..804f233 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -102,8 +102,6 @@ implementation 'com.google.code.gson:gson:2.8.6' //上拉加载下拉刷新 implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' - //高德地图搜索 - implementation 'com.amap.api:search:8.1.0' //高德导航 implementation 'com.amap.api:navi-3dmap:8.1.0_3dmap8.1.0' //日期选择器 diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 3fcef8b..460648b 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -9,6 +9,7 @@ + @@ -51,6 +52,7 @@ android:name=".view.BigImageActivity" android:theme="@style/Theme.BigImageActivity" /> + () { + + private val countLimit = 4 + private var imageData: ArrayList = ArrayList() + + fun setupImage(images: ArrayList) { + this.imageData = images + notifyDataSetChanged() + } + + fun deleteImage(position: Int) { + if (imageData.size != 0) { + imageData.removeAt(position) + notifyDataSetChanged() + } + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { + val imageView = ImageView(context) + val screenWidth: Int = SizeUtil.getScreenWidth(context) - SizeUtil.dp2px(context, 40f) + val margins: Int = SizeUtil.dp2px(context, 3f) + val itemSize = (screenWidth - 6 * margins) / 3 + val params = LinearLayout.LayoutParams(itemSize, itemSize) + params.setMargins(margins, margins, margins, margins) + params.gravity = Gravity.CENTER + imageView.scaleType = ImageView.ScaleType.CENTER_CROP + imageView.layoutParams = params + return ItemViewHolder(imageView) + } + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + if (position == itemCount - 1 && imageData.size < countLimit) { + holder.imageView.setImageResource(R.drawable.ic_add_pic) + holder.imageView.setOnClickListener { //添加图片 + mOnItemClickListener!!.onAddImageClick() + } + } else { + Glide.with(context).load(imageData[position]).into(holder.imageView) + holder.imageView.setOnClickListener { // 点击操作,查看大图 + mOnItemClickListener!!.onItemClick(position) + } + // 长按监听 + holder.imageView.setOnLongClickListener { v -> //长按删除 + mOnItemClickListener!!.onItemLongClick(v, position) + true + } + } + } + + override fun getItemCount(): Int { + // 满3张图就不让其添加新图 + return if (imageData.size != 0 && imageData.size >= countLimit) { + countLimit + } else { + if (imageData.size == 0) 1 else imageData.size + 1 + } + } + + private var mOnItemClickListener: OnItemClickListener? = null + + fun setOnItemClickListener(onItemClickListener: OnItemClickListener?) { + mOnItemClickListener = onItemClickListener + } + + interface OnItemClickListener { + fun onAddImageClick() + fun onItemClick(position: Int) + fun onItemLongClick(view: View?, position: Int) + } + + inner class ItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val imageView: ImageView = itemView as ImageView + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt index 3a098be..ad20c8b 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt @@ -31,7 +31,10 @@ setContentView(initLayoutView()) ImmersionBar.with(this).statusBarDarkFont(false).init() //沉浸式状态栏 when (this.javaClass.simpleName) { - "WelcomeActivity" -> ImmersionBar.with(this).statusBarDarkFont(true).init() + "WelcomeActivity" -> { + ImmersionBar.with(this).statusBarDarkFont(true).init() + StatusBarColorUtil.setColor(this, R.color.white.convertColor(this)) + } "SplashScreenActivity" -> ImmersionBar.with(this).statusBarDarkFont(false).init() "LoginActivity" -> ImmersionBar.with(this).statusBarDarkFont(true).init() else -> StatusBarColorUtil.setColor(this, R.color.mainThemeColor.convertColor(this)) diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/extensions/ArrayList.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/extensions/ArrayList.kt index e77dbaa..3affed7 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/extensions/ArrayList.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/extensions/ArrayList.kt @@ -13,7 +13,7 @@ if (index == this.size - 1) { builder.append(s) } else { - builder.append(s).append(",") + builder.append(s).append(";") } } return builder.toString() diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/model/AreaModel.java b/app/src/main/java/com/casic/app/smartwell/sanxi/model/AreaModel.java new file mode 100644 index 0000000..3ee4c83 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/model/AreaModel.java @@ -0,0 +1,125 @@ +package com.casic.app.smartwell.sanxi.model; + +public class AreaModel { + + private int code; + private DataBean data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataBean getData() { + return data; + } + + public void setData(DataBean data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private String area; + private String communications; + private String deptid; + private String deviceTypes; + private String id; + private String lat; + private String lng; + private String map; + private String wellTypes; + + public String getArea() { + return area; + } + + public void setArea(String area) { + this.area = area; + } + + public String getCommunications() { + return communications; + } + + public void setCommunications(String communications) { + this.communications = communications; + } + + public String getDeptid() { + return deptid; + } + + public void setDeptid(String deptid) { + this.deptid = deptid; + } + + public String getDeviceTypes() { + return deviceTypes; + } + + public void setDeviceTypes(String deviceTypes) { + this.deviceTypes = deviceTypes; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getLat() { + return lat; + } + + public void setLat(String lat) { + this.lat = lat; + } + + public String getLng() { + return lng; + } + + public void setLng(String lng) { + this.lng = lng; + } + + public String getMap() { + return map; + } + + public void setMap(String map) { + this.map = map; + } + + public String getWellTypes() { + return wellTypes; + } + + public void setWellTypes(String wellTypes) { + this.wellTypes = wellTypes; + } + } +} diff --git a/app/build.gradle b/app/build.gradle index fdf5fc7..804f233 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -102,8 +102,6 @@ implementation 'com.google.code.gson:gson:2.8.6' //上拉加载下拉刷新 implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' - //高德地图搜索 - implementation 'com.amap.api:search:8.1.0' //高德导航 implementation 'com.amap.api:navi-3dmap:8.1.0_3dmap8.1.0' //日期选择器 diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 3fcef8b..460648b 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -9,6 +9,7 @@ + @@ -51,6 +52,7 @@ android:name=".view.BigImageActivity" android:theme="@style/Theme.BigImageActivity" /> + () { + + private val countLimit = 4 + private var imageData: ArrayList = ArrayList() + + fun setupImage(images: ArrayList) { + this.imageData = images + notifyDataSetChanged() + } + + fun deleteImage(position: Int) { + if (imageData.size != 0) { + imageData.removeAt(position) + notifyDataSetChanged() + } + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { + val imageView = ImageView(context) + val screenWidth: Int = SizeUtil.getScreenWidth(context) - SizeUtil.dp2px(context, 40f) + val margins: Int = SizeUtil.dp2px(context, 3f) + val itemSize = (screenWidth - 6 * margins) / 3 + val params = LinearLayout.LayoutParams(itemSize, itemSize) + params.setMargins(margins, margins, margins, margins) + params.gravity = Gravity.CENTER + imageView.scaleType = ImageView.ScaleType.CENTER_CROP + imageView.layoutParams = params + return ItemViewHolder(imageView) + } + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + if (position == itemCount - 1 && imageData.size < countLimit) { + holder.imageView.setImageResource(R.drawable.ic_add_pic) + holder.imageView.setOnClickListener { //添加图片 + mOnItemClickListener!!.onAddImageClick() + } + } else { + Glide.with(context).load(imageData[position]).into(holder.imageView) + holder.imageView.setOnClickListener { // 点击操作,查看大图 + mOnItemClickListener!!.onItemClick(position) + } + // 长按监听 + holder.imageView.setOnLongClickListener { v -> //长按删除 + mOnItemClickListener!!.onItemLongClick(v, position) + true + } + } + } + + override fun getItemCount(): Int { + // 满3张图就不让其添加新图 + return if (imageData.size != 0 && imageData.size >= countLimit) { + countLimit + } else { + if (imageData.size == 0) 1 else imageData.size + 1 + } + } + + private var mOnItemClickListener: OnItemClickListener? = null + + fun setOnItemClickListener(onItemClickListener: OnItemClickListener?) { + mOnItemClickListener = onItemClickListener + } + + interface OnItemClickListener { + fun onAddImageClick() + fun onItemClick(position: Int) + fun onItemLongClick(view: View?, position: Int) + } + + inner class ItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val imageView: ImageView = itemView as ImageView + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt index 3a098be..ad20c8b 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt @@ -31,7 +31,10 @@ setContentView(initLayoutView()) ImmersionBar.with(this).statusBarDarkFont(false).init() //沉浸式状态栏 when (this.javaClass.simpleName) { - "WelcomeActivity" -> ImmersionBar.with(this).statusBarDarkFont(true).init() + "WelcomeActivity" -> { + ImmersionBar.with(this).statusBarDarkFont(true).init() + StatusBarColorUtil.setColor(this, R.color.white.convertColor(this)) + } "SplashScreenActivity" -> ImmersionBar.with(this).statusBarDarkFont(false).init() "LoginActivity" -> ImmersionBar.with(this).statusBarDarkFont(true).init() else -> StatusBarColorUtil.setColor(this, R.color.mainThemeColor.convertColor(this)) diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/extensions/ArrayList.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/extensions/ArrayList.kt index e77dbaa..3affed7 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/extensions/ArrayList.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/extensions/ArrayList.kt @@ -13,7 +13,7 @@ if (index == this.size - 1) { builder.append(s) } else { - builder.append(s).append(",") + builder.append(s).append(";") } } return builder.toString() diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/model/AreaModel.java b/app/src/main/java/com/casic/app/smartwell/sanxi/model/AreaModel.java new file mode 100644 index 0000000..3ee4c83 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/model/AreaModel.java @@ -0,0 +1,125 @@ +package com.casic.app.smartwell.sanxi.model; + +public class AreaModel { + + private int code; + private DataBean data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataBean getData() { + return data; + } + + public void setData(DataBean data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private String area; + private String communications; + private String deptid; + private String deviceTypes; + private String id; + private String lat; + private String lng; + private String map; + private String wellTypes; + + public String getArea() { + return area; + } + + public void setArea(String area) { + this.area = area; + } + + public String getCommunications() { + return communications; + } + + public void setCommunications(String communications) { + this.communications = communications; + } + + public String getDeptid() { + return deptid; + } + + public void setDeptid(String deptid) { + this.deptid = deptid; + } + + public String getDeviceTypes() { + return deviceTypes; + } + + public void setDeviceTypes(String deviceTypes) { + this.deviceTypes = deviceTypes; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getLat() { + return lat; + } + + public void setLat(String lat) { + this.lat = lat; + } + + public String getLng() { + return lng; + } + + public void setLng(String lng) { + this.lng = lng; + } + + public String getMap() { + return map; + } + + public void setMap(String map) { + this.map = map; + } + + public String getWellTypes() { + return wellTypes; + } + + public void setWellTypes(String wellTypes) { + this.wellTypes = wellTypes; + } + } +} diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/model/DistrictModel.java b/app/src/main/java/com/casic/app/smartwell/sanxi/model/DistrictModel.java new file mode 100644 index 0000000..02e9ef2 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/model/DistrictModel.java @@ -0,0 +1,172 @@ +package com.casic.app.smartwell.sanxi.model; + +import java.util.List; + +public class DistrictModel { + + private int code; + private List data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public List getData() { + return data; + } + + public void setData(List data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private String id; + private String isSync; + private String lat; + private int level; + private String levelName; + private String lng; + private String name; + private int num; + private String pName; + private String pid; + private String pids; + private String simplename; + private String targetIdSync; + private String targetPidSync; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getIsSync() { + return isSync; + } + + public void setIsSync(String isSync) { + this.isSync = isSync; + } + + public String getLat() { + return lat; + } + + public void setLat(String lat) { + this.lat = lat; + } + + public int getLevel() { + return level; + } + + public void setLevel(int level) { + this.level = level; + } + + public String getLevelName() { + return levelName; + } + + public void setLevelName(String levelName) { + this.levelName = levelName; + } + + public String getLng() { + return lng; + } + + public void setLng(String lng) { + this.lng = lng; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getNum() { + return num; + } + + public void setNum(int num) { + this.num = num; + } + + public String getPName() { + return pName; + } + + public void setPName(String pName) { + this.pName = pName; + } + + public String getPid() { + return pid; + } + + public void setPid(String pid) { + this.pid = pid; + } + + public String getPids() { + return pids; + } + + public void setPids(String pids) { + this.pids = pids; + } + + public String getSimplename() { + return simplename; + } + + public void setSimplename(String simplename) { + this.simplename = simplename; + } + + public String getTargetIdSync() { + return targetIdSync; + } + + public void setTargetIdSync(String targetIdSync) { + this.targetIdSync = targetIdSync; + } + + public String getTargetPidSync() { + return targetPidSync; + } + + public void setTargetPidSync(String targetPidSync) { + this.targetPidSync = targetPidSync; + } + } +} diff --git a/app/build.gradle b/app/build.gradle index fdf5fc7..804f233 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -102,8 +102,6 @@ implementation 'com.google.code.gson:gson:2.8.6' //上拉加载下拉刷新 implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' - //高德地图搜索 - implementation 'com.amap.api:search:8.1.0' //高德导航 implementation 'com.amap.api:navi-3dmap:8.1.0_3dmap8.1.0' //日期选择器 diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 3fcef8b..460648b 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -9,6 +9,7 @@ + @@ -51,6 +52,7 @@ android:name=".view.BigImageActivity" android:theme="@style/Theme.BigImageActivity" /> + () { + + private val countLimit = 4 + private var imageData: ArrayList = ArrayList() + + fun setupImage(images: ArrayList) { + this.imageData = images + notifyDataSetChanged() + } + + fun deleteImage(position: Int) { + if (imageData.size != 0) { + imageData.removeAt(position) + notifyDataSetChanged() + } + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { + val imageView = ImageView(context) + val screenWidth: Int = SizeUtil.getScreenWidth(context) - SizeUtil.dp2px(context, 40f) + val margins: Int = SizeUtil.dp2px(context, 3f) + val itemSize = (screenWidth - 6 * margins) / 3 + val params = LinearLayout.LayoutParams(itemSize, itemSize) + params.setMargins(margins, margins, margins, margins) + params.gravity = Gravity.CENTER + imageView.scaleType = ImageView.ScaleType.CENTER_CROP + imageView.layoutParams = params + return ItemViewHolder(imageView) + } + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + if (position == itemCount - 1 && imageData.size < countLimit) { + holder.imageView.setImageResource(R.drawable.ic_add_pic) + holder.imageView.setOnClickListener { //添加图片 + mOnItemClickListener!!.onAddImageClick() + } + } else { + Glide.with(context).load(imageData[position]).into(holder.imageView) + holder.imageView.setOnClickListener { // 点击操作,查看大图 + mOnItemClickListener!!.onItemClick(position) + } + // 长按监听 + holder.imageView.setOnLongClickListener { v -> //长按删除 + mOnItemClickListener!!.onItemLongClick(v, position) + true + } + } + } + + override fun getItemCount(): Int { + // 满3张图就不让其添加新图 + return if (imageData.size != 0 && imageData.size >= countLimit) { + countLimit + } else { + if (imageData.size == 0) 1 else imageData.size + 1 + } + } + + private var mOnItemClickListener: OnItemClickListener? = null + + fun setOnItemClickListener(onItemClickListener: OnItemClickListener?) { + mOnItemClickListener = onItemClickListener + } + + interface OnItemClickListener { + fun onAddImageClick() + fun onItemClick(position: Int) + fun onItemLongClick(view: View?, position: Int) + } + + inner class ItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val imageView: ImageView = itemView as ImageView + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt index 3a098be..ad20c8b 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt @@ -31,7 +31,10 @@ setContentView(initLayoutView()) ImmersionBar.with(this).statusBarDarkFont(false).init() //沉浸式状态栏 when (this.javaClass.simpleName) { - "WelcomeActivity" -> ImmersionBar.with(this).statusBarDarkFont(true).init() + "WelcomeActivity" -> { + ImmersionBar.with(this).statusBarDarkFont(true).init() + StatusBarColorUtil.setColor(this, R.color.white.convertColor(this)) + } "SplashScreenActivity" -> ImmersionBar.with(this).statusBarDarkFont(false).init() "LoginActivity" -> ImmersionBar.with(this).statusBarDarkFont(true).init() else -> StatusBarColorUtil.setColor(this, R.color.mainThemeColor.convertColor(this)) diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/extensions/ArrayList.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/extensions/ArrayList.kt index e77dbaa..3affed7 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/extensions/ArrayList.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/extensions/ArrayList.kt @@ -13,7 +13,7 @@ if (index == this.size - 1) { builder.append(s) } else { - builder.append(s).append(",") + builder.append(s).append(";") } } return builder.toString() diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/model/AreaModel.java b/app/src/main/java/com/casic/app/smartwell/sanxi/model/AreaModel.java new file mode 100644 index 0000000..3ee4c83 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/model/AreaModel.java @@ -0,0 +1,125 @@ +package com.casic.app.smartwell.sanxi.model; + +public class AreaModel { + + private int code; + private DataBean data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataBean getData() { + return data; + } + + public void setData(DataBean data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private String area; + private String communications; + private String deptid; + private String deviceTypes; + private String id; + private String lat; + private String lng; + private String map; + private String wellTypes; + + public String getArea() { + return area; + } + + public void setArea(String area) { + this.area = area; + } + + public String getCommunications() { + return communications; + } + + public void setCommunications(String communications) { + this.communications = communications; + } + + public String getDeptid() { + return deptid; + } + + public void setDeptid(String deptid) { + this.deptid = deptid; + } + + public String getDeviceTypes() { + return deviceTypes; + } + + public void setDeviceTypes(String deviceTypes) { + this.deviceTypes = deviceTypes; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getLat() { + return lat; + } + + public void setLat(String lat) { + this.lat = lat; + } + + public String getLng() { + return lng; + } + + public void setLng(String lng) { + this.lng = lng; + } + + public String getMap() { + return map; + } + + public void setMap(String map) { + this.map = map; + } + + public String getWellTypes() { + return wellTypes; + } + + public void setWellTypes(String wellTypes) { + this.wellTypes = wellTypes; + } + } +} diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/model/DistrictModel.java b/app/src/main/java/com/casic/app/smartwell/sanxi/model/DistrictModel.java new file mode 100644 index 0000000..02e9ef2 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/model/DistrictModel.java @@ -0,0 +1,172 @@ +package com.casic.app.smartwell.sanxi.model; + +import java.util.List; + +public class DistrictModel { + + private int code; + private List data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public List getData() { + return data; + } + + public void setData(List data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private String id; + private String isSync; + private String lat; + private int level; + private String levelName; + private String lng; + private String name; + private int num; + private String pName; + private String pid; + private String pids; + private String simplename; + private String targetIdSync; + private String targetPidSync; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getIsSync() { + return isSync; + } + + public void setIsSync(String isSync) { + this.isSync = isSync; + } + + public String getLat() { + return lat; + } + + public void setLat(String lat) { + this.lat = lat; + } + + public int getLevel() { + return level; + } + + public void setLevel(int level) { + this.level = level; + } + + public String getLevelName() { + return levelName; + } + + public void setLevelName(String levelName) { + this.levelName = levelName; + } + + public String getLng() { + return lng; + } + + public void setLng(String lng) { + this.lng = lng; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getNum() { + return num; + } + + public void setNum(int num) { + this.num = num; + } + + public String getPName() { + return pName; + } + + public void setPName(String pName) { + this.pName = pName; + } + + public String getPid() { + return pid; + } + + public void setPid(String pid) { + this.pid = pid; + } + + public String getPids() { + return pids; + } + + public void setPids(String pids) { + this.pids = pids; + } + + public String getSimplename() { + return simplename; + } + + public void setSimplename(String simplename) { + this.simplename = simplename; + } + + public String getTargetIdSync() { + return targetIdSync; + } + + public void setTargetIdSync(String targetIdSync) { + this.targetIdSync = targetIdSync; + } + + public String getTargetPidSync() { + return targetPidSync; + } + + public void setTargetPidSync(String targetPidSync) { + this.targetPidSync = targetPidSync; + } + } +} diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/model/StreetModel.java b/app/src/main/java/com/casic/app/smartwell/sanxi/model/StreetModel.java new file mode 100644 index 0000000..90cc7d5 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/model/StreetModel.java @@ -0,0 +1,172 @@ +package com.casic.app.smartwell.sanxi.model; + +import java.util.List; + +public class StreetModel { + + private int code; + private List data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public List getData() { + return data; + } + + public void setData(List data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private String id; + private String isSync; + private String lat; + private int level; + private String levelName; + private String lng; + private String name; + private int num; + private String pName; + private String pid; + private String pids; + private String simplename; + private String targetIdSync; + private String targetPidSync; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getIsSync() { + return isSync; + } + + public void setIsSync(String isSync) { + this.isSync = isSync; + } + + public String getLat() { + return lat; + } + + public void setLat(String lat) { + this.lat = lat; + } + + public int getLevel() { + return level; + } + + public void setLevel(int level) { + this.level = level; + } + + public String getLevelName() { + return levelName; + } + + public void setLevelName(String levelName) { + this.levelName = levelName; + } + + public String getLng() { + return lng; + } + + public void setLng(String lng) { + this.lng = lng; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getNum() { + return num; + } + + public void setNum(int num) { + this.num = num; + } + + public String getPName() { + return pName; + } + + public void setPName(String pName) { + this.pName = pName; + } + + public String getPid() { + return pid; + } + + public void setPid(String pid) { + this.pid = pid; + } + + public String getPids() { + return pids; + } + + public void setPids(String pids) { + this.pids = pids; + } + + public String getSimplename() { + return simplename; + } + + public void setSimplename(String simplename) { + this.simplename = simplename; + } + + public String getTargetIdSync() { + return targetIdSync; + } + + public void setTargetIdSync(String targetIdSync) { + this.targetIdSync = targetIdSync; + } + + public String getTargetPidSync() { + return targetPidSync; + } + + public void setTargetPidSync(String targetPidSync) { + this.targetPidSync = targetPidSync; + } + } +} diff --git a/app/build.gradle b/app/build.gradle index fdf5fc7..804f233 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -102,8 +102,6 @@ implementation 'com.google.code.gson:gson:2.8.6' //上拉加载下拉刷新 implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' - //高德地图搜索 - implementation 'com.amap.api:search:8.1.0' //高德导航 implementation 'com.amap.api:navi-3dmap:8.1.0_3dmap8.1.0' //日期选择器 diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 3fcef8b..460648b 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -9,6 +9,7 @@ + @@ -51,6 +52,7 @@ android:name=".view.BigImageActivity" android:theme="@style/Theme.BigImageActivity" /> + () { + + private val countLimit = 4 + private var imageData: ArrayList = ArrayList() + + fun setupImage(images: ArrayList) { + this.imageData = images + notifyDataSetChanged() + } + + fun deleteImage(position: Int) { + if (imageData.size != 0) { + imageData.removeAt(position) + notifyDataSetChanged() + } + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { + val imageView = ImageView(context) + val screenWidth: Int = SizeUtil.getScreenWidth(context) - SizeUtil.dp2px(context, 40f) + val margins: Int = SizeUtil.dp2px(context, 3f) + val itemSize = (screenWidth - 6 * margins) / 3 + val params = LinearLayout.LayoutParams(itemSize, itemSize) + params.setMargins(margins, margins, margins, margins) + params.gravity = Gravity.CENTER + imageView.scaleType = ImageView.ScaleType.CENTER_CROP + imageView.layoutParams = params + return ItemViewHolder(imageView) + } + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + if (position == itemCount - 1 && imageData.size < countLimit) { + holder.imageView.setImageResource(R.drawable.ic_add_pic) + holder.imageView.setOnClickListener { //添加图片 + mOnItemClickListener!!.onAddImageClick() + } + } else { + Glide.with(context).load(imageData[position]).into(holder.imageView) + holder.imageView.setOnClickListener { // 点击操作,查看大图 + mOnItemClickListener!!.onItemClick(position) + } + // 长按监听 + holder.imageView.setOnLongClickListener { v -> //长按删除 + mOnItemClickListener!!.onItemLongClick(v, position) + true + } + } + } + + override fun getItemCount(): Int { + // 满3张图就不让其添加新图 + return if (imageData.size != 0 && imageData.size >= countLimit) { + countLimit + } else { + if (imageData.size == 0) 1 else imageData.size + 1 + } + } + + private var mOnItemClickListener: OnItemClickListener? = null + + fun setOnItemClickListener(onItemClickListener: OnItemClickListener?) { + mOnItemClickListener = onItemClickListener + } + + interface OnItemClickListener { + fun onAddImageClick() + fun onItemClick(position: Int) + fun onItemLongClick(view: View?, position: Int) + } + + inner class ItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val imageView: ImageView = itemView as ImageView + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt index 3a098be..ad20c8b 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt @@ -31,7 +31,10 @@ setContentView(initLayoutView()) ImmersionBar.with(this).statusBarDarkFont(false).init() //沉浸式状态栏 when (this.javaClass.simpleName) { - "WelcomeActivity" -> ImmersionBar.with(this).statusBarDarkFont(true).init() + "WelcomeActivity" -> { + ImmersionBar.with(this).statusBarDarkFont(true).init() + StatusBarColorUtil.setColor(this, R.color.white.convertColor(this)) + } "SplashScreenActivity" -> ImmersionBar.with(this).statusBarDarkFont(false).init() "LoginActivity" -> ImmersionBar.with(this).statusBarDarkFont(true).init() else -> StatusBarColorUtil.setColor(this, R.color.mainThemeColor.convertColor(this)) diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/extensions/ArrayList.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/extensions/ArrayList.kt index e77dbaa..3affed7 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/extensions/ArrayList.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/extensions/ArrayList.kt @@ -13,7 +13,7 @@ if (index == this.size - 1) { builder.append(s) } else { - builder.append(s).append(",") + builder.append(s).append(";") } } return builder.toString() diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/model/AreaModel.java b/app/src/main/java/com/casic/app/smartwell/sanxi/model/AreaModel.java new file mode 100644 index 0000000..3ee4c83 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/model/AreaModel.java @@ -0,0 +1,125 @@ +package com.casic.app.smartwell.sanxi.model; + +public class AreaModel { + + private int code; + private DataBean data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataBean getData() { + return data; + } + + public void setData(DataBean data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private String area; + private String communications; + private String deptid; + private String deviceTypes; + private String id; + private String lat; + private String lng; + private String map; + private String wellTypes; + + public String getArea() { + return area; + } + + public void setArea(String area) { + this.area = area; + } + + public String getCommunications() { + return communications; + } + + public void setCommunications(String communications) { + this.communications = communications; + } + + public String getDeptid() { + return deptid; + } + + public void setDeptid(String deptid) { + this.deptid = deptid; + } + + public String getDeviceTypes() { + return deviceTypes; + } + + public void setDeviceTypes(String deviceTypes) { + this.deviceTypes = deviceTypes; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getLat() { + return lat; + } + + public void setLat(String lat) { + this.lat = lat; + } + + public String getLng() { + return lng; + } + + public void setLng(String lng) { + this.lng = lng; + } + + public String getMap() { + return map; + } + + public void setMap(String map) { + this.map = map; + } + + public String getWellTypes() { + return wellTypes; + } + + public void setWellTypes(String wellTypes) { + this.wellTypes = wellTypes; + } + } +} diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/model/DistrictModel.java b/app/src/main/java/com/casic/app/smartwell/sanxi/model/DistrictModel.java new file mode 100644 index 0000000..02e9ef2 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/model/DistrictModel.java @@ -0,0 +1,172 @@ +package com.casic.app.smartwell.sanxi.model; + +import java.util.List; + +public class DistrictModel { + + private int code; + private List data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public List getData() { + return data; + } + + public void setData(List data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private String id; + private String isSync; + private String lat; + private int level; + private String levelName; + private String lng; + private String name; + private int num; + private String pName; + private String pid; + private String pids; + private String simplename; + private String targetIdSync; + private String targetPidSync; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getIsSync() { + return isSync; + } + + public void setIsSync(String isSync) { + this.isSync = isSync; + } + + public String getLat() { + return lat; + } + + public void setLat(String lat) { + this.lat = lat; + } + + public int getLevel() { + return level; + } + + public void setLevel(int level) { + this.level = level; + } + + public String getLevelName() { + return levelName; + } + + public void setLevelName(String levelName) { + this.levelName = levelName; + } + + public String getLng() { + return lng; + } + + public void setLng(String lng) { + this.lng = lng; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getNum() { + return num; + } + + public void setNum(int num) { + this.num = num; + } + + public String getPName() { + return pName; + } + + public void setPName(String pName) { + this.pName = pName; + } + + public String getPid() { + return pid; + } + + public void setPid(String pid) { + this.pid = pid; + } + + public String getPids() { + return pids; + } + + public void setPids(String pids) { + this.pids = pids; + } + + public String getSimplename() { + return simplename; + } + + public void setSimplename(String simplename) { + this.simplename = simplename; + } + + public String getTargetIdSync() { + return targetIdSync; + } + + public void setTargetIdSync(String targetIdSync) { + this.targetIdSync = targetIdSync; + } + + public String getTargetPidSync() { + return targetPidSync; + } + + public void setTargetPidSync(String targetPidSync) { + this.targetPidSync = targetPidSync; + } + } +} diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/model/StreetModel.java b/app/src/main/java/com/casic/app/smartwell/sanxi/model/StreetModel.java new file mode 100644 index 0000000..90cc7d5 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/model/StreetModel.java @@ -0,0 +1,172 @@ +package com.casic.app.smartwell.sanxi.model; + +import java.util.List; + +public class StreetModel { + + private int code; + private List data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public List getData() { + return data; + } + + public void setData(List data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private String id; + private String isSync; + private String lat; + private int level; + private String levelName; + private String lng; + private String name; + private int num; + private String pName; + private String pid; + private String pids; + private String simplename; + private String targetIdSync; + private String targetPidSync; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getIsSync() { + return isSync; + } + + public void setIsSync(String isSync) { + this.isSync = isSync; + } + + public String getLat() { + return lat; + } + + public void setLat(String lat) { + this.lat = lat; + } + + public int getLevel() { + return level; + } + + public void setLevel(int level) { + this.level = level; + } + + public String getLevelName() { + return levelName; + } + + public void setLevelName(String levelName) { + this.levelName = levelName; + } + + public String getLng() { + return lng; + } + + public void setLng(String lng) { + this.lng = lng; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getNum() { + return num; + } + + public void setNum(int num) { + this.num = num; + } + + public String getPName() { + return pName; + } + + public void setPName(String pName) { + this.pName = pName; + } + + public String getPid() { + return pid; + } + + public void setPid(String pid) { + this.pid = pid; + } + + public String getPids() { + return pids; + } + + public void setPids(String pids) { + this.pids = pids; + } + + public String getSimplename() { + return simplename; + } + + public void setSimplename(String simplename) { + this.simplename = simplename; + } + + public String getTargetIdSync() { + return targetIdSync; + } + + public void setTargetIdSync(String targetIdSync) { + this.targetIdSync = targetIdSync; + } + + public String getTargetPidSync() { + return targetPidSync; + } + + public void setTargetPidSync(String targetPidSync) { + this.targetPidSync = targetPidSync; + } + } +} diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/Constant.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/Constant.kt index bae51d6..3251baa 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/Constant.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/Constant.kt @@ -7,6 +7,7 @@ object Constant { val USER_PERMISSIONS = arrayOf( Manifest.permission.READ_EXTERNAL_STORAGE, + Manifest.permission.CAMERA, Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS, Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION, diff --git a/app/build.gradle b/app/build.gradle index fdf5fc7..804f233 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -102,8 +102,6 @@ implementation 'com.google.code.gson:gson:2.8.6' //上拉加载下拉刷新 implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' - //高德地图搜索 - implementation 'com.amap.api:search:8.1.0' //高德导航 implementation 'com.amap.api:navi-3dmap:8.1.0_3dmap8.1.0' //日期选择器 diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 3fcef8b..460648b 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -9,6 +9,7 @@ + @@ -51,6 +52,7 @@ android:name=".view.BigImageActivity" android:theme="@style/Theme.BigImageActivity" /> + () { + + private val countLimit = 4 + private var imageData: ArrayList = ArrayList() + + fun setupImage(images: ArrayList) { + this.imageData = images + notifyDataSetChanged() + } + + fun deleteImage(position: Int) { + if (imageData.size != 0) { + imageData.removeAt(position) + notifyDataSetChanged() + } + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { + val imageView = ImageView(context) + val screenWidth: Int = SizeUtil.getScreenWidth(context) - SizeUtil.dp2px(context, 40f) + val margins: Int = SizeUtil.dp2px(context, 3f) + val itemSize = (screenWidth - 6 * margins) / 3 + val params = LinearLayout.LayoutParams(itemSize, itemSize) + params.setMargins(margins, margins, margins, margins) + params.gravity = Gravity.CENTER + imageView.scaleType = ImageView.ScaleType.CENTER_CROP + imageView.layoutParams = params + return ItemViewHolder(imageView) + } + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + if (position == itemCount - 1 && imageData.size < countLimit) { + holder.imageView.setImageResource(R.drawable.ic_add_pic) + holder.imageView.setOnClickListener { //添加图片 + mOnItemClickListener!!.onAddImageClick() + } + } else { + Glide.with(context).load(imageData[position]).into(holder.imageView) + holder.imageView.setOnClickListener { // 点击操作,查看大图 + mOnItemClickListener!!.onItemClick(position) + } + // 长按监听 + holder.imageView.setOnLongClickListener { v -> //长按删除 + mOnItemClickListener!!.onItemLongClick(v, position) + true + } + } + } + + override fun getItemCount(): Int { + // 满3张图就不让其添加新图 + return if (imageData.size != 0 && imageData.size >= countLimit) { + countLimit + } else { + if (imageData.size == 0) 1 else imageData.size + 1 + } + } + + private var mOnItemClickListener: OnItemClickListener? = null + + fun setOnItemClickListener(onItemClickListener: OnItemClickListener?) { + mOnItemClickListener = onItemClickListener + } + + interface OnItemClickListener { + fun onAddImageClick() + fun onItemClick(position: Int) + fun onItemLongClick(view: View?, position: Int) + } + + inner class ItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val imageView: ImageView = itemView as ImageView + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt index 3a098be..ad20c8b 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt @@ -31,7 +31,10 @@ setContentView(initLayoutView()) ImmersionBar.with(this).statusBarDarkFont(false).init() //沉浸式状态栏 when (this.javaClass.simpleName) { - "WelcomeActivity" -> ImmersionBar.with(this).statusBarDarkFont(true).init() + "WelcomeActivity" -> { + ImmersionBar.with(this).statusBarDarkFont(true).init() + StatusBarColorUtil.setColor(this, R.color.white.convertColor(this)) + } "SplashScreenActivity" -> ImmersionBar.with(this).statusBarDarkFont(false).init() "LoginActivity" -> ImmersionBar.with(this).statusBarDarkFont(true).init() else -> StatusBarColorUtil.setColor(this, R.color.mainThemeColor.convertColor(this)) diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/extensions/ArrayList.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/extensions/ArrayList.kt index e77dbaa..3affed7 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/extensions/ArrayList.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/extensions/ArrayList.kt @@ -13,7 +13,7 @@ if (index == this.size - 1) { builder.append(s) } else { - builder.append(s).append(",") + builder.append(s).append(";") } } return builder.toString() diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/model/AreaModel.java b/app/src/main/java/com/casic/app/smartwell/sanxi/model/AreaModel.java new file mode 100644 index 0000000..3ee4c83 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/model/AreaModel.java @@ -0,0 +1,125 @@ +package com.casic.app.smartwell.sanxi.model; + +public class AreaModel { + + private int code; + private DataBean data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataBean getData() { + return data; + } + + public void setData(DataBean data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private String area; + private String communications; + private String deptid; + private String deviceTypes; + private String id; + private String lat; + private String lng; + private String map; + private String wellTypes; + + public String getArea() { + return area; + } + + public void setArea(String area) { + this.area = area; + } + + public String getCommunications() { + return communications; + } + + public void setCommunications(String communications) { + this.communications = communications; + } + + public String getDeptid() { + return deptid; + } + + public void setDeptid(String deptid) { + this.deptid = deptid; + } + + public String getDeviceTypes() { + return deviceTypes; + } + + public void setDeviceTypes(String deviceTypes) { + this.deviceTypes = deviceTypes; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getLat() { + return lat; + } + + public void setLat(String lat) { + this.lat = lat; + } + + public String getLng() { + return lng; + } + + public void setLng(String lng) { + this.lng = lng; + } + + public String getMap() { + return map; + } + + public void setMap(String map) { + this.map = map; + } + + public String getWellTypes() { + return wellTypes; + } + + public void setWellTypes(String wellTypes) { + this.wellTypes = wellTypes; + } + } +} diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/model/DistrictModel.java b/app/src/main/java/com/casic/app/smartwell/sanxi/model/DistrictModel.java new file mode 100644 index 0000000..02e9ef2 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/model/DistrictModel.java @@ -0,0 +1,172 @@ +package com.casic.app.smartwell.sanxi.model; + +import java.util.List; + +public class DistrictModel { + + private int code; + private List data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public List getData() { + return data; + } + + public void setData(List data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private String id; + private String isSync; + private String lat; + private int level; + private String levelName; + private String lng; + private String name; + private int num; + private String pName; + private String pid; + private String pids; + private String simplename; + private String targetIdSync; + private String targetPidSync; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getIsSync() { + return isSync; + } + + public void setIsSync(String isSync) { + this.isSync = isSync; + } + + public String getLat() { + return lat; + } + + public void setLat(String lat) { + this.lat = lat; + } + + public int getLevel() { + return level; + } + + public void setLevel(int level) { + this.level = level; + } + + public String getLevelName() { + return levelName; + } + + public void setLevelName(String levelName) { + this.levelName = levelName; + } + + public String getLng() { + return lng; + } + + public void setLng(String lng) { + this.lng = lng; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getNum() { + return num; + } + + public void setNum(int num) { + this.num = num; + } + + public String getPName() { + return pName; + } + + public void setPName(String pName) { + this.pName = pName; + } + + public String getPid() { + return pid; + } + + public void setPid(String pid) { + this.pid = pid; + } + + public String getPids() { + return pids; + } + + public void setPids(String pids) { + this.pids = pids; + } + + public String getSimplename() { + return simplename; + } + + public void setSimplename(String simplename) { + this.simplename = simplename; + } + + public String getTargetIdSync() { + return targetIdSync; + } + + public void setTargetIdSync(String targetIdSync) { + this.targetIdSync = targetIdSync; + } + + public String getTargetPidSync() { + return targetPidSync; + } + + public void setTargetPidSync(String targetPidSync) { + this.targetPidSync = targetPidSync; + } + } +} diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/model/StreetModel.java b/app/src/main/java/com/casic/app/smartwell/sanxi/model/StreetModel.java new file mode 100644 index 0000000..90cc7d5 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/model/StreetModel.java @@ -0,0 +1,172 @@ +package com.casic.app.smartwell.sanxi.model; + +import java.util.List; + +public class StreetModel { + + private int code; + private List data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public List getData() { + return data; + } + + public void setData(List data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private String id; + private String isSync; + private String lat; + private int level; + private String levelName; + private String lng; + private String name; + private int num; + private String pName; + private String pid; + private String pids; + private String simplename; + private String targetIdSync; + private String targetPidSync; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getIsSync() { + return isSync; + } + + public void setIsSync(String isSync) { + this.isSync = isSync; + } + + public String getLat() { + return lat; + } + + public void setLat(String lat) { + this.lat = lat; + } + + public int getLevel() { + return level; + } + + public void setLevel(int level) { + this.level = level; + } + + public String getLevelName() { + return levelName; + } + + public void setLevelName(String levelName) { + this.levelName = levelName; + } + + public String getLng() { + return lng; + } + + public void setLng(String lng) { + this.lng = lng; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getNum() { + return num; + } + + public void setNum(int num) { + this.num = num; + } + + public String getPName() { + return pName; + } + + public void setPName(String pName) { + this.pName = pName; + } + + public String getPid() { + return pid; + } + + public void setPid(String pid) { + this.pid = pid; + } + + public String getPids() { + return pids; + } + + public void setPids(String pids) { + this.pids = pids; + } + + public String getSimplename() { + return simplename; + } + + public void setSimplename(String simplename) { + this.simplename = simplename; + } + + public String getTargetIdSync() { + return targetIdSync; + } + + public void setTargetIdSync(String targetIdSync) { + this.targetIdSync = targetIdSync; + } + + public String getTargetPidSync() { + return targetPidSync; + } + + public void setTargetPidSync(String targetPidSync) { + this.targetPidSync = targetPidSync; + } + } +} diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/Constant.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/Constant.kt index bae51d6..3251baa 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/Constant.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/Constant.kt @@ -7,6 +7,7 @@ object Constant { val USER_PERMISSIONS = arrayOf( Manifest.permission.READ_EXTERNAL_STORAGE, + Manifest.permission.CAMERA, Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS, Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION, diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/FileUtils.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/FileUtils.kt index 3e9ae35..cef2d83 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/FileUtils.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/FileUtils.kt @@ -18,4 +18,13 @@ } return downloadDir.toString() } + + val imageCompressPath: String + get() { + val imageDir = File(context.getExternalFilesDir(Environment.DIRECTORY_PICTURES), "") + if (!imageDir.exists()) { + imageDir.mkdir() + } + return imageDir.toString() + } } \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index fdf5fc7..804f233 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -102,8 +102,6 @@ implementation 'com.google.code.gson:gson:2.8.6' //上拉加载下拉刷新 implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' - //高德地图搜索 - implementation 'com.amap.api:search:8.1.0' //高德导航 implementation 'com.amap.api:navi-3dmap:8.1.0_3dmap8.1.0' //日期选择器 diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 3fcef8b..460648b 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -9,6 +9,7 @@ + @@ -51,6 +52,7 @@ android:name=".view.BigImageActivity" android:theme="@style/Theme.BigImageActivity" /> + () { + + private val countLimit = 4 + private var imageData: ArrayList = ArrayList() + + fun setupImage(images: ArrayList) { + this.imageData = images + notifyDataSetChanged() + } + + fun deleteImage(position: Int) { + if (imageData.size != 0) { + imageData.removeAt(position) + notifyDataSetChanged() + } + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { + val imageView = ImageView(context) + val screenWidth: Int = SizeUtil.getScreenWidth(context) - SizeUtil.dp2px(context, 40f) + val margins: Int = SizeUtil.dp2px(context, 3f) + val itemSize = (screenWidth - 6 * margins) / 3 + val params = LinearLayout.LayoutParams(itemSize, itemSize) + params.setMargins(margins, margins, margins, margins) + params.gravity = Gravity.CENTER + imageView.scaleType = ImageView.ScaleType.CENTER_CROP + imageView.layoutParams = params + return ItemViewHolder(imageView) + } + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + if (position == itemCount - 1 && imageData.size < countLimit) { + holder.imageView.setImageResource(R.drawable.ic_add_pic) + holder.imageView.setOnClickListener { //添加图片 + mOnItemClickListener!!.onAddImageClick() + } + } else { + Glide.with(context).load(imageData[position]).into(holder.imageView) + holder.imageView.setOnClickListener { // 点击操作,查看大图 + mOnItemClickListener!!.onItemClick(position) + } + // 长按监听 + holder.imageView.setOnLongClickListener { v -> //长按删除 + mOnItemClickListener!!.onItemLongClick(v, position) + true + } + } + } + + override fun getItemCount(): Int { + // 满3张图就不让其添加新图 + return if (imageData.size != 0 && imageData.size >= countLimit) { + countLimit + } else { + if (imageData.size == 0) 1 else imageData.size + 1 + } + } + + private var mOnItemClickListener: OnItemClickListener? = null + + fun setOnItemClickListener(onItemClickListener: OnItemClickListener?) { + mOnItemClickListener = onItemClickListener + } + + interface OnItemClickListener { + fun onAddImageClick() + fun onItemClick(position: Int) + fun onItemLongClick(view: View?, position: Int) + } + + inner class ItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val imageView: ImageView = itemView as ImageView + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt index 3a098be..ad20c8b 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt @@ -31,7 +31,10 @@ setContentView(initLayoutView()) ImmersionBar.with(this).statusBarDarkFont(false).init() //沉浸式状态栏 when (this.javaClass.simpleName) { - "WelcomeActivity" -> ImmersionBar.with(this).statusBarDarkFont(true).init() + "WelcomeActivity" -> { + ImmersionBar.with(this).statusBarDarkFont(true).init() + StatusBarColorUtil.setColor(this, R.color.white.convertColor(this)) + } "SplashScreenActivity" -> ImmersionBar.with(this).statusBarDarkFont(false).init() "LoginActivity" -> ImmersionBar.with(this).statusBarDarkFont(true).init() else -> StatusBarColorUtil.setColor(this, R.color.mainThemeColor.convertColor(this)) diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/extensions/ArrayList.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/extensions/ArrayList.kt index e77dbaa..3affed7 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/extensions/ArrayList.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/extensions/ArrayList.kt @@ -13,7 +13,7 @@ if (index == this.size - 1) { builder.append(s) } else { - builder.append(s).append(",") + builder.append(s).append(";") } } return builder.toString() diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/model/AreaModel.java b/app/src/main/java/com/casic/app/smartwell/sanxi/model/AreaModel.java new file mode 100644 index 0000000..3ee4c83 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/model/AreaModel.java @@ -0,0 +1,125 @@ +package com.casic.app.smartwell.sanxi.model; + +public class AreaModel { + + private int code; + private DataBean data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataBean getData() { + return data; + } + + public void setData(DataBean data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private String area; + private String communications; + private String deptid; + private String deviceTypes; + private String id; + private String lat; + private String lng; + private String map; + private String wellTypes; + + public String getArea() { + return area; + } + + public void setArea(String area) { + this.area = area; + } + + public String getCommunications() { + return communications; + } + + public void setCommunications(String communications) { + this.communications = communications; + } + + public String getDeptid() { + return deptid; + } + + public void setDeptid(String deptid) { + this.deptid = deptid; + } + + public String getDeviceTypes() { + return deviceTypes; + } + + public void setDeviceTypes(String deviceTypes) { + this.deviceTypes = deviceTypes; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getLat() { + return lat; + } + + public void setLat(String lat) { + this.lat = lat; + } + + public String getLng() { + return lng; + } + + public void setLng(String lng) { + this.lng = lng; + } + + public String getMap() { + return map; + } + + public void setMap(String map) { + this.map = map; + } + + public String getWellTypes() { + return wellTypes; + } + + public void setWellTypes(String wellTypes) { + this.wellTypes = wellTypes; + } + } +} diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/model/DistrictModel.java b/app/src/main/java/com/casic/app/smartwell/sanxi/model/DistrictModel.java new file mode 100644 index 0000000..02e9ef2 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/model/DistrictModel.java @@ -0,0 +1,172 @@ +package com.casic.app.smartwell.sanxi.model; + +import java.util.List; + +public class DistrictModel { + + private int code; + private List data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public List getData() { + return data; + } + + public void setData(List data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private String id; + private String isSync; + private String lat; + private int level; + private String levelName; + private String lng; + private String name; + private int num; + private String pName; + private String pid; + private String pids; + private String simplename; + private String targetIdSync; + private String targetPidSync; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getIsSync() { + return isSync; + } + + public void setIsSync(String isSync) { + this.isSync = isSync; + } + + public String getLat() { + return lat; + } + + public void setLat(String lat) { + this.lat = lat; + } + + public int getLevel() { + return level; + } + + public void setLevel(int level) { + this.level = level; + } + + public String getLevelName() { + return levelName; + } + + public void setLevelName(String levelName) { + this.levelName = levelName; + } + + public String getLng() { + return lng; + } + + public void setLng(String lng) { + this.lng = lng; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getNum() { + return num; + } + + public void setNum(int num) { + this.num = num; + } + + public String getPName() { + return pName; + } + + public void setPName(String pName) { + this.pName = pName; + } + + public String getPid() { + return pid; + } + + public void setPid(String pid) { + this.pid = pid; + } + + public String getPids() { + return pids; + } + + public void setPids(String pids) { + this.pids = pids; + } + + public String getSimplename() { + return simplename; + } + + public void setSimplename(String simplename) { + this.simplename = simplename; + } + + public String getTargetIdSync() { + return targetIdSync; + } + + public void setTargetIdSync(String targetIdSync) { + this.targetIdSync = targetIdSync; + } + + public String getTargetPidSync() { + return targetPidSync; + } + + public void setTargetPidSync(String targetPidSync) { + this.targetPidSync = targetPidSync; + } + } +} diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/model/StreetModel.java b/app/src/main/java/com/casic/app/smartwell/sanxi/model/StreetModel.java new file mode 100644 index 0000000..90cc7d5 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/model/StreetModel.java @@ -0,0 +1,172 @@ +package com.casic.app.smartwell.sanxi.model; + +import java.util.List; + +public class StreetModel { + + private int code; + private List data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public List getData() { + return data; + } + + public void setData(List data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private String id; + private String isSync; + private String lat; + private int level; + private String levelName; + private String lng; + private String name; + private int num; + private String pName; + private String pid; + private String pids; + private String simplename; + private String targetIdSync; + private String targetPidSync; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getIsSync() { + return isSync; + } + + public void setIsSync(String isSync) { + this.isSync = isSync; + } + + public String getLat() { + return lat; + } + + public void setLat(String lat) { + this.lat = lat; + } + + public int getLevel() { + return level; + } + + public void setLevel(int level) { + this.level = level; + } + + public String getLevelName() { + return levelName; + } + + public void setLevelName(String levelName) { + this.levelName = levelName; + } + + public String getLng() { + return lng; + } + + public void setLng(String lng) { + this.lng = lng; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getNum() { + return num; + } + + public void setNum(int num) { + this.num = num; + } + + public String getPName() { + return pName; + } + + public void setPName(String pName) { + this.pName = pName; + } + + public String getPid() { + return pid; + } + + public void setPid(String pid) { + this.pid = pid; + } + + public String getPids() { + return pids; + } + + public void setPids(String pids) { + this.pids = pids; + } + + public String getSimplename() { + return simplename; + } + + public void setSimplename(String simplename) { + this.simplename = simplename; + } + + public String getTargetIdSync() { + return targetIdSync; + } + + public void setTargetIdSync(String targetIdSync) { + this.targetIdSync = targetIdSync; + } + + public String getTargetPidSync() { + return targetPidSync; + } + + public void setTargetPidSync(String targetPidSync) { + this.targetPidSync = targetPidSync; + } + } +} diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/Constant.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/Constant.kt index bae51d6..3251baa 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/Constant.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/Constant.kt @@ -7,6 +7,7 @@ object Constant { val USER_PERMISSIONS = arrayOf( Manifest.permission.READ_EXTERNAL_STORAGE, + Manifest.permission.CAMERA, Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS, Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION, diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/FileUtils.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/FileUtils.kt index 3e9ae35..cef2d83 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/FileUtils.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/FileUtils.kt @@ -18,4 +18,13 @@ } return downloadDir.toString() } + + val imageCompressPath: String + get() { + val imageDir = File(context.getExternalFilesDir(Environment.DIRECTORY_PICTURES), "") + if (!imageDir.exists()) { + imageDir.mkdir() + } + return imageDir.toString() + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt index 19687d2..bd311a4 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt @@ -289,6 +289,77 @@ ): String /** + * 上传图片 + * 系统路径static拼接图片返回路径 + * http://xx.com/static/2019-10/8050891248624f2bbefedcb196ce89cb.jpeg + */ + @Multipart + @POST("/imageUpload") + suspend fun uploadFile( + @Header("token") token: String, + @Part file: MultipartBody.Part + ): String + + /** + * 根据部门获取区ID + * + * @param deptId + */ + @GET("/config/getAreaByDept") + suspend fun obtainAreaByDept( + @Header("token") token: String, + @Query("deptId") deptId: String + ): String + + /** + * 获取区/县等 + * + * @param pid + */ + @GET("/area/list") + suspend fun obtainDistrict( + @Header("token") token: String, + @Query("pid") pid: String + ): String + + /** + * 获取街道 + * + * @param pid + */ + @GET("/area/list") + suspend fun obtainStreet( + @Header("token") token: String, + @Query("pid") pid: String + ): String + + /** + * 编辑更新井信息 + * + * @param id + */ + @FormUrlEncoded + @POST("/well/update") + suspend fun updateWellDetail( + @Header("token") token: String, + @Field("id") id: String, + @Field("wellCode") wellCode: String, + @Field("wellName") wellName: String, + @Field("wellType") wellType: String, + @Field("deptid") deptid: String, + @Field("deep") deep: String, + @Field("position") position: String, + @Field("coordinateX") coordinateX: String, + @Field("coordinateY") coordinateY: String, + @Field("photos") photos: String, + @Field("notes") notes: String?, + @Field("qu") qu: String, + @Field("area") area: String, + @Field("responsibleDept") responsibleDept: String, + @Field("responsibleDeptName") responsibleDeptName: String + ): String + + /** * 获取工单详情 * * @param id 工单id @@ -312,18 +383,6 @@ ): String /** - * 上传图片 - * 系统路径static拼接图片返回路径 - * http://xx.com/static/2019-10/8050891248624f2bbefedcb196ce89cb.jpeg - */ - @Multipart - @POST("/imageUpload") - suspend fun uploadImage( - @Header("token") token: String, - @Part file: MultipartBody.Part - ): String - - /** * 查找同一单位下的用户 * * @param hasMine 是否包含本人,1包含, 0不包含 diff --git a/app/build.gradle b/app/build.gradle index fdf5fc7..804f233 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -102,8 +102,6 @@ implementation 'com.google.code.gson:gson:2.8.6' //上拉加载下拉刷新 implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' - //高德地图搜索 - implementation 'com.amap.api:search:8.1.0' //高德导航 implementation 'com.amap.api:navi-3dmap:8.1.0_3dmap8.1.0' //日期选择器 diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 3fcef8b..460648b 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -9,6 +9,7 @@ + @@ -51,6 +52,7 @@ android:name=".view.BigImageActivity" android:theme="@style/Theme.BigImageActivity" /> + () { + + private val countLimit = 4 + private var imageData: ArrayList = ArrayList() + + fun setupImage(images: ArrayList) { + this.imageData = images + notifyDataSetChanged() + } + + fun deleteImage(position: Int) { + if (imageData.size != 0) { + imageData.removeAt(position) + notifyDataSetChanged() + } + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { + val imageView = ImageView(context) + val screenWidth: Int = SizeUtil.getScreenWidth(context) - SizeUtil.dp2px(context, 40f) + val margins: Int = SizeUtil.dp2px(context, 3f) + val itemSize = (screenWidth - 6 * margins) / 3 + val params = LinearLayout.LayoutParams(itemSize, itemSize) + params.setMargins(margins, margins, margins, margins) + params.gravity = Gravity.CENTER + imageView.scaleType = ImageView.ScaleType.CENTER_CROP + imageView.layoutParams = params + return ItemViewHolder(imageView) + } + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + if (position == itemCount - 1 && imageData.size < countLimit) { + holder.imageView.setImageResource(R.drawable.ic_add_pic) + holder.imageView.setOnClickListener { //添加图片 + mOnItemClickListener!!.onAddImageClick() + } + } else { + Glide.with(context).load(imageData[position]).into(holder.imageView) + holder.imageView.setOnClickListener { // 点击操作,查看大图 + mOnItemClickListener!!.onItemClick(position) + } + // 长按监听 + holder.imageView.setOnLongClickListener { v -> //长按删除 + mOnItemClickListener!!.onItemLongClick(v, position) + true + } + } + } + + override fun getItemCount(): Int { + // 满3张图就不让其添加新图 + return if (imageData.size != 0 && imageData.size >= countLimit) { + countLimit + } else { + if (imageData.size == 0) 1 else imageData.size + 1 + } + } + + private var mOnItemClickListener: OnItemClickListener? = null + + fun setOnItemClickListener(onItemClickListener: OnItemClickListener?) { + mOnItemClickListener = onItemClickListener + } + + interface OnItemClickListener { + fun onAddImageClick() + fun onItemClick(position: Int) + fun onItemLongClick(view: View?, position: Int) + } + + inner class ItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val imageView: ImageView = itemView as ImageView + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt index 3a098be..ad20c8b 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt @@ -31,7 +31,10 @@ setContentView(initLayoutView()) ImmersionBar.with(this).statusBarDarkFont(false).init() //沉浸式状态栏 when (this.javaClass.simpleName) { - "WelcomeActivity" -> ImmersionBar.with(this).statusBarDarkFont(true).init() + "WelcomeActivity" -> { + ImmersionBar.with(this).statusBarDarkFont(true).init() + StatusBarColorUtil.setColor(this, R.color.white.convertColor(this)) + } "SplashScreenActivity" -> ImmersionBar.with(this).statusBarDarkFont(false).init() "LoginActivity" -> ImmersionBar.with(this).statusBarDarkFont(true).init() else -> StatusBarColorUtil.setColor(this, R.color.mainThemeColor.convertColor(this)) diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/extensions/ArrayList.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/extensions/ArrayList.kt index e77dbaa..3affed7 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/extensions/ArrayList.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/extensions/ArrayList.kt @@ -13,7 +13,7 @@ if (index == this.size - 1) { builder.append(s) } else { - builder.append(s).append(",") + builder.append(s).append(";") } } return builder.toString() diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/model/AreaModel.java b/app/src/main/java/com/casic/app/smartwell/sanxi/model/AreaModel.java new file mode 100644 index 0000000..3ee4c83 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/model/AreaModel.java @@ -0,0 +1,125 @@ +package com.casic.app.smartwell.sanxi.model; + +public class AreaModel { + + private int code; + private DataBean data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataBean getData() { + return data; + } + + public void setData(DataBean data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private String area; + private String communications; + private String deptid; + private String deviceTypes; + private String id; + private String lat; + private String lng; + private String map; + private String wellTypes; + + public String getArea() { + return area; + } + + public void setArea(String area) { + this.area = area; + } + + public String getCommunications() { + return communications; + } + + public void setCommunications(String communications) { + this.communications = communications; + } + + public String getDeptid() { + return deptid; + } + + public void setDeptid(String deptid) { + this.deptid = deptid; + } + + public String getDeviceTypes() { + return deviceTypes; + } + + public void setDeviceTypes(String deviceTypes) { + this.deviceTypes = deviceTypes; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getLat() { + return lat; + } + + public void setLat(String lat) { + this.lat = lat; + } + + public String getLng() { + return lng; + } + + public void setLng(String lng) { + this.lng = lng; + } + + public String getMap() { + return map; + } + + public void setMap(String map) { + this.map = map; + } + + public String getWellTypes() { + return wellTypes; + } + + public void setWellTypes(String wellTypes) { + this.wellTypes = wellTypes; + } + } +} diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/model/DistrictModel.java b/app/src/main/java/com/casic/app/smartwell/sanxi/model/DistrictModel.java new file mode 100644 index 0000000..02e9ef2 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/model/DistrictModel.java @@ -0,0 +1,172 @@ +package com.casic.app.smartwell.sanxi.model; + +import java.util.List; + +public class DistrictModel { + + private int code; + private List data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public List getData() { + return data; + } + + public void setData(List data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private String id; + private String isSync; + private String lat; + private int level; + private String levelName; + private String lng; + private String name; + private int num; + private String pName; + private String pid; + private String pids; + private String simplename; + private String targetIdSync; + private String targetPidSync; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getIsSync() { + return isSync; + } + + public void setIsSync(String isSync) { + this.isSync = isSync; + } + + public String getLat() { + return lat; + } + + public void setLat(String lat) { + this.lat = lat; + } + + public int getLevel() { + return level; + } + + public void setLevel(int level) { + this.level = level; + } + + public String getLevelName() { + return levelName; + } + + public void setLevelName(String levelName) { + this.levelName = levelName; + } + + public String getLng() { + return lng; + } + + public void setLng(String lng) { + this.lng = lng; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getNum() { + return num; + } + + public void setNum(int num) { + this.num = num; + } + + public String getPName() { + return pName; + } + + public void setPName(String pName) { + this.pName = pName; + } + + public String getPid() { + return pid; + } + + public void setPid(String pid) { + this.pid = pid; + } + + public String getPids() { + return pids; + } + + public void setPids(String pids) { + this.pids = pids; + } + + public String getSimplename() { + return simplename; + } + + public void setSimplename(String simplename) { + this.simplename = simplename; + } + + public String getTargetIdSync() { + return targetIdSync; + } + + public void setTargetIdSync(String targetIdSync) { + this.targetIdSync = targetIdSync; + } + + public String getTargetPidSync() { + return targetPidSync; + } + + public void setTargetPidSync(String targetPidSync) { + this.targetPidSync = targetPidSync; + } + } +} diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/model/StreetModel.java b/app/src/main/java/com/casic/app/smartwell/sanxi/model/StreetModel.java new file mode 100644 index 0000000..90cc7d5 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/model/StreetModel.java @@ -0,0 +1,172 @@ +package com.casic.app.smartwell.sanxi.model; + +import java.util.List; + +public class StreetModel { + + private int code; + private List data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public List getData() { + return data; + } + + public void setData(List data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private String id; + private String isSync; + private String lat; + private int level; + private String levelName; + private String lng; + private String name; + private int num; + private String pName; + private String pid; + private String pids; + private String simplename; + private String targetIdSync; + private String targetPidSync; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getIsSync() { + return isSync; + } + + public void setIsSync(String isSync) { + this.isSync = isSync; + } + + public String getLat() { + return lat; + } + + public void setLat(String lat) { + this.lat = lat; + } + + public int getLevel() { + return level; + } + + public void setLevel(int level) { + this.level = level; + } + + public String getLevelName() { + return levelName; + } + + public void setLevelName(String levelName) { + this.levelName = levelName; + } + + public String getLng() { + return lng; + } + + public void setLng(String lng) { + this.lng = lng; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getNum() { + return num; + } + + public void setNum(int num) { + this.num = num; + } + + public String getPName() { + return pName; + } + + public void setPName(String pName) { + this.pName = pName; + } + + public String getPid() { + return pid; + } + + public void setPid(String pid) { + this.pid = pid; + } + + public String getPids() { + return pids; + } + + public void setPids(String pids) { + this.pids = pids; + } + + public String getSimplename() { + return simplename; + } + + public void setSimplename(String simplename) { + this.simplename = simplename; + } + + public String getTargetIdSync() { + return targetIdSync; + } + + public void setTargetIdSync(String targetIdSync) { + this.targetIdSync = targetIdSync; + } + + public String getTargetPidSync() { + return targetPidSync; + } + + public void setTargetPidSync(String targetPidSync) { + this.targetPidSync = targetPidSync; + } + } +} diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/Constant.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/Constant.kt index bae51d6..3251baa 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/Constant.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/Constant.kt @@ -7,6 +7,7 @@ object Constant { val USER_PERMISSIONS = arrayOf( Manifest.permission.READ_EXTERNAL_STORAGE, + Manifest.permission.CAMERA, Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS, Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION, diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/FileUtils.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/FileUtils.kt index 3e9ae35..cef2d83 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/FileUtils.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/FileUtils.kt @@ -18,4 +18,13 @@ } return downloadDir.toString() } + + val imageCompressPath: String + get() { + val imageDir = File(context.getExternalFilesDir(Environment.DIRECTORY_PICTURES), "") + if (!imageDir.exists()) { + imageDir.mkdir() + } + return imageDir.toString() + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt index 19687d2..bd311a4 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt @@ -289,6 +289,77 @@ ): String /** + * 上传图片 + * 系统路径static拼接图片返回路径 + * http://xx.com/static/2019-10/8050891248624f2bbefedcb196ce89cb.jpeg + */ + @Multipart + @POST("/imageUpload") + suspend fun uploadFile( + @Header("token") token: String, + @Part file: MultipartBody.Part + ): String + + /** + * 根据部门获取区ID + * + * @param deptId + */ + @GET("/config/getAreaByDept") + suspend fun obtainAreaByDept( + @Header("token") token: String, + @Query("deptId") deptId: String + ): String + + /** + * 获取区/县等 + * + * @param pid + */ + @GET("/area/list") + suspend fun obtainDistrict( + @Header("token") token: String, + @Query("pid") pid: String + ): String + + /** + * 获取街道 + * + * @param pid + */ + @GET("/area/list") + suspend fun obtainStreet( + @Header("token") token: String, + @Query("pid") pid: String + ): String + + /** + * 编辑更新井信息 + * + * @param id + */ + @FormUrlEncoded + @POST("/well/update") + suspend fun updateWellDetail( + @Header("token") token: String, + @Field("id") id: String, + @Field("wellCode") wellCode: String, + @Field("wellName") wellName: String, + @Field("wellType") wellType: String, + @Field("deptid") deptid: String, + @Field("deep") deep: String, + @Field("position") position: String, + @Field("coordinateX") coordinateX: String, + @Field("coordinateY") coordinateY: String, + @Field("photos") photos: String, + @Field("notes") notes: String?, + @Field("qu") qu: String, + @Field("area") area: String, + @Field("responsibleDept") responsibleDept: String, + @Field("responsibleDeptName") responsibleDeptName: String + ): String + + /** * 获取工单详情 * * @param id 工单id @@ -312,18 +383,6 @@ ): String /** - * 上传图片 - * 系统路径static拼接图片返回路径 - * http://xx.com/static/2019-10/8050891248624f2bbefedcb196ce89cb.jpeg - */ - @Multipart - @POST("/imageUpload") - suspend fun uploadImage( - @Header("token") token: String, - @Part file: MultipartBody.Part - ): String - - /** * 查找同一单位下的用户 * * @param hasMine 是否包含本人,1包含, 0不包含 diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt index efd6b11..e35e976 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt @@ -3,6 +3,10 @@ import com.casic.app.smartwell.sanxi.model.PublicKeyModel import com.casic.app.smartwell.sanxi.utils.AuthenticationHelper import com.casic.app.smartwell.sanxi.utils.Constant +import okhttp3.MediaType.Companion.toMediaTypeOrNull +import okhttp3.MultipartBody +import okhttp3.RequestBody +import java.io.File object RetrofitServiceManager { @@ -272,6 +276,76 @@ return api.obtainOperationResult(AuthenticationHelper.token!!, wellId, bfzt) } + /** + * 上传图片 + */ + suspend fun uploadFile(image: File): String { + val requestBody = RequestBody.create("image/png".toMediaTypeOrNull(), image) + val imagePart = MultipartBody.Part.createFormData("file", image.name, requestBody) + return api.uploadFile(AuthenticationHelper.token!!, imagePart) + } + + /** + * 根据部门获取区ID + */ + suspend fun obtainAreaByDept(deptId: String): String { + return api.obtainAreaByDept(AuthenticationHelper.token!!, deptId) + } + + /** + * 获取区/县等 + */ + suspend fun obtainDistrict(pid: String): String { + return api.obtainDistrict(AuthenticationHelper.token!!, pid) + } + + /** + * 获取街道 + */ + suspend fun obtainStreet(pid: String): String { + return api.obtainStreet(AuthenticationHelper.token!!, pid) + } + + /** + * 编辑更新井信息 + */ + suspend fun updateWellDetail( + id: String, + wellCode: String, + wellName: String, + wellType: String, + deptid: String, + deep: String, + position: String, + coordinateX: String, + coordinateY: String, + photos: String, + notes: String?, + qu: String, + area: String, + responsibleDept: String, + responsibleDeptName: String + ): String { + return api.updateWellDetail( + AuthenticationHelper.token!!, + id, + wellCode, + wellName, + wellType, + deptid, + deep, + position, + coordinateX, + coordinateY, + photos, + notes, + qu, + area, + responsibleDept, + responsibleDeptName + ) + } + // /** // * 获取工单详情 // */ @@ -287,15 +361,6 @@ // } // // /** -// * 上传图片 -// */ -// suspend fun uploadImage(image: File): String { -// val requestBody = RequestBody.create("image/png".toMediaTypeOrNull(), image) -// val imagePart = MultipartBody.Part.createFormData("file", image.name, requestBody) -// return api.uploadImage(AuthenticationHelper.token!!, imagePart) -// } -// -// /** // * 查找同一单位下的用户 // */ // suspend fun obtainSubordinate(hasMine: String?, roleTips: String?): String { diff --git a/app/build.gradle b/app/build.gradle index fdf5fc7..804f233 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -102,8 +102,6 @@ implementation 'com.google.code.gson:gson:2.8.6' //上拉加载下拉刷新 implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' - //高德地图搜索 - implementation 'com.amap.api:search:8.1.0' //高德导航 implementation 'com.amap.api:navi-3dmap:8.1.0_3dmap8.1.0' //日期选择器 diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 3fcef8b..460648b 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -9,6 +9,7 @@ + @@ -51,6 +52,7 @@ android:name=".view.BigImageActivity" android:theme="@style/Theme.BigImageActivity" /> + () { + + private val countLimit = 4 + private var imageData: ArrayList = ArrayList() + + fun setupImage(images: ArrayList) { + this.imageData = images + notifyDataSetChanged() + } + + fun deleteImage(position: Int) { + if (imageData.size != 0) { + imageData.removeAt(position) + notifyDataSetChanged() + } + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { + val imageView = ImageView(context) + val screenWidth: Int = SizeUtil.getScreenWidth(context) - SizeUtil.dp2px(context, 40f) + val margins: Int = SizeUtil.dp2px(context, 3f) + val itemSize = (screenWidth - 6 * margins) / 3 + val params = LinearLayout.LayoutParams(itemSize, itemSize) + params.setMargins(margins, margins, margins, margins) + params.gravity = Gravity.CENTER + imageView.scaleType = ImageView.ScaleType.CENTER_CROP + imageView.layoutParams = params + return ItemViewHolder(imageView) + } + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + if (position == itemCount - 1 && imageData.size < countLimit) { + holder.imageView.setImageResource(R.drawable.ic_add_pic) + holder.imageView.setOnClickListener { //添加图片 + mOnItemClickListener!!.onAddImageClick() + } + } else { + Glide.with(context).load(imageData[position]).into(holder.imageView) + holder.imageView.setOnClickListener { // 点击操作,查看大图 + mOnItemClickListener!!.onItemClick(position) + } + // 长按监听 + holder.imageView.setOnLongClickListener { v -> //长按删除 + mOnItemClickListener!!.onItemLongClick(v, position) + true + } + } + } + + override fun getItemCount(): Int { + // 满3张图就不让其添加新图 + return if (imageData.size != 0 && imageData.size >= countLimit) { + countLimit + } else { + if (imageData.size == 0) 1 else imageData.size + 1 + } + } + + private var mOnItemClickListener: OnItemClickListener? = null + + fun setOnItemClickListener(onItemClickListener: OnItemClickListener?) { + mOnItemClickListener = onItemClickListener + } + + interface OnItemClickListener { + fun onAddImageClick() + fun onItemClick(position: Int) + fun onItemLongClick(view: View?, position: Int) + } + + inner class ItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val imageView: ImageView = itemView as ImageView + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt index 3a098be..ad20c8b 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt @@ -31,7 +31,10 @@ setContentView(initLayoutView()) ImmersionBar.with(this).statusBarDarkFont(false).init() //沉浸式状态栏 when (this.javaClass.simpleName) { - "WelcomeActivity" -> ImmersionBar.with(this).statusBarDarkFont(true).init() + "WelcomeActivity" -> { + ImmersionBar.with(this).statusBarDarkFont(true).init() + StatusBarColorUtil.setColor(this, R.color.white.convertColor(this)) + } "SplashScreenActivity" -> ImmersionBar.with(this).statusBarDarkFont(false).init() "LoginActivity" -> ImmersionBar.with(this).statusBarDarkFont(true).init() else -> StatusBarColorUtil.setColor(this, R.color.mainThemeColor.convertColor(this)) diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/extensions/ArrayList.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/extensions/ArrayList.kt index e77dbaa..3affed7 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/extensions/ArrayList.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/extensions/ArrayList.kt @@ -13,7 +13,7 @@ if (index == this.size - 1) { builder.append(s) } else { - builder.append(s).append(",") + builder.append(s).append(";") } } return builder.toString() diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/model/AreaModel.java b/app/src/main/java/com/casic/app/smartwell/sanxi/model/AreaModel.java new file mode 100644 index 0000000..3ee4c83 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/model/AreaModel.java @@ -0,0 +1,125 @@ +package com.casic.app.smartwell.sanxi.model; + +public class AreaModel { + + private int code; + private DataBean data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataBean getData() { + return data; + } + + public void setData(DataBean data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private String area; + private String communications; + private String deptid; + private String deviceTypes; + private String id; + private String lat; + private String lng; + private String map; + private String wellTypes; + + public String getArea() { + return area; + } + + public void setArea(String area) { + this.area = area; + } + + public String getCommunications() { + return communications; + } + + public void setCommunications(String communications) { + this.communications = communications; + } + + public String getDeptid() { + return deptid; + } + + public void setDeptid(String deptid) { + this.deptid = deptid; + } + + public String getDeviceTypes() { + return deviceTypes; + } + + public void setDeviceTypes(String deviceTypes) { + this.deviceTypes = deviceTypes; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getLat() { + return lat; + } + + public void setLat(String lat) { + this.lat = lat; + } + + public String getLng() { + return lng; + } + + public void setLng(String lng) { + this.lng = lng; + } + + public String getMap() { + return map; + } + + public void setMap(String map) { + this.map = map; + } + + public String getWellTypes() { + return wellTypes; + } + + public void setWellTypes(String wellTypes) { + this.wellTypes = wellTypes; + } + } +} diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/model/DistrictModel.java b/app/src/main/java/com/casic/app/smartwell/sanxi/model/DistrictModel.java new file mode 100644 index 0000000..02e9ef2 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/model/DistrictModel.java @@ -0,0 +1,172 @@ +package com.casic.app.smartwell.sanxi.model; + +import java.util.List; + +public class DistrictModel { + + private int code; + private List data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public List getData() { + return data; + } + + public void setData(List data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private String id; + private String isSync; + private String lat; + private int level; + private String levelName; + private String lng; + private String name; + private int num; + private String pName; + private String pid; + private String pids; + private String simplename; + private String targetIdSync; + private String targetPidSync; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getIsSync() { + return isSync; + } + + public void setIsSync(String isSync) { + this.isSync = isSync; + } + + public String getLat() { + return lat; + } + + public void setLat(String lat) { + this.lat = lat; + } + + public int getLevel() { + return level; + } + + public void setLevel(int level) { + this.level = level; + } + + public String getLevelName() { + return levelName; + } + + public void setLevelName(String levelName) { + this.levelName = levelName; + } + + public String getLng() { + return lng; + } + + public void setLng(String lng) { + this.lng = lng; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getNum() { + return num; + } + + public void setNum(int num) { + this.num = num; + } + + public String getPName() { + return pName; + } + + public void setPName(String pName) { + this.pName = pName; + } + + public String getPid() { + return pid; + } + + public void setPid(String pid) { + this.pid = pid; + } + + public String getPids() { + return pids; + } + + public void setPids(String pids) { + this.pids = pids; + } + + public String getSimplename() { + return simplename; + } + + public void setSimplename(String simplename) { + this.simplename = simplename; + } + + public String getTargetIdSync() { + return targetIdSync; + } + + public void setTargetIdSync(String targetIdSync) { + this.targetIdSync = targetIdSync; + } + + public String getTargetPidSync() { + return targetPidSync; + } + + public void setTargetPidSync(String targetPidSync) { + this.targetPidSync = targetPidSync; + } + } +} diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/model/StreetModel.java b/app/src/main/java/com/casic/app/smartwell/sanxi/model/StreetModel.java new file mode 100644 index 0000000..90cc7d5 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/model/StreetModel.java @@ -0,0 +1,172 @@ +package com.casic.app.smartwell.sanxi.model; + +import java.util.List; + +public class StreetModel { + + private int code; + private List data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public List getData() { + return data; + } + + public void setData(List data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private String id; + private String isSync; + private String lat; + private int level; + private String levelName; + private String lng; + private String name; + private int num; + private String pName; + private String pid; + private String pids; + private String simplename; + private String targetIdSync; + private String targetPidSync; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getIsSync() { + return isSync; + } + + public void setIsSync(String isSync) { + this.isSync = isSync; + } + + public String getLat() { + return lat; + } + + public void setLat(String lat) { + this.lat = lat; + } + + public int getLevel() { + return level; + } + + public void setLevel(int level) { + this.level = level; + } + + public String getLevelName() { + return levelName; + } + + public void setLevelName(String levelName) { + this.levelName = levelName; + } + + public String getLng() { + return lng; + } + + public void setLng(String lng) { + this.lng = lng; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getNum() { + return num; + } + + public void setNum(int num) { + this.num = num; + } + + public String getPName() { + return pName; + } + + public void setPName(String pName) { + this.pName = pName; + } + + public String getPid() { + return pid; + } + + public void setPid(String pid) { + this.pid = pid; + } + + public String getPids() { + return pids; + } + + public void setPids(String pids) { + this.pids = pids; + } + + public String getSimplename() { + return simplename; + } + + public void setSimplename(String simplename) { + this.simplename = simplename; + } + + public String getTargetIdSync() { + return targetIdSync; + } + + public void setTargetIdSync(String targetIdSync) { + this.targetIdSync = targetIdSync; + } + + public String getTargetPidSync() { + return targetPidSync; + } + + public void setTargetPidSync(String targetPidSync) { + this.targetPidSync = targetPidSync; + } + } +} diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/Constant.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/Constant.kt index bae51d6..3251baa 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/Constant.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/Constant.kt @@ -7,6 +7,7 @@ object Constant { val USER_PERMISSIONS = arrayOf( Manifest.permission.READ_EXTERNAL_STORAGE, + Manifest.permission.CAMERA, Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS, Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION, diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/FileUtils.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/FileUtils.kt index 3e9ae35..cef2d83 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/FileUtils.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/FileUtils.kt @@ -18,4 +18,13 @@ } return downloadDir.toString() } + + val imageCompressPath: String + get() { + val imageDir = File(context.getExternalFilesDir(Environment.DIRECTORY_PICTURES), "") + if (!imageDir.exists()) { + imageDir.mkdir() + } + return imageDir.toString() + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt index 19687d2..bd311a4 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt @@ -289,6 +289,77 @@ ): String /** + * 上传图片 + * 系统路径static拼接图片返回路径 + * http://xx.com/static/2019-10/8050891248624f2bbefedcb196ce89cb.jpeg + */ + @Multipart + @POST("/imageUpload") + suspend fun uploadFile( + @Header("token") token: String, + @Part file: MultipartBody.Part + ): String + + /** + * 根据部门获取区ID + * + * @param deptId + */ + @GET("/config/getAreaByDept") + suspend fun obtainAreaByDept( + @Header("token") token: String, + @Query("deptId") deptId: String + ): String + + /** + * 获取区/县等 + * + * @param pid + */ + @GET("/area/list") + suspend fun obtainDistrict( + @Header("token") token: String, + @Query("pid") pid: String + ): String + + /** + * 获取街道 + * + * @param pid + */ + @GET("/area/list") + suspend fun obtainStreet( + @Header("token") token: String, + @Query("pid") pid: String + ): String + + /** + * 编辑更新井信息 + * + * @param id + */ + @FormUrlEncoded + @POST("/well/update") + suspend fun updateWellDetail( + @Header("token") token: String, + @Field("id") id: String, + @Field("wellCode") wellCode: String, + @Field("wellName") wellName: String, + @Field("wellType") wellType: String, + @Field("deptid") deptid: String, + @Field("deep") deep: String, + @Field("position") position: String, + @Field("coordinateX") coordinateX: String, + @Field("coordinateY") coordinateY: String, + @Field("photos") photos: String, + @Field("notes") notes: String?, + @Field("qu") qu: String, + @Field("area") area: String, + @Field("responsibleDept") responsibleDept: String, + @Field("responsibleDeptName") responsibleDeptName: String + ): String + + /** * 获取工单详情 * * @param id 工单id @@ -312,18 +383,6 @@ ): String /** - * 上传图片 - * 系统路径static拼接图片返回路径 - * http://xx.com/static/2019-10/8050891248624f2bbefedcb196ce89cb.jpeg - */ - @Multipart - @POST("/imageUpload") - suspend fun uploadImage( - @Header("token") token: String, - @Part file: MultipartBody.Part - ): String - - /** * 查找同一单位下的用户 * * @param hasMine 是否包含本人,1包含, 0不包含 diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt index efd6b11..e35e976 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt @@ -3,6 +3,10 @@ import com.casic.app.smartwell.sanxi.model.PublicKeyModel import com.casic.app.smartwell.sanxi.utils.AuthenticationHelper import com.casic.app.smartwell.sanxi.utils.Constant +import okhttp3.MediaType.Companion.toMediaTypeOrNull +import okhttp3.MultipartBody +import okhttp3.RequestBody +import java.io.File object RetrofitServiceManager { @@ -272,6 +276,76 @@ return api.obtainOperationResult(AuthenticationHelper.token!!, wellId, bfzt) } + /** + * 上传图片 + */ + suspend fun uploadFile(image: File): String { + val requestBody = RequestBody.create("image/png".toMediaTypeOrNull(), image) + val imagePart = MultipartBody.Part.createFormData("file", image.name, requestBody) + return api.uploadFile(AuthenticationHelper.token!!, imagePart) + } + + /** + * 根据部门获取区ID + */ + suspend fun obtainAreaByDept(deptId: String): String { + return api.obtainAreaByDept(AuthenticationHelper.token!!, deptId) + } + + /** + * 获取区/县等 + */ + suspend fun obtainDistrict(pid: String): String { + return api.obtainDistrict(AuthenticationHelper.token!!, pid) + } + + /** + * 获取街道 + */ + suspend fun obtainStreet(pid: String): String { + return api.obtainStreet(AuthenticationHelper.token!!, pid) + } + + /** + * 编辑更新井信息 + */ + suspend fun updateWellDetail( + id: String, + wellCode: String, + wellName: String, + wellType: String, + deptid: String, + deep: String, + position: String, + coordinateX: String, + coordinateY: String, + photos: String, + notes: String?, + qu: String, + area: String, + responsibleDept: String, + responsibleDeptName: String + ): String { + return api.updateWellDetail( + AuthenticationHelper.token!!, + id, + wellCode, + wellName, + wellType, + deptid, + deep, + position, + coordinateX, + coordinateY, + photos, + notes, + qu, + area, + responsibleDept, + responsibleDeptName + ) + } + // /** // * 获取工单详情 // */ @@ -287,15 +361,6 @@ // } // // /** -// * 上传图片 -// */ -// suspend fun uploadImage(image: File): String { -// val requestBody = RequestBody.create("image/png".toMediaTypeOrNull(), image) -// val imagePart = MultipartBody.Part.createFormData("file", image.name, requestBody) -// return api.uploadImage(AuthenticationHelper.token!!, imagePart) -// } -// -// /** // * 查找同一单位下的用户 // */ // suspend fun obtainSubordinate(hasMine: String?, roleTips: String?): String { diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/EditWellActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/EditWellActivity.kt new file mode 100644 index 0000000..956dbce --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/EditWellActivity.kt @@ -0,0 +1,341 @@ +package com.casic.app.smartwell.sanxi.view + +import android.app.Activity +import android.content.Intent +import android.view.View +import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.GridLayoutManager +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.adapter.EditableImageAdapter +import com.casic.app.smartwell.sanxi.base.BaseActivity +import com.casic.app.smartwell.sanxi.extensions.combineImagePath +import com.casic.app.smartwell.sanxi.extensions.navigatePageTo +import com.casic.app.smartwell.sanxi.extensions.reformat +import com.casic.app.smartwell.sanxi.extensions.show +import com.casic.app.smartwell.sanxi.model.DistrictModel +import com.casic.app.smartwell.sanxi.model.OwnerShipModel +import com.casic.app.smartwell.sanxi.model.WellListPageModel +import com.casic.app.smartwell.sanxi.utils.* +import com.casic.app.smartwell.sanxi.vm.AuthenticateViewModel +import com.casic.app.smartwell.sanxi.vm.UploadFileViewModel +import com.casic.app.smartwell.sanxi.vm.WellViewModel +import com.casic.app.smartwell.sanxi.widgets.BottomAreaSheet +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken +import com.luck.picture.lib.PictureSelector +import com.luck.picture.lib.config.PictureConfig +import com.luck.picture.lib.config.PictureMimeType +import com.pengxh.app.multilib.widget.dialog.BottomActionSheet +import com.qmuiteam.qmui.widget.dialog.QMUIBottomSheet +import kotlinx.android.synthetic.main.activity_edit_well.* +import kotlinx.android.synthetic.main.include_base_title.* +import java.io.File + +class EditWellActivity : BaseActivity() { + + private val kTag = "EditWellActivity" + private lateinit var wellViewModel: WellViewModel + private lateinit var authenticateViewModel: AuthenticateViewModel + private lateinit var uploadImageViewModel: UploadFileViewModel + private lateinit var wellBeanJson: String + private lateinit var imageAdapter: EditableImageAdapter + private lateinit var wellBean: WellListPageModel.DataBean.RowsBean + private val imagePaths: ArrayList = ArrayList() //服务器返回的拍照数据集 + private val realPaths: ArrayList = ArrayList() //真实图片路径 + private val districtModels: ArrayList = ArrayList() //行政区 + private var wellType = "" + private var deptId = "" + private var districtId = "" + private var streetId = "" + + override fun initLayoutView(): Int = R.layout.activity_edit_well + + override fun setupTopBarLayout() { + leftBackView.setOnClickListener { finish() } + titleView.text = "编辑井信息" + } + + override fun initData() { + wellViewModel = ViewModelProvider(this).get(WellViewModel::class.java) + authenticateViewModel = ViewModelProvider(this).get(AuthenticateViewModel::class.java) + uploadImageViewModel = ViewModelProvider(this).get(UploadFileViewModel::class.java) + wellBeanJson = intent.getStringExtra(Constant.INTENT_PARAM)!! + wellBean = Gson().fromJson( + wellBeanJson, object : TypeToken() {}.type + ) + wellNameView.setText(wellBean.wellName) + wellCodeView.text = wellBean.wellCode + + this.wellType = wellBean.wellType + wellTypeView.text = wellBean.wellTypeName + + this.deptId = wellBean.deptid + ownerShipView.text = wellBean.deptName + wellDepthView.setText(wellBean.deep) + longitudeView.setText(wellBean.lngGaode) + latitudeView.setText(wellBean.latGaode) + + /** + * 2022-06/e805917f14ed49378bbd29cae391b061.png; + * 2022-06/48d34f27695346bbb39d695333faabee.png; + * 2022-06/6df199418fd84960a164ad9c9660e172.png; + * 2022-06/bfbab97a965d406ba30fc9d09ab35f5c.png; + * */ + //显示已有的图片 + val imageArray = wellBean.photos.toString().split(";") + imageArray.forEach { path -> + if (path.isNotBlank()) { + imagePaths.add(path) + realPaths.add(path.combineImagePath()) + } + } + imageAdapter = EditableImageAdapter(this) + imageAdapter.setupImage(realPaths) + imageRecyclerView.layoutManager = GridLayoutManager(this, 3) + imageRecyclerView.adapter = imageAdapter + + //默认加载当前井的区域 + authenticateViewModel.obtainAreaByDept(wellBean.deptid) + authenticateViewModel.areaModel.observe(this, { + if (it.code == 200) { + authenticateViewModel.obtainDistrict(it.data.area) + } + }) + addressView.setText(wellBean.position) + } + + override fun initEvent() { + wellCodeView.setOnClickListener { + "井编号不可编辑".show() + } + + wellTypeView.setOnClickListener { + wellViewModel.obtainWellType() + } + wellViewModel.wellTypeModel.observe(this, { + if (it.code == 200) { + val sheetBuilder = QMUIBottomSheet.BottomListSheetBuilder(this) + sheetBuilder.setTitle("井类型") + it.data.forEach { type -> + sheetBuilder.addItem(type.name) + } + sheetBuilder.setGravityCenter(true) + .setOnSheetItemClickListener { dialog, _, position, tag -> + this.wellType = it.data[position].value + wellTypeView.text = tag + + dialog.dismiss() + }.build().show() + } + }) + + ownerShipView.setOnClickListener { + authenticateViewModel.obtainOwnerShip("03") + } + + imageAdapter.setOnItemClickListener(object : EditableImageAdapter.OnItemClickListener { + override fun onAddImageClick() { + selectPicture() + } + + override fun onItemClick(position: Int) { + if (realPaths[position].isBlank()) { + "图片加载失败,无法查看大图".show() + } else { + navigatePageTo(position, realPaths) + } + } + + override fun onItemLongClick(view: View?, position: Int) { + imagePaths.removeAt(position) + imageAdapter.deleteImage(position) + } + }) + + authenticateViewModel.resultModel.observe(this, { + if (it.code == 200) { + val ownerShipModel: MutableList = ArrayList() + it.data?.list?.forEach { listBean -> + ownerShipModel.add(listBean) + } + val sheetBuilder = QMUIBottomSheet.BottomListSheetBuilder(this) + sheetBuilder.setTitle("权属单位") + ownerShipModel.forEach { model -> + sheetBuilder.addItem(model.name) + } + sheetBuilder.setGravityCenter(true) + .setOnSheetItemClickListener { dialog, _, position, tag -> + this.deptId = it.data?.list!![position].id + ownerShipView.text = tag + + dialog.dismiss() + }.build().show() + } + }) + + authenticateViewModel.districtModel.observe(this, { + if (it.code == 200) { + it.data.forEach { area -> + districtModels.add(area) + //判断区 + if (area.id == wellBean.qu) { + authenticateViewModel.obtainStreet(area.id) + authenticateViewModel.streetModel.observe(this, { street -> + if (street.code == 200) { + street.data.forEach { streetData -> + //判断街道 + if (streetData.id == wellBean.area) { + districtView.text = + String.format("${area.name}${streetData.name}") + } + } + } + }) + } + } + } + }) + + //点击选择井的区域 + districtView.setOnClickListener { + if (districtModels.isNullOrEmpty()) { + "无行政区域数据,无法修改".show() + return@setOnClickListener + } + BottomAreaSheet.Builder() + .setContext(this) + .setLifecycleOwner(this) + .setDistrictAreaData(districtModels) + .setChildDataViewModel(authenticateViewModel) + .setOnActionSheetListener(object : BottomAreaSheet.OnActionSheetListener { + override fun onAreaSelected( + area: String?, districtId: String, streetId: String + ) { + districtView.text = area?.replace("-", "") + this@EditWellActivity.districtId = districtId + this@EditWellActivity.streetId = streetId + } + }) + .build().show() + } + + //提交修改 + saveButton.setOnClickListener { + if (districtId.isEmpty() || streetId.isEmpty()) { + "行政区ID为空或者街道ID为空".show() + return@setOnClickListener + } + wellViewModel.updateWellDetail( + id = wellBean.id, + wellCode = wellBean.wellCode, + wellName = wellNameView.text.toString(), + wellType = wellType, + deptid = deptId, + deep = wellDepthView.text.toString(), + position = addressView.text.toString(), + coordinateX = longitudeView.text.toString(), + coordinateY = latitudeView.text.toString(), + photos = imagePaths.reformat(), + notes = "", + qu = districtId, + area = streetId, + responsibleDept = deptId, + responsibleDeptName = ownerShipView.text.toString() + ) + } + + uploadImageViewModel.resultModel.observe(this, { model -> + if (model.code == 200) { + /** + * 显示图片 + * path: 2021-07\c670eac17d644b179a4324a34bb84329.jpeg + * */ + /** + * 显示图片 + * path: 2021-07\c670eac17d644b179a4324a34bb84329.jpeg + * */ + val sumItemCount: Int = imageAdapter.itemCount + 1 //每上传一张图片,图片总数都是在原有的基础上+1 + if (sumItemCount <= 5) { + val url = model.data + //let函数处理需要针对一个可null的对象统一做判空处理。 + url?.let { + imagePaths.add(it) + realPaths.add(it.combineImagePath()) + } + imageAdapter.setupImage(realPaths) + } else { + "最多只能上传4张图片".show() + } + } + }) + uploadImageViewModel.loadState.observe(this, { + DialogHelper.dismissLoadingDialog() + }) + + wellViewModel.loadState.observe(this, { + when (it) { + is LoadState.Loading -> { + DialogHelper.showLoadingDialog(this, "保存中,请稍后...") + } + is LoadState.Success -> { + DialogHelper.dismissLoadingDialog() + finish() + } + else -> { + DialogHelper.dismissLoadingDialog() + } + } + }) + } + + private fun selectPicture() { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitles(arrayOf("拍照", "相册")) + .setOnActionSheetListener { position -> + when (position) { + 0 -> { + PictureSelector.create(this) + .openCamera(PictureMimeType.ofImage()) + .isCompress(true) + .compressSavePath(FileUtils.imageCompressPath) + .imageEngine(GlideLoadEngine.createGlideEngine()) + .forResult(PictureConfig.REQUEST_CAMERA) + } + 1 -> { + PictureSelector.create(this) + .openGallery(PictureMimeType.ofImage()) + .isWeChatStyle(true) + .isCamera(false) + .isCompress(true) + .compressSavePath(FileUtils.imageCompressPath) + .imageEngine(GlideLoadEngine.createGlideEngine()) + .maxSelectNum(4) + .forResult(PictureConfig.CHOOSE_REQUEST) + } + } + }.build().show() + } + + override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { + super.onActivityResult(requestCode, resultCode, data) + if (resultCode == Activity.RESULT_OK) { + when (requestCode) { + PictureConfig.CHOOSE_REQUEST -> { + val selectResult = PictureSelector.obtainMultipleResult(data) + DialogHelper.showLoadingDialog(this, "图片上传中,请稍后...") + for (res in selectResult) { + val file = File(res.compressPath) + //上传图片 + uploadImageViewModel.uploadFile(file) + } + } + PictureConfig.REQUEST_CAMERA -> { + val cameraResult = PictureSelector.obtainMultipleResult(data)[0] + //上传图片 + uploadImageViewModel.uploadFile(File(cameraResult.compressPath)) + } + } + } + } +} \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index fdf5fc7..804f233 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -102,8 +102,6 @@ implementation 'com.google.code.gson:gson:2.8.6' //上拉加载下拉刷新 implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' - //高德地图搜索 - implementation 'com.amap.api:search:8.1.0' //高德导航 implementation 'com.amap.api:navi-3dmap:8.1.0_3dmap8.1.0' //日期选择器 diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 3fcef8b..460648b 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -9,6 +9,7 @@ + @@ -51,6 +52,7 @@ android:name=".view.BigImageActivity" android:theme="@style/Theme.BigImageActivity" /> + () { + + private val countLimit = 4 + private var imageData: ArrayList = ArrayList() + + fun setupImage(images: ArrayList) { + this.imageData = images + notifyDataSetChanged() + } + + fun deleteImage(position: Int) { + if (imageData.size != 0) { + imageData.removeAt(position) + notifyDataSetChanged() + } + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { + val imageView = ImageView(context) + val screenWidth: Int = SizeUtil.getScreenWidth(context) - SizeUtil.dp2px(context, 40f) + val margins: Int = SizeUtil.dp2px(context, 3f) + val itemSize = (screenWidth - 6 * margins) / 3 + val params = LinearLayout.LayoutParams(itemSize, itemSize) + params.setMargins(margins, margins, margins, margins) + params.gravity = Gravity.CENTER + imageView.scaleType = ImageView.ScaleType.CENTER_CROP + imageView.layoutParams = params + return ItemViewHolder(imageView) + } + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + if (position == itemCount - 1 && imageData.size < countLimit) { + holder.imageView.setImageResource(R.drawable.ic_add_pic) + holder.imageView.setOnClickListener { //添加图片 + mOnItemClickListener!!.onAddImageClick() + } + } else { + Glide.with(context).load(imageData[position]).into(holder.imageView) + holder.imageView.setOnClickListener { // 点击操作,查看大图 + mOnItemClickListener!!.onItemClick(position) + } + // 长按监听 + holder.imageView.setOnLongClickListener { v -> //长按删除 + mOnItemClickListener!!.onItemLongClick(v, position) + true + } + } + } + + override fun getItemCount(): Int { + // 满3张图就不让其添加新图 + return if (imageData.size != 0 && imageData.size >= countLimit) { + countLimit + } else { + if (imageData.size == 0) 1 else imageData.size + 1 + } + } + + private var mOnItemClickListener: OnItemClickListener? = null + + fun setOnItemClickListener(onItemClickListener: OnItemClickListener?) { + mOnItemClickListener = onItemClickListener + } + + interface OnItemClickListener { + fun onAddImageClick() + fun onItemClick(position: Int) + fun onItemLongClick(view: View?, position: Int) + } + + inner class ItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val imageView: ImageView = itemView as ImageView + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt index 3a098be..ad20c8b 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt @@ -31,7 +31,10 @@ setContentView(initLayoutView()) ImmersionBar.with(this).statusBarDarkFont(false).init() //沉浸式状态栏 when (this.javaClass.simpleName) { - "WelcomeActivity" -> ImmersionBar.with(this).statusBarDarkFont(true).init() + "WelcomeActivity" -> { + ImmersionBar.with(this).statusBarDarkFont(true).init() + StatusBarColorUtil.setColor(this, R.color.white.convertColor(this)) + } "SplashScreenActivity" -> ImmersionBar.with(this).statusBarDarkFont(false).init() "LoginActivity" -> ImmersionBar.with(this).statusBarDarkFont(true).init() else -> StatusBarColorUtil.setColor(this, R.color.mainThemeColor.convertColor(this)) diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/extensions/ArrayList.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/extensions/ArrayList.kt index e77dbaa..3affed7 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/extensions/ArrayList.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/extensions/ArrayList.kt @@ -13,7 +13,7 @@ if (index == this.size - 1) { builder.append(s) } else { - builder.append(s).append(",") + builder.append(s).append(";") } } return builder.toString() diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/model/AreaModel.java b/app/src/main/java/com/casic/app/smartwell/sanxi/model/AreaModel.java new file mode 100644 index 0000000..3ee4c83 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/model/AreaModel.java @@ -0,0 +1,125 @@ +package com.casic.app.smartwell.sanxi.model; + +public class AreaModel { + + private int code; + private DataBean data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataBean getData() { + return data; + } + + public void setData(DataBean data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private String area; + private String communications; + private String deptid; + private String deviceTypes; + private String id; + private String lat; + private String lng; + private String map; + private String wellTypes; + + public String getArea() { + return area; + } + + public void setArea(String area) { + this.area = area; + } + + public String getCommunications() { + return communications; + } + + public void setCommunications(String communications) { + this.communications = communications; + } + + public String getDeptid() { + return deptid; + } + + public void setDeptid(String deptid) { + this.deptid = deptid; + } + + public String getDeviceTypes() { + return deviceTypes; + } + + public void setDeviceTypes(String deviceTypes) { + this.deviceTypes = deviceTypes; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getLat() { + return lat; + } + + public void setLat(String lat) { + this.lat = lat; + } + + public String getLng() { + return lng; + } + + public void setLng(String lng) { + this.lng = lng; + } + + public String getMap() { + return map; + } + + public void setMap(String map) { + this.map = map; + } + + public String getWellTypes() { + return wellTypes; + } + + public void setWellTypes(String wellTypes) { + this.wellTypes = wellTypes; + } + } +} diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/model/DistrictModel.java b/app/src/main/java/com/casic/app/smartwell/sanxi/model/DistrictModel.java new file mode 100644 index 0000000..02e9ef2 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/model/DistrictModel.java @@ -0,0 +1,172 @@ +package com.casic.app.smartwell.sanxi.model; + +import java.util.List; + +public class DistrictModel { + + private int code; + private List data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public List getData() { + return data; + } + + public void setData(List data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private String id; + private String isSync; + private String lat; + private int level; + private String levelName; + private String lng; + private String name; + private int num; + private String pName; + private String pid; + private String pids; + private String simplename; + private String targetIdSync; + private String targetPidSync; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getIsSync() { + return isSync; + } + + public void setIsSync(String isSync) { + this.isSync = isSync; + } + + public String getLat() { + return lat; + } + + public void setLat(String lat) { + this.lat = lat; + } + + public int getLevel() { + return level; + } + + public void setLevel(int level) { + this.level = level; + } + + public String getLevelName() { + return levelName; + } + + public void setLevelName(String levelName) { + this.levelName = levelName; + } + + public String getLng() { + return lng; + } + + public void setLng(String lng) { + this.lng = lng; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getNum() { + return num; + } + + public void setNum(int num) { + this.num = num; + } + + public String getPName() { + return pName; + } + + public void setPName(String pName) { + this.pName = pName; + } + + public String getPid() { + return pid; + } + + public void setPid(String pid) { + this.pid = pid; + } + + public String getPids() { + return pids; + } + + public void setPids(String pids) { + this.pids = pids; + } + + public String getSimplename() { + return simplename; + } + + public void setSimplename(String simplename) { + this.simplename = simplename; + } + + public String getTargetIdSync() { + return targetIdSync; + } + + public void setTargetIdSync(String targetIdSync) { + this.targetIdSync = targetIdSync; + } + + public String getTargetPidSync() { + return targetPidSync; + } + + public void setTargetPidSync(String targetPidSync) { + this.targetPidSync = targetPidSync; + } + } +} diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/model/StreetModel.java b/app/src/main/java/com/casic/app/smartwell/sanxi/model/StreetModel.java new file mode 100644 index 0000000..90cc7d5 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/model/StreetModel.java @@ -0,0 +1,172 @@ +package com.casic.app.smartwell.sanxi.model; + +import java.util.List; + +public class StreetModel { + + private int code; + private List data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public List getData() { + return data; + } + + public void setData(List data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private String id; + private String isSync; + private String lat; + private int level; + private String levelName; + private String lng; + private String name; + private int num; + private String pName; + private String pid; + private String pids; + private String simplename; + private String targetIdSync; + private String targetPidSync; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getIsSync() { + return isSync; + } + + public void setIsSync(String isSync) { + this.isSync = isSync; + } + + public String getLat() { + return lat; + } + + public void setLat(String lat) { + this.lat = lat; + } + + public int getLevel() { + return level; + } + + public void setLevel(int level) { + this.level = level; + } + + public String getLevelName() { + return levelName; + } + + public void setLevelName(String levelName) { + this.levelName = levelName; + } + + public String getLng() { + return lng; + } + + public void setLng(String lng) { + this.lng = lng; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getNum() { + return num; + } + + public void setNum(int num) { + this.num = num; + } + + public String getPName() { + return pName; + } + + public void setPName(String pName) { + this.pName = pName; + } + + public String getPid() { + return pid; + } + + public void setPid(String pid) { + this.pid = pid; + } + + public String getPids() { + return pids; + } + + public void setPids(String pids) { + this.pids = pids; + } + + public String getSimplename() { + return simplename; + } + + public void setSimplename(String simplename) { + this.simplename = simplename; + } + + public String getTargetIdSync() { + return targetIdSync; + } + + public void setTargetIdSync(String targetIdSync) { + this.targetIdSync = targetIdSync; + } + + public String getTargetPidSync() { + return targetPidSync; + } + + public void setTargetPidSync(String targetPidSync) { + this.targetPidSync = targetPidSync; + } + } +} diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/Constant.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/Constant.kt index bae51d6..3251baa 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/Constant.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/Constant.kt @@ -7,6 +7,7 @@ object Constant { val USER_PERMISSIONS = arrayOf( Manifest.permission.READ_EXTERNAL_STORAGE, + Manifest.permission.CAMERA, Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS, Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION, diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/FileUtils.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/FileUtils.kt index 3e9ae35..cef2d83 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/FileUtils.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/FileUtils.kt @@ -18,4 +18,13 @@ } return downloadDir.toString() } + + val imageCompressPath: String + get() { + val imageDir = File(context.getExternalFilesDir(Environment.DIRECTORY_PICTURES), "") + if (!imageDir.exists()) { + imageDir.mkdir() + } + return imageDir.toString() + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt index 19687d2..bd311a4 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt @@ -289,6 +289,77 @@ ): String /** + * 上传图片 + * 系统路径static拼接图片返回路径 + * http://xx.com/static/2019-10/8050891248624f2bbefedcb196ce89cb.jpeg + */ + @Multipart + @POST("/imageUpload") + suspend fun uploadFile( + @Header("token") token: String, + @Part file: MultipartBody.Part + ): String + + /** + * 根据部门获取区ID + * + * @param deptId + */ + @GET("/config/getAreaByDept") + suspend fun obtainAreaByDept( + @Header("token") token: String, + @Query("deptId") deptId: String + ): String + + /** + * 获取区/县等 + * + * @param pid + */ + @GET("/area/list") + suspend fun obtainDistrict( + @Header("token") token: String, + @Query("pid") pid: String + ): String + + /** + * 获取街道 + * + * @param pid + */ + @GET("/area/list") + suspend fun obtainStreet( + @Header("token") token: String, + @Query("pid") pid: String + ): String + + /** + * 编辑更新井信息 + * + * @param id + */ + @FormUrlEncoded + @POST("/well/update") + suspend fun updateWellDetail( + @Header("token") token: String, + @Field("id") id: String, + @Field("wellCode") wellCode: String, + @Field("wellName") wellName: String, + @Field("wellType") wellType: String, + @Field("deptid") deptid: String, + @Field("deep") deep: String, + @Field("position") position: String, + @Field("coordinateX") coordinateX: String, + @Field("coordinateY") coordinateY: String, + @Field("photos") photos: String, + @Field("notes") notes: String?, + @Field("qu") qu: String, + @Field("area") area: String, + @Field("responsibleDept") responsibleDept: String, + @Field("responsibleDeptName") responsibleDeptName: String + ): String + + /** * 获取工单详情 * * @param id 工单id @@ -312,18 +383,6 @@ ): String /** - * 上传图片 - * 系统路径static拼接图片返回路径 - * http://xx.com/static/2019-10/8050891248624f2bbefedcb196ce89cb.jpeg - */ - @Multipart - @POST("/imageUpload") - suspend fun uploadImage( - @Header("token") token: String, - @Part file: MultipartBody.Part - ): String - - /** * 查找同一单位下的用户 * * @param hasMine 是否包含本人,1包含, 0不包含 diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt index efd6b11..e35e976 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt @@ -3,6 +3,10 @@ import com.casic.app.smartwell.sanxi.model.PublicKeyModel import com.casic.app.smartwell.sanxi.utils.AuthenticationHelper import com.casic.app.smartwell.sanxi.utils.Constant +import okhttp3.MediaType.Companion.toMediaTypeOrNull +import okhttp3.MultipartBody +import okhttp3.RequestBody +import java.io.File object RetrofitServiceManager { @@ -272,6 +276,76 @@ return api.obtainOperationResult(AuthenticationHelper.token!!, wellId, bfzt) } + /** + * 上传图片 + */ + suspend fun uploadFile(image: File): String { + val requestBody = RequestBody.create("image/png".toMediaTypeOrNull(), image) + val imagePart = MultipartBody.Part.createFormData("file", image.name, requestBody) + return api.uploadFile(AuthenticationHelper.token!!, imagePart) + } + + /** + * 根据部门获取区ID + */ + suspend fun obtainAreaByDept(deptId: String): String { + return api.obtainAreaByDept(AuthenticationHelper.token!!, deptId) + } + + /** + * 获取区/县等 + */ + suspend fun obtainDistrict(pid: String): String { + return api.obtainDistrict(AuthenticationHelper.token!!, pid) + } + + /** + * 获取街道 + */ + suspend fun obtainStreet(pid: String): String { + return api.obtainStreet(AuthenticationHelper.token!!, pid) + } + + /** + * 编辑更新井信息 + */ + suspend fun updateWellDetail( + id: String, + wellCode: String, + wellName: String, + wellType: String, + deptid: String, + deep: String, + position: String, + coordinateX: String, + coordinateY: String, + photos: String, + notes: String?, + qu: String, + area: String, + responsibleDept: String, + responsibleDeptName: String + ): String { + return api.updateWellDetail( + AuthenticationHelper.token!!, + id, + wellCode, + wellName, + wellType, + deptid, + deep, + position, + coordinateX, + coordinateY, + photos, + notes, + qu, + area, + responsibleDept, + responsibleDeptName + ) + } + // /** // * 获取工单详情 // */ @@ -287,15 +361,6 @@ // } // // /** -// * 上传图片 -// */ -// suspend fun uploadImage(image: File): String { -// val requestBody = RequestBody.create("image/png".toMediaTypeOrNull(), image) -// val imagePart = MultipartBody.Part.createFormData("file", image.name, requestBody) -// return api.uploadImage(AuthenticationHelper.token!!, imagePart) -// } -// -// /** // * 查找同一单位下的用户 // */ // suspend fun obtainSubordinate(hasMine: String?, roleTips: String?): String { diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/EditWellActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/EditWellActivity.kt new file mode 100644 index 0000000..956dbce --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/EditWellActivity.kt @@ -0,0 +1,341 @@ +package com.casic.app.smartwell.sanxi.view + +import android.app.Activity +import android.content.Intent +import android.view.View +import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.GridLayoutManager +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.adapter.EditableImageAdapter +import com.casic.app.smartwell.sanxi.base.BaseActivity +import com.casic.app.smartwell.sanxi.extensions.combineImagePath +import com.casic.app.smartwell.sanxi.extensions.navigatePageTo +import com.casic.app.smartwell.sanxi.extensions.reformat +import com.casic.app.smartwell.sanxi.extensions.show +import com.casic.app.smartwell.sanxi.model.DistrictModel +import com.casic.app.smartwell.sanxi.model.OwnerShipModel +import com.casic.app.smartwell.sanxi.model.WellListPageModel +import com.casic.app.smartwell.sanxi.utils.* +import com.casic.app.smartwell.sanxi.vm.AuthenticateViewModel +import com.casic.app.smartwell.sanxi.vm.UploadFileViewModel +import com.casic.app.smartwell.sanxi.vm.WellViewModel +import com.casic.app.smartwell.sanxi.widgets.BottomAreaSheet +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken +import com.luck.picture.lib.PictureSelector +import com.luck.picture.lib.config.PictureConfig +import com.luck.picture.lib.config.PictureMimeType +import com.pengxh.app.multilib.widget.dialog.BottomActionSheet +import com.qmuiteam.qmui.widget.dialog.QMUIBottomSheet +import kotlinx.android.synthetic.main.activity_edit_well.* +import kotlinx.android.synthetic.main.include_base_title.* +import java.io.File + +class EditWellActivity : BaseActivity() { + + private val kTag = "EditWellActivity" + private lateinit var wellViewModel: WellViewModel + private lateinit var authenticateViewModel: AuthenticateViewModel + private lateinit var uploadImageViewModel: UploadFileViewModel + private lateinit var wellBeanJson: String + private lateinit var imageAdapter: EditableImageAdapter + private lateinit var wellBean: WellListPageModel.DataBean.RowsBean + private val imagePaths: ArrayList = ArrayList() //服务器返回的拍照数据集 + private val realPaths: ArrayList = ArrayList() //真实图片路径 + private val districtModels: ArrayList = ArrayList() //行政区 + private var wellType = "" + private var deptId = "" + private var districtId = "" + private var streetId = "" + + override fun initLayoutView(): Int = R.layout.activity_edit_well + + override fun setupTopBarLayout() { + leftBackView.setOnClickListener { finish() } + titleView.text = "编辑井信息" + } + + override fun initData() { + wellViewModel = ViewModelProvider(this).get(WellViewModel::class.java) + authenticateViewModel = ViewModelProvider(this).get(AuthenticateViewModel::class.java) + uploadImageViewModel = ViewModelProvider(this).get(UploadFileViewModel::class.java) + wellBeanJson = intent.getStringExtra(Constant.INTENT_PARAM)!! + wellBean = Gson().fromJson( + wellBeanJson, object : TypeToken() {}.type + ) + wellNameView.setText(wellBean.wellName) + wellCodeView.text = wellBean.wellCode + + this.wellType = wellBean.wellType + wellTypeView.text = wellBean.wellTypeName + + this.deptId = wellBean.deptid + ownerShipView.text = wellBean.deptName + wellDepthView.setText(wellBean.deep) + longitudeView.setText(wellBean.lngGaode) + latitudeView.setText(wellBean.latGaode) + + /** + * 2022-06/e805917f14ed49378bbd29cae391b061.png; + * 2022-06/48d34f27695346bbb39d695333faabee.png; + * 2022-06/6df199418fd84960a164ad9c9660e172.png; + * 2022-06/bfbab97a965d406ba30fc9d09ab35f5c.png; + * */ + //显示已有的图片 + val imageArray = wellBean.photos.toString().split(";") + imageArray.forEach { path -> + if (path.isNotBlank()) { + imagePaths.add(path) + realPaths.add(path.combineImagePath()) + } + } + imageAdapter = EditableImageAdapter(this) + imageAdapter.setupImage(realPaths) + imageRecyclerView.layoutManager = GridLayoutManager(this, 3) + imageRecyclerView.adapter = imageAdapter + + //默认加载当前井的区域 + authenticateViewModel.obtainAreaByDept(wellBean.deptid) + authenticateViewModel.areaModel.observe(this, { + if (it.code == 200) { + authenticateViewModel.obtainDistrict(it.data.area) + } + }) + addressView.setText(wellBean.position) + } + + override fun initEvent() { + wellCodeView.setOnClickListener { + "井编号不可编辑".show() + } + + wellTypeView.setOnClickListener { + wellViewModel.obtainWellType() + } + wellViewModel.wellTypeModel.observe(this, { + if (it.code == 200) { + val sheetBuilder = QMUIBottomSheet.BottomListSheetBuilder(this) + sheetBuilder.setTitle("井类型") + it.data.forEach { type -> + sheetBuilder.addItem(type.name) + } + sheetBuilder.setGravityCenter(true) + .setOnSheetItemClickListener { dialog, _, position, tag -> + this.wellType = it.data[position].value + wellTypeView.text = tag + + dialog.dismiss() + }.build().show() + } + }) + + ownerShipView.setOnClickListener { + authenticateViewModel.obtainOwnerShip("03") + } + + imageAdapter.setOnItemClickListener(object : EditableImageAdapter.OnItemClickListener { + override fun onAddImageClick() { + selectPicture() + } + + override fun onItemClick(position: Int) { + if (realPaths[position].isBlank()) { + "图片加载失败,无法查看大图".show() + } else { + navigatePageTo(position, realPaths) + } + } + + override fun onItemLongClick(view: View?, position: Int) { + imagePaths.removeAt(position) + imageAdapter.deleteImage(position) + } + }) + + authenticateViewModel.resultModel.observe(this, { + if (it.code == 200) { + val ownerShipModel: MutableList = ArrayList() + it.data?.list?.forEach { listBean -> + ownerShipModel.add(listBean) + } + val sheetBuilder = QMUIBottomSheet.BottomListSheetBuilder(this) + sheetBuilder.setTitle("权属单位") + ownerShipModel.forEach { model -> + sheetBuilder.addItem(model.name) + } + sheetBuilder.setGravityCenter(true) + .setOnSheetItemClickListener { dialog, _, position, tag -> + this.deptId = it.data?.list!![position].id + ownerShipView.text = tag + + dialog.dismiss() + }.build().show() + } + }) + + authenticateViewModel.districtModel.observe(this, { + if (it.code == 200) { + it.data.forEach { area -> + districtModels.add(area) + //判断区 + if (area.id == wellBean.qu) { + authenticateViewModel.obtainStreet(area.id) + authenticateViewModel.streetModel.observe(this, { street -> + if (street.code == 200) { + street.data.forEach { streetData -> + //判断街道 + if (streetData.id == wellBean.area) { + districtView.text = + String.format("${area.name}${streetData.name}") + } + } + } + }) + } + } + } + }) + + //点击选择井的区域 + districtView.setOnClickListener { + if (districtModels.isNullOrEmpty()) { + "无行政区域数据,无法修改".show() + return@setOnClickListener + } + BottomAreaSheet.Builder() + .setContext(this) + .setLifecycleOwner(this) + .setDistrictAreaData(districtModels) + .setChildDataViewModel(authenticateViewModel) + .setOnActionSheetListener(object : BottomAreaSheet.OnActionSheetListener { + override fun onAreaSelected( + area: String?, districtId: String, streetId: String + ) { + districtView.text = area?.replace("-", "") + this@EditWellActivity.districtId = districtId + this@EditWellActivity.streetId = streetId + } + }) + .build().show() + } + + //提交修改 + saveButton.setOnClickListener { + if (districtId.isEmpty() || streetId.isEmpty()) { + "行政区ID为空或者街道ID为空".show() + return@setOnClickListener + } + wellViewModel.updateWellDetail( + id = wellBean.id, + wellCode = wellBean.wellCode, + wellName = wellNameView.text.toString(), + wellType = wellType, + deptid = deptId, + deep = wellDepthView.text.toString(), + position = addressView.text.toString(), + coordinateX = longitudeView.text.toString(), + coordinateY = latitudeView.text.toString(), + photos = imagePaths.reformat(), + notes = "", + qu = districtId, + area = streetId, + responsibleDept = deptId, + responsibleDeptName = ownerShipView.text.toString() + ) + } + + uploadImageViewModel.resultModel.observe(this, { model -> + if (model.code == 200) { + /** + * 显示图片 + * path: 2021-07\c670eac17d644b179a4324a34bb84329.jpeg + * */ + /** + * 显示图片 + * path: 2021-07\c670eac17d644b179a4324a34bb84329.jpeg + * */ + val sumItemCount: Int = imageAdapter.itemCount + 1 //每上传一张图片,图片总数都是在原有的基础上+1 + if (sumItemCount <= 5) { + val url = model.data + //let函数处理需要针对一个可null的对象统一做判空处理。 + url?.let { + imagePaths.add(it) + realPaths.add(it.combineImagePath()) + } + imageAdapter.setupImage(realPaths) + } else { + "最多只能上传4张图片".show() + } + } + }) + uploadImageViewModel.loadState.observe(this, { + DialogHelper.dismissLoadingDialog() + }) + + wellViewModel.loadState.observe(this, { + when (it) { + is LoadState.Loading -> { + DialogHelper.showLoadingDialog(this, "保存中,请稍后...") + } + is LoadState.Success -> { + DialogHelper.dismissLoadingDialog() + finish() + } + else -> { + DialogHelper.dismissLoadingDialog() + } + } + }) + } + + private fun selectPicture() { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitles(arrayOf("拍照", "相册")) + .setOnActionSheetListener { position -> + when (position) { + 0 -> { + PictureSelector.create(this) + .openCamera(PictureMimeType.ofImage()) + .isCompress(true) + .compressSavePath(FileUtils.imageCompressPath) + .imageEngine(GlideLoadEngine.createGlideEngine()) + .forResult(PictureConfig.REQUEST_CAMERA) + } + 1 -> { + PictureSelector.create(this) + .openGallery(PictureMimeType.ofImage()) + .isWeChatStyle(true) + .isCamera(false) + .isCompress(true) + .compressSavePath(FileUtils.imageCompressPath) + .imageEngine(GlideLoadEngine.createGlideEngine()) + .maxSelectNum(4) + .forResult(PictureConfig.CHOOSE_REQUEST) + } + } + }.build().show() + } + + override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { + super.onActivityResult(requestCode, resultCode, data) + if (resultCode == Activity.RESULT_OK) { + when (requestCode) { + PictureConfig.CHOOSE_REQUEST -> { + val selectResult = PictureSelector.obtainMultipleResult(data) + DialogHelper.showLoadingDialog(this, "图片上传中,请稍后...") + for (res in selectResult) { + val file = File(res.compressPath) + //上传图片 + uploadImageViewModel.uploadFile(file) + } + } + PictureConfig.REQUEST_CAMERA -> { + val cameraResult = PictureSelector.obtainMultipleResult(data)[0] + //上传图片 + uploadImageViewModel.uploadFile(File(cameraResult.compressPath)) + } + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellDetailActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellDetailActivity.kt index 50c9e05..6c93e4e 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellDetailActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellDetailActivity.kt @@ -9,28 +9,30 @@ import com.amap.api.maps.model.CameraPosition import com.amap.api.maps.model.LatLng import com.amap.api.maps.model.MarkerOptions -import com.amap.api.services.core.LatLonPoint -import com.amap.api.services.geocoder.GeocodeResult -import com.amap.api.services.geocoder.GeocodeSearch -import com.amap.api.services.geocoder.RegeocodeQuery -import com.amap.api.services.geocoder.RegeocodeResult import com.casic.app.smartwell.sanxi.R import com.casic.app.smartwell.sanxi.base.BaseActivity import com.casic.app.smartwell.sanxi.extensions.show import com.casic.app.smartwell.sanxi.utils.Constant import com.casic.app.smartwell.sanxi.utils.DialogHelper import com.casic.app.smartwell.sanxi.utils.LoadState +import com.casic.app.smartwell.sanxi.vm.AuthenticateViewModel import com.casic.app.smartwell.sanxi.vm.WellViewModel import com.pengxh.app.multilib.widget.dialog.AlertMessageDialog import kotlinx.android.synthetic.main.activity_well_detail.* +import kotlinx.android.synthetic.main.activity_well_detail.wellCodeView +import kotlinx.android.synthetic.main.activity_well_detail.wellDepthView +import kotlinx.android.synthetic.main.activity_well_detail.wellNameView +import kotlinx.android.synthetic.main.activity_well_detail.wellStateView +import kotlinx.android.synthetic.main.activity_well_detail.wellTypeView +import kotlinx.android.synthetic.main.activity_well_list_detail.* import kotlinx.android.synthetic.main.include_base_title.* class WellDetailActivity : BaseActivity(), AMap.OnMapLoadedListener { private val kTag = "WellDetailActivity" - private val geocoderSearch by lazy { GeocodeSearch(this) } private lateinit var wellViewModel: WellViewModel + private lateinit var authenticateViewModel: AuthenticateViewModel private lateinit var wellId: String private lateinit var aMap: AMap private var latLng: LatLng? = null @@ -46,6 +48,7 @@ override fun initData() { wellId = intent.getStringExtra(Constant.INTENT_PARAM)!! wellViewModel = ViewModelProvider(this).get(WellViewModel::class.java) + authenticateViewModel = ViewModelProvider(this).get(AuthenticateViewModel::class.java) aMap = wellMapView.map aMap.mapType = AMap.MAP_TYPE_NORMAL @@ -103,39 +106,41 @@ val wellPosition = wellDetail.position.toString() wellLocationView.text = wellPosition - //根据经纬度获取省市区县 if (wellDetail.latGaode.isBlank() || wellDetail.lngGaode.isBlank()) { "井经纬度异常,无法查看完整位置信息".show() return@observe } this.latLng = LatLng(wellDetail.latGaode.toDouble(), wellDetail.lngGaode.toDouble()) - val queryParam = RegeocodeQuery( - LatLonPoint(wellDetail.latGaode.toDouble(), wellDetail.lngGaode.toDouble()), - 200f, - GeocodeSearch.AMAP - ) - tipsImageView.setOnClickListener { - geocoderSearch.getFromLocationAsyn(queryParam) + authenticateViewModel.obtainAreaByDept(wellDetail.deptid) } - - geocoderSearch.setOnGeocodeSearchListener(object : - GeocodeSearch.OnGeocodeSearchListener { - override fun onRegeocodeSearched(result: RegeocodeResult?, rCode: Int) { - if (rCode == 1000) { - AlertMessageDialog.Builder() - .setContext(this@WellDetailActivity) - .setTitle("闸井完整位置") - .setMessage(result?.regeocodeAddress?.formatAddress + "-" + wellPosition) - .setPositiveButton("知道了").setOnDialogButtonClickListener {}.build() - .show() - } else { - "获取该闸井详细位置信息失败".show() - } + authenticateViewModel.areaModel.observe(this, { areaModel -> + if (areaModel.code == 200) { + authenticateViewModel.obtainDistrict(areaModel.data.area) } - - override fun onGeocodeSearched(result: GeocodeResult?, rCode: Int) { - + }) + authenticateViewModel.districtModel.observe(this, { districtModel -> + if (districtModel.code == 200) { + districtModel.data.forEach { area -> + if (area.id == wellDetail.qu) { + authenticateViewModel.obtainStreet(area.id) + authenticateViewModel.streetModel.observe(this, { street -> + if (street.code == 200) { + street.data.forEach { streetData -> + if (streetData.id == wellDetail.area) { + AlertMessageDialog.Builder() + .setContext(this@WellDetailActivity) + .setTitle("闸井完整位置") + .setMessage(String.format("${area.name}${streetData.name}") + "-" + wellPosition) + .setPositiveButton("知道了") + .setOnDialogButtonClickListener {}.build() + .show() + } + } + } + }) + } + } } }) } diff --git a/app/build.gradle b/app/build.gradle index fdf5fc7..804f233 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -102,8 +102,6 @@ implementation 'com.google.code.gson:gson:2.8.6' //上拉加载下拉刷新 implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' - //高德地图搜索 - implementation 'com.amap.api:search:8.1.0' //高德导航 implementation 'com.amap.api:navi-3dmap:8.1.0_3dmap8.1.0' //日期选择器 diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 3fcef8b..460648b 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -9,6 +9,7 @@ + @@ -51,6 +52,7 @@ android:name=".view.BigImageActivity" android:theme="@style/Theme.BigImageActivity" /> + () { + + private val countLimit = 4 + private var imageData: ArrayList = ArrayList() + + fun setupImage(images: ArrayList) { + this.imageData = images + notifyDataSetChanged() + } + + fun deleteImage(position: Int) { + if (imageData.size != 0) { + imageData.removeAt(position) + notifyDataSetChanged() + } + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { + val imageView = ImageView(context) + val screenWidth: Int = SizeUtil.getScreenWidth(context) - SizeUtil.dp2px(context, 40f) + val margins: Int = SizeUtil.dp2px(context, 3f) + val itemSize = (screenWidth - 6 * margins) / 3 + val params = LinearLayout.LayoutParams(itemSize, itemSize) + params.setMargins(margins, margins, margins, margins) + params.gravity = Gravity.CENTER + imageView.scaleType = ImageView.ScaleType.CENTER_CROP + imageView.layoutParams = params + return ItemViewHolder(imageView) + } + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + if (position == itemCount - 1 && imageData.size < countLimit) { + holder.imageView.setImageResource(R.drawable.ic_add_pic) + holder.imageView.setOnClickListener { //添加图片 + mOnItemClickListener!!.onAddImageClick() + } + } else { + Glide.with(context).load(imageData[position]).into(holder.imageView) + holder.imageView.setOnClickListener { // 点击操作,查看大图 + mOnItemClickListener!!.onItemClick(position) + } + // 长按监听 + holder.imageView.setOnLongClickListener { v -> //长按删除 + mOnItemClickListener!!.onItemLongClick(v, position) + true + } + } + } + + override fun getItemCount(): Int { + // 满3张图就不让其添加新图 + return if (imageData.size != 0 && imageData.size >= countLimit) { + countLimit + } else { + if (imageData.size == 0) 1 else imageData.size + 1 + } + } + + private var mOnItemClickListener: OnItemClickListener? = null + + fun setOnItemClickListener(onItemClickListener: OnItemClickListener?) { + mOnItemClickListener = onItemClickListener + } + + interface OnItemClickListener { + fun onAddImageClick() + fun onItemClick(position: Int) + fun onItemLongClick(view: View?, position: Int) + } + + inner class ItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val imageView: ImageView = itemView as ImageView + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt index 3a098be..ad20c8b 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt @@ -31,7 +31,10 @@ setContentView(initLayoutView()) ImmersionBar.with(this).statusBarDarkFont(false).init() //沉浸式状态栏 when (this.javaClass.simpleName) { - "WelcomeActivity" -> ImmersionBar.with(this).statusBarDarkFont(true).init() + "WelcomeActivity" -> { + ImmersionBar.with(this).statusBarDarkFont(true).init() + StatusBarColorUtil.setColor(this, R.color.white.convertColor(this)) + } "SplashScreenActivity" -> ImmersionBar.with(this).statusBarDarkFont(false).init() "LoginActivity" -> ImmersionBar.with(this).statusBarDarkFont(true).init() else -> StatusBarColorUtil.setColor(this, R.color.mainThemeColor.convertColor(this)) diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/extensions/ArrayList.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/extensions/ArrayList.kt index e77dbaa..3affed7 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/extensions/ArrayList.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/extensions/ArrayList.kt @@ -13,7 +13,7 @@ if (index == this.size - 1) { builder.append(s) } else { - builder.append(s).append(",") + builder.append(s).append(";") } } return builder.toString() diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/model/AreaModel.java b/app/src/main/java/com/casic/app/smartwell/sanxi/model/AreaModel.java new file mode 100644 index 0000000..3ee4c83 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/model/AreaModel.java @@ -0,0 +1,125 @@ +package com.casic.app.smartwell.sanxi.model; + +public class AreaModel { + + private int code; + private DataBean data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataBean getData() { + return data; + } + + public void setData(DataBean data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private String area; + private String communications; + private String deptid; + private String deviceTypes; + private String id; + private String lat; + private String lng; + private String map; + private String wellTypes; + + public String getArea() { + return area; + } + + public void setArea(String area) { + this.area = area; + } + + public String getCommunications() { + return communications; + } + + public void setCommunications(String communications) { + this.communications = communications; + } + + public String getDeptid() { + return deptid; + } + + public void setDeptid(String deptid) { + this.deptid = deptid; + } + + public String getDeviceTypes() { + return deviceTypes; + } + + public void setDeviceTypes(String deviceTypes) { + this.deviceTypes = deviceTypes; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getLat() { + return lat; + } + + public void setLat(String lat) { + this.lat = lat; + } + + public String getLng() { + return lng; + } + + public void setLng(String lng) { + this.lng = lng; + } + + public String getMap() { + return map; + } + + public void setMap(String map) { + this.map = map; + } + + public String getWellTypes() { + return wellTypes; + } + + public void setWellTypes(String wellTypes) { + this.wellTypes = wellTypes; + } + } +} diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/model/DistrictModel.java b/app/src/main/java/com/casic/app/smartwell/sanxi/model/DistrictModel.java new file mode 100644 index 0000000..02e9ef2 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/model/DistrictModel.java @@ -0,0 +1,172 @@ +package com.casic.app.smartwell.sanxi.model; + +import java.util.List; + +public class DistrictModel { + + private int code; + private List data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public List getData() { + return data; + } + + public void setData(List data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private String id; + private String isSync; + private String lat; + private int level; + private String levelName; + private String lng; + private String name; + private int num; + private String pName; + private String pid; + private String pids; + private String simplename; + private String targetIdSync; + private String targetPidSync; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getIsSync() { + return isSync; + } + + public void setIsSync(String isSync) { + this.isSync = isSync; + } + + public String getLat() { + return lat; + } + + public void setLat(String lat) { + this.lat = lat; + } + + public int getLevel() { + return level; + } + + public void setLevel(int level) { + this.level = level; + } + + public String getLevelName() { + return levelName; + } + + public void setLevelName(String levelName) { + this.levelName = levelName; + } + + public String getLng() { + return lng; + } + + public void setLng(String lng) { + this.lng = lng; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getNum() { + return num; + } + + public void setNum(int num) { + this.num = num; + } + + public String getPName() { + return pName; + } + + public void setPName(String pName) { + this.pName = pName; + } + + public String getPid() { + return pid; + } + + public void setPid(String pid) { + this.pid = pid; + } + + public String getPids() { + return pids; + } + + public void setPids(String pids) { + this.pids = pids; + } + + public String getSimplename() { + return simplename; + } + + public void setSimplename(String simplename) { + this.simplename = simplename; + } + + public String getTargetIdSync() { + return targetIdSync; + } + + public void setTargetIdSync(String targetIdSync) { + this.targetIdSync = targetIdSync; + } + + public String getTargetPidSync() { + return targetPidSync; + } + + public void setTargetPidSync(String targetPidSync) { + this.targetPidSync = targetPidSync; + } + } +} diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/model/StreetModel.java b/app/src/main/java/com/casic/app/smartwell/sanxi/model/StreetModel.java new file mode 100644 index 0000000..90cc7d5 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/model/StreetModel.java @@ -0,0 +1,172 @@ +package com.casic.app.smartwell.sanxi.model; + +import java.util.List; + +public class StreetModel { + + private int code; + private List data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public List getData() { + return data; + } + + public void setData(List data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private String id; + private String isSync; + private String lat; + private int level; + private String levelName; + private String lng; + private String name; + private int num; + private String pName; + private String pid; + private String pids; + private String simplename; + private String targetIdSync; + private String targetPidSync; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getIsSync() { + return isSync; + } + + public void setIsSync(String isSync) { + this.isSync = isSync; + } + + public String getLat() { + return lat; + } + + public void setLat(String lat) { + this.lat = lat; + } + + public int getLevel() { + return level; + } + + public void setLevel(int level) { + this.level = level; + } + + public String getLevelName() { + return levelName; + } + + public void setLevelName(String levelName) { + this.levelName = levelName; + } + + public String getLng() { + return lng; + } + + public void setLng(String lng) { + this.lng = lng; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getNum() { + return num; + } + + public void setNum(int num) { + this.num = num; + } + + public String getPName() { + return pName; + } + + public void setPName(String pName) { + this.pName = pName; + } + + public String getPid() { + return pid; + } + + public void setPid(String pid) { + this.pid = pid; + } + + public String getPids() { + return pids; + } + + public void setPids(String pids) { + this.pids = pids; + } + + public String getSimplename() { + return simplename; + } + + public void setSimplename(String simplename) { + this.simplename = simplename; + } + + public String getTargetIdSync() { + return targetIdSync; + } + + public void setTargetIdSync(String targetIdSync) { + this.targetIdSync = targetIdSync; + } + + public String getTargetPidSync() { + return targetPidSync; + } + + public void setTargetPidSync(String targetPidSync) { + this.targetPidSync = targetPidSync; + } + } +} diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/Constant.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/Constant.kt index bae51d6..3251baa 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/Constant.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/Constant.kt @@ -7,6 +7,7 @@ object Constant { val USER_PERMISSIONS = arrayOf( Manifest.permission.READ_EXTERNAL_STORAGE, + Manifest.permission.CAMERA, Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS, Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION, diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/FileUtils.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/FileUtils.kt index 3e9ae35..cef2d83 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/FileUtils.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/FileUtils.kt @@ -18,4 +18,13 @@ } return downloadDir.toString() } + + val imageCompressPath: String + get() { + val imageDir = File(context.getExternalFilesDir(Environment.DIRECTORY_PICTURES), "") + if (!imageDir.exists()) { + imageDir.mkdir() + } + return imageDir.toString() + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt index 19687d2..bd311a4 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt @@ -289,6 +289,77 @@ ): String /** + * 上传图片 + * 系统路径static拼接图片返回路径 + * http://xx.com/static/2019-10/8050891248624f2bbefedcb196ce89cb.jpeg + */ + @Multipart + @POST("/imageUpload") + suspend fun uploadFile( + @Header("token") token: String, + @Part file: MultipartBody.Part + ): String + + /** + * 根据部门获取区ID + * + * @param deptId + */ + @GET("/config/getAreaByDept") + suspend fun obtainAreaByDept( + @Header("token") token: String, + @Query("deptId") deptId: String + ): String + + /** + * 获取区/县等 + * + * @param pid + */ + @GET("/area/list") + suspend fun obtainDistrict( + @Header("token") token: String, + @Query("pid") pid: String + ): String + + /** + * 获取街道 + * + * @param pid + */ + @GET("/area/list") + suspend fun obtainStreet( + @Header("token") token: String, + @Query("pid") pid: String + ): String + + /** + * 编辑更新井信息 + * + * @param id + */ + @FormUrlEncoded + @POST("/well/update") + suspend fun updateWellDetail( + @Header("token") token: String, + @Field("id") id: String, + @Field("wellCode") wellCode: String, + @Field("wellName") wellName: String, + @Field("wellType") wellType: String, + @Field("deptid") deptid: String, + @Field("deep") deep: String, + @Field("position") position: String, + @Field("coordinateX") coordinateX: String, + @Field("coordinateY") coordinateY: String, + @Field("photos") photos: String, + @Field("notes") notes: String?, + @Field("qu") qu: String, + @Field("area") area: String, + @Field("responsibleDept") responsibleDept: String, + @Field("responsibleDeptName") responsibleDeptName: String + ): String + + /** * 获取工单详情 * * @param id 工单id @@ -312,18 +383,6 @@ ): String /** - * 上传图片 - * 系统路径static拼接图片返回路径 - * http://xx.com/static/2019-10/8050891248624f2bbefedcb196ce89cb.jpeg - */ - @Multipart - @POST("/imageUpload") - suspend fun uploadImage( - @Header("token") token: String, - @Part file: MultipartBody.Part - ): String - - /** * 查找同一单位下的用户 * * @param hasMine 是否包含本人,1包含, 0不包含 diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt index efd6b11..e35e976 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt @@ -3,6 +3,10 @@ import com.casic.app.smartwell.sanxi.model.PublicKeyModel import com.casic.app.smartwell.sanxi.utils.AuthenticationHelper import com.casic.app.smartwell.sanxi.utils.Constant +import okhttp3.MediaType.Companion.toMediaTypeOrNull +import okhttp3.MultipartBody +import okhttp3.RequestBody +import java.io.File object RetrofitServiceManager { @@ -272,6 +276,76 @@ return api.obtainOperationResult(AuthenticationHelper.token!!, wellId, bfzt) } + /** + * 上传图片 + */ + suspend fun uploadFile(image: File): String { + val requestBody = RequestBody.create("image/png".toMediaTypeOrNull(), image) + val imagePart = MultipartBody.Part.createFormData("file", image.name, requestBody) + return api.uploadFile(AuthenticationHelper.token!!, imagePart) + } + + /** + * 根据部门获取区ID + */ + suspend fun obtainAreaByDept(deptId: String): String { + return api.obtainAreaByDept(AuthenticationHelper.token!!, deptId) + } + + /** + * 获取区/县等 + */ + suspend fun obtainDistrict(pid: String): String { + return api.obtainDistrict(AuthenticationHelper.token!!, pid) + } + + /** + * 获取街道 + */ + suspend fun obtainStreet(pid: String): String { + return api.obtainStreet(AuthenticationHelper.token!!, pid) + } + + /** + * 编辑更新井信息 + */ + suspend fun updateWellDetail( + id: String, + wellCode: String, + wellName: String, + wellType: String, + deptid: String, + deep: String, + position: String, + coordinateX: String, + coordinateY: String, + photos: String, + notes: String?, + qu: String, + area: String, + responsibleDept: String, + responsibleDeptName: String + ): String { + return api.updateWellDetail( + AuthenticationHelper.token!!, + id, + wellCode, + wellName, + wellType, + deptid, + deep, + position, + coordinateX, + coordinateY, + photos, + notes, + qu, + area, + responsibleDept, + responsibleDeptName + ) + } + // /** // * 获取工单详情 // */ @@ -287,15 +361,6 @@ // } // // /** -// * 上传图片 -// */ -// suspend fun uploadImage(image: File): String { -// val requestBody = RequestBody.create("image/png".toMediaTypeOrNull(), image) -// val imagePart = MultipartBody.Part.createFormData("file", image.name, requestBody) -// return api.uploadImage(AuthenticationHelper.token!!, imagePart) -// } -// -// /** // * 查找同一单位下的用户 // */ // suspend fun obtainSubordinate(hasMine: String?, roleTips: String?): String { diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/EditWellActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/EditWellActivity.kt new file mode 100644 index 0000000..956dbce --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/EditWellActivity.kt @@ -0,0 +1,341 @@ +package com.casic.app.smartwell.sanxi.view + +import android.app.Activity +import android.content.Intent +import android.view.View +import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.GridLayoutManager +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.adapter.EditableImageAdapter +import com.casic.app.smartwell.sanxi.base.BaseActivity +import com.casic.app.smartwell.sanxi.extensions.combineImagePath +import com.casic.app.smartwell.sanxi.extensions.navigatePageTo +import com.casic.app.smartwell.sanxi.extensions.reformat +import com.casic.app.smartwell.sanxi.extensions.show +import com.casic.app.smartwell.sanxi.model.DistrictModel +import com.casic.app.smartwell.sanxi.model.OwnerShipModel +import com.casic.app.smartwell.sanxi.model.WellListPageModel +import com.casic.app.smartwell.sanxi.utils.* +import com.casic.app.smartwell.sanxi.vm.AuthenticateViewModel +import com.casic.app.smartwell.sanxi.vm.UploadFileViewModel +import com.casic.app.smartwell.sanxi.vm.WellViewModel +import com.casic.app.smartwell.sanxi.widgets.BottomAreaSheet +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken +import com.luck.picture.lib.PictureSelector +import com.luck.picture.lib.config.PictureConfig +import com.luck.picture.lib.config.PictureMimeType +import com.pengxh.app.multilib.widget.dialog.BottomActionSheet +import com.qmuiteam.qmui.widget.dialog.QMUIBottomSheet +import kotlinx.android.synthetic.main.activity_edit_well.* +import kotlinx.android.synthetic.main.include_base_title.* +import java.io.File + +class EditWellActivity : BaseActivity() { + + private val kTag = "EditWellActivity" + private lateinit var wellViewModel: WellViewModel + private lateinit var authenticateViewModel: AuthenticateViewModel + private lateinit var uploadImageViewModel: UploadFileViewModel + private lateinit var wellBeanJson: String + private lateinit var imageAdapter: EditableImageAdapter + private lateinit var wellBean: WellListPageModel.DataBean.RowsBean + private val imagePaths: ArrayList = ArrayList() //服务器返回的拍照数据集 + private val realPaths: ArrayList = ArrayList() //真实图片路径 + private val districtModels: ArrayList = ArrayList() //行政区 + private var wellType = "" + private var deptId = "" + private var districtId = "" + private var streetId = "" + + override fun initLayoutView(): Int = R.layout.activity_edit_well + + override fun setupTopBarLayout() { + leftBackView.setOnClickListener { finish() } + titleView.text = "编辑井信息" + } + + override fun initData() { + wellViewModel = ViewModelProvider(this).get(WellViewModel::class.java) + authenticateViewModel = ViewModelProvider(this).get(AuthenticateViewModel::class.java) + uploadImageViewModel = ViewModelProvider(this).get(UploadFileViewModel::class.java) + wellBeanJson = intent.getStringExtra(Constant.INTENT_PARAM)!! + wellBean = Gson().fromJson( + wellBeanJson, object : TypeToken() {}.type + ) + wellNameView.setText(wellBean.wellName) + wellCodeView.text = wellBean.wellCode + + this.wellType = wellBean.wellType + wellTypeView.text = wellBean.wellTypeName + + this.deptId = wellBean.deptid + ownerShipView.text = wellBean.deptName + wellDepthView.setText(wellBean.deep) + longitudeView.setText(wellBean.lngGaode) + latitudeView.setText(wellBean.latGaode) + + /** + * 2022-06/e805917f14ed49378bbd29cae391b061.png; + * 2022-06/48d34f27695346bbb39d695333faabee.png; + * 2022-06/6df199418fd84960a164ad9c9660e172.png; + * 2022-06/bfbab97a965d406ba30fc9d09ab35f5c.png; + * */ + //显示已有的图片 + val imageArray = wellBean.photos.toString().split(";") + imageArray.forEach { path -> + if (path.isNotBlank()) { + imagePaths.add(path) + realPaths.add(path.combineImagePath()) + } + } + imageAdapter = EditableImageAdapter(this) + imageAdapter.setupImage(realPaths) + imageRecyclerView.layoutManager = GridLayoutManager(this, 3) + imageRecyclerView.adapter = imageAdapter + + //默认加载当前井的区域 + authenticateViewModel.obtainAreaByDept(wellBean.deptid) + authenticateViewModel.areaModel.observe(this, { + if (it.code == 200) { + authenticateViewModel.obtainDistrict(it.data.area) + } + }) + addressView.setText(wellBean.position) + } + + override fun initEvent() { + wellCodeView.setOnClickListener { + "井编号不可编辑".show() + } + + wellTypeView.setOnClickListener { + wellViewModel.obtainWellType() + } + wellViewModel.wellTypeModel.observe(this, { + if (it.code == 200) { + val sheetBuilder = QMUIBottomSheet.BottomListSheetBuilder(this) + sheetBuilder.setTitle("井类型") + it.data.forEach { type -> + sheetBuilder.addItem(type.name) + } + sheetBuilder.setGravityCenter(true) + .setOnSheetItemClickListener { dialog, _, position, tag -> + this.wellType = it.data[position].value + wellTypeView.text = tag + + dialog.dismiss() + }.build().show() + } + }) + + ownerShipView.setOnClickListener { + authenticateViewModel.obtainOwnerShip("03") + } + + imageAdapter.setOnItemClickListener(object : EditableImageAdapter.OnItemClickListener { + override fun onAddImageClick() { + selectPicture() + } + + override fun onItemClick(position: Int) { + if (realPaths[position].isBlank()) { + "图片加载失败,无法查看大图".show() + } else { + navigatePageTo(position, realPaths) + } + } + + override fun onItemLongClick(view: View?, position: Int) { + imagePaths.removeAt(position) + imageAdapter.deleteImage(position) + } + }) + + authenticateViewModel.resultModel.observe(this, { + if (it.code == 200) { + val ownerShipModel: MutableList = ArrayList() + it.data?.list?.forEach { listBean -> + ownerShipModel.add(listBean) + } + val sheetBuilder = QMUIBottomSheet.BottomListSheetBuilder(this) + sheetBuilder.setTitle("权属单位") + ownerShipModel.forEach { model -> + sheetBuilder.addItem(model.name) + } + sheetBuilder.setGravityCenter(true) + .setOnSheetItemClickListener { dialog, _, position, tag -> + this.deptId = it.data?.list!![position].id + ownerShipView.text = tag + + dialog.dismiss() + }.build().show() + } + }) + + authenticateViewModel.districtModel.observe(this, { + if (it.code == 200) { + it.data.forEach { area -> + districtModels.add(area) + //判断区 + if (area.id == wellBean.qu) { + authenticateViewModel.obtainStreet(area.id) + authenticateViewModel.streetModel.observe(this, { street -> + if (street.code == 200) { + street.data.forEach { streetData -> + //判断街道 + if (streetData.id == wellBean.area) { + districtView.text = + String.format("${area.name}${streetData.name}") + } + } + } + }) + } + } + } + }) + + //点击选择井的区域 + districtView.setOnClickListener { + if (districtModels.isNullOrEmpty()) { + "无行政区域数据,无法修改".show() + return@setOnClickListener + } + BottomAreaSheet.Builder() + .setContext(this) + .setLifecycleOwner(this) + .setDistrictAreaData(districtModels) + .setChildDataViewModel(authenticateViewModel) + .setOnActionSheetListener(object : BottomAreaSheet.OnActionSheetListener { + override fun onAreaSelected( + area: String?, districtId: String, streetId: String + ) { + districtView.text = area?.replace("-", "") + this@EditWellActivity.districtId = districtId + this@EditWellActivity.streetId = streetId + } + }) + .build().show() + } + + //提交修改 + saveButton.setOnClickListener { + if (districtId.isEmpty() || streetId.isEmpty()) { + "行政区ID为空或者街道ID为空".show() + return@setOnClickListener + } + wellViewModel.updateWellDetail( + id = wellBean.id, + wellCode = wellBean.wellCode, + wellName = wellNameView.text.toString(), + wellType = wellType, + deptid = deptId, + deep = wellDepthView.text.toString(), + position = addressView.text.toString(), + coordinateX = longitudeView.text.toString(), + coordinateY = latitudeView.text.toString(), + photos = imagePaths.reformat(), + notes = "", + qu = districtId, + area = streetId, + responsibleDept = deptId, + responsibleDeptName = ownerShipView.text.toString() + ) + } + + uploadImageViewModel.resultModel.observe(this, { model -> + if (model.code == 200) { + /** + * 显示图片 + * path: 2021-07\c670eac17d644b179a4324a34bb84329.jpeg + * */ + /** + * 显示图片 + * path: 2021-07\c670eac17d644b179a4324a34bb84329.jpeg + * */ + val sumItemCount: Int = imageAdapter.itemCount + 1 //每上传一张图片,图片总数都是在原有的基础上+1 + if (sumItemCount <= 5) { + val url = model.data + //let函数处理需要针对一个可null的对象统一做判空处理。 + url?.let { + imagePaths.add(it) + realPaths.add(it.combineImagePath()) + } + imageAdapter.setupImage(realPaths) + } else { + "最多只能上传4张图片".show() + } + } + }) + uploadImageViewModel.loadState.observe(this, { + DialogHelper.dismissLoadingDialog() + }) + + wellViewModel.loadState.observe(this, { + when (it) { + is LoadState.Loading -> { + DialogHelper.showLoadingDialog(this, "保存中,请稍后...") + } + is LoadState.Success -> { + DialogHelper.dismissLoadingDialog() + finish() + } + else -> { + DialogHelper.dismissLoadingDialog() + } + } + }) + } + + private fun selectPicture() { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitles(arrayOf("拍照", "相册")) + .setOnActionSheetListener { position -> + when (position) { + 0 -> { + PictureSelector.create(this) + .openCamera(PictureMimeType.ofImage()) + .isCompress(true) + .compressSavePath(FileUtils.imageCompressPath) + .imageEngine(GlideLoadEngine.createGlideEngine()) + .forResult(PictureConfig.REQUEST_CAMERA) + } + 1 -> { + PictureSelector.create(this) + .openGallery(PictureMimeType.ofImage()) + .isWeChatStyle(true) + .isCamera(false) + .isCompress(true) + .compressSavePath(FileUtils.imageCompressPath) + .imageEngine(GlideLoadEngine.createGlideEngine()) + .maxSelectNum(4) + .forResult(PictureConfig.CHOOSE_REQUEST) + } + } + }.build().show() + } + + override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { + super.onActivityResult(requestCode, resultCode, data) + if (resultCode == Activity.RESULT_OK) { + when (requestCode) { + PictureConfig.CHOOSE_REQUEST -> { + val selectResult = PictureSelector.obtainMultipleResult(data) + DialogHelper.showLoadingDialog(this, "图片上传中,请稍后...") + for (res in selectResult) { + val file = File(res.compressPath) + //上传图片 + uploadImageViewModel.uploadFile(file) + } + } + PictureConfig.REQUEST_CAMERA -> { + val cameraResult = PictureSelector.obtainMultipleResult(data)[0] + //上传图片 + uploadImageViewModel.uploadFile(File(cameraResult.compressPath)) + } + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellDetailActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellDetailActivity.kt index 50c9e05..6c93e4e 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellDetailActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellDetailActivity.kt @@ -9,28 +9,30 @@ import com.amap.api.maps.model.CameraPosition import com.amap.api.maps.model.LatLng import com.amap.api.maps.model.MarkerOptions -import com.amap.api.services.core.LatLonPoint -import com.amap.api.services.geocoder.GeocodeResult -import com.amap.api.services.geocoder.GeocodeSearch -import com.amap.api.services.geocoder.RegeocodeQuery -import com.amap.api.services.geocoder.RegeocodeResult import com.casic.app.smartwell.sanxi.R import com.casic.app.smartwell.sanxi.base.BaseActivity import com.casic.app.smartwell.sanxi.extensions.show import com.casic.app.smartwell.sanxi.utils.Constant import com.casic.app.smartwell.sanxi.utils.DialogHelper import com.casic.app.smartwell.sanxi.utils.LoadState +import com.casic.app.smartwell.sanxi.vm.AuthenticateViewModel import com.casic.app.smartwell.sanxi.vm.WellViewModel import com.pengxh.app.multilib.widget.dialog.AlertMessageDialog import kotlinx.android.synthetic.main.activity_well_detail.* +import kotlinx.android.synthetic.main.activity_well_detail.wellCodeView +import kotlinx.android.synthetic.main.activity_well_detail.wellDepthView +import kotlinx.android.synthetic.main.activity_well_detail.wellNameView +import kotlinx.android.synthetic.main.activity_well_detail.wellStateView +import kotlinx.android.synthetic.main.activity_well_detail.wellTypeView +import kotlinx.android.synthetic.main.activity_well_list_detail.* import kotlinx.android.synthetic.main.include_base_title.* class WellDetailActivity : BaseActivity(), AMap.OnMapLoadedListener { private val kTag = "WellDetailActivity" - private val geocoderSearch by lazy { GeocodeSearch(this) } private lateinit var wellViewModel: WellViewModel + private lateinit var authenticateViewModel: AuthenticateViewModel private lateinit var wellId: String private lateinit var aMap: AMap private var latLng: LatLng? = null @@ -46,6 +48,7 @@ override fun initData() { wellId = intent.getStringExtra(Constant.INTENT_PARAM)!! wellViewModel = ViewModelProvider(this).get(WellViewModel::class.java) + authenticateViewModel = ViewModelProvider(this).get(AuthenticateViewModel::class.java) aMap = wellMapView.map aMap.mapType = AMap.MAP_TYPE_NORMAL @@ -103,39 +106,41 @@ val wellPosition = wellDetail.position.toString() wellLocationView.text = wellPosition - //根据经纬度获取省市区县 if (wellDetail.latGaode.isBlank() || wellDetail.lngGaode.isBlank()) { "井经纬度异常,无法查看完整位置信息".show() return@observe } this.latLng = LatLng(wellDetail.latGaode.toDouble(), wellDetail.lngGaode.toDouble()) - val queryParam = RegeocodeQuery( - LatLonPoint(wellDetail.latGaode.toDouble(), wellDetail.lngGaode.toDouble()), - 200f, - GeocodeSearch.AMAP - ) - tipsImageView.setOnClickListener { - geocoderSearch.getFromLocationAsyn(queryParam) + authenticateViewModel.obtainAreaByDept(wellDetail.deptid) } - - geocoderSearch.setOnGeocodeSearchListener(object : - GeocodeSearch.OnGeocodeSearchListener { - override fun onRegeocodeSearched(result: RegeocodeResult?, rCode: Int) { - if (rCode == 1000) { - AlertMessageDialog.Builder() - .setContext(this@WellDetailActivity) - .setTitle("闸井完整位置") - .setMessage(result?.regeocodeAddress?.formatAddress + "-" + wellPosition) - .setPositiveButton("知道了").setOnDialogButtonClickListener {}.build() - .show() - } else { - "获取该闸井详细位置信息失败".show() - } + authenticateViewModel.areaModel.observe(this, { areaModel -> + if (areaModel.code == 200) { + authenticateViewModel.obtainDistrict(areaModel.data.area) } - - override fun onGeocodeSearched(result: GeocodeResult?, rCode: Int) { - + }) + authenticateViewModel.districtModel.observe(this, { districtModel -> + if (districtModel.code == 200) { + districtModel.data.forEach { area -> + if (area.id == wellDetail.qu) { + authenticateViewModel.obtainStreet(area.id) + authenticateViewModel.streetModel.observe(this, { street -> + if (street.code == 200) { + street.data.forEach { streetData -> + if (streetData.id == wellDetail.area) { + AlertMessageDialog.Builder() + .setContext(this@WellDetailActivity) + .setTitle("闸井完整位置") + .setMessage(String.format("${area.name}${streetData.name}") + "-" + wellPosition) + .setPositiveButton("知道了") + .setOnDialogButtonClickListener {}.build() + .show() + } + } + } + }) + } + } } }) } diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellListDetailActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellListDetailActivity.kt index b34be03..d28b752 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellListDetailActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellListDetailActivity.kt @@ -4,11 +4,6 @@ import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.GridLayoutManager import androidx.recyclerview.widget.LinearLayoutManager -import com.amap.api.services.core.LatLonPoint -import com.amap.api.services.geocoder.GeocodeResult -import com.amap.api.services.geocoder.GeocodeSearch -import com.amap.api.services.geocoder.RegeocodeQuery -import com.amap.api.services.geocoder.RegeocodeResult import com.casic.app.smartwell.sanxi.R import com.casic.app.smartwell.sanxi.adapter.DeviceDataListAdapter import com.casic.app.smartwell.sanxi.adapter.DeviceDataTitleAdapter @@ -19,6 +14,7 @@ import com.casic.app.smartwell.sanxi.extensions.show import com.casic.app.smartwell.sanxi.model.WellListPageModel import com.casic.app.smartwell.sanxi.utils.Constant +import com.casic.app.smartwell.sanxi.vm.AuthenticateViewModel import com.casic.app.smartwell.sanxi.vm.WellViewModel import com.google.gson.Gson import com.google.gson.reflect.TypeToken @@ -28,8 +24,8 @@ class WellListDetailActivity : BaseActivity() { private val kTag = "WellListDetailActivity" - private val geocoderSearch by lazy { GeocodeSearch(this) } private lateinit var wellViewModel: WellViewModel + private lateinit var authenticateViewModel: AuthenticateViewModel private lateinit var wellBeanJson: String override fun initLayoutView(): Int = R.layout.activity_well_list_detail @@ -41,6 +37,7 @@ override fun initData() { wellViewModel = ViewModelProvider(this).get(WellViewModel::class.java) + authenticateViewModel = ViewModelProvider(this).get(AuthenticateViewModel::class.java) wellBeanJson = intent.getStringExtra(Constant.INTENT_PARAM)!! val wellBean = Gson().fromJson( wellBeanJson, object : TypeToken() {}.type @@ -89,29 +86,32 @@ }) } - //根据经纬度获取省市区县 - if (wellBean.latGaode.isBlank() || wellBean.lngGaode.isBlank()) { - "井经纬度异常,无法查看完整位置信息".show() - return - } - val queryParam = RegeocodeQuery( - LatLonPoint(wellBean.latGaode.toDouble(), wellBean.lngGaode.toDouble()), - 200f, - GeocodeSearch.AMAP - ) - geocoderSearch.getFromLocationAsyn(queryParam) - geocoderSearch.setOnGeocodeSearchListener(object : - GeocodeSearch.OnGeocodeSearchListener { - override fun onRegeocodeSearched(result: RegeocodeResult?, rCode: Int) { - if (rCode == 1000) { - districtView.text = result?.regeocodeAddress?.formatAddress - } - } - - override fun onGeocodeSearched(result: GeocodeResult?, rCode: Int) { - + authenticateViewModel.obtainAreaByDept(wellBean.deptid) + authenticateViewModel.areaModel.observe(this, { + if (it.code == 200) { + authenticateViewModel.obtainDistrict(it.data.area) } }) + authenticateViewModel.districtModel.observe(this, { + if (it.code == 200) { + it.data.forEach { area -> + if (area.id == wellBean.qu) { + authenticateViewModel.obtainStreet(area.id) + authenticateViewModel.streetModel.observe(this, { street -> + if (street.code == 200) { + street.data.forEach { streetData -> + if (streetData.id == wellBean.area) { + districtView.text = + String.format("${area.name}${streetData.name}") + } + } + } + }) + } + } + } + }) + addressView.text = wellBean.position maintenanceView.text = wellBean.responsibleDeptName diff --git a/app/build.gradle b/app/build.gradle index fdf5fc7..804f233 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -102,8 +102,6 @@ implementation 'com.google.code.gson:gson:2.8.6' //上拉加载下拉刷新 implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' - //高德地图搜索 - implementation 'com.amap.api:search:8.1.0' //高德导航 implementation 'com.amap.api:navi-3dmap:8.1.0_3dmap8.1.0' //日期选择器 diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 3fcef8b..460648b 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -9,6 +9,7 @@ + @@ -51,6 +52,7 @@ android:name=".view.BigImageActivity" android:theme="@style/Theme.BigImageActivity" /> + () { + + private val countLimit = 4 + private var imageData: ArrayList = ArrayList() + + fun setupImage(images: ArrayList) { + this.imageData = images + notifyDataSetChanged() + } + + fun deleteImage(position: Int) { + if (imageData.size != 0) { + imageData.removeAt(position) + notifyDataSetChanged() + } + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { + val imageView = ImageView(context) + val screenWidth: Int = SizeUtil.getScreenWidth(context) - SizeUtil.dp2px(context, 40f) + val margins: Int = SizeUtil.dp2px(context, 3f) + val itemSize = (screenWidth - 6 * margins) / 3 + val params = LinearLayout.LayoutParams(itemSize, itemSize) + params.setMargins(margins, margins, margins, margins) + params.gravity = Gravity.CENTER + imageView.scaleType = ImageView.ScaleType.CENTER_CROP + imageView.layoutParams = params + return ItemViewHolder(imageView) + } + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + if (position == itemCount - 1 && imageData.size < countLimit) { + holder.imageView.setImageResource(R.drawable.ic_add_pic) + holder.imageView.setOnClickListener { //添加图片 + mOnItemClickListener!!.onAddImageClick() + } + } else { + Glide.with(context).load(imageData[position]).into(holder.imageView) + holder.imageView.setOnClickListener { // 点击操作,查看大图 + mOnItemClickListener!!.onItemClick(position) + } + // 长按监听 + holder.imageView.setOnLongClickListener { v -> //长按删除 + mOnItemClickListener!!.onItemLongClick(v, position) + true + } + } + } + + override fun getItemCount(): Int { + // 满3张图就不让其添加新图 + return if (imageData.size != 0 && imageData.size >= countLimit) { + countLimit + } else { + if (imageData.size == 0) 1 else imageData.size + 1 + } + } + + private var mOnItemClickListener: OnItemClickListener? = null + + fun setOnItemClickListener(onItemClickListener: OnItemClickListener?) { + mOnItemClickListener = onItemClickListener + } + + interface OnItemClickListener { + fun onAddImageClick() + fun onItemClick(position: Int) + fun onItemLongClick(view: View?, position: Int) + } + + inner class ItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val imageView: ImageView = itemView as ImageView + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt index 3a098be..ad20c8b 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt @@ -31,7 +31,10 @@ setContentView(initLayoutView()) ImmersionBar.with(this).statusBarDarkFont(false).init() //沉浸式状态栏 when (this.javaClass.simpleName) { - "WelcomeActivity" -> ImmersionBar.with(this).statusBarDarkFont(true).init() + "WelcomeActivity" -> { + ImmersionBar.with(this).statusBarDarkFont(true).init() + StatusBarColorUtil.setColor(this, R.color.white.convertColor(this)) + } "SplashScreenActivity" -> ImmersionBar.with(this).statusBarDarkFont(false).init() "LoginActivity" -> ImmersionBar.with(this).statusBarDarkFont(true).init() else -> StatusBarColorUtil.setColor(this, R.color.mainThemeColor.convertColor(this)) diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/extensions/ArrayList.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/extensions/ArrayList.kt index e77dbaa..3affed7 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/extensions/ArrayList.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/extensions/ArrayList.kt @@ -13,7 +13,7 @@ if (index == this.size - 1) { builder.append(s) } else { - builder.append(s).append(",") + builder.append(s).append(";") } } return builder.toString() diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/model/AreaModel.java b/app/src/main/java/com/casic/app/smartwell/sanxi/model/AreaModel.java new file mode 100644 index 0000000..3ee4c83 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/model/AreaModel.java @@ -0,0 +1,125 @@ +package com.casic.app.smartwell.sanxi.model; + +public class AreaModel { + + private int code; + private DataBean data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataBean getData() { + return data; + } + + public void setData(DataBean data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private String area; + private String communications; + private String deptid; + private String deviceTypes; + private String id; + private String lat; + private String lng; + private String map; + private String wellTypes; + + public String getArea() { + return area; + } + + public void setArea(String area) { + this.area = area; + } + + public String getCommunications() { + return communications; + } + + public void setCommunications(String communications) { + this.communications = communications; + } + + public String getDeptid() { + return deptid; + } + + public void setDeptid(String deptid) { + this.deptid = deptid; + } + + public String getDeviceTypes() { + return deviceTypes; + } + + public void setDeviceTypes(String deviceTypes) { + this.deviceTypes = deviceTypes; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getLat() { + return lat; + } + + public void setLat(String lat) { + this.lat = lat; + } + + public String getLng() { + return lng; + } + + public void setLng(String lng) { + this.lng = lng; + } + + public String getMap() { + return map; + } + + public void setMap(String map) { + this.map = map; + } + + public String getWellTypes() { + return wellTypes; + } + + public void setWellTypes(String wellTypes) { + this.wellTypes = wellTypes; + } + } +} diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/model/DistrictModel.java b/app/src/main/java/com/casic/app/smartwell/sanxi/model/DistrictModel.java new file mode 100644 index 0000000..02e9ef2 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/model/DistrictModel.java @@ -0,0 +1,172 @@ +package com.casic.app.smartwell.sanxi.model; + +import java.util.List; + +public class DistrictModel { + + private int code; + private List data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public List getData() { + return data; + } + + public void setData(List data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private String id; + private String isSync; + private String lat; + private int level; + private String levelName; + private String lng; + private String name; + private int num; + private String pName; + private String pid; + private String pids; + private String simplename; + private String targetIdSync; + private String targetPidSync; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getIsSync() { + return isSync; + } + + public void setIsSync(String isSync) { + this.isSync = isSync; + } + + public String getLat() { + return lat; + } + + public void setLat(String lat) { + this.lat = lat; + } + + public int getLevel() { + return level; + } + + public void setLevel(int level) { + this.level = level; + } + + public String getLevelName() { + return levelName; + } + + public void setLevelName(String levelName) { + this.levelName = levelName; + } + + public String getLng() { + return lng; + } + + public void setLng(String lng) { + this.lng = lng; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getNum() { + return num; + } + + public void setNum(int num) { + this.num = num; + } + + public String getPName() { + return pName; + } + + public void setPName(String pName) { + this.pName = pName; + } + + public String getPid() { + return pid; + } + + public void setPid(String pid) { + this.pid = pid; + } + + public String getPids() { + return pids; + } + + public void setPids(String pids) { + this.pids = pids; + } + + public String getSimplename() { + return simplename; + } + + public void setSimplename(String simplename) { + this.simplename = simplename; + } + + public String getTargetIdSync() { + return targetIdSync; + } + + public void setTargetIdSync(String targetIdSync) { + this.targetIdSync = targetIdSync; + } + + public String getTargetPidSync() { + return targetPidSync; + } + + public void setTargetPidSync(String targetPidSync) { + this.targetPidSync = targetPidSync; + } + } +} diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/model/StreetModel.java b/app/src/main/java/com/casic/app/smartwell/sanxi/model/StreetModel.java new file mode 100644 index 0000000..90cc7d5 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/model/StreetModel.java @@ -0,0 +1,172 @@ +package com.casic.app.smartwell.sanxi.model; + +import java.util.List; + +public class StreetModel { + + private int code; + private List data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public List getData() { + return data; + } + + public void setData(List data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private String id; + private String isSync; + private String lat; + private int level; + private String levelName; + private String lng; + private String name; + private int num; + private String pName; + private String pid; + private String pids; + private String simplename; + private String targetIdSync; + private String targetPidSync; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getIsSync() { + return isSync; + } + + public void setIsSync(String isSync) { + this.isSync = isSync; + } + + public String getLat() { + return lat; + } + + public void setLat(String lat) { + this.lat = lat; + } + + public int getLevel() { + return level; + } + + public void setLevel(int level) { + this.level = level; + } + + public String getLevelName() { + return levelName; + } + + public void setLevelName(String levelName) { + this.levelName = levelName; + } + + public String getLng() { + return lng; + } + + public void setLng(String lng) { + this.lng = lng; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getNum() { + return num; + } + + public void setNum(int num) { + this.num = num; + } + + public String getPName() { + return pName; + } + + public void setPName(String pName) { + this.pName = pName; + } + + public String getPid() { + return pid; + } + + public void setPid(String pid) { + this.pid = pid; + } + + public String getPids() { + return pids; + } + + public void setPids(String pids) { + this.pids = pids; + } + + public String getSimplename() { + return simplename; + } + + public void setSimplename(String simplename) { + this.simplename = simplename; + } + + public String getTargetIdSync() { + return targetIdSync; + } + + public void setTargetIdSync(String targetIdSync) { + this.targetIdSync = targetIdSync; + } + + public String getTargetPidSync() { + return targetPidSync; + } + + public void setTargetPidSync(String targetPidSync) { + this.targetPidSync = targetPidSync; + } + } +} diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/Constant.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/Constant.kt index bae51d6..3251baa 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/Constant.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/Constant.kt @@ -7,6 +7,7 @@ object Constant { val USER_PERMISSIONS = arrayOf( Manifest.permission.READ_EXTERNAL_STORAGE, + Manifest.permission.CAMERA, Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS, Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION, diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/FileUtils.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/FileUtils.kt index 3e9ae35..cef2d83 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/FileUtils.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/FileUtils.kt @@ -18,4 +18,13 @@ } return downloadDir.toString() } + + val imageCompressPath: String + get() { + val imageDir = File(context.getExternalFilesDir(Environment.DIRECTORY_PICTURES), "") + if (!imageDir.exists()) { + imageDir.mkdir() + } + return imageDir.toString() + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt index 19687d2..bd311a4 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt @@ -289,6 +289,77 @@ ): String /** + * 上传图片 + * 系统路径static拼接图片返回路径 + * http://xx.com/static/2019-10/8050891248624f2bbefedcb196ce89cb.jpeg + */ + @Multipart + @POST("/imageUpload") + suspend fun uploadFile( + @Header("token") token: String, + @Part file: MultipartBody.Part + ): String + + /** + * 根据部门获取区ID + * + * @param deptId + */ + @GET("/config/getAreaByDept") + suspend fun obtainAreaByDept( + @Header("token") token: String, + @Query("deptId") deptId: String + ): String + + /** + * 获取区/县等 + * + * @param pid + */ + @GET("/area/list") + suspend fun obtainDistrict( + @Header("token") token: String, + @Query("pid") pid: String + ): String + + /** + * 获取街道 + * + * @param pid + */ + @GET("/area/list") + suspend fun obtainStreet( + @Header("token") token: String, + @Query("pid") pid: String + ): String + + /** + * 编辑更新井信息 + * + * @param id + */ + @FormUrlEncoded + @POST("/well/update") + suspend fun updateWellDetail( + @Header("token") token: String, + @Field("id") id: String, + @Field("wellCode") wellCode: String, + @Field("wellName") wellName: String, + @Field("wellType") wellType: String, + @Field("deptid") deptid: String, + @Field("deep") deep: String, + @Field("position") position: String, + @Field("coordinateX") coordinateX: String, + @Field("coordinateY") coordinateY: String, + @Field("photos") photos: String, + @Field("notes") notes: String?, + @Field("qu") qu: String, + @Field("area") area: String, + @Field("responsibleDept") responsibleDept: String, + @Field("responsibleDeptName") responsibleDeptName: String + ): String + + /** * 获取工单详情 * * @param id 工单id @@ -312,18 +383,6 @@ ): String /** - * 上传图片 - * 系统路径static拼接图片返回路径 - * http://xx.com/static/2019-10/8050891248624f2bbefedcb196ce89cb.jpeg - */ - @Multipart - @POST("/imageUpload") - suspend fun uploadImage( - @Header("token") token: String, - @Part file: MultipartBody.Part - ): String - - /** * 查找同一单位下的用户 * * @param hasMine 是否包含本人,1包含, 0不包含 diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt index efd6b11..e35e976 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt @@ -3,6 +3,10 @@ import com.casic.app.smartwell.sanxi.model.PublicKeyModel import com.casic.app.smartwell.sanxi.utils.AuthenticationHelper import com.casic.app.smartwell.sanxi.utils.Constant +import okhttp3.MediaType.Companion.toMediaTypeOrNull +import okhttp3.MultipartBody +import okhttp3.RequestBody +import java.io.File object RetrofitServiceManager { @@ -272,6 +276,76 @@ return api.obtainOperationResult(AuthenticationHelper.token!!, wellId, bfzt) } + /** + * 上传图片 + */ + suspend fun uploadFile(image: File): String { + val requestBody = RequestBody.create("image/png".toMediaTypeOrNull(), image) + val imagePart = MultipartBody.Part.createFormData("file", image.name, requestBody) + return api.uploadFile(AuthenticationHelper.token!!, imagePart) + } + + /** + * 根据部门获取区ID + */ + suspend fun obtainAreaByDept(deptId: String): String { + return api.obtainAreaByDept(AuthenticationHelper.token!!, deptId) + } + + /** + * 获取区/县等 + */ + suspend fun obtainDistrict(pid: String): String { + return api.obtainDistrict(AuthenticationHelper.token!!, pid) + } + + /** + * 获取街道 + */ + suspend fun obtainStreet(pid: String): String { + return api.obtainStreet(AuthenticationHelper.token!!, pid) + } + + /** + * 编辑更新井信息 + */ + suspend fun updateWellDetail( + id: String, + wellCode: String, + wellName: String, + wellType: String, + deptid: String, + deep: String, + position: String, + coordinateX: String, + coordinateY: String, + photos: String, + notes: String?, + qu: String, + area: String, + responsibleDept: String, + responsibleDeptName: String + ): String { + return api.updateWellDetail( + AuthenticationHelper.token!!, + id, + wellCode, + wellName, + wellType, + deptid, + deep, + position, + coordinateX, + coordinateY, + photos, + notes, + qu, + area, + responsibleDept, + responsibleDeptName + ) + } + // /** // * 获取工单详情 // */ @@ -287,15 +361,6 @@ // } // // /** -// * 上传图片 -// */ -// suspend fun uploadImage(image: File): String { -// val requestBody = RequestBody.create("image/png".toMediaTypeOrNull(), image) -// val imagePart = MultipartBody.Part.createFormData("file", image.name, requestBody) -// return api.uploadImage(AuthenticationHelper.token!!, imagePart) -// } -// -// /** // * 查找同一单位下的用户 // */ // suspend fun obtainSubordinate(hasMine: String?, roleTips: String?): String { diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/EditWellActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/EditWellActivity.kt new file mode 100644 index 0000000..956dbce --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/EditWellActivity.kt @@ -0,0 +1,341 @@ +package com.casic.app.smartwell.sanxi.view + +import android.app.Activity +import android.content.Intent +import android.view.View +import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.GridLayoutManager +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.adapter.EditableImageAdapter +import com.casic.app.smartwell.sanxi.base.BaseActivity +import com.casic.app.smartwell.sanxi.extensions.combineImagePath +import com.casic.app.smartwell.sanxi.extensions.navigatePageTo +import com.casic.app.smartwell.sanxi.extensions.reformat +import com.casic.app.smartwell.sanxi.extensions.show +import com.casic.app.smartwell.sanxi.model.DistrictModel +import com.casic.app.smartwell.sanxi.model.OwnerShipModel +import com.casic.app.smartwell.sanxi.model.WellListPageModel +import com.casic.app.smartwell.sanxi.utils.* +import com.casic.app.smartwell.sanxi.vm.AuthenticateViewModel +import com.casic.app.smartwell.sanxi.vm.UploadFileViewModel +import com.casic.app.smartwell.sanxi.vm.WellViewModel +import com.casic.app.smartwell.sanxi.widgets.BottomAreaSheet +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken +import com.luck.picture.lib.PictureSelector +import com.luck.picture.lib.config.PictureConfig +import com.luck.picture.lib.config.PictureMimeType +import com.pengxh.app.multilib.widget.dialog.BottomActionSheet +import com.qmuiteam.qmui.widget.dialog.QMUIBottomSheet +import kotlinx.android.synthetic.main.activity_edit_well.* +import kotlinx.android.synthetic.main.include_base_title.* +import java.io.File + +class EditWellActivity : BaseActivity() { + + private val kTag = "EditWellActivity" + private lateinit var wellViewModel: WellViewModel + private lateinit var authenticateViewModel: AuthenticateViewModel + private lateinit var uploadImageViewModel: UploadFileViewModel + private lateinit var wellBeanJson: String + private lateinit var imageAdapter: EditableImageAdapter + private lateinit var wellBean: WellListPageModel.DataBean.RowsBean + private val imagePaths: ArrayList = ArrayList() //服务器返回的拍照数据集 + private val realPaths: ArrayList = ArrayList() //真实图片路径 + private val districtModels: ArrayList = ArrayList() //行政区 + private var wellType = "" + private var deptId = "" + private var districtId = "" + private var streetId = "" + + override fun initLayoutView(): Int = R.layout.activity_edit_well + + override fun setupTopBarLayout() { + leftBackView.setOnClickListener { finish() } + titleView.text = "编辑井信息" + } + + override fun initData() { + wellViewModel = ViewModelProvider(this).get(WellViewModel::class.java) + authenticateViewModel = ViewModelProvider(this).get(AuthenticateViewModel::class.java) + uploadImageViewModel = ViewModelProvider(this).get(UploadFileViewModel::class.java) + wellBeanJson = intent.getStringExtra(Constant.INTENT_PARAM)!! + wellBean = Gson().fromJson( + wellBeanJson, object : TypeToken() {}.type + ) + wellNameView.setText(wellBean.wellName) + wellCodeView.text = wellBean.wellCode + + this.wellType = wellBean.wellType + wellTypeView.text = wellBean.wellTypeName + + this.deptId = wellBean.deptid + ownerShipView.text = wellBean.deptName + wellDepthView.setText(wellBean.deep) + longitudeView.setText(wellBean.lngGaode) + latitudeView.setText(wellBean.latGaode) + + /** + * 2022-06/e805917f14ed49378bbd29cae391b061.png; + * 2022-06/48d34f27695346bbb39d695333faabee.png; + * 2022-06/6df199418fd84960a164ad9c9660e172.png; + * 2022-06/bfbab97a965d406ba30fc9d09ab35f5c.png; + * */ + //显示已有的图片 + val imageArray = wellBean.photos.toString().split(";") + imageArray.forEach { path -> + if (path.isNotBlank()) { + imagePaths.add(path) + realPaths.add(path.combineImagePath()) + } + } + imageAdapter = EditableImageAdapter(this) + imageAdapter.setupImage(realPaths) + imageRecyclerView.layoutManager = GridLayoutManager(this, 3) + imageRecyclerView.adapter = imageAdapter + + //默认加载当前井的区域 + authenticateViewModel.obtainAreaByDept(wellBean.deptid) + authenticateViewModel.areaModel.observe(this, { + if (it.code == 200) { + authenticateViewModel.obtainDistrict(it.data.area) + } + }) + addressView.setText(wellBean.position) + } + + override fun initEvent() { + wellCodeView.setOnClickListener { + "井编号不可编辑".show() + } + + wellTypeView.setOnClickListener { + wellViewModel.obtainWellType() + } + wellViewModel.wellTypeModel.observe(this, { + if (it.code == 200) { + val sheetBuilder = QMUIBottomSheet.BottomListSheetBuilder(this) + sheetBuilder.setTitle("井类型") + it.data.forEach { type -> + sheetBuilder.addItem(type.name) + } + sheetBuilder.setGravityCenter(true) + .setOnSheetItemClickListener { dialog, _, position, tag -> + this.wellType = it.data[position].value + wellTypeView.text = tag + + dialog.dismiss() + }.build().show() + } + }) + + ownerShipView.setOnClickListener { + authenticateViewModel.obtainOwnerShip("03") + } + + imageAdapter.setOnItemClickListener(object : EditableImageAdapter.OnItemClickListener { + override fun onAddImageClick() { + selectPicture() + } + + override fun onItemClick(position: Int) { + if (realPaths[position].isBlank()) { + "图片加载失败,无法查看大图".show() + } else { + navigatePageTo(position, realPaths) + } + } + + override fun onItemLongClick(view: View?, position: Int) { + imagePaths.removeAt(position) + imageAdapter.deleteImage(position) + } + }) + + authenticateViewModel.resultModel.observe(this, { + if (it.code == 200) { + val ownerShipModel: MutableList = ArrayList() + it.data?.list?.forEach { listBean -> + ownerShipModel.add(listBean) + } + val sheetBuilder = QMUIBottomSheet.BottomListSheetBuilder(this) + sheetBuilder.setTitle("权属单位") + ownerShipModel.forEach { model -> + sheetBuilder.addItem(model.name) + } + sheetBuilder.setGravityCenter(true) + .setOnSheetItemClickListener { dialog, _, position, tag -> + this.deptId = it.data?.list!![position].id + ownerShipView.text = tag + + dialog.dismiss() + }.build().show() + } + }) + + authenticateViewModel.districtModel.observe(this, { + if (it.code == 200) { + it.data.forEach { area -> + districtModels.add(area) + //判断区 + if (area.id == wellBean.qu) { + authenticateViewModel.obtainStreet(area.id) + authenticateViewModel.streetModel.observe(this, { street -> + if (street.code == 200) { + street.data.forEach { streetData -> + //判断街道 + if (streetData.id == wellBean.area) { + districtView.text = + String.format("${area.name}${streetData.name}") + } + } + } + }) + } + } + } + }) + + //点击选择井的区域 + districtView.setOnClickListener { + if (districtModels.isNullOrEmpty()) { + "无行政区域数据,无法修改".show() + return@setOnClickListener + } + BottomAreaSheet.Builder() + .setContext(this) + .setLifecycleOwner(this) + .setDistrictAreaData(districtModels) + .setChildDataViewModel(authenticateViewModel) + .setOnActionSheetListener(object : BottomAreaSheet.OnActionSheetListener { + override fun onAreaSelected( + area: String?, districtId: String, streetId: String + ) { + districtView.text = area?.replace("-", "") + this@EditWellActivity.districtId = districtId + this@EditWellActivity.streetId = streetId + } + }) + .build().show() + } + + //提交修改 + saveButton.setOnClickListener { + if (districtId.isEmpty() || streetId.isEmpty()) { + "行政区ID为空或者街道ID为空".show() + return@setOnClickListener + } + wellViewModel.updateWellDetail( + id = wellBean.id, + wellCode = wellBean.wellCode, + wellName = wellNameView.text.toString(), + wellType = wellType, + deptid = deptId, + deep = wellDepthView.text.toString(), + position = addressView.text.toString(), + coordinateX = longitudeView.text.toString(), + coordinateY = latitudeView.text.toString(), + photos = imagePaths.reformat(), + notes = "", + qu = districtId, + area = streetId, + responsibleDept = deptId, + responsibleDeptName = ownerShipView.text.toString() + ) + } + + uploadImageViewModel.resultModel.observe(this, { model -> + if (model.code == 200) { + /** + * 显示图片 + * path: 2021-07\c670eac17d644b179a4324a34bb84329.jpeg + * */ + /** + * 显示图片 + * path: 2021-07\c670eac17d644b179a4324a34bb84329.jpeg + * */ + val sumItemCount: Int = imageAdapter.itemCount + 1 //每上传一张图片,图片总数都是在原有的基础上+1 + if (sumItemCount <= 5) { + val url = model.data + //let函数处理需要针对一个可null的对象统一做判空处理。 + url?.let { + imagePaths.add(it) + realPaths.add(it.combineImagePath()) + } + imageAdapter.setupImage(realPaths) + } else { + "最多只能上传4张图片".show() + } + } + }) + uploadImageViewModel.loadState.observe(this, { + DialogHelper.dismissLoadingDialog() + }) + + wellViewModel.loadState.observe(this, { + when (it) { + is LoadState.Loading -> { + DialogHelper.showLoadingDialog(this, "保存中,请稍后...") + } + is LoadState.Success -> { + DialogHelper.dismissLoadingDialog() + finish() + } + else -> { + DialogHelper.dismissLoadingDialog() + } + } + }) + } + + private fun selectPicture() { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitles(arrayOf("拍照", "相册")) + .setOnActionSheetListener { position -> + when (position) { + 0 -> { + PictureSelector.create(this) + .openCamera(PictureMimeType.ofImage()) + .isCompress(true) + .compressSavePath(FileUtils.imageCompressPath) + .imageEngine(GlideLoadEngine.createGlideEngine()) + .forResult(PictureConfig.REQUEST_CAMERA) + } + 1 -> { + PictureSelector.create(this) + .openGallery(PictureMimeType.ofImage()) + .isWeChatStyle(true) + .isCamera(false) + .isCompress(true) + .compressSavePath(FileUtils.imageCompressPath) + .imageEngine(GlideLoadEngine.createGlideEngine()) + .maxSelectNum(4) + .forResult(PictureConfig.CHOOSE_REQUEST) + } + } + }.build().show() + } + + override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { + super.onActivityResult(requestCode, resultCode, data) + if (resultCode == Activity.RESULT_OK) { + when (requestCode) { + PictureConfig.CHOOSE_REQUEST -> { + val selectResult = PictureSelector.obtainMultipleResult(data) + DialogHelper.showLoadingDialog(this, "图片上传中,请稍后...") + for (res in selectResult) { + val file = File(res.compressPath) + //上传图片 + uploadImageViewModel.uploadFile(file) + } + } + PictureConfig.REQUEST_CAMERA -> { + val cameraResult = PictureSelector.obtainMultipleResult(data)[0] + //上传图片 + uploadImageViewModel.uploadFile(File(cameraResult.compressPath)) + } + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellDetailActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellDetailActivity.kt index 50c9e05..6c93e4e 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellDetailActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellDetailActivity.kt @@ -9,28 +9,30 @@ import com.amap.api.maps.model.CameraPosition import com.amap.api.maps.model.LatLng import com.amap.api.maps.model.MarkerOptions -import com.amap.api.services.core.LatLonPoint -import com.amap.api.services.geocoder.GeocodeResult -import com.amap.api.services.geocoder.GeocodeSearch -import com.amap.api.services.geocoder.RegeocodeQuery -import com.amap.api.services.geocoder.RegeocodeResult import com.casic.app.smartwell.sanxi.R import com.casic.app.smartwell.sanxi.base.BaseActivity import com.casic.app.smartwell.sanxi.extensions.show import com.casic.app.smartwell.sanxi.utils.Constant import com.casic.app.smartwell.sanxi.utils.DialogHelper import com.casic.app.smartwell.sanxi.utils.LoadState +import com.casic.app.smartwell.sanxi.vm.AuthenticateViewModel import com.casic.app.smartwell.sanxi.vm.WellViewModel import com.pengxh.app.multilib.widget.dialog.AlertMessageDialog import kotlinx.android.synthetic.main.activity_well_detail.* +import kotlinx.android.synthetic.main.activity_well_detail.wellCodeView +import kotlinx.android.synthetic.main.activity_well_detail.wellDepthView +import kotlinx.android.synthetic.main.activity_well_detail.wellNameView +import kotlinx.android.synthetic.main.activity_well_detail.wellStateView +import kotlinx.android.synthetic.main.activity_well_detail.wellTypeView +import kotlinx.android.synthetic.main.activity_well_list_detail.* import kotlinx.android.synthetic.main.include_base_title.* class WellDetailActivity : BaseActivity(), AMap.OnMapLoadedListener { private val kTag = "WellDetailActivity" - private val geocoderSearch by lazy { GeocodeSearch(this) } private lateinit var wellViewModel: WellViewModel + private lateinit var authenticateViewModel: AuthenticateViewModel private lateinit var wellId: String private lateinit var aMap: AMap private var latLng: LatLng? = null @@ -46,6 +48,7 @@ override fun initData() { wellId = intent.getStringExtra(Constant.INTENT_PARAM)!! wellViewModel = ViewModelProvider(this).get(WellViewModel::class.java) + authenticateViewModel = ViewModelProvider(this).get(AuthenticateViewModel::class.java) aMap = wellMapView.map aMap.mapType = AMap.MAP_TYPE_NORMAL @@ -103,39 +106,41 @@ val wellPosition = wellDetail.position.toString() wellLocationView.text = wellPosition - //根据经纬度获取省市区县 if (wellDetail.latGaode.isBlank() || wellDetail.lngGaode.isBlank()) { "井经纬度异常,无法查看完整位置信息".show() return@observe } this.latLng = LatLng(wellDetail.latGaode.toDouble(), wellDetail.lngGaode.toDouble()) - val queryParam = RegeocodeQuery( - LatLonPoint(wellDetail.latGaode.toDouble(), wellDetail.lngGaode.toDouble()), - 200f, - GeocodeSearch.AMAP - ) - tipsImageView.setOnClickListener { - geocoderSearch.getFromLocationAsyn(queryParam) + authenticateViewModel.obtainAreaByDept(wellDetail.deptid) } - - geocoderSearch.setOnGeocodeSearchListener(object : - GeocodeSearch.OnGeocodeSearchListener { - override fun onRegeocodeSearched(result: RegeocodeResult?, rCode: Int) { - if (rCode == 1000) { - AlertMessageDialog.Builder() - .setContext(this@WellDetailActivity) - .setTitle("闸井完整位置") - .setMessage(result?.regeocodeAddress?.formatAddress + "-" + wellPosition) - .setPositiveButton("知道了").setOnDialogButtonClickListener {}.build() - .show() - } else { - "获取该闸井详细位置信息失败".show() - } + authenticateViewModel.areaModel.observe(this, { areaModel -> + if (areaModel.code == 200) { + authenticateViewModel.obtainDistrict(areaModel.data.area) } - - override fun onGeocodeSearched(result: GeocodeResult?, rCode: Int) { - + }) + authenticateViewModel.districtModel.observe(this, { districtModel -> + if (districtModel.code == 200) { + districtModel.data.forEach { area -> + if (area.id == wellDetail.qu) { + authenticateViewModel.obtainStreet(area.id) + authenticateViewModel.streetModel.observe(this, { street -> + if (street.code == 200) { + street.data.forEach { streetData -> + if (streetData.id == wellDetail.area) { + AlertMessageDialog.Builder() + .setContext(this@WellDetailActivity) + .setTitle("闸井完整位置") + .setMessage(String.format("${area.name}${streetData.name}") + "-" + wellPosition) + .setPositiveButton("知道了") + .setOnDialogButtonClickListener {}.build() + .show() + } + } + } + }) + } + } } }) } diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellListDetailActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellListDetailActivity.kt index b34be03..d28b752 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellListDetailActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellListDetailActivity.kt @@ -4,11 +4,6 @@ import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.GridLayoutManager import androidx.recyclerview.widget.LinearLayoutManager -import com.amap.api.services.core.LatLonPoint -import com.amap.api.services.geocoder.GeocodeResult -import com.amap.api.services.geocoder.GeocodeSearch -import com.amap.api.services.geocoder.RegeocodeQuery -import com.amap.api.services.geocoder.RegeocodeResult import com.casic.app.smartwell.sanxi.R import com.casic.app.smartwell.sanxi.adapter.DeviceDataListAdapter import com.casic.app.smartwell.sanxi.adapter.DeviceDataTitleAdapter @@ -19,6 +14,7 @@ import com.casic.app.smartwell.sanxi.extensions.show import com.casic.app.smartwell.sanxi.model.WellListPageModel import com.casic.app.smartwell.sanxi.utils.Constant +import com.casic.app.smartwell.sanxi.vm.AuthenticateViewModel import com.casic.app.smartwell.sanxi.vm.WellViewModel import com.google.gson.Gson import com.google.gson.reflect.TypeToken @@ -28,8 +24,8 @@ class WellListDetailActivity : BaseActivity() { private val kTag = "WellListDetailActivity" - private val geocoderSearch by lazy { GeocodeSearch(this) } private lateinit var wellViewModel: WellViewModel + private lateinit var authenticateViewModel: AuthenticateViewModel private lateinit var wellBeanJson: String override fun initLayoutView(): Int = R.layout.activity_well_list_detail @@ -41,6 +37,7 @@ override fun initData() { wellViewModel = ViewModelProvider(this).get(WellViewModel::class.java) + authenticateViewModel = ViewModelProvider(this).get(AuthenticateViewModel::class.java) wellBeanJson = intent.getStringExtra(Constant.INTENT_PARAM)!! val wellBean = Gson().fromJson( wellBeanJson, object : TypeToken() {}.type @@ -89,29 +86,32 @@ }) } - //根据经纬度获取省市区县 - if (wellBean.latGaode.isBlank() || wellBean.lngGaode.isBlank()) { - "井经纬度异常,无法查看完整位置信息".show() - return - } - val queryParam = RegeocodeQuery( - LatLonPoint(wellBean.latGaode.toDouble(), wellBean.lngGaode.toDouble()), - 200f, - GeocodeSearch.AMAP - ) - geocoderSearch.getFromLocationAsyn(queryParam) - geocoderSearch.setOnGeocodeSearchListener(object : - GeocodeSearch.OnGeocodeSearchListener { - override fun onRegeocodeSearched(result: RegeocodeResult?, rCode: Int) { - if (rCode == 1000) { - districtView.text = result?.regeocodeAddress?.formatAddress - } - } - - override fun onGeocodeSearched(result: GeocodeResult?, rCode: Int) { - + authenticateViewModel.obtainAreaByDept(wellBean.deptid) + authenticateViewModel.areaModel.observe(this, { + if (it.code == 200) { + authenticateViewModel.obtainDistrict(it.data.area) } }) + authenticateViewModel.districtModel.observe(this, { + if (it.code == 200) { + it.data.forEach { area -> + if (area.id == wellBean.qu) { + authenticateViewModel.obtainStreet(area.id) + authenticateViewModel.streetModel.observe(this, { street -> + if (street.code == 200) { + street.data.forEach { streetData -> + if (streetData.id == wellBean.area) { + districtView.text = + String.format("${area.name}${streetData.name}") + } + } + } + }) + } + } + } + }) + addressView.text = wellBean.position maintenanceView.text = wellBean.responsibleDeptName diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellManageActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellManageActivity.kt index 1cd5616..8fc415b 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellManageActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellManageActivity.kt @@ -251,7 +251,7 @@ } override fun onEditClicked(position: Int) { - + navigatePageTo(dataBeans[position].toJson()) } override fun onOperationClicked(position: Int) { diff --git a/app/build.gradle b/app/build.gradle index fdf5fc7..804f233 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -102,8 +102,6 @@ implementation 'com.google.code.gson:gson:2.8.6' //上拉加载下拉刷新 implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' - //高德地图搜索 - implementation 'com.amap.api:search:8.1.0' //高德导航 implementation 'com.amap.api:navi-3dmap:8.1.0_3dmap8.1.0' //日期选择器 diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 3fcef8b..460648b 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -9,6 +9,7 @@ + @@ -51,6 +52,7 @@ android:name=".view.BigImageActivity" android:theme="@style/Theme.BigImageActivity" /> + () { + + private val countLimit = 4 + private var imageData: ArrayList = ArrayList() + + fun setupImage(images: ArrayList) { + this.imageData = images + notifyDataSetChanged() + } + + fun deleteImage(position: Int) { + if (imageData.size != 0) { + imageData.removeAt(position) + notifyDataSetChanged() + } + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { + val imageView = ImageView(context) + val screenWidth: Int = SizeUtil.getScreenWidth(context) - SizeUtil.dp2px(context, 40f) + val margins: Int = SizeUtil.dp2px(context, 3f) + val itemSize = (screenWidth - 6 * margins) / 3 + val params = LinearLayout.LayoutParams(itemSize, itemSize) + params.setMargins(margins, margins, margins, margins) + params.gravity = Gravity.CENTER + imageView.scaleType = ImageView.ScaleType.CENTER_CROP + imageView.layoutParams = params + return ItemViewHolder(imageView) + } + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + if (position == itemCount - 1 && imageData.size < countLimit) { + holder.imageView.setImageResource(R.drawable.ic_add_pic) + holder.imageView.setOnClickListener { //添加图片 + mOnItemClickListener!!.onAddImageClick() + } + } else { + Glide.with(context).load(imageData[position]).into(holder.imageView) + holder.imageView.setOnClickListener { // 点击操作,查看大图 + mOnItemClickListener!!.onItemClick(position) + } + // 长按监听 + holder.imageView.setOnLongClickListener { v -> //长按删除 + mOnItemClickListener!!.onItemLongClick(v, position) + true + } + } + } + + override fun getItemCount(): Int { + // 满3张图就不让其添加新图 + return if (imageData.size != 0 && imageData.size >= countLimit) { + countLimit + } else { + if (imageData.size == 0) 1 else imageData.size + 1 + } + } + + private var mOnItemClickListener: OnItemClickListener? = null + + fun setOnItemClickListener(onItemClickListener: OnItemClickListener?) { + mOnItemClickListener = onItemClickListener + } + + interface OnItemClickListener { + fun onAddImageClick() + fun onItemClick(position: Int) + fun onItemLongClick(view: View?, position: Int) + } + + inner class ItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val imageView: ImageView = itemView as ImageView + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt index 3a098be..ad20c8b 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt @@ -31,7 +31,10 @@ setContentView(initLayoutView()) ImmersionBar.with(this).statusBarDarkFont(false).init() //沉浸式状态栏 when (this.javaClass.simpleName) { - "WelcomeActivity" -> ImmersionBar.with(this).statusBarDarkFont(true).init() + "WelcomeActivity" -> { + ImmersionBar.with(this).statusBarDarkFont(true).init() + StatusBarColorUtil.setColor(this, R.color.white.convertColor(this)) + } "SplashScreenActivity" -> ImmersionBar.with(this).statusBarDarkFont(false).init() "LoginActivity" -> ImmersionBar.with(this).statusBarDarkFont(true).init() else -> StatusBarColorUtil.setColor(this, R.color.mainThemeColor.convertColor(this)) diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/extensions/ArrayList.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/extensions/ArrayList.kt index e77dbaa..3affed7 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/extensions/ArrayList.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/extensions/ArrayList.kt @@ -13,7 +13,7 @@ if (index == this.size - 1) { builder.append(s) } else { - builder.append(s).append(",") + builder.append(s).append(";") } } return builder.toString() diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/model/AreaModel.java b/app/src/main/java/com/casic/app/smartwell/sanxi/model/AreaModel.java new file mode 100644 index 0000000..3ee4c83 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/model/AreaModel.java @@ -0,0 +1,125 @@ +package com.casic.app.smartwell.sanxi.model; + +public class AreaModel { + + private int code; + private DataBean data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataBean getData() { + return data; + } + + public void setData(DataBean data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private String area; + private String communications; + private String deptid; + private String deviceTypes; + private String id; + private String lat; + private String lng; + private String map; + private String wellTypes; + + public String getArea() { + return area; + } + + public void setArea(String area) { + this.area = area; + } + + public String getCommunications() { + return communications; + } + + public void setCommunications(String communications) { + this.communications = communications; + } + + public String getDeptid() { + return deptid; + } + + public void setDeptid(String deptid) { + this.deptid = deptid; + } + + public String getDeviceTypes() { + return deviceTypes; + } + + public void setDeviceTypes(String deviceTypes) { + this.deviceTypes = deviceTypes; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getLat() { + return lat; + } + + public void setLat(String lat) { + this.lat = lat; + } + + public String getLng() { + return lng; + } + + public void setLng(String lng) { + this.lng = lng; + } + + public String getMap() { + return map; + } + + public void setMap(String map) { + this.map = map; + } + + public String getWellTypes() { + return wellTypes; + } + + public void setWellTypes(String wellTypes) { + this.wellTypes = wellTypes; + } + } +} diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/model/DistrictModel.java b/app/src/main/java/com/casic/app/smartwell/sanxi/model/DistrictModel.java new file mode 100644 index 0000000..02e9ef2 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/model/DistrictModel.java @@ -0,0 +1,172 @@ +package com.casic.app.smartwell.sanxi.model; + +import java.util.List; + +public class DistrictModel { + + private int code; + private List data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public List getData() { + return data; + } + + public void setData(List data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private String id; + private String isSync; + private String lat; + private int level; + private String levelName; + private String lng; + private String name; + private int num; + private String pName; + private String pid; + private String pids; + private String simplename; + private String targetIdSync; + private String targetPidSync; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getIsSync() { + return isSync; + } + + public void setIsSync(String isSync) { + this.isSync = isSync; + } + + public String getLat() { + return lat; + } + + public void setLat(String lat) { + this.lat = lat; + } + + public int getLevel() { + return level; + } + + public void setLevel(int level) { + this.level = level; + } + + public String getLevelName() { + return levelName; + } + + public void setLevelName(String levelName) { + this.levelName = levelName; + } + + public String getLng() { + return lng; + } + + public void setLng(String lng) { + this.lng = lng; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getNum() { + return num; + } + + public void setNum(int num) { + this.num = num; + } + + public String getPName() { + return pName; + } + + public void setPName(String pName) { + this.pName = pName; + } + + public String getPid() { + return pid; + } + + public void setPid(String pid) { + this.pid = pid; + } + + public String getPids() { + return pids; + } + + public void setPids(String pids) { + this.pids = pids; + } + + public String getSimplename() { + return simplename; + } + + public void setSimplename(String simplename) { + this.simplename = simplename; + } + + public String getTargetIdSync() { + return targetIdSync; + } + + public void setTargetIdSync(String targetIdSync) { + this.targetIdSync = targetIdSync; + } + + public String getTargetPidSync() { + return targetPidSync; + } + + public void setTargetPidSync(String targetPidSync) { + this.targetPidSync = targetPidSync; + } + } +} diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/model/StreetModel.java b/app/src/main/java/com/casic/app/smartwell/sanxi/model/StreetModel.java new file mode 100644 index 0000000..90cc7d5 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/model/StreetModel.java @@ -0,0 +1,172 @@ +package com.casic.app.smartwell.sanxi.model; + +import java.util.List; + +public class StreetModel { + + private int code; + private List data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public List getData() { + return data; + } + + public void setData(List data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private String id; + private String isSync; + private String lat; + private int level; + private String levelName; + private String lng; + private String name; + private int num; + private String pName; + private String pid; + private String pids; + private String simplename; + private String targetIdSync; + private String targetPidSync; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getIsSync() { + return isSync; + } + + public void setIsSync(String isSync) { + this.isSync = isSync; + } + + public String getLat() { + return lat; + } + + public void setLat(String lat) { + this.lat = lat; + } + + public int getLevel() { + return level; + } + + public void setLevel(int level) { + this.level = level; + } + + public String getLevelName() { + return levelName; + } + + public void setLevelName(String levelName) { + this.levelName = levelName; + } + + public String getLng() { + return lng; + } + + public void setLng(String lng) { + this.lng = lng; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getNum() { + return num; + } + + public void setNum(int num) { + this.num = num; + } + + public String getPName() { + return pName; + } + + public void setPName(String pName) { + this.pName = pName; + } + + public String getPid() { + return pid; + } + + public void setPid(String pid) { + this.pid = pid; + } + + public String getPids() { + return pids; + } + + public void setPids(String pids) { + this.pids = pids; + } + + public String getSimplename() { + return simplename; + } + + public void setSimplename(String simplename) { + this.simplename = simplename; + } + + public String getTargetIdSync() { + return targetIdSync; + } + + public void setTargetIdSync(String targetIdSync) { + this.targetIdSync = targetIdSync; + } + + public String getTargetPidSync() { + return targetPidSync; + } + + public void setTargetPidSync(String targetPidSync) { + this.targetPidSync = targetPidSync; + } + } +} diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/Constant.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/Constant.kt index bae51d6..3251baa 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/Constant.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/Constant.kt @@ -7,6 +7,7 @@ object Constant { val USER_PERMISSIONS = arrayOf( Manifest.permission.READ_EXTERNAL_STORAGE, + Manifest.permission.CAMERA, Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS, Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION, diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/FileUtils.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/FileUtils.kt index 3e9ae35..cef2d83 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/FileUtils.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/FileUtils.kt @@ -18,4 +18,13 @@ } return downloadDir.toString() } + + val imageCompressPath: String + get() { + val imageDir = File(context.getExternalFilesDir(Environment.DIRECTORY_PICTURES), "") + if (!imageDir.exists()) { + imageDir.mkdir() + } + return imageDir.toString() + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt index 19687d2..bd311a4 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt @@ -289,6 +289,77 @@ ): String /** + * 上传图片 + * 系统路径static拼接图片返回路径 + * http://xx.com/static/2019-10/8050891248624f2bbefedcb196ce89cb.jpeg + */ + @Multipart + @POST("/imageUpload") + suspend fun uploadFile( + @Header("token") token: String, + @Part file: MultipartBody.Part + ): String + + /** + * 根据部门获取区ID + * + * @param deptId + */ + @GET("/config/getAreaByDept") + suspend fun obtainAreaByDept( + @Header("token") token: String, + @Query("deptId") deptId: String + ): String + + /** + * 获取区/县等 + * + * @param pid + */ + @GET("/area/list") + suspend fun obtainDistrict( + @Header("token") token: String, + @Query("pid") pid: String + ): String + + /** + * 获取街道 + * + * @param pid + */ + @GET("/area/list") + suspend fun obtainStreet( + @Header("token") token: String, + @Query("pid") pid: String + ): String + + /** + * 编辑更新井信息 + * + * @param id + */ + @FormUrlEncoded + @POST("/well/update") + suspend fun updateWellDetail( + @Header("token") token: String, + @Field("id") id: String, + @Field("wellCode") wellCode: String, + @Field("wellName") wellName: String, + @Field("wellType") wellType: String, + @Field("deptid") deptid: String, + @Field("deep") deep: String, + @Field("position") position: String, + @Field("coordinateX") coordinateX: String, + @Field("coordinateY") coordinateY: String, + @Field("photos") photos: String, + @Field("notes") notes: String?, + @Field("qu") qu: String, + @Field("area") area: String, + @Field("responsibleDept") responsibleDept: String, + @Field("responsibleDeptName") responsibleDeptName: String + ): String + + /** * 获取工单详情 * * @param id 工单id @@ -312,18 +383,6 @@ ): String /** - * 上传图片 - * 系统路径static拼接图片返回路径 - * http://xx.com/static/2019-10/8050891248624f2bbefedcb196ce89cb.jpeg - */ - @Multipart - @POST("/imageUpload") - suspend fun uploadImage( - @Header("token") token: String, - @Part file: MultipartBody.Part - ): String - - /** * 查找同一单位下的用户 * * @param hasMine 是否包含本人,1包含, 0不包含 diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt index efd6b11..e35e976 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt @@ -3,6 +3,10 @@ import com.casic.app.smartwell.sanxi.model.PublicKeyModel import com.casic.app.smartwell.sanxi.utils.AuthenticationHelper import com.casic.app.smartwell.sanxi.utils.Constant +import okhttp3.MediaType.Companion.toMediaTypeOrNull +import okhttp3.MultipartBody +import okhttp3.RequestBody +import java.io.File object RetrofitServiceManager { @@ -272,6 +276,76 @@ return api.obtainOperationResult(AuthenticationHelper.token!!, wellId, bfzt) } + /** + * 上传图片 + */ + suspend fun uploadFile(image: File): String { + val requestBody = RequestBody.create("image/png".toMediaTypeOrNull(), image) + val imagePart = MultipartBody.Part.createFormData("file", image.name, requestBody) + return api.uploadFile(AuthenticationHelper.token!!, imagePart) + } + + /** + * 根据部门获取区ID + */ + suspend fun obtainAreaByDept(deptId: String): String { + return api.obtainAreaByDept(AuthenticationHelper.token!!, deptId) + } + + /** + * 获取区/县等 + */ + suspend fun obtainDistrict(pid: String): String { + return api.obtainDistrict(AuthenticationHelper.token!!, pid) + } + + /** + * 获取街道 + */ + suspend fun obtainStreet(pid: String): String { + return api.obtainStreet(AuthenticationHelper.token!!, pid) + } + + /** + * 编辑更新井信息 + */ + suspend fun updateWellDetail( + id: String, + wellCode: String, + wellName: String, + wellType: String, + deptid: String, + deep: String, + position: String, + coordinateX: String, + coordinateY: String, + photos: String, + notes: String?, + qu: String, + area: String, + responsibleDept: String, + responsibleDeptName: String + ): String { + return api.updateWellDetail( + AuthenticationHelper.token!!, + id, + wellCode, + wellName, + wellType, + deptid, + deep, + position, + coordinateX, + coordinateY, + photos, + notes, + qu, + area, + responsibleDept, + responsibleDeptName + ) + } + // /** // * 获取工单详情 // */ @@ -287,15 +361,6 @@ // } // // /** -// * 上传图片 -// */ -// suspend fun uploadImage(image: File): String { -// val requestBody = RequestBody.create("image/png".toMediaTypeOrNull(), image) -// val imagePart = MultipartBody.Part.createFormData("file", image.name, requestBody) -// return api.uploadImage(AuthenticationHelper.token!!, imagePart) -// } -// -// /** // * 查找同一单位下的用户 // */ // suspend fun obtainSubordinate(hasMine: String?, roleTips: String?): String { diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/EditWellActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/EditWellActivity.kt new file mode 100644 index 0000000..956dbce --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/EditWellActivity.kt @@ -0,0 +1,341 @@ +package com.casic.app.smartwell.sanxi.view + +import android.app.Activity +import android.content.Intent +import android.view.View +import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.GridLayoutManager +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.adapter.EditableImageAdapter +import com.casic.app.smartwell.sanxi.base.BaseActivity +import com.casic.app.smartwell.sanxi.extensions.combineImagePath +import com.casic.app.smartwell.sanxi.extensions.navigatePageTo +import com.casic.app.smartwell.sanxi.extensions.reformat +import com.casic.app.smartwell.sanxi.extensions.show +import com.casic.app.smartwell.sanxi.model.DistrictModel +import com.casic.app.smartwell.sanxi.model.OwnerShipModel +import com.casic.app.smartwell.sanxi.model.WellListPageModel +import com.casic.app.smartwell.sanxi.utils.* +import com.casic.app.smartwell.sanxi.vm.AuthenticateViewModel +import com.casic.app.smartwell.sanxi.vm.UploadFileViewModel +import com.casic.app.smartwell.sanxi.vm.WellViewModel +import com.casic.app.smartwell.sanxi.widgets.BottomAreaSheet +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken +import com.luck.picture.lib.PictureSelector +import com.luck.picture.lib.config.PictureConfig +import com.luck.picture.lib.config.PictureMimeType +import com.pengxh.app.multilib.widget.dialog.BottomActionSheet +import com.qmuiteam.qmui.widget.dialog.QMUIBottomSheet +import kotlinx.android.synthetic.main.activity_edit_well.* +import kotlinx.android.synthetic.main.include_base_title.* +import java.io.File + +class EditWellActivity : BaseActivity() { + + private val kTag = "EditWellActivity" + private lateinit var wellViewModel: WellViewModel + private lateinit var authenticateViewModel: AuthenticateViewModel + private lateinit var uploadImageViewModel: UploadFileViewModel + private lateinit var wellBeanJson: String + private lateinit var imageAdapter: EditableImageAdapter + private lateinit var wellBean: WellListPageModel.DataBean.RowsBean + private val imagePaths: ArrayList = ArrayList() //服务器返回的拍照数据集 + private val realPaths: ArrayList = ArrayList() //真实图片路径 + private val districtModels: ArrayList = ArrayList() //行政区 + private var wellType = "" + private var deptId = "" + private var districtId = "" + private var streetId = "" + + override fun initLayoutView(): Int = R.layout.activity_edit_well + + override fun setupTopBarLayout() { + leftBackView.setOnClickListener { finish() } + titleView.text = "编辑井信息" + } + + override fun initData() { + wellViewModel = ViewModelProvider(this).get(WellViewModel::class.java) + authenticateViewModel = ViewModelProvider(this).get(AuthenticateViewModel::class.java) + uploadImageViewModel = ViewModelProvider(this).get(UploadFileViewModel::class.java) + wellBeanJson = intent.getStringExtra(Constant.INTENT_PARAM)!! + wellBean = Gson().fromJson( + wellBeanJson, object : TypeToken() {}.type + ) + wellNameView.setText(wellBean.wellName) + wellCodeView.text = wellBean.wellCode + + this.wellType = wellBean.wellType + wellTypeView.text = wellBean.wellTypeName + + this.deptId = wellBean.deptid + ownerShipView.text = wellBean.deptName + wellDepthView.setText(wellBean.deep) + longitudeView.setText(wellBean.lngGaode) + latitudeView.setText(wellBean.latGaode) + + /** + * 2022-06/e805917f14ed49378bbd29cae391b061.png; + * 2022-06/48d34f27695346bbb39d695333faabee.png; + * 2022-06/6df199418fd84960a164ad9c9660e172.png; + * 2022-06/bfbab97a965d406ba30fc9d09ab35f5c.png; + * */ + //显示已有的图片 + val imageArray = wellBean.photos.toString().split(";") + imageArray.forEach { path -> + if (path.isNotBlank()) { + imagePaths.add(path) + realPaths.add(path.combineImagePath()) + } + } + imageAdapter = EditableImageAdapter(this) + imageAdapter.setupImage(realPaths) + imageRecyclerView.layoutManager = GridLayoutManager(this, 3) + imageRecyclerView.adapter = imageAdapter + + //默认加载当前井的区域 + authenticateViewModel.obtainAreaByDept(wellBean.deptid) + authenticateViewModel.areaModel.observe(this, { + if (it.code == 200) { + authenticateViewModel.obtainDistrict(it.data.area) + } + }) + addressView.setText(wellBean.position) + } + + override fun initEvent() { + wellCodeView.setOnClickListener { + "井编号不可编辑".show() + } + + wellTypeView.setOnClickListener { + wellViewModel.obtainWellType() + } + wellViewModel.wellTypeModel.observe(this, { + if (it.code == 200) { + val sheetBuilder = QMUIBottomSheet.BottomListSheetBuilder(this) + sheetBuilder.setTitle("井类型") + it.data.forEach { type -> + sheetBuilder.addItem(type.name) + } + sheetBuilder.setGravityCenter(true) + .setOnSheetItemClickListener { dialog, _, position, tag -> + this.wellType = it.data[position].value + wellTypeView.text = tag + + dialog.dismiss() + }.build().show() + } + }) + + ownerShipView.setOnClickListener { + authenticateViewModel.obtainOwnerShip("03") + } + + imageAdapter.setOnItemClickListener(object : EditableImageAdapter.OnItemClickListener { + override fun onAddImageClick() { + selectPicture() + } + + override fun onItemClick(position: Int) { + if (realPaths[position].isBlank()) { + "图片加载失败,无法查看大图".show() + } else { + navigatePageTo(position, realPaths) + } + } + + override fun onItemLongClick(view: View?, position: Int) { + imagePaths.removeAt(position) + imageAdapter.deleteImage(position) + } + }) + + authenticateViewModel.resultModel.observe(this, { + if (it.code == 200) { + val ownerShipModel: MutableList = ArrayList() + it.data?.list?.forEach { listBean -> + ownerShipModel.add(listBean) + } + val sheetBuilder = QMUIBottomSheet.BottomListSheetBuilder(this) + sheetBuilder.setTitle("权属单位") + ownerShipModel.forEach { model -> + sheetBuilder.addItem(model.name) + } + sheetBuilder.setGravityCenter(true) + .setOnSheetItemClickListener { dialog, _, position, tag -> + this.deptId = it.data?.list!![position].id + ownerShipView.text = tag + + dialog.dismiss() + }.build().show() + } + }) + + authenticateViewModel.districtModel.observe(this, { + if (it.code == 200) { + it.data.forEach { area -> + districtModels.add(area) + //判断区 + if (area.id == wellBean.qu) { + authenticateViewModel.obtainStreet(area.id) + authenticateViewModel.streetModel.observe(this, { street -> + if (street.code == 200) { + street.data.forEach { streetData -> + //判断街道 + if (streetData.id == wellBean.area) { + districtView.text = + String.format("${area.name}${streetData.name}") + } + } + } + }) + } + } + } + }) + + //点击选择井的区域 + districtView.setOnClickListener { + if (districtModels.isNullOrEmpty()) { + "无行政区域数据,无法修改".show() + return@setOnClickListener + } + BottomAreaSheet.Builder() + .setContext(this) + .setLifecycleOwner(this) + .setDistrictAreaData(districtModels) + .setChildDataViewModel(authenticateViewModel) + .setOnActionSheetListener(object : BottomAreaSheet.OnActionSheetListener { + override fun onAreaSelected( + area: String?, districtId: String, streetId: String + ) { + districtView.text = area?.replace("-", "") + this@EditWellActivity.districtId = districtId + this@EditWellActivity.streetId = streetId + } + }) + .build().show() + } + + //提交修改 + saveButton.setOnClickListener { + if (districtId.isEmpty() || streetId.isEmpty()) { + "行政区ID为空或者街道ID为空".show() + return@setOnClickListener + } + wellViewModel.updateWellDetail( + id = wellBean.id, + wellCode = wellBean.wellCode, + wellName = wellNameView.text.toString(), + wellType = wellType, + deptid = deptId, + deep = wellDepthView.text.toString(), + position = addressView.text.toString(), + coordinateX = longitudeView.text.toString(), + coordinateY = latitudeView.text.toString(), + photos = imagePaths.reformat(), + notes = "", + qu = districtId, + area = streetId, + responsibleDept = deptId, + responsibleDeptName = ownerShipView.text.toString() + ) + } + + uploadImageViewModel.resultModel.observe(this, { model -> + if (model.code == 200) { + /** + * 显示图片 + * path: 2021-07\c670eac17d644b179a4324a34bb84329.jpeg + * */ + /** + * 显示图片 + * path: 2021-07\c670eac17d644b179a4324a34bb84329.jpeg + * */ + val sumItemCount: Int = imageAdapter.itemCount + 1 //每上传一张图片,图片总数都是在原有的基础上+1 + if (sumItemCount <= 5) { + val url = model.data + //let函数处理需要针对一个可null的对象统一做判空处理。 + url?.let { + imagePaths.add(it) + realPaths.add(it.combineImagePath()) + } + imageAdapter.setupImage(realPaths) + } else { + "最多只能上传4张图片".show() + } + } + }) + uploadImageViewModel.loadState.observe(this, { + DialogHelper.dismissLoadingDialog() + }) + + wellViewModel.loadState.observe(this, { + when (it) { + is LoadState.Loading -> { + DialogHelper.showLoadingDialog(this, "保存中,请稍后...") + } + is LoadState.Success -> { + DialogHelper.dismissLoadingDialog() + finish() + } + else -> { + DialogHelper.dismissLoadingDialog() + } + } + }) + } + + private fun selectPicture() { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitles(arrayOf("拍照", "相册")) + .setOnActionSheetListener { position -> + when (position) { + 0 -> { + PictureSelector.create(this) + .openCamera(PictureMimeType.ofImage()) + .isCompress(true) + .compressSavePath(FileUtils.imageCompressPath) + .imageEngine(GlideLoadEngine.createGlideEngine()) + .forResult(PictureConfig.REQUEST_CAMERA) + } + 1 -> { + PictureSelector.create(this) + .openGallery(PictureMimeType.ofImage()) + .isWeChatStyle(true) + .isCamera(false) + .isCompress(true) + .compressSavePath(FileUtils.imageCompressPath) + .imageEngine(GlideLoadEngine.createGlideEngine()) + .maxSelectNum(4) + .forResult(PictureConfig.CHOOSE_REQUEST) + } + } + }.build().show() + } + + override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { + super.onActivityResult(requestCode, resultCode, data) + if (resultCode == Activity.RESULT_OK) { + when (requestCode) { + PictureConfig.CHOOSE_REQUEST -> { + val selectResult = PictureSelector.obtainMultipleResult(data) + DialogHelper.showLoadingDialog(this, "图片上传中,请稍后...") + for (res in selectResult) { + val file = File(res.compressPath) + //上传图片 + uploadImageViewModel.uploadFile(file) + } + } + PictureConfig.REQUEST_CAMERA -> { + val cameraResult = PictureSelector.obtainMultipleResult(data)[0] + //上传图片 + uploadImageViewModel.uploadFile(File(cameraResult.compressPath)) + } + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellDetailActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellDetailActivity.kt index 50c9e05..6c93e4e 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellDetailActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellDetailActivity.kt @@ -9,28 +9,30 @@ import com.amap.api.maps.model.CameraPosition import com.amap.api.maps.model.LatLng import com.amap.api.maps.model.MarkerOptions -import com.amap.api.services.core.LatLonPoint -import com.amap.api.services.geocoder.GeocodeResult -import com.amap.api.services.geocoder.GeocodeSearch -import com.amap.api.services.geocoder.RegeocodeQuery -import com.amap.api.services.geocoder.RegeocodeResult import com.casic.app.smartwell.sanxi.R import com.casic.app.smartwell.sanxi.base.BaseActivity import com.casic.app.smartwell.sanxi.extensions.show import com.casic.app.smartwell.sanxi.utils.Constant import com.casic.app.smartwell.sanxi.utils.DialogHelper import com.casic.app.smartwell.sanxi.utils.LoadState +import com.casic.app.smartwell.sanxi.vm.AuthenticateViewModel import com.casic.app.smartwell.sanxi.vm.WellViewModel import com.pengxh.app.multilib.widget.dialog.AlertMessageDialog import kotlinx.android.synthetic.main.activity_well_detail.* +import kotlinx.android.synthetic.main.activity_well_detail.wellCodeView +import kotlinx.android.synthetic.main.activity_well_detail.wellDepthView +import kotlinx.android.synthetic.main.activity_well_detail.wellNameView +import kotlinx.android.synthetic.main.activity_well_detail.wellStateView +import kotlinx.android.synthetic.main.activity_well_detail.wellTypeView +import kotlinx.android.synthetic.main.activity_well_list_detail.* import kotlinx.android.synthetic.main.include_base_title.* class WellDetailActivity : BaseActivity(), AMap.OnMapLoadedListener { private val kTag = "WellDetailActivity" - private val geocoderSearch by lazy { GeocodeSearch(this) } private lateinit var wellViewModel: WellViewModel + private lateinit var authenticateViewModel: AuthenticateViewModel private lateinit var wellId: String private lateinit var aMap: AMap private var latLng: LatLng? = null @@ -46,6 +48,7 @@ override fun initData() { wellId = intent.getStringExtra(Constant.INTENT_PARAM)!! wellViewModel = ViewModelProvider(this).get(WellViewModel::class.java) + authenticateViewModel = ViewModelProvider(this).get(AuthenticateViewModel::class.java) aMap = wellMapView.map aMap.mapType = AMap.MAP_TYPE_NORMAL @@ -103,39 +106,41 @@ val wellPosition = wellDetail.position.toString() wellLocationView.text = wellPosition - //根据经纬度获取省市区县 if (wellDetail.latGaode.isBlank() || wellDetail.lngGaode.isBlank()) { "井经纬度异常,无法查看完整位置信息".show() return@observe } this.latLng = LatLng(wellDetail.latGaode.toDouble(), wellDetail.lngGaode.toDouble()) - val queryParam = RegeocodeQuery( - LatLonPoint(wellDetail.latGaode.toDouble(), wellDetail.lngGaode.toDouble()), - 200f, - GeocodeSearch.AMAP - ) - tipsImageView.setOnClickListener { - geocoderSearch.getFromLocationAsyn(queryParam) + authenticateViewModel.obtainAreaByDept(wellDetail.deptid) } - - geocoderSearch.setOnGeocodeSearchListener(object : - GeocodeSearch.OnGeocodeSearchListener { - override fun onRegeocodeSearched(result: RegeocodeResult?, rCode: Int) { - if (rCode == 1000) { - AlertMessageDialog.Builder() - .setContext(this@WellDetailActivity) - .setTitle("闸井完整位置") - .setMessage(result?.regeocodeAddress?.formatAddress + "-" + wellPosition) - .setPositiveButton("知道了").setOnDialogButtonClickListener {}.build() - .show() - } else { - "获取该闸井详细位置信息失败".show() - } + authenticateViewModel.areaModel.observe(this, { areaModel -> + if (areaModel.code == 200) { + authenticateViewModel.obtainDistrict(areaModel.data.area) } - - override fun onGeocodeSearched(result: GeocodeResult?, rCode: Int) { - + }) + authenticateViewModel.districtModel.observe(this, { districtModel -> + if (districtModel.code == 200) { + districtModel.data.forEach { area -> + if (area.id == wellDetail.qu) { + authenticateViewModel.obtainStreet(area.id) + authenticateViewModel.streetModel.observe(this, { street -> + if (street.code == 200) { + street.data.forEach { streetData -> + if (streetData.id == wellDetail.area) { + AlertMessageDialog.Builder() + .setContext(this@WellDetailActivity) + .setTitle("闸井完整位置") + .setMessage(String.format("${area.name}${streetData.name}") + "-" + wellPosition) + .setPositiveButton("知道了") + .setOnDialogButtonClickListener {}.build() + .show() + } + } + } + }) + } + } } }) } diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellListDetailActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellListDetailActivity.kt index b34be03..d28b752 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellListDetailActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellListDetailActivity.kt @@ -4,11 +4,6 @@ import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.GridLayoutManager import androidx.recyclerview.widget.LinearLayoutManager -import com.amap.api.services.core.LatLonPoint -import com.amap.api.services.geocoder.GeocodeResult -import com.amap.api.services.geocoder.GeocodeSearch -import com.amap.api.services.geocoder.RegeocodeQuery -import com.amap.api.services.geocoder.RegeocodeResult import com.casic.app.smartwell.sanxi.R import com.casic.app.smartwell.sanxi.adapter.DeviceDataListAdapter import com.casic.app.smartwell.sanxi.adapter.DeviceDataTitleAdapter @@ -19,6 +14,7 @@ import com.casic.app.smartwell.sanxi.extensions.show import com.casic.app.smartwell.sanxi.model.WellListPageModel import com.casic.app.smartwell.sanxi.utils.Constant +import com.casic.app.smartwell.sanxi.vm.AuthenticateViewModel import com.casic.app.smartwell.sanxi.vm.WellViewModel import com.google.gson.Gson import com.google.gson.reflect.TypeToken @@ -28,8 +24,8 @@ class WellListDetailActivity : BaseActivity() { private val kTag = "WellListDetailActivity" - private val geocoderSearch by lazy { GeocodeSearch(this) } private lateinit var wellViewModel: WellViewModel + private lateinit var authenticateViewModel: AuthenticateViewModel private lateinit var wellBeanJson: String override fun initLayoutView(): Int = R.layout.activity_well_list_detail @@ -41,6 +37,7 @@ override fun initData() { wellViewModel = ViewModelProvider(this).get(WellViewModel::class.java) + authenticateViewModel = ViewModelProvider(this).get(AuthenticateViewModel::class.java) wellBeanJson = intent.getStringExtra(Constant.INTENT_PARAM)!! val wellBean = Gson().fromJson( wellBeanJson, object : TypeToken() {}.type @@ -89,29 +86,32 @@ }) } - //根据经纬度获取省市区县 - if (wellBean.latGaode.isBlank() || wellBean.lngGaode.isBlank()) { - "井经纬度异常,无法查看完整位置信息".show() - return - } - val queryParam = RegeocodeQuery( - LatLonPoint(wellBean.latGaode.toDouble(), wellBean.lngGaode.toDouble()), - 200f, - GeocodeSearch.AMAP - ) - geocoderSearch.getFromLocationAsyn(queryParam) - geocoderSearch.setOnGeocodeSearchListener(object : - GeocodeSearch.OnGeocodeSearchListener { - override fun onRegeocodeSearched(result: RegeocodeResult?, rCode: Int) { - if (rCode == 1000) { - districtView.text = result?.regeocodeAddress?.formatAddress - } - } - - override fun onGeocodeSearched(result: GeocodeResult?, rCode: Int) { - + authenticateViewModel.obtainAreaByDept(wellBean.deptid) + authenticateViewModel.areaModel.observe(this, { + if (it.code == 200) { + authenticateViewModel.obtainDistrict(it.data.area) } }) + authenticateViewModel.districtModel.observe(this, { + if (it.code == 200) { + it.data.forEach { area -> + if (area.id == wellBean.qu) { + authenticateViewModel.obtainStreet(area.id) + authenticateViewModel.streetModel.observe(this, { street -> + if (street.code == 200) { + street.data.forEach { streetData -> + if (streetData.id == wellBean.area) { + districtView.text = + String.format("${area.name}${streetData.name}") + } + } + } + }) + } + } + } + }) + addressView.text = wellBean.position maintenanceView.text = wellBean.responsibleDeptName diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellManageActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellManageActivity.kt index 1cd5616..8fc415b 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellManageActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellManageActivity.kt @@ -251,7 +251,7 @@ } override fun onEditClicked(position: Int) { - + navigatePageTo(dataBeans[position].toJson()) } override fun onOperationClicked(position: Int) { diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/vm/AuthenticateViewModel.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/vm/AuthenticateViewModel.kt index 5186591..4632b20 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/vm/AuthenticateViewModel.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/vm/AuthenticateViewModel.kt @@ -3,8 +3,7 @@ import androidx.lifecycle.MutableLiveData import com.casic.app.smartwell.sanxi.base.BaseViewModel import com.casic.app.smartwell.sanxi.extensions.* -import com.casic.app.smartwell.sanxi.model.OwnerShipModel -import com.casic.app.smartwell.sanxi.model.PublicKeyModel +import com.casic.app.smartwell.sanxi.model.* import com.casic.app.smartwell.sanxi.utils.Constant import com.casic.app.smartwell.sanxi.utils.LoadState import com.casic.app.smartwell.sanxi.utils.SaveKeyValues @@ -18,6 +17,9 @@ private val gson = Gson() val keyModel = MutableLiveData() val resultModel = MutableLiveData() + val areaModel = MutableLiveData() + val districtModel = MutableLiveData() + val streetModel = MutableLiveData() fun obtainPublicKey() = launch({ loadState.value = LoadState.Loading @@ -62,4 +64,55 @@ }, { it.printStackTrace() }) + + /** + * 根据部门获取区ID + */ + fun obtainAreaByDept(deptId: String) = launch({ + val response = RetrofitServiceManager.obtainAreaByDept(deptId) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + areaModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + response.toErrorMessage().show() + } + }, { + it.printStackTrace() + }) + + /** + * 区/县等 + */ + fun obtainDistrict(pid: String) = launch({ + val response = RetrofitServiceManager.obtainDistrict(pid) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + districtModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + response.toErrorMessage().show() + } + }, { + it.printStackTrace() + }) + + /** + * 街道 + */ + fun obtainStreet(areaId: String) = launch({ + val response = RetrofitServiceManager.obtainStreet(areaId) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + streetModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + response.toErrorMessage().show() + } + }, { + it.printStackTrace() + }) } \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index fdf5fc7..804f233 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -102,8 +102,6 @@ implementation 'com.google.code.gson:gson:2.8.6' //上拉加载下拉刷新 implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' - //高德地图搜索 - implementation 'com.amap.api:search:8.1.0' //高德导航 implementation 'com.amap.api:navi-3dmap:8.1.0_3dmap8.1.0' //日期选择器 diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 3fcef8b..460648b 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -9,6 +9,7 @@ + @@ -51,6 +52,7 @@ android:name=".view.BigImageActivity" android:theme="@style/Theme.BigImageActivity" /> + () { + + private val countLimit = 4 + private var imageData: ArrayList = ArrayList() + + fun setupImage(images: ArrayList) { + this.imageData = images + notifyDataSetChanged() + } + + fun deleteImage(position: Int) { + if (imageData.size != 0) { + imageData.removeAt(position) + notifyDataSetChanged() + } + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { + val imageView = ImageView(context) + val screenWidth: Int = SizeUtil.getScreenWidth(context) - SizeUtil.dp2px(context, 40f) + val margins: Int = SizeUtil.dp2px(context, 3f) + val itemSize = (screenWidth - 6 * margins) / 3 + val params = LinearLayout.LayoutParams(itemSize, itemSize) + params.setMargins(margins, margins, margins, margins) + params.gravity = Gravity.CENTER + imageView.scaleType = ImageView.ScaleType.CENTER_CROP + imageView.layoutParams = params + return ItemViewHolder(imageView) + } + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + if (position == itemCount - 1 && imageData.size < countLimit) { + holder.imageView.setImageResource(R.drawable.ic_add_pic) + holder.imageView.setOnClickListener { //添加图片 + mOnItemClickListener!!.onAddImageClick() + } + } else { + Glide.with(context).load(imageData[position]).into(holder.imageView) + holder.imageView.setOnClickListener { // 点击操作,查看大图 + mOnItemClickListener!!.onItemClick(position) + } + // 长按监听 + holder.imageView.setOnLongClickListener { v -> //长按删除 + mOnItemClickListener!!.onItemLongClick(v, position) + true + } + } + } + + override fun getItemCount(): Int { + // 满3张图就不让其添加新图 + return if (imageData.size != 0 && imageData.size >= countLimit) { + countLimit + } else { + if (imageData.size == 0) 1 else imageData.size + 1 + } + } + + private var mOnItemClickListener: OnItemClickListener? = null + + fun setOnItemClickListener(onItemClickListener: OnItemClickListener?) { + mOnItemClickListener = onItemClickListener + } + + interface OnItemClickListener { + fun onAddImageClick() + fun onItemClick(position: Int) + fun onItemLongClick(view: View?, position: Int) + } + + inner class ItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val imageView: ImageView = itemView as ImageView + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt index 3a098be..ad20c8b 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt @@ -31,7 +31,10 @@ setContentView(initLayoutView()) ImmersionBar.with(this).statusBarDarkFont(false).init() //沉浸式状态栏 when (this.javaClass.simpleName) { - "WelcomeActivity" -> ImmersionBar.with(this).statusBarDarkFont(true).init() + "WelcomeActivity" -> { + ImmersionBar.with(this).statusBarDarkFont(true).init() + StatusBarColorUtil.setColor(this, R.color.white.convertColor(this)) + } "SplashScreenActivity" -> ImmersionBar.with(this).statusBarDarkFont(false).init() "LoginActivity" -> ImmersionBar.with(this).statusBarDarkFont(true).init() else -> StatusBarColorUtil.setColor(this, R.color.mainThemeColor.convertColor(this)) diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/extensions/ArrayList.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/extensions/ArrayList.kt index e77dbaa..3affed7 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/extensions/ArrayList.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/extensions/ArrayList.kt @@ -13,7 +13,7 @@ if (index == this.size - 1) { builder.append(s) } else { - builder.append(s).append(",") + builder.append(s).append(";") } } return builder.toString() diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/model/AreaModel.java b/app/src/main/java/com/casic/app/smartwell/sanxi/model/AreaModel.java new file mode 100644 index 0000000..3ee4c83 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/model/AreaModel.java @@ -0,0 +1,125 @@ +package com.casic.app.smartwell.sanxi.model; + +public class AreaModel { + + private int code; + private DataBean data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataBean getData() { + return data; + } + + public void setData(DataBean data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private String area; + private String communications; + private String deptid; + private String deviceTypes; + private String id; + private String lat; + private String lng; + private String map; + private String wellTypes; + + public String getArea() { + return area; + } + + public void setArea(String area) { + this.area = area; + } + + public String getCommunications() { + return communications; + } + + public void setCommunications(String communications) { + this.communications = communications; + } + + public String getDeptid() { + return deptid; + } + + public void setDeptid(String deptid) { + this.deptid = deptid; + } + + public String getDeviceTypes() { + return deviceTypes; + } + + public void setDeviceTypes(String deviceTypes) { + this.deviceTypes = deviceTypes; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getLat() { + return lat; + } + + public void setLat(String lat) { + this.lat = lat; + } + + public String getLng() { + return lng; + } + + public void setLng(String lng) { + this.lng = lng; + } + + public String getMap() { + return map; + } + + public void setMap(String map) { + this.map = map; + } + + public String getWellTypes() { + return wellTypes; + } + + public void setWellTypes(String wellTypes) { + this.wellTypes = wellTypes; + } + } +} diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/model/DistrictModel.java b/app/src/main/java/com/casic/app/smartwell/sanxi/model/DistrictModel.java new file mode 100644 index 0000000..02e9ef2 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/model/DistrictModel.java @@ -0,0 +1,172 @@ +package com.casic.app.smartwell.sanxi.model; + +import java.util.List; + +public class DistrictModel { + + private int code; + private List data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public List getData() { + return data; + } + + public void setData(List data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private String id; + private String isSync; + private String lat; + private int level; + private String levelName; + private String lng; + private String name; + private int num; + private String pName; + private String pid; + private String pids; + private String simplename; + private String targetIdSync; + private String targetPidSync; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getIsSync() { + return isSync; + } + + public void setIsSync(String isSync) { + this.isSync = isSync; + } + + public String getLat() { + return lat; + } + + public void setLat(String lat) { + this.lat = lat; + } + + public int getLevel() { + return level; + } + + public void setLevel(int level) { + this.level = level; + } + + public String getLevelName() { + return levelName; + } + + public void setLevelName(String levelName) { + this.levelName = levelName; + } + + public String getLng() { + return lng; + } + + public void setLng(String lng) { + this.lng = lng; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getNum() { + return num; + } + + public void setNum(int num) { + this.num = num; + } + + public String getPName() { + return pName; + } + + public void setPName(String pName) { + this.pName = pName; + } + + public String getPid() { + return pid; + } + + public void setPid(String pid) { + this.pid = pid; + } + + public String getPids() { + return pids; + } + + public void setPids(String pids) { + this.pids = pids; + } + + public String getSimplename() { + return simplename; + } + + public void setSimplename(String simplename) { + this.simplename = simplename; + } + + public String getTargetIdSync() { + return targetIdSync; + } + + public void setTargetIdSync(String targetIdSync) { + this.targetIdSync = targetIdSync; + } + + public String getTargetPidSync() { + return targetPidSync; + } + + public void setTargetPidSync(String targetPidSync) { + this.targetPidSync = targetPidSync; + } + } +} diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/model/StreetModel.java b/app/src/main/java/com/casic/app/smartwell/sanxi/model/StreetModel.java new file mode 100644 index 0000000..90cc7d5 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/model/StreetModel.java @@ -0,0 +1,172 @@ +package com.casic.app.smartwell.sanxi.model; + +import java.util.List; + +public class StreetModel { + + private int code; + private List data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public List getData() { + return data; + } + + public void setData(List data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private String id; + private String isSync; + private String lat; + private int level; + private String levelName; + private String lng; + private String name; + private int num; + private String pName; + private String pid; + private String pids; + private String simplename; + private String targetIdSync; + private String targetPidSync; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getIsSync() { + return isSync; + } + + public void setIsSync(String isSync) { + this.isSync = isSync; + } + + public String getLat() { + return lat; + } + + public void setLat(String lat) { + this.lat = lat; + } + + public int getLevel() { + return level; + } + + public void setLevel(int level) { + this.level = level; + } + + public String getLevelName() { + return levelName; + } + + public void setLevelName(String levelName) { + this.levelName = levelName; + } + + public String getLng() { + return lng; + } + + public void setLng(String lng) { + this.lng = lng; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getNum() { + return num; + } + + public void setNum(int num) { + this.num = num; + } + + public String getPName() { + return pName; + } + + public void setPName(String pName) { + this.pName = pName; + } + + public String getPid() { + return pid; + } + + public void setPid(String pid) { + this.pid = pid; + } + + public String getPids() { + return pids; + } + + public void setPids(String pids) { + this.pids = pids; + } + + public String getSimplename() { + return simplename; + } + + public void setSimplename(String simplename) { + this.simplename = simplename; + } + + public String getTargetIdSync() { + return targetIdSync; + } + + public void setTargetIdSync(String targetIdSync) { + this.targetIdSync = targetIdSync; + } + + public String getTargetPidSync() { + return targetPidSync; + } + + public void setTargetPidSync(String targetPidSync) { + this.targetPidSync = targetPidSync; + } + } +} diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/Constant.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/Constant.kt index bae51d6..3251baa 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/Constant.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/Constant.kt @@ -7,6 +7,7 @@ object Constant { val USER_PERMISSIONS = arrayOf( Manifest.permission.READ_EXTERNAL_STORAGE, + Manifest.permission.CAMERA, Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS, Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION, diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/FileUtils.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/FileUtils.kt index 3e9ae35..cef2d83 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/FileUtils.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/FileUtils.kt @@ -18,4 +18,13 @@ } return downloadDir.toString() } + + val imageCompressPath: String + get() { + val imageDir = File(context.getExternalFilesDir(Environment.DIRECTORY_PICTURES), "") + if (!imageDir.exists()) { + imageDir.mkdir() + } + return imageDir.toString() + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt index 19687d2..bd311a4 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt @@ -289,6 +289,77 @@ ): String /** + * 上传图片 + * 系统路径static拼接图片返回路径 + * http://xx.com/static/2019-10/8050891248624f2bbefedcb196ce89cb.jpeg + */ + @Multipart + @POST("/imageUpload") + suspend fun uploadFile( + @Header("token") token: String, + @Part file: MultipartBody.Part + ): String + + /** + * 根据部门获取区ID + * + * @param deptId + */ + @GET("/config/getAreaByDept") + suspend fun obtainAreaByDept( + @Header("token") token: String, + @Query("deptId") deptId: String + ): String + + /** + * 获取区/县等 + * + * @param pid + */ + @GET("/area/list") + suspend fun obtainDistrict( + @Header("token") token: String, + @Query("pid") pid: String + ): String + + /** + * 获取街道 + * + * @param pid + */ + @GET("/area/list") + suspend fun obtainStreet( + @Header("token") token: String, + @Query("pid") pid: String + ): String + + /** + * 编辑更新井信息 + * + * @param id + */ + @FormUrlEncoded + @POST("/well/update") + suspend fun updateWellDetail( + @Header("token") token: String, + @Field("id") id: String, + @Field("wellCode") wellCode: String, + @Field("wellName") wellName: String, + @Field("wellType") wellType: String, + @Field("deptid") deptid: String, + @Field("deep") deep: String, + @Field("position") position: String, + @Field("coordinateX") coordinateX: String, + @Field("coordinateY") coordinateY: String, + @Field("photos") photos: String, + @Field("notes") notes: String?, + @Field("qu") qu: String, + @Field("area") area: String, + @Field("responsibleDept") responsibleDept: String, + @Field("responsibleDeptName") responsibleDeptName: String + ): String + + /** * 获取工单详情 * * @param id 工单id @@ -312,18 +383,6 @@ ): String /** - * 上传图片 - * 系统路径static拼接图片返回路径 - * http://xx.com/static/2019-10/8050891248624f2bbefedcb196ce89cb.jpeg - */ - @Multipart - @POST("/imageUpload") - suspend fun uploadImage( - @Header("token") token: String, - @Part file: MultipartBody.Part - ): String - - /** * 查找同一单位下的用户 * * @param hasMine 是否包含本人,1包含, 0不包含 diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt index efd6b11..e35e976 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt @@ -3,6 +3,10 @@ import com.casic.app.smartwell.sanxi.model.PublicKeyModel import com.casic.app.smartwell.sanxi.utils.AuthenticationHelper import com.casic.app.smartwell.sanxi.utils.Constant +import okhttp3.MediaType.Companion.toMediaTypeOrNull +import okhttp3.MultipartBody +import okhttp3.RequestBody +import java.io.File object RetrofitServiceManager { @@ -272,6 +276,76 @@ return api.obtainOperationResult(AuthenticationHelper.token!!, wellId, bfzt) } + /** + * 上传图片 + */ + suspend fun uploadFile(image: File): String { + val requestBody = RequestBody.create("image/png".toMediaTypeOrNull(), image) + val imagePart = MultipartBody.Part.createFormData("file", image.name, requestBody) + return api.uploadFile(AuthenticationHelper.token!!, imagePart) + } + + /** + * 根据部门获取区ID + */ + suspend fun obtainAreaByDept(deptId: String): String { + return api.obtainAreaByDept(AuthenticationHelper.token!!, deptId) + } + + /** + * 获取区/县等 + */ + suspend fun obtainDistrict(pid: String): String { + return api.obtainDistrict(AuthenticationHelper.token!!, pid) + } + + /** + * 获取街道 + */ + suspend fun obtainStreet(pid: String): String { + return api.obtainStreet(AuthenticationHelper.token!!, pid) + } + + /** + * 编辑更新井信息 + */ + suspend fun updateWellDetail( + id: String, + wellCode: String, + wellName: String, + wellType: String, + deptid: String, + deep: String, + position: String, + coordinateX: String, + coordinateY: String, + photos: String, + notes: String?, + qu: String, + area: String, + responsibleDept: String, + responsibleDeptName: String + ): String { + return api.updateWellDetail( + AuthenticationHelper.token!!, + id, + wellCode, + wellName, + wellType, + deptid, + deep, + position, + coordinateX, + coordinateY, + photos, + notes, + qu, + area, + responsibleDept, + responsibleDeptName + ) + } + // /** // * 获取工单详情 // */ @@ -287,15 +361,6 @@ // } // // /** -// * 上传图片 -// */ -// suspend fun uploadImage(image: File): String { -// val requestBody = RequestBody.create("image/png".toMediaTypeOrNull(), image) -// val imagePart = MultipartBody.Part.createFormData("file", image.name, requestBody) -// return api.uploadImage(AuthenticationHelper.token!!, imagePart) -// } -// -// /** // * 查找同一单位下的用户 // */ // suspend fun obtainSubordinate(hasMine: String?, roleTips: String?): String { diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/EditWellActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/EditWellActivity.kt new file mode 100644 index 0000000..956dbce --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/EditWellActivity.kt @@ -0,0 +1,341 @@ +package com.casic.app.smartwell.sanxi.view + +import android.app.Activity +import android.content.Intent +import android.view.View +import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.GridLayoutManager +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.adapter.EditableImageAdapter +import com.casic.app.smartwell.sanxi.base.BaseActivity +import com.casic.app.smartwell.sanxi.extensions.combineImagePath +import com.casic.app.smartwell.sanxi.extensions.navigatePageTo +import com.casic.app.smartwell.sanxi.extensions.reformat +import com.casic.app.smartwell.sanxi.extensions.show +import com.casic.app.smartwell.sanxi.model.DistrictModel +import com.casic.app.smartwell.sanxi.model.OwnerShipModel +import com.casic.app.smartwell.sanxi.model.WellListPageModel +import com.casic.app.smartwell.sanxi.utils.* +import com.casic.app.smartwell.sanxi.vm.AuthenticateViewModel +import com.casic.app.smartwell.sanxi.vm.UploadFileViewModel +import com.casic.app.smartwell.sanxi.vm.WellViewModel +import com.casic.app.smartwell.sanxi.widgets.BottomAreaSheet +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken +import com.luck.picture.lib.PictureSelector +import com.luck.picture.lib.config.PictureConfig +import com.luck.picture.lib.config.PictureMimeType +import com.pengxh.app.multilib.widget.dialog.BottomActionSheet +import com.qmuiteam.qmui.widget.dialog.QMUIBottomSheet +import kotlinx.android.synthetic.main.activity_edit_well.* +import kotlinx.android.synthetic.main.include_base_title.* +import java.io.File + +class EditWellActivity : BaseActivity() { + + private val kTag = "EditWellActivity" + private lateinit var wellViewModel: WellViewModel + private lateinit var authenticateViewModel: AuthenticateViewModel + private lateinit var uploadImageViewModel: UploadFileViewModel + private lateinit var wellBeanJson: String + private lateinit var imageAdapter: EditableImageAdapter + private lateinit var wellBean: WellListPageModel.DataBean.RowsBean + private val imagePaths: ArrayList = ArrayList() //服务器返回的拍照数据集 + private val realPaths: ArrayList = ArrayList() //真实图片路径 + private val districtModels: ArrayList = ArrayList() //行政区 + private var wellType = "" + private var deptId = "" + private var districtId = "" + private var streetId = "" + + override fun initLayoutView(): Int = R.layout.activity_edit_well + + override fun setupTopBarLayout() { + leftBackView.setOnClickListener { finish() } + titleView.text = "编辑井信息" + } + + override fun initData() { + wellViewModel = ViewModelProvider(this).get(WellViewModel::class.java) + authenticateViewModel = ViewModelProvider(this).get(AuthenticateViewModel::class.java) + uploadImageViewModel = ViewModelProvider(this).get(UploadFileViewModel::class.java) + wellBeanJson = intent.getStringExtra(Constant.INTENT_PARAM)!! + wellBean = Gson().fromJson( + wellBeanJson, object : TypeToken() {}.type + ) + wellNameView.setText(wellBean.wellName) + wellCodeView.text = wellBean.wellCode + + this.wellType = wellBean.wellType + wellTypeView.text = wellBean.wellTypeName + + this.deptId = wellBean.deptid + ownerShipView.text = wellBean.deptName + wellDepthView.setText(wellBean.deep) + longitudeView.setText(wellBean.lngGaode) + latitudeView.setText(wellBean.latGaode) + + /** + * 2022-06/e805917f14ed49378bbd29cae391b061.png; + * 2022-06/48d34f27695346bbb39d695333faabee.png; + * 2022-06/6df199418fd84960a164ad9c9660e172.png; + * 2022-06/bfbab97a965d406ba30fc9d09ab35f5c.png; + * */ + //显示已有的图片 + val imageArray = wellBean.photos.toString().split(";") + imageArray.forEach { path -> + if (path.isNotBlank()) { + imagePaths.add(path) + realPaths.add(path.combineImagePath()) + } + } + imageAdapter = EditableImageAdapter(this) + imageAdapter.setupImage(realPaths) + imageRecyclerView.layoutManager = GridLayoutManager(this, 3) + imageRecyclerView.adapter = imageAdapter + + //默认加载当前井的区域 + authenticateViewModel.obtainAreaByDept(wellBean.deptid) + authenticateViewModel.areaModel.observe(this, { + if (it.code == 200) { + authenticateViewModel.obtainDistrict(it.data.area) + } + }) + addressView.setText(wellBean.position) + } + + override fun initEvent() { + wellCodeView.setOnClickListener { + "井编号不可编辑".show() + } + + wellTypeView.setOnClickListener { + wellViewModel.obtainWellType() + } + wellViewModel.wellTypeModel.observe(this, { + if (it.code == 200) { + val sheetBuilder = QMUIBottomSheet.BottomListSheetBuilder(this) + sheetBuilder.setTitle("井类型") + it.data.forEach { type -> + sheetBuilder.addItem(type.name) + } + sheetBuilder.setGravityCenter(true) + .setOnSheetItemClickListener { dialog, _, position, tag -> + this.wellType = it.data[position].value + wellTypeView.text = tag + + dialog.dismiss() + }.build().show() + } + }) + + ownerShipView.setOnClickListener { + authenticateViewModel.obtainOwnerShip("03") + } + + imageAdapter.setOnItemClickListener(object : EditableImageAdapter.OnItemClickListener { + override fun onAddImageClick() { + selectPicture() + } + + override fun onItemClick(position: Int) { + if (realPaths[position].isBlank()) { + "图片加载失败,无法查看大图".show() + } else { + navigatePageTo(position, realPaths) + } + } + + override fun onItemLongClick(view: View?, position: Int) { + imagePaths.removeAt(position) + imageAdapter.deleteImage(position) + } + }) + + authenticateViewModel.resultModel.observe(this, { + if (it.code == 200) { + val ownerShipModel: MutableList = ArrayList() + it.data?.list?.forEach { listBean -> + ownerShipModel.add(listBean) + } + val sheetBuilder = QMUIBottomSheet.BottomListSheetBuilder(this) + sheetBuilder.setTitle("权属单位") + ownerShipModel.forEach { model -> + sheetBuilder.addItem(model.name) + } + sheetBuilder.setGravityCenter(true) + .setOnSheetItemClickListener { dialog, _, position, tag -> + this.deptId = it.data?.list!![position].id + ownerShipView.text = tag + + dialog.dismiss() + }.build().show() + } + }) + + authenticateViewModel.districtModel.observe(this, { + if (it.code == 200) { + it.data.forEach { area -> + districtModels.add(area) + //判断区 + if (area.id == wellBean.qu) { + authenticateViewModel.obtainStreet(area.id) + authenticateViewModel.streetModel.observe(this, { street -> + if (street.code == 200) { + street.data.forEach { streetData -> + //判断街道 + if (streetData.id == wellBean.area) { + districtView.text = + String.format("${area.name}${streetData.name}") + } + } + } + }) + } + } + } + }) + + //点击选择井的区域 + districtView.setOnClickListener { + if (districtModels.isNullOrEmpty()) { + "无行政区域数据,无法修改".show() + return@setOnClickListener + } + BottomAreaSheet.Builder() + .setContext(this) + .setLifecycleOwner(this) + .setDistrictAreaData(districtModels) + .setChildDataViewModel(authenticateViewModel) + .setOnActionSheetListener(object : BottomAreaSheet.OnActionSheetListener { + override fun onAreaSelected( + area: String?, districtId: String, streetId: String + ) { + districtView.text = area?.replace("-", "") + this@EditWellActivity.districtId = districtId + this@EditWellActivity.streetId = streetId + } + }) + .build().show() + } + + //提交修改 + saveButton.setOnClickListener { + if (districtId.isEmpty() || streetId.isEmpty()) { + "行政区ID为空或者街道ID为空".show() + return@setOnClickListener + } + wellViewModel.updateWellDetail( + id = wellBean.id, + wellCode = wellBean.wellCode, + wellName = wellNameView.text.toString(), + wellType = wellType, + deptid = deptId, + deep = wellDepthView.text.toString(), + position = addressView.text.toString(), + coordinateX = longitudeView.text.toString(), + coordinateY = latitudeView.text.toString(), + photos = imagePaths.reformat(), + notes = "", + qu = districtId, + area = streetId, + responsibleDept = deptId, + responsibleDeptName = ownerShipView.text.toString() + ) + } + + uploadImageViewModel.resultModel.observe(this, { model -> + if (model.code == 200) { + /** + * 显示图片 + * path: 2021-07\c670eac17d644b179a4324a34bb84329.jpeg + * */ + /** + * 显示图片 + * path: 2021-07\c670eac17d644b179a4324a34bb84329.jpeg + * */ + val sumItemCount: Int = imageAdapter.itemCount + 1 //每上传一张图片,图片总数都是在原有的基础上+1 + if (sumItemCount <= 5) { + val url = model.data + //let函数处理需要针对一个可null的对象统一做判空处理。 + url?.let { + imagePaths.add(it) + realPaths.add(it.combineImagePath()) + } + imageAdapter.setupImage(realPaths) + } else { + "最多只能上传4张图片".show() + } + } + }) + uploadImageViewModel.loadState.observe(this, { + DialogHelper.dismissLoadingDialog() + }) + + wellViewModel.loadState.observe(this, { + when (it) { + is LoadState.Loading -> { + DialogHelper.showLoadingDialog(this, "保存中,请稍后...") + } + is LoadState.Success -> { + DialogHelper.dismissLoadingDialog() + finish() + } + else -> { + DialogHelper.dismissLoadingDialog() + } + } + }) + } + + private fun selectPicture() { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitles(arrayOf("拍照", "相册")) + .setOnActionSheetListener { position -> + when (position) { + 0 -> { + PictureSelector.create(this) + .openCamera(PictureMimeType.ofImage()) + .isCompress(true) + .compressSavePath(FileUtils.imageCompressPath) + .imageEngine(GlideLoadEngine.createGlideEngine()) + .forResult(PictureConfig.REQUEST_CAMERA) + } + 1 -> { + PictureSelector.create(this) + .openGallery(PictureMimeType.ofImage()) + .isWeChatStyle(true) + .isCamera(false) + .isCompress(true) + .compressSavePath(FileUtils.imageCompressPath) + .imageEngine(GlideLoadEngine.createGlideEngine()) + .maxSelectNum(4) + .forResult(PictureConfig.CHOOSE_REQUEST) + } + } + }.build().show() + } + + override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { + super.onActivityResult(requestCode, resultCode, data) + if (resultCode == Activity.RESULT_OK) { + when (requestCode) { + PictureConfig.CHOOSE_REQUEST -> { + val selectResult = PictureSelector.obtainMultipleResult(data) + DialogHelper.showLoadingDialog(this, "图片上传中,请稍后...") + for (res in selectResult) { + val file = File(res.compressPath) + //上传图片 + uploadImageViewModel.uploadFile(file) + } + } + PictureConfig.REQUEST_CAMERA -> { + val cameraResult = PictureSelector.obtainMultipleResult(data)[0] + //上传图片 + uploadImageViewModel.uploadFile(File(cameraResult.compressPath)) + } + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellDetailActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellDetailActivity.kt index 50c9e05..6c93e4e 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellDetailActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellDetailActivity.kt @@ -9,28 +9,30 @@ import com.amap.api.maps.model.CameraPosition import com.amap.api.maps.model.LatLng import com.amap.api.maps.model.MarkerOptions -import com.amap.api.services.core.LatLonPoint -import com.amap.api.services.geocoder.GeocodeResult -import com.amap.api.services.geocoder.GeocodeSearch -import com.amap.api.services.geocoder.RegeocodeQuery -import com.amap.api.services.geocoder.RegeocodeResult import com.casic.app.smartwell.sanxi.R import com.casic.app.smartwell.sanxi.base.BaseActivity import com.casic.app.smartwell.sanxi.extensions.show import com.casic.app.smartwell.sanxi.utils.Constant import com.casic.app.smartwell.sanxi.utils.DialogHelper import com.casic.app.smartwell.sanxi.utils.LoadState +import com.casic.app.smartwell.sanxi.vm.AuthenticateViewModel import com.casic.app.smartwell.sanxi.vm.WellViewModel import com.pengxh.app.multilib.widget.dialog.AlertMessageDialog import kotlinx.android.synthetic.main.activity_well_detail.* +import kotlinx.android.synthetic.main.activity_well_detail.wellCodeView +import kotlinx.android.synthetic.main.activity_well_detail.wellDepthView +import kotlinx.android.synthetic.main.activity_well_detail.wellNameView +import kotlinx.android.synthetic.main.activity_well_detail.wellStateView +import kotlinx.android.synthetic.main.activity_well_detail.wellTypeView +import kotlinx.android.synthetic.main.activity_well_list_detail.* import kotlinx.android.synthetic.main.include_base_title.* class WellDetailActivity : BaseActivity(), AMap.OnMapLoadedListener { private val kTag = "WellDetailActivity" - private val geocoderSearch by lazy { GeocodeSearch(this) } private lateinit var wellViewModel: WellViewModel + private lateinit var authenticateViewModel: AuthenticateViewModel private lateinit var wellId: String private lateinit var aMap: AMap private var latLng: LatLng? = null @@ -46,6 +48,7 @@ override fun initData() { wellId = intent.getStringExtra(Constant.INTENT_PARAM)!! wellViewModel = ViewModelProvider(this).get(WellViewModel::class.java) + authenticateViewModel = ViewModelProvider(this).get(AuthenticateViewModel::class.java) aMap = wellMapView.map aMap.mapType = AMap.MAP_TYPE_NORMAL @@ -103,39 +106,41 @@ val wellPosition = wellDetail.position.toString() wellLocationView.text = wellPosition - //根据经纬度获取省市区县 if (wellDetail.latGaode.isBlank() || wellDetail.lngGaode.isBlank()) { "井经纬度异常,无法查看完整位置信息".show() return@observe } this.latLng = LatLng(wellDetail.latGaode.toDouble(), wellDetail.lngGaode.toDouble()) - val queryParam = RegeocodeQuery( - LatLonPoint(wellDetail.latGaode.toDouble(), wellDetail.lngGaode.toDouble()), - 200f, - GeocodeSearch.AMAP - ) - tipsImageView.setOnClickListener { - geocoderSearch.getFromLocationAsyn(queryParam) + authenticateViewModel.obtainAreaByDept(wellDetail.deptid) } - - geocoderSearch.setOnGeocodeSearchListener(object : - GeocodeSearch.OnGeocodeSearchListener { - override fun onRegeocodeSearched(result: RegeocodeResult?, rCode: Int) { - if (rCode == 1000) { - AlertMessageDialog.Builder() - .setContext(this@WellDetailActivity) - .setTitle("闸井完整位置") - .setMessage(result?.regeocodeAddress?.formatAddress + "-" + wellPosition) - .setPositiveButton("知道了").setOnDialogButtonClickListener {}.build() - .show() - } else { - "获取该闸井详细位置信息失败".show() - } + authenticateViewModel.areaModel.observe(this, { areaModel -> + if (areaModel.code == 200) { + authenticateViewModel.obtainDistrict(areaModel.data.area) } - - override fun onGeocodeSearched(result: GeocodeResult?, rCode: Int) { - + }) + authenticateViewModel.districtModel.observe(this, { districtModel -> + if (districtModel.code == 200) { + districtModel.data.forEach { area -> + if (area.id == wellDetail.qu) { + authenticateViewModel.obtainStreet(area.id) + authenticateViewModel.streetModel.observe(this, { street -> + if (street.code == 200) { + street.data.forEach { streetData -> + if (streetData.id == wellDetail.area) { + AlertMessageDialog.Builder() + .setContext(this@WellDetailActivity) + .setTitle("闸井完整位置") + .setMessage(String.format("${area.name}${streetData.name}") + "-" + wellPosition) + .setPositiveButton("知道了") + .setOnDialogButtonClickListener {}.build() + .show() + } + } + } + }) + } + } } }) } diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellListDetailActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellListDetailActivity.kt index b34be03..d28b752 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellListDetailActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellListDetailActivity.kt @@ -4,11 +4,6 @@ import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.GridLayoutManager import androidx.recyclerview.widget.LinearLayoutManager -import com.amap.api.services.core.LatLonPoint -import com.amap.api.services.geocoder.GeocodeResult -import com.amap.api.services.geocoder.GeocodeSearch -import com.amap.api.services.geocoder.RegeocodeQuery -import com.amap.api.services.geocoder.RegeocodeResult import com.casic.app.smartwell.sanxi.R import com.casic.app.smartwell.sanxi.adapter.DeviceDataListAdapter import com.casic.app.smartwell.sanxi.adapter.DeviceDataTitleAdapter @@ -19,6 +14,7 @@ import com.casic.app.smartwell.sanxi.extensions.show import com.casic.app.smartwell.sanxi.model.WellListPageModel import com.casic.app.smartwell.sanxi.utils.Constant +import com.casic.app.smartwell.sanxi.vm.AuthenticateViewModel import com.casic.app.smartwell.sanxi.vm.WellViewModel import com.google.gson.Gson import com.google.gson.reflect.TypeToken @@ -28,8 +24,8 @@ class WellListDetailActivity : BaseActivity() { private val kTag = "WellListDetailActivity" - private val geocoderSearch by lazy { GeocodeSearch(this) } private lateinit var wellViewModel: WellViewModel + private lateinit var authenticateViewModel: AuthenticateViewModel private lateinit var wellBeanJson: String override fun initLayoutView(): Int = R.layout.activity_well_list_detail @@ -41,6 +37,7 @@ override fun initData() { wellViewModel = ViewModelProvider(this).get(WellViewModel::class.java) + authenticateViewModel = ViewModelProvider(this).get(AuthenticateViewModel::class.java) wellBeanJson = intent.getStringExtra(Constant.INTENT_PARAM)!! val wellBean = Gson().fromJson( wellBeanJson, object : TypeToken() {}.type @@ -89,29 +86,32 @@ }) } - //根据经纬度获取省市区县 - if (wellBean.latGaode.isBlank() || wellBean.lngGaode.isBlank()) { - "井经纬度异常,无法查看完整位置信息".show() - return - } - val queryParam = RegeocodeQuery( - LatLonPoint(wellBean.latGaode.toDouble(), wellBean.lngGaode.toDouble()), - 200f, - GeocodeSearch.AMAP - ) - geocoderSearch.getFromLocationAsyn(queryParam) - geocoderSearch.setOnGeocodeSearchListener(object : - GeocodeSearch.OnGeocodeSearchListener { - override fun onRegeocodeSearched(result: RegeocodeResult?, rCode: Int) { - if (rCode == 1000) { - districtView.text = result?.regeocodeAddress?.formatAddress - } - } - - override fun onGeocodeSearched(result: GeocodeResult?, rCode: Int) { - + authenticateViewModel.obtainAreaByDept(wellBean.deptid) + authenticateViewModel.areaModel.observe(this, { + if (it.code == 200) { + authenticateViewModel.obtainDistrict(it.data.area) } }) + authenticateViewModel.districtModel.observe(this, { + if (it.code == 200) { + it.data.forEach { area -> + if (area.id == wellBean.qu) { + authenticateViewModel.obtainStreet(area.id) + authenticateViewModel.streetModel.observe(this, { street -> + if (street.code == 200) { + street.data.forEach { streetData -> + if (streetData.id == wellBean.area) { + districtView.text = + String.format("${area.name}${streetData.name}") + } + } + } + }) + } + } + } + }) + addressView.text = wellBean.position maintenanceView.text = wellBean.responsibleDeptName diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellManageActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellManageActivity.kt index 1cd5616..8fc415b 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellManageActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellManageActivity.kt @@ -251,7 +251,7 @@ } override fun onEditClicked(position: Int) { - + navigatePageTo(dataBeans[position].toJson()) } override fun onOperationClicked(position: Int) { diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/vm/AuthenticateViewModel.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/vm/AuthenticateViewModel.kt index 5186591..4632b20 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/vm/AuthenticateViewModel.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/vm/AuthenticateViewModel.kt @@ -3,8 +3,7 @@ import androidx.lifecycle.MutableLiveData import com.casic.app.smartwell.sanxi.base.BaseViewModel import com.casic.app.smartwell.sanxi.extensions.* -import com.casic.app.smartwell.sanxi.model.OwnerShipModel -import com.casic.app.smartwell.sanxi.model.PublicKeyModel +import com.casic.app.smartwell.sanxi.model.* import com.casic.app.smartwell.sanxi.utils.Constant import com.casic.app.smartwell.sanxi.utils.LoadState import com.casic.app.smartwell.sanxi.utils.SaveKeyValues @@ -18,6 +17,9 @@ private val gson = Gson() val keyModel = MutableLiveData() val resultModel = MutableLiveData() + val areaModel = MutableLiveData() + val districtModel = MutableLiveData() + val streetModel = MutableLiveData() fun obtainPublicKey() = launch({ loadState.value = LoadState.Loading @@ -62,4 +64,55 @@ }, { it.printStackTrace() }) + + /** + * 根据部门获取区ID + */ + fun obtainAreaByDept(deptId: String) = launch({ + val response = RetrofitServiceManager.obtainAreaByDept(deptId) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + areaModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + response.toErrorMessage().show() + } + }, { + it.printStackTrace() + }) + + /** + * 区/县等 + */ + fun obtainDistrict(pid: String) = launch({ + val response = RetrofitServiceManager.obtainDistrict(pid) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + districtModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + response.toErrorMessage().show() + } + }, { + it.printStackTrace() + }) + + /** + * 街道 + */ + fun obtainStreet(areaId: String) = launch({ + val response = RetrofitServiceManager.obtainStreet(areaId) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + streetModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + response.toErrorMessage().show() + } + }, { + it.printStackTrace() + }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/vm/UploadFileViewModel.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/vm/UploadFileViewModel.kt new file mode 100644 index 0000000..fe9d357 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/vm/UploadFileViewModel.kt @@ -0,0 +1,36 @@ +package com.casic.app.smartwell.sanxi.vm + +import androidx.lifecycle.MutableLiveData +import com.casic.app.smartwell.sanxi.base.BaseViewModel +import com.casic.app.smartwell.sanxi.extensions.launch +import com.casic.app.smartwell.sanxi.extensions.separateResponseCode +import com.casic.app.smartwell.sanxi.extensions.show +import com.casic.app.smartwell.sanxi.extensions.toErrorMessage +import com.casic.app.smartwell.sanxi.model.CommonResultModel +import com.casic.app.smartwell.sanxi.utils.LoadState +import com.casic.app.smartwell.sanxi.utils.retrofit.RetrofitServiceManager +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken +import java.io.File + +class UploadFileViewModel : BaseViewModel() { + + private val gson = Gson() + val resultModel = MutableLiveData() + + fun uploadFile(image: File) = launch({ + val response = RetrofitServiceManager.uploadFile(image) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + resultModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show() + } + }, { + loadState.value = LoadState.Fail + }) +} \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index fdf5fc7..804f233 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -102,8 +102,6 @@ implementation 'com.google.code.gson:gson:2.8.6' //上拉加载下拉刷新 implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' - //高德地图搜索 - implementation 'com.amap.api:search:8.1.0' //高德导航 implementation 'com.amap.api:navi-3dmap:8.1.0_3dmap8.1.0' //日期选择器 diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 3fcef8b..460648b 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -9,6 +9,7 @@ + @@ -51,6 +52,7 @@ android:name=".view.BigImageActivity" android:theme="@style/Theme.BigImageActivity" /> + () { + + private val countLimit = 4 + private var imageData: ArrayList = ArrayList() + + fun setupImage(images: ArrayList) { + this.imageData = images + notifyDataSetChanged() + } + + fun deleteImage(position: Int) { + if (imageData.size != 0) { + imageData.removeAt(position) + notifyDataSetChanged() + } + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { + val imageView = ImageView(context) + val screenWidth: Int = SizeUtil.getScreenWidth(context) - SizeUtil.dp2px(context, 40f) + val margins: Int = SizeUtil.dp2px(context, 3f) + val itemSize = (screenWidth - 6 * margins) / 3 + val params = LinearLayout.LayoutParams(itemSize, itemSize) + params.setMargins(margins, margins, margins, margins) + params.gravity = Gravity.CENTER + imageView.scaleType = ImageView.ScaleType.CENTER_CROP + imageView.layoutParams = params + return ItemViewHolder(imageView) + } + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + if (position == itemCount - 1 && imageData.size < countLimit) { + holder.imageView.setImageResource(R.drawable.ic_add_pic) + holder.imageView.setOnClickListener { //添加图片 + mOnItemClickListener!!.onAddImageClick() + } + } else { + Glide.with(context).load(imageData[position]).into(holder.imageView) + holder.imageView.setOnClickListener { // 点击操作,查看大图 + mOnItemClickListener!!.onItemClick(position) + } + // 长按监听 + holder.imageView.setOnLongClickListener { v -> //长按删除 + mOnItemClickListener!!.onItemLongClick(v, position) + true + } + } + } + + override fun getItemCount(): Int { + // 满3张图就不让其添加新图 + return if (imageData.size != 0 && imageData.size >= countLimit) { + countLimit + } else { + if (imageData.size == 0) 1 else imageData.size + 1 + } + } + + private var mOnItemClickListener: OnItemClickListener? = null + + fun setOnItemClickListener(onItemClickListener: OnItemClickListener?) { + mOnItemClickListener = onItemClickListener + } + + interface OnItemClickListener { + fun onAddImageClick() + fun onItemClick(position: Int) + fun onItemLongClick(view: View?, position: Int) + } + + inner class ItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val imageView: ImageView = itemView as ImageView + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt index 3a098be..ad20c8b 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt @@ -31,7 +31,10 @@ setContentView(initLayoutView()) ImmersionBar.with(this).statusBarDarkFont(false).init() //沉浸式状态栏 when (this.javaClass.simpleName) { - "WelcomeActivity" -> ImmersionBar.with(this).statusBarDarkFont(true).init() + "WelcomeActivity" -> { + ImmersionBar.with(this).statusBarDarkFont(true).init() + StatusBarColorUtil.setColor(this, R.color.white.convertColor(this)) + } "SplashScreenActivity" -> ImmersionBar.with(this).statusBarDarkFont(false).init() "LoginActivity" -> ImmersionBar.with(this).statusBarDarkFont(true).init() else -> StatusBarColorUtil.setColor(this, R.color.mainThemeColor.convertColor(this)) diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/extensions/ArrayList.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/extensions/ArrayList.kt index e77dbaa..3affed7 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/extensions/ArrayList.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/extensions/ArrayList.kt @@ -13,7 +13,7 @@ if (index == this.size - 1) { builder.append(s) } else { - builder.append(s).append(",") + builder.append(s).append(";") } } return builder.toString() diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/model/AreaModel.java b/app/src/main/java/com/casic/app/smartwell/sanxi/model/AreaModel.java new file mode 100644 index 0000000..3ee4c83 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/model/AreaModel.java @@ -0,0 +1,125 @@ +package com.casic.app.smartwell.sanxi.model; + +public class AreaModel { + + private int code; + private DataBean data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataBean getData() { + return data; + } + + public void setData(DataBean data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private String area; + private String communications; + private String deptid; + private String deviceTypes; + private String id; + private String lat; + private String lng; + private String map; + private String wellTypes; + + public String getArea() { + return area; + } + + public void setArea(String area) { + this.area = area; + } + + public String getCommunications() { + return communications; + } + + public void setCommunications(String communications) { + this.communications = communications; + } + + public String getDeptid() { + return deptid; + } + + public void setDeptid(String deptid) { + this.deptid = deptid; + } + + public String getDeviceTypes() { + return deviceTypes; + } + + public void setDeviceTypes(String deviceTypes) { + this.deviceTypes = deviceTypes; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getLat() { + return lat; + } + + public void setLat(String lat) { + this.lat = lat; + } + + public String getLng() { + return lng; + } + + public void setLng(String lng) { + this.lng = lng; + } + + public String getMap() { + return map; + } + + public void setMap(String map) { + this.map = map; + } + + public String getWellTypes() { + return wellTypes; + } + + public void setWellTypes(String wellTypes) { + this.wellTypes = wellTypes; + } + } +} diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/model/DistrictModel.java b/app/src/main/java/com/casic/app/smartwell/sanxi/model/DistrictModel.java new file mode 100644 index 0000000..02e9ef2 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/model/DistrictModel.java @@ -0,0 +1,172 @@ +package com.casic.app.smartwell.sanxi.model; + +import java.util.List; + +public class DistrictModel { + + private int code; + private List data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public List getData() { + return data; + } + + public void setData(List data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private String id; + private String isSync; + private String lat; + private int level; + private String levelName; + private String lng; + private String name; + private int num; + private String pName; + private String pid; + private String pids; + private String simplename; + private String targetIdSync; + private String targetPidSync; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getIsSync() { + return isSync; + } + + public void setIsSync(String isSync) { + this.isSync = isSync; + } + + public String getLat() { + return lat; + } + + public void setLat(String lat) { + this.lat = lat; + } + + public int getLevel() { + return level; + } + + public void setLevel(int level) { + this.level = level; + } + + public String getLevelName() { + return levelName; + } + + public void setLevelName(String levelName) { + this.levelName = levelName; + } + + public String getLng() { + return lng; + } + + public void setLng(String lng) { + this.lng = lng; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getNum() { + return num; + } + + public void setNum(int num) { + this.num = num; + } + + public String getPName() { + return pName; + } + + public void setPName(String pName) { + this.pName = pName; + } + + public String getPid() { + return pid; + } + + public void setPid(String pid) { + this.pid = pid; + } + + public String getPids() { + return pids; + } + + public void setPids(String pids) { + this.pids = pids; + } + + public String getSimplename() { + return simplename; + } + + public void setSimplename(String simplename) { + this.simplename = simplename; + } + + public String getTargetIdSync() { + return targetIdSync; + } + + public void setTargetIdSync(String targetIdSync) { + this.targetIdSync = targetIdSync; + } + + public String getTargetPidSync() { + return targetPidSync; + } + + public void setTargetPidSync(String targetPidSync) { + this.targetPidSync = targetPidSync; + } + } +} diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/model/StreetModel.java b/app/src/main/java/com/casic/app/smartwell/sanxi/model/StreetModel.java new file mode 100644 index 0000000..90cc7d5 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/model/StreetModel.java @@ -0,0 +1,172 @@ +package com.casic.app.smartwell.sanxi.model; + +import java.util.List; + +public class StreetModel { + + private int code; + private List data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public List getData() { + return data; + } + + public void setData(List data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private String id; + private String isSync; + private String lat; + private int level; + private String levelName; + private String lng; + private String name; + private int num; + private String pName; + private String pid; + private String pids; + private String simplename; + private String targetIdSync; + private String targetPidSync; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getIsSync() { + return isSync; + } + + public void setIsSync(String isSync) { + this.isSync = isSync; + } + + public String getLat() { + return lat; + } + + public void setLat(String lat) { + this.lat = lat; + } + + public int getLevel() { + return level; + } + + public void setLevel(int level) { + this.level = level; + } + + public String getLevelName() { + return levelName; + } + + public void setLevelName(String levelName) { + this.levelName = levelName; + } + + public String getLng() { + return lng; + } + + public void setLng(String lng) { + this.lng = lng; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getNum() { + return num; + } + + public void setNum(int num) { + this.num = num; + } + + public String getPName() { + return pName; + } + + public void setPName(String pName) { + this.pName = pName; + } + + public String getPid() { + return pid; + } + + public void setPid(String pid) { + this.pid = pid; + } + + public String getPids() { + return pids; + } + + public void setPids(String pids) { + this.pids = pids; + } + + public String getSimplename() { + return simplename; + } + + public void setSimplename(String simplename) { + this.simplename = simplename; + } + + public String getTargetIdSync() { + return targetIdSync; + } + + public void setTargetIdSync(String targetIdSync) { + this.targetIdSync = targetIdSync; + } + + public String getTargetPidSync() { + return targetPidSync; + } + + public void setTargetPidSync(String targetPidSync) { + this.targetPidSync = targetPidSync; + } + } +} diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/Constant.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/Constant.kt index bae51d6..3251baa 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/Constant.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/Constant.kt @@ -7,6 +7,7 @@ object Constant { val USER_PERMISSIONS = arrayOf( Manifest.permission.READ_EXTERNAL_STORAGE, + Manifest.permission.CAMERA, Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS, Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION, diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/FileUtils.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/FileUtils.kt index 3e9ae35..cef2d83 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/FileUtils.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/FileUtils.kt @@ -18,4 +18,13 @@ } return downloadDir.toString() } + + val imageCompressPath: String + get() { + val imageDir = File(context.getExternalFilesDir(Environment.DIRECTORY_PICTURES), "") + if (!imageDir.exists()) { + imageDir.mkdir() + } + return imageDir.toString() + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt index 19687d2..bd311a4 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt @@ -289,6 +289,77 @@ ): String /** + * 上传图片 + * 系统路径static拼接图片返回路径 + * http://xx.com/static/2019-10/8050891248624f2bbefedcb196ce89cb.jpeg + */ + @Multipart + @POST("/imageUpload") + suspend fun uploadFile( + @Header("token") token: String, + @Part file: MultipartBody.Part + ): String + + /** + * 根据部门获取区ID + * + * @param deptId + */ + @GET("/config/getAreaByDept") + suspend fun obtainAreaByDept( + @Header("token") token: String, + @Query("deptId") deptId: String + ): String + + /** + * 获取区/县等 + * + * @param pid + */ + @GET("/area/list") + suspend fun obtainDistrict( + @Header("token") token: String, + @Query("pid") pid: String + ): String + + /** + * 获取街道 + * + * @param pid + */ + @GET("/area/list") + suspend fun obtainStreet( + @Header("token") token: String, + @Query("pid") pid: String + ): String + + /** + * 编辑更新井信息 + * + * @param id + */ + @FormUrlEncoded + @POST("/well/update") + suspend fun updateWellDetail( + @Header("token") token: String, + @Field("id") id: String, + @Field("wellCode") wellCode: String, + @Field("wellName") wellName: String, + @Field("wellType") wellType: String, + @Field("deptid") deptid: String, + @Field("deep") deep: String, + @Field("position") position: String, + @Field("coordinateX") coordinateX: String, + @Field("coordinateY") coordinateY: String, + @Field("photos") photos: String, + @Field("notes") notes: String?, + @Field("qu") qu: String, + @Field("area") area: String, + @Field("responsibleDept") responsibleDept: String, + @Field("responsibleDeptName") responsibleDeptName: String + ): String + + /** * 获取工单详情 * * @param id 工单id @@ -312,18 +383,6 @@ ): String /** - * 上传图片 - * 系统路径static拼接图片返回路径 - * http://xx.com/static/2019-10/8050891248624f2bbefedcb196ce89cb.jpeg - */ - @Multipart - @POST("/imageUpload") - suspend fun uploadImage( - @Header("token") token: String, - @Part file: MultipartBody.Part - ): String - - /** * 查找同一单位下的用户 * * @param hasMine 是否包含本人,1包含, 0不包含 diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt index efd6b11..e35e976 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt @@ -3,6 +3,10 @@ import com.casic.app.smartwell.sanxi.model.PublicKeyModel import com.casic.app.smartwell.sanxi.utils.AuthenticationHelper import com.casic.app.smartwell.sanxi.utils.Constant +import okhttp3.MediaType.Companion.toMediaTypeOrNull +import okhttp3.MultipartBody +import okhttp3.RequestBody +import java.io.File object RetrofitServiceManager { @@ -272,6 +276,76 @@ return api.obtainOperationResult(AuthenticationHelper.token!!, wellId, bfzt) } + /** + * 上传图片 + */ + suspend fun uploadFile(image: File): String { + val requestBody = RequestBody.create("image/png".toMediaTypeOrNull(), image) + val imagePart = MultipartBody.Part.createFormData("file", image.name, requestBody) + return api.uploadFile(AuthenticationHelper.token!!, imagePart) + } + + /** + * 根据部门获取区ID + */ + suspend fun obtainAreaByDept(deptId: String): String { + return api.obtainAreaByDept(AuthenticationHelper.token!!, deptId) + } + + /** + * 获取区/县等 + */ + suspend fun obtainDistrict(pid: String): String { + return api.obtainDistrict(AuthenticationHelper.token!!, pid) + } + + /** + * 获取街道 + */ + suspend fun obtainStreet(pid: String): String { + return api.obtainStreet(AuthenticationHelper.token!!, pid) + } + + /** + * 编辑更新井信息 + */ + suspend fun updateWellDetail( + id: String, + wellCode: String, + wellName: String, + wellType: String, + deptid: String, + deep: String, + position: String, + coordinateX: String, + coordinateY: String, + photos: String, + notes: String?, + qu: String, + area: String, + responsibleDept: String, + responsibleDeptName: String + ): String { + return api.updateWellDetail( + AuthenticationHelper.token!!, + id, + wellCode, + wellName, + wellType, + deptid, + deep, + position, + coordinateX, + coordinateY, + photos, + notes, + qu, + area, + responsibleDept, + responsibleDeptName + ) + } + // /** // * 获取工单详情 // */ @@ -287,15 +361,6 @@ // } // // /** -// * 上传图片 -// */ -// suspend fun uploadImage(image: File): String { -// val requestBody = RequestBody.create("image/png".toMediaTypeOrNull(), image) -// val imagePart = MultipartBody.Part.createFormData("file", image.name, requestBody) -// return api.uploadImage(AuthenticationHelper.token!!, imagePart) -// } -// -// /** // * 查找同一单位下的用户 // */ // suspend fun obtainSubordinate(hasMine: String?, roleTips: String?): String { diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/EditWellActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/EditWellActivity.kt new file mode 100644 index 0000000..956dbce --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/EditWellActivity.kt @@ -0,0 +1,341 @@ +package com.casic.app.smartwell.sanxi.view + +import android.app.Activity +import android.content.Intent +import android.view.View +import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.GridLayoutManager +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.adapter.EditableImageAdapter +import com.casic.app.smartwell.sanxi.base.BaseActivity +import com.casic.app.smartwell.sanxi.extensions.combineImagePath +import com.casic.app.smartwell.sanxi.extensions.navigatePageTo +import com.casic.app.smartwell.sanxi.extensions.reformat +import com.casic.app.smartwell.sanxi.extensions.show +import com.casic.app.smartwell.sanxi.model.DistrictModel +import com.casic.app.smartwell.sanxi.model.OwnerShipModel +import com.casic.app.smartwell.sanxi.model.WellListPageModel +import com.casic.app.smartwell.sanxi.utils.* +import com.casic.app.smartwell.sanxi.vm.AuthenticateViewModel +import com.casic.app.smartwell.sanxi.vm.UploadFileViewModel +import com.casic.app.smartwell.sanxi.vm.WellViewModel +import com.casic.app.smartwell.sanxi.widgets.BottomAreaSheet +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken +import com.luck.picture.lib.PictureSelector +import com.luck.picture.lib.config.PictureConfig +import com.luck.picture.lib.config.PictureMimeType +import com.pengxh.app.multilib.widget.dialog.BottomActionSheet +import com.qmuiteam.qmui.widget.dialog.QMUIBottomSheet +import kotlinx.android.synthetic.main.activity_edit_well.* +import kotlinx.android.synthetic.main.include_base_title.* +import java.io.File + +class EditWellActivity : BaseActivity() { + + private val kTag = "EditWellActivity" + private lateinit var wellViewModel: WellViewModel + private lateinit var authenticateViewModel: AuthenticateViewModel + private lateinit var uploadImageViewModel: UploadFileViewModel + private lateinit var wellBeanJson: String + private lateinit var imageAdapter: EditableImageAdapter + private lateinit var wellBean: WellListPageModel.DataBean.RowsBean + private val imagePaths: ArrayList = ArrayList() //服务器返回的拍照数据集 + private val realPaths: ArrayList = ArrayList() //真实图片路径 + private val districtModels: ArrayList = ArrayList() //行政区 + private var wellType = "" + private var deptId = "" + private var districtId = "" + private var streetId = "" + + override fun initLayoutView(): Int = R.layout.activity_edit_well + + override fun setupTopBarLayout() { + leftBackView.setOnClickListener { finish() } + titleView.text = "编辑井信息" + } + + override fun initData() { + wellViewModel = ViewModelProvider(this).get(WellViewModel::class.java) + authenticateViewModel = ViewModelProvider(this).get(AuthenticateViewModel::class.java) + uploadImageViewModel = ViewModelProvider(this).get(UploadFileViewModel::class.java) + wellBeanJson = intent.getStringExtra(Constant.INTENT_PARAM)!! + wellBean = Gson().fromJson( + wellBeanJson, object : TypeToken() {}.type + ) + wellNameView.setText(wellBean.wellName) + wellCodeView.text = wellBean.wellCode + + this.wellType = wellBean.wellType + wellTypeView.text = wellBean.wellTypeName + + this.deptId = wellBean.deptid + ownerShipView.text = wellBean.deptName + wellDepthView.setText(wellBean.deep) + longitudeView.setText(wellBean.lngGaode) + latitudeView.setText(wellBean.latGaode) + + /** + * 2022-06/e805917f14ed49378bbd29cae391b061.png; + * 2022-06/48d34f27695346bbb39d695333faabee.png; + * 2022-06/6df199418fd84960a164ad9c9660e172.png; + * 2022-06/bfbab97a965d406ba30fc9d09ab35f5c.png; + * */ + //显示已有的图片 + val imageArray = wellBean.photos.toString().split(";") + imageArray.forEach { path -> + if (path.isNotBlank()) { + imagePaths.add(path) + realPaths.add(path.combineImagePath()) + } + } + imageAdapter = EditableImageAdapter(this) + imageAdapter.setupImage(realPaths) + imageRecyclerView.layoutManager = GridLayoutManager(this, 3) + imageRecyclerView.adapter = imageAdapter + + //默认加载当前井的区域 + authenticateViewModel.obtainAreaByDept(wellBean.deptid) + authenticateViewModel.areaModel.observe(this, { + if (it.code == 200) { + authenticateViewModel.obtainDistrict(it.data.area) + } + }) + addressView.setText(wellBean.position) + } + + override fun initEvent() { + wellCodeView.setOnClickListener { + "井编号不可编辑".show() + } + + wellTypeView.setOnClickListener { + wellViewModel.obtainWellType() + } + wellViewModel.wellTypeModel.observe(this, { + if (it.code == 200) { + val sheetBuilder = QMUIBottomSheet.BottomListSheetBuilder(this) + sheetBuilder.setTitle("井类型") + it.data.forEach { type -> + sheetBuilder.addItem(type.name) + } + sheetBuilder.setGravityCenter(true) + .setOnSheetItemClickListener { dialog, _, position, tag -> + this.wellType = it.data[position].value + wellTypeView.text = tag + + dialog.dismiss() + }.build().show() + } + }) + + ownerShipView.setOnClickListener { + authenticateViewModel.obtainOwnerShip("03") + } + + imageAdapter.setOnItemClickListener(object : EditableImageAdapter.OnItemClickListener { + override fun onAddImageClick() { + selectPicture() + } + + override fun onItemClick(position: Int) { + if (realPaths[position].isBlank()) { + "图片加载失败,无法查看大图".show() + } else { + navigatePageTo(position, realPaths) + } + } + + override fun onItemLongClick(view: View?, position: Int) { + imagePaths.removeAt(position) + imageAdapter.deleteImage(position) + } + }) + + authenticateViewModel.resultModel.observe(this, { + if (it.code == 200) { + val ownerShipModel: MutableList = ArrayList() + it.data?.list?.forEach { listBean -> + ownerShipModel.add(listBean) + } + val sheetBuilder = QMUIBottomSheet.BottomListSheetBuilder(this) + sheetBuilder.setTitle("权属单位") + ownerShipModel.forEach { model -> + sheetBuilder.addItem(model.name) + } + sheetBuilder.setGravityCenter(true) + .setOnSheetItemClickListener { dialog, _, position, tag -> + this.deptId = it.data?.list!![position].id + ownerShipView.text = tag + + dialog.dismiss() + }.build().show() + } + }) + + authenticateViewModel.districtModel.observe(this, { + if (it.code == 200) { + it.data.forEach { area -> + districtModels.add(area) + //判断区 + if (area.id == wellBean.qu) { + authenticateViewModel.obtainStreet(area.id) + authenticateViewModel.streetModel.observe(this, { street -> + if (street.code == 200) { + street.data.forEach { streetData -> + //判断街道 + if (streetData.id == wellBean.area) { + districtView.text = + String.format("${area.name}${streetData.name}") + } + } + } + }) + } + } + } + }) + + //点击选择井的区域 + districtView.setOnClickListener { + if (districtModels.isNullOrEmpty()) { + "无行政区域数据,无法修改".show() + return@setOnClickListener + } + BottomAreaSheet.Builder() + .setContext(this) + .setLifecycleOwner(this) + .setDistrictAreaData(districtModels) + .setChildDataViewModel(authenticateViewModel) + .setOnActionSheetListener(object : BottomAreaSheet.OnActionSheetListener { + override fun onAreaSelected( + area: String?, districtId: String, streetId: String + ) { + districtView.text = area?.replace("-", "") + this@EditWellActivity.districtId = districtId + this@EditWellActivity.streetId = streetId + } + }) + .build().show() + } + + //提交修改 + saveButton.setOnClickListener { + if (districtId.isEmpty() || streetId.isEmpty()) { + "行政区ID为空或者街道ID为空".show() + return@setOnClickListener + } + wellViewModel.updateWellDetail( + id = wellBean.id, + wellCode = wellBean.wellCode, + wellName = wellNameView.text.toString(), + wellType = wellType, + deptid = deptId, + deep = wellDepthView.text.toString(), + position = addressView.text.toString(), + coordinateX = longitudeView.text.toString(), + coordinateY = latitudeView.text.toString(), + photos = imagePaths.reformat(), + notes = "", + qu = districtId, + area = streetId, + responsibleDept = deptId, + responsibleDeptName = ownerShipView.text.toString() + ) + } + + uploadImageViewModel.resultModel.observe(this, { model -> + if (model.code == 200) { + /** + * 显示图片 + * path: 2021-07\c670eac17d644b179a4324a34bb84329.jpeg + * */ + /** + * 显示图片 + * path: 2021-07\c670eac17d644b179a4324a34bb84329.jpeg + * */ + val sumItemCount: Int = imageAdapter.itemCount + 1 //每上传一张图片,图片总数都是在原有的基础上+1 + if (sumItemCount <= 5) { + val url = model.data + //let函数处理需要针对一个可null的对象统一做判空处理。 + url?.let { + imagePaths.add(it) + realPaths.add(it.combineImagePath()) + } + imageAdapter.setupImage(realPaths) + } else { + "最多只能上传4张图片".show() + } + } + }) + uploadImageViewModel.loadState.observe(this, { + DialogHelper.dismissLoadingDialog() + }) + + wellViewModel.loadState.observe(this, { + when (it) { + is LoadState.Loading -> { + DialogHelper.showLoadingDialog(this, "保存中,请稍后...") + } + is LoadState.Success -> { + DialogHelper.dismissLoadingDialog() + finish() + } + else -> { + DialogHelper.dismissLoadingDialog() + } + } + }) + } + + private fun selectPicture() { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitles(arrayOf("拍照", "相册")) + .setOnActionSheetListener { position -> + when (position) { + 0 -> { + PictureSelector.create(this) + .openCamera(PictureMimeType.ofImage()) + .isCompress(true) + .compressSavePath(FileUtils.imageCompressPath) + .imageEngine(GlideLoadEngine.createGlideEngine()) + .forResult(PictureConfig.REQUEST_CAMERA) + } + 1 -> { + PictureSelector.create(this) + .openGallery(PictureMimeType.ofImage()) + .isWeChatStyle(true) + .isCamera(false) + .isCompress(true) + .compressSavePath(FileUtils.imageCompressPath) + .imageEngine(GlideLoadEngine.createGlideEngine()) + .maxSelectNum(4) + .forResult(PictureConfig.CHOOSE_REQUEST) + } + } + }.build().show() + } + + override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { + super.onActivityResult(requestCode, resultCode, data) + if (resultCode == Activity.RESULT_OK) { + when (requestCode) { + PictureConfig.CHOOSE_REQUEST -> { + val selectResult = PictureSelector.obtainMultipleResult(data) + DialogHelper.showLoadingDialog(this, "图片上传中,请稍后...") + for (res in selectResult) { + val file = File(res.compressPath) + //上传图片 + uploadImageViewModel.uploadFile(file) + } + } + PictureConfig.REQUEST_CAMERA -> { + val cameraResult = PictureSelector.obtainMultipleResult(data)[0] + //上传图片 + uploadImageViewModel.uploadFile(File(cameraResult.compressPath)) + } + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellDetailActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellDetailActivity.kt index 50c9e05..6c93e4e 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellDetailActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellDetailActivity.kt @@ -9,28 +9,30 @@ import com.amap.api.maps.model.CameraPosition import com.amap.api.maps.model.LatLng import com.amap.api.maps.model.MarkerOptions -import com.amap.api.services.core.LatLonPoint -import com.amap.api.services.geocoder.GeocodeResult -import com.amap.api.services.geocoder.GeocodeSearch -import com.amap.api.services.geocoder.RegeocodeQuery -import com.amap.api.services.geocoder.RegeocodeResult import com.casic.app.smartwell.sanxi.R import com.casic.app.smartwell.sanxi.base.BaseActivity import com.casic.app.smartwell.sanxi.extensions.show import com.casic.app.smartwell.sanxi.utils.Constant import com.casic.app.smartwell.sanxi.utils.DialogHelper import com.casic.app.smartwell.sanxi.utils.LoadState +import com.casic.app.smartwell.sanxi.vm.AuthenticateViewModel import com.casic.app.smartwell.sanxi.vm.WellViewModel import com.pengxh.app.multilib.widget.dialog.AlertMessageDialog import kotlinx.android.synthetic.main.activity_well_detail.* +import kotlinx.android.synthetic.main.activity_well_detail.wellCodeView +import kotlinx.android.synthetic.main.activity_well_detail.wellDepthView +import kotlinx.android.synthetic.main.activity_well_detail.wellNameView +import kotlinx.android.synthetic.main.activity_well_detail.wellStateView +import kotlinx.android.synthetic.main.activity_well_detail.wellTypeView +import kotlinx.android.synthetic.main.activity_well_list_detail.* import kotlinx.android.synthetic.main.include_base_title.* class WellDetailActivity : BaseActivity(), AMap.OnMapLoadedListener { private val kTag = "WellDetailActivity" - private val geocoderSearch by lazy { GeocodeSearch(this) } private lateinit var wellViewModel: WellViewModel + private lateinit var authenticateViewModel: AuthenticateViewModel private lateinit var wellId: String private lateinit var aMap: AMap private var latLng: LatLng? = null @@ -46,6 +48,7 @@ override fun initData() { wellId = intent.getStringExtra(Constant.INTENT_PARAM)!! wellViewModel = ViewModelProvider(this).get(WellViewModel::class.java) + authenticateViewModel = ViewModelProvider(this).get(AuthenticateViewModel::class.java) aMap = wellMapView.map aMap.mapType = AMap.MAP_TYPE_NORMAL @@ -103,39 +106,41 @@ val wellPosition = wellDetail.position.toString() wellLocationView.text = wellPosition - //根据经纬度获取省市区县 if (wellDetail.latGaode.isBlank() || wellDetail.lngGaode.isBlank()) { "井经纬度异常,无法查看完整位置信息".show() return@observe } this.latLng = LatLng(wellDetail.latGaode.toDouble(), wellDetail.lngGaode.toDouble()) - val queryParam = RegeocodeQuery( - LatLonPoint(wellDetail.latGaode.toDouble(), wellDetail.lngGaode.toDouble()), - 200f, - GeocodeSearch.AMAP - ) - tipsImageView.setOnClickListener { - geocoderSearch.getFromLocationAsyn(queryParam) + authenticateViewModel.obtainAreaByDept(wellDetail.deptid) } - - geocoderSearch.setOnGeocodeSearchListener(object : - GeocodeSearch.OnGeocodeSearchListener { - override fun onRegeocodeSearched(result: RegeocodeResult?, rCode: Int) { - if (rCode == 1000) { - AlertMessageDialog.Builder() - .setContext(this@WellDetailActivity) - .setTitle("闸井完整位置") - .setMessage(result?.regeocodeAddress?.formatAddress + "-" + wellPosition) - .setPositiveButton("知道了").setOnDialogButtonClickListener {}.build() - .show() - } else { - "获取该闸井详细位置信息失败".show() - } + authenticateViewModel.areaModel.observe(this, { areaModel -> + if (areaModel.code == 200) { + authenticateViewModel.obtainDistrict(areaModel.data.area) } - - override fun onGeocodeSearched(result: GeocodeResult?, rCode: Int) { - + }) + authenticateViewModel.districtModel.observe(this, { districtModel -> + if (districtModel.code == 200) { + districtModel.data.forEach { area -> + if (area.id == wellDetail.qu) { + authenticateViewModel.obtainStreet(area.id) + authenticateViewModel.streetModel.observe(this, { street -> + if (street.code == 200) { + street.data.forEach { streetData -> + if (streetData.id == wellDetail.area) { + AlertMessageDialog.Builder() + .setContext(this@WellDetailActivity) + .setTitle("闸井完整位置") + .setMessage(String.format("${area.name}${streetData.name}") + "-" + wellPosition) + .setPositiveButton("知道了") + .setOnDialogButtonClickListener {}.build() + .show() + } + } + } + }) + } + } } }) } diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellListDetailActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellListDetailActivity.kt index b34be03..d28b752 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellListDetailActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellListDetailActivity.kt @@ -4,11 +4,6 @@ import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.GridLayoutManager import androidx.recyclerview.widget.LinearLayoutManager -import com.amap.api.services.core.LatLonPoint -import com.amap.api.services.geocoder.GeocodeResult -import com.amap.api.services.geocoder.GeocodeSearch -import com.amap.api.services.geocoder.RegeocodeQuery -import com.amap.api.services.geocoder.RegeocodeResult import com.casic.app.smartwell.sanxi.R import com.casic.app.smartwell.sanxi.adapter.DeviceDataListAdapter import com.casic.app.smartwell.sanxi.adapter.DeviceDataTitleAdapter @@ -19,6 +14,7 @@ import com.casic.app.smartwell.sanxi.extensions.show import com.casic.app.smartwell.sanxi.model.WellListPageModel import com.casic.app.smartwell.sanxi.utils.Constant +import com.casic.app.smartwell.sanxi.vm.AuthenticateViewModel import com.casic.app.smartwell.sanxi.vm.WellViewModel import com.google.gson.Gson import com.google.gson.reflect.TypeToken @@ -28,8 +24,8 @@ class WellListDetailActivity : BaseActivity() { private val kTag = "WellListDetailActivity" - private val geocoderSearch by lazy { GeocodeSearch(this) } private lateinit var wellViewModel: WellViewModel + private lateinit var authenticateViewModel: AuthenticateViewModel private lateinit var wellBeanJson: String override fun initLayoutView(): Int = R.layout.activity_well_list_detail @@ -41,6 +37,7 @@ override fun initData() { wellViewModel = ViewModelProvider(this).get(WellViewModel::class.java) + authenticateViewModel = ViewModelProvider(this).get(AuthenticateViewModel::class.java) wellBeanJson = intent.getStringExtra(Constant.INTENT_PARAM)!! val wellBean = Gson().fromJson( wellBeanJson, object : TypeToken() {}.type @@ -89,29 +86,32 @@ }) } - //根据经纬度获取省市区县 - if (wellBean.latGaode.isBlank() || wellBean.lngGaode.isBlank()) { - "井经纬度异常,无法查看完整位置信息".show() - return - } - val queryParam = RegeocodeQuery( - LatLonPoint(wellBean.latGaode.toDouble(), wellBean.lngGaode.toDouble()), - 200f, - GeocodeSearch.AMAP - ) - geocoderSearch.getFromLocationAsyn(queryParam) - geocoderSearch.setOnGeocodeSearchListener(object : - GeocodeSearch.OnGeocodeSearchListener { - override fun onRegeocodeSearched(result: RegeocodeResult?, rCode: Int) { - if (rCode == 1000) { - districtView.text = result?.regeocodeAddress?.formatAddress - } - } - - override fun onGeocodeSearched(result: GeocodeResult?, rCode: Int) { - + authenticateViewModel.obtainAreaByDept(wellBean.deptid) + authenticateViewModel.areaModel.observe(this, { + if (it.code == 200) { + authenticateViewModel.obtainDistrict(it.data.area) } }) + authenticateViewModel.districtModel.observe(this, { + if (it.code == 200) { + it.data.forEach { area -> + if (area.id == wellBean.qu) { + authenticateViewModel.obtainStreet(area.id) + authenticateViewModel.streetModel.observe(this, { street -> + if (street.code == 200) { + street.data.forEach { streetData -> + if (streetData.id == wellBean.area) { + districtView.text = + String.format("${area.name}${streetData.name}") + } + } + } + }) + } + } + } + }) + addressView.text = wellBean.position maintenanceView.text = wellBean.responsibleDeptName diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellManageActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellManageActivity.kt index 1cd5616..8fc415b 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellManageActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellManageActivity.kt @@ -251,7 +251,7 @@ } override fun onEditClicked(position: Int) { - + navigatePageTo(dataBeans[position].toJson()) } override fun onOperationClicked(position: Int) { diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/vm/AuthenticateViewModel.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/vm/AuthenticateViewModel.kt index 5186591..4632b20 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/vm/AuthenticateViewModel.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/vm/AuthenticateViewModel.kt @@ -3,8 +3,7 @@ import androidx.lifecycle.MutableLiveData import com.casic.app.smartwell.sanxi.base.BaseViewModel import com.casic.app.smartwell.sanxi.extensions.* -import com.casic.app.smartwell.sanxi.model.OwnerShipModel -import com.casic.app.smartwell.sanxi.model.PublicKeyModel +import com.casic.app.smartwell.sanxi.model.* import com.casic.app.smartwell.sanxi.utils.Constant import com.casic.app.smartwell.sanxi.utils.LoadState import com.casic.app.smartwell.sanxi.utils.SaveKeyValues @@ -18,6 +17,9 @@ private val gson = Gson() val keyModel = MutableLiveData() val resultModel = MutableLiveData() + val areaModel = MutableLiveData() + val districtModel = MutableLiveData() + val streetModel = MutableLiveData() fun obtainPublicKey() = launch({ loadState.value = LoadState.Loading @@ -62,4 +64,55 @@ }, { it.printStackTrace() }) + + /** + * 根据部门获取区ID + */ + fun obtainAreaByDept(deptId: String) = launch({ + val response = RetrofitServiceManager.obtainAreaByDept(deptId) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + areaModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + response.toErrorMessage().show() + } + }, { + it.printStackTrace() + }) + + /** + * 区/县等 + */ + fun obtainDistrict(pid: String) = launch({ + val response = RetrofitServiceManager.obtainDistrict(pid) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + districtModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + response.toErrorMessage().show() + } + }, { + it.printStackTrace() + }) + + /** + * 街道 + */ + fun obtainStreet(areaId: String) = launch({ + val response = RetrofitServiceManager.obtainStreet(areaId) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + streetModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + response.toErrorMessage().show() + } + }, { + it.printStackTrace() + }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/vm/UploadFileViewModel.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/vm/UploadFileViewModel.kt new file mode 100644 index 0000000..fe9d357 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/vm/UploadFileViewModel.kt @@ -0,0 +1,36 @@ +package com.casic.app.smartwell.sanxi.vm + +import androidx.lifecycle.MutableLiveData +import com.casic.app.smartwell.sanxi.base.BaseViewModel +import com.casic.app.smartwell.sanxi.extensions.launch +import com.casic.app.smartwell.sanxi.extensions.separateResponseCode +import com.casic.app.smartwell.sanxi.extensions.show +import com.casic.app.smartwell.sanxi.extensions.toErrorMessage +import com.casic.app.smartwell.sanxi.model.CommonResultModel +import com.casic.app.smartwell.sanxi.utils.LoadState +import com.casic.app.smartwell.sanxi.utils.retrofit.RetrofitServiceManager +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken +import java.io.File + +class UploadFileViewModel : BaseViewModel() { + + private val gson = Gson() + val resultModel = MutableLiveData() + + fun uploadFile(image: File) = launch({ + val response = RetrofitServiceManager.uploadFile(image) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + resultModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show() + } + }, { + loadState.value = LoadState.Fail + }) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/vm/WellViewModel.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/vm/WellViewModel.kt index 696dbf0..8e59b91 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/vm/WellViewModel.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/vm/WellViewModel.kt @@ -1,5 +1,6 @@ package com.casic.app.smartwell.sanxi.vm +import android.util.Log import androidx.lifecycle.MutableLiveData import com.casic.app.smartwell.sanxi.base.BaseViewModel import com.casic.app.smartwell.sanxi.extensions.launch @@ -15,6 +16,7 @@ class WellViewModel : BaseViewModel() { + private val kTag = "WellViewModel" private val gson = Gson() val detailModel = MutableLiveData() val allWellModel = MutableLiveData() @@ -152,4 +154,58 @@ loadState.value = LoadState.Fail it.printStackTrace() }) + + /** + * 编辑更新井信息 + * */ + fun updateWellDetail( + id: String, + wellCode: String, + wellName: String, + wellType: String, + deptid: String, + deep: String, + position: String, + coordinateX: String, + coordinateY: String, + photos: String, + notes: String?, + qu: String, + area: String, + responsibleDept: String, + responsibleDeptName: String + ) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.updateWellDetail( + id, + wellCode, + wellName, + wellType, + deptid, + deep, + position, + coordinateX, + coordinateY, + photos, + notes, + qu, + area, + responsibleDept, + responsibleDeptName + ) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + "更新成功".show() + commonResultModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show() + } + }, { + loadState.value = LoadState.Fail + it.printStackTrace() + }) } \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index fdf5fc7..804f233 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -102,8 +102,6 @@ implementation 'com.google.code.gson:gson:2.8.6' //上拉加载下拉刷新 implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' - //高德地图搜索 - implementation 'com.amap.api:search:8.1.0' //高德导航 implementation 'com.amap.api:navi-3dmap:8.1.0_3dmap8.1.0' //日期选择器 diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 3fcef8b..460648b 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -9,6 +9,7 @@ + @@ -51,6 +52,7 @@ android:name=".view.BigImageActivity" android:theme="@style/Theme.BigImageActivity" /> + () { + + private val countLimit = 4 + private var imageData: ArrayList = ArrayList() + + fun setupImage(images: ArrayList) { + this.imageData = images + notifyDataSetChanged() + } + + fun deleteImage(position: Int) { + if (imageData.size != 0) { + imageData.removeAt(position) + notifyDataSetChanged() + } + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { + val imageView = ImageView(context) + val screenWidth: Int = SizeUtil.getScreenWidth(context) - SizeUtil.dp2px(context, 40f) + val margins: Int = SizeUtil.dp2px(context, 3f) + val itemSize = (screenWidth - 6 * margins) / 3 + val params = LinearLayout.LayoutParams(itemSize, itemSize) + params.setMargins(margins, margins, margins, margins) + params.gravity = Gravity.CENTER + imageView.scaleType = ImageView.ScaleType.CENTER_CROP + imageView.layoutParams = params + return ItemViewHolder(imageView) + } + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + if (position == itemCount - 1 && imageData.size < countLimit) { + holder.imageView.setImageResource(R.drawable.ic_add_pic) + holder.imageView.setOnClickListener { //添加图片 + mOnItemClickListener!!.onAddImageClick() + } + } else { + Glide.with(context).load(imageData[position]).into(holder.imageView) + holder.imageView.setOnClickListener { // 点击操作,查看大图 + mOnItemClickListener!!.onItemClick(position) + } + // 长按监听 + holder.imageView.setOnLongClickListener { v -> //长按删除 + mOnItemClickListener!!.onItemLongClick(v, position) + true + } + } + } + + override fun getItemCount(): Int { + // 满3张图就不让其添加新图 + return if (imageData.size != 0 && imageData.size >= countLimit) { + countLimit + } else { + if (imageData.size == 0) 1 else imageData.size + 1 + } + } + + private var mOnItemClickListener: OnItemClickListener? = null + + fun setOnItemClickListener(onItemClickListener: OnItemClickListener?) { + mOnItemClickListener = onItemClickListener + } + + interface OnItemClickListener { + fun onAddImageClick() + fun onItemClick(position: Int) + fun onItemLongClick(view: View?, position: Int) + } + + inner class ItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val imageView: ImageView = itemView as ImageView + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt index 3a098be..ad20c8b 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt @@ -31,7 +31,10 @@ setContentView(initLayoutView()) ImmersionBar.with(this).statusBarDarkFont(false).init() //沉浸式状态栏 when (this.javaClass.simpleName) { - "WelcomeActivity" -> ImmersionBar.with(this).statusBarDarkFont(true).init() + "WelcomeActivity" -> { + ImmersionBar.with(this).statusBarDarkFont(true).init() + StatusBarColorUtil.setColor(this, R.color.white.convertColor(this)) + } "SplashScreenActivity" -> ImmersionBar.with(this).statusBarDarkFont(false).init() "LoginActivity" -> ImmersionBar.with(this).statusBarDarkFont(true).init() else -> StatusBarColorUtil.setColor(this, R.color.mainThemeColor.convertColor(this)) diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/extensions/ArrayList.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/extensions/ArrayList.kt index e77dbaa..3affed7 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/extensions/ArrayList.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/extensions/ArrayList.kt @@ -13,7 +13,7 @@ if (index == this.size - 1) { builder.append(s) } else { - builder.append(s).append(",") + builder.append(s).append(";") } } return builder.toString() diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/model/AreaModel.java b/app/src/main/java/com/casic/app/smartwell/sanxi/model/AreaModel.java new file mode 100644 index 0000000..3ee4c83 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/model/AreaModel.java @@ -0,0 +1,125 @@ +package com.casic.app.smartwell.sanxi.model; + +public class AreaModel { + + private int code; + private DataBean data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataBean getData() { + return data; + } + + public void setData(DataBean data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private String area; + private String communications; + private String deptid; + private String deviceTypes; + private String id; + private String lat; + private String lng; + private String map; + private String wellTypes; + + public String getArea() { + return area; + } + + public void setArea(String area) { + this.area = area; + } + + public String getCommunications() { + return communications; + } + + public void setCommunications(String communications) { + this.communications = communications; + } + + public String getDeptid() { + return deptid; + } + + public void setDeptid(String deptid) { + this.deptid = deptid; + } + + public String getDeviceTypes() { + return deviceTypes; + } + + public void setDeviceTypes(String deviceTypes) { + this.deviceTypes = deviceTypes; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getLat() { + return lat; + } + + public void setLat(String lat) { + this.lat = lat; + } + + public String getLng() { + return lng; + } + + public void setLng(String lng) { + this.lng = lng; + } + + public String getMap() { + return map; + } + + public void setMap(String map) { + this.map = map; + } + + public String getWellTypes() { + return wellTypes; + } + + public void setWellTypes(String wellTypes) { + this.wellTypes = wellTypes; + } + } +} diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/model/DistrictModel.java b/app/src/main/java/com/casic/app/smartwell/sanxi/model/DistrictModel.java new file mode 100644 index 0000000..02e9ef2 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/model/DistrictModel.java @@ -0,0 +1,172 @@ +package com.casic.app.smartwell.sanxi.model; + +import java.util.List; + +public class DistrictModel { + + private int code; + private List data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public List getData() { + return data; + } + + public void setData(List data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private String id; + private String isSync; + private String lat; + private int level; + private String levelName; + private String lng; + private String name; + private int num; + private String pName; + private String pid; + private String pids; + private String simplename; + private String targetIdSync; + private String targetPidSync; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getIsSync() { + return isSync; + } + + public void setIsSync(String isSync) { + this.isSync = isSync; + } + + public String getLat() { + return lat; + } + + public void setLat(String lat) { + this.lat = lat; + } + + public int getLevel() { + return level; + } + + public void setLevel(int level) { + this.level = level; + } + + public String getLevelName() { + return levelName; + } + + public void setLevelName(String levelName) { + this.levelName = levelName; + } + + public String getLng() { + return lng; + } + + public void setLng(String lng) { + this.lng = lng; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getNum() { + return num; + } + + public void setNum(int num) { + this.num = num; + } + + public String getPName() { + return pName; + } + + public void setPName(String pName) { + this.pName = pName; + } + + public String getPid() { + return pid; + } + + public void setPid(String pid) { + this.pid = pid; + } + + public String getPids() { + return pids; + } + + public void setPids(String pids) { + this.pids = pids; + } + + public String getSimplename() { + return simplename; + } + + public void setSimplename(String simplename) { + this.simplename = simplename; + } + + public String getTargetIdSync() { + return targetIdSync; + } + + public void setTargetIdSync(String targetIdSync) { + this.targetIdSync = targetIdSync; + } + + public String getTargetPidSync() { + return targetPidSync; + } + + public void setTargetPidSync(String targetPidSync) { + this.targetPidSync = targetPidSync; + } + } +} diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/model/StreetModel.java b/app/src/main/java/com/casic/app/smartwell/sanxi/model/StreetModel.java new file mode 100644 index 0000000..90cc7d5 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/model/StreetModel.java @@ -0,0 +1,172 @@ +package com.casic.app.smartwell.sanxi.model; + +import java.util.List; + +public class StreetModel { + + private int code; + private List data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public List getData() { + return data; + } + + public void setData(List data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private String id; + private String isSync; + private String lat; + private int level; + private String levelName; + private String lng; + private String name; + private int num; + private String pName; + private String pid; + private String pids; + private String simplename; + private String targetIdSync; + private String targetPidSync; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getIsSync() { + return isSync; + } + + public void setIsSync(String isSync) { + this.isSync = isSync; + } + + public String getLat() { + return lat; + } + + public void setLat(String lat) { + this.lat = lat; + } + + public int getLevel() { + return level; + } + + public void setLevel(int level) { + this.level = level; + } + + public String getLevelName() { + return levelName; + } + + public void setLevelName(String levelName) { + this.levelName = levelName; + } + + public String getLng() { + return lng; + } + + public void setLng(String lng) { + this.lng = lng; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getNum() { + return num; + } + + public void setNum(int num) { + this.num = num; + } + + public String getPName() { + return pName; + } + + public void setPName(String pName) { + this.pName = pName; + } + + public String getPid() { + return pid; + } + + public void setPid(String pid) { + this.pid = pid; + } + + public String getPids() { + return pids; + } + + public void setPids(String pids) { + this.pids = pids; + } + + public String getSimplename() { + return simplename; + } + + public void setSimplename(String simplename) { + this.simplename = simplename; + } + + public String getTargetIdSync() { + return targetIdSync; + } + + public void setTargetIdSync(String targetIdSync) { + this.targetIdSync = targetIdSync; + } + + public String getTargetPidSync() { + return targetPidSync; + } + + public void setTargetPidSync(String targetPidSync) { + this.targetPidSync = targetPidSync; + } + } +} diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/Constant.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/Constant.kt index bae51d6..3251baa 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/Constant.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/Constant.kt @@ -7,6 +7,7 @@ object Constant { val USER_PERMISSIONS = arrayOf( Manifest.permission.READ_EXTERNAL_STORAGE, + Manifest.permission.CAMERA, Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS, Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION, diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/FileUtils.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/FileUtils.kt index 3e9ae35..cef2d83 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/FileUtils.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/FileUtils.kt @@ -18,4 +18,13 @@ } return downloadDir.toString() } + + val imageCompressPath: String + get() { + val imageDir = File(context.getExternalFilesDir(Environment.DIRECTORY_PICTURES), "") + if (!imageDir.exists()) { + imageDir.mkdir() + } + return imageDir.toString() + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt index 19687d2..bd311a4 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt @@ -289,6 +289,77 @@ ): String /** + * 上传图片 + * 系统路径static拼接图片返回路径 + * http://xx.com/static/2019-10/8050891248624f2bbefedcb196ce89cb.jpeg + */ + @Multipart + @POST("/imageUpload") + suspend fun uploadFile( + @Header("token") token: String, + @Part file: MultipartBody.Part + ): String + + /** + * 根据部门获取区ID + * + * @param deptId + */ + @GET("/config/getAreaByDept") + suspend fun obtainAreaByDept( + @Header("token") token: String, + @Query("deptId") deptId: String + ): String + + /** + * 获取区/县等 + * + * @param pid + */ + @GET("/area/list") + suspend fun obtainDistrict( + @Header("token") token: String, + @Query("pid") pid: String + ): String + + /** + * 获取街道 + * + * @param pid + */ + @GET("/area/list") + suspend fun obtainStreet( + @Header("token") token: String, + @Query("pid") pid: String + ): String + + /** + * 编辑更新井信息 + * + * @param id + */ + @FormUrlEncoded + @POST("/well/update") + suspend fun updateWellDetail( + @Header("token") token: String, + @Field("id") id: String, + @Field("wellCode") wellCode: String, + @Field("wellName") wellName: String, + @Field("wellType") wellType: String, + @Field("deptid") deptid: String, + @Field("deep") deep: String, + @Field("position") position: String, + @Field("coordinateX") coordinateX: String, + @Field("coordinateY") coordinateY: String, + @Field("photos") photos: String, + @Field("notes") notes: String?, + @Field("qu") qu: String, + @Field("area") area: String, + @Field("responsibleDept") responsibleDept: String, + @Field("responsibleDeptName") responsibleDeptName: String + ): String + + /** * 获取工单详情 * * @param id 工单id @@ -312,18 +383,6 @@ ): String /** - * 上传图片 - * 系统路径static拼接图片返回路径 - * http://xx.com/static/2019-10/8050891248624f2bbefedcb196ce89cb.jpeg - */ - @Multipart - @POST("/imageUpload") - suspend fun uploadImage( - @Header("token") token: String, - @Part file: MultipartBody.Part - ): String - - /** * 查找同一单位下的用户 * * @param hasMine 是否包含本人,1包含, 0不包含 diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt index efd6b11..e35e976 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt @@ -3,6 +3,10 @@ import com.casic.app.smartwell.sanxi.model.PublicKeyModel import com.casic.app.smartwell.sanxi.utils.AuthenticationHelper import com.casic.app.smartwell.sanxi.utils.Constant +import okhttp3.MediaType.Companion.toMediaTypeOrNull +import okhttp3.MultipartBody +import okhttp3.RequestBody +import java.io.File object RetrofitServiceManager { @@ -272,6 +276,76 @@ return api.obtainOperationResult(AuthenticationHelper.token!!, wellId, bfzt) } + /** + * 上传图片 + */ + suspend fun uploadFile(image: File): String { + val requestBody = RequestBody.create("image/png".toMediaTypeOrNull(), image) + val imagePart = MultipartBody.Part.createFormData("file", image.name, requestBody) + return api.uploadFile(AuthenticationHelper.token!!, imagePart) + } + + /** + * 根据部门获取区ID + */ + suspend fun obtainAreaByDept(deptId: String): String { + return api.obtainAreaByDept(AuthenticationHelper.token!!, deptId) + } + + /** + * 获取区/县等 + */ + suspend fun obtainDistrict(pid: String): String { + return api.obtainDistrict(AuthenticationHelper.token!!, pid) + } + + /** + * 获取街道 + */ + suspend fun obtainStreet(pid: String): String { + return api.obtainStreet(AuthenticationHelper.token!!, pid) + } + + /** + * 编辑更新井信息 + */ + suspend fun updateWellDetail( + id: String, + wellCode: String, + wellName: String, + wellType: String, + deptid: String, + deep: String, + position: String, + coordinateX: String, + coordinateY: String, + photos: String, + notes: String?, + qu: String, + area: String, + responsibleDept: String, + responsibleDeptName: String + ): String { + return api.updateWellDetail( + AuthenticationHelper.token!!, + id, + wellCode, + wellName, + wellType, + deptid, + deep, + position, + coordinateX, + coordinateY, + photos, + notes, + qu, + area, + responsibleDept, + responsibleDeptName + ) + } + // /** // * 获取工单详情 // */ @@ -287,15 +361,6 @@ // } // // /** -// * 上传图片 -// */ -// suspend fun uploadImage(image: File): String { -// val requestBody = RequestBody.create("image/png".toMediaTypeOrNull(), image) -// val imagePart = MultipartBody.Part.createFormData("file", image.name, requestBody) -// return api.uploadImage(AuthenticationHelper.token!!, imagePart) -// } -// -// /** // * 查找同一单位下的用户 // */ // suspend fun obtainSubordinate(hasMine: String?, roleTips: String?): String { diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/EditWellActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/EditWellActivity.kt new file mode 100644 index 0000000..956dbce --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/EditWellActivity.kt @@ -0,0 +1,341 @@ +package com.casic.app.smartwell.sanxi.view + +import android.app.Activity +import android.content.Intent +import android.view.View +import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.GridLayoutManager +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.adapter.EditableImageAdapter +import com.casic.app.smartwell.sanxi.base.BaseActivity +import com.casic.app.smartwell.sanxi.extensions.combineImagePath +import com.casic.app.smartwell.sanxi.extensions.navigatePageTo +import com.casic.app.smartwell.sanxi.extensions.reformat +import com.casic.app.smartwell.sanxi.extensions.show +import com.casic.app.smartwell.sanxi.model.DistrictModel +import com.casic.app.smartwell.sanxi.model.OwnerShipModel +import com.casic.app.smartwell.sanxi.model.WellListPageModel +import com.casic.app.smartwell.sanxi.utils.* +import com.casic.app.smartwell.sanxi.vm.AuthenticateViewModel +import com.casic.app.smartwell.sanxi.vm.UploadFileViewModel +import com.casic.app.smartwell.sanxi.vm.WellViewModel +import com.casic.app.smartwell.sanxi.widgets.BottomAreaSheet +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken +import com.luck.picture.lib.PictureSelector +import com.luck.picture.lib.config.PictureConfig +import com.luck.picture.lib.config.PictureMimeType +import com.pengxh.app.multilib.widget.dialog.BottomActionSheet +import com.qmuiteam.qmui.widget.dialog.QMUIBottomSheet +import kotlinx.android.synthetic.main.activity_edit_well.* +import kotlinx.android.synthetic.main.include_base_title.* +import java.io.File + +class EditWellActivity : BaseActivity() { + + private val kTag = "EditWellActivity" + private lateinit var wellViewModel: WellViewModel + private lateinit var authenticateViewModel: AuthenticateViewModel + private lateinit var uploadImageViewModel: UploadFileViewModel + private lateinit var wellBeanJson: String + private lateinit var imageAdapter: EditableImageAdapter + private lateinit var wellBean: WellListPageModel.DataBean.RowsBean + private val imagePaths: ArrayList = ArrayList() //服务器返回的拍照数据集 + private val realPaths: ArrayList = ArrayList() //真实图片路径 + private val districtModels: ArrayList = ArrayList() //行政区 + private var wellType = "" + private var deptId = "" + private var districtId = "" + private var streetId = "" + + override fun initLayoutView(): Int = R.layout.activity_edit_well + + override fun setupTopBarLayout() { + leftBackView.setOnClickListener { finish() } + titleView.text = "编辑井信息" + } + + override fun initData() { + wellViewModel = ViewModelProvider(this).get(WellViewModel::class.java) + authenticateViewModel = ViewModelProvider(this).get(AuthenticateViewModel::class.java) + uploadImageViewModel = ViewModelProvider(this).get(UploadFileViewModel::class.java) + wellBeanJson = intent.getStringExtra(Constant.INTENT_PARAM)!! + wellBean = Gson().fromJson( + wellBeanJson, object : TypeToken() {}.type + ) + wellNameView.setText(wellBean.wellName) + wellCodeView.text = wellBean.wellCode + + this.wellType = wellBean.wellType + wellTypeView.text = wellBean.wellTypeName + + this.deptId = wellBean.deptid + ownerShipView.text = wellBean.deptName + wellDepthView.setText(wellBean.deep) + longitudeView.setText(wellBean.lngGaode) + latitudeView.setText(wellBean.latGaode) + + /** + * 2022-06/e805917f14ed49378bbd29cae391b061.png; + * 2022-06/48d34f27695346bbb39d695333faabee.png; + * 2022-06/6df199418fd84960a164ad9c9660e172.png; + * 2022-06/bfbab97a965d406ba30fc9d09ab35f5c.png; + * */ + //显示已有的图片 + val imageArray = wellBean.photos.toString().split(";") + imageArray.forEach { path -> + if (path.isNotBlank()) { + imagePaths.add(path) + realPaths.add(path.combineImagePath()) + } + } + imageAdapter = EditableImageAdapter(this) + imageAdapter.setupImage(realPaths) + imageRecyclerView.layoutManager = GridLayoutManager(this, 3) + imageRecyclerView.adapter = imageAdapter + + //默认加载当前井的区域 + authenticateViewModel.obtainAreaByDept(wellBean.deptid) + authenticateViewModel.areaModel.observe(this, { + if (it.code == 200) { + authenticateViewModel.obtainDistrict(it.data.area) + } + }) + addressView.setText(wellBean.position) + } + + override fun initEvent() { + wellCodeView.setOnClickListener { + "井编号不可编辑".show() + } + + wellTypeView.setOnClickListener { + wellViewModel.obtainWellType() + } + wellViewModel.wellTypeModel.observe(this, { + if (it.code == 200) { + val sheetBuilder = QMUIBottomSheet.BottomListSheetBuilder(this) + sheetBuilder.setTitle("井类型") + it.data.forEach { type -> + sheetBuilder.addItem(type.name) + } + sheetBuilder.setGravityCenter(true) + .setOnSheetItemClickListener { dialog, _, position, tag -> + this.wellType = it.data[position].value + wellTypeView.text = tag + + dialog.dismiss() + }.build().show() + } + }) + + ownerShipView.setOnClickListener { + authenticateViewModel.obtainOwnerShip("03") + } + + imageAdapter.setOnItemClickListener(object : EditableImageAdapter.OnItemClickListener { + override fun onAddImageClick() { + selectPicture() + } + + override fun onItemClick(position: Int) { + if (realPaths[position].isBlank()) { + "图片加载失败,无法查看大图".show() + } else { + navigatePageTo(position, realPaths) + } + } + + override fun onItemLongClick(view: View?, position: Int) { + imagePaths.removeAt(position) + imageAdapter.deleteImage(position) + } + }) + + authenticateViewModel.resultModel.observe(this, { + if (it.code == 200) { + val ownerShipModel: MutableList = ArrayList() + it.data?.list?.forEach { listBean -> + ownerShipModel.add(listBean) + } + val sheetBuilder = QMUIBottomSheet.BottomListSheetBuilder(this) + sheetBuilder.setTitle("权属单位") + ownerShipModel.forEach { model -> + sheetBuilder.addItem(model.name) + } + sheetBuilder.setGravityCenter(true) + .setOnSheetItemClickListener { dialog, _, position, tag -> + this.deptId = it.data?.list!![position].id + ownerShipView.text = tag + + dialog.dismiss() + }.build().show() + } + }) + + authenticateViewModel.districtModel.observe(this, { + if (it.code == 200) { + it.data.forEach { area -> + districtModels.add(area) + //判断区 + if (area.id == wellBean.qu) { + authenticateViewModel.obtainStreet(area.id) + authenticateViewModel.streetModel.observe(this, { street -> + if (street.code == 200) { + street.data.forEach { streetData -> + //判断街道 + if (streetData.id == wellBean.area) { + districtView.text = + String.format("${area.name}${streetData.name}") + } + } + } + }) + } + } + } + }) + + //点击选择井的区域 + districtView.setOnClickListener { + if (districtModels.isNullOrEmpty()) { + "无行政区域数据,无法修改".show() + return@setOnClickListener + } + BottomAreaSheet.Builder() + .setContext(this) + .setLifecycleOwner(this) + .setDistrictAreaData(districtModels) + .setChildDataViewModel(authenticateViewModel) + .setOnActionSheetListener(object : BottomAreaSheet.OnActionSheetListener { + override fun onAreaSelected( + area: String?, districtId: String, streetId: String + ) { + districtView.text = area?.replace("-", "") + this@EditWellActivity.districtId = districtId + this@EditWellActivity.streetId = streetId + } + }) + .build().show() + } + + //提交修改 + saveButton.setOnClickListener { + if (districtId.isEmpty() || streetId.isEmpty()) { + "行政区ID为空或者街道ID为空".show() + return@setOnClickListener + } + wellViewModel.updateWellDetail( + id = wellBean.id, + wellCode = wellBean.wellCode, + wellName = wellNameView.text.toString(), + wellType = wellType, + deptid = deptId, + deep = wellDepthView.text.toString(), + position = addressView.text.toString(), + coordinateX = longitudeView.text.toString(), + coordinateY = latitudeView.text.toString(), + photos = imagePaths.reformat(), + notes = "", + qu = districtId, + area = streetId, + responsibleDept = deptId, + responsibleDeptName = ownerShipView.text.toString() + ) + } + + uploadImageViewModel.resultModel.observe(this, { model -> + if (model.code == 200) { + /** + * 显示图片 + * path: 2021-07\c670eac17d644b179a4324a34bb84329.jpeg + * */ + /** + * 显示图片 + * path: 2021-07\c670eac17d644b179a4324a34bb84329.jpeg + * */ + val sumItemCount: Int = imageAdapter.itemCount + 1 //每上传一张图片,图片总数都是在原有的基础上+1 + if (sumItemCount <= 5) { + val url = model.data + //let函数处理需要针对一个可null的对象统一做判空处理。 + url?.let { + imagePaths.add(it) + realPaths.add(it.combineImagePath()) + } + imageAdapter.setupImage(realPaths) + } else { + "最多只能上传4张图片".show() + } + } + }) + uploadImageViewModel.loadState.observe(this, { + DialogHelper.dismissLoadingDialog() + }) + + wellViewModel.loadState.observe(this, { + when (it) { + is LoadState.Loading -> { + DialogHelper.showLoadingDialog(this, "保存中,请稍后...") + } + is LoadState.Success -> { + DialogHelper.dismissLoadingDialog() + finish() + } + else -> { + DialogHelper.dismissLoadingDialog() + } + } + }) + } + + private fun selectPicture() { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitles(arrayOf("拍照", "相册")) + .setOnActionSheetListener { position -> + when (position) { + 0 -> { + PictureSelector.create(this) + .openCamera(PictureMimeType.ofImage()) + .isCompress(true) + .compressSavePath(FileUtils.imageCompressPath) + .imageEngine(GlideLoadEngine.createGlideEngine()) + .forResult(PictureConfig.REQUEST_CAMERA) + } + 1 -> { + PictureSelector.create(this) + .openGallery(PictureMimeType.ofImage()) + .isWeChatStyle(true) + .isCamera(false) + .isCompress(true) + .compressSavePath(FileUtils.imageCompressPath) + .imageEngine(GlideLoadEngine.createGlideEngine()) + .maxSelectNum(4) + .forResult(PictureConfig.CHOOSE_REQUEST) + } + } + }.build().show() + } + + override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { + super.onActivityResult(requestCode, resultCode, data) + if (resultCode == Activity.RESULT_OK) { + when (requestCode) { + PictureConfig.CHOOSE_REQUEST -> { + val selectResult = PictureSelector.obtainMultipleResult(data) + DialogHelper.showLoadingDialog(this, "图片上传中,请稍后...") + for (res in selectResult) { + val file = File(res.compressPath) + //上传图片 + uploadImageViewModel.uploadFile(file) + } + } + PictureConfig.REQUEST_CAMERA -> { + val cameraResult = PictureSelector.obtainMultipleResult(data)[0] + //上传图片 + uploadImageViewModel.uploadFile(File(cameraResult.compressPath)) + } + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellDetailActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellDetailActivity.kt index 50c9e05..6c93e4e 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellDetailActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellDetailActivity.kt @@ -9,28 +9,30 @@ import com.amap.api.maps.model.CameraPosition import com.amap.api.maps.model.LatLng import com.amap.api.maps.model.MarkerOptions -import com.amap.api.services.core.LatLonPoint -import com.amap.api.services.geocoder.GeocodeResult -import com.amap.api.services.geocoder.GeocodeSearch -import com.amap.api.services.geocoder.RegeocodeQuery -import com.amap.api.services.geocoder.RegeocodeResult import com.casic.app.smartwell.sanxi.R import com.casic.app.smartwell.sanxi.base.BaseActivity import com.casic.app.smartwell.sanxi.extensions.show import com.casic.app.smartwell.sanxi.utils.Constant import com.casic.app.smartwell.sanxi.utils.DialogHelper import com.casic.app.smartwell.sanxi.utils.LoadState +import com.casic.app.smartwell.sanxi.vm.AuthenticateViewModel import com.casic.app.smartwell.sanxi.vm.WellViewModel import com.pengxh.app.multilib.widget.dialog.AlertMessageDialog import kotlinx.android.synthetic.main.activity_well_detail.* +import kotlinx.android.synthetic.main.activity_well_detail.wellCodeView +import kotlinx.android.synthetic.main.activity_well_detail.wellDepthView +import kotlinx.android.synthetic.main.activity_well_detail.wellNameView +import kotlinx.android.synthetic.main.activity_well_detail.wellStateView +import kotlinx.android.synthetic.main.activity_well_detail.wellTypeView +import kotlinx.android.synthetic.main.activity_well_list_detail.* import kotlinx.android.synthetic.main.include_base_title.* class WellDetailActivity : BaseActivity(), AMap.OnMapLoadedListener { private val kTag = "WellDetailActivity" - private val geocoderSearch by lazy { GeocodeSearch(this) } private lateinit var wellViewModel: WellViewModel + private lateinit var authenticateViewModel: AuthenticateViewModel private lateinit var wellId: String private lateinit var aMap: AMap private var latLng: LatLng? = null @@ -46,6 +48,7 @@ override fun initData() { wellId = intent.getStringExtra(Constant.INTENT_PARAM)!! wellViewModel = ViewModelProvider(this).get(WellViewModel::class.java) + authenticateViewModel = ViewModelProvider(this).get(AuthenticateViewModel::class.java) aMap = wellMapView.map aMap.mapType = AMap.MAP_TYPE_NORMAL @@ -103,39 +106,41 @@ val wellPosition = wellDetail.position.toString() wellLocationView.text = wellPosition - //根据经纬度获取省市区县 if (wellDetail.latGaode.isBlank() || wellDetail.lngGaode.isBlank()) { "井经纬度异常,无法查看完整位置信息".show() return@observe } this.latLng = LatLng(wellDetail.latGaode.toDouble(), wellDetail.lngGaode.toDouble()) - val queryParam = RegeocodeQuery( - LatLonPoint(wellDetail.latGaode.toDouble(), wellDetail.lngGaode.toDouble()), - 200f, - GeocodeSearch.AMAP - ) - tipsImageView.setOnClickListener { - geocoderSearch.getFromLocationAsyn(queryParam) + authenticateViewModel.obtainAreaByDept(wellDetail.deptid) } - - geocoderSearch.setOnGeocodeSearchListener(object : - GeocodeSearch.OnGeocodeSearchListener { - override fun onRegeocodeSearched(result: RegeocodeResult?, rCode: Int) { - if (rCode == 1000) { - AlertMessageDialog.Builder() - .setContext(this@WellDetailActivity) - .setTitle("闸井完整位置") - .setMessage(result?.regeocodeAddress?.formatAddress + "-" + wellPosition) - .setPositiveButton("知道了").setOnDialogButtonClickListener {}.build() - .show() - } else { - "获取该闸井详细位置信息失败".show() - } + authenticateViewModel.areaModel.observe(this, { areaModel -> + if (areaModel.code == 200) { + authenticateViewModel.obtainDistrict(areaModel.data.area) } - - override fun onGeocodeSearched(result: GeocodeResult?, rCode: Int) { - + }) + authenticateViewModel.districtModel.observe(this, { districtModel -> + if (districtModel.code == 200) { + districtModel.data.forEach { area -> + if (area.id == wellDetail.qu) { + authenticateViewModel.obtainStreet(area.id) + authenticateViewModel.streetModel.observe(this, { street -> + if (street.code == 200) { + street.data.forEach { streetData -> + if (streetData.id == wellDetail.area) { + AlertMessageDialog.Builder() + .setContext(this@WellDetailActivity) + .setTitle("闸井完整位置") + .setMessage(String.format("${area.name}${streetData.name}") + "-" + wellPosition) + .setPositiveButton("知道了") + .setOnDialogButtonClickListener {}.build() + .show() + } + } + } + }) + } + } } }) } diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellListDetailActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellListDetailActivity.kt index b34be03..d28b752 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellListDetailActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellListDetailActivity.kt @@ -4,11 +4,6 @@ import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.GridLayoutManager import androidx.recyclerview.widget.LinearLayoutManager -import com.amap.api.services.core.LatLonPoint -import com.amap.api.services.geocoder.GeocodeResult -import com.amap.api.services.geocoder.GeocodeSearch -import com.amap.api.services.geocoder.RegeocodeQuery -import com.amap.api.services.geocoder.RegeocodeResult import com.casic.app.smartwell.sanxi.R import com.casic.app.smartwell.sanxi.adapter.DeviceDataListAdapter import com.casic.app.smartwell.sanxi.adapter.DeviceDataTitleAdapter @@ -19,6 +14,7 @@ import com.casic.app.smartwell.sanxi.extensions.show import com.casic.app.smartwell.sanxi.model.WellListPageModel import com.casic.app.smartwell.sanxi.utils.Constant +import com.casic.app.smartwell.sanxi.vm.AuthenticateViewModel import com.casic.app.smartwell.sanxi.vm.WellViewModel import com.google.gson.Gson import com.google.gson.reflect.TypeToken @@ -28,8 +24,8 @@ class WellListDetailActivity : BaseActivity() { private val kTag = "WellListDetailActivity" - private val geocoderSearch by lazy { GeocodeSearch(this) } private lateinit var wellViewModel: WellViewModel + private lateinit var authenticateViewModel: AuthenticateViewModel private lateinit var wellBeanJson: String override fun initLayoutView(): Int = R.layout.activity_well_list_detail @@ -41,6 +37,7 @@ override fun initData() { wellViewModel = ViewModelProvider(this).get(WellViewModel::class.java) + authenticateViewModel = ViewModelProvider(this).get(AuthenticateViewModel::class.java) wellBeanJson = intent.getStringExtra(Constant.INTENT_PARAM)!! val wellBean = Gson().fromJson( wellBeanJson, object : TypeToken() {}.type @@ -89,29 +86,32 @@ }) } - //根据经纬度获取省市区县 - if (wellBean.latGaode.isBlank() || wellBean.lngGaode.isBlank()) { - "井经纬度异常,无法查看完整位置信息".show() - return - } - val queryParam = RegeocodeQuery( - LatLonPoint(wellBean.latGaode.toDouble(), wellBean.lngGaode.toDouble()), - 200f, - GeocodeSearch.AMAP - ) - geocoderSearch.getFromLocationAsyn(queryParam) - geocoderSearch.setOnGeocodeSearchListener(object : - GeocodeSearch.OnGeocodeSearchListener { - override fun onRegeocodeSearched(result: RegeocodeResult?, rCode: Int) { - if (rCode == 1000) { - districtView.text = result?.regeocodeAddress?.formatAddress - } - } - - override fun onGeocodeSearched(result: GeocodeResult?, rCode: Int) { - + authenticateViewModel.obtainAreaByDept(wellBean.deptid) + authenticateViewModel.areaModel.observe(this, { + if (it.code == 200) { + authenticateViewModel.obtainDistrict(it.data.area) } }) + authenticateViewModel.districtModel.observe(this, { + if (it.code == 200) { + it.data.forEach { area -> + if (area.id == wellBean.qu) { + authenticateViewModel.obtainStreet(area.id) + authenticateViewModel.streetModel.observe(this, { street -> + if (street.code == 200) { + street.data.forEach { streetData -> + if (streetData.id == wellBean.area) { + districtView.text = + String.format("${area.name}${streetData.name}") + } + } + } + }) + } + } + } + }) + addressView.text = wellBean.position maintenanceView.text = wellBean.responsibleDeptName diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellManageActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellManageActivity.kt index 1cd5616..8fc415b 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellManageActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellManageActivity.kt @@ -251,7 +251,7 @@ } override fun onEditClicked(position: Int) { - + navigatePageTo(dataBeans[position].toJson()) } override fun onOperationClicked(position: Int) { diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/vm/AuthenticateViewModel.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/vm/AuthenticateViewModel.kt index 5186591..4632b20 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/vm/AuthenticateViewModel.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/vm/AuthenticateViewModel.kt @@ -3,8 +3,7 @@ import androidx.lifecycle.MutableLiveData import com.casic.app.smartwell.sanxi.base.BaseViewModel import com.casic.app.smartwell.sanxi.extensions.* -import com.casic.app.smartwell.sanxi.model.OwnerShipModel -import com.casic.app.smartwell.sanxi.model.PublicKeyModel +import com.casic.app.smartwell.sanxi.model.* import com.casic.app.smartwell.sanxi.utils.Constant import com.casic.app.smartwell.sanxi.utils.LoadState import com.casic.app.smartwell.sanxi.utils.SaveKeyValues @@ -18,6 +17,9 @@ private val gson = Gson() val keyModel = MutableLiveData() val resultModel = MutableLiveData() + val areaModel = MutableLiveData() + val districtModel = MutableLiveData() + val streetModel = MutableLiveData() fun obtainPublicKey() = launch({ loadState.value = LoadState.Loading @@ -62,4 +64,55 @@ }, { it.printStackTrace() }) + + /** + * 根据部门获取区ID + */ + fun obtainAreaByDept(deptId: String) = launch({ + val response = RetrofitServiceManager.obtainAreaByDept(deptId) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + areaModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + response.toErrorMessage().show() + } + }, { + it.printStackTrace() + }) + + /** + * 区/县等 + */ + fun obtainDistrict(pid: String) = launch({ + val response = RetrofitServiceManager.obtainDistrict(pid) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + districtModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + response.toErrorMessage().show() + } + }, { + it.printStackTrace() + }) + + /** + * 街道 + */ + fun obtainStreet(areaId: String) = launch({ + val response = RetrofitServiceManager.obtainStreet(areaId) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + streetModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + response.toErrorMessage().show() + } + }, { + it.printStackTrace() + }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/vm/UploadFileViewModel.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/vm/UploadFileViewModel.kt new file mode 100644 index 0000000..fe9d357 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/vm/UploadFileViewModel.kt @@ -0,0 +1,36 @@ +package com.casic.app.smartwell.sanxi.vm + +import androidx.lifecycle.MutableLiveData +import com.casic.app.smartwell.sanxi.base.BaseViewModel +import com.casic.app.smartwell.sanxi.extensions.launch +import com.casic.app.smartwell.sanxi.extensions.separateResponseCode +import com.casic.app.smartwell.sanxi.extensions.show +import com.casic.app.smartwell.sanxi.extensions.toErrorMessage +import com.casic.app.smartwell.sanxi.model.CommonResultModel +import com.casic.app.smartwell.sanxi.utils.LoadState +import com.casic.app.smartwell.sanxi.utils.retrofit.RetrofitServiceManager +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken +import java.io.File + +class UploadFileViewModel : BaseViewModel() { + + private val gson = Gson() + val resultModel = MutableLiveData() + + fun uploadFile(image: File) = launch({ + val response = RetrofitServiceManager.uploadFile(image) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + resultModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show() + } + }, { + loadState.value = LoadState.Fail + }) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/vm/WellViewModel.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/vm/WellViewModel.kt index 696dbf0..8e59b91 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/vm/WellViewModel.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/vm/WellViewModel.kt @@ -1,5 +1,6 @@ package com.casic.app.smartwell.sanxi.vm +import android.util.Log import androidx.lifecycle.MutableLiveData import com.casic.app.smartwell.sanxi.base.BaseViewModel import com.casic.app.smartwell.sanxi.extensions.launch @@ -15,6 +16,7 @@ class WellViewModel : BaseViewModel() { + private val kTag = "WellViewModel" private val gson = Gson() val detailModel = MutableLiveData() val allWellModel = MutableLiveData() @@ -152,4 +154,58 @@ loadState.value = LoadState.Fail it.printStackTrace() }) + + /** + * 编辑更新井信息 + * */ + fun updateWellDetail( + id: String, + wellCode: String, + wellName: String, + wellType: String, + deptid: String, + deep: String, + position: String, + coordinateX: String, + coordinateY: String, + photos: String, + notes: String?, + qu: String, + area: String, + responsibleDept: String, + responsibleDeptName: String + ) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.updateWellDetail( + id, + wellCode, + wellName, + wellType, + deptid, + deep, + position, + coordinateX, + coordinateY, + photos, + notes, + qu, + area, + responsibleDept, + responsibleDeptName + ) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + "更新成功".show() + commonResultModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show() + } + }, { + loadState.value = LoadState.Fail + it.printStackTrace() + }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/widgets/BottomAreaSheet.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/widgets/BottomAreaSheet.kt new file mode 100644 index 0000000..5f464be --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/widgets/BottomAreaSheet.kt @@ -0,0 +1,213 @@ +package com.casic.app.smartwell.sanxi.widgets + +import android.app.Dialog +import android.content.Context +import android.os.Bundle +import android.view.* +import android.widget.AbsListView +import android.widget.AdapterView +import android.widget.BaseAdapter +import android.widget.TextView +import androidx.lifecycle.LifecycleOwner +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseViewModel +import com.casic.app.smartwell.sanxi.extensions.initDialogLayoutParams +import com.casic.app.smartwell.sanxi.extensions.show +import com.casic.app.smartwell.sanxi.model.DistrictModel +import com.casic.app.smartwell.sanxi.model.StreetModel +import com.casic.app.smartwell.sanxi.vm.AuthenticateViewModel +import com.pengxh.app.multilib.utils.SizeUtil +import kotlinx.android.synthetic.main.sheet_bottom_area.* + +class BottomAreaSheet private constructor(builder: Builder) : Dialog( + builder.context, R.style.ActionSheetDialogStyle +) { + private val owner: LifecycleOwner = builder.owner + private val firstLevelArea: List = builder.firstLevelArea + private val vm: BaseViewModel = builder.vm + private val listener: OnActionSheetListener = builder.listener + + class Builder { + lateinit var context: Context + lateinit var owner: LifecycleOwner + lateinit var firstLevelArea: List + lateinit var vm: BaseViewModel + lateinit var listener: OnActionSheetListener + + fun setContext(context: Context): Builder { + this.context = context + return this + } + + fun setLifecycleOwner(owner: LifecycleOwner): Builder { + this.owner = owner + return this + } + + fun setDistrictAreaData(firstLevelArea: List): Builder { + this.firstLevelArea = firstLevelArea + return this + } + + fun setChildDataViewModel(vm: BaseViewModel): Builder { + this.vm = vm + return this + } + + fun setOnActionSheetListener(listener: OnActionSheetListener): Builder { + this.listener = listener + return this + } + + fun build(): BottomAreaSheet { + return BottomAreaSheet(this) + } + } + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + this.initDialogLayoutParams(Gravity.BOTTOM, R.style.ActionSheetDialogAnimation, 1.0f) + setContentView(R.layout.sheet_bottom_area) + setCancelable(false) + setCanceledOnTouchOutside(false) + + dismissView.setOnClickListener { dismiss() } + + var districtId = "" + var streetId = "" + //街道 + val authenticateViewModel = vm as AuthenticateViewModel + //默认加载第一个区的街道 + val firstDistrict = firstLevelArea[0] + var districtName = if (firstDistrict.simplename.toString().isBlank()) + firstDistrict.simplename + else + firstDistrict.name + selectedAreaView.text = districtName + authenticateViewModel.obtainStreet(firstDistrict.id) + + //行政区 + firstAreaListView.adapter = DistrictDataAdapter(firstLevelArea) + firstAreaListView.onItemClickListener = AdapterView.OnItemClickListener { _, _, i, _ -> + //只选择到一级区域 + districtName = if (firstLevelArea[i].simplename.toString().isBlank()) + firstLevelArea[i].simplename + else + firstLevelArea[i].name + districtId = firstLevelArea[i].id + selectedAreaView.text = districtName + + if (districtId.isBlank()) { + "一级区域ID为空,无法获取下级街道列表".show() + return@OnItemClickListener + } + authenticateViewModel.obtainStreet(districtId) + } + authenticateViewModel.streetModel.observe(owner, { + if (it.code == 200) { + val streetModels = it.data + secondAreaListView.adapter = StreetDataAdapter(streetModels) + secondAreaListView.onItemClickListener = + AdapterView.OnItemClickListener { _, _, i, _ -> + val streetName = if (streetModels[i].simplename.toString().isBlank()) + streetModels[i].simplename + else + streetModels[i].name + streetId = streetModels[i].id + selectedAreaView.text = String.format("$districtName-$streetName") + } + } + }) + + sheetConfirmButton.setOnClickListener { + listener.onAreaSelected(selectedAreaView.text.toString(), districtId, streetId) + dismiss() + } + } + + interface OnActionSheetListener { + fun onAreaSelected(area: String?, districtId: String, streetId: String) + } + + internal inner class DistrictDataAdapter(private val dataBeans: List) : + BaseAdapter() { + + private val inflater: LayoutInflater = LayoutInflater.from(context) + + override fun getCount(): Int = dataBeans.size + + override fun getItem(position: Int): Any = dataBeans[position] + + override fun getItemId(position: Int): Long = position.toLong() + + override fun getView(position: Int, convertView: View?, parent: ViewGroup): View { + val view: View + val holder: ItemViewHolder + if (convertView == null) { + holder = ItemViewHolder() + view = inflater.inflate(R.layout.item_area_sheet, null) + holder.areaItemView = view.findViewById(R.id.areaItemView) + view.tag = holder + } else { + view = convertView + holder = view.tag as ItemViewHolder + } + val dataBean = dataBeans[position] + holder.areaItemView.setBackgroundResource(R.drawable.sheet_item_selector) + holder.areaItemView.text = + if (dataBean.simplename.toString().isBlank()) dataBean.simplename else dataBean.name + //需要动态设置item的高度 + val param = AbsListView.LayoutParams( + WindowManager.LayoutParams.MATCH_PARENT, + SizeUtil.dp2px(context, 46f) + ) + view.layoutParams = param + return view + } + + internal inner class ItemViewHolder { + lateinit var areaItemView: TextView + } + } + + internal inner class StreetDataAdapter(private val dataBeans: List) : + BaseAdapter() { + + private val inflater: LayoutInflater = LayoutInflater.from(context) + + override fun getCount(): Int = dataBeans.size + + override fun getItem(position: Int): Any = dataBeans[position] + + override fun getItemId(position: Int): Long = position.toLong() + + override fun getView(position: Int, convertView: View?, parent: ViewGroup): View { + val view: View + val holder: ItemViewHolder + if (convertView == null) { + holder = ItemViewHolder() + view = inflater.inflate(R.layout.item_area_sheet, null) + holder.areaItemView = view.findViewById(R.id.areaItemView) + view.tag = holder + } else { + view = convertView + holder = view.tag as ItemViewHolder + } + val dataBean = dataBeans[position] + holder.areaItemView.setBackgroundResource(R.drawable.sheet_item_selector) + holder.areaItemView.text = + if (dataBean.simplename.toString().isBlank()) dataBean.simplename else dataBean.name + //需要动态设置item的高度 + val param = AbsListView.LayoutParams( + WindowManager.LayoutParams.MATCH_PARENT, + SizeUtil.dp2px(context, 46f) + ) + view.layoutParams = param + return view + } + + internal inner class ItemViewHolder { + lateinit var areaItemView: TextView + } + } +} \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index fdf5fc7..804f233 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -102,8 +102,6 @@ implementation 'com.google.code.gson:gson:2.8.6' //上拉加载下拉刷新 implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' - //高德地图搜索 - implementation 'com.amap.api:search:8.1.0' //高德导航 implementation 'com.amap.api:navi-3dmap:8.1.0_3dmap8.1.0' //日期选择器 diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 3fcef8b..460648b 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -9,6 +9,7 @@ + @@ -51,6 +52,7 @@ android:name=".view.BigImageActivity" android:theme="@style/Theme.BigImageActivity" /> + () { + + private val countLimit = 4 + private var imageData: ArrayList = ArrayList() + + fun setupImage(images: ArrayList) { + this.imageData = images + notifyDataSetChanged() + } + + fun deleteImage(position: Int) { + if (imageData.size != 0) { + imageData.removeAt(position) + notifyDataSetChanged() + } + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { + val imageView = ImageView(context) + val screenWidth: Int = SizeUtil.getScreenWidth(context) - SizeUtil.dp2px(context, 40f) + val margins: Int = SizeUtil.dp2px(context, 3f) + val itemSize = (screenWidth - 6 * margins) / 3 + val params = LinearLayout.LayoutParams(itemSize, itemSize) + params.setMargins(margins, margins, margins, margins) + params.gravity = Gravity.CENTER + imageView.scaleType = ImageView.ScaleType.CENTER_CROP + imageView.layoutParams = params + return ItemViewHolder(imageView) + } + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + if (position == itemCount - 1 && imageData.size < countLimit) { + holder.imageView.setImageResource(R.drawable.ic_add_pic) + holder.imageView.setOnClickListener { //添加图片 + mOnItemClickListener!!.onAddImageClick() + } + } else { + Glide.with(context).load(imageData[position]).into(holder.imageView) + holder.imageView.setOnClickListener { // 点击操作,查看大图 + mOnItemClickListener!!.onItemClick(position) + } + // 长按监听 + holder.imageView.setOnLongClickListener { v -> //长按删除 + mOnItemClickListener!!.onItemLongClick(v, position) + true + } + } + } + + override fun getItemCount(): Int { + // 满3张图就不让其添加新图 + return if (imageData.size != 0 && imageData.size >= countLimit) { + countLimit + } else { + if (imageData.size == 0) 1 else imageData.size + 1 + } + } + + private var mOnItemClickListener: OnItemClickListener? = null + + fun setOnItemClickListener(onItemClickListener: OnItemClickListener?) { + mOnItemClickListener = onItemClickListener + } + + interface OnItemClickListener { + fun onAddImageClick() + fun onItemClick(position: Int) + fun onItemLongClick(view: View?, position: Int) + } + + inner class ItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val imageView: ImageView = itemView as ImageView + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt index 3a098be..ad20c8b 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt @@ -31,7 +31,10 @@ setContentView(initLayoutView()) ImmersionBar.with(this).statusBarDarkFont(false).init() //沉浸式状态栏 when (this.javaClass.simpleName) { - "WelcomeActivity" -> ImmersionBar.with(this).statusBarDarkFont(true).init() + "WelcomeActivity" -> { + ImmersionBar.with(this).statusBarDarkFont(true).init() + StatusBarColorUtil.setColor(this, R.color.white.convertColor(this)) + } "SplashScreenActivity" -> ImmersionBar.with(this).statusBarDarkFont(false).init() "LoginActivity" -> ImmersionBar.with(this).statusBarDarkFont(true).init() else -> StatusBarColorUtil.setColor(this, R.color.mainThemeColor.convertColor(this)) diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/extensions/ArrayList.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/extensions/ArrayList.kt index e77dbaa..3affed7 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/extensions/ArrayList.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/extensions/ArrayList.kt @@ -13,7 +13,7 @@ if (index == this.size - 1) { builder.append(s) } else { - builder.append(s).append(",") + builder.append(s).append(";") } } return builder.toString() diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/model/AreaModel.java b/app/src/main/java/com/casic/app/smartwell/sanxi/model/AreaModel.java new file mode 100644 index 0000000..3ee4c83 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/model/AreaModel.java @@ -0,0 +1,125 @@ +package com.casic.app.smartwell.sanxi.model; + +public class AreaModel { + + private int code; + private DataBean data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataBean getData() { + return data; + } + + public void setData(DataBean data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private String area; + private String communications; + private String deptid; + private String deviceTypes; + private String id; + private String lat; + private String lng; + private String map; + private String wellTypes; + + public String getArea() { + return area; + } + + public void setArea(String area) { + this.area = area; + } + + public String getCommunications() { + return communications; + } + + public void setCommunications(String communications) { + this.communications = communications; + } + + public String getDeptid() { + return deptid; + } + + public void setDeptid(String deptid) { + this.deptid = deptid; + } + + public String getDeviceTypes() { + return deviceTypes; + } + + public void setDeviceTypes(String deviceTypes) { + this.deviceTypes = deviceTypes; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getLat() { + return lat; + } + + public void setLat(String lat) { + this.lat = lat; + } + + public String getLng() { + return lng; + } + + public void setLng(String lng) { + this.lng = lng; + } + + public String getMap() { + return map; + } + + public void setMap(String map) { + this.map = map; + } + + public String getWellTypes() { + return wellTypes; + } + + public void setWellTypes(String wellTypes) { + this.wellTypes = wellTypes; + } + } +} diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/model/DistrictModel.java b/app/src/main/java/com/casic/app/smartwell/sanxi/model/DistrictModel.java new file mode 100644 index 0000000..02e9ef2 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/model/DistrictModel.java @@ -0,0 +1,172 @@ +package com.casic.app.smartwell.sanxi.model; + +import java.util.List; + +public class DistrictModel { + + private int code; + private List data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public List getData() { + return data; + } + + public void setData(List data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private String id; + private String isSync; + private String lat; + private int level; + private String levelName; + private String lng; + private String name; + private int num; + private String pName; + private String pid; + private String pids; + private String simplename; + private String targetIdSync; + private String targetPidSync; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getIsSync() { + return isSync; + } + + public void setIsSync(String isSync) { + this.isSync = isSync; + } + + public String getLat() { + return lat; + } + + public void setLat(String lat) { + this.lat = lat; + } + + public int getLevel() { + return level; + } + + public void setLevel(int level) { + this.level = level; + } + + public String getLevelName() { + return levelName; + } + + public void setLevelName(String levelName) { + this.levelName = levelName; + } + + public String getLng() { + return lng; + } + + public void setLng(String lng) { + this.lng = lng; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getNum() { + return num; + } + + public void setNum(int num) { + this.num = num; + } + + public String getPName() { + return pName; + } + + public void setPName(String pName) { + this.pName = pName; + } + + public String getPid() { + return pid; + } + + public void setPid(String pid) { + this.pid = pid; + } + + public String getPids() { + return pids; + } + + public void setPids(String pids) { + this.pids = pids; + } + + public String getSimplename() { + return simplename; + } + + public void setSimplename(String simplename) { + this.simplename = simplename; + } + + public String getTargetIdSync() { + return targetIdSync; + } + + public void setTargetIdSync(String targetIdSync) { + this.targetIdSync = targetIdSync; + } + + public String getTargetPidSync() { + return targetPidSync; + } + + public void setTargetPidSync(String targetPidSync) { + this.targetPidSync = targetPidSync; + } + } +} diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/model/StreetModel.java b/app/src/main/java/com/casic/app/smartwell/sanxi/model/StreetModel.java new file mode 100644 index 0000000..90cc7d5 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/model/StreetModel.java @@ -0,0 +1,172 @@ +package com.casic.app.smartwell.sanxi.model; + +import java.util.List; + +public class StreetModel { + + private int code; + private List data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public List getData() { + return data; + } + + public void setData(List data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private String id; + private String isSync; + private String lat; + private int level; + private String levelName; + private String lng; + private String name; + private int num; + private String pName; + private String pid; + private String pids; + private String simplename; + private String targetIdSync; + private String targetPidSync; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getIsSync() { + return isSync; + } + + public void setIsSync(String isSync) { + this.isSync = isSync; + } + + public String getLat() { + return lat; + } + + public void setLat(String lat) { + this.lat = lat; + } + + public int getLevel() { + return level; + } + + public void setLevel(int level) { + this.level = level; + } + + public String getLevelName() { + return levelName; + } + + public void setLevelName(String levelName) { + this.levelName = levelName; + } + + public String getLng() { + return lng; + } + + public void setLng(String lng) { + this.lng = lng; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getNum() { + return num; + } + + public void setNum(int num) { + this.num = num; + } + + public String getPName() { + return pName; + } + + public void setPName(String pName) { + this.pName = pName; + } + + public String getPid() { + return pid; + } + + public void setPid(String pid) { + this.pid = pid; + } + + public String getPids() { + return pids; + } + + public void setPids(String pids) { + this.pids = pids; + } + + public String getSimplename() { + return simplename; + } + + public void setSimplename(String simplename) { + this.simplename = simplename; + } + + public String getTargetIdSync() { + return targetIdSync; + } + + public void setTargetIdSync(String targetIdSync) { + this.targetIdSync = targetIdSync; + } + + public String getTargetPidSync() { + return targetPidSync; + } + + public void setTargetPidSync(String targetPidSync) { + this.targetPidSync = targetPidSync; + } + } +} diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/Constant.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/Constant.kt index bae51d6..3251baa 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/Constant.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/Constant.kt @@ -7,6 +7,7 @@ object Constant { val USER_PERMISSIONS = arrayOf( Manifest.permission.READ_EXTERNAL_STORAGE, + Manifest.permission.CAMERA, Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS, Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION, diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/FileUtils.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/FileUtils.kt index 3e9ae35..cef2d83 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/FileUtils.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/FileUtils.kt @@ -18,4 +18,13 @@ } return downloadDir.toString() } + + val imageCompressPath: String + get() { + val imageDir = File(context.getExternalFilesDir(Environment.DIRECTORY_PICTURES), "") + if (!imageDir.exists()) { + imageDir.mkdir() + } + return imageDir.toString() + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt index 19687d2..bd311a4 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt @@ -289,6 +289,77 @@ ): String /** + * 上传图片 + * 系统路径static拼接图片返回路径 + * http://xx.com/static/2019-10/8050891248624f2bbefedcb196ce89cb.jpeg + */ + @Multipart + @POST("/imageUpload") + suspend fun uploadFile( + @Header("token") token: String, + @Part file: MultipartBody.Part + ): String + + /** + * 根据部门获取区ID + * + * @param deptId + */ + @GET("/config/getAreaByDept") + suspend fun obtainAreaByDept( + @Header("token") token: String, + @Query("deptId") deptId: String + ): String + + /** + * 获取区/县等 + * + * @param pid + */ + @GET("/area/list") + suspend fun obtainDistrict( + @Header("token") token: String, + @Query("pid") pid: String + ): String + + /** + * 获取街道 + * + * @param pid + */ + @GET("/area/list") + suspend fun obtainStreet( + @Header("token") token: String, + @Query("pid") pid: String + ): String + + /** + * 编辑更新井信息 + * + * @param id + */ + @FormUrlEncoded + @POST("/well/update") + suspend fun updateWellDetail( + @Header("token") token: String, + @Field("id") id: String, + @Field("wellCode") wellCode: String, + @Field("wellName") wellName: String, + @Field("wellType") wellType: String, + @Field("deptid") deptid: String, + @Field("deep") deep: String, + @Field("position") position: String, + @Field("coordinateX") coordinateX: String, + @Field("coordinateY") coordinateY: String, + @Field("photos") photos: String, + @Field("notes") notes: String?, + @Field("qu") qu: String, + @Field("area") area: String, + @Field("responsibleDept") responsibleDept: String, + @Field("responsibleDeptName") responsibleDeptName: String + ): String + + /** * 获取工单详情 * * @param id 工单id @@ -312,18 +383,6 @@ ): String /** - * 上传图片 - * 系统路径static拼接图片返回路径 - * http://xx.com/static/2019-10/8050891248624f2bbefedcb196ce89cb.jpeg - */ - @Multipart - @POST("/imageUpload") - suspend fun uploadImage( - @Header("token") token: String, - @Part file: MultipartBody.Part - ): String - - /** * 查找同一单位下的用户 * * @param hasMine 是否包含本人,1包含, 0不包含 diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt index efd6b11..e35e976 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt @@ -3,6 +3,10 @@ import com.casic.app.smartwell.sanxi.model.PublicKeyModel import com.casic.app.smartwell.sanxi.utils.AuthenticationHelper import com.casic.app.smartwell.sanxi.utils.Constant +import okhttp3.MediaType.Companion.toMediaTypeOrNull +import okhttp3.MultipartBody +import okhttp3.RequestBody +import java.io.File object RetrofitServiceManager { @@ -272,6 +276,76 @@ return api.obtainOperationResult(AuthenticationHelper.token!!, wellId, bfzt) } + /** + * 上传图片 + */ + suspend fun uploadFile(image: File): String { + val requestBody = RequestBody.create("image/png".toMediaTypeOrNull(), image) + val imagePart = MultipartBody.Part.createFormData("file", image.name, requestBody) + return api.uploadFile(AuthenticationHelper.token!!, imagePart) + } + + /** + * 根据部门获取区ID + */ + suspend fun obtainAreaByDept(deptId: String): String { + return api.obtainAreaByDept(AuthenticationHelper.token!!, deptId) + } + + /** + * 获取区/县等 + */ + suspend fun obtainDistrict(pid: String): String { + return api.obtainDistrict(AuthenticationHelper.token!!, pid) + } + + /** + * 获取街道 + */ + suspend fun obtainStreet(pid: String): String { + return api.obtainStreet(AuthenticationHelper.token!!, pid) + } + + /** + * 编辑更新井信息 + */ + suspend fun updateWellDetail( + id: String, + wellCode: String, + wellName: String, + wellType: String, + deptid: String, + deep: String, + position: String, + coordinateX: String, + coordinateY: String, + photos: String, + notes: String?, + qu: String, + area: String, + responsibleDept: String, + responsibleDeptName: String + ): String { + return api.updateWellDetail( + AuthenticationHelper.token!!, + id, + wellCode, + wellName, + wellType, + deptid, + deep, + position, + coordinateX, + coordinateY, + photos, + notes, + qu, + area, + responsibleDept, + responsibleDeptName + ) + } + // /** // * 获取工单详情 // */ @@ -287,15 +361,6 @@ // } // // /** -// * 上传图片 -// */ -// suspend fun uploadImage(image: File): String { -// val requestBody = RequestBody.create("image/png".toMediaTypeOrNull(), image) -// val imagePart = MultipartBody.Part.createFormData("file", image.name, requestBody) -// return api.uploadImage(AuthenticationHelper.token!!, imagePart) -// } -// -// /** // * 查找同一单位下的用户 // */ // suspend fun obtainSubordinate(hasMine: String?, roleTips: String?): String { diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/EditWellActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/EditWellActivity.kt new file mode 100644 index 0000000..956dbce --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/EditWellActivity.kt @@ -0,0 +1,341 @@ +package com.casic.app.smartwell.sanxi.view + +import android.app.Activity +import android.content.Intent +import android.view.View +import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.GridLayoutManager +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.adapter.EditableImageAdapter +import com.casic.app.smartwell.sanxi.base.BaseActivity +import com.casic.app.smartwell.sanxi.extensions.combineImagePath +import com.casic.app.smartwell.sanxi.extensions.navigatePageTo +import com.casic.app.smartwell.sanxi.extensions.reformat +import com.casic.app.smartwell.sanxi.extensions.show +import com.casic.app.smartwell.sanxi.model.DistrictModel +import com.casic.app.smartwell.sanxi.model.OwnerShipModel +import com.casic.app.smartwell.sanxi.model.WellListPageModel +import com.casic.app.smartwell.sanxi.utils.* +import com.casic.app.smartwell.sanxi.vm.AuthenticateViewModel +import com.casic.app.smartwell.sanxi.vm.UploadFileViewModel +import com.casic.app.smartwell.sanxi.vm.WellViewModel +import com.casic.app.smartwell.sanxi.widgets.BottomAreaSheet +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken +import com.luck.picture.lib.PictureSelector +import com.luck.picture.lib.config.PictureConfig +import com.luck.picture.lib.config.PictureMimeType +import com.pengxh.app.multilib.widget.dialog.BottomActionSheet +import com.qmuiteam.qmui.widget.dialog.QMUIBottomSheet +import kotlinx.android.synthetic.main.activity_edit_well.* +import kotlinx.android.synthetic.main.include_base_title.* +import java.io.File + +class EditWellActivity : BaseActivity() { + + private val kTag = "EditWellActivity" + private lateinit var wellViewModel: WellViewModel + private lateinit var authenticateViewModel: AuthenticateViewModel + private lateinit var uploadImageViewModel: UploadFileViewModel + private lateinit var wellBeanJson: String + private lateinit var imageAdapter: EditableImageAdapter + private lateinit var wellBean: WellListPageModel.DataBean.RowsBean + private val imagePaths: ArrayList = ArrayList() //服务器返回的拍照数据集 + private val realPaths: ArrayList = ArrayList() //真实图片路径 + private val districtModels: ArrayList = ArrayList() //行政区 + private var wellType = "" + private var deptId = "" + private var districtId = "" + private var streetId = "" + + override fun initLayoutView(): Int = R.layout.activity_edit_well + + override fun setupTopBarLayout() { + leftBackView.setOnClickListener { finish() } + titleView.text = "编辑井信息" + } + + override fun initData() { + wellViewModel = ViewModelProvider(this).get(WellViewModel::class.java) + authenticateViewModel = ViewModelProvider(this).get(AuthenticateViewModel::class.java) + uploadImageViewModel = ViewModelProvider(this).get(UploadFileViewModel::class.java) + wellBeanJson = intent.getStringExtra(Constant.INTENT_PARAM)!! + wellBean = Gson().fromJson( + wellBeanJson, object : TypeToken() {}.type + ) + wellNameView.setText(wellBean.wellName) + wellCodeView.text = wellBean.wellCode + + this.wellType = wellBean.wellType + wellTypeView.text = wellBean.wellTypeName + + this.deptId = wellBean.deptid + ownerShipView.text = wellBean.deptName + wellDepthView.setText(wellBean.deep) + longitudeView.setText(wellBean.lngGaode) + latitudeView.setText(wellBean.latGaode) + + /** + * 2022-06/e805917f14ed49378bbd29cae391b061.png; + * 2022-06/48d34f27695346bbb39d695333faabee.png; + * 2022-06/6df199418fd84960a164ad9c9660e172.png; + * 2022-06/bfbab97a965d406ba30fc9d09ab35f5c.png; + * */ + //显示已有的图片 + val imageArray = wellBean.photos.toString().split(";") + imageArray.forEach { path -> + if (path.isNotBlank()) { + imagePaths.add(path) + realPaths.add(path.combineImagePath()) + } + } + imageAdapter = EditableImageAdapter(this) + imageAdapter.setupImage(realPaths) + imageRecyclerView.layoutManager = GridLayoutManager(this, 3) + imageRecyclerView.adapter = imageAdapter + + //默认加载当前井的区域 + authenticateViewModel.obtainAreaByDept(wellBean.deptid) + authenticateViewModel.areaModel.observe(this, { + if (it.code == 200) { + authenticateViewModel.obtainDistrict(it.data.area) + } + }) + addressView.setText(wellBean.position) + } + + override fun initEvent() { + wellCodeView.setOnClickListener { + "井编号不可编辑".show() + } + + wellTypeView.setOnClickListener { + wellViewModel.obtainWellType() + } + wellViewModel.wellTypeModel.observe(this, { + if (it.code == 200) { + val sheetBuilder = QMUIBottomSheet.BottomListSheetBuilder(this) + sheetBuilder.setTitle("井类型") + it.data.forEach { type -> + sheetBuilder.addItem(type.name) + } + sheetBuilder.setGravityCenter(true) + .setOnSheetItemClickListener { dialog, _, position, tag -> + this.wellType = it.data[position].value + wellTypeView.text = tag + + dialog.dismiss() + }.build().show() + } + }) + + ownerShipView.setOnClickListener { + authenticateViewModel.obtainOwnerShip("03") + } + + imageAdapter.setOnItemClickListener(object : EditableImageAdapter.OnItemClickListener { + override fun onAddImageClick() { + selectPicture() + } + + override fun onItemClick(position: Int) { + if (realPaths[position].isBlank()) { + "图片加载失败,无法查看大图".show() + } else { + navigatePageTo(position, realPaths) + } + } + + override fun onItemLongClick(view: View?, position: Int) { + imagePaths.removeAt(position) + imageAdapter.deleteImage(position) + } + }) + + authenticateViewModel.resultModel.observe(this, { + if (it.code == 200) { + val ownerShipModel: MutableList = ArrayList() + it.data?.list?.forEach { listBean -> + ownerShipModel.add(listBean) + } + val sheetBuilder = QMUIBottomSheet.BottomListSheetBuilder(this) + sheetBuilder.setTitle("权属单位") + ownerShipModel.forEach { model -> + sheetBuilder.addItem(model.name) + } + sheetBuilder.setGravityCenter(true) + .setOnSheetItemClickListener { dialog, _, position, tag -> + this.deptId = it.data?.list!![position].id + ownerShipView.text = tag + + dialog.dismiss() + }.build().show() + } + }) + + authenticateViewModel.districtModel.observe(this, { + if (it.code == 200) { + it.data.forEach { area -> + districtModels.add(area) + //判断区 + if (area.id == wellBean.qu) { + authenticateViewModel.obtainStreet(area.id) + authenticateViewModel.streetModel.observe(this, { street -> + if (street.code == 200) { + street.data.forEach { streetData -> + //判断街道 + if (streetData.id == wellBean.area) { + districtView.text = + String.format("${area.name}${streetData.name}") + } + } + } + }) + } + } + } + }) + + //点击选择井的区域 + districtView.setOnClickListener { + if (districtModels.isNullOrEmpty()) { + "无行政区域数据,无法修改".show() + return@setOnClickListener + } + BottomAreaSheet.Builder() + .setContext(this) + .setLifecycleOwner(this) + .setDistrictAreaData(districtModels) + .setChildDataViewModel(authenticateViewModel) + .setOnActionSheetListener(object : BottomAreaSheet.OnActionSheetListener { + override fun onAreaSelected( + area: String?, districtId: String, streetId: String + ) { + districtView.text = area?.replace("-", "") + this@EditWellActivity.districtId = districtId + this@EditWellActivity.streetId = streetId + } + }) + .build().show() + } + + //提交修改 + saveButton.setOnClickListener { + if (districtId.isEmpty() || streetId.isEmpty()) { + "行政区ID为空或者街道ID为空".show() + return@setOnClickListener + } + wellViewModel.updateWellDetail( + id = wellBean.id, + wellCode = wellBean.wellCode, + wellName = wellNameView.text.toString(), + wellType = wellType, + deptid = deptId, + deep = wellDepthView.text.toString(), + position = addressView.text.toString(), + coordinateX = longitudeView.text.toString(), + coordinateY = latitudeView.text.toString(), + photos = imagePaths.reformat(), + notes = "", + qu = districtId, + area = streetId, + responsibleDept = deptId, + responsibleDeptName = ownerShipView.text.toString() + ) + } + + uploadImageViewModel.resultModel.observe(this, { model -> + if (model.code == 200) { + /** + * 显示图片 + * path: 2021-07\c670eac17d644b179a4324a34bb84329.jpeg + * */ + /** + * 显示图片 + * path: 2021-07\c670eac17d644b179a4324a34bb84329.jpeg + * */ + val sumItemCount: Int = imageAdapter.itemCount + 1 //每上传一张图片,图片总数都是在原有的基础上+1 + if (sumItemCount <= 5) { + val url = model.data + //let函数处理需要针对一个可null的对象统一做判空处理。 + url?.let { + imagePaths.add(it) + realPaths.add(it.combineImagePath()) + } + imageAdapter.setupImage(realPaths) + } else { + "最多只能上传4张图片".show() + } + } + }) + uploadImageViewModel.loadState.observe(this, { + DialogHelper.dismissLoadingDialog() + }) + + wellViewModel.loadState.observe(this, { + when (it) { + is LoadState.Loading -> { + DialogHelper.showLoadingDialog(this, "保存中,请稍后...") + } + is LoadState.Success -> { + DialogHelper.dismissLoadingDialog() + finish() + } + else -> { + DialogHelper.dismissLoadingDialog() + } + } + }) + } + + private fun selectPicture() { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitles(arrayOf("拍照", "相册")) + .setOnActionSheetListener { position -> + when (position) { + 0 -> { + PictureSelector.create(this) + .openCamera(PictureMimeType.ofImage()) + .isCompress(true) + .compressSavePath(FileUtils.imageCompressPath) + .imageEngine(GlideLoadEngine.createGlideEngine()) + .forResult(PictureConfig.REQUEST_CAMERA) + } + 1 -> { + PictureSelector.create(this) + .openGallery(PictureMimeType.ofImage()) + .isWeChatStyle(true) + .isCamera(false) + .isCompress(true) + .compressSavePath(FileUtils.imageCompressPath) + .imageEngine(GlideLoadEngine.createGlideEngine()) + .maxSelectNum(4) + .forResult(PictureConfig.CHOOSE_REQUEST) + } + } + }.build().show() + } + + override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { + super.onActivityResult(requestCode, resultCode, data) + if (resultCode == Activity.RESULT_OK) { + when (requestCode) { + PictureConfig.CHOOSE_REQUEST -> { + val selectResult = PictureSelector.obtainMultipleResult(data) + DialogHelper.showLoadingDialog(this, "图片上传中,请稍后...") + for (res in selectResult) { + val file = File(res.compressPath) + //上传图片 + uploadImageViewModel.uploadFile(file) + } + } + PictureConfig.REQUEST_CAMERA -> { + val cameraResult = PictureSelector.obtainMultipleResult(data)[0] + //上传图片 + uploadImageViewModel.uploadFile(File(cameraResult.compressPath)) + } + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellDetailActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellDetailActivity.kt index 50c9e05..6c93e4e 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellDetailActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellDetailActivity.kt @@ -9,28 +9,30 @@ import com.amap.api.maps.model.CameraPosition import com.amap.api.maps.model.LatLng import com.amap.api.maps.model.MarkerOptions -import com.amap.api.services.core.LatLonPoint -import com.amap.api.services.geocoder.GeocodeResult -import com.amap.api.services.geocoder.GeocodeSearch -import com.amap.api.services.geocoder.RegeocodeQuery -import com.amap.api.services.geocoder.RegeocodeResult import com.casic.app.smartwell.sanxi.R import com.casic.app.smartwell.sanxi.base.BaseActivity import com.casic.app.smartwell.sanxi.extensions.show import com.casic.app.smartwell.sanxi.utils.Constant import com.casic.app.smartwell.sanxi.utils.DialogHelper import com.casic.app.smartwell.sanxi.utils.LoadState +import com.casic.app.smartwell.sanxi.vm.AuthenticateViewModel import com.casic.app.smartwell.sanxi.vm.WellViewModel import com.pengxh.app.multilib.widget.dialog.AlertMessageDialog import kotlinx.android.synthetic.main.activity_well_detail.* +import kotlinx.android.synthetic.main.activity_well_detail.wellCodeView +import kotlinx.android.synthetic.main.activity_well_detail.wellDepthView +import kotlinx.android.synthetic.main.activity_well_detail.wellNameView +import kotlinx.android.synthetic.main.activity_well_detail.wellStateView +import kotlinx.android.synthetic.main.activity_well_detail.wellTypeView +import kotlinx.android.synthetic.main.activity_well_list_detail.* import kotlinx.android.synthetic.main.include_base_title.* class WellDetailActivity : BaseActivity(), AMap.OnMapLoadedListener { private val kTag = "WellDetailActivity" - private val geocoderSearch by lazy { GeocodeSearch(this) } private lateinit var wellViewModel: WellViewModel + private lateinit var authenticateViewModel: AuthenticateViewModel private lateinit var wellId: String private lateinit var aMap: AMap private var latLng: LatLng? = null @@ -46,6 +48,7 @@ override fun initData() { wellId = intent.getStringExtra(Constant.INTENT_PARAM)!! wellViewModel = ViewModelProvider(this).get(WellViewModel::class.java) + authenticateViewModel = ViewModelProvider(this).get(AuthenticateViewModel::class.java) aMap = wellMapView.map aMap.mapType = AMap.MAP_TYPE_NORMAL @@ -103,39 +106,41 @@ val wellPosition = wellDetail.position.toString() wellLocationView.text = wellPosition - //根据经纬度获取省市区县 if (wellDetail.latGaode.isBlank() || wellDetail.lngGaode.isBlank()) { "井经纬度异常,无法查看完整位置信息".show() return@observe } this.latLng = LatLng(wellDetail.latGaode.toDouble(), wellDetail.lngGaode.toDouble()) - val queryParam = RegeocodeQuery( - LatLonPoint(wellDetail.latGaode.toDouble(), wellDetail.lngGaode.toDouble()), - 200f, - GeocodeSearch.AMAP - ) - tipsImageView.setOnClickListener { - geocoderSearch.getFromLocationAsyn(queryParam) + authenticateViewModel.obtainAreaByDept(wellDetail.deptid) } - - geocoderSearch.setOnGeocodeSearchListener(object : - GeocodeSearch.OnGeocodeSearchListener { - override fun onRegeocodeSearched(result: RegeocodeResult?, rCode: Int) { - if (rCode == 1000) { - AlertMessageDialog.Builder() - .setContext(this@WellDetailActivity) - .setTitle("闸井完整位置") - .setMessage(result?.regeocodeAddress?.formatAddress + "-" + wellPosition) - .setPositiveButton("知道了").setOnDialogButtonClickListener {}.build() - .show() - } else { - "获取该闸井详细位置信息失败".show() - } + authenticateViewModel.areaModel.observe(this, { areaModel -> + if (areaModel.code == 200) { + authenticateViewModel.obtainDistrict(areaModel.data.area) } - - override fun onGeocodeSearched(result: GeocodeResult?, rCode: Int) { - + }) + authenticateViewModel.districtModel.observe(this, { districtModel -> + if (districtModel.code == 200) { + districtModel.data.forEach { area -> + if (area.id == wellDetail.qu) { + authenticateViewModel.obtainStreet(area.id) + authenticateViewModel.streetModel.observe(this, { street -> + if (street.code == 200) { + street.data.forEach { streetData -> + if (streetData.id == wellDetail.area) { + AlertMessageDialog.Builder() + .setContext(this@WellDetailActivity) + .setTitle("闸井完整位置") + .setMessage(String.format("${area.name}${streetData.name}") + "-" + wellPosition) + .setPositiveButton("知道了") + .setOnDialogButtonClickListener {}.build() + .show() + } + } + } + }) + } + } } }) } diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellListDetailActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellListDetailActivity.kt index b34be03..d28b752 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellListDetailActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellListDetailActivity.kt @@ -4,11 +4,6 @@ import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.GridLayoutManager import androidx.recyclerview.widget.LinearLayoutManager -import com.amap.api.services.core.LatLonPoint -import com.amap.api.services.geocoder.GeocodeResult -import com.amap.api.services.geocoder.GeocodeSearch -import com.amap.api.services.geocoder.RegeocodeQuery -import com.amap.api.services.geocoder.RegeocodeResult import com.casic.app.smartwell.sanxi.R import com.casic.app.smartwell.sanxi.adapter.DeviceDataListAdapter import com.casic.app.smartwell.sanxi.adapter.DeviceDataTitleAdapter @@ -19,6 +14,7 @@ import com.casic.app.smartwell.sanxi.extensions.show import com.casic.app.smartwell.sanxi.model.WellListPageModel import com.casic.app.smartwell.sanxi.utils.Constant +import com.casic.app.smartwell.sanxi.vm.AuthenticateViewModel import com.casic.app.smartwell.sanxi.vm.WellViewModel import com.google.gson.Gson import com.google.gson.reflect.TypeToken @@ -28,8 +24,8 @@ class WellListDetailActivity : BaseActivity() { private val kTag = "WellListDetailActivity" - private val geocoderSearch by lazy { GeocodeSearch(this) } private lateinit var wellViewModel: WellViewModel + private lateinit var authenticateViewModel: AuthenticateViewModel private lateinit var wellBeanJson: String override fun initLayoutView(): Int = R.layout.activity_well_list_detail @@ -41,6 +37,7 @@ override fun initData() { wellViewModel = ViewModelProvider(this).get(WellViewModel::class.java) + authenticateViewModel = ViewModelProvider(this).get(AuthenticateViewModel::class.java) wellBeanJson = intent.getStringExtra(Constant.INTENT_PARAM)!! val wellBean = Gson().fromJson( wellBeanJson, object : TypeToken() {}.type @@ -89,29 +86,32 @@ }) } - //根据经纬度获取省市区县 - if (wellBean.latGaode.isBlank() || wellBean.lngGaode.isBlank()) { - "井经纬度异常,无法查看完整位置信息".show() - return - } - val queryParam = RegeocodeQuery( - LatLonPoint(wellBean.latGaode.toDouble(), wellBean.lngGaode.toDouble()), - 200f, - GeocodeSearch.AMAP - ) - geocoderSearch.getFromLocationAsyn(queryParam) - geocoderSearch.setOnGeocodeSearchListener(object : - GeocodeSearch.OnGeocodeSearchListener { - override fun onRegeocodeSearched(result: RegeocodeResult?, rCode: Int) { - if (rCode == 1000) { - districtView.text = result?.regeocodeAddress?.formatAddress - } - } - - override fun onGeocodeSearched(result: GeocodeResult?, rCode: Int) { - + authenticateViewModel.obtainAreaByDept(wellBean.deptid) + authenticateViewModel.areaModel.observe(this, { + if (it.code == 200) { + authenticateViewModel.obtainDistrict(it.data.area) } }) + authenticateViewModel.districtModel.observe(this, { + if (it.code == 200) { + it.data.forEach { area -> + if (area.id == wellBean.qu) { + authenticateViewModel.obtainStreet(area.id) + authenticateViewModel.streetModel.observe(this, { street -> + if (street.code == 200) { + street.data.forEach { streetData -> + if (streetData.id == wellBean.area) { + districtView.text = + String.format("${area.name}${streetData.name}") + } + } + } + }) + } + } + } + }) + addressView.text = wellBean.position maintenanceView.text = wellBean.responsibleDeptName diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellManageActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellManageActivity.kt index 1cd5616..8fc415b 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellManageActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellManageActivity.kt @@ -251,7 +251,7 @@ } override fun onEditClicked(position: Int) { - + navigatePageTo(dataBeans[position].toJson()) } override fun onOperationClicked(position: Int) { diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/vm/AuthenticateViewModel.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/vm/AuthenticateViewModel.kt index 5186591..4632b20 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/vm/AuthenticateViewModel.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/vm/AuthenticateViewModel.kt @@ -3,8 +3,7 @@ import androidx.lifecycle.MutableLiveData import com.casic.app.smartwell.sanxi.base.BaseViewModel import com.casic.app.smartwell.sanxi.extensions.* -import com.casic.app.smartwell.sanxi.model.OwnerShipModel -import com.casic.app.smartwell.sanxi.model.PublicKeyModel +import com.casic.app.smartwell.sanxi.model.* import com.casic.app.smartwell.sanxi.utils.Constant import com.casic.app.smartwell.sanxi.utils.LoadState import com.casic.app.smartwell.sanxi.utils.SaveKeyValues @@ -18,6 +17,9 @@ private val gson = Gson() val keyModel = MutableLiveData() val resultModel = MutableLiveData() + val areaModel = MutableLiveData() + val districtModel = MutableLiveData() + val streetModel = MutableLiveData() fun obtainPublicKey() = launch({ loadState.value = LoadState.Loading @@ -62,4 +64,55 @@ }, { it.printStackTrace() }) + + /** + * 根据部门获取区ID + */ + fun obtainAreaByDept(deptId: String) = launch({ + val response = RetrofitServiceManager.obtainAreaByDept(deptId) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + areaModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + response.toErrorMessage().show() + } + }, { + it.printStackTrace() + }) + + /** + * 区/县等 + */ + fun obtainDistrict(pid: String) = launch({ + val response = RetrofitServiceManager.obtainDistrict(pid) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + districtModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + response.toErrorMessage().show() + } + }, { + it.printStackTrace() + }) + + /** + * 街道 + */ + fun obtainStreet(areaId: String) = launch({ + val response = RetrofitServiceManager.obtainStreet(areaId) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + streetModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + response.toErrorMessage().show() + } + }, { + it.printStackTrace() + }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/vm/UploadFileViewModel.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/vm/UploadFileViewModel.kt new file mode 100644 index 0000000..fe9d357 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/vm/UploadFileViewModel.kt @@ -0,0 +1,36 @@ +package com.casic.app.smartwell.sanxi.vm + +import androidx.lifecycle.MutableLiveData +import com.casic.app.smartwell.sanxi.base.BaseViewModel +import com.casic.app.smartwell.sanxi.extensions.launch +import com.casic.app.smartwell.sanxi.extensions.separateResponseCode +import com.casic.app.smartwell.sanxi.extensions.show +import com.casic.app.smartwell.sanxi.extensions.toErrorMessage +import com.casic.app.smartwell.sanxi.model.CommonResultModel +import com.casic.app.smartwell.sanxi.utils.LoadState +import com.casic.app.smartwell.sanxi.utils.retrofit.RetrofitServiceManager +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken +import java.io.File + +class UploadFileViewModel : BaseViewModel() { + + private val gson = Gson() + val resultModel = MutableLiveData() + + fun uploadFile(image: File) = launch({ + val response = RetrofitServiceManager.uploadFile(image) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + resultModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show() + } + }, { + loadState.value = LoadState.Fail + }) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/vm/WellViewModel.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/vm/WellViewModel.kt index 696dbf0..8e59b91 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/vm/WellViewModel.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/vm/WellViewModel.kt @@ -1,5 +1,6 @@ package com.casic.app.smartwell.sanxi.vm +import android.util.Log import androidx.lifecycle.MutableLiveData import com.casic.app.smartwell.sanxi.base.BaseViewModel import com.casic.app.smartwell.sanxi.extensions.launch @@ -15,6 +16,7 @@ class WellViewModel : BaseViewModel() { + private val kTag = "WellViewModel" private val gson = Gson() val detailModel = MutableLiveData() val allWellModel = MutableLiveData() @@ -152,4 +154,58 @@ loadState.value = LoadState.Fail it.printStackTrace() }) + + /** + * 编辑更新井信息 + * */ + fun updateWellDetail( + id: String, + wellCode: String, + wellName: String, + wellType: String, + deptid: String, + deep: String, + position: String, + coordinateX: String, + coordinateY: String, + photos: String, + notes: String?, + qu: String, + area: String, + responsibleDept: String, + responsibleDeptName: String + ) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.updateWellDetail( + id, + wellCode, + wellName, + wellType, + deptid, + deep, + position, + coordinateX, + coordinateY, + photos, + notes, + qu, + area, + responsibleDept, + responsibleDeptName + ) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + "更新成功".show() + commonResultModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show() + } + }, { + loadState.value = LoadState.Fail + it.printStackTrace() + }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/widgets/BottomAreaSheet.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/widgets/BottomAreaSheet.kt new file mode 100644 index 0000000..5f464be --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/widgets/BottomAreaSheet.kt @@ -0,0 +1,213 @@ +package com.casic.app.smartwell.sanxi.widgets + +import android.app.Dialog +import android.content.Context +import android.os.Bundle +import android.view.* +import android.widget.AbsListView +import android.widget.AdapterView +import android.widget.BaseAdapter +import android.widget.TextView +import androidx.lifecycle.LifecycleOwner +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseViewModel +import com.casic.app.smartwell.sanxi.extensions.initDialogLayoutParams +import com.casic.app.smartwell.sanxi.extensions.show +import com.casic.app.smartwell.sanxi.model.DistrictModel +import com.casic.app.smartwell.sanxi.model.StreetModel +import com.casic.app.smartwell.sanxi.vm.AuthenticateViewModel +import com.pengxh.app.multilib.utils.SizeUtil +import kotlinx.android.synthetic.main.sheet_bottom_area.* + +class BottomAreaSheet private constructor(builder: Builder) : Dialog( + builder.context, R.style.ActionSheetDialogStyle +) { + private val owner: LifecycleOwner = builder.owner + private val firstLevelArea: List = builder.firstLevelArea + private val vm: BaseViewModel = builder.vm + private val listener: OnActionSheetListener = builder.listener + + class Builder { + lateinit var context: Context + lateinit var owner: LifecycleOwner + lateinit var firstLevelArea: List + lateinit var vm: BaseViewModel + lateinit var listener: OnActionSheetListener + + fun setContext(context: Context): Builder { + this.context = context + return this + } + + fun setLifecycleOwner(owner: LifecycleOwner): Builder { + this.owner = owner + return this + } + + fun setDistrictAreaData(firstLevelArea: List): Builder { + this.firstLevelArea = firstLevelArea + return this + } + + fun setChildDataViewModel(vm: BaseViewModel): Builder { + this.vm = vm + return this + } + + fun setOnActionSheetListener(listener: OnActionSheetListener): Builder { + this.listener = listener + return this + } + + fun build(): BottomAreaSheet { + return BottomAreaSheet(this) + } + } + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + this.initDialogLayoutParams(Gravity.BOTTOM, R.style.ActionSheetDialogAnimation, 1.0f) + setContentView(R.layout.sheet_bottom_area) + setCancelable(false) + setCanceledOnTouchOutside(false) + + dismissView.setOnClickListener { dismiss() } + + var districtId = "" + var streetId = "" + //街道 + val authenticateViewModel = vm as AuthenticateViewModel + //默认加载第一个区的街道 + val firstDistrict = firstLevelArea[0] + var districtName = if (firstDistrict.simplename.toString().isBlank()) + firstDistrict.simplename + else + firstDistrict.name + selectedAreaView.text = districtName + authenticateViewModel.obtainStreet(firstDistrict.id) + + //行政区 + firstAreaListView.adapter = DistrictDataAdapter(firstLevelArea) + firstAreaListView.onItemClickListener = AdapterView.OnItemClickListener { _, _, i, _ -> + //只选择到一级区域 + districtName = if (firstLevelArea[i].simplename.toString().isBlank()) + firstLevelArea[i].simplename + else + firstLevelArea[i].name + districtId = firstLevelArea[i].id + selectedAreaView.text = districtName + + if (districtId.isBlank()) { + "一级区域ID为空,无法获取下级街道列表".show() + return@OnItemClickListener + } + authenticateViewModel.obtainStreet(districtId) + } + authenticateViewModel.streetModel.observe(owner, { + if (it.code == 200) { + val streetModels = it.data + secondAreaListView.adapter = StreetDataAdapter(streetModels) + secondAreaListView.onItemClickListener = + AdapterView.OnItemClickListener { _, _, i, _ -> + val streetName = if (streetModels[i].simplename.toString().isBlank()) + streetModels[i].simplename + else + streetModels[i].name + streetId = streetModels[i].id + selectedAreaView.text = String.format("$districtName-$streetName") + } + } + }) + + sheetConfirmButton.setOnClickListener { + listener.onAreaSelected(selectedAreaView.text.toString(), districtId, streetId) + dismiss() + } + } + + interface OnActionSheetListener { + fun onAreaSelected(area: String?, districtId: String, streetId: String) + } + + internal inner class DistrictDataAdapter(private val dataBeans: List) : + BaseAdapter() { + + private val inflater: LayoutInflater = LayoutInflater.from(context) + + override fun getCount(): Int = dataBeans.size + + override fun getItem(position: Int): Any = dataBeans[position] + + override fun getItemId(position: Int): Long = position.toLong() + + override fun getView(position: Int, convertView: View?, parent: ViewGroup): View { + val view: View + val holder: ItemViewHolder + if (convertView == null) { + holder = ItemViewHolder() + view = inflater.inflate(R.layout.item_area_sheet, null) + holder.areaItemView = view.findViewById(R.id.areaItemView) + view.tag = holder + } else { + view = convertView + holder = view.tag as ItemViewHolder + } + val dataBean = dataBeans[position] + holder.areaItemView.setBackgroundResource(R.drawable.sheet_item_selector) + holder.areaItemView.text = + if (dataBean.simplename.toString().isBlank()) dataBean.simplename else dataBean.name + //需要动态设置item的高度 + val param = AbsListView.LayoutParams( + WindowManager.LayoutParams.MATCH_PARENT, + SizeUtil.dp2px(context, 46f) + ) + view.layoutParams = param + return view + } + + internal inner class ItemViewHolder { + lateinit var areaItemView: TextView + } + } + + internal inner class StreetDataAdapter(private val dataBeans: List) : + BaseAdapter() { + + private val inflater: LayoutInflater = LayoutInflater.from(context) + + override fun getCount(): Int = dataBeans.size + + override fun getItem(position: Int): Any = dataBeans[position] + + override fun getItemId(position: Int): Long = position.toLong() + + override fun getView(position: Int, convertView: View?, parent: ViewGroup): View { + val view: View + val holder: ItemViewHolder + if (convertView == null) { + holder = ItemViewHolder() + view = inflater.inflate(R.layout.item_area_sheet, null) + holder.areaItemView = view.findViewById(R.id.areaItemView) + view.tag = holder + } else { + view = convertView + holder = view.tag as ItemViewHolder + } + val dataBean = dataBeans[position] + holder.areaItemView.setBackgroundResource(R.drawable.sheet_item_selector) + holder.areaItemView.text = + if (dataBean.simplename.toString().isBlank()) dataBean.simplename else dataBean.name + //需要动态设置item的高度 + val param = AbsListView.LayoutParams( + WindowManager.LayoutParams.MATCH_PARENT, + SizeUtil.dp2px(context, 46f) + ) + view.layoutParams = param + return view + } + + internal inner class ItemViewHolder { + lateinit var areaItemView: TextView + } + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_solid_layout_white_radius_top_10.xml b/app/src/main/res/drawable/bg_solid_layout_white_radius_top_10.xml new file mode 100644 index 0000000..9570167 --- /dev/null +++ b/app/src/main/res/drawable/bg_solid_layout_white_radius_top_10.xml @@ -0,0 +1,10 @@ + + + + + + + \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index fdf5fc7..804f233 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -102,8 +102,6 @@ implementation 'com.google.code.gson:gson:2.8.6' //上拉加载下拉刷新 implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' - //高德地图搜索 - implementation 'com.amap.api:search:8.1.0' //高德导航 implementation 'com.amap.api:navi-3dmap:8.1.0_3dmap8.1.0' //日期选择器 diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 3fcef8b..460648b 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -9,6 +9,7 @@ + @@ -51,6 +52,7 @@ android:name=".view.BigImageActivity" android:theme="@style/Theme.BigImageActivity" /> + () { + + private val countLimit = 4 + private var imageData: ArrayList = ArrayList() + + fun setupImage(images: ArrayList) { + this.imageData = images + notifyDataSetChanged() + } + + fun deleteImage(position: Int) { + if (imageData.size != 0) { + imageData.removeAt(position) + notifyDataSetChanged() + } + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { + val imageView = ImageView(context) + val screenWidth: Int = SizeUtil.getScreenWidth(context) - SizeUtil.dp2px(context, 40f) + val margins: Int = SizeUtil.dp2px(context, 3f) + val itemSize = (screenWidth - 6 * margins) / 3 + val params = LinearLayout.LayoutParams(itemSize, itemSize) + params.setMargins(margins, margins, margins, margins) + params.gravity = Gravity.CENTER + imageView.scaleType = ImageView.ScaleType.CENTER_CROP + imageView.layoutParams = params + return ItemViewHolder(imageView) + } + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + if (position == itemCount - 1 && imageData.size < countLimit) { + holder.imageView.setImageResource(R.drawable.ic_add_pic) + holder.imageView.setOnClickListener { //添加图片 + mOnItemClickListener!!.onAddImageClick() + } + } else { + Glide.with(context).load(imageData[position]).into(holder.imageView) + holder.imageView.setOnClickListener { // 点击操作,查看大图 + mOnItemClickListener!!.onItemClick(position) + } + // 长按监听 + holder.imageView.setOnLongClickListener { v -> //长按删除 + mOnItemClickListener!!.onItemLongClick(v, position) + true + } + } + } + + override fun getItemCount(): Int { + // 满3张图就不让其添加新图 + return if (imageData.size != 0 && imageData.size >= countLimit) { + countLimit + } else { + if (imageData.size == 0) 1 else imageData.size + 1 + } + } + + private var mOnItemClickListener: OnItemClickListener? = null + + fun setOnItemClickListener(onItemClickListener: OnItemClickListener?) { + mOnItemClickListener = onItemClickListener + } + + interface OnItemClickListener { + fun onAddImageClick() + fun onItemClick(position: Int) + fun onItemLongClick(view: View?, position: Int) + } + + inner class ItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val imageView: ImageView = itemView as ImageView + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt index 3a098be..ad20c8b 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt @@ -31,7 +31,10 @@ setContentView(initLayoutView()) ImmersionBar.with(this).statusBarDarkFont(false).init() //沉浸式状态栏 when (this.javaClass.simpleName) { - "WelcomeActivity" -> ImmersionBar.with(this).statusBarDarkFont(true).init() + "WelcomeActivity" -> { + ImmersionBar.with(this).statusBarDarkFont(true).init() + StatusBarColorUtil.setColor(this, R.color.white.convertColor(this)) + } "SplashScreenActivity" -> ImmersionBar.with(this).statusBarDarkFont(false).init() "LoginActivity" -> ImmersionBar.with(this).statusBarDarkFont(true).init() else -> StatusBarColorUtil.setColor(this, R.color.mainThemeColor.convertColor(this)) diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/extensions/ArrayList.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/extensions/ArrayList.kt index e77dbaa..3affed7 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/extensions/ArrayList.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/extensions/ArrayList.kt @@ -13,7 +13,7 @@ if (index == this.size - 1) { builder.append(s) } else { - builder.append(s).append(",") + builder.append(s).append(";") } } return builder.toString() diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/model/AreaModel.java b/app/src/main/java/com/casic/app/smartwell/sanxi/model/AreaModel.java new file mode 100644 index 0000000..3ee4c83 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/model/AreaModel.java @@ -0,0 +1,125 @@ +package com.casic.app.smartwell.sanxi.model; + +public class AreaModel { + + private int code; + private DataBean data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataBean getData() { + return data; + } + + public void setData(DataBean data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private String area; + private String communications; + private String deptid; + private String deviceTypes; + private String id; + private String lat; + private String lng; + private String map; + private String wellTypes; + + public String getArea() { + return area; + } + + public void setArea(String area) { + this.area = area; + } + + public String getCommunications() { + return communications; + } + + public void setCommunications(String communications) { + this.communications = communications; + } + + public String getDeptid() { + return deptid; + } + + public void setDeptid(String deptid) { + this.deptid = deptid; + } + + public String getDeviceTypes() { + return deviceTypes; + } + + public void setDeviceTypes(String deviceTypes) { + this.deviceTypes = deviceTypes; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getLat() { + return lat; + } + + public void setLat(String lat) { + this.lat = lat; + } + + public String getLng() { + return lng; + } + + public void setLng(String lng) { + this.lng = lng; + } + + public String getMap() { + return map; + } + + public void setMap(String map) { + this.map = map; + } + + public String getWellTypes() { + return wellTypes; + } + + public void setWellTypes(String wellTypes) { + this.wellTypes = wellTypes; + } + } +} diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/model/DistrictModel.java b/app/src/main/java/com/casic/app/smartwell/sanxi/model/DistrictModel.java new file mode 100644 index 0000000..02e9ef2 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/model/DistrictModel.java @@ -0,0 +1,172 @@ +package com.casic.app.smartwell.sanxi.model; + +import java.util.List; + +public class DistrictModel { + + private int code; + private List data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public List getData() { + return data; + } + + public void setData(List data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private String id; + private String isSync; + private String lat; + private int level; + private String levelName; + private String lng; + private String name; + private int num; + private String pName; + private String pid; + private String pids; + private String simplename; + private String targetIdSync; + private String targetPidSync; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getIsSync() { + return isSync; + } + + public void setIsSync(String isSync) { + this.isSync = isSync; + } + + public String getLat() { + return lat; + } + + public void setLat(String lat) { + this.lat = lat; + } + + public int getLevel() { + return level; + } + + public void setLevel(int level) { + this.level = level; + } + + public String getLevelName() { + return levelName; + } + + public void setLevelName(String levelName) { + this.levelName = levelName; + } + + public String getLng() { + return lng; + } + + public void setLng(String lng) { + this.lng = lng; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getNum() { + return num; + } + + public void setNum(int num) { + this.num = num; + } + + public String getPName() { + return pName; + } + + public void setPName(String pName) { + this.pName = pName; + } + + public String getPid() { + return pid; + } + + public void setPid(String pid) { + this.pid = pid; + } + + public String getPids() { + return pids; + } + + public void setPids(String pids) { + this.pids = pids; + } + + public String getSimplename() { + return simplename; + } + + public void setSimplename(String simplename) { + this.simplename = simplename; + } + + public String getTargetIdSync() { + return targetIdSync; + } + + public void setTargetIdSync(String targetIdSync) { + this.targetIdSync = targetIdSync; + } + + public String getTargetPidSync() { + return targetPidSync; + } + + public void setTargetPidSync(String targetPidSync) { + this.targetPidSync = targetPidSync; + } + } +} diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/model/StreetModel.java b/app/src/main/java/com/casic/app/smartwell/sanxi/model/StreetModel.java new file mode 100644 index 0000000..90cc7d5 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/model/StreetModel.java @@ -0,0 +1,172 @@ +package com.casic.app.smartwell.sanxi.model; + +import java.util.List; + +public class StreetModel { + + private int code; + private List data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public List getData() { + return data; + } + + public void setData(List data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private String id; + private String isSync; + private String lat; + private int level; + private String levelName; + private String lng; + private String name; + private int num; + private String pName; + private String pid; + private String pids; + private String simplename; + private String targetIdSync; + private String targetPidSync; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getIsSync() { + return isSync; + } + + public void setIsSync(String isSync) { + this.isSync = isSync; + } + + public String getLat() { + return lat; + } + + public void setLat(String lat) { + this.lat = lat; + } + + public int getLevel() { + return level; + } + + public void setLevel(int level) { + this.level = level; + } + + public String getLevelName() { + return levelName; + } + + public void setLevelName(String levelName) { + this.levelName = levelName; + } + + public String getLng() { + return lng; + } + + public void setLng(String lng) { + this.lng = lng; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getNum() { + return num; + } + + public void setNum(int num) { + this.num = num; + } + + public String getPName() { + return pName; + } + + public void setPName(String pName) { + this.pName = pName; + } + + public String getPid() { + return pid; + } + + public void setPid(String pid) { + this.pid = pid; + } + + public String getPids() { + return pids; + } + + public void setPids(String pids) { + this.pids = pids; + } + + public String getSimplename() { + return simplename; + } + + public void setSimplename(String simplename) { + this.simplename = simplename; + } + + public String getTargetIdSync() { + return targetIdSync; + } + + public void setTargetIdSync(String targetIdSync) { + this.targetIdSync = targetIdSync; + } + + public String getTargetPidSync() { + return targetPidSync; + } + + public void setTargetPidSync(String targetPidSync) { + this.targetPidSync = targetPidSync; + } + } +} diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/Constant.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/Constant.kt index bae51d6..3251baa 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/Constant.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/Constant.kt @@ -7,6 +7,7 @@ object Constant { val USER_PERMISSIONS = arrayOf( Manifest.permission.READ_EXTERNAL_STORAGE, + Manifest.permission.CAMERA, Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS, Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION, diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/FileUtils.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/FileUtils.kt index 3e9ae35..cef2d83 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/FileUtils.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/FileUtils.kt @@ -18,4 +18,13 @@ } return downloadDir.toString() } + + val imageCompressPath: String + get() { + val imageDir = File(context.getExternalFilesDir(Environment.DIRECTORY_PICTURES), "") + if (!imageDir.exists()) { + imageDir.mkdir() + } + return imageDir.toString() + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt index 19687d2..bd311a4 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt @@ -289,6 +289,77 @@ ): String /** + * 上传图片 + * 系统路径static拼接图片返回路径 + * http://xx.com/static/2019-10/8050891248624f2bbefedcb196ce89cb.jpeg + */ + @Multipart + @POST("/imageUpload") + suspend fun uploadFile( + @Header("token") token: String, + @Part file: MultipartBody.Part + ): String + + /** + * 根据部门获取区ID + * + * @param deptId + */ + @GET("/config/getAreaByDept") + suspend fun obtainAreaByDept( + @Header("token") token: String, + @Query("deptId") deptId: String + ): String + + /** + * 获取区/县等 + * + * @param pid + */ + @GET("/area/list") + suspend fun obtainDistrict( + @Header("token") token: String, + @Query("pid") pid: String + ): String + + /** + * 获取街道 + * + * @param pid + */ + @GET("/area/list") + suspend fun obtainStreet( + @Header("token") token: String, + @Query("pid") pid: String + ): String + + /** + * 编辑更新井信息 + * + * @param id + */ + @FormUrlEncoded + @POST("/well/update") + suspend fun updateWellDetail( + @Header("token") token: String, + @Field("id") id: String, + @Field("wellCode") wellCode: String, + @Field("wellName") wellName: String, + @Field("wellType") wellType: String, + @Field("deptid") deptid: String, + @Field("deep") deep: String, + @Field("position") position: String, + @Field("coordinateX") coordinateX: String, + @Field("coordinateY") coordinateY: String, + @Field("photos") photos: String, + @Field("notes") notes: String?, + @Field("qu") qu: String, + @Field("area") area: String, + @Field("responsibleDept") responsibleDept: String, + @Field("responsibleDeptName") responsibleDeptName: String + ): String + + /** * 获取工单详情 * * @param id 工单id @@ -312,18 +383,6 @@ ): String /** - * 上传图片 - * 系统路径static拼接图片返回路径 - * http://xx.com/static/2019-10/8050891248624f2bbefedcb196ce89cb.jpeg - */ - @Multipart - @POST("/imageUpload") - suspend fun uploadImage( - @Header("token") token: String, - @Part file: MultipartBody.Part - ): String - - /** * 查找同一单位下的用户 * * @param hasMine 是否包含本人,1包含, 0不包含 diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt index efd6b11..e35e976 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt @@ -3,6 +3,10 @@ import com.casic.app.smartwell.sanxi.model.PublicKeyModel import com.casic.app.smartwell.sanxi.utils.AuthenticationHelper import com.casic.app.smartwell.sanxi.utils.Constant +import okhttp3.MediaType.Companion.toMediaTypeOrNull +import okhttp3.MultipartBody +import okhttp3.RequestBody +import java.io.File object RetrofitServiceManager { @@ -272,6 +276,76 @@ return api.obtainOperationResult(AuthenticationHelper.token!!, wellId, bfzt) } + /** + * 上传图片 + */ + suspend fun uploadFile(image: File): String { + val requestBody = RequestBody.create("image/png".toMediaTypeOrNull(), image) + val imagePart = MultipartBody.Part.createFormData("file", image.name, requestBody) + return api.uploadFile(AuthenticationHelper.token!!, imagePart) + } + + /** + * 根据部门获取区ID + */ + suspend fun obtainAreaByDept(deptId: String): String { + return api.obtainAreaByDept(AuthenticationHelper.token!!, deptId) + } + + /** + * 获取区/县等 + */ + suspend fun obtainDistrict(pid: String): String { + return api.obtainDistrict(AuthenticationHelper.token!!, pid) + } + + /** + * 获取街道 + */ + suspend fun obtainStreet(pid: String): String { + return api.obtainStreet(AuthenticationHelper.token!!, pid) + } + + /** + * 编辑更新井信息 + */ + suspend fun updateWellDetail( + id: String, + wellCode: String, + wellName: String, + wellType: String, + deptid: String, + deep: String, + position: String, + coordinateX: String, + coordinateY: String, + photos: String, + notes: String?, + qu: String, + area: String, + responsibleDept: String, + responsibleDeptName: String + ): String { + return api.updateWellDetail( + AuthenticationHelper.token!!, + id, + wellCode, + wellName, + wellType, + deptid, + deep, + position, + coordinateX, + coordinateY, + photos, + notes, + qu, + area, + responsibleDept, + responsibleDeptName + ) + } + // /** // * 获取工单详情 // */ @@ -287,15 +361,6 @@ // } // // /** -// * 上传图片 -// */ -// suspend fun uploadImage(image: File): String { -// val requestBody = RequestBody.create("image/png".toMediaTypeOrNull(), image) -// val imagePart = MultipartBody.Part.createFormData("file", image.name, requestBody) -// return api.uploadImage(AuthenticationHelper.token!!, imagePart) -// } -// -// /** // * 查找同一单位下的用户 // */ // suspend fun obtainSubordinate(hasMine: String?, roleTips: String?): String { diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/EditWellActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/EditWellActivity.kt new file mode 100644 index 0000000..956dbce --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/EditWellActivity.kt @@ -0,0 +1,341 @@ +package com.casic.app.smartwell.sanxi.view + +import android.app.Activity +import android.content.Intent +import android.view.View +import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.GridLayoutManager +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.adapter.EditableImageAdapter +import com.casic.app.smartwell.sanxi.base.BaseActivity +import com.casic.app.smartwell.sanxi.extensions.combineImagePath +import com.casic.app.smartwell.sanxi.extensions.navigatePageTo +import com.casic.app.smartwell.sanxi.extensions.reformat +import com.casic.app.smartwell.sanxi.extensions.show +import com.casic.app.smartwell.sanxi.model.DistrictModel +import com.casic.app.smartwell.sanxi.model.OwnerShipModel +import com.casic.app.smartwell.sanxi.model.WellListPageModel +import com.casic.app.smartwell.sanxi.utils.* +import com.casic.app.smartwell.sanxi.vm.AuthenticateViewModel +import com.casic.app.smartwell.sanxi.vm.UploadFileViewModel +import com.casic.app.smartwell.sanxi.vm.WellViewModel +import com.casic.app.smartwell.sanxi.widgets.BottomAreaSheet +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken +import com.luck.picture.lib.PictureSelector +import com.luck.picture.lib.config.PictureConfig +import com.luck.picture.lib.config.PictureMimeType +import com.pengxh.app.multilib.widget.dialog.BottomActionSheet +import com.qmuiteam.qmui.widget.dialog.QMUIBottomSheet +import kotlinx.android.synthetic.main.activity_edit_well.* +import kotlinx.android.synthetic.main.include_base_title.* +import java.io.File + +class EditWellActivity : BaseActivity() { + + private val kTag = "EditWellActivity" + private lateinit var wellViewModel: WellViewModel + private lateinit var authenticateViewModel: AuthenticateViewModel + private lateinit var uploadImageViewModel: UploadFileViewModel + private lateinit var wellBeanJson: String + private lateinit var imageAdapter: EditableImageAdapter + private lateinit var wellBean: WellListPageModel.DataBean.RowsBean + private val imagePaths: ArrayList = ArrayList() //服务器返回的拍照数据集 + private val realPaths: ArrayList = ArrayList() //真实图片路径 + private val districtModels: ArrayList = ArrayList() //行政区 + private var wellType = "" + private var deptId = "" + private var districtId = "" + private var streetId = "" + + override fun initLayoutView(): Int = R.layout.activity_edit_well + + override fun setupTopBarLayout() { + leftBackView.setOnClickListener { finish() } + titleView.text = "编辑井信息" + } + + override fun initData() { + wellViewModel = ViewModelProvider(this).get(WellViewModel::class.java) + authenticateViewModel = ViewModelProvider(this).get(AuthenticateViewModel::class.java) + uploadImageViewModel = ViewModelProvider(this).get(UploadFileViewModel::class.java) + wellBeanJson = intent.getStringExtra(Constant.INTENT_PARAM)!! + wellBean = Gson().fromJson( + wellBeanJson, object : TypeToken() {}.type + ) + wellNameView.setText(wellBean.wellName) + wellCodeView.text = wellBean.wellCode + + this.wellType = wellBean.wellType + wellTypeView.text = wellBean.wellTypeName + + this.deptId = wellBean.deptid + ownerShipView.text = wellBean.deptName + wellDepthView.setText(wellBean.deep) + longitudeView.setText(wellBean.lngGaode) + latitudeView.setText(wellBean.latGaode) + + /** + * 2022-06/e805917f14ed49378bbd29cae391b061.png; + * 2022-06/48d34f27695346bbb39d695333faabee.png; + * 2022-06/6df199418fd84960a164ad9c9660e172.png; + * 2022-06/bfbab97a965d406ba30fc9d09ab35f5c.png; + * */ + //显示已有的图片 + val imageArray = wellBean.photos.toString().split(";") + imageArray.forEach { path -> + if (path.isNotBlank()) { + imagePaths.add(path) + realPaths.add(path.combineImagePath()) + } + } + imageAdapter = EditableImageAdapter(this) + imageAdapter.setupImage(realPaths) + imageRecyclerView.layoutManager = GridLayoutManager(this, 3) + imageRecyclerView.adapter = imageAdapter + + //默认加载当前井的区域 + authenticateViewModel.obtainAreaByDept(wellBean.deptid) + authenticateViewModel.areaModel.observe(this, { + if (it.code == 200) { + authenticateViewModel.obtainDistrict(it.data.area) + } + }) + addressView.setText(wellBean.position) + } + + override fun initEvent() { + wellCodeView.setOnClickListener { + "井编号不可编辑".show() + } + + wellTypeView.setOnClickListener { + wellViewModel.obtainWellType() + } + wellViewModel.wellTypeModel.observe(this, { + if (it.code == 200) { + val sheetBuilder = QMUIBottomSheet.BottomListSheetBuilder(this) + sheetBuilder.setTitle("井类型") + it.data.forEach { type -> + sheetBuilder.addItem(type.name) + } + sheetBuilder.setGravityCenter(true) + .setOnSheetItemClickListener { dialog, _, position, tag -> + this.wellType = it.data[position].value + wellTypeView.text = tag + + dialog.dismiss() + }.build().show() + } + }) + + ownerShipView.setOnClickListener { + authenticateViewModel.obtainOwnerShip("03") + } + + imageAdapter.setOnItemClickListener(object : EditableImageAdapter.OnItemClickListener { + override fun onAddImageClick() { + selectPicture() + } + + override fun onItemClick(position: Int) { + if (realPaths[position].isBlank()) { + "图片加载失败,无法查看大图".show() + } else { + navigatePageTo(position, realPaths) + } + } + + override fun onItemLongClick(view: View?, position: Int) { + imagePaths.removeAt(position) + imageAdapter.deleteImage(position) + } + }) + + authenticateViewModel.resultModel.observe(this, { + if (it.code == 200) { + val ownerShipModel: MutableList = ArrayList() + it.data?.list?.forEach { listBean -> + ownerShipModel.add(listBean) + } + val sheetBuilder = QMUIBottomSheet.BottomListSheetBuilder(this) + sheetBuilder.setTitle("权属单位") + ownerShipModel.forEach { model -> + sheetBuilder.addItem(model.name) + } + sheetBuilder.setGravityCenter(true) + .setOnSheetItemClickListener { dialog, _, position, tag -> + this.deptId = it.data?.list!![position].id + ownerShipView.text = tag + + dialog.dismiss() + }.build().show() + } + }) + + authenticateViewModel.districtModel.observe(this, { + if (it.code == 200) { + it.data.forEach { area -> + districtModels.add(area) + //判断区 + if (area.id == wellBean.qu) { + authenticateViewModel.obtainStreet(area.id) + authenticateViewModel.streetModel.observe(this, { street -> + if (street.code == 200) { + street.data.forEach { streetData -> + //判断街道 + if (streetData.id == wellBean.area) { + districtView.text = + String.format("${area.name}${streetData.name}") + } + } + } + }) + } + } + } + }) + + //点击选择井的区域 + districtView.setOnClickListener { + if (districtModels.isNullOrEmpty()) { + "无行政区域数据,无法修改".show() + return@setOnClickListener + } + BottomAreaSheet.Builder() + .setContext(this) + .setLifecycleOwner(this) + .setDistrictAreaData(districtModels) + .setChildDataViewModel(authenticateViewModel) + .setOnActionSheetListener(object : BottomAreaSheet.OnActionSheetListener { + override fun onAreaSelected( + area: String?, districtId: String, streetId: String + ) { + districtView.text = area?.replace("-", "") + this@EditWellActivity.districtId = districtId + this@EditWellActivity.streetId = streetId + } + }) + .build().show() + } + + //提交修改 + saveButton.setOnClickListener { + if (districtId.isEmpty() || streetId.isEmpty()) { + "行政区ID为空或者街道ID为空".show() + return@setOnClickListener + } + wellViewModel.updateWellDetail( + id = wellBean.id, + wellCode = wellBean.wellCode, + wellName = wellNameView.text.toString(), + wellType = wellType, + deptid = deptId, + deep = wellDepthView.text.toString(), + position = addressView.text.toString(), + coordinateX = longitudeView.text.toString(), + coordinateY = latitudeView.text.toString(), + photos = imagePaths.reformat(), + notes = "", + qu = districtId, + area = streetId, + responsibleDept = deptId, + responsibleDeptName = ownerShipView.text.toString() + ) + } + + uploadImageViewModel.resultModel.observe(this, { model -> + if (model.code == 200) { + /** + * 显示图片 + * path: 2021-07\c670eac17d644b179a4324a34bb84329.jpeg + * */ + /** + * 显示图片 + * path: 2021-07\c670eac17d644b179a4324a34bb84329.jpeg + * */ + val sumItemCount: Int = imageAdapter.itemCount + 1 //每上传一张图片,图片总数都是在原有的基础上+1 + if (sumItemCount <= 5) { + val url = model.data + //let函数处理需要针对一个可null的对象统一做判空处理。 + url?.let { + imagePaths.add(it) + realPaths.add(it.combineImagePath()) + } + imageAdapter.setupImage(realPaths) + } else { + "最多只能上传4张图片".show() + } + } + }) + uploadImageViewModel.loadState.observe(this, { + DialogHelper.dismissLoadingDialog() + }) + + wellViewModel.loadState.observe(this, { + when (it) { + is LoadState.Loading -> { + DialogHelper.showLoadingDialog(this, "保存中,请稍后...") + } + is LoadState.Success -> { + DialogHelper.dismissLoadingDialog() + finish() + } + else -> { + DialogHelper.dismissLoadingDialog() + } + } + }) + } + + private fun selectPicture() { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitles(arrayOf("拍照", "相册")) + .setOnActionSheetListener { position -> + when (position) { + 0 -> { + PictureSelector.create(this) + .openCamera(PictureMimeType.ofImage()) + .isCompress(true) + .compressSavePath(FileUtils.imageCompressPath) + .imageEngine(GlideLoadEngine.createGlideEngine()) + .forResult(PictureConfig.REQUEST_CAMERA) + } + 1 -> { + PictureSelector.create(this) + .openGallery(PictureMimeType.ofImage()) + .isWeChatStyle(true) + .isCamera(false) + .isCompress(true) + .compressSavePath(FileUtils.imageCompressPath) + .imageEngine(GlideLoadEngine.createGlideEngine()) + .maxSelectNum(4) + .forResult(PictureConfig.CHOOSE_REQUEST) + } + } + }.build().show() + } + + override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { + super.onActivityResult(requestCode, resultCode, data) + if (resultCode == Activity.RESULT_OK) { + when (requestCode) { + PictureConfig.CHOOSE_REQUEST -> { + val selectResult = PictureSelector.obtainMultipleResult(data) + DialogHelper.showLoadingDialog(this, "图片上传中,请稍后...") + for (res in selectResult) { + val file = File(res.compressPath) + //上传图片 + uploadImageViewModel.uploadFile(file) + } + } + PictureConfig.REQUEST_CAMERA -> { + val cameraResult = PictureSelector.obtainMultipleResult(data)[0] + //上传图片 + uploadImageViewModel.uploadFile(File(cameraResult.compressPath)) + } + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellDetailActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellDetailActivity.kt index 50c9e05..6c93e4e 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellDetailActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellDetailActivity.kt @@ -9,28 +9,30 @@ import com.amap.api.maps.model.CameraPosition import com.amap.api.maps.model.LatLng import com.amap.api.maps.model.MarkerOptions -import com.amap.api.services.core.LatLonPoint -import com.amap.api.services.geocoder.GeocodeResult -import com.amap.api.services.geocoder.GeocodeSearch -import com.amap.api.services.geocoder.RegeocodeQuery -import com.amap.api.services.geocoder.RegeocodeResult import com.casic.app.smartwell.sanxi.R import com.casic.app.smartwell.sanxi.base.BaseActivity import com.casic.app.smartwell.sanxi.extensions.show import com.casic.app.smartwell.sanxi.utils.Constant import com.casic.app.smartwell.sanxi.utils.DialogHelper import com.casic.app.smartwell.sanxi.utils.LoadState +import com.casic.app.smartwell.sanxi.vm.AuthenticateViewModel import com.casic.app.smartwell.sanxi.vm.WellViewModel import com.pengxh.app.multilib.widget.dialog.AlertMessageDialog import kotlinx.android.synthetic.main.activity_well_detail.* +import kotlinx.android.synthetic.main.activity_well_detail.wellCodeView +import kotlinx.android.synthetic.main.activity_well_detail.wellDepthView +import kotlinx.android.synthetic.main.activity_well_detail.wellNameView +import kotlinx.android.synthetic.main.activity_well_detail.wellStateView +import kotlinx.android.synthetic.main.activity_well_detail.wellTypeView +import kotlinx.android.synthetic.main.activity_well_list_detail.* import kotlinx.android.synthetic.main.include_base_title.* class WellDetailActivity : BaseActivity(), AMap.OnMapLoadedListener { private val kTag = "WellDetailActivity" - private val geocoderSearch by lazy { GeocodeSearch(this) } private lateinit var wellViewModel: WellViewModel + private lateinit var authenticateViewModel: AuthenticateViewModel private lateinit var wellId: String private lateinit var aMap: AMap private var latLng: LatLng? = null @@ -46,6 +48,7 @@ override fun initData() { wellId = intent.getStringExtra(Constant.INTENT_PARAM)!! wellViewModel = ViewModelProvider(this).get(WellViewModel::class.java) + authenticateViewModel = ViewModelProvider(this).get(AuthenticateViewModel::class.java) aMap = wellMapView.map aMap.mapType = AMap.MAP_TYPE_NORMAL @@ -103,39 +106,41 @@ val wellPosition = wellDetail.position.toString() wellLocationView.text = wellPosition - //根据经纬度获取省市区县 if (wellDetail.latGaode.isBlank() || wellDetail.lngGaode.isBlank()) { "井经纬度异常,无法查看完整位置信息".show() return@observe } this.latLng = LatLng(wellDetail.latGaode.toDouble(), wellDetail.lngGaode.toDouble()) - val queryParam = RegeocodeQuery( - LatLonPoint(wellDetail.latGaode.toDouble(), wellDetail.lngGaode.toDouble()), - 200f, - GeocodeSearch.AMAP - ) - tipsImageView.setOnClickListener { - geocoderSearch.getFromLocationAsyn(queryParam) + authenticateViewModel.obtainAreaByDept(wellDetail.deptid) } - - geocoderSearch.setOnGeocodeSearchListener(object : - GeocodeSearch.OnGeocodeSearchListener { - override fun onRegeocodeSearched(result: RegeocodeResult?, rCode: Int) { - if (rCode == 1000) { - AlertMessageDialog.Builder() - .setContext(this@WellDetailActivity) - .setTitle("闸井完整位置") - .setMessage(result?.regeocodeAddress?.formatAddress + "-" + wellPosition) - .setPositiveButton("知道了").setOnDialogButtonClickListener {}.build() - .show() - } else { - "获取该闸井详细位置信息失败".show() - } + authenticateViewModel.areaModel.observe(this, { areaModel -> + if (areaModel.code == 200) { + authenticateViewModel.obtainDistrict(areaModel.data.area) } - - override fun onGeocodeSearched(result: GeocodeResult?, rCode: Int) { - + }) + authenticateViewModel.districtModel.observe(this, { districtModel -> + if (districtModel.code == 200) { + districtModel.data.forEach { area -> + if (area.id == wellDetail.qu) { + authenticateViewModel.obtainStreet(area.id) + authenticateViewModel.streetModel.observe(this, { street -> + if (street.code == 200) { + street.data.forEach { streetData -> + if (streetData.id == wellDetail.area) { + AlertMessageDialog.Builder() + .setContext(this@WellDetailActivity) + .setTitle("闸井完整位置") + .setMessage(String.format("${area.name}${streetData.name}") + "-" + wellPosition) + .setPositiveButton("知道了") + .setOnDialogButtonClickListener {}.build() + .show() + } + } + } + }) + } + } } }) } diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellListDetailActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellListDetailActivity.kt index b34be03..d28b752 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellListDetailActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellListDetailActivity.kt @@ -4,11 +4,6 @@ import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.GridLayoutManager import androidx.recyclerview.widget.LinearLayoutManager -import com.amap.api.services.core.LatLonPoint -import com.amap.api.services.geocoder.GeocodeResult -import com.amap.api.services.geocoder.GeocodeSearch -import com.amap.api.services.geocoder.RegeocodeQuery -import com.amap.api.services.geocoder.RegeocodeResult import com.casic.app.smartwell.sanxi.R import com.casic.app.smartwell.sanxi.adapter.DeviceDataListAdapter import com.casic.app.smartwell.sanxi.adapter.DeviceDataTitleAdapter @@ -19,6 +14,7 @@ import com.casic.app.smartwell.sanxi.extensions.show import com.casic.app.smartwell.sanxi.model.WellListPageModel import com.casic.app.smartwell.sanxi.utils.Constant +import com.casic.app.smartwell.sanxi.vm.AuthenticateViewModel import com.casic.app.smartwell.sanxi.vm.WellViewModel import com.google.gson.Gson import com.google.gson.reflect.TypeToken @@ -28,8 +24,8 @@ class WellListDetailActivity : BaseActivity() { private val kTag = "WellListDetailActivity" - private val geocoderSearch by lazy { GeocodeSearch(this) } private lateinit var wellViewModel: WellViewModel + private lateinit var authenticateViewModel: AuthenticateViewModel private lateinit var wellBeanJson: String override fun initLayoutView(): Int = R.layout.activity_well_list_detail @@ -41,6 +37,7 @@ override fun initData() { wellViewModel = ViewModelProvider(this).get(WellViewModel::class.java) + authenticateViewModel = ViewModelProvider(this).get(AuthenticateViewModel::class.java) wellBeanJson = intent.getStringExtra(Constant.INTENT_PARAM)!! val wellBean = Gson().fromJson( wellBeanJson, object : TypeToken() {}.type @@ -89,29 +86,32 @@ }) } - //根据经纬度获取省市区县 - if (wellBean.latGaode.isBlank() || wellBean.lngGaode.isBlank()) { - "井经纬度异常,无法查看完整位置信息".show() - return - } - val queryParam = RegeocodeQuery( - LatLonPoint(wellBean.latGaode.toDouble(), wellBean.lngGaode.toDouble()), - 200f, - GeocodeSearch.AMAP - ) - geocoderSearch.getFromLocationAsyn(queryParam) - geocoderSearch.setOnGeocodeSearchListener(object : - GeocodeSearch.OnGeocodeSearchListener { - override fun onRegeocodeSearched(result: RegeocodeResult?, rCode: Int) { - if (rCode == 1000) { - districtView.text = result?.regeocodeAddress?.formatAddress - } - } - - override fun onGeocodeSearched(result: GeocodeResult?, rCode: Int) { - + authenticateViewModel.obtainAreaByDept(wellBean.deptid) + authenticateViewModel.areaModel.observe(this, { + if (it.code == 200) { + authenticateViewModel.obtainDistrict(it.data.area) } }) + authenticateViewModel.districtModel.observe(this, { + if (it.code == 200) { + it.data.forEach { area -> + if (area.id == wellBean.qu) { + authenticateViewModel.obtainStreet(area.id) + authenticateViewModel.streetModel.observe(this, { street -> + if (street.code == 200) { + street.data.forEach { streetData -> + if (streetData.id == wellBean.area) { + districtView.text = + String.format("${area.name}${streetData.name}") + } + } + } + }) + } + } + } + }) + addressView.text = wellBean.position maintenanceView.text = wellBean.responsibleDeptName diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellManageActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellManageActivity.kt index 1cd5616..8fc415b 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellManageActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellManageActivity.kt @@ -251,7 +251,7 @@ } override fun onEditClicked(position: Int) { - + navigatePageTo(dataBeans[position].toJson()) } override fun onOperationClicked(position: Int) { diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/vm/AuthenticateViewModel.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/vm/AuthenticateViewModel.kt index 5186591..4632b20 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/vm/AuthenticateViewModel.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/vm/AuthenticateViewModel.kt @@ -3,8 +3,7 @@ import androidx.lifecycle.MutableLiveData import com.casic.app.smartwell.sanxi.base.BaseViewModel import com.casic.app.smartwell.sanxi.extensions.* -import com.casic.app.smartwell.sanxi.model.OwnerShipModel -import com.casic.app.smartwell.sanxi.model.PublicKeyModel +import com.casic.app.smartwell.sanxi.model.* import com.casic.app.smartwell.sanxi.utils.Constant import com.casic.app.smartwell.sanxi.utils.LoadState import com.casic.app.smartwell.sanxi.utils.SaveKeyValues @@ -18,6 +17,9 @@ private val gson = Gson() val keyModel = MutableLiveData() val resultModel = MutableLiveData() + val areaModel = MutableLiveData() + val districtModel = MutableLiveData() + val streetModel = MutableLiveData() fun obtainPublicKey() = launch({ loadState.value = LoadState.Loading @@ -62,4 +64,55 @@ }, { it.printStackTrace() }) + + /** + * 根据部门获取区ID + */ + fun obtainAreaByDept(deptId: String) = launch({ + val response = RetrofitServiceManager.obtainAreaByDept(deptId) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + areaModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + response.toErrorMessage().show() + } + }, { + it.printStackTrace() + }) + + /** + * 区/县等 + */ + fun obtainDistrict(pid: String) = launch({ + val response = RetrofitServiceManager.obtainDistrict(pid) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + districtModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + response.toErrorMessage().show() + } + }, { + it.printStackTrace() + }) + + /** + * 街道 + */ + fun obtainStreet(areaId: String) = launch({ + val response = RetrofitServiceManager.obtainStreet(areaId) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + streetModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + response.toErrorMessage().show() + } + }, { + it.printStackTrace() + }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/vm/UploadFileViewModel.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/vm/UploadFileViewModel.kt new file mode 100644 index 0000000..fe9d357 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/vm/UploadFileViewModel.kt @@ -0,0 +1,36 @@ +package com.casic.app.smartwell.sanxi.vm + +import androidx.lifecycle.MutableLiveData +import com.casic.app.smartwell.sanxi.base.BaseViewModel +import com.casic.app.smartwell.sanxi.extensions.launch +import com.casic.app.smartwell.sanxi.extensions.separateResponseCode +import com.casic.app.smartwell.sanxi.extensions.show +import com.casic.app.smartwell.sanxi.extensions.toErrorMessage +import com.casic.app.smartwell.sanxi.model.CommonResultModel +import com.casic.app.smartwell.sanxi.utils.LoadState +import com.casic.app.smartwell.sanxi.utils.retrofit.RetrofitServiceManager +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken +import java.io.File + +class UploadFileViewModel : BaseViewModel() { + + private val gson = Gson() + val resultModel = MutableLiveData() + + fun uploadFile(image: File) = launch({ + val response = RetrofitServiceManager.uploadFile(image) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + resultModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show() + } + }, { + loadState.value = LoadState.Fail + }) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/vm/WellViewModel.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/vm/WellViewModel.kt index 696dbf0..8e59b91 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/vm/WellViewModel.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/vm/WellViewModel.kt @@ -1,5 +1,6 @@ package com.casic.app.smartwell.sanxi.vm +import android.util.Log import androidx.lifecycle.MutableLiveData import com.casic.app.smartwell.sanxi.base.BaseViewModel import com.casic.app.smartwell.sanxi.extensions.launch @@ -15,6 +16,7 @@ class WellViewModel : BaseViewModel() { + private val kTag = "WellViewModel" private val gson = Gson() val detailModel = MutableLiveData() val allWellModel = MutableLiveData() @@ -152,4 +154,58 @@ loadState.value = LoadState.Fail it.printStackTrace() }) + + /** + * 编辑更新井信息 + * */ + fun updateWellDetail( + id: String, + wellCode: String, + wellName: String, + wellType: String, + deptid: String, + deep: String, + position: String, + coordinateX: String, + coordinateY: String, + photos: String, + notes: String?, + qu: String, + area: String, + responsibleDept: String, + responsibleDeptName: String + ) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.updateWellDetail( + id, + wellCode, + wellName, + wellType, + deptid, + deep, + position, + coordinateX, + coordinateY, + photos, + notes, + qu, + area, + responsibleDept, + responsibleDeptName + ) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + "更新成功".show() + commonResultModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show() + } + }, { + loadState.value = LoadState.Fail + it.printStackTrace() + }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/widgets/BottomAreaSheet.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/widgets/BottomAreaSheet.kt new file mode 100644 index 0000000..5f464be --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/widgets/BottomAreaSheet.kt @@ -0,0 +1,213 @@ +package com.casic.app.smartwell.sanxi.widgets + +import android.app.Dialog +import android.content.Context +import android.os.Bundle +import android.view.* +import android.widget.AbsListView +import android.widget.AdapterView +import android.widget.BaseAdapter +import android.widget.TextView +import androidx.lifecycle.LifecycleOwner +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseViewModel +import com.casic.app.smartwell.sanxi.extensions.initDialogLayoutParams +import com.casic.app.smartwell.sanxi.extensions.show +import com.casic.app.smartwell.sanxi.model.DistrictModel +import com.casic.app.smartwell.sanxi.model.StreetModel +import com.casic.app.smartwell.sanxi.vm.AuthenticateViewModel +import com.pengxh.app.multilib.utils.SizeUtil +import kotlinx.android.synthetic.main.sheet_bottom_area.* + +class BottomAreaSheet private constructor(builder: Builder) : Dialog( + builder.context, R.style.ActionSheetDialogStyle +) { + private val owner: LifecycleOwner = builder.owner + private val firstLevelArea: List = builder.firstLevelArea + private val vm: BaseViewModel = builder.vm + private val listener: OnActionSheetListener = builder.listener + + class Builder { + lateinit var context: Context + lateinit var owner: LifecycleOwner + lateinit var firstLevelArea: List + lateinit var vm: BaseViewModel + lateinit var listener: OnActionSheetListener + + fun setContext(context: Context): Builder { + this.context = context + return this + } + + fun setLifecycleOwner(owner: LifecycleOwner): Builder { + this.owner = owner + return this + } + + fun setDistrictAreaData(firstLevelArea: List): Builder { + this.firstLevelArea = firstLevelArea + return this + } + + fun setChildDataViewModel(vm: BaseViewModel): Builder { + this.vm = vm + return this + } + + fun setOnActionSheetListener(listener: OnActionSheetListener): Builder { + this.listener = listener + return this + } + + fun build(): BottomAreaSheet { + return BottomAreaSheet(this) + } + } + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + this.initDialogLayoutParams(Gravity.BOTTOM, R.style.ActionSheetDialogAnimation, 1.0f) + setContentView(R.layout.sheet_bottom_area) + setCancelable(false) + setCanceledOnTouchOutside(false) + + dismissView.setOnClickListener { dismiss() } + + var districtId = "" + var streetId = "" + //街道 + val authenticateViewModel = vm as AuthenticateViewModel + //默认加载第一个区的街道 + val firstDistrict = firstLevelArea[0] + var districtName = if (firstDistrict.simplename.toString().isBlank()) + firstDistrict.simplename + else + firstDistrict.name + selectedAreaView.text = districtName + authenticateViewModel.obtainStreet(firstDistrict.id) + + //行政区 + firstAreaListView.adapter = DistrictDataAdapter(firstLevelArea) + firstAreaListView.onItemClickListener = AdapterView.OnItemClickListener { _, _, i, _ -> + //只选择到一级区域 + districtName = if (firstLevelArea[i].simplename.toString().isBlank()) + firstLevelArea[i].simplename + else + firstLevelArea[i].name + districtId = firstLevelArea[i].id + selectedAreaView.text = districtName + + if (districtId.isBlank()) { + "一级区域ID为空,无法获取下级街道列表".show() + return@OnItemClickListener + } + authenticateViewModel.obtainStreet(districtId) + } + authenticateViewModel.streetModel.observe(owner, { + if (it.code == 200) { + val streetModels = it.data + secondAreaListView.adapter = StreetDataAdapter(streetModels) + secondAreaListView.onItemClickListener = + AdapterView.OnItemClickListener { _, _, i, _ -> + val streetName = if (streetModels[i].simplename.toString().isBlank()) + streetModels[i].simplename + else + streetModels[i].name + streetId = streetModels[i].id + selectedAreaView.text = String.format("$districtName-$streetName") + } + } + }) + + sheetConfirmButton.setOnClickListener { + listener.onAreaSelected(selectedAreaView.text.toString(), districtId, streetId) + dismiss() + } + } + + interface OnActionSheetListener { + fun onAreaSelected(area: String?, districtId: String, streetId: String) + } + + internal inner class DistrictDataAdapter(private val dataBeans: List) : + BaseAdapter() { + + private val inflater: LayoutInflater = LayoutInflater.from(context) + + override fun getCount(): Int = dataBeans.size + + override fun getItem(position: Int): Any = dataBeans[position] + + override fun getItemId(position: Int): Long = position.toLong() + + override fun getView(position: Int, convertView: View?, parent: ViewGroup): View { + val view: View + val holder: ItemViewHolder + if (convertView == null) { + holder = ItemViewHolder() + view = inflater.inflate(R.layout.item_area_sheet, null) + holder.areaItemView = view.findViewById(R.id.areaItemView) + view.tag = holder + } else { + view = convertView + holder = view.tag as ItemViewHolder + } + val dataBean = dataBeans[position] + holder.areaItemView.setBackgroundResource(R.drawable.sheet_item_selector) + holder.areaItemView.text = + if (dataBean.simplename.toString().isBlank()) dataBean.simplename else dataBean.name + //需要动态设置item的高度 + val param = AbsListView.LayoutParams( + WindowManager.LayoutParams.MATCH_PARENT, + SizeUtil.dp2px(context, 46f) + ) + view.layoutParams = param + return view + } + + internal inner class ItemViewHolder { + lateinit var areaItemView: TextView + } + } + + internal inner class StreetDataAdapter(private val dataBeans: List) : + BaseAdapter() { + + private val inflater: LayoutInflater = LayoutInflater.from(context) + + override fun getCount(): Int = dataBeans.size + + override fun getItem(position: Int): Any = dataBeans[position] + + override fun getItemId(position: Int): Long = position.toLong() + + override fun getView(position: Int, convertView: View?, parent: ViewGroup): View { + val view: View + val holder: ItemViewHolder + if (convertView == null) { + holder = ItemViewHolder() + view = inflater.inflate(R.layout.item_area_sheet, null) + holder.areaItemView = view.findViewById(R.id.areaItemView) + view.tag = holder + } else { + view = convertView + holder = view.tag as ItemViewHolder + } + val dataBean = dataBeans[position] + holder.areaItemView.setBackgroundResource(R.drawable.sheet_item_selector) + holder.areaItemView.text = + if (dataBean.simplename.toString().isBlank()) dataBean.simplename else dataBean.name + //需要动态设置item的高度 + val param = AbsListView.LayoutParams( + WindowManager.LayoutParams.MATCH_PARENT, + SizeUtil.dp2px(context, 46f) + ) + view.layoutParams = param + return view + } + + internal inner class ItemViewHolder { + lateinit var areaItemView: TextView + } + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_solid_layout_white_radius_top_10.xml b/app/src/main/res/drawable/bg_solid_layout_white_radius_top_10.xml new file mode 100644 index 0000000..9570167 --- /dev/null +++ b/app/src/main/res/drawable/bg_solid_layout_white_radius_top_10.xml @@ -0,0 +1,10 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_add_pic.xml b/app/src/main/res/drawable/ic_add_pic.xml new file mode 100644 index 0000000..9d1e830 --- /dev/null +++ b/app/src/main/res/drawable/ic_add_pic.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/build.gradle b/app/build.gradle index fdf5fc7..804f233 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -102,8 +102,6 @@ implementation 'com.google.code.gson:gson:2.8.6' //上拉加载下拉刷新 implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' - //高德地图搜索 - implementation 'com.amap.api:search:8.1.0' //高德导航 implementation 'com.amap.api:navi-3dmap:8.1.0_3dmap8.1.0' //日期选择器 diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 3fcef8b..460648b 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -9,6 +9,7 @@ + @@ -51,6 +52,7 @@ android:name=".view.BigImageActivity" android:theme="@style/Theme.BigImageActivity" /> + () { + + private val countLimit = 4 + private var imageData: ArrayList = ArrayList() + + fun setupImage(images: ArrayList) { + this.imageData = images + notifyDataSetChanged() + } + + fun deleteImage(position: Int) { + if (imageData.size != 0) { + imageData.removeAt(position) + notifyDataSetChanged() + } + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { + val imageView = ImageView(context) + val screenWidth: Int = SizeUtil.getScreenWidth(context) - SizeUtil.dp2px(context, 40f) + val margins: Int = SizeUtil.dp2px(context, 3f) + val itemSize = (screenWidth - 6 * margins) / 3 + val params = LinearLayout.LayoutParams(itemSize, itemSize) + params.setMargins(margins, margins, margins, margins) + params.gravity = Gravity.CENTER + imageView.scaleType = ImageView.ScaleType.CENTER_CROP + imageView.layoutParams = params + return ItemViewHolder(imageView) + } + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + if (position == itemCount - 1 && imageData.size < countLimit) { + holder.imageView.setImageResource(R.drawable.ic_add_pic) + holder.imageView.setOnClickListener { //添加图片 + mOnItemClickListener!!.onAddImageClick() + } + } else { + Glide.with(context).load(imageData[position]).into(holder.imageView) + holder.imageView.setOnClickListener { // 点击操作,查看大图 + mOnItemClickListener!!.onItemClick(position) + } + // 长按监听 + holder.imageView.setOnLongClickListener { v -> //长按删除 + mOnItemClickListener!!.onItemLongClick(v, position) + true + } + } + } + + override fun getItemCount(): Int { + // 满3张图就不让其添加新图 + return if (imageData.size != 0 && imageData.size >= countLimit) { + countLimit + } else { + if (imageData.size == 0) 1 else imageData.size + 1 + } + } + + private var mOnItemClickListener: OnItemClickListener? = null + + fun setOnItemClickListener(onItemClickListener: OnItemClickListener?) { + mOnItemClickListener = onItemClickListener + } + + interface OnItemClickListener { + fun onAddImageClick() + fun onItemClick(position: Int) + fun onItemLongClick(view: View?, position: Int) + } + + inner class ItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val imageView: ImageView = itemView as ImageView + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt index 3a098be..ad20c8b 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt @@ -31,7 +31,10 @@ setContentView(initLayoutView()) ImmersionBar.with(this).statusBarDarkFont(false).init() //沉浸式状态栏 when (this.javaClass.simpleName) { - "WelcomeActivity" -> ImmersionBar.with(this).statusBarDarkFont(true).init() + "WelcomeActivity" -> { + ImmersionBar.with(this).statusBarDarkFont(true).init() + StatusBarColorUtil.setColor(this, R.color.white.convertColor(this)) + } "SplashScreenActivity" -> ImmersionBar.with(this).statusBarDarkFont(false).init() "LoginActivity" -> ImmersionBar.with(this).statusBarDarkFont(true).init() else -> StatusBarColorUtil.setColor(this, R.color.mainThemeColor.convertColor(this)) diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/extensions/ArrayList.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/extensions/ArrayList.kt index e77dbaa..3affed7 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/extensions/ArrayList.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/extensions/ArrayList.kt @@ -13,7 +13,7 @@ if (index == this.size - 1) { builder.append(s) } else { - builder.append(s).append(",") + builder.append(s).append(";") } } return builder.toString() diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/model/AreaModel.java b/app/src/main/java/com/casic/app/smartwell/sanxi/model/AreaModel.java new file mode 100644 index 0000000..3ee4c83 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/model/AreaModel.java @@ -0,0 +1,125 @@ +package com.casic.app.smartwell.sanxi.model; + +public class AreaModel { + + private int code; + private DataBean data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataBean getData() { + return data; + } + + public void setData(DataBean data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private String area; + private String communications; + private String deptid; + private String deviceTypes; + private String id; + private String lat; + private String lng; + private String map; + private String wellTypes; + + public String getArea() { + return area; + } + + public void setArea(String area) { + this.area = area; + } + + public String getCommunications() { + return communications; + } + + public void setCommunications(String communications) { + this.communications = communications; + } + + public String getDeptid() { + return deptid; + } + + public void setDeptid(String deptid) { + this.deptid = deptid; + } + + public String getDeviceTypes() { + return deviceTypes; + } + + public void setDeviceTypes(String deviceTypes) { + this.deviceTypes = deviceTypes; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getLat() { + return lat; + } + + public void setLat(String lat) { + this.lat = lat; + } + + public String getLng() { + return lng; + } + + public void setLng(String lng) { + this.lng = lng; + } + + public String getMap() { + return map; + } + + public void setMap(String map) { + this.map = map; + } + + public String getWellTypes() { + return wellTypes; + } + + public void setWellTypes(String wellTypes) { + this.wellTypes = wellTypes; + } + } +} diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/model/DistrictModel.java b/app/src/main/java/com/casic/app/smartwell/sanxi/model/DistrictModel.java new file mode 100644 index 0000000..02e9ef2 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/model/DistrictModel.java @@ -0,0 +1,172 @@ +package com.casic.app.smartwell.sanxi.model; + +import java.util.List; + +public class DistrictModel { + + private int code; + private List data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public List getData() { + return data; + } + + public void setData(List data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private String id; + private String isSync; + private String lat; + private int level; + private String levelName; + private String lng; + private String name; + private int num; + private String pName; + private String pid; + private String pids; + private String simplename; + private String targetIdSync; + private String targetPidSync; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getIsSync() { + return isSync; + } + + public void setIsSync(String isSync) { + this.isSync = isSync; + } + + public String getLat() { + return lat; + } + + public void setLat(String lat) { + this.lat = lat; + } + + public int getLevel() { + return level; + } + + public void setLevel(int level) { + this.level = level; + } + + public String getLevelName() { + return levelName; + } + + public void setLevelName(String levelName) { + this.levelName = levelName; + } + + public String getLng() { + return lng; + } + + public void setLng(String lng) { + this.lng = lng; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getNum() { + return num; + } + + public void setNum(int num) { + this.num = num; + } + + public String getPName() { + return pName; + } + + public void setPName(String pName) { + this.pName = pName; + } + + public String getPid() { + return pid; + } + + public void setPid(String pid) { + this.pid = pid; + } + + public String getPids() { + return pids; + } + + public void setPids(String pids) { + this.pids = pids; + } + + public String getSimplename() { + return simplename; + } + + public void setSimplename(String simplename) { + this.simplename = simplename; + } + + public String getTargetIdSync() { + return targetIdSync; + } + + public void setTargetIdSync(String targetIdSync) { + this.targetIdSync = targetIdSync; + } + + public String getTargetPidSync() { + return targetPidSync; + } + + public void setTargetPidSync(String targetPidSync) { + this.targetPidSync = targetPidSync; + } + } +} diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/model/StreetModel.java b/app/src/main/java/com/casic/app/smartwell/sanxi/model/StreetModel.java new file mode 100644 index 0000000..90cc7d5 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/model/StreetModel.java @@ -0,0 +1,172 @@ +package com.casic.app.smartwell.sanxi.model; + +import java.util.List; + +public class StreetModel { + + private int code; + private List data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public List getData() { + return data; + } + + public void setData(List data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private String id; + private String isSync; + private String lat; + private int level; + private String levelName; + private String lng; + private String name; + private int num; + private String pName; + private String pid; + private String pids; + private String simplename; + private String targetIdSync; + private String targetPidSync; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getIsSync() { + return isSync; + } + + public void setIsSync(String isSync) { + this.isSync = isSync; + } + + public String getLat() { + return lat; + } + + public void setLat(String lat) { + this.lat = lat; + } + + public int getLevel() { + return level; + } + + public void setLevel(int level) { + this.level = level; + } + + public String getLevelName() { + return levelName; + } + + public void setLevelName(String levelName) { + this.levelName = levelName; + } + + public String getLng() { + return lng; + } + + public void setLng(String lng) { + this.lng = lng; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getNum() { + return num; + } + + public void setNum(int num) { + this.num = num; + } + + public String getPName() { + return pName; + } + + public void setPName(String pName) { + this.pName = pName; + } + + public String getPid() { + return pid; + } + + public void setPid(String pid) { + this.pid = pid; + } + + public String getPids() { + return pids; + } + + public void setPids(String pids) { + this.pids = pids; + } + + public String getSimplename() { + return simplename; + } + + public void setSimplename(String simplename) { + this.simplename = simplename; + } + + public String getTargetIdSync() { + return targetIdSync; + } + + public void setTargetIdSync(String targetIdSync) { + this.targetIdSync = targetIdSync; + } + + public String getTargetPidSync() { + return targetPidSync; + } + + public void setTargetPidSync(String targetPidSync) { + this.targetPidSync = targetPidSync; + } + } +} diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/Constant.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/Constant.kt index bae51d6..3251baa 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/Constant.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/Constant.kt @@ -7,6 +7,7 @@ object Constant { val USER_PERMISSIONS = arrayOf( Manifest.permission.READ_EXTERNAL_STORAGE, + Manifest.permission.CAMERA, Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS, Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION, diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/FileUtils.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/FileUtils.kt index 3e9ae35..cef2d83 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/FileUtils.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/FileUtils.kt @@ -18,4 +18,13 @@ } return downloadDir.toString() } + + val imageCompressPath: String + get() { + val imageDir = File(context.getExternalFilesDir(Environment.DIRECTORY_PICTURES), "") + if (!imageDir.exists()) { + imageDir.mkdir() + } + return imageDir.toString() + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt index 19687d2..bd311a4 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt @@ -289,6 +289,77 @@ ): String /** + * 上传图片 + * 系统路径static拼接图片返回路径 + * http://xx.com/static/2019-10/8050891248624f2bbefedcb196ce89cb.jpeg + */ + @Multipart + @POST("/imageUpload") + suspend fun uploadFile( + @Header("token") token: String, + @Part file: MultipartBody.Part + ): String + + /** + * 根据部门获取区ID + * + * @param deptId + */ + @GET("/config/getAreaByDept") + suspend fun obtainAreaByDept( + @Header("token") token: String, + @Query("deptId") deptId: String + ): String + + /** + * 获取区/县等 + * + * @param pid + */ + @GET("/area/list") + suspend fun obtainDistrict( + @Header("token") token: String, + @Query("pid") pid: String + ): String + + /** + * 获取街道 + * + * @param pid + */ + @GET("/area/list") + suspend fun obtainStreet( + @Header("token") token: String, + @Query("pid") pid: String + ): String + + /** + * 编辑更新井信息 + * + * @param id + */ + @FormUrlEncoded + @POST("/well/update") + suspend fun updateWellDetail( + @Header("token") token: String, + @Field("id") id: String, + @Field("wellCode") wellCode: String, + @Field("wellName") wellName: String, + @Field("wellType") wellType: String, + @Field("deptid") deptid: String, + @Field("deep") deep: String, + @Field("position") position: String, + @Field("coordinateX") coordinateX: String, + @Field("coordinateY") coordinateY: String, + @Field("photos") photos: String, + @Field("notes") notes: String?, + @Field("qu") qu: String, + @Field("area") area: String, + @Field("responsibleDept") responsibleDept: String, + @Field("responsibleDeptName") responsibleDeptName: String + ): String + + /** * 获取工单详情 * * @param id 工单id @@ -312,18 +383,6 @@ ): String /** - * 上传图片 - * 系统路径static拼接图片返回路径 - * http://xx.com/static/2019-10/8050891248624f2bbefedcb196ce89cb.jpeg - */ - @Multipart - @POST("/imageUpload") - suspend fun uploadImage( - @Header("token") token: String, - @Part file: MultipartBody.Part - ): String - - /** * 查找同一单位下的用户 * * @param hasMine 是否包含本人,1包含, 0不包含 diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt index efd6b11..e35e976 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt @@ -3,6 +3,10 @@ import com.casic.app.smartwell.sanxi.model.PublicKeyModel import com.casic.app.smartwell.sanxi.utils.AuthenticationHelper import com.casic.app.smartwell.sanxi.utils.Constant +import okhttp3.MediaType.Companion.toMediaTypeOrNull +import okhttp3.MultipartBody +import okhttp3.RequestBody +import java.io.File object RetrofitServiceManager { @@ -272,6 +276,76 @@ return api.obtainOperationResult(AuthenticationHelper.token!!, wellId, bfzt) } + /** + * 上传图片 + */ + suspend fun uploadFile(image: File): String { + val requestBody = RequestBody.create("image/png".toMediaTypeOrNull(), image) + val imagePart = MultipartBody.Part.createFormData("file", image.name, requestBody) + return api.uploadFile(AuthenticationHelper.token!!, imagePart) + } + + /** + * 根据部门获取区ID + */ + suspend fun obtainAreaByDept(deptId: String): String { + return api.obtainAreaByDept(AuthenticationHelper.token!!, deptId) + } + + /** + * 获取区/县等 + */ + suspend fun obtainDistrict(pid: String): String { + return api.obtainDistrict(AuthenticationHelper.token!!, pid) + } + + /** + * 获取街道 + */ + suspend fun obtainStreet(pid: String): String { + return api.obtainStreet(AuthenticationHelper.token!!, pid) + } + + /** + * 编辑更新井信息 + */ + suspend fun updateWellDetail( + id: String, + wellCode: String, + wellName: String, + wellType: String, + deptid: String, + deep: String, + position: String, + coordinateX: String, + coordinateY: String, + photos: String, + notes: String?, + qu: String, + area: String, + responsibleDept: String, + responsibleDeptName: String + ): String { + return api.updateWellDetail( + AuthenticationHelper.token!!, + id, + wellCode, + wellName, + wellType, + deptid, + deep, + position, + coordinateX, + coordinateY, + photos, + notes, + qu, + area, + responsibleDept, + responsibleDeptName + ) + } + // /** // * 获取工单详情 // */ @@ -287,15 +361,6 @@ // } // // /** -// * 上传图片 -// */ -// suspend fun uploadImage(image: File): String { -// val requestBody = RequestBody.create("image/png".toMediaTypeOrNull(), image) -// val imagePart = MultipartBody.Part.createFormData("file", image.name, requestBody) -// return api.uploadImage(AuthenticationHelper.token!!, imagePart) -// } -// -// /** // * 查找同一单位下的用户 // */ // suspend fun obtainSubordinate(hasMine: String?, roleTips: String?): String { diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/EditWellActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/EditWellActivity.kt new file mode 100644 index 0000000..956dbce --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/EditWellActivity.kt @@ -0,0 +1,341 @@ +package com.casic.app.smartwell.sanxi.view + +import android.app.Activity +import android.content.Intent +import android.view.View +import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.GridLayoutManager +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.adapter.EditableImageAdapter +import com.casic.app.smartwell.sanxi.base.BaseActivity +import com.casic.app.smartwell.sanxi.extensions.combineImagePath +import com.casic.app.smartwell.sanxi.extensions.navigatePageTo +import com.casic.app.smartwell.sanxi.extensions.reformat +import com.casic.app.smartwell.sanxi.extensions.show +import com.casic.app.smartwell.sanxi.model.DistrictModel +import com.casic.app.smartwell.sanxi.model.OwnerShipModel +import com.casic.app.smartwell.sanxi.model.WellListPageModel +import com.casic.app.smartwell.sanxi.utils.* +import com.casic.app.smartwell.sanxi.vm.AuthenticateViewModel +import com.casic.app.smartwell.sanxi.vm.UploadFileViewModel +import com.casic.app.smartwell.sanxi.vm.WellViewModel +import com.casic.app.smartwell.sanxi.widgets.BottomAreaSheet +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken +import com.luck.picture.lib.PictureSelector +import com.luck.picture.lib.config.PictureConfig +import com.luck.picture.lib.config.PictureMimeType +import com.pengxh.app.multilib.widget.dialog.BottomActionSheet +import com.qmuiteam.qmui.widget.dialog.QMUIBottomSheet +import kotlinx.android.synthetic.main.activity_edit_well.* +import kotlinx.android.synthetic.main.include_base_title.* +import java.io.File + +class EditWellActivity : BaseActivity() { + + private val kTag = "EditWellActivity" + private lateinit var wellViewModel: WellViewModel + private lateinit var authenticateViewModel: AuthenticateViewModel + private lateinit var uploadImageViewModel: UploadFileViewModel + private lateinit var wellBeanJson: String + private lateinit var imageAdapter: EditableImageAdapter + private lateinit var wellBean: WellListPageModel.DataBean.RowsBean + private val imagePaths: ArrayList = ArrayList() //服务器返回的拍照数据集 + private val realPaths: ArrayList = ArrayList() //真实图片路径 + private val districtModels: ArrayList = ArrayList() //行政区 + private var wellType = "" + private var deptId = "" + private var districtId = "" + private var streetId = "" + + override fun initLayoutView(): Int = R.layout.activity_edit_well + + override fun setupTopBarLayout() { + leftBackView.setOnClickListener { finish() } + titleView.text = "编辑井信息" + } + + override fun initData() { + wellViewModel = ViewModelProvider(this).get(WellViewModel::class.java) + authenticateViewModel = ViewModelProvider(this).get(AuthenticateViewModel::class.java) + uploadImageViewModel = ViewModelProvider(this).get(UploadFileViewModel::class.java) + wellBeanJson = intent.getStringExtra(Constant.INTENT_PARAM)!! + wellBean = Gson().fromJson( + wellBeanJson, object : TypeToken() {}.type + ) + wellNameView.setText(wellBean.wellName) + wellCodeView.text = wellBean.wellCode + + this.wellType = wellBean.wellType + wellTypeView.text = wellBean.wellTypeName + + this.deptId = wellBean.deptid + ownerShipView.text = wellBean.deptName + wellDepthView.setText(wellBean.deep) + longitudeView.setText(wellBean.lngGaode) + latitudeView.setText(wellBean.latGaode) + + /** + * 2022-06/e805917f14ed49378bbd29cae391b061.png; + * 2022-06/48d34f27695346bbb39d695333faabee.png; + * 2022-06/6df199418fd84960a164ad9c9660e172.png; + * 2022-06/bfbab97a965d406ba30fc9d09ab35f5c.png; + * */ + //显示已有的图片 + val imageArray = wellBean.photos.toString().split(";") + imageArray.forEach { path -> + if (path.isNotBlank()) { + imagePaths.add(path) + realPaths.add(path.combineImagePath()) + } + } + imageAdapter = EditableImageAdapter(this) + imageAdapter.setupImage(realPaths) + imageRecyclerView.layoutManager = GridLayoutManager(this, 3) + imageRecyclerView.adapter = imageAdapter + + //默认加载当前井的区域 + authenticateViewModel.obtainAreaByDept(wellBean.deptid) + authenticateViewModel.areaModel.observe(this, { + if (it.code == 200) { + authenticateViewModel.obtainDistrict(it.data.area) + } + }) + addressView.setText(wellBean.position) + } + + override fun initEvent() { + wellCodeView.setOnClickListener { + "井编号不可编辑".show() + } + + wellTypeView.setOnClickListener { + wellViewModel.obtainWellType() + } + wellViewModel.wellTypeModel.observe(this, { + if (it.code == 200) { + val sheetBuilder = QMUIBottomSheet.BottomListSheetBuilder(this) + sheetBuilder.setTitle("井类型") + it.data.forEach { type -> + sheetBuilder.addItem(type.name) + } + sheetBuilder.setGravityCenter(true) + .setOnSheetItemClickListener { dialog, _, position, tag -> + this.wellType = it.data[position].value + wellTypeView.text = tag + + dialog.dismiss() + }.build().show() + } + }) + + ownerShipView.setOnClickListener { + authenticateViewModel.obtainOwnerShip("03") + } + + imageAdapter.setOnItemClickListener(object : EditableImageAdapter.OnItemClickListener { + override fun onAddImageClick() { + selectPicture() + } + + override fun onItemClick(position: Int) { + if (realPaths[position].isBlank()) { + "图片加载失败,无法查看大图".show() + } else { + navigatePageTo(position, realPaths) + } + } + + override fun onItemLongClick(view: View?, position: Int) { + imagePaths.removeAt(position) + imageAdapter.deleteImage(position) + } + }) + + authenticateViewModel.resultModel.observe(this, { + if (it.code == 200) { + val ownerShipModel: MutableList = ArrayList() + it.data?.list?.forEach { listBean -> + ownerShipModel.add(listBean) + } + val sheetBuilder = QMUIBottomSheet.BottomListSheetBuilder(this) + sheetBuilder.setTitle("权属单位") + ownerShipModel.forEach { model -> + sheetBuilder.addItem(model.name) + } + sheetBuilder.setGravityCenter(true) + .setOnSheetItemClickListener { dialog, _, position, tag -> + this.deptId = it.data?.list!![position].id + ownerShipView.text = tag + + dialog.dismiss() + }.build().show() + } + }) + + authenticateViewModel.districtModel.observe(this, { + if (it.code == 200) { + it.data.forEach { area -> + districtModels.add(area) + //判断区 + if (area.id == wellBean.qu) { + authenticateViewModel.obtainStreet(area.id) + authenticateViewModel.streetModel.observe(this, { street -> + if (street.code == 200) { + street.data.forEach { streetData -> + //判断街道 + if (streetData.id == wellBean.area) { + districtView.text = + String.format("${area.name}${streetData.name}") + } + } + } + }) + } + } + } + }) + + //点击选择井的区域 + districtView.setOnClickListener { + if (districtModels.isNullOrEmpty()) { + "无行政区域数据,无法修改".show() + return@setOnClickListener + } + BottomAreaSheet.Builder() + .setContext(this) + .setLifecycleOwner(this) + .setDistrictAreaData(districtModels) + .setChildDataViewModel(authenticateViewModel) + .setOnActionSheetListener(object : BottomAreaSheet.OnActionSheetListener { + override fun onAreaSelected( + area: String?, districtId: String, streetId: String + ) { + districtView.text = area?.replace("-", "") + this@EditWellActivity.districtId = districtId + this@EditWellActivity.streetId = streetId + } + }) + .build().show() + } + + //提交修改 + saveButton.setOnClickListener { + if (districtId.isEmpty() || streetId.isEmpty()) { + "行政区ID为空或者街道ID为空".show() + return@setOnClickListener + } + wellViewModel.updateWellDetail( + id = wellBean.id, + wellCode = wellBean.wellCode, + wellName = wellNameView.text.toString(), + wellType = wellType, + deptid = deptId, + deep = wellDepthView.text.toString(), + position = addressView.text.toString(), + coordinateX = longitudeView.text.toString(), + coordinateY = latitudeView.text.toString(), + photos = imagePaths.reformat(), + notes = "", + qu = districtId, + area = streetId, + responsibleDept = deptId, + responsibleDeptName = ownerShipView.text.toString() + ) + } + + uploadImageViewModel.resultModel.observe(this, { model -> + if (model.code == 200) { + /** + * 显示图片 + * path: 2021-07\c670eac17d644b179a4324a34bb84329.jpeg + * */ + /** + * 显示图片 + * path: 2021-07\c670eac17d644b179a4324a34bb84329.jpeg + * */ + val sumItemCount: Int = imageAdapter.itemCount + 1 //每上传一张图片,图片总数都是在原有的基础上+1 + if (sumItemCount <= 5) { + val url = model.data + //let函数处理需要针对一个可null的对象统一做判空处理。 + url?.let { + imagePaths.add(it) + realPaths.add(it.combineImagePath()) + } + imageAdapter.setupImage(realPaths) + } else { + "最多只能上传4张图片".show() + } + } + }) + uploadImageViewModel.loadState.observe(this, { + DialogHelper.dismissLoadingDialog() + }) + + wellViewModel.loadState.observe(this, { + when (it) { + is LoadState.Loading -> { + DialogHelper.showLoadingDialog(this, "保存中,请稍后...") + } + is LoadState.Success -> { + DialogHelper.dismissLoadingDialog() + finish() + } + else -> { + DialogHelper.dismissLoadingDialog() + } + } + }) + } + + private fun selectPicture() { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitles(arrayOf("拍照", "相册")) + .setOnActionSheetListener { position -> + when (position) { + 0 -> { + PictureSelector.create(this) + .openCamera(PictureMimeType.ofImage()) + .isCompress(true) + .compressSavePath(FileUtils.imageCompressPath) + .imageEngine(GlideLoadEngine.createGlideEngine()) + .forResult(PictureConfig.REQUEST_CAMERA) + } + 1 -> { + PictureSelector.create(this) + .openGallery(PictureMimeType.ofImage()) + .isWeChatStyle(true) + .isCamera(false) + .isCompress(true) + .compressSavePath(FileUtils.imageCompressPath) + .imageEngine(GlideLoadEngine.createGlideEngine()) + .maxSelectNum(4) + .forResult(PictureConfig.CHOOSE_REQUEST) + } + } + }.build().show() + } + + override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { + super.onActivityResult(requestCode, resultCode, data) + if (resultCode == Activity.RESULT_OK) { + when (requestCode) { + PictureConfig.CHOOSE_REQUEST -> { + val selectResult = PictureSelector.obtainMultipleResult(data) + DialogHelper.showLoadingDialog(this, "图片上传中,请稍后...") + for (res in selectResult) { + val file = File(res.compressPath) + //上传图片 + uploadImageViewModel.uploadFile(file) + } + } + PictureConfig.REQUEST_CAMERA -> { + val cameraResult = PictureSelector.obtainMultipleResult(data)[0] + //上传图片 + uploadImageViewModel.uploadFile(File(cameraResult.compressPath)) + } + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellDetailActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellDetailActivity.kt index 50c9e05..6c93e4e 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellDetailActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellDetailActivity.kt @@ -9,28 +9,30 @@ import com.amap.api.maps.model.CameraPosition import com.amap.api.maps.model.LatLng import com.amap.api.maps.model.MarkerOptions -import com.amap.api.services.core.LatLonPoint -import com.amap.api.services.geocoder.GeocodeResult -import com.amap.api.services.geocoder.GeocodeSearch -import com.amap.api.services.geocoder.RegeocodeQuery -import com.amap.api.services.geocoder.RegeocodeResult import com.casic.app.smartwell.sanxi.R import com.casic.app.smartwell.sanxi.base.BaseActivity import com.casic.app.smartwell.sanxi.extensions.show import com.casic.app.smartwell.sanxi.utils.Constant import com.casic.app.smartwell.sanxi.utils.DialogHelper import com.casic.app.smartwell.sanxi.utils.LoadState +import com.casic.app.smartwell.sanxi.vm.AuthenticateViewModel import com.casic.app.smartwell.sanxi.vm.WellViewModel import com.pengxh.app.multilib.widget.dialog.AlertMessageDialog import kotlinx.android.synthetic.main.activity_well_detail.* +import kotlinx.android.synthetic.main.activity_well_detail.wellCodeView +import kotlinx.android.synthetic.main.activity_well_detail.wellDepthView +import kotlinx.android.synthetic.main.activity_well_detail.wellNameView +import kotlinx.android.synthetic.main.activity_well_detail.wellStateView +import kotlinx.android.synthetic.main.activity_well_detail.wellTypeView +import kotlinx.android.synthetic.main.activity_well_list_detail.* import kotlinx.android.synthetic.main.include_base_title.* class WellDetailActivity : BaseActivity(), AMap.OnMapLoadedListener { private val kTag = "WellDetailActivity" - private val geocoderSearch by lazy { GeocodeSearch(this) } private lateinit var wellViewModel: WellViewModel + private lateinit var authenticateViewModel: AuthenticateViewModel private lateinit var wellId: String private lateinit var aMap: AMap private var latLng: LatLng? = null @@ -46,6 +48,7 @@ override fun initData() { wellId = intent.getStringExtra(Constant.INTENT_PARAM)!! wellViewModel = ViewModelProvider(this).get(WellViewModel::class.java) + authenticateViewModel = ViewModelProvider(this).get(AuthenticateViewModel::class.java) aMap = wellMapView.map aMap.mapType = AMap.MAP_TYPE_NORMAL @@ -103,39 +106,41 @@ val wellPosition = wellDetail.position.toString() wellLocationView.text = wellPosition - //根据经纬度获取省市区县 if (wellDetail.latGaode.isBlank() || wellDetail.lngGaode.isBlank()) { "井经纬度异常,无法查看完整位置信息".show() return@observe } this.latLng = LatLng(wellDetail.latGaode.toDouble(), wellDetail.lngGaode.toDouble()) - val queryParam = RegeocodeQuery( - LatLonPoint(wellDetail.latGaode.toDouble(), wellDetail.lngGaode.toDouble()), - 200f, - GeocodeSearch.AMAP - ) - tipsImageView.setOnClickListener { - geocoderSearch.getFromLocationAsyn(queryParam) + authenticateViewModel.obtainAreaByDept(wellDetail.deptid) } - - geocoderSearch.setOnGeocodeSearchListener(object : - GeocodeSearch.OnGeocodeSearchListener { - override fun onRegeocodeSearched(result: RegeocodeResult?, rCode: Int) { - if (rCode == 1000) { - AlertMessageDialog.Builder() - .setContext(this@WellDetailActivity) - .setTitle("闸井完整位置") - .setMessage(result?.regeocodeAddress?.formatAddress + "-" + wellPosition) - .setPositiveButton("知道了").setOnDialogButtonClickListener {}.build() - .show() - } else { - "获取该闸井详细位置信息失败".show() - } + authenticateViewModel.areaModel.observe(this, { areaModel -> + if (areaModel.code == 200) { + authenticateViewModel.obtainDistrict(areaModel.data.area) } - - override fun onGeocodeSearched(result: GeocodeResult?, rCode: Int) { - + }) + authenticateViewModel.districtModel.observe(this, { districtModel -> + if (districtModel.code == 200) { + districtModel.data.forEach { area -> + if (area.id == wellDetail.qu) { + authenticateViewModel.obtainStreet(area.id) + authenticateViewModel.streetModel.observe(this, { street -> + if (street.code == 200) { + street.data.forEach { streetData -> + if (streetData.id == wellDetail.area) { + AlertMessageDialog.Builder() + .setContext(this@WellDetailActivity) + .setTitle("闸井完整位置") + .setMessage(String.format("${area.name}${streetData.name}") + "-" + wellPosition) + .setPositiveButton("知道了") + .setOnDialogButtonClickListener {}.build() + .show() + } + } + } + }) + } + } } }) } diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellListDetailActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellListDetailActivity.kt index b34be03..d28b752 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellListDetailActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellListDetailActivity.kt @@ -4,11 +4,6 @@ import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.GridLayoutManager import androidx.recyclerview.widget.LinearLayoutManager -import com.amap.api.services.core.LatLonPoint -import com.amap.api.services.geocoder.GeocodeResult -import com.amap.api.services.geocoder.GeocodeSearch -import com.amap.api.services.geocoder.RegeocodeQuery -import com.amap.api.services.geocoder.RegeocodeResult import com.casic.app.smartwell.sanxi.R import com.casic.app.smartwell.sanxi.adapter.DeviceDataListAdapter import com.casic.app.smartwell.sanxi.adapter.DeviceDataTitleAdapter @@ -19,6 +14,7 @@ import com.casic.app.smartwell.sanxi.extensions.show import com.casic.app.smartwell.sanxi.model.WellListPageModel import com.casic.app.smartwell.sanxi.utils.Constant +import com.casic.app.smartwell.sanxi.vm.AuthenticateViewModel import com.casic.app.smartwell.sanxi.vm.WellViewModel import com.google.gson.Gson import com.google.gson.reflect.TypeToken @@ -28,8 +24,8 @@ class WellListDetailActivity : BaseActivity() { private val kTag = "WellListDetailActivity" - private val geocoderSearch by lazy { GeocodeSearch(this) } private lateinit var wellViewModel: WellViewModel + private lateinit var authenticateViewModel: AuthenticateViewModel private lateinit var wellBeanJson: String override fun initLayoutView(): Int = R.layout.activity_well_list_detail @@ -41,6 +37,7 @@ override fun initData() { wellViewModel = ViewModelProvider(this).get(WellViewModel::class.java) + authenticateViewModel = ViewModelProvider(this).get(AuthenticateViewModel::class.java) wellBeanJson = intent.getStringExtra(Constant.INTENT_PARAM)!! val wellBean = Gson().fromJson( wellBeanJson, object : TypeToken() {}.type @@ -89,29 +86,32 @@ }) } - //根据经纬度获取省市区县 - if (wellBean.latGaode.isBlank() || wellBean.lngGaode.isBlank()) { - "井经纬度异常,无法查看完整位置信息".show() - return - } - val queryParam = RegeocodeQuery( - LatLonPoint(wellBean.latGaode.toDouble(), wellBean.lngGaode.toDouble()), - 200f, - GeocodeSearch.AMAP - ) - geocoderSearch.getFromLocationAsyn(queryParam) - geocoderSearch.setOnGeocodeSearchListener(object : - GeocodeSearch.OnGeocodeSearchListener { - override fun onRegeocodeSearched(result: RegeocodeResult?, rCode: Int) { - if (rCode == 1000) { - districtView.text = result?.regeocodeAddress?.formatAddress - } - } - - override fun onGeocodeSearched(result: GeocodeResult?, rCode: Int) { - + authenticateViewModel.obtainAreaByDept(wellBean.deptid) + authenticateViewModel.areaModel.observe(this, { + if (it.code == 200) { + authenticateViewModel.obtainDistrict(it.data.area) } }) + authenticateViewModel.districtModel.observe(this, { + if (it.code == 200) { + it.data.forEach { area -> + if (area.id == wellBean.qu) { + authenticateViewModel.obtainStreet(area.id) + authenticateViewModel.streetModel.observe(this, { street -> + if (street.code == 200) { + street.data.forEach { streetData -> + if (streetData.id == wellBean.area) { + districtView.text = + String.format("${area.name}${streetData.name}") + } + } + } + }) + } + } + } + }) + addressView.text = wellBean.position maintenanceView.text = wellBean.responsibleDeptName diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellManageActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellManageActivity.kt index 1cd5616..8fc415b 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellManageActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellManageActivity.kt @@ -251,7 +251,7 @@ } override fun onEditClicked(position: Int) { - + navigatePageTo(dataBeans[position].toJson()) } override fun onOperationClicked(position: Int) { diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/vm/AuthenticateViewModel.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/vm/AuthenticateViewModel.kt index 5186591..4632b20 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/vm/AuthenticateViewModel.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/vm/AuthenticateViewModel.kt @@ -3,8 +3,7 @@ import androidx.lifecycle.MutableLiveData import com.casic.app.smartwell.sanxi.base.BaseViewModel import com.casic.app.smartwell.sanxi.extensions.* -import com.casic.app.smartwell.sanxi.model.OwnerShipModel -import com.casic.app.smartwell.sanxi.model.PublicKeyModel +import com.casic.app.smartwell.sanxi.model.* import com.casic.app.smartwell.sanxi.utils.Constant import com.casic.app.smartwell.sanxi.utils.LoadState import com.casic.app.smartwell.sanxi.utils.SaveKeyValues @@ -18,6 +17,9 @@ private val gson = Gson() val keyModel = MutableLiveData() val resultModel = MutableLiveData() + val areaModel = MutableLiveData() + val districtModel = MutableLiveData() + val streetModel = MutableLiveData() fun obtainPublicKey() = launch({ loadState.value = LoadState.Loading @@ -62,4 +64,55 @@ }, { it.printStackTrace() }) + + /** + * 根据部门获取区ID + */ + fun obtainAreaByDept(deptId: String) = launch({ + val response = RetrofitServiceManager.obtainAreaByDept(deptId) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + areaModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + response.toErrorMessage().show() + } + }, { + it.printStackTrace() + }) + + /** + * 区/县等 + */ + fun obtainDistrict(pid: String) = launch({ + val response = RetrofitServiceManager.obtainDistrict(pid) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + districtModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + response.toErrorMessage().show() + } + }, { + it.printStackTrace() + }) + + /** + * 街道 + */ + fun obtainStreet(areaId: String) = launch({ + val response = RetrofitServiceManager.obtainStreet(areaId) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + streetModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + response.toErrorMessage().show() + } + }, { + it.printStackTrace() + }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/vm/UploadFileViewModel.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/vm/UploadFileViewModel.kt new file mode 100644 index 0000000..fe9d357 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/vm/UploadFileViewModel.kt @@ -0,0 +1,36 @@ +package com.casic.app.smartwell.sanxi.vm + +import androidx.lifecycle.MutableLiveData +import com.casic.app.smartwell.sanxi.base.BaseViewModel +import com.casic.app.smartwell.sanxi.extensions.launch +import com.casic.app.smartwell.sanxi.extensions.separateResponseCode +import com.casic.app.smartwell.sanxi.extensions.show +import com.casic.app.smartwell.sanxi.extensions.toErrorMessage +import com.casic.app.smartwell.sanxi.model.CommonResultModel +import com.casic.app.smartwell.sanxi.utils.LoadState +import com.casic.app.smartwell.sanxi.utils.retrofit.RetrofitServiceManager +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken +import java.io.File + +class UploadFileViewModel : BaseViewModel() { + + private val gson = Gson() + val resultModel = MutableLiveData() + + fun uploadFile(image: File) = launch({ + val response = RetrofitServiceManager.uploadFile(image) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + resultModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show() + } + }, { + loadState.value = LoadState.Fail + }) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/vm/WellViewModel.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/vm/WellViewModel.kt index 696dbf0..8e59b91 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/vm/WellViewModel.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/vm/WellViewModel.kt @@ -1,5 +1,6 @@ package com.casic.app.smartwell.sanxi.vm +import android.util.Log import androidx.lifecycle.MutableLiveData import com.casic.app.smartwell.sanxi.base.BaseViewModel import com.casic.app.smartwell.sanxi.extensions.launch @@ -15,6 +16,7 @@ class WellViewModel : BaseViewModel() { + private val kTag = "WellViewModel" private val gson = Gson() val detailModel = MutableLiveData() val allWellModel = MutableLiveData() @@ -152,4 +154,58 @@ loadState.value = LoadState.Fail it.printStackTrace() }) + + /** + * 编辑更新井信息 + * */ + fun updateWellDetail( + id: String, + wellCode: String, + wellName: String, + wellType: String, + deptid: String, + deep: String, + position: String, + coordinateX: String, + coordinateY: String, + photos: String, + notes: String?, + qu: String, + area: String, + responsibleDept: String, + responsibleDeptName: String + ) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.updateWellDetail( + id, + wellCode, + wellName, + wellType, + deptid, + deep, + position, + coordinateX, + coordinateY, + photos, + notes, + qu, + area, + responsibleDept, + responsibleDeptName + ) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + "更新成功".show() + commonResultModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show() + } + }, { + loadState.value = LoadState.Fail + it.printStackTrace() + }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/widgets/BottomAreaSheet.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/widgets/BottomAreaSheet.kt new file mode 100644 index 0000000..5f464be --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/widgets/BottomAreaSheet.kt @@ -0,0 +1,213 @@ +package com.casic.app.smartwell.sanxi.widgets + +import android.app.Dialog +import android.content.Context +import android.os.Bundle +import android.view.* +import android.widget.AbsListView +import android.widget.AdapterView +import android.widget.BaseAdapter +import android.widget.TextView +import androidx.lifecycle.LifecycleOwner +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseViewModel +import com.casic.app.smartwell.sanxi.extensions.initDialogLayoutParams +import com.casic.app.smartwell.sanxi.extensions.show +import com.casic.app.smartwell.sanxi.model.DistrictModel +import com.casic.app.smartwell.sanxi.model.StreetModel +import com.casic.app.smartwell.sanxi.vm.AuthenticateViewModel +import com.pengxh.app.multilib.utils.SizeUtil +import kotlinx.android.synthetic.main.sheet_bottom_area.* + +class BottomAreaSheet private constructor(builder: Builder) : Dialog( + builder.context, R.style.ActionSheetDialogStyle +) { + private val owner: LifecycleOwner = builder.owner + private val firstLevelArea: List = builder.firstLevelArea + private val vm: BaseViewModel = builder.vm + private val listener: OnActionSheetListener = builder.listener + + class Builder { + lateinit var context: Context + lateinit var owner: LifecycleOwner + lateinit var firstLevelArea: List + lateinit var vm: BaseViewModel + lateinit var listener: OnActionSheetListener + + fun setContext(context: Context): Builder { + this.context = context + return this + } + + fun setLifecycleOwner(owner: LifecycleOwner): Builder { + this.owner = owner + return this + } + + fun setDistrictAreaData(firstLevelArea: List): Builder { + this.firstLevelArea = firstLevelArea + return this + } + + fun setChildDataViewModel(vm: BaseViewModel): Builder { + this.vm = vm + return this + } + + fun setOnActionSheetListener(listener: OnActionSheetListener): Builder { + this.listener = listener + return this + } + + fun build(): BottomAreaSheet { + return BottomAreaSheet(this) + } + } + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + this.initDialogLayoutParams(Gravity.BOTTOM, R.style.ActionSheetDialogAnimation, 1.0f) + setContentView(R.layout.sheet_bottom_area) + setCancelable(false) + setCanceledOnTouchOutside(false) + + dismissView.setOnClickListener { dismiss() } + + var districtId = "" + var streetId = "" + //街道 + val authenticateViewModel = vm as AuthenticateViewModel + //默认加载第一个区的街道 + val firstDistrict = firstLevelArea[0] + var districtName = if (firstDistrict.simplename.toString().isBlank()) + firstDistrict.simplename + else + firstDistrict.name + selectedAreaView.text = districtName + authenticateViewModel.obtainStreet(firstDistrict.id) + + //行政区 + firstAreaListView.adapter = DistrictDataAdapter(firstLevelArea) + firstAreaListView.onItemClickListener = AdapterView.OnItemClickListener { _, _, i, _ -> + //只选择到一级区域 + districtName = if (firstLevelArea[i].simplename.toString().isBlank()) + firstLevelArea[i].simplename + else + firstLevelArea[i].name + districtId = firstLevelArea[i].id + selectedAreaView.text = districtName + + if (districtId.isBlank()) { + "一级区域ID为空,无法获取下级街道列表".show() + return@OnItemClickListener + } + authenticateViewModel.obtainStreet(districtId) + } + authenticateViewModel.streetModel.observe(owner, { + if (it.code == 200) { + val streetModels = it.data + secondAreaListView.adapter = StreetDataAdapter(streetModels) + secondAreaListView.onItemClickListener = + AdapterView.OnItemClickListener { _, _, i, _ -> + val streetName = if (streetModels[i].simplename.toString().isBlank()) + streetModels[i].simplename + else + streetModels[i].name + streetId = streetModels[i].id + selectedAreaView.text = String.format("$districtName-$streetName") + } + } + }) + + sheetConfirmButton.setOnClickListener { + listener.onAreaSelected(selectedAreaView.text.toString(), districtId, streetId) + dismiss() + } + } + + interface OnActionSheetListener { + fun onAreaSelected(area: String?, districtId: String, streetId: String) + } + + internal inner class DistrictDataAdapter(private val dataBeans: List) : + BaseAdapter() { + + private val inflater: LayoutInflater = LayoutInflater.from(context) + + override fun getCount(): Int = dataBeans.size + + override fun getItem(position: Int): Any = dataBeans[position] + + override fun getItemId(position: Int): Long = position.toLong() + + override fun getView(position: Int, convertView: View?, parent: ViewGroup): View { + val view: View + val holder: ItemViewHolder + if (convertView == null) { + holder = ItemViewHolder() + view = inflater.inflate(R.layout.item_area_sheet, null) + holder.areaItemView = view.findViewById(R.id.areaItemView) + view.tag = holder + } else { + view = convertView + holder = view.tag as ItemViewHolder + } + val dataBean = dataBeans[position] + holder.areaItemView.setBackgroundResource(R.drawable.sheet_item_selector) + holder.areaItemView.text = + if (dataBean.simplename.toString().isBlank()) dataBean.simplename else dataBean.name + //需要动态设置item的高度 + val param = AbsListView.LayoutParams( + WindowManager.LayoutParams.MATCH_PARENT, + SizeUtil.dp2px(context, 46f) + ) + view.layoutParams = param + return view + } + + internal inner class ItemViewHolder { + lateinit var areaItemView: TextView + } + } + + internal inner class StreetDataAdapter(private val dataBeans: List) : + BaseAdapter() { + + private val inflater: LayoutInflater = LayoutInflater.from(context) + + override fun getCount(): Int = dataBeans.size + + override fun getItem(position: Int): Any = dataBeans[position] + + override fun getItemId(position: Int): Long = position.toLong() + + override fun getView(position: Int, convertView: View?, parent: ViewGroup): View { + val view: View + val holder: ItemViewHolder + if (convertView == null) { + holder = ItemViewHolder() + view = inflater.inflate(R.layout.item_area_sheet, null) + holder.areaItemView = view.findViewById(R.id.areaItemView) + view.tag = holder + } else { + view = convertView + holder = view.tag as ItemViewHolder + } + val dataBean = dataBeans[position] + holder.areaItemView.setBackgroundResource(R.drawable.sheet_item_selector) + holder.areaItemView.text = + if (dataBean.simplename.toString().isBlank()) dataBean.simplename else dataBean.name + //需要动态设置item的高度 + val param = AbsListView.LayoutParams( + WindowManager.LayoutParams.MATCH_PARENT, + SizeUtil.dp2px(context, 46f) + ) + view.layoutParams = param + return view + } + + internal inner class ItemViewHolder { + lateinit var areaItemView: TextView + } + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_solid_layout_white_radius_top_10.xml b/app/src/main/res/drawable/bg_solid_layout_white_radius_top_10.xml new file mode 100644 index 0000000..9570167 --- /dev/null +++ b/app/src/main/res/drawable/bg_solid_layout_white_radius_top_10.xml @@ -0,0 +1,10 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_add_pic.xml b/app/src/main/res/drawable/ic_add_pic.xml new file mode 100644 index 0000000..9d1e830 --- /dev/null +++ b/app/src/main/res/drawable/ic_add_pic.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_error.xml b/app/src/main/res/drawable/ic_error.xml new file mode 100644 index 0000000..4d3c44d --- /dev/null +++ b/app/src/main/res/drawable/ic_error.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/build.gradle b/app/build.gradle index fdf5fc7..804f233 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -102,8 +102,6 @@ implementation 'com.google.code.gson:gson:2.8.6' //上拉加载下拉刷新 implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' - //高德地图搜索 - implementation 'com.amap.api:search:8.1.0' //高德导航 implementation 'com.amap.api:navi-3dmap:8.1.0_3dmap8.1.0' //日期选择器 diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 3fcef8b..460648b 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -9,6 +9,7 @@ + @@ -51,6 +52,7 @@ android:name=".view.BigImageActivity" android:theme="@style/Theme.BigImageActivity" /> + () { + + private val countLimit = 4 + private var imageData: ArrayList = ArrayList() + + fun setupImage(images: ArrayList) { + this.imageData = images + notifyDataSetChanged() + } + + fun deleteImage(position: Int) { + if (imageData.size != 0) { + imageData.removeAt(position) + notifyDataSetChanged() + } + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { + val imageView = ImageView(context) + val screenWidth: Int = SizeUtil.getScreenWidth(context) - SizeUtil.dp2px(context, 40f) + val margins: Int = SizeUtil.dp2px(context, 3f) + val itemSize = (screenWidth - 6 * margins) / 3 + val params = LinearLayout.LayoutParams(itemSize, itemSize) + params.setMargins(margins, margins, margins, margins) + params.gravity = Gravity.CENTER + imageView.scaleType = ImageView.ScaleType.CENTER_CROP + imageView.layoutParams = params + return ItemViewHolder(imageView) + } + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + if (position == itemCount - 1 && imageData.size < countLimit) { + holder.imageView.setImageResource(R.drawable.ic_add_pic) + holder.imageView.setOnClickListener { //添加图片 + mOnItemClickListener!!.onAddImageClick() + } + } else { + Glide.with(context).load(imageData[position]).into(holder.imageView) + holder.imageView.setOnClickListener { // 点击操作,查看大图 + mOnItemClickListener!!.onItemClick(position) + } + // 长按监听 + holder.imageView.setOnLongClickListener { v -> //长按删除 + mOnItemClickListener!!.onItemLongClick(v, position) + true + } + } + } + + override fun getItemCount(): Int { + // 满3张图就不让其添加新图 + return if (imageData.size != 0 && imageData.size >= countLimit) { + countLimit + } else { + if (imageData.size == 0) 1 else imageData.size + 1 + } + } + + private var mOnItemClickListener: OnItemClickListener? = null + + fun setOnItemClickListener(onItemClickListener: OnItemClickListener?) { + mOnItemClickListener = onItemClickListener + } + + interface OnItemClickListener { + fun onAddImageClick() + fun onItemClick(position: Int) + fun onItemLongClick(view: View?, position: Int) + } + + inner class ItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val imageView: ImageView = itemView as ImageView + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt index 3a098be..ad20c8b 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt @@ -31,7 +31,10 @@ setContentView(initLayoutView()) ImmersionBar.with(this).statusBarDarkFont(false).init() //沉浸式状态栏 when (this.javaClass.simpleName) { - "WelcomeActivity" -> ImmersionBar.with(this).statusBarDarkFont(true).init() + "WelcomeActivity" -> { + ImmersionBar.with(this).statusBarDarkFont(true).init() + StatusBarColorUtil.setColor(this, R.color.white.convertColor(this)) + } "SplashScreenActivity" -> ImmersionBar.with(this).statusBarDarkFont(false).init() "LoginActivity" -> ImmersionBar.with(this).statusBarDarkFont(true).init() else -> StatusBarColorUtil.setColor(this, R.color.mainThemeColor.convertColor(this)) diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/extensions/ArrayList.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/extensions/ArrayList.kt index e77dbaa..3affed7 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/extensions/ArrayList.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/extensions/ArrayList.kt @@ -13,7 +13,7 @@ if (index == this.size - 1) { builder.append(s) } else { - builder.append(s).append(",") + builder.append(s).append(";") } } return builder.toString() diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/model/AreaModel.java b/app/src/main/java/com/casic/app/smartwell/sanxi/model/AreaModel.java new file mode 100644 index 0000000..3ee4c83 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/model/AreaModel.java @@ -0,0 +1,125 @@ +package com.casic.app.smartwell.sanxi.model; + +public class AreaModel { + + private int code; + private DataBean data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataBean getData() { + return data; + } + + public void setData(DataBean data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private String area; + private String communications; + private String deptid; + private String deviceTypes; + private String id; + private String lat; + private String lng; + private String map; + private String wellTypes; + + public String getArea() { + return area; + } + + public void setArea(String area) { + this.area = area; + } + + public String getCommunications() { + return communications; + } + + public void setCommunications(String communications) { + this.communications = communications; + } + + public String getDeptid() { + return deptid; + } + + public void setDeptid(String deptid) { + this.deptid = deptid; + } + + public String getDeviceTypes() { + return deviceTypes; + } + + public void setDeviceTypes(String deviceTypes) { + this.deviceTypes = deviceTypes; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getLat() { + return lat; + } + + public void setLat(String lat) { + this.lat = lat; + } + + public String getLng() { + return lng; + } + + public void setLng(String lng) { + this.lng = lng; + } + + public String getMap() { + return map; + } + + public void setMap(String map) { + this.map = map; + } + + public String getWellTypes() { + return wellTypes; + } + + public void setWellTypes(String wellTypes) { + this.wellTypes = wellTypes; + } + } +} diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/model/DistrictModel.java b/app/src/main/java/com/casic/app/smartwell/sanxi/model/DistrictModel.java new file mode 100644 index 0000000..02e9ef2 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/model/DistrictModel.java @@ -0,0 +1,172 @@ +package com.casic.app.smartwell.sanxi.model; + +import java.util.List; + +public class DistrictModel { + + private int code; + private List data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public List getData() { + return data; + } + + public void setData(List data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private String id; + private String isSync; + private String lat; + private int level; + private String levelName; + private String lng; + private String name; + private int num; + private String pName; + private String pid; + private String pids; + private String simplename; + private String targetIdSync; + private String targetPidSync; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getIsSync() { + return isSync; + } + + public void setIsSync(String isSync) { + this.isSync = isSync; + } + + public String getLat() { + return lat; + } + + public void setLat(String lat) { + this.lat = lat; + } + + public int getLevel() { + return level; + } + + public void setLevel(int level) { + this.level = level; + } + + public String getLevelName() { + return levelName; + } + + public void setLevelName(String levelName) { + this.levelName = levelName; + } + + public String getLng() { + return lng; + } + + public void setLng(String lng) { + this.lng = lng; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getNum() { + return num; + } + + public void setNum(int num) { + this.num = num; + } + + public String getPName() { + return pName; + } + + public void setPName(String pName) { + this.pName = pName; + } + + public String getPid() { + return pid; + } + + public void setPid(String pid) { + this.pid = pid; + } + + public String getPids() { + return pids; + } + + public void setPids(String pids) { + this.pids = pids; + } + + public String getSimplename() { + return simplename; + } + + public void setSimplename(String simplename) { + this.simplename = simplename; + } + + public String getTargetIdSync() { + return targetIdSync; + } + + public void setTargetIdSync(String targetIdSync) { + this.targetIdSync = targetIdSync; + } + + public String getTargetPidSync() { + return targetPidSync; + } + + public void setTargetPidSync(String targetPidSync) { + this.targetPidSync = targetPidSync; + } + } +} diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/model/StreetModel.java b/app/src/main/java/com/casic/app/smartwell/sanxi/model/StreetModel.java new file mode 100644 index 0000000..90cc7d5 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/model/StreetModel.java @@ -0,0 +1,172 @@ +package com.casic.app.smartwell.sanxi.model; + +import java.util.List; + +public class StreetModel { + + private int code; + private List data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public List getData() { + return data; + } + + public void setData(List data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private String id; + private String isSync; + private String lat; + private int level; + private String levelName; + private String lng; + private String name; + private int num; + private String pName; + private String pid; + private String pids; + private String simplename; + private String targetIdSync; + private String targetPidSync; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getIsSync() { + return isSync; + } + + public void setIsSync(String isSync) { + this.isSync = isSync; + } + + public String getLat() { + return lat; + } + + public void setLat(String lat) { + this.lat = lat; + } + + public int getLevel() { + return level; + } + + public void setLevel(int level) { + this.level = level; + } + + public String getLevelName() { + return levelName; + } + + public void setLevelName(String levelName) { + this.levelName = levelName; + } + + public String getLng() { + return lng; + } + + public void setLng(String lng) { + this.lng = lng; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getNum() { + return num; + } + + public void setNum(int num) { + this.num = num; + } + + public String getPName() { + return pName; + } + + public void setPName(String pName) { + this.pName = pName; + } + + public String getPid() { + return pid; + } + + public void setPid(String pid) { + this.pid = pid; + } + + public String getPids() { + return pids; + } + + public void setPids(String pids) { + this.pids = pids; + } + + public String getSimplename() { + return simplename; + } + + public void setSimplename(String simplename) { + this.simplename = simplename; + } + + public String getTargetIdSync() { + return targetIdSync; + } + + public void setTargetIdSync(String targetIdSync) { + this.targetIdSync = targetIdSync; + } + + public String getTargetPidSync() { + return targetPidSync; + } + + public void setTargetPidSync(String targetPidSync) { + this.targetPidSync = targetPidSync; + } + } +} diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/Constant.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/Constant.kt index bae51d6..3251baa 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/Constant.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/Constant.kt @@ -7,6 +7,7 @@ object Constant { val USER_PERMISSIONS = arrayOf( Manifest.permission.READ_EXTERNAL_STORAGE, + Manifest.permission.CAMERA, Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS, Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION, diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/FileUtils.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/FileUtils.kt index 3e9ae35..cef2d83 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/FileUtils.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/FileUtils.kt @@ -18,4 +18,13 @@ } return downloadDir.toString() } + + val imageCompressPath: String + get() { + val imageDir = File(context.getExternalFilesDir(Environment.DIRECTORY_PICTURES), "") + if (!imageDir.exists()) { + imageDir.mkdir() + } + return imageDir.toString() + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt index 19687d2..bd311a4 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt @@ -289,6 +289,77 @@ ): String /** + * 上传图片 + * 系统路径static拼接图片返回路径 + * http://xx.com/static/2019-10/8050891248624f2bbefedcb196ce89cb.jpeg + */ + @Multipart + @POST("/imageUpload") + suspend fun uploadFile( + @Header("token") token: String, + @Part file: MultipartBody.Part + ): String + + /** + * 根据部门获取区ID + * + * @param deptId + */ + @GET("/config/getAreaByDept") + suspend fun obtainAreaByDept( + @Header("token") token: String, + @Query("deptId") deptId: String + ): String + + /** + * 获取区/县等 + * + * @param pid + */ + @GET("/area/list") + suspend fun obtainDistrict( + @Header("token") token: String, + @Query("pid") pid: String + ): String + + /** + * 获取街道 + * + * @param pid + */ + @GET("/area/list") + suspend fun obtainStreet( + @Header("token") token: String, + @Query("pid") pid: String + ): String + + /** + * 编辑更新井信息 + * + * @param id + */ + @FormUrlEncoded + @POST("/well/update") + suspend fun updateWellDetail( + @Header("token") token: String, + @Field("id") id: String, + @Field("wellCode") wellCode: String, + @Field("wellName") wellName: String, + @Field("wellType") wellType: String, + @Field("deptid") deptid: String, + @Field("deep") deep: String, + @Field("position") position: String, + @Field("coordinateX") coordinateX: String, + @Field("coordinateY") coordinateY: String, + @Field("photos") photos: String, + @Field("notes") notes: String?, + @Field("qu") qu: String, + @Field("area") area: String, + @Field("responsibleDept") responsibleDept: String, + @Field("responsibleDeptName") responsibleDeptName: String + ): String + + /** * 获取工单详情 * * @param id 工单id @@ -312,18 +383,6 @@ ): String /** - * 上传图片 - * 系统路径static拼接图片返回路径 - * http://xx.com/static/2019-10/8050891248624f2bbefedcb196ce89cb.jpeg - */ - @Multipart - @POST("/imageUpload") - suspend fun uploadImage( - @Header("token") token: String, - @Part file: MultipartBody.Part - ): String - - /** * 查找同一单位下的用户 * * @param hasMine 是否包含本人,1包含, 0不包含 diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt index efd6b11..e35e976 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt @@ -3,6 +3,10 @@ import com.casic.app.smartwell.sanxi.model.PublicKeyModel import com.casic.app.smartwell.sanxi.utils.AuthenticationHelper import com.casic.app.smartwell.sanxi.utils.Constant +import okhttp3.MediaType.Companion.toMediaTypeOrNull +import okhttp3.MultipartBody +import okhttp3.RequestBody +import java.io.File object RetrofitServiceManager { @@ -272,6 +276,76 @@ return api.obtainOperationResult(AuthenticationHelper.token!!, wellId, bfzt) } + /** + * 上传图片 + */ + suspend fun uploadFile(image: File): String { + val requestBody = RequestBody.create("image/png".toMediaTypeOrNull(), image) + val imagePart = MultipartBody.Part.createFormData("file", image.name, requestBody) + return api.uploadFile(AuthenticationHelper.token!!, imagePart) + } + + /** + * 根据部门获取区ID + */ + suspend fun obtainAreaByDept(deptId: String): String { + return api.obtainAreaByDept(AuthenticationHelper.token!!, deptId) + } + + /** + * 获取区/县等 + */ + suspend fun obtainDistrict(pid: String): String { + return api.obtainDistrict(AuthenticationHelper.token!!, pid) + } + + /** + * 获取街道 + */ + suspend fun obtainStreet(pid: String): String { + return api.obtainStreet(AuthenticationHelper.token!!, pid) + } + + /** + * 编辑更新井信息 + */ + suspend fun updateWellDetail( + id: String, + wellCode: String, + wellName: String, + wellType: String, + deptid: String, + deep: String, + position: String, + coordinateX: String, + coordinateY: String, + photos: String, + notes: String?, + qu: String, + area: String, + responsibleDept: String, + responsibleDeptName: String + ): String { + return api.updateWellDetail( + AuthenticationHelper.token!!, + id, + wellCode, + wellName, + wellType, + deptid, + deep, + position, + coordinateX, + coordinateY, + photos, + notes, + qu, + area, + responsibleDept, + responsibleDeptName + ) + } + // /** // * 获取工单详情 // */ @@ -287,15 +361,6 @@ // } // // /** -// * 上传图片 -// */ -// suspend fun uploadImage(image: File): String { -// val requestBody = RequestBody.create("image/png".toMediaTypeOrNull(), image) -// val imagePart = MultipartBody.Part.createFormData("file", image.name, requestBody) -// return api.uploadImage(AuthenticationHelper.token!!, imagePart) -// } -// -// /** // * 查找同一单位下的用户 // */ // suspend fun obtainSubordinate(hasMine: String?, roleTips: String?): String { diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/EditWellActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/EditWellActivity.kt new file mode 100644 index 0000000..956dbce --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/EditWellActivity.kt @@ -0,0 +1,341 @@ +package com.casic.app.smartwell.sanxi.view + +import android.app.Activity +import android.content.Intent +import android.view.View +import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.GridLayoutManager +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.adapter.EditableImageAdapter +import com.casic.app.smartwell.sanxi.base.BaseActivity +import com.casic.app.smartwell.sanxi.extensions.combineImagePath +import com.casic.app.smartwell.sanxi.extensions.navigatePageTo +import com.casic.app.smartwell.sanxi.extensions.reformat +import com.casic.app.smartwell.sanxi.extensions.show +import com.casic.app.smartwell.sanxi.model.DistrictModel +import com.casic.app.smartwell.sanxi.model.OwnerShipModel +import com.casic.app.smartwell.sanxi.model.WellListPageModel +import com.casic.app.smartwell.sanxi.utils.* +import com.casic.app.smartwell.sanxi.vm.AuthenticateViewModel +import com.casic.app.smartwell.sanxi.vm.UploadFileViewModel +import com.casic.app.smartwell.sanxi.vm.WellViewModel +import com.casic.app.smartwell.sanxi.widgets.BottomAreaSheet +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken +import com.luck.picture.lib.PictureSelector +import com.luck.picture.lib.config.PictureConfig +import com.luck.picture.lib.config.PictureMimeType +import com.pengxh.app.multilib.widget.dialog.BottomActionSheet +import com.qmuiteam.qmui.widget.dialog.QMUIBottomSheet +import kotlinx.android.synthetic.main.activity_edit_well.* +import kotlinx.android.synthetic.main.include_base_title.* +import java.io.File + +class EditWellActivity : BaseActivity() { + + private val kTag = "EditWellActivity" + private lateinit var wellViewModel: WellViewModel + private lateinit var authenticateViewModel: AuthenticateViewModel + private lateinit var uploadImageViewModel: UploadFileViewModel + private lateinit var wellBeanJson: String + private lateinit var imageAdapter: EditableImageAdapter + private lateinit var wellBean: WellListPageModel.DataBean.RowsBean + private val imagePaths: ArrayList = ArrayList() //服务器返回的拍照数据集 + private val realPaths: ArrayList = ArrayList() //真实图片路径 + private val districtModels: ArrayList = ArrayList() //行政区 + private var wellType = "" + private var deptId = "" + private var districtId = "" + private var streetId = "" + + override fun initLayoutView(): Int = R.layout.activity_edit_well + + override fun setupTopBarLayout() { + leftBackView.setOnClickListener { finish() } + titleView.text = "编辑井信息" + } + + override fun initData() { + wellViewModel = ViewModelProvider(this).get(WellViewModel::class.java) + authenticateViewModel = ViewModelProvider(this).get(AuthenticateViewModel::class.java) + uploadImageViewModel = ViewModelProvider(this).get(UploadFileViewModel::class.java) + wellBeanJson = intent.getStringExtra(Constant.INTENT_PARAM)!! + wellBean = Gson().fromJson( + wellBeanJson, object : TypeToken() {}.type + ) + wellNameView.setText(wellBean.wellName) + wellCodeView.text = wellBean.wellCode + + this.wellType = wellBean.wellType + wellTypeView.text = wellBean.wellTypeName + + this.deptId = wellBean.deptid + ownerShipView.text = wellBean.deptName + wellDepthView.setText(wellBean.deep) + longitudeView.setText(wellBean.lngGaode) + latitudeView.setText(wellBean.latGaode) + + /** + * 2022-06/e805917f14ed49378bbd29cae391b061.png; + * 2022-06/48d34f27695346bbb39d695333faabee.png; + * 2022-06/6df199418fd84960a164ad9c9660e172.png; + * 2022-06/bfbab97a965d406ba30fc9d09ab35f5c.png; + * */ + //显示已有的图片 + val imageArray = wellBean.photos.toString().split(";") + imageArray.forEach { path -> + if (path.isNotBlank()) { + imagePaths.add(path) + realPaths.add(path.combineImagePath()) + } + } + imageAdapter = EditableImageAdapter(this) + imageAdapter.setupImage(realPaths) + imageRecyclerView.layoutManager = GridLayoutManager(this, 3) + imageRecyclerView.adapter = imageAdapter + + //默认加载当前井的区域 + authenticateViewModel.obtainAreaByDept(wellBean.deptid) + authenticateViewModel.areaModel.observe(this, { + if (it.code == 200) { + authenticateViewModel.obtainDistrict(it.data.area) + } + }) + addressView.setText(wellBean.position) + } + + override fun initEvent() { + wellCodeView.setOnClickListener { + "井编号不可编辑".show() + } + + wellTypeView.setOnClickListener { + wellViewModel.obtainWellType() + } + wellViewModel.wellTypeModel.observe(this, { + if (it.code == 200) { + val sheetBuilder = QMUIBottomSheet.BottomListSheetBuilder(this) + sheetBuilder.setTitle("井类型") + it.data.forEach { type -> + sheetBuilder.addItem(type.name) + } + sheetBuilder.setGravityCenter(true) + .setOnSheetItemClickListener { dialog, _, position, tag -> + this.wellType = it.data[position].value + wellTypeView.text = tag + + dialog.dismiss() + }.build().show() + } + }) + + ownerShipView.setOnClickListener { + authenticateViewModel.obtainOwnerShip("03") + } + + imageAdapter.setOnItemClickListener(object : EditableImageAdapter.OnItemClickListener { + override fun onAddImageClick() { + selectPicture() + } + + override fun onItemClick(position: Int) { + if (realPaths[position].isBlank()) { + "图片加载失败,无法查看大图".show() + } else { + navigatePageTo(position, realPaths) + } + } + + override fun onItemLongClick(view: View?, position: Int) { + imagePaths.removeAt(position) + imageAdapter.deleteImage(position) + } + }) + + authenticateViewModel.resultModel.observe(this, { + if (it.code == 200) { + val ownerShipModel: MutableList = ArrayList() + it.data?.list?.forEach { listBean -> + ownerShipModel.add(listBean) + } + val sheetBuilder = QMUIBottomSheet.BottomListSheetBuilder(this) + sheetBuilder.setTitle("权属单位") + ownerShipModel.forEach { model -> + sheetBuilder.addItem(model.name) + } + sheetBuilder.setGravityCenter(true) + .setOnSheetItemClickListener { dialog, _, position, tag -> + this.deptId = it.data?.list!![position].id + ownerShipView.text = tag + + dialog.dismiss() + }.build().show() + } + }) + + authenticateViewModel.districtModel.observe(this, { + if (it.code == 200) { + it.data.forEach { area -> + districtModels.add(area) + //判断区 + if (area.id == wellBean.qu) { + authenticateViewModel.obtainStreet(area.id) + authenticateViewModel.streetModel.observe(this, { street -> + if (street.code == 200) { + street.data.forEach { streetData -> + //判断街道 + if (streetData.id == wellBean.area) { + districtView.text = + String.format("${area.name}${streetData.name}") + } + } + } + }) + } + } + } + }) + + //点击选择井的区域 + districtView.setOnClickListener { + if (districtModels.isNullOrEmpty()) { + "无行政区域数据,无法修改".show() + return@setOnClickListener + } + BottomAreaSheet.Builder() + .setContext(this) + .setLifecycleOwner(this) + .setDistrictAreaData(districtModels) + .setChildDataViewModel(authenticateViewModel) + .setOnActionSheetListener(object : BottomAreaSheet.OnActionSheetListener { + override fun onAreaSelected( + area: String?, districtId: String, streetId: String + ) { + districtView.text = area?.replace("-", "") + this@EditWellActivity.districtId = districtId + this@EditWellActivity.streetId = streetId + } + }) + .build().show() + } + + //提交修改 + saveButton.setOnClickListener { + if (districtId.isEmpty() || streetId.isEmpty()) { + "行政区ID为空或者街道ID为空".show() + return@setOnClickListener + } + wellViewModel.updateWellDetail( + id = wellBean.id, + wellCode = wellBean.wellCode, + wellName = wellNameView.text.toString(), + wellType = wellType, + deptid = deptId, + deep = wellDepthView.text.toString(), + position = addressView.text.toString(), + coordinateX = longitudeView.text.toString(), + coordinateY = latitudeView.text.toString(), + photos = imagePaths.reformat(), + notes = "", + qu = districtId, + area = streetId, + responsibleDept = deptId, + responsibleDeptName = ownerShipView.text.toString() + ) + } + + uploadImageViewModel.resultModel.observe(this, { model -> + if (model.code == 200) { + /** + * 显示图片 + * path: 2021-07\c670eac17d644b179a4324a34bb84329.jpeg + * */ + /** + * 显示图片 + * path: 2021-07\c670eac17d644b179a4324a34bb84329.jpeg + * */ + val sumItemCount: Int = imageAdapter.itemCount + 1 //每上传一张图片,图片总数都是在原有的基础上+1 + if (sumItemCount <= 5) { + val url = model.data + //let函数处理需要针对一个可null的对象统一做判空处理。 + url?.let { + imagePaths.add(it) + realPaths.add(it.combineImagePath()) + } + imageAdapter.setupImage(realPaths) + } else { + "最多只能上传4张图片".show() + } + } + }) + uploadImageViewModel.loadState.observe(this, { + DialogHelper.dismissLoadingDialog() + }) + + wellViewModel.loadState.observe(this, { + when (it) { + is LoadState.Loading -> { + DialogHelper.showLoadingDialog(this, "保存中,请稍后...") + } + is LoadState.Success -> { + DialogHelper.dismissLoadingDialog() + finish() + } + else -> { + DialogHelper.dismissLoadingDialog() + } + } + }) + } + + private fun selectPicture() { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitles(arrayOf("拍照", "相册")) + .setOnActionSheetListener { position -> + when (position) { + 0 -> { + PictureSelector.create(this) + .openCamera(PictureMimeType.ofImage()) + .isCompress(true) + .compressSavePath(FileUtils.imageCompressPath) + .imageEngine(GlideLoadEngine.createGlideEngine()) + .forResult(PictureConfig.REQUEST_CAMERA) + } + 1 -> { + PictureSelector.create(this) + .openGallery(PictureMimeType.ofImage()) + .isWeChatStyle(true) + .isCamera(false) + .isCompress(true) + .compressSavePath(FileUtils.imageCompressPath) + .imageEngine(GlideLoadEngine.createGlideEngine()) + .maxSelectNum(4) + .forResult(PictureConfig.CHOOSE_REQUEST) + } + } + }.build().show() + } + + override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { + super.onActivityResult(requestCode, resultCode, data) + if (resultCode == Activity.RESULT_OK) { + when (requestCode) { + PictureConfig.CHOOSE_REQUEST -> { + val selectResult = PictureSelector.obtainMultipleResult(data) + DialogHelper.showLoadingDialog(this, "图片上传中,请稍后...") + for (res in selectResult) { + val file = File(res.compressPath) + //上传图片 + uploadImageViewModel.uploadFile(file) + } + } + PictureConfig.REQUEST_CAMERA -> { + val cameraResult = PictureSelector.obtainMultipleResult(data)[0] + //上传图片 + uploadImageViewModel.uploadFile(File(cameraResult.compressPath)) + } + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellDetailActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellDetailActivity.kt index 50c9e05..6c93e4e 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellDetailActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellDetailActivity.kt @@ -9,28 +9,30 @@ import com.amap.api.maps.model.CameraPosition import com.amap.api.maps.model.LatLng import com.amap.api.maps.model.MarkerOptions -import com.amap.api.services.core.LatLonPoint -import com.amap.api.services.geocoder.GeocodeResult -import com.amap.api.services.geocoder.GeocodeSearch -import com.amap.api.services.geocoder.RegeocodeQuery -import com.amap.api.services.geocoder.RegeocodeResult import com.casic.app.smartwell.sanxi.R import com.casic.app.smartwell.sanxi.base.BaseActivity import com.casic.app.smartwell.sanxi.extensions.show import com.casic.app.smartwell.sanxi.utils.Constant import com.casic.app.smartwell.sanxi.utils.DialogHelper import com.casic.app.smartwell.sanxi.utils.LoadState +import com.casic.app.smartwell.sanxi.vm.AuthenticateViewModel import com.casic.app.smartwell.sanxi.vm.WellViewModel import com.pengxh.app.multilib.widget.dialog.AlertMessageDialog import kotlinx.android.synthetic.main.activity_well_detail.* +import kotlinx.android.synthetic.main.activity_well_detail.wellCodeView +import kotlinx.android.synthetic.main.activity_well_detail.wellDepthView +import kotlinx.android.synthetic.main.activity_well_detail.wellNameView +import kotlinx.android.synthetic.main.activity_well_detail.wellStateView +import kotlinx.android.synthetic.main.activity_well_detail.wellTypeView +import kotlinx.android.synthetic.main.activity_well_list_detail.* import kotlinx.android.synthetic.main.include_base_title.* class WellDetailActivity : BaseActivity(), AMap.OnMapLoadedListener { private val kTag = "WellDetailActivity" - private val geocoderSearch by lazy { GeocodeSearch(this) } private lateinit var wellViewModel: WellViewModel + private lateinit var authenticateViewModel: AuthenticateViewModel private lateinit var wellId: String private lateinit var aMap: AMap private var latLng: LatLng? = null @@ -46,6 +48,7 @@ override fun initData() { wellId = intent.getStringExtra(Constant.INTENT_PARAM)!! wellViewModel = ViewModelProvider(this).get(WellViewModel::class.java) + authenticateViewModel = ViewModelProvider(this).get(AuthenticateViewModel::class.java) aMap = wellMapView.map aMap.mapType = AMap.MAP_TYPE_NORMAL @@ -103,39 +106,41 @@ val wellPosition = wellDetail.position.toString() wellLocationView.text = wellPosition - //根据经纬度获取省市区县 if (wellDetail.latGaode.isBlank() || wellDetail.lngGaode.isBlank()) { "井经纬度异常,无法查看完整位置信息".show() return@observe } this.latLng = LatLng(wellDetail.latGaode.toDouble(), wellDetail.lngGaode.toDouble()) - val queryParam = RegeocodeQuery( - LatLonPoint(wellDetail.latGaode.toDouble(), wellDetail.lngGaode.toDouble()), - 200f, - GeocodeSearch.AMAP - ) - tipsImageView.setOnClickListener { - geocoderSearch.getFromLocationAsyn(queryParam) + authenticateViewModel.obtainAreaByDept(wellDetail.deptid) } - - geocoderSearch.setOnGeocodeSearchListener(object : - GeocodeSearch.OnGeocodeSearchListener { - override fun onRegeocodeSearched(result: RegeocodeResult?, rCode: Int) { - if (rCode == 1000) { - AlertMessageDialog.Builder() - .setContext(this@WellDetailActivity) - .setTitle("闸井完整位置") - .setMessage(result?.regeocodeAddress?.formatAddress + "-" + wellPosition) - .setPositiveButton("知道了").setOnDialogButtonClickListener {}.build() - .show() - } else { - "获取该闸井详细位置信息失败".show() - } + authenticateViewModel.areaModel.observe(this, { areaModel -> + if (areaModel.code == 200) { + authenticateViewModel.obtainDistrict(areaModel.data.area) } - - override fun onGeocodeSearched(result: GeocodeResult?, rCode: Int) { - + }) + authenticateViewModel.districtModel.observe(this, { districtModel -> + if (districtModel.code == 200) { + districtModel.data.forEach { area -> + if (area.id == wellDetail.qu) { + authenticateViewModel.obtainStreet(area.id) + authenticateViewModel.streetModel.observe(this, { street -> + if (street.code == 200) { + street.data.forEach { streetData -> + if (streetData.id == wellDetail.area) { + AlertMessageDialog.Builder() + .setContext(this@WellDetailActivity) + .setTitle("闸井完整位置") + .setMessage(String.format("${area.name}${streetData.name}") + "-" + wellPosition) + .setPositiveButton("知道了") + .setOnDialogButtonClickListener {}.build() + .show() + } + } + } + }) + } + } } }) } diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellListDetailActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellListDetailActivity.kt index b34be03..d28b752 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellListDetailActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellListDetailActivity.kt @@ -4,11 +4,6 @@ import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.GridLayoutManager import androidx.recyclerview.widget.LinearLayoutManager -import com.amap.api.services.core.LatLonPoint -import com.amap.api.services.geocoder.GeocodeResult -import com.amap.api.services.geocoder.GeocodeSearch -import com.amap.api.services.geocoder.RegeocodeQuery -import com.amap.api.services.geocoder.RegeocodeResult import com.casic.app.smartwell.sanxi.R import com.casic.app.smartwell.sanxi.adapter.DeviceDataListAdapter import com.casic.app.smartwell.sanxi.adapter.DeviceDataTitleAdapter @@ -19,6 +14,7 @@ import com.casic.app.smartwell.sanxi.extensions.show import com.casic.app.smartwell.sanxi.model.WellListPageModel import com.casic.app.smartwell.sanxi.utils.Constant +import com.casic.app.smartwell.sanxi.vm.AuthenticateViewModel import com.casic.app.smartwell.sanxi.vm.WellViewModel import com.google.gson.Gson import com.google.gson.reflect.TypeToken @@ -28,8 +24,8 @@ class WellListDetailActivity : BaseActivity() { private val kTag = "WellListDetailActivity" - private val geocoderSearch by lazy { GeocodeSearch(this) } private lateinit var wellViewModel: WellViewModel + private lateinit var authenticateViewModel: AuthenticateViewModel private lateinit var wellBeanJson: String override fun initLayoutView(): Int = R.layout.activity_well_list_detail @@ -41,6 +37,7 @@ override fun initData() { wellViewModel = ViewModelProvider(this).get(WellViewModel::class.java) + authenticateViewModel = ViewModelProvider(this).get(AuthenticateViewModel::class.java) wellBeanJson = intent.getStringExtra(Constant.INTENT_PARAM)!! val wellBean = Gson().fromJson( wellBeanJson, object : TypeToken() {}.type @@ -89,29 +86,32 @@ }) } - //根据经纬度获取省市区县 - if (wellBean.latGaode.isBlank() || wellBean.lngGaode.isBlank()) { - "井经纬度异常,无法查看完整位置信息".show() - return - } - val queryParam = RegeocodeQuery( - LatLonPoint(wellBean.latGaode.toDouble(), wellBean.lngGaode.toDouble()), - 200f, - GeocodeSearch.AMAP - ) - geocoderSearch.getFromLocationAsyn(queryParam) - geocoderSearch.setOnGeocodeSearchListener(object : - GeocodeSearch.OnGeocodeSearchListener { - override fun onRegeocodeSearched(result: RegeocodeResult?, rCode: Int) { - if (rCode == 1000) { - districtView.text = result?.regeocodeAddress?.formatAddress - } - } - - override fun onGeocodeSearched(result: GeocodeResult?, rCode: Int) { - + authenticateViewModel.obtainAreaByDept(wellBean.deptid) + authenticateViewModel.areaModel.observe(this, { + if (it.code == 200) { + authenticateViewModel.obtainDistrict(it.data.area) } }) + authenticateViewModel.districtModel.observe(this, { + if (it.code == 200) { + it.data.forEach { area -> + if (area.id == wellBean.qu) { + authenticateViewModel.obtainStreet(area.id) + authenticateViewModel.streetModel.observe(this, { street -> + if (street.code == 200) { + street.data.forEach { streetData -> + if (streetData.id == wellBean.area) { + districtView.text = + String.format("${area.name}${streetData.name}") + } + } + } + }) + } + } + } + }) + addressView.text = wellBean.position maintenanceView.text = wellBean.responsibleDeptName diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellManageActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellManageActivity.kt index 1cd5616..8fc415b 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellManageActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellManageActivity.kt @@ -251,7 +251,7 @@ } override fun onEditClicked(position: Int) { - + navigatePageTo(dataBeans[position].toJson()) } override fun onOperationClicked(position: Int) { diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/vm/AuthenticateViewModel.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/vm/AuthenticateViewModel.kt index 5186591..4632b20 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/vm/AuthenticateViewModel.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/vm/AuthenticateViewModel.kt @@ -3,8 +3,7 @@ import androidx.lifecycle.MutableLiveData import com.casic.app.smartwell.sanxi.base.BaseViewModel import com.casic.app.smartwell.sanxi.extensions.* -import com.casic.app.smartwell.sanxi.model.OwnerShipModel -import com.casic.app.smartwell.sanxi.model.PublicKeyModel +import com.casic.app.smartwell.sanxi.model.* import com.casic.app.smartwell.sanxi.utils.Constant import com.casic.app.smartwell.sanxi.utils.LoadState import com.casic.app.smartwell.sanxi.utils.SaveKeyValues @@ -18,6 +17,9 @@ private val gson = Gson() val keyModel = MutableLiveData() val resultModel = MutableLiveData() + val areaModel = MutableLiveData() + val districtModel = MutableLiveData() + val streetModel = MutableLiveData() fun obtainPublicKey() = launch({ loadState.value = LoadState.Loading @@ -62,4 +64,55 @@ }, { it.printStackTrace() }) + + /** + * 根据部门获取区ID + */ + fun obtainAreaByDept(deptId: String) = launch({ + val response = RetrofitServiceManager.obtainAreaByDept(deptId) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + areaModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + response.toErrorMessage().show() + } + }, { + it.printStackTrace() + }) + + /** + * 区/县等 + */ + fun obtainDistrict(pid: String) = launch({ + val response = RetrofitServiceManager.obtainDistrict(pid) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + districtModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + response.toErrorMessage().show() + } + }, { + it.printStackTrace() + }) + + /** + * 街道 + */ + fun obtainStreet(areaId: String) = launch({ + val response = RetrofitServiceManager.obtainStreet(areaId) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + streetModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + response.toErrorMessage().show() + } + }, { + it.printStackTrace() + }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/vm/UploadFileViewModel.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/vm/UploadFileViewModel.kt new file mode 100644 index 0000000..fe9d357 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/vm/UploadFileViewModel.kt @@ -0,0 +1,36 @@ +package com.casic.app.smartwell.sanxi.vm + +import androidx.lifecycle.MutableLiveData +import com.casic.app.smartwell.sanxi.base.BaseViewModel +import com.casic.app.smartwell.sanxi.extensions.launch +import com.casic.app.smartwell.sanxi.extensions.separateResponseCode +import com.casic.app.smartwell.sanxi.extensions.show +import com.casic.app.smartwell.sanxi.extensions.toErrorMessage +import com.casic.app.smartwell.sanxi.model.CommonResultModel +import com.casic.app.smartwell.sanxi.utils.LoadState +import com.casic.app.smartwell.sanxi.utils.retrofit.RetrofitServiceManager +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken +import java.io.File + +class UploadFileViewModel : BaseViewModel() { + + private val gson = Gson() + val resultModel = MutableLiveData() + + fun uploadFile(image: File) = launch({ + val response = RetrofitServiceManager.uploadFile(image) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + resultModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show() + } + }, { + loadState.value = LoadState.Fail + }) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/vm/WellViewModel.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/vm/WellViewModel.kt index 696dbf0..8e59b91 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/vm/WellViewModel.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/vm/WellViewModel.kt @@ -1,5 +1,6 @@ package com.casic.app.smartwell.sanxi.vm +import android.util.Log import androidx.lifecycle.MutableLiveData import com.casic.app.smartwell.sanxi.base.BaseViewModel import com.casic.app.smartwell.sanxi.extensions.launch @@ -15,6 +16,7 @@ class WellViewModel : BaseViewModel() { + private val kTag = "WellViewModel" private val gson = Gson() val detailModel = MutableLiveData() val allWellModel = MutableLiveData() @@ -152,4 +154,58 @@ loadState.value = LoadState.Fail it.printStackTrace() }) + + /** + * 编辑更新井信息 + * */ + fun updateWellDetail( + id: String, + wellCode: String, + wellName: String, + wellType: String, + deptid: String, + deep: String, + position: String, + coordinateX: String, + coordinateY: String, + photos: String, + notes: String?, + qu: String, + area: String, + responsibleDept: String, + responsibleDeptName: String + ) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.updateWellDetail( + id, + wellCode, + wellName, + wellType, + deptid, + deep, + position, + coordinateX, + coordinateY, + photos, + notes, + qu, + area, + responsibleDept, + responsibleDeptName + ) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + "更新成功".show() + commonResultModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show() + } + }, { + loadState.value = LoadState.Fail + it.printStackTrace() + }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/widgets/BottomAreaSheet.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/widgets/BottomAreaSheet.kt new file mode 100644 index 0000000..5f464be --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/widgets/BottomAreaSheet.kt @@ -0,0 +1,213 @@ +package com.casic.app.smartwell.sanxi.widgets + +import android.app.Dialog +import android.content.Context +import android.os.Bundle +import android.view.* +import android.widget.AbsListView +import android.widget.AdapterView +import android.widget.BaseAdapter +import android.widget.TextView +import androidx.lifecycle.LifecycleOwner +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseViewModel +import com.casic.app.smartwell.sanxi.extensions.initDialogLayoutParams +import com.casic.app.smartwell.sanxi.extensions.show +import com.casic.app.smartwell.sanxi.model.DistrictModel +import com.casic.app.smartwell.sanxi.model.StreetModel +import com.casic.app.smartwell.sanxi.vm.AuthenticateViewModel +import com.pengxh.app.multilib.utils.SizeUtil +import kotlinx.android.synthetic.main.sheet_bottom_area.* + +class BottomAreaSheet private constructor(builder: Builder) : Dialog( + builder.context, R.style.ActionSheetDialogStyle +) { + private val owner: LifecycleOwner = builder.owner + private val firstLevelArea: List = builder.firstLevelArea + private val vm: BaseViewModel = builder.vm + private val listener: OnActionSheetListener = builder.listener + + class Builder { + lateinit var context: Context + lateinit var owner: LifecycleOwner + lateinit var firstLevelArea: List + lateinit var vm: BaseViewModel + lateinit var listener: OnActionSheetListener + + fun setContext(context: Context): Builder { + this.context = context + return this + } + + fun setLifecycleOwner(owner: LifecycleOwner): Builder { + this.owner = owner + return this + } + + fun setDistrictAreaData(firstLevelArea: List): Builder { + this.firstLevelArea = firstLevelArea + return this + } + + fun setChildDataViewModel(vm: BaseViewModel): Builder { + this.vm = vm + return this + } + + fun setOnActionSheetListener(listener: OnActionSheetListener): Builder { + this.listener = listener + return this + } + + fun build(): BottomAreaSheet { + return BottomAreaSheet(this) + } + } + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + this.initDialogLayoutParams(Gravity.BOTTOM, R.style.ActionSheetDialogAnimation, 1.0f) + setContentView(R.layout.sheet_bottom_area) + setCancelable(false) + setCanceledOnTouchOutside(false) + + dismissView.setOnClickListener { dismiss() } + + var districtId = "" + var streetId = "" + //街道 + val authenticateViewModel = vm as AuthenticateViewModel + //默认加载第一个区的街道 + val firstDistrict = firstLevelArea[0] + var districtName = if (firstDistrict.simplename.toString().isBlank()) + firstDistrict.simplename + else + firstDistrict.name + selectedAreaView.text = districtName + authenticateViewModel.obtainStreet(firstDistrict.id) + + //行政区 + firstAreaListView.adapter = DistrictDataAdapter(firstLevelArea) + firstAreaListView.onItemClickListener = AdapterView.OnItemClickListener { _, _, i, _ -> + //只选择到一级区域 + districtName = if (firstLevelArea[i].simplename.toString().isBlank()) + firstLevelArea[i].simplename + else + firstLevelArea[i].name + districtId = firstLevelArea[i].id + selectedAreaView.text = districtName + + if (districtId.isBlank()) { + "一级区域ID为空,无法获取下级街道列表".show() + return@OnItemClickListener + } + authenticateViewModel.obtainStreet(districtId) + } + authenticateViewModel.streetModel.observe(owner, { + if (it.code == 200) { + val streetModels = it.data + secondAreaListView.adapter = StreetDataAdapter(streetModels) + secondAreaListView.onItemClickListener = + AdapterView.OnItemClickListener { _, _, i, _ -> + val streetName = if (streetModels[i].simplename.toString().isBlank()) + streetModels[i].simplename + else + streetModels[i].name + streetId = streetModels[i].id + selectedAreaView.text = String.format("$districtName-$streetName") + } + } + }) + + sheetConfirmButton.setOnClickListener { + listener.onAreaSelected(selectedAreaView.text.toString(), districtId, streetId) + dismiss() + } + } + + interface OnActionSheetListener { + fun onAreaSelected(area: String?, districtId: String, streetId: String) + } + + internal inner class DistrictDataAdapter(private val dataBeans: List) : + BaseAdapter() { + + private val inflater: LayoutInflater = LayoutInflater.from(context) + + override fun getCount(): Int = dataBeans.size + + override fun getItem(position: Int): Any = dataBeans[position] + + override fun getItemId(position: Int): Long = position.toLong() + + override fun getView(position: Int, convertView: View?, parent: ViewGroup): View { + val view: View + val holder: ItemViewHolder + if (convertView == null) { + holder = ItemViewHolder() + view = inflater.inflate(R.layout.item_area_sheet, null) + holder.areaItemView = view.findViewById(R.id.areaItemView) + view.tag = holder + } else { + view = convertView + holder = view.tag as ItemViewHolder + } + val dataBean = dataBeans[position] + holder.areaItemView.setBackgroundResource(R.drawable.sheet_item_selector) + holder.areaItemView.text = + if (dataBean.simplename.toString().isBlank()) dataBean.simplename else dataBean.name + //需要动态设置item的高度 + val param = AbsListView.LayoutParams( + WindowManager.LayoutParams.MATCH_PARENT, + SizeUtil.dp2px(context, 46f) + ) + view.layoutParams = param + return view + } + + internal inner class ItemViewHolder { + lateinit var areaItemView: TextView + } + } + + internal inner class StreetDataAdapter(private val dataBeans: List) : + BaseAdapter() { + + private val inflater: LayoutInflater = LayoutInflater.from(context) + + override fun getCount(): Int = dataBeans.size + + override fun getItem(position: Int): Any = dataBeans[position] + + override fun getItemId(position: Int): Long = position.toLong() + + override fun getView(position: Int, convertView: View?, parent: ViewGroup): View { + val view: View + val holder: ItemViewHolder + if (convertView == null) { + holder = ItemViewHolder() + view = inflater.inflate(R.layout.item_area_sheet, null) + holder.areaItemView = view.findViewById(R.id.areaItemView) + view.tag = holder + } else { + view = convertView + holder = view.tag as ItemViewHolder + } + val dataBean = dataBeans[position] + holder.areaItemView.setBackgroundResource(R.drawable.sheet_item_selector) + holder.areaItemView.text = + if (dataBean.simplename.toString().isBlank()) dataBean.simplename else dataBean.name + //需要动态设置item的高度 + val param = AbsListView.LayoutParams( + WindowManager.LayoutParams.MATCH_PARENT, + SizeUtil.dp2px(context, 46f) + ) + view.layoutParams = param + return view + } + + internal inner class ItemViewHolder { + lateinit var areaItemView: TextView + } + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_solid_layout_white_radius_top_10.xml b/app/src/main/res/drawable/bg_solid_layout_white_radius_top_10.xml new file mode 100644 index 0000000..9570167 --- /dev/null +++ b/app/src/main/res/drawable/bg_solid_layout_white_radius_top_10.xml @@ -0,0 +1,10 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_add_pic.xml b/app/src/main/res/drawable/ic_add_pic.xml new file mode 100644 index 0000000..9d1e830 --- /dev/null +++ b/app/src/main/res/drawable/ic_add_pic.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_error.xml b/app/src/main/res/drawable/ic_error.xml new file mode 100644 index 0000000..4d3c44d --- /dev/null +++ b/app/src/main/res/drawable/ic_error.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/sheet_item_selector.xml b/app/src/main/res/drawable/sheet_item_selector.xml new file mode 100644 index 0000000..82613d0 --- /dev/null +++ b/app/src/main/res/drawable/sheet_item_selector.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index fdf5fc7..804f233 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -102,8 +102,6 @@ implementation 'com.google.code.gson:gson:2.8.6' //上拉加载下拉刷新 implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' - //高德地图搜索 - implementation 'com.amap.api:search:8.1.0' //高德导航 implementation 'com.amap.api:navi-3dmap:8.1.0_3dmap8.1.0' //日期选择器 diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 3fcef8b..460648b 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -9,6 +9,7 @@ + @@ -51,6 +52,7 @@ android:name=".view.BigImageActivity" android:theme="@style/Theme.BigImageActivity" /> + () { + + private val countLimit = 4 + private var imageData: ArrayList = ArrayList() + + fun setupImage(images: ArrayList) { + this.imageData = images + notifyDataSetChanged() + } + + fun deleteImage(position: Int) { + if (imageData.size != 0) { + imageData.removeAt(position) + notifyDataSetChanged() + } + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { + val imageView = ImageView(context) + val screenWidth: Int = SizeUtil.getScreenWidth(context) - SizeUtil.dp2px(context, 40f) + val margins: Int = SizeUtil.dp2px(context, 3f) + val itemSize = (screenWidth - 6 * margins) / 3 + val params = LinearLayout.LayoutParams(itemSize, itemSize) + params.setMargins(margins, margins, margins, margins) + params.gravity = Gravity.CENTER + imageView.scaleType = ImageView.ScaleType.CENTER_CROP + imageView.layoutParams = params + return ItemViewHolder(imageView) + } + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + if (position == itemCount - 1 && imageData.size < countLimit) { + holder.imageView.setImageResource(R.drawable.ic_add_pic) + holder.imageView.setOnClickListener { //添加图片 + mOnItemClickListener!!.onAddImageClick() + } + } else { + Glide.with(context).load(imageData[position]).into(holder.imageView) + holder.imageView.setOnClickListener { // 点击操作,查看大图 + mOnItemClickListener!!.onItemClick(position) + } + // 长按监听 + holder.imageView.setOnLongClickListener { v -> //长按删除 + mOnItemClickListener!!.onItemLongClick(v, position) + true + } + } + } + + override fun getItemCount(): Int { + // 满3张图就不让其添加新图 + return if (imageData.size != 0 && imageData.size >= countLimit) { + countLimit + } else { + if (imageData.size == 0) 1 else imageData.size + 1 + } + } + + private var mOnItemClickListener: OnItemClickListener? = null + + fun setOnItemClickListener(onItemClickListener: OnItemClickListener?) { + mOnItemClickListener = onItemClickListener + } + + interface OnItemClickListener { + fun onAddImageClick() + fun onItemClick(position: Int) + fun onItemLongClick(view: View?, position: Int) + } + + inner class ItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val imageView: ImageView = itemView as ImageView + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt index 3a098be..ad20c8b 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt @@ -31,7 +31,10 @@ setContentView(initLayoutView()) ImmersionBar.with(this).statusBarDarkFont(false).init() //沉浸式状态栏 when (this.javaClass.simpleName) { - "WelcomeActivity" -> ImmersionBar.with(this).statusBarDarkFont(true).init() + "WelcomeActivity" -> { + ImmersionBar.with(this).statusBarDarkFont(true).init() + StatusBarColorUtil.setColor(this, R.color.white.convertColor(this)) + } "SplashScreenActivity" -> ImmersionBar.with(this).statusBarDarkFont(false).init() "LoginActivity" -> ImmersionBar.with(this).statusBarDarkFont(true).init() else -> StatusBarColorUtil.setColor(this, R.color.mainThemeColor.convertColor(this)) diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/extensions/ArrayList.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/extensions/ArrayList.kt index e77dbaa..3affed7 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/extensions/ArrayList.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/extensions/ArrayList.kt @@ -13,7 +13,7 @@ if (index == this.size - 1) { builder.append(s) } else { - builder.append(s).append(",") + builder.append(s).append(";") } } return builder.toString() diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/model/AreaModel.java b/app/src/main/java/com/casic/app/smartwell/sanxi/model/AreaModel.java new file mode 100644 index 0000000..3ee4c83 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/model/AreaModel.java @@ -0,0 +1,125 @@ +package com.casic.app.smartwell.sanxi.model; + +public class AreaModel { + + private int code; + private DataBean data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataBean getData() { + return data; + } + + public void setData(DataBean data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private String area; + private String communications; + private String deptid; + private String deviceTypes; + private String id; + private String lat; + private String lng; + private String map; + private String wellTypes; + + public String getArea() { + return area; + } + + public void setArea(String area) { + this.area = area; + } + + public String getCommunications() { + return communications; + } + + public void setCommunications(String communications) { + this.communications = communications; + } + + public String getDeptid() { + return deptid; + } + + public void setDeptid(String deptid) { + this.deptid = deptid; + } + + public String getDeviceTypes() { + return deviceTypes; + } + + public void setDeviceTypes(String deviceTypes) { + this.deviceTypes = deviceTypes; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getLat() { + return lat; + } + + public void setLat(String lat) { + this.lat = lat; + } + + public String getLng() { + return lng; + } + + public void setLng(String lng) { + this.lng = lng; + } + + public String getMap() { + return map; + } + + public void setMap(String map) { + this.map = map; + } + + public String getWellTypes() { + return wellTypes; + } + + public void setWellTypes(String wellTypes) { + this.wellTypes = wellTypes; + } + } +} diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/model/DistrictModel.java b/app/src/main/java/com/casic/app/smartwell/sanxi/model/DistrictModel.java new file mode 100644 index 0000000..02e9ef2 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/model/DistrictModel.java @@ -0,0 +1,172 @@ +package com.casic.app.smartwell.sanxi.model; + +import java.util.List; + +public class DistrictModel { + + private int code; + private List data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public List getData() { + return data; + } + + public void setData(List data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private String id; + private String isSync; + private String lat; + private int level; + private String levelName; + private String lng; + private String name; + private int num; + private String pName; + private String pid; + private String pids; + private String simplename; + private String targetIdSync; + private String targetPidSync; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getIsSync() { + return isSync; + } + + public void setIsSync(String isSync) { + this.isSync = isSync; + } + + public String getLat() { + return lat; + } + + public void setLat(String lat) { + this.lat = lat; + } + + public int getLevel() { + return level; + } + + public void setLevel(int level) { + this.level = level; + } + + public String getLevelName() { + return levelName; + } + + public void setLevelName(String levelName) { + this.levelName = levelName; + } + + public String getLng() { + return lng; + } + + public void setLng(String lng) { + this.lng = lng; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getNum() { + return num; + } + + public void setNum(int num) { + this.num = num; + } + + public String getPName() { + return pName; + } + + public void setPName(String pName) { + this.pName = pName; + } + + public String getPid() { + return pid; + } + + public void setPid(String pid) { + this.pid = pid; + } + + public String getPids() { + return pids; + } + + public void setPids(String pids) { + this.pids = pids; + } + + public String getSimplename() { + return simplename; + } + + public void setSimplename(String simplename) { + this.simplename = simplename; + } + + public String getTargetIdSync() { + return targetIdSync; + } + + public void setTargetIdSync(String targetIdSync) { + this.targetIdSync = targetIdSync; + } + + public String getTargetPidSync() { + return targetPidSync; + } + + public void setTargetPidSync(String targetPidSync) { + this.targetPidSync = targetPidSync; + } + } +} diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/model/StreetModel.java b/app/src/main/java/com/casic/app/smartwell/sanxi/model/StreetModel.java new file mode 100644 index 0000000..90cc7d5 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/model/StreetModel.java @@ -0,0 +1,172 @@ +package com.casic.app.smartwell.sanxi.model; + +import java.util.List; + +public class StreetModel { + + private int code; + private List data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public List getData() { + return data; + } + + public void setData(List data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private String id; + private String isSync; + private String lat; + private int level; + private String levelName; + private String lng; + private String name; + private int num; + private String pName; + private String pid; + private String pids; + private String simplename; + private String targetIdSync; + private String targetPidSync; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getIsSync() { + return isSync; + } + + public void setIsSync(String isSync) { + this.isSync = isSync; + } + + public String getLat() { + return lat; + } + + public void setLat(String lat) { + this.lat = lat; + } + + public int getLevel() { + return level; + } + + public void setLevel(int level) { + this.level = level; + } + + public String getLevelName() { + return levelName; + } + + public void setLevelName(String levelName) { + this.levelName = levelName; + } + + public String getLng() { + return lng; + } + + public void setLng(String lng) { + this.lng = lng; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getNum() { + return num; + } + + public void setNum(int num) { + this.num = num; + } + + public String getPName() { + return pName; + } + + public void setPName(String pName) { + this.pName = pName; + } + + public String getPid() { + return pid; + } + + public void setPid(String pid) { + this.pid = pid; + } + + public String getPids() { + return pids; + } + + public void setPids(String pids) { + this.pids = pids; + } + + public String getSimplename() { + return simplename; + } + + public void setSimplename(String simplename) { + this.simplename = simplename; + } + + public String getTargetIdSync() { + return targetIdSync; + } + + public void setTargetIdSync(String targetIdSync) { + this.targetIdSync = targetIdSync; + } + + public String getTargetPidSync() { + return targetPidSync; + } + + public void setTargetPidSync(String targetPidSync) { + this.targetPidSync = targetPidSync; + } + } +} diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/Constant.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/Constant.kt index bae51d6..3251baa 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/Constant.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/Constant.kt @@ -7,6 +7,7 @@ object Constant { val USER_PERMISSIONS = arrayOf( Manifest.permission.READ_EXTERNAL_STORAGE, + Manifest.permission.CAMERA, Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS, Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION, diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/FileUtils.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/FileUtils.kt index 3e9ae35..cef2d83 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/FileUtils.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/FileUtils.kt @@ -18,4 +18,13 @@ } return downloadDir.toString() } + + val imageCompressPath: String + get() { + val imageDir = File(context.getExternalFilesDir(Environment.DIRECTORY_PICTURES), "") + if (!imageDir.exists()) { + imageDir.mkdir() + } + return imageDir.toString() + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt index 19687d2..bd311a4 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt @@ -289,6 +289,77 @@ ): String /** + * 上传图片 + * 系统路径static拼接图片返回路径 + * http://xx.com/static/2019-10/8050891248624f2bbefedcb196ce89cb.jpeg + */ + @Multipart + @POST("/imageUpload") + suspend fun uploadFile( + @Header("token") token: String, + @Part file: MultipartBody.Part + ): String + + /** + * 根据部门获取区ID + * + * @param deptId + */ + @GET("/config/getAreaByDept") + suspend fun obtainAreaByDept( + @Header("token") token: String, + @Query("deptId") deptId: String + ): String + + /** + * 获取区/县等 + * + * @param pid + */ + @GET("/area/list") + suspend fun obtainDistrict( + @Header("token") token: String, + @Query("pid") pid: String + ): String + + /** + * 获取街道 + * + * @param pid + */ + @GET("/area/list") + suspend fun obtainStreet( + @Header("token") token: String, + @Query("pid") pid: String + ): String + + /** + * 编辑更新井信息 + * + * @param id + */ + @FormUrlEncoded + @POST("/well/update") + suspend fun updateWellDetail( + @Header("token") token: String, + @Field("id") id: String, + @Field("wellCode") wellCode: String, + @Field("wellName") wellName: String, + @Field("wellType") wellType: String, + @Field("deptid") deptid: String, + @Field("deep") deep: String, + @Field("position") position: String, + @Field("coordinateX") coordinateX: String, + @Field("coordinateY") coordinateY: String, + @Field("photos") photos: String, + @Field("notes") notes: String?, + @Field("qu") qu: String, + @Field("area") area: String, + @Field("responsibleDept") responsibleDept: String, + @Field("responsibleDeptName") responsibleDeptName: String + ): String + + /** * 获取工单详情 * * @param id 工单id @@ -312,18 +383,6 @@ ): String /** - * 上传图片 - * 系统路径static拼接图片返回路径 - * http://xx.com/static/2019-10/8050891248624f2bbefedcb196ce89cb.jpeg - */ - @Multipart - @POST("/imageUpload") - suspend fun uploadImage( - @Header("token") token: String, - @Part file: MultipartBody.Part - ): String - - /** * 查找同一单位下的用户 * * @param hasMine 是否包含本人,1包含, 0不包含 diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt index efd6b11..e35e976 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt @@ -3,6 +3,10 @@ import com.casic.app.smartwell.sanxi.model.PublicKeyModel import com.casic.app.smartwell.sanxi.utils.AuthenticationHelper import com.casic.app.smartwell.sanxi.utils.Constant +import okhttp3.MediaType.Companion.toMediaTypeOrNull +import okhttp3.MultipartBody +import okhttp3.RequestBody +import java.io.File object RetrofitServiceManager { @@ -272,6 +276,76 @@ return api.obtainOperationResult(AuthenticationHelper.token!!, wellId, bfzt) } + /** + * 上传图片 + */ + suspend fun uploadFile(image: File): String { + val requestBody = RequestBody.create("image/png".toMediaTypeOrNull(), image) + val imagePart = MultipartBody.Part.createFormData("file", image.name, requestBody) + return api.uploadFile(AuthenticationHelper.token!!, imagePart) + } + + /** + * 根据部门获取区ID + */ + suspend fun obtainAreaByDept(deptId: String): String { + return api.obtainAreaByDept(AuthenticationHelper.token!!, deptId) + } + + /** + * 获取区/县等 + */ + suspend fun obtainDistrict(pid: String): String { + return api.obtainDistrict(AuthenticationHelper.token!!, pid) + } + + /** + * 获取街道 + */ + suspend fun obtainStreet(pid: String): String { + return api.obtainStreet(AuthenticationHelper.token!!, pid) + } + + /** + * 编辑更新井信息 + */ + suspend fun updateWellDetail( + id: String, + wellCode: String, + wellName: String, + wellType: String, + deptid: String, + deep: String, + position: String, + coordinateX: String, + coordinateY: String, + photos: String, + notes: String?, + qu: String, + area: String, + responsibleDept: String, + responsibleDeptName: String + ): String { + return api.updateWellDetail( + AuthenticationHelper.token!!, + id, + wellCode, + wellName, + wellType, + deptid, + deep, + position, + coordinateX, + coordinateY, + photos, + notes, + qu, + area, + responsibleDept, + responsibleDeptName + ) + } + // /** // * 获取工单详情 // */ @@ -287,15 +361,6 @@ // } // // /** -// * 上传图片 -// */ -// suspend fun uploadImage(image: File): String { -// val requestBody = RequestBody.create("image/png".toMediaTypeOrNull(), image) -// val imagePart = MultipartBody.Part.createFormData("file", image.name, requestBody) -// return api.uploadImage(AuthenticationHelper.token!!, imagePart) -// } -// -// /** // * 查找同一单位下的用户 // */ // suspend fun obtainSubordinate(hasMine: String?, roleTips: String?): String { diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/EditWellActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/EditWellActivity.kt new file mode 100644 index 0000000..956dbce --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/EditWellActivity.kt @@ -0,0 +1,341 @@ +package com.casic.app.smartwell.sanxi.view + +import android.app.Activity +import android.content.Intent +import android.view.View +import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.GridLayoutManager +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.adapter.EditableImageAdapter +import com.casic.app.smartwell.sanxi.base.BaseActivity +import com.casic.app.smartwell.sanxi.extensions.combineImagePath +import com.casic.app.smartwell.sanxi.extensions.navigatePageTo +import com.casic.app.smartwell.sanxi.extensions.reformat +import com.casic.app.smartwell.sanxi.extensions.show +import com.casic.app.smartwell.sanxi.model.DistrictModel +import com.casic.app.smartwell.sanxi.model.OwnerShipModel +import com.casic.app.smartwell.sanxi.model.WellListPageModel +import com.casic.app.smartwell.sanxi.utils.* +import com.casic.app.smartwell.sanxi.vm.AuthenticateViewModel +import com.casic.app.smartwell.sanxi.vm.UploadFileViewModel +import com.casic.app.smartwell.sanxi.vm.WellViewModel +import com.casic.app.smartwell.sanxi.widgets.BottomAreaSheet +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken +import com.luck.picture.lib.PictureSelector +import com.luck.picture.lib.config.PictureConfig +import com.luck.picture.lib.config.PictureMimeType +import com.pengxh.app.multilib.widget.dialog.BottomActionSheet +import com.qmuiteam.qmui.widget.dialog.QMUIBottomSheet +import kotlinx.android.synthetic.main.activity_edit_well.* +import kotlinx.android.synthetic.main.include_base_title.* +import java.io.File + +class EditWellActivity : BaseActivity() { + + private val kTag = "EditWellActivity" + private lateinit var wellViewModel: WellViewModel + private lateinit var authenticateViewModel: AuthenticateViewModel + private lateinit var uploadImageViewModel: UploadFileViewModel + private lateinit var wellBeanJson: String + private lateinit var imageAdapter: EditableImageAdapter + private lateinit var wellBean: WellListPageModel.DataBean.RowsBean + private val imagePaths: ArrayList = ArrayList() //服务器返回的拍照数据集 + private val realPaths: ArrayList = ArrayList() //真实图片路径 + private val districtModels: ArrayList = ArrayList() //行政区 + private var wellType = "" + private var deptId = "" + private var districtId = "" + private var streetId = "" + + override fun initLayoutView(): Int = R.layout.activity_edit_well + + override fun setupTopBarLayout() { + leftBackView.setOnClickListener { finish() } + titleView.text = "编辑井信息" + } + + override fun initData() { + wellViewModel = ViewModelProvider(this).get(WellViewModel::class.java) + authenticateViewModel = ViewModelProvider(this).get(AuthenticateViewModel::class.java) + uploadImageViewModel = ViewModelProvider(this).get(UploadFileViewModel::class.java) + wellBeanJson = intent.getStringExtra(Constant.INTENT_PARAM)!! + wellBean = Gson().fromJson( + wellBeanJson, object : TypeToken() {}.type + ) + wellNameView.setText(wellBean.wellName) + wellCodeView.text = wellBean.wellCode + + this.wellType = wellBean.wellType + wellTypeView.text = wellBean.wellTypeName + + this.deptId = wellBean.deptid + ownerShipView.text = wellBean.deptName + wellDepthView.setText(wellBean.deep) + longitudeView.setText(wellBean.lngGaode) + latitudeView.setText(wellBean.latGaode) + + /** + * 2022-06/e805917f14ed49378bbd29cae391b061.png; + * 2022-06/48d34f27695346bbb39d695333faabee.png; + * 2022-06/6df199418fd84960a164ad9c9660e172.png; + * 2022-06/bfbab97a965d406ba30fc9d09ab35f5c.png; + * */ + //显示已有的图片 + val imageArray = wellBean.photos.toString().split(";") + imageArray.forEach { path -> + if (path.isNotBlank()) { + imagePaths.add(path) + realPaths.add(path.combineImagePath()) + } + } + imageAdapter = EditableImageAdapter(this) + imageAdapter.setupImage(realPaths) + imageRecyclerView.layoutManager = GridLayoutManager(this, 3) + imageRecyclerView.adapter = imageAdapter + + //默认加载当前井的区域 + authenticateViewModel.obtainAreaByDept(wellBean.deptid) + authenticateViewModel.areaModel.observe(this, { + if (it.code == 200) { + authenticateViewModel.obtainDistrict(it.data.area) + } + }) + addressView.setText(wellBean.position) + } + + override fun initEvent() { + wellCodeView.setOnClickListener { + "井编号不可编辑".show() + } + + wellTypeView.setOnClickListener { + wellViewModel.obtainWellType() + } + wellViewModel.wellTypeModel.observe(this, { + if (it.code == 200) { + val sheetBuilder = QMUIBottomSheet.BottomListSheetBuilder(this) + sheetBuilder.setTitle("井类型") + it.data.forEach { type -> + sheetBuilder.addItem(type.name) + } + sheetBuilder.setGravityCenter(true) + .setOnSheetItemClickListener { dialog, _, position, tag -> + this.wellType = it.data[position].value + wellTypeView.text = tag + + dialog.dismiss() + }.build().show() + } + }) + + ownerShipView.setOnClickListener { + authenticateViewModel.obtainOwnerShip("03") + } + + imageAdapter.setOnItemClickListener(object : EditableImageAdapter.OnItemClickListener { + override fun onAddImageClick() { + selectPicture() + } + + override fun onItemClick(position: Int) { + if (realPaths[position].isBlank()) { + "图片加载失败,无法查看大图".show() + } else { + navigatePageTo(position, realPaths) + } + } + + override fun onItemLongClick(view: View?, position: Int) { + imagePaths.removeAt(position) + imageAdapter.deleteImage(position) + } + }) + + authenticateViewModel.resultModel.observe(this, { + if (it.code == 200) { + val ownerShipModel: MutableList = ArrayList() + it.data?.list?.forEach { listBean -> + ownerShipModel.add(listBean) + } + val sheetBuilder = QMUIBottomSheet.BottomListSheetBuilder(this) + sheetBuilder.setTitle("权属单位") + ownerShipModel.forEach { model -> + sheetBuilder.addItem(model.name) + } + sheetBuilder.setGravityCenter(true) + .setOnSheetItemClickListener { dialog, _, position, tag -> + this.deptId = it.data?.list!![position].id + ownerShipView.text = tag + + dialog.dismiss() + }.build().show() + } + }) + + authenticateViewModel.districtModel.observe(this, { + if (it.code == 200) { + it.data.forEach { area -> + districtModels.add(area) + //判断区 + if (area.id == wellBean.qu) { + authenticateViewModel.obtainStreet(area.id) + authenticateViewModel.streetModel.observe(this, { street -> + if (street.code == 200) { + street.data.forEach { streetData -> + //判断街道 + if (streetData.id == wellBean.area) { + districtView.text = + String.format("${area.name}${streetData.name}") + } + } + } + }) + } + } + } + }) + + //点击选择井的区域 + districtView.setOnClickListener { + if (districtModels.isNullOrEmpty()) { + "无行政区域数据,无法修改".show() + return@setOnClickListener + } + BottomAreaSheet.Builder() + .setContext(this) + .setLifecycleOwner(this) + .setDistrictAreaData(districtModels) + .setChildDataViewModel(authenticateViewModel) + .setOnActionSheetListener(object : BottomAreaSheet.OnActionSheetListener { + override fun onAreaSelected( + area: String?, districtId: String, streetId: String + ) { + districtView.text = area?.replace("-", "") + this@EditWellActivity.districtId = districtId + this@EditWellActivity.streetId = streetId + } + }) + .build().show() + } + + //提交修改 + saveButton.setOnClickListener { + if (districtId.isEmpty() || streetId.isEmpty()) { + "行政区ID为空或者街道ID为空".show() + return@setOnClickListener + } + wellViewModel.updateWellDetail( + id = wellBean.id, + wellCode = wellBean.wellCode, + wellName = wellNameView.text.toString(), + wellType = wellType, + deptid = deptId, + deep = wellDepthView.text.toString(), + position = addressView.text.toString(), + coordinateX = longitudeView.text.toString(), + coordinateY = latitudeView.text.toString(), + photos = imagePaths.reformat(), + notes = "", + qu = districtId, + area = streetId, + responsibleDept = deptId, + responsibleDeptName = ownerShipView.text.toString() + ) + } + + uploadImageViewModel.resultModel.observe(this, { model -> + if (model.code == 200) { + /** + * 显示图片 + * path: 2021-07\c670eac17d644b179a4324a34bb84329.jpeg + * */ + /** + * 显示图片 + * path: 2021-07\c670eac17d644b179a4324a34bb84329.jpeg + * */ + val sumItemCount: Int = imageAdapter.itemCount + 1 //每上传一张图片,图片总数都是在原有的基础上+1 + if (sumItemCount <= 5) { + val url = model.data + //let函数处理需要针对一个可null的对象统一做判空处理。 + url?.let { + imagePaths.add(it) + realPaths.add(it.combineImagePath()) + } + imageAdapter.setupImage(realPaths) + } else { + "最多只能上传4张图片".show() + } + } + }) + uploadImageViewModel.loadState.observe(this, { + DialogHelper.dismissLoadingDialog() + }) + + wellViewModel.loadState.observe(this, { + when (it) { + is LoadState.Loading -> { + DialogHelper.showLoadingDialog(this, "保存中,请稍后...") + } + is LoadState.Success -> { + DialogHelper.dismissLoadingDialog() + finish() + } + else -> { + DialogHelper.dismissLoadingDialog() + } + } + }) + } + + private fun selectPicture() { + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitles(arrayOf("拍照", "相册")) + .setOnActionSheetListener { position -> + when (position) { + 0 -> { + PictureSelector.create(this) + .openCamera(PictureMimeType.ofImage()) + .isCompress(true) + .compressSavePath(FileUtils.imageCompressPath) + .imageEngine(GlideLoadEngine.createGlideEngine()) + .forResult(PictureConfig.REQUEST_CAMERA) + } + 1 -> { + PictureSelector.create(this) + .openGallery(PictureMimeType.ofImage()) + .isWeChatStyle(true) + .isCamera(false) + .isCompress(true) + .compressSavePath(FileUtils.imageCompressPath) + .imageEngine(GlideLoadEngine.createGlideEngine()) + .maxSelectNum(4) + .forResult(PictureConfig.CHOOSE_REQUEST) + } + } + }.build().show() + } + + override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { + super.onActivityResult(requestCode, resultCode, data) + if (resultCode == Activity.RESULT_OK) { + when (requestCode) { + PictureConfig.CHOOSE_REQUEST -> { + val selectResult = PictureSelector.obtainMultipleResult(data) + DialogHelper.showLoadingDialog(this, "图片上传中,请稍后...") + for (res in selectResult) { + val file = File(res.compressPath) + //上传图片 + uploadImageViewModel.uploadFile(file) + } + } + PictureConfig.REQUEST_CAMERA -> { + val cameraResult = PictureSelector.obtainMultipleResult(data)[0] + //上传图片 + uploadImageViewModel.uploadFile(File(cameraResult.compressPath)) + } + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellDetailActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellDetailActivity.kt index 50c9e05..6c93e4e 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellDetailActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellDetailActivity.kt @@ -9,28 +9,30 @@ import com.amap.api.maps.model.CameraPosition import com.amap.api.maps.model.LatLng import com.amap.api.maps.model.MarkerOptions -import com.amap.api.services.core.LatLonPoint -import com.amap.api.services.geocoder.GeocodeResult -import com.amap.api.services.geocoder.GeocodeSearch -import com.amap.api.services.geocoder.RegeocodeQuery -import com.amap.api.services.geocoder.RegeocodeResult import com.casic.app.smartwell.sanxi.R import com.casic.app.smartwell.sanxi.base.BaseActivity import com.casic.app.smartwell.sanxi.extensions.show import com.casic.app.smartwell.sanxi.utils.Constant import com.casic.app.smartwell.sanxi.utils.DialogHelper import com.casic.app.smartwell.sanxi.utils.LoadState +import com.casic.app.smartwell.sanxi.vm.AuthenticateViewModel import com.casic.app.smartwell.sanxi.vm.WellViewModel import com.pengxh.app.multilib.widget.dialog.AlertMessageDialog import kotlinx.android.synthetic.main.activity_well_detail.* +import kotlinx.android.synthetic.main.activity_well_detail.wellCodeView +import kotlinx.android.synthetic.main.activity_well_detail.wellDepthView +import kotlinx.android.synthetic.main.activity_well_detail.wellNameView +import kotlinx.android.synthetic.main.activity_well_detail.wellStateView +import kotlinx.android.synthetic.main.activity_well_detail.wellTypeView +import kotlinx.android.synthetic.main.activity_well_list_detail.* import kotlinx.android.synthetic.main.include_base_title.* class WellDetailActivity : BaseActivity(), AMap.OnMapLoadedListener { private val kTag = "WellDetailActivity" - private val geocoderSearch by lazy { GeocodeSearch(this) } private lateinit var wellViewModel: WellViewModel + private lateinit var authenticateViewModel: AuthenticateViewModel private lateinit var wellId: String private lateinit var aMap: AMap private var latLng: LatLng? = null @@ -46,6 +48,7 @@ override fun initData() { wellId = intent.getStringExtra(Constant.INTENT_PARAM)!! wellViewModel = ViewModelProvider(this).get(WellViewModel::class.java) + authenticateViewModel = ViewModelProvider(this).get(AuthenticateViewModel::class.java) aMap = wellMapView.map aMap.mapType = AMap.MAP_TYPE_NORMAL @@ -103,39 +106,41 @@ val wellPosition = wellDetail.position.toString() wellLocationView.text = wellPosition - //根据经纬度获取省市区县 if (wellDetail.latGaode.isBlank() || wellDetail.lngGaode.isBlank()) { "井经纬度异常,无法查看完整位置信息".show() return@observe } this.latLng = LatLng(wellDetail.latGaode.toDouble(), wellDetail.lngGaode.toDouble()) - val queryParam = RegeocodeQuery( - LatLonPoint(wellDetail.latGaode.toDouble(), wellDetail.lngGaode.toDouble()), - 200f, - GeocodeSearch.AMAP - ) - tipsImageView.setOnClickListener { - geocoderSearch.getFromLocationAsyn(queryParam) + authenticateViewModel.obtainAreaByDept(wellDetail.deptid) } - - geocoderSearch.setOnGeocodeSearchListener(object : - GeocodeSearch.OnGeocodeSearchListener { - override fun onRegeocodeSearched(result: RegeocodeResult?, rCode: Int) { - if (rCode == 1000) { - AlertMessageDialog.Builder() - .setContext(this@WellDetailActivity) - .setTitle("闸井完整位置") - .setMessage(result?.regeocodeAddress?.formatAddress + "-" + wellPosition) - .setPositiveButton("知道了").setOnDialogButtonClickListener {}.build() - .show() - } else { - "获取该闸井详细位置信息失败".show() - } + authenticateViewModel.areaModel.observe(this, { areaModel -> + if (areaModel.code == 200) { + authenticateViewModel.obtainDistrict(areaModel.data.area) } - - override fun onGeocodeSearched(result: GeocodeResult?, rCode: Int) { - + }) + authenticateViewModel.districtModel.observe(this, { districtModel -> + if (districtModel.code == 200) { + districtModel.data.forEach { area -> + if (area.id == wellDetail.qu) { + authenticateViewModel.obtainStreet(area.id) + authenticateViewModel.streetModel.observe(this, { street -> + if (street.code == 200) { + street.data.forEach { streetData -> + if (streetData.id == wellDetail.area) { + AlertMessageDialog.Builder() + .setContext(this@WellDetailActivity) + .setTitle("闸井完整位置") + .setMessage(String.format("${area.name}${streetData.name}") + "-" + wellPosition) + .setPositiveButton("知道了") + .setOnDialogButtonClickListener {}.build() + .show() + } + } + } + }) + } + } } }) } diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellListDetailActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellListDetailActivity.kt index b34be03..d28b752 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellListDetailActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellListDetailActivity.kt @@ -4,11 +4,6 @@ import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.GridLayoutManager import androidx.recyclerview.widget.LinearLayoutManager -import com.amap.api.services.core.LatLonPoint -import com.amap.api.services.geocoder.GeocodeResult -import com.amap.api.services.geocoder.GeocodeSearch -import com.amap.api.services.geocoder.RegeocodeQuery -import com.amap.api.services.geocoder.RegeocodeResult import com.casic.app.smartwell.sanxi.R import com.casic.app.smartwell.sanxi.adapter.DeviceDataListAdapter import com.casic.app.smartwell.sanxi.adapter.DeviceDataTitleAdapter @@ -19,6 +14,7 @@ import com.casic.app.smartwell.sanxi.extensions.show import com.casic.app.smartwell.sanxi.model.WellListPageModel import com.casic.app.smartwell.sanxi.utils.Constant +import com.casic.app.smartwell.sanxi.vm.AuthenticateViewModel import com.casic.app.smartwell.sanxi.vm.WellViewModel import com.google.gson.Gson import com.google.gson.reflect.TypeToken @@ -28,8 +24,8 @@ class WellListDetailActivity : BaseActivity() { private val kTag = "WellListDetailActivity" - private val geocoderSearch by lazy { GeocodeSearch(this) } private lateinit var wellViewModel: WellViewModel + private lateinit var authenticateViewModel: AuthenticateViewModel private lateinit var wellBeanJson: String override fun initLayoutView(): Int = R.layout.activity_well_list_detail @@ -41,6 +37,7 @@ override fun initData() { wellViewModel = ViewModelProvider(this).get(WellViewModel::class.java) + authenticateViewModel = ViewModelProvider(this).get(AuthenticateViewModel::class.java) wellBeanJson = intent.getStringExtra(Constant.INTENT_PARAM)!! val wellBean = Gson().fromJson( wellBeanJson, object : TypeToken() {}.type @@ -89,29 +86,32 @@ }) } - //根据经纬度获取省市区县 - if (wellBean.latGaode.isBlank() || wellBean.lngGaode.isBlank()) { - "井经纬度异常,无法查看完整位置信息".show() - return - } - val queryParam = RegeocodeQuery( - LatLonPoint(wellBean.latGaode.toDouble(), wellBean.lngGaode.toDouble()), - 200f, - GeocodeSearch.AMAP - ) - geocoderSearch.getFromLocationAsyn(queryParam) - geocoderSearch.setOnGeocodeSearchListener(object : - GeocodeSearch.OnGeocodeSearchListener { - override fun onRegeocodeSearched(result: RegeocodeResult?, rCode: Int) { - if (rCode == 1000) { - districtView.text = result?.regeocodeAddress?.formatAddress - } - } - - override fun onGeocodeSearched(result: GeocodeResult?, rCode: Int) { - + authenticateViewModel.obtainAreaByDept(wellBean.deptid) + authenticateViewModel.areaModel.observe(this, { + if (it.code == 200) { + authenticateViewModel.obtainDistrict(it.data.area) } }) + authenticateViewModel.districtModel.observe(this, { + if (it.code == 200) { + it.data.forEach { area -> + if (area.id == wellBean.qu) { + authenticateViewModel.obtainStreet(area.id) + authenticateViewModel.streetModel.observe(this, { street -> + if (street.code == 200) { + street.data.forEach { streetData -> + if (streetData.id == wellBean.area) { + districtView.text = + String.format("${area.name}${streetData.name}") + } + } + } + }) + } + } + } + }) + addressView.text = wellBean.position maintenanceView.text = wellBean.responsibleDeptName diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellManageActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellManageActivity.kt index 1cd5616..8fc415b 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellManageActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/WellManageActivity.kt @@ -251,7 +251,7 @@ } override fun onEditClicked(position: Int) { - + navigatePageTo(dataBeans[position].toJson()) } override fun onOperationClicked(position: Int) { diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/vm/AuthenticateViewModel.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/vm/AuthenticateViewModel.kt index 5186591..4632b20 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/vm/AuthenticateViewModel.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/vm/AuthenticateViewModel.kt @@ -3,8 +3,7 @@ import androidx.lifecycle.MutableLiveData import com.casic.app.smartwell.sanxi.base.BaseViewModel import com.casic.app.smartwell.sanxi.extensions.* -import com.casic.app.smartwell.sanxi.model.OwnerShipModel -import com.casic.app.smartwell.sanxi.model.PublicKeyModel +import com.casic.app.smartwell.sanxi.model.* import com.casic.app.smartwell.sanxi.utils.Constant import com.casic.app.smartwell.sanxi.utils.LoadState import com.casic.app.smartwell.sanxi.utils.SaveKeyValues @@ -18,6 +17,9 @@ private val gson = Gson() val keyModel = MutableLiveData() val resultModel = MutableLiveData() + val areaModel = MutableLiveData() + val districtModel = MutableLiveData() + val streetModel = MutableLiveData() fun obtainPublicKey() = launch({ loadState.value = LoadState.Loading @@ -62,4 +64,55 @@ }, { it.printStackTrace() }) + + /** + * 根据部门获取区ID + */ + fun obtainAreaByDept(deptId: String) = launch({ + val response = RetrofitServiceManager.obtainAreaByDept(deptId) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + areaModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + response.toErrorMessage().show() + } + }, { + it.printStackTrace() + }) + + /** + * 区/县等 + */ + fun obtainDistrict(pid: String) = launch({ + val response = RetrofitServiceManager.obtainDistrict(pid) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + districtModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + response.toErrorMessage().show() + } + }, { + it.printStackTrace() + }) + + /** + * 街道 + */ + fun obtainStreet(areaId: String) = launch({ + val response = RetrofitServiceManager.obtainStreet(areaId) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + streetModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + response.toErrorMessage().show() + } + }, { + it.printStackTrace() + }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/vm/UploadFileViewModel.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/vm/UploadFileViewModel.kt new file mode 100644 index 0000000..fe9d357 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/vm/UploadFileViewModel.kt @@ -0,0 +1,36 @@ +package com.casic.app.smartwell.sanxi.vm + +import androidx.lifecycle.MutableLiveData +import com.casic.app.smartwell.sanxi.base.BaseViewModel +import com.casic.app.smartwell.sanxi.extensions.launch +import com.casic.app.smartwell.sanxi.extensions.separateResponseCode +import com.casic.app.smartwell.sanxi.extensions.show +import com.casic.app.smartwell.sanxi.extensions.toErrorMessage +import com.casic.app.smartwell.sanxi.model.CommonResultModel +import com.casic.app.smartwell.sanxi.utils.LoadState +import com.casic.app.smartwell.sanxi.utils.retrofit.RetrofitServiceManager +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken +import java.io.File + +class UploadFileViewModel : BaseViewModel() { + + private val gson = Gson() + val resultModel = MutableLiveData() + + fun uploadFile(image: File) = launch({ + val response = RetrofitServiceManager.uploadFile(image) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + resultModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show() + } + }, { + loadState.value = LoadState.Fail + }) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/vm/WellViewModel.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/vm/WellViewModel.kt index 696dbf0..8e59b91 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/vm/WellViewModel.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/vm/WellViewModel.kt @@ -1,5 +1,6 @@ package com.casic.app.smartwell.sanxi.vm +import android.util.Log import androidx.lifecycle.MutableLiveData import com.casic.app.smartwell.sanxi.base.BaseViewModel import com.casic.app.smartwell.sanxi.extensions.launch @@ -15,6 +16,7 @@ class WellViewModel : BaseViewModel() { + private val kTag = "WellViewModel" private val gson = Gson() val detailModel = MutableLiveData() val allWellModel = MutableLiveData() @@ -152,4 +154,58 @@ loadState.value = LoadState.Fail it.printStackTrace() }) + + /** + * 编辑更新井信息 + * */ + fun updateWellDetail( + id: String, + wellCode: String, + wellName: String, + wellType: String, + deptid: String, + deep: String, + position: String, + coordinateX: String, + coordinateY: String, + photos: String, + notes: String?, + qu: String, + area: String, + responsibleDept: String, + responsibleDeptName: String + ) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.updateWellDetail( + id, + wellCode, + wellName, + wellType, + deptid, + deep, + position, + coordinateX, + coordinateY, + photos, + notes, + qu, + area, + responsibleDept, + responsibleDeptName + ) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + "更新成功".show() + commonResultModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show() + } + }, { + loadState.value = LoadState.Fail + it.printStackTrace() + }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/widgets/BottomAreaSheet.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/widgets/BottomAreaSheet.kt new file mode 100644 index 0000000..5f464be --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/widgets/BottomAreaSheet.kt @@ -0,0 +1,213 @@ +package com.casic.app.smartwell.sanxi.widgets + +import android.app.Dialog +import android.content.Context +import android.os.Bundle +import android.view.* +import android.widget.AbsListView +import android.widget.AdapterView +import android.widget.BaseAdapter +import android.widget.TextView +import androidx.lifecycle.LifecycleOwner +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseViewModel +import com.casic.app.smartwell.sanxi.extensions.initDialogLayoutParams +import com.casic.app.smartwell.sanxi.extensions.show +import com.casic.app.smartwell.sanxi.model.DistrictModel +import com.casic.app.smartwell.sanxi.model.StreetModel +import com.casic.app.smartwell.sanxi.vm.AuthenticateViewModel +import com.pengxh.app.multilib.utils.SizeUtil +import kotlinx.android.synthetic.main.sheet_bottom_area.* + +class BottomAreaSheet private constructor(builder: Builder) : Dialog( + builder.context, R.style.ActionSheetDialogStyle +) { + private val owner: LifecycleOwner = builder.owner + private val firstLevelArea: List = builder.firstLevelArea + private val vm: BaseViewModel = builder.vm + private val listener: OnActionSheetListener = builder.listener + + class Builder { + lateinit var context: Context + lateinit var owner: LifecycleOwner + lateinit var firstLevelArea: List + lateinit var vm: BaseViewModel + lateinit var listener: OnActionSheetListener + + fun setContext(context: Context): Builder { + this.context = context + return this + } + + fun setLifecycleOwner(owner: LifecycleOwner): Builder { + this.owner = owner + return this + } + + fun setDistrictAreaData(firstLevelArea: List): Builder { + this.firstLevelArea = firstLevelArea + return this + } + + fun setChildDataViewModel(vm: BaseViewModel): Builder { + this.vm = vm + return this + } + + fun setOnActionSheetListener(listener: OnActionSheetListener): Builder { + this.listener = listener + return this + } + + fun build(): BottomAreaSheet { + return BottomAreaSheet(this) + } + } + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + this.initDialogLayoutParams(Gravity.BOTTOM, R.style.ActionSheetDialogAnimation, 1.0f) + setContentView(R.layout.sheet_bottom_area) + setCancelable(false) + setCanceledOnTouchOutside(false) + + dismissView.setOnClickListener { dismiss() } + + var districtId = "" + var streetId = "" + //街道 + val authenticateViewModel = vm as AuthenticateViewModel + //默认加载第一个区的街道 + val firstDistrict = firstLevelArea[0] + var districtName = if (firstDistrict.simplename.toString().isBlank()) + firstDistrict.simplename + else + firstDistrict.name + selectedAreaView.text = districtName + authenticateViewModel.obtainStreet(firstDistrict.id) + + //行政区 + firstAreaListView.adapter = DistrictDataAdapter(firstLevelArea) + firstAreaListView.onItemClickListener = AdapterView.OnItemClickListener { _, _, i, _ -> + //只选择到一级区域 + districtName = if (firstLevelArea[i].simplename.toString().isBlank()) + firstLevelArea[i].simplename + else + firstLevelArea[i].name + districtId = firstLevelArea[i].id + selectedAreaView.text = districtName + + if (districtId.isBlank()) { + "一级区域ID为空,无法获取下级街道列表".show() + return@OnItemClickListener + } + authenticateViewModel.obtainStreet(districtId) + } + authenticateViewModel.streetModel.observe(owner, { + if (it.code == 200) { + val streetModels = it.data + secondAreaListView.adapter = StreetDataAdapter(streetModels) + secondAreaListView.onItemClickListener = + AdapterView.OnItemClickListener { _, _, i, _ -> + val streetName = if (streetModels[i].simplename.toString().isBlank()) + streetModels[i].simplename + else + streetModels[i].name + streetId = streetModels[i].id + selectedAreaView.text = String.format("$districtName-$streetName") + } + } + }) + + sheetConfirmButton.setOnClickListener { + listener.onAreaSelected(selectedAreaView.text.toString(), districtId, streetId) + dismiss() + } + } + + interface OnActionSheetListener { + fun onAreaSelected(area: String?, districtId: String, streetId: String) + } + + internal inner class DistrictDataAdapter(private val dataBeans: List) : + BaseAdapter() { + + private val inflater: LayoutInflater = LayoutInflater.from(context) + + override fun getCount(): Int = dataBeans.size + + override fun getItem(position: Int): Any = dataBeans[position] + + override fun getItemId(position: Int): Long = position.toLong() + + override fun getView(position: Int, convertView: View?, parent: ViewGroup): View { + val view: View + val holder: ItemViewHolder + if (convertView == null) { + holder = ItemViewHolder() + view = inflater.inflate(R.layout.item_area_sheet, null) + holder.areaItemView = view.findViewById(R.id.areaItemView) + view.tag = holder + } else { + view = convertView + holder = view.tag as ItemViewHolder + } + val dataBean = dataBeans[position] + holder.areaItemView.setBackgroundResource(R.drawable.sheet_item_selector) + holder.areaItemView.text = + if (dataBean.simplename.toString().isBlank()) dataBean.simplename else dataBean.name + //需要动态设置item的高度 + val param = AbsListView.LayoutParams( + WindowManager.LayoutParams.MATCH_PARENT, + SizeUtil.dp2px(context, 46f) + ) + view.layoutParams = param + return view + } + + internal inner class ItemViewHolder { + lateinit var areaItemView: TextView + } + } + + internal inner class StreetDataAdapter(private val dataBeans: List) : + BaseAdapter() { + + private val inflater: LayoutInflater = LayoutInflater.from(context) + + override fun getCount(): Int = dataBeans.size + + override fun getItem(position: Int): Any = dataBeans[position] + + override fun getItemId(position: Int): Long = position.toLong() + + override fun getView(position: Int, convertView: View?, parent: ViewGroup): View { + val view: View + val holder: ItemViewHolder + if (convertView == null) { + holder = ItemViewHolder() + view = inflater.inflate(R.layout.item_area_sheet, null) + holder.areaItemView = view.findViewById(R.id.areaItemView) + view.tag = holder + } else { + view = convertView + holder = view.tag as ItemViewHolder + } + val dataBean = dataBeans[position] + holder.areaItemView.setBackgroundResource(R.drawable.sheet_item_selector) + holder.areaItemView.text = + if (dataBean.simplename.toString().isBlank()) dataBean.simplename else dataBean.name + //需要动态设置item的高度 + val param = AbsListView.LayoutParams( + WindowManager.LayoutParams.MATCH_PARENT, + SizeUtil.dp2px(context, 46f) + ) + view.layoutParams = param + return view + } + + internal inner class ItemViewHolder { + lateinit var areaItemView: TextView + } + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_solid_layout_white_radius_top_10.xml b/app/src/main/res/drawable/bg_solid_layout_white_radius_top_10.xml new file mode 100644 index 0000000..9570167 --- /dev/null +++ b/app/src/main/res/drawable/bg_solid_layout_white_radius_top_10.xml @@ -0,0 +1,10 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_add_pic.xml b/app/src/main/res/drawable/ic_add_pic.xml new file mode 100644 index 0000000..9d1e830 --- /dev/null +++ b/app/src/main/res/drawable/ic_add_pic.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_error.xml b/app/src/main/res/drawable/ic_error.xml new file mode 100644 index 0000000..4d3c44d --- /dev/null +++ b/app/src/main/res/drawable/ic_error.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/sheet_item_selector.xml b/app/src/main/res/drawable/sheet_item_selector.xml new file mode 100644 index 0000000..82613d0 --- /dev/null +++ b/app/src/main/res/drawable/sheet_item_selector.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_edit_well.xml b/app/src/main/res/layout/activity_edit_well.xml new file mode 100644 index 0000000..a2cd1c0 --- /dev/null +++ b/app/src/main/res/layout/activity_edit_well.xml @@ -0,0 +1,189 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +