diff --git a/app/build.gradle b/app/build.gradle index ea77e44..59e75eb 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -76,6 +76,8 @@ implementation 'com.github.bumptech.glide:glide:4.9.0' //图片选择框架 implementation 'io.github.lucksiege:pictureselector:v3.0.4' + //图片压缩 + implementation 'top.zibin:Luban:1.1.8' //高德地图 implementation 'com.amap.api:3dmap:7.9.1' //返回值转换器 diff --git a/app/build.gradle b/app/build.gradle index ea77e44..59e75eb 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -76,6 +76,8 @@ implementation 'com.github.bumptech.glide:glide:4.9.0' //图片选择框架 implementation 'io.github.lucksiege:pictureselector:v3.0.4' + //图片压缩 + implementation 'top.zibin:Luban:1.1.8' //高德地图 implementation 'com.amap.api:3dmap:7.9.1' //返回值转换器 diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index e361509..1e6c783 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -14,6 +14,7 @@ + diff --git a/app/build.gradle b/app/build.gradle index ea77e44..59e75eb 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -76,6 +76,8 @@ implementation 'com.github.bumptech.glide:glide:4.9.0' //图片选择框架 implementation 'io.github.lucksiege:pictureselector:v3.0.4' + //图片压缩 + implementation 'top.zibin:Luban:1.1.8' //高德地图 implementation 'com.amap.api:3dmap:7.9.1' //返回值转换器 diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index e361509..1e6c783 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -14,6 +14,7 @@ + diff --git a/app/src/main/java/com/casic/qd/smartwell/adapter/NineGridImageAdapter.kt b/app/src/main/java/com/casic/qd/smartwell/adapter/NineGridImageAdapter.kt index f07824e..e016832 100644 --- a/app/src/main/java/com/casic/qd/smartwell/adapter/NineGridImageAdapter.kt +++ b/app/src/main/java/com/casic/qd/smartwell/adapter/NineGridImageAdapter.kt @@ -30,9 +30,14 @@ } fun deleteImage(position: Int) { - if (imageData.size != 0) { - imageData.removeAt(position) - notifyDataSetChanged() + try { + if (imageData.size > position) { + imageData.removeAt(position) + notifyItemRemoved(position) + notifyItemRangeChanged(position, imageData.size) + } + } catch (e: Exception) { + e.printStackTrace() } } diff --git a/app/build.gradle b/app/build.gradle index ea77e44..59e75eb 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -76,6 +76,8 @@ implementation 'com.github.bumptech.glide:glide:4.9.0' //图片选择框架 implementation 'io.github.lucksiege:pictureselector:v3.0.4' + //图片压缩 + implementation 'top.zibin:Luban:1.1.8' //高德地图 implementation 'com.amap.api:3dmap:7.9.1' //返回值转换器 diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index e361509..1e6c783 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -14,6 +14,7 @@ + diff --git a/app/src/main/java/com/casic/qd/smartwell/adapter/NineGridImageAdapter.kt b/app/src/main/java/com/casic/qd/smartwell/adapter/NineGridImageAdapter.kt index f07824e..e016832 100644 --- a/app/src/main/java/com/casic/qd/smartwell/adapter/NineGridImageAdapter.kt +++ b/app/src/main/java/com/casic/qd/smartwell/adapter/NineGridImageAdapter.kt @@ -30,9 +30,14 @@ } fun deleteImage(position: Int) { - if (imageData.size != 0) { - imageData.removeAt(position) - notifyDataSetChanged() + try { + if (imageData.size > position) { + imageData.removeAt(position) + notifyItemRemoved(position) + notifyItemRangeChanged(position, imageData.size) + } + } catch (e: Exception) { + e.printStackTrace() } } diff --git a/app/src/main/java/com/casic/qd/smartwell/adapter/OrderCompletedAdapter.kt b/app/src/main/java/com/casic/qd/smartwell/adapter/OrderCompletedAdapter.kt index f36c15d..6533b92 100644 --- a/app/src/main/java/com/casic/qd/smartwell/adapter/OrderCompletedAdapter.kt +++ b/app/src/main/java/com/casic/qd/smartwell/adapter/OrderCompletedAdapter.kt @@ -43,14 +43,14 @@ val rowsBean = dataRows[position] holder.alarmContentView.text = rowsBean.alarmContentName holder.createTimeView.text = rowsBean.createTime - holder.wellCodeView.text = rowsBean.wellCode - val alarmValue = rowsBean.alarmValue.toString() - if (alarmValue.isBlank()) { - holder.alarmValueView.text = "报警值未知" + holder.wellCodeView.text = String.format("井编号:${rowsBean.wellCode}") + val alarmValue = if (rowsBean.alarmValue.toString().isBlank()) { + "未知" } else { - holder.alarmValueView.text = alarmValue + rowsBean.alarmValue } - holder.wellLocationView.text = rowsBean.position + holder.alarmValueView.text = String.format("告警值:$alarmValue") + holder.wellLocationView.text = String.format("井位置:${rowsBean.position}") holder.currentStateView.text = String.format("${rowsBean.jobStatusName}-${rowsBean.jobBelongTo}") diff --git a/app/build.gradle b/app/build.gradle index ea77e44..59e75eb 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -76,6 +76,8 @@ implementation 'com.github.bumptech.glide:glide:4.9.0' //图片选择框架 implementation 'io.github.lucksiege:pictureselector:v3.0.4' + //图片压缩 + implementation 'top.zibin:Luban:1.1.8' //高德地图 implementation 'com.amap.api:3dmap:7.9.1' //返回值转换器 diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index e361509..1e6c783 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -14,6 +14,7 @@ + diff --git a/app/src/main/java/com/casic/qd/smartwell/adapter/NineGridImageAdapter.kt b/app/src/main/java/com/casic/qd/smartwell/adapter/NineGridImageAdapter.kt index f07824e..e016832 100644 --- a/app/src/main/java/com/casic/qd/smartwell/adapter/NineGridImageAdapter.kt +++ b/app/src/main/java/com/casic/qd/smartwell/adapter/NineGridImageAdapter.kt @@ -30,9 +30,14 @@ } fun deleteImage(position: Int) { - if (imageData.size != 0) { - imageData.removeAt(position) - notifyDataSetChanged() + try { + if (imageData.size > position) { + imageData.removeAt(position) + notifyItemRemoved(position) + notifyItemRangeChanged(position, imageData.size) + } + } catch (e: Exception) { + e.printStackTrace() } } diff --git a/app/src/main/java/com/casic/qd/smartwell/adapter/OrderCompletedAdapter.kt b/app/src/main/java/com/casic/qd/smartwell/adapter/OrderCompletedAdapter.kt index f36c15d..6533b92 100644 --- a/app/src/main/java/com/casic/qd/smartwell/adapter/OrderCompletedAdapter.kt +++ b/app/src/main/java/com/casic/qd/smartwell/adapter/OrderCompletedAdapter.kt @@ -43,14 +43,14 @@ val rowsBean = dataRows[position] holder.alarmContentView.text = rowsBean.alarmContentName holder.createTimeView.text = rowsBean.createTime - holder.wellCodeView.text = rowsBean.wellCode - val alarmValue = rowsBean.alarmValue.toString() - if (alarmValue.isBlank()) { - holder.alarmValueView.text = "报警值未知" + holder.wellCodeView.text = String.format("井编号:${rowsBean.wellCode}") + val alarmValue = if (rowsBean.alarmValue.toString().isBlank()) { + "未知" } else { - holder.alarmValueView.text = alarmValue + rowsBean.alarmValue } - holder.wellLocationView.text = rowsBean.position + holder.alarmValueView.text = String.format("告警值:$alarmValue") + holder.wellLocationView.text = String.format("井位置:${rowsBean.position}") holder.currentStateView.text = String.format("${rowsBean.jobStatusName}-${rowsBean.jobBelongTo}") diff --git a/app/src/main/java/com/casic/qd/smartwell/adapter/OrderInHandleAdapter.kt b/app/src/main/java/com/casic/qd/smartwell/adapter/OrderInHandleAdapter.kt index a7fcfa8..74646d6 100644 --- a/app/src/main/java/com/casic/qd/smartwell/adapter/OrderInHandleAdapter.kt +++ b/app/src/main/java/com/casic/qd/smartwell/adapter/OrderInHandleAdapter.kt @@ -42,14 +42,14 @@ val rowsBean = dataRows[position] holder.alarmContentView.text = rowsBean.alarmContentName holder.createTimeView.text = rowsBean.createTime - holder.wellCodeView.text = rowsBean.wellCode - val alarmValue = rowsBean.alarmValue.toString() - if (alarmValue.isBlank()) { - holder.alarmValueView.text = "报警值未知" + holder.wellCodeView.text = String.format("井编号:${rowsBean.wellCode}") + val alarmValue = if (rowsBean.alarmValue.toString().isBlank()) { + "未知" } else { - holder.alarmValueView.text = alarmValue + rowsBean.alarmValue } - holder.wellLocationView.text = rowsBean.position + holder.alarmValueView.text = String.format("告警值:$alarmValue") + holder.wellLocationView.text = String.format("井位置:${rowsBean.position}") holder.currentStateView.text = String.format("${rowsBean.jobStatusName}-${rowsBean.jobBelongTo}") diff --git a/app/build.gradle b/app/build.gradle index ea77e44..59e75eb 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -76,6 +76,8 @@ implementation 'com.github.bumptech.glide:glide:4.9.0' //图片选择框架 implementation 'io.github.lucksiege:pictureselector:v3.0.4' + //图片压缩 + implementation 'top.zibin:Luban:1.1.8' //高德地图 implementation 'com.amap.api:3dmap:7.9.1' //返回值转换器 diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index e361509..1e6c783 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -14,6 +14,7 @@ + diff --git a/app/src/main/java/com/casic/qd/smartwell/adapter/NineGridImageAdapter.kt b/app/src/main/java/com/casic/qd/smartwell/adapter/NineGridImageAdapter.kt index f07824e..e016832 100644 --- a/app/src/main/java/com/casic/qd/smartwell/adapter/NineGridImageAdapter.kt +++ b/app/src/main/java/com/casic/qd/smartwell/adapter/NineGridImageAdapter.kt @@ -30,9 +30,14 @@ } fun deleteImage(position: Int) { - if (imageData.size != 0) { - imageData.removeAt(position) - notifyDataSetChanged() + try { + if (imageData.size > position) { + imageData.removeAt(position) + notifyItemRemoved(position) + notifyItemRangeChanged(position, imageData.size) + } + } catch (e: Exception) { + e.printStackTrace() } } diff --git a/app/src/main/java/com/casic/qd/smartwell/adapter/OrderCompletedAdapter.kt b/app/src/main/java/com/casic/qd/smartwell/adapter/OrderCompletedAdapter.kt index f36c15d..6533b92 100644 --- a/app/src/main/java/com/casic/qd/smartwell/adapter/OrderCompletedAdapter.kt +++ b/app/src/main/java/com/casic/qd/smartwell/adapter/OrderCompletedAdapter.kt @@ -43,14 +43,14 @@ val rowsBean = dataRows[position] holder.alarmContentView.text = rowsBean.alarmContentName holder.createTimeView.text = rowsBean.createTime - holder.wellCodeView.text = rowsBean.wellCode - val alarmValue = rowsBean.alarmValue.toString() - if (alarmValue.isBlank()) { - holder.alarmValueView.text = "报警值未知" + holder.wellCodeView.text = String.format("井编号:${rowsBean.wellCode}") + val alarmValue = if (rowsBean.alarmValue.toString().isBlank()) { + "未知" } else { - holder.alarmValueView.text = alarmValue + rowsBean.alarmValue } - holder.wellLocationView.text = rowsBean.position + holder.alarmValueView.text = String.format("告警值:$alarmValue") + holder.wellLocationView.text = String.format("井位置:${rowsBean.position}") holder.currentStateView.text = String.format("${rowsBean.jobStatusName}-${rowsBean.jobBelongTo}") diff --git a/app/src/main/java/com/casic/qd/smartwell/adapter/OrderInHandleAdapter.kt b/app/src/main/java/com/casic/qd/smartwell/adapter/OrderInHandleAdapter.kt index a7fcfa8..74646d6 100644 --- a/app/src/main/java/com/casic/qd/smartwell/adapter/OrderInHandleAdapter.kt +++ b/app/src/main/java/com/casic/qd/smartwell/adapter/OrderInHandleAdapter.kt @@ -42,14 +42,14 @@ val rowsBean = dataRows[position] holder.alarmContentView.text = rowsBean.alarmContentName holder.createTimeView.text = rowsBean.createTime - holder.wellCodeView.text = rowsBean.wellCode - val alarmValue = rowsBean.alarmValue.toString() - if (alarmValue.isBlank()) { - holder.alarmValueView.text = "报警值未知" + holder.wellCodeView.text = String.format("井编号:${rowsBean.wellCode}") + val alarmValue = if (rowsBean.alarmValue.toString().isBlank()) { + "未知" } else { - holder.alarmValueView.text = alarmValue + rowsBean.alarmValue } - holder.wellLocationView.text = rowsBean.position + holder.alarmValueView.text = String.format("告警值:$alarmValue") + holder.wellLocationView.text = String.format("井位置:${rowsBean.position}") holder.currentStateView.text = String.format("${rowsBean.jobStatusName}-${rowsBean.jobBelongTo}") diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt index cd52782..149adf2 100644 --- a/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt @@ -1,6 +1,8 @@ package com.casic.qd.smartwell.extensions +import android.content.Context import android.graphics.Color +import android.text.TextUtils import android.view.Gravity import android.widget.TextView import android.widget.Toast @@ -8,11 +10,16 @@ import com.casic.qd.smartwell.base.BaseApplication import com.casic.qd.smartwell.model.ErrorMessageModel import com.casic.qd.smartwell.utils.Constant +import com.casic.qd.smartwell.utils.FileUtils +import com.casic.qd.smartwell.utils.OnImageCompressListener import com.casic.qd.smartwell.utils.SaveKeyValues import com.google.gson.Gson import com.google.gson.reflect.TypeToken import com.qmuiteam.qmui.util.QMUIDisplayHelper import org.json.JSONObject +import top.zibin.luban.Luban +import top.zibin.luban.OnCompressListener +import java.io.File import java.text.ParseException import java.text.SimpleDateFormat import java.util.* @@ -108,8 +115,30 @@ fun String.combineImagePath(): String { if (this.isEmpty()) return this val defaultValue = SaveKeyValues.getValue( - Constant.DEFAULT_SERVER_CONFIG, - "http://111.198.10.15:11304" + Constant.DEFAULT_SERVER_CONFIG, Constant.SERVER_BASE_URL ) as String return "$defaultValue/static/${this.replace("\\", "/")}" +} + +fun String.compressImage(context: Context, listener: OnImageCompressListener) { + Luban.with(context) + .load(this) + .ignoreBy(100) + .setTargetDir(FileUtils.compressImageDir) + .filter { path -> + !(TextUtils.isEmpty(path) || path.lowercase(Locale.getDefault()).endsWith(".gif")) + } + .setCompressListener(object : OnCompressListener { + override fun onStart() { + + } + + override fun onSuccess(file: File) { + listener.onSuccess(file) + } + + override fun onError(e: Throwable) { + listener.onError(e) + } + }).launch() } \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index ea77e44..59e75eb 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -76,6 +76,8 @@ implementation 'com.github.bumptech.glide:glide:4.9.0' //图片选择框架 implementation 'io.github.lucksiege:pictureselector:v3.0.4' + //图片压缩 + implementation 'top.zibin:Luban:1.1.8' //高德地图 implementation 'com.amap.api:3dmap:7.9.1' //返回值转换器 diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index e361509..1e6c783 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -14,6 +14,7 @@ + diff --git a/app/src/main/java/com/casic/qd/smartwell/adapter/NineGridImageAdapter.kt b/app/src/main/java/com/casic/qd/smartwell/adapter/NineGridImageAdapter.kt index f07824e..e016832 100644 --- a/app/src/main/java/com/casic/qd/smartwell/adapter/NineGridImageAdapter.kt +++ b/app/src/main/java/com/casic/qd/smartwell/adapter/NineGridImageAdapter.kt @@ -30,9 +30,14 @@ } fun deleteImage(position: Int) { - if (imageData.size != 0) { - imageData.removeAt(position) - notifyDataSetChanged() + try { + if (imageData.size > position) { + imageData.removeAt(position) + notifyItemRemoved(position) + notifyItemRangeChanged(position, imageData.size) + } + } catch (e: Exception) { + e.printStackTrace() } } diff --git a/app/src/main/java/com/casic/qd/smartwell/adapter/OrderCompletedAdapter.kt b/app/src/main/java/com/casic/qd/smartwell/adapter/OrderCompletedAdapter.kt index f36c15d..6533b92 100644 --- a/app/src/main/java/com/casic/qd/smartwell/adapter/OrderCompletedAdapter.kt +++ b/app/src/main/java/com/casic/qd/smartwell/adapter/OrderCompletedAdapter.kt @@ -43,14 +43,14 @@ val rowsBean = dataRows[position] holder.alarmContentView.text = rowsBean.alarmContentName holder.createTimeView.text = rowsBean.createTime - holder.wellCodeView.text = rowsBean.wellCode - val alarmValue = rowsBean.alarmValue.toString() - if (alarmValue.isBlank()) { - holder.alarmValueView.text = "报警值未知" + holder.wellCodeView.text = String.format("井编号:${rowsBean.wellCode}") + val alarmValue = if (rowsBean.alarmValue.toString().isBlank()) { + "未知" } else { - holder.alarmValueView.text = alarmValue + rowsBean.alarmValue } - holder.wellLocationView.text = rowsBean.position + holder.alarmValueView.text = String.format("告警值:$alarmValue") + holder.wellLocationView.text = String.format("井位置:${rowsBean.position}") holder.currentStateView.text = String.format("${rowsBean.jobStatusName}-${rowsBean.jobBelongTo}") diff --git a/app/src/main/java/com/casic/qd/smartwell/adapter/OrderInHandleAdapter.kt b/app/src/main/java/com/casic/qd/smartwell/adapter/OrderInHandleAdapter.kt index a7fcfa8..74646d6 100644 --- a/app/src/main/java/com/casic/qd/smartwell/adapter/OrderInHandleAdapter.kt +++ b/app/src/main/java/com/casic/qd/smartwell/adapter/OrderInHandleAdapter.kt @@ -42,14 +42,14 @@ val rowsBean = dataRows[position] holder.alarmContentView.text = rowsBean.alarmContentName holder.createTimeView.text = rowsBean.createTime - holder.wellCodeView.text = rowsBean.wellCode - val alarmValue = rowsBean.alarmValue.toString() - if (alarmValue.isBlank()) { - holder.alarmValueView.text = "报警值未知" + holder.wellCodeView.text = String.format("井编号:${rowsBean.wellCode}") + val alarmValue = if (rowsBean.alarmValue.toString().isBlank()) { + "未知" } else { - holder.alarmValueView.text = alarmValue + rowsBean.alarmValue } - holder.wellLocationView.text = rowsBean.position + holder.alarmValueView.text = String.format("告警值:$alarmValue") + holder.wellLocationView.text = String.format("井位置:${rowsBean.position}") holder.currentStateView.text = String.format("${rowsBean.jobStatusName}-${rowsBean.jobBelongTo}") diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt index cd52782..149adf2 100644 --- a/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt @@ -1,6 +1,8 @@ package com.casic.qd.smartwell.extensions +import android.content.Context import android.graphics.Color +import android.text.TextUtils import android.view.Gravity import android.widget.TextView import android.widget.Toast @@ -8,11 +10,16 @@ import com.casic.qd.smartwell.base.BaseApplication import com.casic.qd.smartwell.model.ErrorMessageModel import com.casic.qd.smartwell.utils.Constant +import com.casic.qd.smartwell.utils.FileUtils +import com.casic.qd.smartwell.utils.OnImageCompressListener import com.casic.qd.smartwell.utils.SaveKeyValues import com.google.gson.Gson import com.google.gson.reflect.TypeToken import com.qmuiteam.qmui.util.QMUIDisplayHelper import org.json.JSONObject +import top.zibin.luban.Luban +import top.zibin.luban.OnCompressListener +import java.io.File import java.text.ParseException import java.text.SimpleDateFormat import java.util.* @@ -108,8 +115,30 @@ fun String.combineImagePath(): String { if (this.isEmpty()) return this val defaultValue = SaveKeyValues.getValue( - Constant.DEFAULT_SERVER_CONFIG, - "http://111.198.10.15:11304" + Constant.DEFAULT_SERVER_CONFIG, Constant.SERVER_BASE_URL ) as String return "$defaultValue/static/${this.replace("\\", "/")}" +} + +fun String.compressImage(context: Context, listener: OnImageCompressListener) { + Luban.with(context) + .load(this) + .ignoreBy(100) + .setTargetDir(FileUtils.compressImageDir) + .filter { path -> + !(TextUtils.isEmpty(path) || path.lowercase(Locale.getDefault()).endsWith(".gif")) + } + .setCompressListener(object : OnCompressListener { + override fun onStart() { + + } + + override fun onSuccess(file: File) { + listener.onSuccess(file) + } + + override fun onError(e: Throwable) { + listener.onError(e) + } + }).launch() } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotProcessedFragment.kt b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotProcessedFragment.kt index 7605a10..a06c5a5 100644 --- a/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotProcessedFragment.kt +++ b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotProcessedFragment.kt @@ -111,53 +111,55 @@ private val callback = Handler.Callback { if (it.what == 2022061504) { - notProcessedAdapter.notifyDataSetChanged() - } else { - if (dataBeans.size == 0) { - emptyView!!.showEmptyPage("没有需要您处理的工单") { - pageIndex = 1 - obtainWorkOrderList() - } + if (isRefresh || isLoadMore) { + notProcessedAdapter.notifyDataSetChanged() } else { - emptyView!!.hide() - notProcessedAdapter = OrderNotProcessedAdapter(requireContext(), dataBeans) - notProcessedView!!.layoutManager = LinearLayoutManager(requireContext()) - notProcessedView!!.adapter = notProcessedAdapter - notProcessedAdapter.setOnItemClickListener(object : - OrderNotProcessedAdapter.OnItemClickListener { - override fun onClicked(position: Int) { - val jobId = dataBeans[position].jobId.toString() - if (jobId.isBlank()) { - "工单编号异常,无法查看详情".show() - return - } + if (dataBeans.size == 0) { + emptyView!!.showEmptyPage("没有需要您处理的工单") { + pageIndex = 1 + obtainWorkOrderList() + } + } else { + emptyView!!.hide() + notProcessedAdapter = OrderNotProcessedAdapter(requireContext(), dataBeans) + notProcessedView!!.layoutManager = LinearLayoutManager(requireContext()) + notProcessedView!!.adapter = notProcessedAdapter + notProcessedAdapter.setOnItemClickListener(object : + OrderNotProcessedAdapter.OnItemClickListener { + override fun onClicked(position: Int) { + val jobId = dataBeans[position].jobId.toString() + if (jobId.isBlank()) { + "工单编号异常,无法查看详情".show() + return + } // requireContext().navigatePageTo(jobId) - } + } - override fun onOperationClicked(position: Int) { - AlertControlDialog.Builder() - .setContext(requireContext()) - .setTitle("操作提示") - .setMessage("确定要接单吗") - .setNegativeButton("取消") - .setPositiveButton("确定") - .setOnDialogButtonClickListener(object : - AlertControlDialog.OnDialogButtonClickListener { - override fun onConfirmClick() { - val jobId = dataBeans[position].jobId.toString() - if (jobId.isBlank()) { - "工单ID异常,无法接单".show() - return + override fun onOperationClicked(position: Int) { + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("操作提示") + .setMessage("确定要接单吗") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + val jobId = dataBeans[position].jobId.toString() + if (jobId.isBlank()) { + "工单ID异常,无法接单".show() + return + } + operationViewModel.acceptOrder(jobId) } - operationViewModel.acceptOrder(jobId) - } - override fun onCancelClick() { + override fun onCancelClick() { - } - }).build().show() - } - }) + } + }).build().show() + } + }) + } } } true diff --git a/app/build.gradle b/app/build.gradle index ea77e44..59e75eb 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -76,6 +76,8 @@ implementation 'com.github.bumptech.glide:glide:4.9.0' //图片选择框架 implementation 'io.github.lucksiege:pictureselector:v3.0.4' + //图片压缩 + implementation 'top.zibin:Luban:1.1.8' //高德地图 implementation 'com.amap.api:3dmap:7.9.1' //返回值转换器 diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index e361509..1e6c783 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -14,6 +14,7 @@ + diff --git a/app/src/main/java/com/casic/qd/smartwell/adapter/NineGridImageAdapter.kt b/app/src/main/java/com/casic/qd/smartwell/adapter/NineGridImageAdapter.kt index f07824e..e016832 100644 --- a/app/src/main/java/com/casic/qd/smartwell/adapter/NineGridImageAdapter.kt +++ b/app/src/main/java/com/casic/qd/smartwell/adapter/NineGridImageAdapter.kt @@ -30,9 +30,14 @@ } fun deleteImage(position: Int) { - if (imageData.size != 0) { - imageData.removeAt(position) - notifyDataSetChanged() + try { + if (imageData.size > position) { + imageData.removeAt(position) + notifyItemRemoved(position) + notifyItemRangeChanged(position, imageData.size) + } + } catch (e: Exception) { + e.printStackTrace() } } diff --git a/app/src/main/java/com/casic/qd/smartwell/adapter/OrderCompletedAdapter.kt b/app/src/main/java/com/casic/qd/smartwell/adapter/OrderCompletedAdapter.kt index f36c15d..6533b92 100644 --- a/app/src/main/java/com/casic/qd/smartwell/adapter/OrderCompletedAdapter.kt +++ b/app/src/main/java/com/casic/qd/smartwell/adapter/OrderCompletedAdapter.kt @@ -43,14 +43,14 @@ val rowsBean = dataRows[position] holder.alarmContentView.text = rowsBean.alarmContentName holder.createTimeView.text = rowsBean.createTime - holder.wellCodeView.text = rowsBean.wellCode - val alarmValue = rowsBean.alarmValue.toString() - if (alarmValue.isBlank()) { - holder.alarmValueView.text = "报警值未知" + holder.wellCodeView.text = String.format("井编号:${rowsBean.wellCode}") + val alarmValue = if (rowsBean.alarmValue.toString().isBlank()) { + "未知" } else { - holder.alarmValueView.text = alarmValue + rowsBean.alarmValue } - holder.wellLocationView.text = rowsBean.position + holder.alarmValueView.text = String.format("告警值:$alarmValue") + holder.wellLocationView.text = String.format("井位置:${rowsBean.position}") holder.currentStateView.text = String.format("${rowsBean.jobStatusName}-${rowsBean.jobBelongTo}") diff --git a/app/src/main/java/com/casic/qd/smartwell/adapter/OrderInHandleAdapter.kt b/app/src/main/java/com/casic/qd/smartwell/adapter/OrderInHandleAdapter.kt index a7fcfa8..74646d6 100644 --- a/app/src/main/java/com/casic/qd/smartwell/adapter/OrderInHandleAdapter.kt +++ b/app/src/main/java/com/casic/qd/smartwell/adapter/OrderInHandleAdapter.kt @@ -42,14 +42,14 @@ val rowsBean = dataRows[position] holder.alarmContentView.text = rowsBean.alarmContentName holder.createTimeView.text = rowsBean.createTime - holder.wellCodeView.text = rowsBean.wellCode - val alarmValue = rowsBean.alarmValue.toString() - if (alarmValue.isBlank()) { - holder.alarmValueView.text = "报警值未知" + holder.wellCodeView.text = String.format("井编号:${rowsBean.wellCode}") + val alarmValue = if (rowsBean.alarmValue.toString().isBlank()) { + "未知" } else { - holder.alarmValueView.text = alarmValue + rowsBean.alarmValue } - holder.wellLocationView.text = rowsBean.position + holder.alarmValueView.text = String.format("告警值:$alarmValue") + holder.wellLocationView.text = String.format("井位置:${rowsBean.position}") holder.currentStateView.text = String.format("${rowsBean.jobStatusName}-${rowsBean.jobBelongTo}") diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt index cd52782..149adf2 100644 --- a/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt @@ -1,6 +1,8 @@ package com.casic.qd.smartwell.extensions +import android.content.Context import android.graphics.Color +import android.text.TextUtils import android.view.Gravity import android.widget.TextView import android.widget.Toast @@ -8,11 +10,16 @@ import com.casic.qd.smartwell.base.BaseApplication import com.casic.qd.smartwell.model.ErrorMessageModel import com.casic.qd.smartwell.utils.Constant +import com.casic.qd.smartwell.utils.FileUtils +import com.casic.qd.smartwell.utils.OnImageCompressListener import com.casic.qd.smartwell.utils.SaveKeyValues import com.google.gson.Gson import com.google.gson.reflect.TypeToken import com.qmuiteam.qmui.util.QMUIDisplayHelper import org.json.JSONObject +import top.zibin.luban.Luban +import top.zibin.luban.OnCompressListener +import java.io.File import java.text.ParseException import java.text.SimpleDateFormat import java.util.* @@ -108,8 +115,30 @@ fun String.combineImagePath(): String { if (this.isEmpty()) return this val defaultValue = SaveKeyValues.getValue( - Constant.DEFAULT_SERVER_CONFIG, - "http://111.198.10.15:11304" + Constant.DEFAULT_SERVER_CONFIG, Constant.SERVER_BASE_URL ) as String return "$defaultValue/static/${this.replace("\\", "/")}" +} + +fun String.compressImage(context: Context, listener: OnImageCompressListener) { + Luban.with(context) + .load(this) + .ignoreBy(100) + .setTargetDir(FileUtils.compressImageDir) + .filter { path -> + !(TextUtils.isEmpty(path) || path.lowercase(Locale.getDefault()).endsWith(".gif")) + } + .setCompressListener(object : OnCompressListener { + override fun onStart() { + + } + + override fun onSuccess(file: File) { + listener.onSuccess(file) + } + + override fun onError(e: Throwable) { + listener.onError(e) + } + }).launch() } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotProcessedFragment.kt b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotProcessedFragment.kt index 7605a10..a06c5a5 100644 --- a/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotProcessedFragment.kt +++ b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotProcessedFragment.kt @@ -111,53 +111,55 @@ private val callback = Handler.Callback { if (it.what == 2022061504) { - notProcessedAdapter.notifyDataSetChanged() - } else { - if (dataBeans.size == 0) { - emptyView!!.showEmptyPage("没有需要您处理的工单") { - pageIndex = 1 - obtainWorkOrderList() - } + if (isRefresh || isLoadMore) { + notProcessedAdapter.notifyDataSetChanged() } else { - emptyView!!.hide() - notProcessedAdapter = OrderNotProcessedAdapter(requireContext(), dataBeans) - notProcessedView!!.layoutManager = LinearLayoutManager(requireContext()) - notProcessedView!!.adapter = notProcessedAdapter - notProcessedAdapter.setOnItemClickListener(object : - OrderNotProcessedAdapter.OnItemClickListener { - override fun onClicked(position: Int) { - val jobId = dataBeans[position].jobId.toString() - if (jobId.isBlank()) { - "工单编号异常,无法查看详情".show() - return - } + if (dataBeans.size == 0) { + emptyView!!.showEmptyPage("没有需要您处理的工单") { + pageIndex = 1 + obtainWorkOrderList() + } + } else { + emptyView!!.hide() + notProcessedAdapter = OrderNotProcessedAdapter(requireContext(), dataBeans) + notProcessedView!!.layoutManager = LinearLayoutManager(requireContext()) + notProcessedView!!.adapter = notProcessedAdapter + notProcessedAdapter.setOnItemClickListener(object : + OrderNotProcessedAdapter.OnItemClickListener { + override fun onClicked(position: Int) { + val jobId = dataBeans[position].jobId.toString() + if (jobId.isBlank()) { + "工单编号异常,无法查看详情".show() + return + } // requireContext().navigatePageTo(jobId) - } + } - override fun onOperationClicked(position: Int) { - AlertControlDialog.Builder() - .setContext(requireContext()) - .setTitle("操作提示") - .setMessage("确定要接单吗") - .setNegativeButton("取消") - .setPositiveButton("确定") - .setOnDialogButtonClickListener(object : - AlertControlDialog.OnDialogButtonClickListener { - override fun onConfirmClick() { - val jobId = dataBeans[position].jobId.toString() - if (jobId.isBlank()) { - "工单ID异常,无法接单".show() - return + override fun onOperationClicked(position: Int) { + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("操作提示") + .setMessage("确定要接单吗") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + val jobId = dataBeans[position].jobId.toString() + if (jobId.isBlank()) { + "工单ID异常,无法接单".show() + return + } + operationViewModel.acceptOrder(jobId) } - operationViewModel.acceptOrder(jobId) - } - override fun onCancelClick() { + override fun onCancelClick() { - } - }).build().show() - } - }) + } + }).build().show() + } + }) + } } } true diff --git a/app/src/main/java/com/casic/qd/smartwell/model/SubordinateModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/SubordinateModel.kt new file mode 100644 index 0000000..3f2b287 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/model/SubordinateModel.kt @@ -0,0 +1,17 @@ +package com.casic.qd.smartwell.model + +class SubordinateModel { + var code = 0 + var data: List? = null + var message: String? = null + var isSuccess = false + + class DataBean { + var account: String? = null + var attr1: String? = null + var deptId: String? = null + var id: String? = null + var name: String? = null + var phone: String? = null + } +} \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index ea77e44..59e75eb 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -76,6 +76,8 @@ implementation 'com.github.bumptech.glide:glide:4.9.0' //图片选择框架 implementation 'io.github.lucksiege:pictureselector:v3.0.4' + //图片压缩 + implementation 'top.zibin:Luban:1.1.8' //高德地图 implementation 'com.amap.api:3dmap:7.9.1' //返回值转换器 diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index e361509..1e6c783 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -14,6 +14,7 @@ + diff --git a/app/src/main/java/com/casic/qd/smartwell/adapter/NineGridImageAdapter.kt b/app/src/main/java/com/casic/qd/smartwell/adapter/NineGridImageAdapter.kt index f07824e..e016832 100644 --- a/app/src/main/java/com/casic/qd/smartwell/adapter/NineGridImageAdapter.kt +++ b/app/src/main/java/com/casic/qd/smartwell/adapter/NineGridImageAdapter.kt @@ -30,9 +30,14 @@ } fun deleteImage(position: Int) { - if (imageData.size != 0) { - imageData.removeAt(position) - notifyDataSetChanged() + try { + if (imageData.size > position) { + imageData.removeAt(position) + notifyItemRemoved(position) + notifyItemRangeChanged(position, imageData.size) + } + } catch (e: Exception) { + e.printStackTrace() } } diff --git a/app/src/main/java/com/casic/qd/smartwell/adapter/OrderCompletedAdapter.kt b/app/src/main/java/com/casic/qd/smartwell/adapter/OrderCompletedAdapter.kt index f36c15d..6533b92 100644 --- a/app/src/main/java/com/casic/qd/smartwell/adapter/OrderCompletedAdapter.kt +++ b/app/src/main/java/com/casic/qd/smartwell/adapter/OrderCompletedAdapter.kt @@ -43,14 +43,14 @@ val rowsBean = dataRows[position] holder.alarmContentView.text = rowsBean.alarmContentName holder.createTimeView.text = rowsBean.createTime - holder.wellCodeView.text = rowsBean.wellCode - val alarmValue = rowsBean.alarmValue.toString() - if (alarmValue.isBlank()) { - holder.alarmValueView.text = "报警值未知" + holder.wellCodeView.text = String.format("井编号:${rowsBean.wellCode}") + val alarmValue = if (rowsBean.alarmValue.toString().isBlank()) { + "未知" } else { - holder.alarmValueView.text = alarmValue + rowsBean.alarmValue } - holder.wellLocationView.text = rowsBean.position + holder.alarmValueView.text = String.format("告警值:$alarmValue") + holder.wellLocationView.text = String.format("井位置:${rowsBean.position}") holder.currentStateView.text = String.format("${rowsBean.jobStatusName}-${rowsBean.jobBelongTo}") diff --git a/app/src/main/java/com/casic/qd/smartwell/adapter/OrderInHandleAdapter.kt b/app/src/main/java/com/casic/qd/smartwell/adapter/OrderInHandleAdapter.kt index a7fcfa8..74646d6 100644 --- a/app/src/main/java/com/casic/qd/smartwell/adapter/OrderInHandleAdapter.kt +++ b/app/src/main/java/com/casic/qd/smartwell/adapter/OrderInHandleAdapter.kt @@ -42,14 +42,14 @@ val rowsBean = dataRows[position] holder.alarmContentView.text = rowsBean.alarmContentName holder.createTimeView.text = rowsBean.createTime - holder.wellCodeView.text = rowsBean.wellCode - val alarmValue = rowsBean.alarmValue.toString() - if (alarmValue.isBlank()) { - holder.alarmValueView.text = "报警值未知" + holder.wellCodeView.text = String.format("井编号:${rowsBean.wellCode}") + val alarmValue = if (rowsBean.alarmValue.toString().isBlank()) { + "未知" } else { - holder.alarmValueView.text = alarmValue + rowsBean.alarmValue } - holder.wellLocationView.text = rowsBean.position + holder.alarmValueView.text = String.format("告警值:$alarmValue") + holder.wellLocationView.text = String.format("井位置:${rowsBean.position}") holder.currentStateView.text = String.format("${rowsBean.jobStatusName}-${rowsBean.jobBelongTo}") diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt index cd52782..149adf2 100644 --- a/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt @@ -1,6 +1,8 @@ package com.casic.qd.smartwell.extensions +import android.content.Context import android.graphics.Color +import android.text.TextUtils import android.view.Gravity import android.widget.TextView import android.widget.Toast @@ -8,11 +10,16 @@ import com.casic.qd.smartwell.base.BaseApplication import com.casic.qd.smartwell.model.ErrorMessageModel import com.casic.qd.smartwell.utils.Constant +import com.casic.qd.smartwell.utils.FileUtils +import com.casic.qd.smartwell.utils.OnImageCompressListener import com.casic.qd.smartwell.utils.SaveKeyValues import com.google.gson.Gson import com.google.gson.reflect.TypeToken import com.qmuiteam.qmui.util.QMUIDisplayHelper import org.json.JSONObject +import top.zibin.luban.Luban +import top.zibin.luban.OnCompressListener +import java.io.File import java.text.ParseException import java.text.SimpleDateFormat import java.util.* @@ -108,8 +115,30 @@ fun String.combineImagePath(): String { if (this.isEmpty()) return this val defaultValue = SaveKeyValues.getValue( - Constant.DEFAULT_SERVER_CONFIG, - "http://111.198.10.15:11304" + Constant.DEFAULT_SERVER_CONFIG, Constant.SERVER_BASE_URL ) as String return "$defaultValue/static/${this.replace("\\", "/")}" +} + +fun String.compressImage(context: Context, listener: OnImageCompressListener) { + Luban.with(context) + .load(this) + .ignoreBy(100) + .setTargetDir(FileUtils.compressImageDir) + .filter { path -> + !(TextUtils.isEmpty(path) || path.lowercase(Locale.getDefault()).endsWith(".gif")) + } + .setCompressListener(object : OnCompressListener { + override fun onStart() { + + } + + override fun onSuccess(file: File) { + listener.onSuccess(file) + } + + override fun onError(e: Throwable) { + listener.onError(e) + } + }).launch() } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotProcessedFragment.kt b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotProcessedFragment.kt index 7605a10..a06c5a5 100644 --- a/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotProcessedFragment.kt +++ b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotProcessedFragment.kt @@ -111,53 +111,55 @@ private val callback = Handler.Callback { if (it.what == 2022061504) { - notProcessedAdapter.notifyDataSetChanged() - } else { - if (dataBeans.size == 0) { - emptyView!!.showEmptyPage("没有需要您处理的工单") { - pageIndex = 1 - obtainWorkOrderList() - } + if (isRefresh || isLoadMore) { + notProcessedAdapter.notifyDataSetChanged() } else { - emptyView!!.hide() - notProcessedAdapter = OrderNotProcessedAdapter(requireContext(), dataBeans) - notProcessedView!!.layoutManager = LinearLayoutManager(requireContext()) - notProcessedView!!.adapter = notProcessedAdapter - notProcessedAdapter.setOnItemClickListener(object : - OrderNotProcessedAdapter.OnItemClickListener { - override fun onClicked(position: Int) { - val jobId = dataBeans[position].jobId.toString() - if (jobId.isBlank()) { - "工单编号异常,无法查看详情".show() - return - } + if (dataBeans.size == 0) { + emptyView!!.showEmptyPage("没有需要您处理的工单") { + pageIndex = 1 + obtainWorkOrderList() + } + } else { + emptyView!!.hide() + notProcessedAdapter = OrderNotProcessedAdapter(requireContext(), dataBeans) + notProcessedView!!.layoutManager = LinearLayoutManager(requireContext()) + notProcessedView!!.adapter = notProcessedAdapter + notProcessedAdapter.setOnItemClickListener(object : + OrderNotProcessedAdapter.OnItemClickListener { + override fun onClicked(position: Int) { + val jobId = dataBeans[position].jobId.toString() + if (jobId.isBlank()) { + "工单编号异常,无法查看详情".show() + return + } // requireContext().navigatePageTo(jobId) - } + } - override fun onOperationClicked(position: Int) { - AlertControlDialog.Builder() - .setContext(requireContext()) - .setTitle("操作提示") - .setMessage("确定要接单吗") - .setNegativeButton("取消") - .setPositiveButton("确定") - .setOnDialogButtonClickListener(object : - AlertControlDialog.OnDialogButtonClickListener { - override fun onConfirmClick() { - val jobId = dataBeans[position].jobId.toString() - if (jobId.isBlank()) { - "工单ID异常,无法接单".show() - return + override fun onOperationClicked(position: Int) { + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("操作提示") + .setMessage("确定要接单吗") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + val jobId = dataBeans[position].jobId.toString() + if (jobId.isBlank()) { + "工单ID异常,无法接单".show() + return + } + operationViewModel.acceptOrder(jobId) } - operationViewModel.acceptOrder(jobId) - } - override fun onCancelClick() { + override fun onCancelClick() { - } - }).build().show() - } - }) + } + }).build().show() + } + }) + } } } true diff --git a/app/src/main/java/com/casic/qd/smartwell/model/SubordinateModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/SubordinateModel.kt new file mode 100644 index 0000000..3f2b287 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/model/SubordinateModel.kt @@ -0,0 +1,17 @@ +package com.casic.qd.smartwell.model + +class SubordinateModel { + var code = 0 + var data: List? = null + var message: String? = null + var isSuccess = false + + class DataBean { + var account: String? = null + var attr1: String? = null + var deptId: String? = null + var id: String? = null + var name: String? = null + var phone: String? = null + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt index 802ed6b..8b59d0d 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt @@ -8,7 +8,8 @@ val USER_PERMISSIONS = arrayOf( Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS, Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION, - Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE + Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE, + Manifest.permission.FOREGROUND_SERVICE ) const val PERMISSIONS_CODE = 999 @@ -36,6 +37,7 @@ R.color.color_7, R.color.color_8, R.color.color_9 ) + const val SERVER_BASE_URL = "http://111.198.10.15:20104" const val INTENT_PARAM = "intentParam" const val DEFAULT_SERVER_CONFIG = "defaultServerConfig" const val ACCOUNT = "account" diff --git a/app/build.gradle b/app/build.gradle index ea77e44..59e75eb 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -76,6 +76,8 @@ implementation 'com.github.bumptech.glide:glide:4.9.0' //图片选择框架 implementation 'io.github.lucksiege:pictureselector:v3.0.4' + //图片压缩 + implementation 'top.zibin:Luban:1.1.8' //高德地图 implementation 'com.amap.api:3dmap:7.9.1' //返回值转换器 diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index e361509..1e6c783 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -14,6 +14,7 @@ + diff --git a/app/src/main/java/com/casic/qd/smartwell/adapter/NineGridImageAdapter.kt b/app/src/main/java/com/casic/qd/smartwell/adapter/NineGridImageAdapter.kt index f07824e..e016832 100644 --- a/app/src/main/java/com/casic/qd/smartwell/adapter/NineGridImageAdapter.kt +++ b/app/src/main/java/com/casic/qd/smartwell/adapter/NineGridImageAdapter.kt @@ -30,9 +30,14 @@ } fun deleteImage(position: Int) { - if (imageData.size != 0) { - imageData.removeAt(position) - notifyDataSetChanged() + try { + if (imageData.size > position) { + imageData.removeAt(position) + notifyItemRemoved(position) + notifyItemRangeChanged(position, imageData.size) + } + } catch (e: Exception) { + e.printStackTrace() } } diff --git a/app/src/main/java/com/casic/qd/smartwell/adapter/OrderCompletedAdapter.kt b/app/src/main/java/com/casic/qd/smartwell/adapter/OrderCompletedAdapter.kt index f36c15d..6533b92 100644 --- a/app/src/main/java/com/casic/qd/smartwell/adapter/OrderCompletedAdapter.kt +++ b/app/src/main/java/com/casic/qd/smartwell/adapter/OrderCompletedAdapter.kt @@ -43,14 +43,14 @@ val rowsBean = dataRows[position] holder.alarmContentView.text = rowsBean.alarmContentName holder.createTimeView.text = rowsBean.createTime - holder.wellCodeView.text = rowsBean.wellCode - val alarmValue = rowsBean.alarmValue.toString() - if (alarmValue.isBlank()) { - holder.alarmValueView.text = "报警值未知" + holder.wellCodeView.text = String.format("井编号:${rowsBean.wellCode}") + val alarmValue = if (rowsBean.alarmValue.toString().isBlank()) { + "未知" } else { - holder.alarmValueView.text = alarmValue + rowsBean.alarmValue } - holder.wellLocationView.text = rowsBean.position + holder.alarmValueView.text = String.format("告警值:$alarmValue") + holder.wellLocationView.text = String.format("井位置:${rowsBean.position}") holder.currentStateView.text = String.format("${rowsBean.jobStatusName}-${rowsBean.jobBelongTo}") diff --git a/app/src/main/java/com/casic/qd/smartwell/adapter/OrderInHandleAdapter.kt b/app/src/main/java/com/casic/qd/smartwell/adapter/OrderInHandleAdapter.kt index a7fcfa8..74646d6 100644 --- a/app/src/main/java/com/casic/qd/smartwell/adapter/OrderInHandleAdapter.kt +++ b/app/src/main/java/com/casic/qd/smartwell/adapter/OrderInHandleAdapter.kt @@ -42,14 +42,14 @@ val rowsBean = dataRows[position] holder.alarmContentView.text = rowsBean.alarmContentName holder.createTimeView.text = rowsBean.createTime - holder.wellCodeView.text = rowsBean.wellCode - val alarmValue = rowsBean.alarmValue.toString() - if (alarmValue.isBlank()) { - holder.alarmValueView.text = "报警值未知" + holder.wellCodeView.text = String.format("井编号:${rowsBean.wellCode}") + val alarmValue = if (rowsBean.alarmValue.toString().isBlank()) { + "未知" } else { - holder.alarmValueView.text = alarmValue + rowsBean.alarmValue } - holder.wellLocationView.text = rowsBean.position + holder.alarmValueView.text = String.format("告警值:$alarmValue") + holder.wellLocationView.text = String.format("井位置:${rowsBean.position}") holder.currentStateView.text = String.format("${rowsBean.jobStatusName}-${rowsBean.jobBelongTo}") diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt index cd52782..149adf2 100644 --- a/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt @@ -1,6 +1,8 @@ package com.casic.qd.smartwell.extensions +import android.content.Context import android.graphics.Color +import android.text.TextUtils import android.view.Gravity import android.widget.TextView import android.widget.Toast @@ -8,11 +10,16 @@ import com.casic.qd.smartwell.base.BaseApplication import com.casic.qd.smartwell.model.ErrorMessageModel import com.casic.qd.smartwell.utils.Constant +import com.casic.qd.smartwell.utils.FileUtils +import com.casic.qd.smartwell.utils.OnImageCompressListener import com.casic.qd.smartwell.utils.SaveKeyValues import com.google.gson.Gson import com.google.gson.reflect.TypeToken import com.qmuiteam.qmui.util.QMUIDisplayHelper import org.json.JSONObject +import top.zibin.luban.Luban +import top.zibin.luban.OnCompressListener +import java.io.File import java.text.ParseException import java.text.SimpleDateFormat import java.util.* @@ -108,8 +115,30 @@ fun String.combineImagePath(): String { if (this.isEmpty()) return this val defaultValue = SaveKeyValues.getValue( - Constant.DEFAULT_SERVER_CONFIG, - "http://111.198.10.15:11304" + Constant.DEFAULT_SERVER_CONFIG, Constant.SERVER_BASE_URL ) as String return "$defaultValue/static/${this.replace("\\", "/")}" +} + +fun String.compressImage(context: Context, listener: OnImageCompressListener) { + Luban.with(context) + .load(this) + .ignoreBy(100) + .setTargetDir(FileUtils.compressImageDir) + .filter { path -> + !(TextUtils.isEmpty(path) || path.lowercase(Locale.getDefault()).endsWith(".gif")) + } + .setCompressListener(object : OnCompressListener { + override fun onStart() { + + } + + override fun onSuccess(file: File) { + listener.onSuccess(file) + } + + override fun onError(e: Throwable) { + listener.onError(e) + } + }).launch() } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotProcessedFragment.kt b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotProcessedFragment.kt index 7605a10..a06c5a5 100644 --- a/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotProcessedFragment.kt +++ b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotProcessedFragment.kt @@ -111,53 +111,55 @@ private val callback = Handler.Callback { if (it.what == 2022061504) { - notProcessedAdapter.notifyDataSetChanged() - } else { - if (dataBeans.size == 0) { - emptyView!!.showEmptyPage("没有需要您处理的工单") { - pageIndex = 1 - obtainWorkOrderList() - } + if (isRefresh || isLoadMore) { + notProcessedAdapter.notifyDataSetChanged() } else { - emptyView!!.hide() - notProcessedAdapter = OrderNotProcessedAdapter(requireContext(), dataBeans) - notProcessedView!!.layoutManager = LinearLayoutManager(requireContext()) - notProcessedView!!.adapter = notProcessedAdapter - notProcessedAdapter.setOnItemClickListener(object : - OrderNotProcessedAdapter.OnItemClickListener { - override fun onClicked(position: Int) { - val jobId = dataBeans[position].jobId.toString() - if (jobId.isBlank()) { - "工单编号异常,无法查看详情".show() - return - } + if (dataBeans.size == 0) { + emptyView!!.showEmptyPage("没有需要您处理的工单") { + pageIndex = 1 + obtainWorkOrderList() + } + } else { + emptyView!!.hide() + notProcessedAdapter = OrderNotProcessedAdapter(requireContext(), dataBeans) + notProcessedView!!.layoutManager = LinearLayoutManager(requireContext()) + notProcessedView!!.adapter = notProcessedAdapter + notProcessedAdapter.setOnItemClickListener(object : + OrderNotProcessedAdapter.OnItemClickListener { + override fun onClicked(position: Int) { + val jobId = dataBeans[position].jobId.toString() + if (jobId.isBlank()) { + "工单编号异常,无法查看详情".show() + return + } // requireContext().navigatePageTo(jobId) - } + } - override fun onOperationClicked(position: Int) { - AlertControlDialog.Builder() - .setContext(requireContext()) - .setTitle("操作提示") - .setMessage("确定要接单吗") - .setNegativeButton("取消") - .setPositiveButton("确定") - .setOnDialogButtonClickListener(object : - AlertControlDialog.OnDialogButtonClickListener { - override fun onConfirmClick() { - val jobId = dataBeans[position].jobId.toString() - if (jobId.isBlank()) { - "工单ID异常,无法接单".show() - return + override fun onOperationClicked(position: Int) { + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("操作提示") + .setMessage("确定要接单吗") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + val jobId = dataBeans[position].jobId.toString() + if (jobId.isBlank()) { + "工单ID异常,无法接单".show() + return + } + operationViewModel.acceptOrder(jobId) } - operationViewModel.acceptOrder(jobId) - } - override fun onCancelClick() { + override fun onCancelClick() { - } - }).build().show() - } - }) + } + }).build().show() + } + }) + } } } true diff --git a/app/src/main/java/com/casic/qd/smartwell/model/SubordinateModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/SubordinateModel.kt new file mode 100644 index 0000000..3f2b287 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/model/SubordinateModel.kt @@ -0,0 +1,17 @@ +package com.casic.qd.smartwell.model + +class SubordinateModel { + var code = 0 + var data: List? = null + var message: String? = null + var isSuccess = false + + class DataBean { + var account: String? = null + var attr1: String? = null + var deptId: String? = null + var id: String? = null + var name: String? = null + var phone: String? = null + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt index 802ed6b..8b59d0d 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt @@ -8,7 +8,8 @@ val USER_PERMISSIONS = arrayOf( Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS, Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION, - Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE + Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE, + Manifest.permission.FOREGROUND_SERVICE ) const val PERMISSIONS_CODE = 999 @@ -36,6 +37,7 @@ R.color.color_7, R.color.color_8, R.color.color_9 ) + const val SERVER_BASE_URL = "http://111.198.10.15:20104" const val INTENT_PARAM = "intentParam" const val DEFAULT_SERVER_CONFIG = "defaultServerConfig" const val ACCOUNT = "account" diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/FileUtils.kt b/app/src/main/java/com/casic/qd/smartwell/utils/FileUtils.kt index 6b40d2e..c5743d3 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/FileUtils.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/FileUtils.kt @@ -7,9 +7,10 @@ object FileUtils { private val context = BaseApplication.obtainInstance() - val imageCompressPath: String + val compressImageDir: String get() { - val imageDir = File(context.getExternalFilesDir(Environment.DIRECTORY_PICTURES), "") + val imageDir = + File(context.getExternalFilesDir(Environment.DIRECTORY_PICTURES), "CompressImage") if (!imageDir.exists()) { imageDir.mkdir() } diff --git a/app/build.gradle b/app/build.gradle index ea77e44..59e75eb 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -76,6 +76,8 @@ implementation 'com.github.bumptech.glide:glide:4.9.0' //图片选择框架 implementation 'io.github.lucksiege:pictureselector:v3.0.4' + //图片压缩 + implementation 'top.zibin:Luban:1.1.8' //高德地图 implementation 'com.amap.api:3dmap:7.9.1' //返回值转换器 diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index e361509..1e6c783 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -14,6 +14,7 @@ + diff --git a/app/src/main/java/com/casic/qd/smartwell/adapter/NineGridImageAdapter.kt b/app/src/main/java/com/casic/qd/smartwell/adapter/NineGridImageAdapter.kt index f07824e..e016832 100644 --- a/app/src/main/java/com/casic/qd/smartwell/adapter/NineGridImageAdapter.kt +++ b/app/src/main/java/com/casic/qd/smartwell/adapter/NineGridImageAdapter.kt @@ -30,9 +30,14 @@ } fun deleteImage(position: Int) { - if (imageData.size != 0) { - imageData.removeAt(position) - notifyDataSetChanged() + try { + if (imageData.size > position) { + imageData.removeAt(position) + notifyItemRemoved(position) + notifyItemRangeChanged(position, imageData.size) + } + } catch (e: Exception) { + e.printStackTrace() } } diff --git a/app/src/main/java/com/casic/qd/smartwell/adapter/OrderCompletedAdapter.kt b/app/src/main/java/com/casic/qd/smartwell/adapter/OrderCompletedAdapter.kt index f36c15d..6533b92 100644 --- a/app/src/main/java/com/casic/qd/smartwell/adapter/OrderCompletedAdapter.kt +++ b/app/src/main/java/com/casic/qd/smartwell/adapter/OrderCompletedAdapter.kt @@ -43,14 +43,14 @@ val rowsBean = dataRows[position] holder.alarmContentView.text = rowsBean.alarmContentName holder.createTimeView.text = rowsBean.createTime - holder.wellCodeView.text = rowsBean.wellCode - val alarmValue = rowsBean.alarmValue.toString() - if (alarmValue.isBlank()) { - holder.alarmValueView.text = "报警值未知" + holder.wellCodeView.text = String.format("井编号:${rowsBean.wellCode}") + val alarmValue = if (rowsBean.alarmValue.toString().isBlank()) { + "未知" } else { - holder.alarmValueView.text = alarmValue + rowsBean.alarmValue } - holder.wellLocationView.text = rowsBean.position + holder.alarmValueView.text = String.format("告警值:$alarmValue") + holder.wellLocationView.text = String.format("井位置:${rowsBean.position}") holder.currentStateView.text = String.format("${rowsBean.jobStatusName}-${rowsBean.jobBelongTo}") diff --git a/app/src/main/java/com/casic/qd/smartwell/adapter/OrderInHandleAdapter.kt b/app/src/main/java/com/casic/qd/smartwell/adapter/OrderInHandleAdapter.kt index a7fcfa8..74646d6 100644 --- a/app/src/main/java/com/casic/qd/smartwell/adapter/OrderInHandleAdapter.kt +++ b/app/src/main/java/com/casic/qd/smartwell/adapter/OrderInHandleAdapter.kt @@ -42,14 +42,14 @@ val rowsBean = dataRows[position] holder.alarmContentView.text = rowsBean.alarmContentName holder.createTimeView.text = rowsBean.createTime - holder.wellCodeView.text = rowsBean.wellCode - val alarmValue = rowsBean.alarmValue.toString() - if (alarmValue.isBlank()) { - holder.alarmValueView.text = "报警值未知" + holder.wellCodeView.text = String.format("井编号:${rowsBean.wellCode}") + val alarmValue = if (rowsBean.alarmValue.toString().isBlank()) { + "未知" } else { - holder.alarmValueView.text = alarmValue + rowsBean.alarmValue } - holder.wellLocationView.text = rowsBean.position + holder.alarmValueView.text = String.format("告警值:$alarmValue") + holder.wellLocationView.text = String.format("井位置:${rowsBean.position}") holder.currentStateView.text = String.format("${rowsBean.jobStatusName}-${rowsBean.jobBelongTo}") diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt index cd52782..149adf2 100644 --- a/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt @@ -1,6 +1,8 @@ package com.casic.qd.smartwell.extensions +import android.content.Context import android.graphics.Color +import android.text.TextUtils import android.view.Gravity import android.widget.TextView import android.widget.Toast @@ -8,11 +10,16 @@ import com.casic.qd.smartwell.base.BaseApplication import com.casic.qd.smartwell.model.ErrorMessageModel import com.casic.qd.smartwell.utils.Constant +import com.casic.qd.smartwell.utils.FileUtils +import com.casic.qd.smartwell.utils.OnImageCompressListener import com.casic.qd.smartwell.utils.SaveKeyValues import com.google.gson.Gson import com.google.gson.reflect.TypeToken import com.qmuiteam.qmui.util.QMUIDisplayHelper import org.json.JSONObject +import top.zibin.luban.Luban +import top.zibin.luban.OnCompressListener +import java.io.File import java.text.ParseException import java.text.SimpleDateFormat import java.util.* @@ -108,8 +115,30 @@ fun String.combineImagePath(): String { if (this.isEmpty()) return this val defaultValue = SaveKeyValues.getValue( - Constant.DEFAULT_SERVER_CONFIG, - "http://111.198.10.15:11304" + Constant.DEFAULT_SERVER_CONFIG, Constant.SERVER_BASE_URL ) as String return "$defaultValue/static/${this.replace("\\", "/")}" +} + +fun String.compressImage(context: Context, listener: OnImageCompressListener) { + Luban.with(context) + .load(this) + .ignoreBy(100) + .setTargetDir(FileUtils.compressImageDir) + .filter { path -> + !(TextUtils.isEmpty(path) || path.lowercase(Locale.getDefault()).endsWith(".gif")) + } + .setCompressListener(object : OnCompressListener { + override fun onStart() { + + } + + override fun onSuccess(file: File) { + listener.onSuccess(file) + } + + override fun onError(e: Throwable) { + listener.onError(e) + } + }).launch() } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotProcessedFragment.kt b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotProcessedFragment.kt index 7605a10..a06c5a5 100644 --- a/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotProcessedFragment.kt +++ b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotProcessedFragment.kt @@ -111,53 +111,55 @@ private val callback = Handler.Callback { if (it.what == 2022061504) { - notProcessedAdapter.notifyDataSetChanged() - } else { - if (dataBeans.size == 0) { - emptyView!!.showEmptyPage("没有需要您处理的工单") { - pageIndex = 1 - obtainWorkOrderList() - } + if (isRefresh || isLoadMore) { + notProcessedAdapter.notifyDataSetChanged() } else { - emptyView!!.hide() - notProcessedAdapter = OrderNotProcessedAdapter(requireContext(), dataBeans) - notProcessedView!!.layoutManager = LinearLayoutManager(requireContext()) - notProcessedView!!.adapter = notProcessedAdapter - notProcessedAdapter.setOnItemClickListener(object : - OrderNotProcessedAdapter.OnItemClickListener { - override fun onClicked(position: Int) { - val jobId = dataBeans[position].jobId.toString() - if (jobId.isBlank()) { - "工单编号异常,无法查看详情".show() - return - } + if (dataBeans.size == 0) { + emptyView!!.showEmptyPage("没有需要您处理的工单") { + pageIndex = 1 + obtainWorkOrderList() + } + } else { + emptyView!!.hide() + notProcessedAdapter = OrderNotProcessedAdapter(requireContext(), dataBeans) + notProcessedView!!.layoutManager = LinearLayoutManager(requireContext()) + notProcessedView!!.adapter = notProcessedAdapter + notProcessedAdapter.setOnItemClickListener(object : + OrderNotProcessedAdapter.OnItemClickListener { + override fun onClicked(position: Int) { + val jobId = dataBeans[position].jobId.toString() + if (jobId.isBlank()) { + "工单编号异常,无法查看详情".show() + return + } // requireContext().navigatePageTo(jobId) - } + } - override fun onOperationClicked(position: Int) { - AlertControlDialog.Builder() - .setContext(requireContext()) - .setTitle("操作提示") - .setMessage("确定要接单吗") - .setNegativeButton("取消") - .setPositiveButton("确定") - .setOnDialogButtonClickListener(object : - AlertControlDialog.OnDialogButtonClickListener { - override fun onConfirmClick() { - val jobId = dataBeans[position].jobId.toString() - if (jobId.isBlank()) { - "工单ID异常,无法接单".show() - return + override fun onOperationClicked(position: Int) { + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("操作提示") + .setMessage("确定要接单吗") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + val jobId = dataBeans[position].jobId.toString() + if (jobId.isBlank()) { + "工单ID异常,无法接单".show() + return + } + operationViewModel.acceptOrder(jobId) } - operationViewModel.acceptOrder(jobId) - } - override fun onCancelClick() { + override fun onCancelClick() { - } - }).build().show() - } - }) + } + }).build().show() + } + }) + } } } true diff --git a/app/src/main/java/com/casic/qd/smartwell/model/SubordinateModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/SubordinateModel.kt new file mode 100644 index 0000000..3f2b287 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/model/SubordinateModel.kt @@ -0,0 +1,17 @@ +package com.casic.qd.smartwell.model + +class SubordinateModel { + var code = 0 + var data: List? = null + var message: String? = null + var isSuccess = false + + class DataBean { + var account: String? = null + var attr1: String? = null + var deptId: String? = null + var id: String? = null + var name: String? = null + var phone: String? = null + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt index 802ed6b..8b59d0d 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt @@ -8,7 +8,8 @@ val USER_PERMISSIONS = arrayOf( Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS, Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION, - Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE + Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE, + Manifest.permission.FOREGROUND_SERVICE ) const val PERMISSIONS_CODE = 999 @@ -36,6 +37,7 @@ R.color.color_7, R.color.color_8, R.color.color_9 ) + const val SERVER_BASE_URL = "http://111.198.10.15:20104" const val INTENT_PARAM = "intentParam" const val DEFAULT_SERVER_CONFIG = "defaultServerConfig" const val ACCOUNT = "account" diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/FileUtils.kt b/app/src/main/java/com/casic/qd/smartwell/utils/FileUtils.kt index 6b40d2e..c5743d3 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/FileUtils.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/FileUtils.kt @@ -7,9 +7,10 @@ object FileUtils { private val context = BaseApplication.obtainInstance() - val imageCompressPath: String + val compressImageDir: String get() { - val imageDir = File(context.getExternalFilesDir(Environment.DIRECTORY_PICTURES), "") + val imageDir = + File(context.getExternalFilesDir(Environment.DIRECTORY_PICTURES), "CompressImage") if (!imageDir.exists()) { imageDir.mkdir() } diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/OnImageCompressListener.kt b/app/src/main/java/com/casic/qd/smartwell/utils/OnImageCompressListener.kt new file mode 100644 index 0000000..53cbdb1 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/utils/OnImageCompressListener.kt @@ -0,0 +1,15 @@ +package com.casic.qd.smartwell.utils + +import java.io.File + +interface OnImageCompressListener { + /** + * Fired when a compression returns successfully, override to handle in your own code + */ + fun onSuccess(file: File) + + /** + * Fired when a compression fails to complete, override to handle in your own code + */ + fun onError(e: Throwable) +} \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index ea77e44..59e75eb 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -76,6 +76,8 @@ implementation 'com.github.bumptech.glide:glide:4.9.0' //图片选择框架 implementation 'io.github.lucksiege:pictureselector:v3.0.4' + //图片压缩 + implementation 'top.zibin:Luban:1.1.8' //高德地图 implementation 'com.amap.api:3dmap:7.9.1' //返回值转换器 diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index e361509..1e6c783 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -14,6 +14,7 @@ + diff --git a/app/src/main/java/com/casic/qd/smartwell/adapter/NineGridImageAdapter.kt b/app/src/main/java/com/casic/qd/smartwell/adapter/NineGridImageAdapter.kt index f07824e..e016832 100644 --- a/app/src/main/java/com/casic/qd/smartwell/adapter/NineGridImageAdapter.kt +++ b/app/src/main/java/com/casic/qd/smartwell/adapter/NineGridImageAdapter.kt @@ -30,9 +30,14 @@ } fun deleteImage(position: Int) { - if (imageData.size != 0) { - imageData.removeAt(position) - notifyDataSetChanged() + try { + if (imageData.size > position) { + imageData.removeAt(position) + notifyItemRemoved(position) + notifyItemRangeChanged(position, imageData.size) + } + } catch (e: Exception) { + e.printStackTrace() } } diff --git a/app/src/main/java/com/casic/qd/smartwell/adapter/OrderCompletedAdapter.kt b/app/src/main/java/com/casic/qd/smartwell/adapter/OrderCompletedAdapter.kt index f36c15d..6533b92 100644 --- a/app/src/main/java/com/casic/qd/smartwell/adapter/OrderCompletedAdapter.kt +++ b/app/src/main/java/com/casic/qd/smartwell/adapter/OrderCompletedAdapter.kt @@ -43,14 +43,14 @@ val rowsBean = dataRows[position] holder.alarmContentView.text = rowsBean.alarmContentName holder.createTimeView.text = rowsBean.createTime - holder.wellCodeView.text = rowsBean.wellCode - val alarmValue = rowsBean.alarmValue.toString() - if (alarmValue.isBlank()) { - holder.alarmValueView.text = "报警值未知" + holder.wellCodeView.text = String.format("井编号:${rowsBean.wellCode}") + val alarmValue = if (rowsBean.alarmValue.toString().isBlank()) { + "未知" } else { - holder.alarmValueView.text = alarmValue + rowsBean.alarmValue } - holder.wellLocationView.text = rowsBean.position + holder.alarmValueView.text = String.format("告警值:$alarmValue") + holder.wellLocationView.text = String.format("井位置:${rowsBean.position}") holder.currentStateView.text = String.format("${rowsBean.jobStatusName}-${rowsBean.jobBelongTo}") diff --git a/app/src/main/java/com/casic/qd/smartwell/adapter/OrderInHandleAdapter.kt b/app/src/main/java/com/casic/qd/smartwell/adapter/OrderInHandleAdapter.kt index a7fcfa8..74646d6 100644 --- a/app/src/main/java/com/casic/qd/smartwell/adapter/OrderInHandleAdapter.kt +++ b/app/src/main/java/com/casic/qd/smartwell/adapter/OrderInHandleAdapter.kt @@ -42,14 +42,14 @@ val rowsBean = dataRows[position] holder.alarmContentView.text = rowsBean.alarmContentName holder.createTimeView.text = rowsBean.createTime - holder.wellCodeView.text = rowsBean.wellCode - val alarmValue = rowsBean.alarmValue.toString() - if (alarmValue.isBlank()) { - holder.alarmValueView.text = "报警值未知" + holder.wellCodeView.text = String.format("井编号:${rowsBean.wellCode}") + val alarmValue = if (rowsBean.alarmValue.toString().isBlank()) { + "未知" } else { - holder.alarmValueView.text = alarmValue + rowsBean.alarmValue } - holder.wellLocationView.text = rowsBean.position + holder.alarmValueView.text = String.format("告警值:$alarmValue") + holder.wellLocationView.text = String.format("井位置:${rowsBean.position}") holder.currentStateView.text = String.format("${rowsBean.jobStatusName}-${rowsBean.jobBelongTo}") diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt index cd52782..149adf2 100644 --- a/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt @@ -1,6 +1,8 @@ package com.casic.qd.smartwell.extensions +import android.content.Context import android.graphics.Color +import android.text.TextUtils import android.view.Gravity import android.widget.TextView import android.widget.Toast @@ -8,11 +10,16 @@ import com.casic.qd.smartwell.base.BaseApplication import com.casic.qd.smartwell.model.ErrorMessageModel import com.casic.qd.smartwell.utils.Constant +import com.casic.qd.smartwell.utils.FileUtils +import com.casic.qd.smartwell.utils.OnImageCompressListener import com.casic.qd.smartwell.utils.SaveKeyValues import com.google.gson.Gson import com.google.gson.reflect.TypeToken import com.qmuiteam.qmui.util.QMUIDisplayHelper import org.json.JSONObject +import top.zibin.luban.Luban +import top.zibin.luban.OnCompressListener +import java.io.File import java.text.ParseException import java.text.SimpleDateFormat import java.util.* @@ -108,8 +115,30 @@ fun String.combineImagePath(): String { if (this.isEmpty()) return this val defaultValue = SaveKeyValues.getValue( - Constant.DEFAULT_SERVER_CONFIG, - "http://111.198.10.15:11304" + Constant.DEFAULT_SERVER_CONFIG, Constant.SERVER_BASE_URL ) as String return "$defaultValue/static/${this.replace("\\", "/")}" +} + +fun String.compressImage(context: Context, listener: OnImageCompressListener) { + Luban.with(context) + .load(this) + .ignoreBy(100) + .setTargetDir(FileUtils.compressImageDir) + .filter { path -> + !(TextUtils.isEmpty(path) || path.lowercase(Locale.getDefault()).endsWith(".gif")) + } + .setCompressListener(object : OnCompressListener { + override fun onStart() { + + } + + override fun onSuccess(file: File) { + listener.onSuccess(file) + } + + override fun onError(e: Throwable) { + listener.onError(e) + } + }).launch() } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotProcessedFragment.kt b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotProcessedFragment.kt index 7605a10..a06c5a5 100644 --- a/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotProcessedFragment.kt +++ b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotProcessedFragment.kt @@ -111,53 +111,55 @@ private val callback = Handler.Callback { if (it.what == 2022061504) { - notProcessedAdapter.notifyDataSetChanged() - } else { - if (dataBeans.size == 0) { - emptyView!!.showEmptyPage("没有需要您处理的工单") { - pageIndex = 1 - obtainWorkOrderList() - } + if (isRefresh || isLoadMore) { + notProcessedAdapter.notifyDataSetChanged() } else { - emptyView!!.hide() - notProcessedAdapter = OrderNotProcessedAdapter(requireContext(), dataBeans) - notProcessedView!!.layoutManager = LinearLayoutManager(requireContext()) - notProcessedView!!.adapter = notProcessedAdapter - notProcessedAdapter.setOnItemClickListener(object : - OrderNotProcessedAdapter.OnItemClickListener { - override fun onClicked(position: Int) { - val jobId = dataBeans[position].jobId.toString() - if (jobId.isBlank()) { - "工单编号异常,无法查看详情".show() - return - } + if (dataBeans.size == 0) { + emptyView!!.showEmptyPage("没有需要您处理的工单") { + pageIndex = 1 + obtainWorkOrderList() + } + } else { + emptyView!!.hide() + notProcessedAdapter = OrderNotProcessedAdapter(requireContext(), dataBeans) + notProcessedView!!.layoutManager = LinearLayoutManager(requireContext()) + notProcessedView!!.adapter = notProcessedAdapter + notProcessedAdapter.setOnItemClickListener(object : + OrderNotProcessedAdapter.OnItemClickListener { + override fun onClicked(position: Int) { + val jobId = dataBeans[position].jobId.toString() + if (jobId.isBlank()) { + "工单编号异常,无法查看详情".show() + return + } // requireContext().navigatePageTo(jobId) - } + } - override fun onOperationClicked(position: Int) { - AlertControlDialog.Builder() - .setContext(requireContext()) - .setTitle("操作提示") - .setMessage("确定要接单吗") - .setNegativeButton("取消") - .setPositiveButton("确定") - .setOnDialogButtonClickListener(object : - AlertControlDialog.OnDialogButtonClickListener { - override fun onConfirmClick() { - val jobId = dataBeans[position].jobId.toString() - if (jobId.isBlank()) { - "工单ID异常,无法接单".show() - return + override fun onOperationClicked(position: Int) { + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("操作提示") + .setMessage("确定要接单吗") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + val jobId = dataBeans[position].jobId.toString() + if (jobId.isBlank()) { + "工单ID异常,无法接单".show() + return + } + operationViewModel.acceptOrder(jobId) } - operationViewModel.acceptOrder(jobId) - } - override fun onCancelClick() { + override fun onCancelClick() { - } - }).build().show() - } - }) + } + }).build().show() + } + }) + } } } true diff --git a/app/src/main/java/com/casic/qd/smartwell/model/SubordinateModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/SubordinateModel.kt new file mode 100644 index 0000000..3f2b287 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/model/SubordinateModel.kt @@ -0,0 +1,17 @@ +package com.casic.qd.smartwell.model + +class SubordinateModel { + var code = 0 + var data: List? = null + var message: String? = null + var isSuccess = false + + class DataBean { + var account: String? = null + var attr1: String? = null + var deptId: String? = null + var id: String? = null + var name: String? = null + var phone: String? = null + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt index 802ed6b..8b59d0d 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt @@ -8,7 +8,8 @@ val USER_PERMISSIONS = arrayOf( Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS, Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION, - Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE + Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE, + Manifest.permission.FOREGROUND_SERVICE ) const val PERMISSIONS_CODE = 999 @@ -36,6 +37,7 @@ R.color.color_7, R.color.color_8, R.color.color_9 ) + const val SERVER_BASE_URL = "http://111.198.10.15:20104" const val INTENT_PARAM = "intentParam" const val DEFAULT_SERVER_CONFIG = "defaultServerConfig" const val ACCOUNT = "account" diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/FileUtils.kt b/app/src/main/java/com/casic/qd/smartwell/utils/FileUtils.kt index 6b40d2e..c5743d3 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/FileUtils.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/FileUtils.kt @@ -7,9 +7,10 @@ object FileUtils { private val context = BaseApplication.obtainInstance() - val imageCompressPath: String + val compressImageDir: String get() { - val imageDir = File(context.getExternalFilesDir(Environment.DIRECTORY_PICTURES), "") + val imageDir = + File(context.getExternalFilesDir(Environment.DIRECTORY_PICTURES), "CompressImage") if (!imageDir.exists()) { imageDir.mkdir() } diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/OnImageCompressListener.kt b/app/src/main/java/com/casic/qd/smartwell/utils/OnImageCompressListener.kt new file mode 100644 index 0000000..53cbdb1 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/utils/OnImageCompressListener.kt @@ -0,0 +1,15 @@ +package com.casic.qd.smartwell.utils + +import java.io.File + +interface OnImageCompressListener { + /** + * Fired when a compression returns successfully, override to handle in your own code + */ + fun onSuccess(file: File) + + /** + * Fired when a compression fails to complete, override to handle in your own code + */ + fun onError(e: Throwable) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitFactory.kt b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitFactory.kt index 04579cf..2d9a4db 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitFactory.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitFactory.kt @@ -19,8 +19,7 @@ fun createRetrofit(clazz: Class): T { val defaultValue = SaveKeyValues.getValue( - Constant.DEFAULT_SERVER_CONFIG, - "http://111.198.10.15:20104" + Constant.DEFAULT_SERVER_CONFIG, Constant.SERVER_BASE_URL ) as String return Retrofit.Builder() .baseUrl(defaultValue) diff --git a/app/build.gradle b/app/build.gradle index ea77e44..59e75eb 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -76,6 +76,8 @@ implementation 'com.github.bumptech.glide:glide:4.9.0' //图片选择框架 implementation 'io.github.lucksiege:pictureselector:v3.0.4' + //图片压缩 + implementation 'top.zibin:Luban:1.1.8' //高德地图 implementation 'com.amap.api:3dmap:7.9.1' //返回值转换器 diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index e361509..1e6c783 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -14,6 +14,7 @@ + diff --git a/app/src/main/java/com/casic/qd/smartwell/adapter/NineGridImageAdapter.kt b/app/src/main/java/com/casic/qd/smartwell/adapter/NineGridImageAdapter.kt index f07824e..e016832 100644 --- a/app/src/main/java/com/casic/qd/smartwell/adapter/NineGridImageAdapter.kt +++ b/app/src/main/java/com/casic/qd/smartwell/adapter/NineGridImageAdapter.kt @@ -30,9 +30,14 @@ } fun deleteImage(position: Int) { - if (imageData.size != 0) { - imageData.removeAt(position) - notifyDataSetChanged() + try { + if (imageData.size > position) { + imageData.removeAt(position) + notifyItemRemoved(position) + notifyItemRangeChanged(position, imageData.size) + } + } catch (e: Exception) { + e.printStackTrace() } } diff --git a/app/src/main/java/com/casic/qd/smartwell/adapter/OrderCompletedAdapter.kt b/app/src/main/java/com/casic/qd/smartwell/adapter/OrderCompletedAdapter.kt index f36c15d..6533b92 100644 --- a/app/src/main/java/com/casic/qd/smartwell/adapter/OrderCompletedAdapter.kt +++ b/app/src/main/java/com/casic/qd/smartwell/adapter/OrderCompletedAdapter.kt @@ -43,14 +43,14 @@ val rowsBean = dataRows[position] holder.alarmContentView.text = rowsBean.alarmContentName holder.createTimeView.text = rowsBean.createTime - holder.wellCodeView.text = rowsBean.wellCode - val alarmValue = rowsBean.alarmValue.toString() - if (alarmValue.isBlank()) { - holder.alarmValueView.text = "报警值未知" + holder.wellCodeView.text = String.format("井编号:${rowsBean.wellCode}") + val alarmValue = if (rowsBean.alarmValue.toString().isBlank()) { + "未知" } else { - holder.alarmValueView.text = alarmValue + rowsBean.alarmValue } - holder.wellLocationView.text = rowsBean.position + holder.alarmValueView.text = String.format("告警值:$alarmValue") + holder.wellLocationView.text = String.format("井位置:${rowsBean.position}") holder.currentStateView.text = String.format("${rowsBean.jobStatusName}-${rowsBean.jobBelongTo}") diff --git a/app/src/main/java/com/casic/qd/smartwell/adapter/OrderInHandleAdapter.kt b/app/src/main/java/com/casic/qd/smartwell/adapter/OrderInHandleAdapter.kt index a7fcfa8..74646d6 100644 --- a/app/src/main/java/com/casic/qd/smartwell/adapter/OrderInHandleAdapter.kt +++ b/app/src/main/java/com/casic/qd/smartwell/adapter/OrderInHandleAdapter.kt @@ -42,14 +42,14 @@ val rowsBean = dataRows[position] holder.alarmContentView.text = rowsBean.alarmContentName holder.createTimeView.text = rowsBean.createTime - holder.wellCodeView.text = rowsBean.wellCode - val alarmValue = rowsBean.alarmValue.toString() - if (alarmValue.isBlank()) { - holder.alarmValueView.text = "报警值未知" + holder.wellCodeView.text = String.format("井编号:${rowsBean.wellCode}") + val alarmValue = if (rowsBean.alarmValue.toString().isBlank()) { + "未知" } else { - holder.alarmValueView.text = alarmValue + rowsBean.alarmValue } - holder.wellLocationView.text = rowsBean.position + holder.alarmValueView.text = String.format("告警值:$alarmValue") + holder.wellLocationView.text = String.format("井位置:${rowsBean.position}") holder.currentStateView.text = String.format("${rowsBean.jobStatusName}-${rowsBean.jobBelongTo}") diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt index cd52782..149adf2 100644 --- a/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt @@ -1,6 +1,8 @@ package com.casic.qd.smartwell.extensions +import android.content.Context import android.graphics.Color +import android.text.TextUtils import android.view.Gravity import android.widget.TextView import android.widget.Toast @@ -8,11 +10,16 @@ import com.casic.qd.smartwell.base.BaseApplication import com.casic.qd.smartwell.model.ErrorMessageModel import com.casic.qd.smartwell.utils.Constant +import com.casic.qd.smartwell.utils.FileUtils +import com.casic.qd.smartwell.utils.OnImageCompressListener import com.casic.qd.smartwell.utils.SaveKeyValues import com.google.gson.Gson import com.google.gson.reflect.TypeToken import com.qmuiteam.qmui.util.QMUIDisplayHelper import org.json.JSONObject +import top.zibin.luban.Luban +import top.zibin.luban.OnCompressListener +import java.io.File import java.text.ParseException import java.text.SimpleDateFormat import java.util.* @@ -108,8 +115,30 @@ fun String.combineImagePath(): String { if (this.isEmpty()) return this val defaultValue = SaveKeyValues.getValue( - Constant.DEFAULT_SERVER_CONFIG, - "http://111.198.10.15:11304" + Constant.DEFAULT_SERVER_CONFIG, Constant.SERVER_BASE_URL ) as String return "$defaultValue/static/${this.replace("\\", "/")}" +} + +fun String.compressImage(context: Context, listener: OnImageCompressListener) { + Luban.with(context) + .load(this) + .ignoreBy(100) + .setTargetDir(FileUtils.compressImageDir) + .filter { path -> + !(TextUtils.isEmpty(path) || path.lowercase(Locale.getDefault()).endsWith(".gif")) + } + .setCompressListener(object : OnCompressListener { + override fun onStart() { + + } + + override fun onSuccess(file: File) { + listener.onSuccess(file) + } + + override fun onError(e: Throwable) { + listener.onError(e) + } + }).launch() } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotProcessedFragment.kt b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotProcessedFragment.kt index 7605a10..a06c5a5 100644 --- a/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotProcessedFragment.kt +++ b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotProcessedFragment.kt @@ -111,53 +111,55 @@ private val callback = Handler.Callback { if (it.what == 2022061504) { - notProcessedAdapter.notifyDataSetChanged() - } else { - if (dataBeans.size == 0) { - emptyView!!.showEmptyPage("没有需要您处理的工单") { - pageIndex = 1 - obtainWorkOrderList() - } + if (isRefresh || isLoadMore) { + notProcessedAdapter.notifyDataSetChanged() } else { - emptyView!!.hide() - notProcessedAdapter = OrderNotProcessedAdapter(requireContext(), dataBeans) - notProcessedView!!.layoutManager = LinearLayoutManager(requireContext()) - notProcessedView!!.adapter = notProcessedAdapter - notProcessedAdapter.setOnItemClickListener(object : - OrderNotProcessedAdapter.OnItemClickListener { - override fun onClicked(position: Int) { - val jobId = dataBeans[position].jobId.toString() - if (jobId.isBlank()) { - "工单编号异常,无法查看详情".show() - return - } + if (dataBeans.size == 0) { + emptyView!!.showEmptyPage("没有需要您处理的工单") { + pageIndex = 1 + obtainWorkOrderList() + } + } else { + emptyView!!.hide() + notProcessedAdapter = OrderNotProcessedAdapter(requireContext(), dataBeans) + notProcessedView!!.layoutManager = LinearLayoutManager(requireContext()) + notProcessedView!!.adapter = notProcessedAdapter + notProcessedAdapter.setOnItemClickListener(object : + OrderNotProcessedAdapter.OnItemClickListener { + override fun onClicked(position: Int) { + val jobId = dataBeans[position].jobId.toString() + if (jobId.isBlank()) { + "工单编号异常,无法查看详情".show() + return + } // requireContext().navigatePageTo(jobId) - } + } - override fun onOperationClicked(position: Int) { - AlertControlDialog.Builder() - .setContext(requireContext()) - .setTitle("操作提示") - .setMessage("确定要接单吗") - .setNegativeButton("取消") - .setPositiveButton("确定") - .setOnDialogButtonClickListener(object : - AlertControlDialog.OnDialogButtonClickListener { - override fun onConfirmClick() { - val jobId = dataBeans[position].jobId.toString() - if (jobId.isBlank()) { - "工单ID异常,无法接单".show() - return + override fun onOperationClicked(position: Int) { + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("操作提示") + .setMessage("确定要接单吗") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + val jobId = dataBeans[position].jobId.toString() + if (jobId.isBlank()) { + "工单ID异常,无法接单".show() + return + } + operationViewModel.acceptOrder(jobId) } - operationViewModel.acceptOrder(jobId) - } - override fun onCancelClick() { + override fun onCancelClick() { - } - }).build().show() - } - }) + } + }).build().show() + } + }) + } } } true diff --git a/app/src/main/java/com/casic/qd/smartwell/model/SubordinateModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/SubordinateModel.kt new file mode 100644 index 0000000..3f2b287 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/model/SubordinateModel.kt @@ -0,0 +1,17 @@ +package com.casic.qd.smartwell.model + +class SubordinateModel { + var code = 0 + var data: List? = null + var message: String? = null + var isSuccess = false + + class DataBean { + var account: String? = null + var attr1: String? = null + var deptId: String? = null + var id: String? = null + var name: String? = null + var phone: String? = null + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt index 802ed6b..8b59d0d 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt @@ -8,7 +8,8 @@ val USER_PERMISSIONS = arrayOf( Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS, Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION, - Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE + Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE, + Manifest.permission.FOREGROUND_SERVICE ) const val PERMISSIONS_CODE = 999 @@ -36,6 +37,7 @@ R.color.color_7, R.color.color_8, R.color.color_9 ) + const val SERVER_BASE_URL = "http://111.198.10.15:20104" const val INTENT_PARAM = "intentParam" const val DEFAULT_SERVER_CONFIG = "defaultServerConfig" const val ACCOUNT = "account" diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/FileUtils.kt b/app/src/main/java/com/casic/qd/smartwell/utils/FileUtils.kt index 6b40d2e..c5743d3 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/FileUtils.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/FileUtils.kt @@ -7,9 +7,10 @@ object FileUtils { private val context = BaseApplication.obtainInstance() - val imageCompressPath: String + val compressImageDir: String get() { - val imageDir = File(context.getExternalFilesDir(Environment.DIRECTORY_PICTURES), "") + val imageDir = + File(context.getExternalFilesDir(Environment.DIRECTORY_PICTURES), "CompressImage") if (!imageDir.exists()) { imageDir.mkdir() } diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/OnImageCompressListener.kt b/app/src/main/java/com/casic/qd/smartwell/utils/OnImageCompressListener.kt new file mode 100644 index 0000000..53cbdb1 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/utils/OnImageCompressListener.kt @@ -0,0 +1,15 @@ +package com.casic.qd.smartwell.utils + +import java.io.File + +interface OnImageCompressListener { + /** + * Fired when a compression returns successfully, override to handle in your own code + */ + fun onSuccess(file: File) + + /** + * Fired when a compression fails to complete, override to handle in your own code + */ + fun onError(e: Throwable) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitFactory.kt b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitFactory.kt index 04579cf..2d9a4db 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitFactory.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitFactory.kt @@ -19,8 +19,7 @@ fun createRetrofit(clazz: Class): T { val defaultValue = SaveKeyValues.getValue( - Constant.DEFAULT_SERVER_CONFIG, - "http://111.198.10.15:20104" + Constant.DEFAULT_SERVER_CONFIG, Constant.SERVER_BASE_URL ) as String return Retrofit.Builder() .baseUrl(defaultValue) diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt index e20aa4e..a455056 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt @@ -352,4 +352,32 @@ @Header("token") token: String, @Part file: MultipartBody.Part ): String + + /** + * 查找同一单位下的用户 + * + * @param hasMine 是否包含本人,1包含, 0不包含 + * @param roleTips 角色类型,例:leader,member + */ + @FormUrlEncoded + @POST("/mgr/simplelist") + suspend fun obtainSubordinate( + @Header("token") token: String, + @Field("hasMine") hasMine: String?, + @Field("roleTips") roleTips: String? + ): String + + /** + * 转单 + * + * @param id 工单id + * @param transferPerson 转单人,转给谁 + */ + @FormUrlEncoded + @POST("/job/transferJob") + suspend fun transferWorkOrder( + @Header("token") token: String, + @Field("id") id: String, + @Field("transferPerson") transferPerson: String + ): String } \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index ea77e44..59e75eb 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -76,6 +76,8 @@ implementation 'com.github.bumptech.glide:glide:4.9.0' //图片选择框架 implementation 'io.github.lucksiege:pictureselector:v3.0.4' + //图片压缩 + implementation 'top.zibin:Luban:1.1.8' //高德地图 implementation 'com.amap.api:3dmap:7.9.1' //返回值转换器 diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index e361509..1e6c783 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -14,6 +14,7 @@ + diff --git a/app/src/main/java/com/casic/qd/smartwell/adapter/NineGridImageAdapter.kt b/app/src/main/java/com/casic/qd/smartwell/adapter/NineGridImageAdapter.kt index f07824e..e016832 100644 --- a/app/src/main/java/com/casic/qd/smartwell/adapter/NineGridImageAdapter.kt +++ b/app/src/main/java/com/casic/qd/smartwell/adapter/NineGridImageAdapter.kt @@ -30,9 +30,14 @@ } fun deleteImage(position: Int) { - if (imageData.size != 0) { - imageData.removeAt(position) - notifyDataSetChanged() + try { + if (imageData.size > position) { + imageData.removeAt(position) + notifyItemRemoved(position) + notifyItemRangeChanged(position, imageData.size) + } + } catch (e: Exception) { + e.printStackTrace() } } diff --git a/app/src/main/java/com/casic/qd/smartwell/adapter/OrderCompletedAdapter.kt b/app/src/main/java/com/casic/qd/smartwell/adapter/OrderCompletedAdapter.kt index f36c15d..6533b92 100644 --- a/app/src/main/java/com/casic/qd/smartwell/adapter/OrderCompletedAdapter.kt +++ b/app/src/main/java/com/casic/qd/smartwell/adapter/OrderCompletedAdapter.kt @@ -43,14 +43,14 @@ val rowsBean = dataRows[position] holder.alarmContentView.text = rowsBean.alarmContentName holder.createTimeView.text = rowsBean.createTime - holder.wellCodeView.text = rowsBean.wellCode - val alarmValue = rowsBean.alarmValue.toString() - if (alarmValue.isBlank()) { - holder.alarmValueView.text = "报警值未知" + holder.wellCodeView.text = String.format("井编号:${rowsBean.wellCode}") + val alarmValue = if (rowsBean.alarmValue.toString().isBlank()) { + "未知" } else { - holder.alarmValueView.text = alarmValue + rowsBean.alarmValue } - holder.wellLocationView.text = rowsBean.position + holder.alarmValueView.text = String.format("告警值:$alarmValue") + holder.wellLocationView.text = String.format("井位置:${rowsBean.position}") holder.currentStateView.text = String.format("${rowsBean.jobStatusName}-${rowsBean.jobBelongTo}") diff --git a/app/src/main/java/com/casic/qd/smartwell/adapter/OrderInHandleAdapter.kt b/app/src/main/java/com/casic/qd/smartwell/adapter/OrderInHandleAdapter.kt index a7fcfa8..74646d6 100644 --- a/app/src/main/java/com/casic/qd/smartwell/adapter/OrderInHandleAdapter.kt +++ b/app/src/main/java/com/casic/qd/smartwell/adapter/OrderInHandleAdapter.kt @@ -42,14 +42,14 @@ val rowsBean = dataRows[position] holder.alarmContentView.text = rowsBean.alarmContentName holder.createTimeView.text = rowsBean.createTime - holder.wellCodeView.text = rowsBean.wellCode - val alarmValue = rowsBean.alarmValue.toString() - if (alarmValue.isBlank()) { - holder.alarmValueView.text = "报警值未知" + holder.wellCodeView.text = String.format("井编号:${rowsBean.wellCode}") + val alarmValue = if (rowsBean.alarmValue.toString().isBlank()) { + "未知" } else { - holder.alarmValueView.text = alarmValue + rowsBean.alarmValue } - holder.wellLocationView.text = rowsBean.position + holder.alarmValueView.text = String.format("告警值:$alarmValue") + holder.wellLocationView.text = String.format("井位置:${rowsBean.position}") holder.currentStateView.text = String.format("${rowsBean.jobStatusName}-${rowsBean.jobBelongTo}") diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt index cd52782..149adf2 100644 --- a/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt @@ -1,6 +1,8 @@ package com.casic.qd.smartwell.extensions +import android.content.Context import android.graphics.Color +import android.text.TextUtils import android.view.Gravity import android.widget.TextView import android.widget.Toast @@ -8,11 +10,16 @@ import com.casic.qd.smartwell.base.BaseApplication import com.casic.qd.smartwell.model.ErrorMessageModel import com.casic.qd.smartwell.utils.Constant +import com.casic.qd.smartwell.utils.FileUtils +import com.casic.qd.smartwell.utils.OnImageCompressListener import com.casic.qd.smartwell.utils.SaveKeyValues import com.google.gson.Gson import com.google.gson.reflect.TypeToken import com.qmuiteam.qmui.util.QMUIDisplayHelper import org.json.JSONObject +import top.zibin.luban.Luban +import top.zibin.luban.OnCompressListener +import java.io.File import java.text.ParseException import java.text.SimpleDateFormat import java.util.* @@ -108,8 +115,30 @@ fun String.combineImagePath(): String { if (this.isEmpty()) return this val defaultValue = SaveKeyValues.getValue( - Constant.DEFAULT_SERVER_CONFIG, - "http://111.198.10.15:11304" + Constant.DEFAULT_SERVER_CONFIG, Constant.SERVER_BASE_URL ) as String return "$defaultValue/static/${this.replace("\\", "/")}" +} + +fun String.compressImage(context: Context, listener: OnImageCompressListener) { + Luban.with(context) + .load(this) + .ignoreBy(100) + .setTargetDir(FileUtils.compressImageDir) + .filter { path -> + !(TextUtils.isEmpty(path) || path.lowercase(Locale.getDefault()).endsWith(".gif")) + } + .setCompressListener(object : OnCompressListener { + override fun onStart() { + + } + + override fun onSuccess(file: File) { + listener.onSuccess(file) + } + + override fun onError(e: Throwable) { + listener.onError(e) + } + }).launch() } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotProcessedFragment.kt b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotProcessedFragment.kt index 7605a10..a06c5a5 100644 --- a/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotProcessedFragment.kt +++ b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotProcessedFragment.kt @@ -111,53 +111,55 @@ private val callback = Handler.Callback { if (it.what == 2022061504) { - notProcessedAdapter.notifyDataSetChanged() - } else { - if (dataBeans.size == 0) { - emptyView!!.showEmptyPage("没有需要您处理的工单") { - pageIndex = 1 - obtainWorkOrderList() - } + if (isRefresh || isLoadMore) { + notProcessedAdapter.notifyDataSetChanged() } else { - emptyView!!.hide() - notProcessedAdapter = OrderNotProcessedAdapter(requireContext(), dataBeans) - notProcessedView!!.layoutManager = LinearLayoutManager(requireContext()) - notProcessedView!!.adapter = notProcessedAdapter - notProcessedAdapter.setOnItemClickListener(object : - OrderNotProcessedAdapter.OnItemClickListener { - override fun onClicked(position: Int) { - val jobId = dataBeans[position].jobId.toString() - if (jobId.isBlank()) { - "工单编号异常,无法查看详情".show() - return - } + if (dataBeans.size == 0) { + emptyView!!.showEmptyPage("没有需要您处理的工单") { + pageIndex = 1 + obtainWorkOrderList() + } + } else { + emptyView!!.hide() + notProcessedAdapter = OrderNotProcessedAdapter(requireContext(), dataBeans) + notProcessedView!!.layoutManager = LinearLayoutManager(requireContext()) + notProcessedView!!.adapter = notProcessedAdapter + notProcessedAdapter.setOnItemClickListener(object : + OrderNotProcessedAdapter.OnItemClickListener { + override fun onClicked(position: Int) { + val jobId = dataBeans[position].jobId.toString() + if (jobId.isBlank()) { + "工单编号异常,无法查看详情".show() + return + } // requireContext().navigatePageTo(jobId) - } + } - override fun onOperationClicked(position: Int) { - AlertControlDialog.Builder() - .setContext(requireContext()) - .setTitle("操作提示") - .setMessage("确定要接单吗") - .setNegativeButton("取消") - .setPositiveButton("确定") - .setOnDialogButtonClickListener(object : - AlertControlDialog.OnDialogButtonClickListener { - override fun onConfirmClick() { - val jobId = dataBeans[position].jobId.toString() - if (jobId.isBlank()) { - "工单ID异常,无法接单".show() - return + override fun onOperationClicked(position: Int) { + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("操作提示") + .setMessage("确定要接单吗") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + val jobId = dataBeans[position].jobId.toString() + if (jobId.isBlank()) { + "工单ID异常,无法接单".show() + return + } + operationViewModel.acceptOrder(jobId) } - operationViewModel.acceptOrder(jobId) - } - override fun onCancelClick() { + override fun onCancelClick() { - } - }).build().show() - } - }) + } + }).build().show() + } + }) + } } } true diff --git a/app/src/main/java/com/casic/qd/smartwell/model/SubordinateModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/SubordinateModel.kt new file mode 100644 index 0000000..3f2b287 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/model/SubordinateModel.kt @@ -0,0 +1,17 @@ +package com.casic.qd.smartwell.model + +class SubordinateModel { + var code = 0 + var data: List? = null + var message: String? = null + var isSuccess = false + + class DataBean { + var account: String? = null + var attr1: String? = null + var deptId: String? = null + var id: String? = null + var name: String? = null + var phone: String? = null + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt index 802ed6b..8b59d0d 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt @@ -8,7 +8,8 @@ val USER_PERMISSIONS = arrayOf( Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS, Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION, - Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE + Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE, + Manifest.permission.FOREGROUND_SERVICE ) const val PERMISSIONS_CODE = 999 @@ -36,6 +37,7 @@ R.color.color_7, R.color.color_8, R.color.color_9 ) + const val SERVER_BASE_URL = "http://111.198.10.15:20104" const val INTENT_PARAM = "intentParam" const val DEFAULT_SERVER_CONFIG = "defaultServerConfig" const val ACCOUNT = "account" diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/FileUtils.kt b/app/src/main/java/com/casic/qd/smartwell/utils/FileUtils.kt index 6b40d2e..c5743d3 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/FileUtils.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/FileUtils.kt @@ -7,9 +7,10 @@ object FileUtils { private val context = BaseApplication.obtainInstance() - val imageCompressPath: String + val compressImageDir: String get() { - val imageDir = File(context.getExternalFilesDir(Environment.DIRECTORY_PICTURES), "") + val imageDir = + File(context.getExternalFilesDir(Environment.DIRECTORY_PICTURES), "CompressImage") if (!imageDir.exists()) { imageDir.mkdir() } diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/OnImageCompressListener.kt b/app/src/main/java/com/casic/qd/smartwell/utils/OnImageCompressListener.kt new file mode 100644 index 0000000..53cbdb1 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/utils/OnImageCompressListener.kt @@ -0,0 +1,15 @@ +package com.casic.qd.smartwell.utils + +import java.io.File + +interface OnImageCompressListener { + /** + * Fired when a compression returns successfully, override to handle in your own code + */ + fun onSuccess(file: File) + + /** + * Fired when a compression fails to complete, override to handle in your own code + */ + fun onError(e: Throwable) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitFactory.kt b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitFactory.kt index 04579cf..2d9a4db 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitFactory.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitFactory.kt @@ -19,8 +19,7 @@ fun createRetrofit(clazz: Class): T { val defaultValue = SaveKeyValues.getValue( - Constant.DEFAULT_SERVER_CONFIG, - "http://111.198.10.15:20104" + Constant.DEFAULT_SERVER_CONFIG, Constant.SERVER_BASE_URL ) as String return Retrofit.Builder() .baseUrl(defaultValue) diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt index e20aa4e..a455056 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt @@ -352,4 +352,32 @@ @Header("token") token: String, @Part file: MultipartBody.Part ): String + + /** + * 查找同一单位下的用户 + * + * @param hasMine 是否包含本人,1包含, 0不包含 + * @param roleTips 角色类型,例:leader,member + */ + @FormUrlEncoded + @POST("/mgr/simplelist") + suspend fun obtainSubordinate( + @Header("token") token: String, + @Field("hasMine") hasMine: String?, + @Field("roleTips") roleTips: String? + ): String + + /** + * 转单 + * + * @param id 工单id + * @param transferPerson 转单人,转给谁 + */ + @FormUrlEncoded + @POST("/job/transferJob") + suspend fun transferWorkOrder( + @Header("token") token: String, + @Field("id") id: String, + @Field("transferPerson") transferPerson: String + ): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt index 8ce0fed..2de85eb 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt @@ -307,9 +307,7 @@ /** * 完成工单 */ - suspend fun completeOrder( - id: String, handleMessage: String, handlePhotos: String - ): String { + suspend fun completeOrder(id: String, handleMessage: String, handlePhotos: String): String { return api.completeOrder( AuthenticationHelper.token!!, id, handleMessage, handlePhotos ) @@ -323,4 +321,18 @@ val imagePart = MultipartBody.Part.createFormData("file", image.name, requestBody) return api.uploadImage(AuthenticationHelper.token!!, imagePart) } + + /** + * 查找同一单位下的用户 + */ + suspend fun obtainSubordinate(hasMine: String?, roleTips: String?): String { + return api.obtainSubordinate(AuthenticationHelper.token!!, hasMine, roleTips) + } + + /** + * 转单 + */ + suspend fun transferWorkOrder(id: String, userId: String): String { + return api.transferWorkOrder(AuthenticationHelper.token!!, id, userId) + } } \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index ea77e44..59e75eb 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -76,6 +76,8 @@ implementation 'com.github.bumptech.glide:glide:4.9.0' //图片选择框架 implementation 'io.github.lucksiege:pictureselector:v3.0.4' + //图片压缩 + implementation 'top.zibin:Luban:1.1.8' //高德地图 implementation 'com.amap.api:3dmap:7.9.1' //返回值转换器 diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index e361509..1e6c783 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -14,6 +14,7 @@ + diff --git a/app/src/main/java/com/casic/qd/smartwell/adapter/NineGridImageAdapter.kt b/app/src/main/java/com/casic/qd/smartwell/adapter/NineGridImageAdapter.kt index f07824e..e016832 100644 --- a/app/src/main/java/com/casic/qd/smartwell/adapter/NineGridImageAdapter.kt +++ b/app/src/main/java/com/casic/qd/smartwell/adapter/NineGridImageAdapter.kt @@ -30,9 +30,14 @@ } fun deleteImage(position: Int) { - if (imageData.size != 0) { - imageData.removeAt(position) - notifyDataSetChanged() + try { + if (imageData.size > position) { + imageData.removeAt(position) + notifyItemRemoved(position) + notifyItemRangeChanged(position, imageData.size) + } + } catch (e: Exception) { + e.printStackTrace() } } diff --git a/app/src/main/java/com/casic/qd/smartwell/adapter/OrderCompletedAdapter.kt b/app/src/main/java/com/casic/qd/smartwell/adapter/OrderCompletedAdapter.kt index f36c15d..6533b92 100644 --- a/app/src/main/java/com/casic/qd/smartwell/adapter/OrderCompletedAdapter.kt +++ b/app/src/main/java/com/casic/qd/smartwell/adapter/OrderCompletedAdapter.kt @@ -43,14 +43,14 @@ val rowsBean = dataRows[position] holder.alarmContentView.text = rowsBean.alarmContentName holder.createTimeView.text = rowsBean.createTime - holder.wellCodeView.text = rowsBean.wellCode - val alarmValue = rowsBean.alarmValue.toString() - if (alarmValue.isBlank()) { - holder.alarmValueView.text = "报警值未知" + holder.wellCodeView.text = String.format("井编号:${rowsBean.wellCode}") + val alarmValue = if (rowsBean.alarmValue.toString().isBlank()) { + "未知" } else { - holder.alarmValueView.text = alarmValue + rowsBean.alarmValue } - holder.wellLocationView.text = rowsBean.position + holder.alarmValueView.text = String.format("告警值:$alarmValue") + holder.wellLocationView.text = String.format("井位置:${rowsBean.position}") holder.currentStateView.text = String.format("${rowsBean.jobStatusName}-${rowsBean.jobBelongTo}") diff --git a/app/src/main/java/com/casic/qd/smartwell/adapter/OrderInHandleAdapter.kt b/app/src/main/java/com/casic/qd/smartwell/adapter/OrderInHandleAdapter.kt index a7fcfa8..74646d6 100644 --- a/app/src/main/java/com/casic/qd/smartwell/adapter/OrderInHandleAdapter.kt +++ b/app/src/main/java/com/casic/qd/smartwell/adapter/OrderInHandleAdapter.kt @@ -42,14 +42,14 @@ val rowsBean = dataRows[position] holder.alarmContentView.text = rowsBean.alarmContentName holder.createTimeView.text = rowsBean.createTime - holder.wellCodeView.text = rowsBean.wellCode - val alarmValue = rowsBean.alarmValue.toString() - if (alarmValue.isBlank()) { - holder.alarmValueView.text = "报警值未知" + holder.wellCodeView.text = String.format("井编号:${rowsBean.wellCode}") + val alarmValue = if (rowsBean.alarmValue.toString().isBlank()) { + "未知" } else { - holder.alarmValueView.text = alarmValue + rowsBean.alarmValue } - holder.wellLocationView.text = rowsBean.position + holder.alarmValueView.text = String.format("告警值:$alarmValue") + holder.wellLocationView.text = String.format("井位置:${rowsBean.position}") holder.currentStateView.text = String.format("${rowsBean.jobStatusName}-${rowsBean.jobBelongTo}") diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt index cd52782..149adf2 100644 --- a/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt @@ -1,6 +1,8 @@ package com.casic.qd.smartwell.extensions +import android.content.Context import android.graphics.Color +import android.text.TextUtils import android.view.Gravity import android.widget.TextView import android.widget.Toast @@ -8,11 +10,16 @@ import com.casic.qd.smartwell.base.BaseApplication import com.casic.qd.smartwell.model.ErrorMessageModel import com.casic.qd.smartwell.utils.Constant +import com.casic.qd.smartwell.utils.FileUtils +import com.casic.qd.smartwell.utils.OnImageCompressListener import com.casic.qd.smartwell.utils.SaveKeyValues import com.google.gson.Gson import com.google.gson.reflect.TypeToken import com.qmuiteam.qmui.util.QMUIDisplayHelper import org.json.JSONObject +import top.zibin.luban.Luban +import top.zibin.luban.OnCompressListener +import java.io.File import java.text.ParseException import java.text.SimpleDateFormat import java.util.* @@ -108,8 +115,30 @@ fun String.combineImagePath(): String { if (this.isEmpty()) return this val defaultValue = SaveKeyValues.getValue( - Constant.DEFAULT_SERVER_CONFIG, - "http://111.198.10.15:11304" + Constant.DEFAULT_SERVER_CONFIG, Constant.SERVER_BASE_URL ) as String return "$defaultValue/static/${this.replace("\\", "/")}" +} + +fun String.compressImage(context: Context, listener: OnImageCompressListener) { + Luban.with(context) + .load(this) + .ignoreBy(100) + .setTargetDir(FileUtils.compressImageDir) + .filter { path -> + !(TextUtils.isEmpty(path) || path.lowercase(Locale.getDefault()).endsWith(".gif")) + } + .setCompressListener(object : OnCompressListener { + override fun onStart() { + + } + + override fun onSuccess(file: File) { + listener.onSuccess(file) + } + + override fun onError(e: Throwable) { + listener.onError(e) + } + }).launch() } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotProcessedFragment.kt b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotProcessedFragment.kt index 7605a10..a06c5a5 100644 --- a/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotProcessedFragment.kt +++ b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotProcessedFragment.kt @@ -111,53 +111,55 @@ private val callback = Handler.Callback { if (it.what == 2022061504) { - notProcessedAdapter.notifyDataSetChanged() - } else { - if (dataBeans.size == 0) { - emptyView!!.showEmptyPage("没有需要您处理的工单") { - pageIndex = 1 - obtainWorkOrderList() - } + if (isRefresh || isLoadMore) { + notProcessedAdapter.notifyDataSetChanged() } else { - emptyView!!.hide() - notProcessedAdapter = OrderNotProcessedAdapter(requireContext(), dataBeans) - notProcessedView!!.layoutManager = LinearLayoutManager(requireContext()) - notProcessedView!!.adapter = notProcessedAdapter - notProcessedAdapter.setOnItemClickListener(object : - OrderNotProcessedAdapter.OnItemClickListener { - override fun onClicked(position: Int) { - val jobId = dataBeans[position].jobId.toString() - if (jobId.isBlank()) { - "工单编号异常,无法查看详情".show() - return - } + if (dataBeans.size == 0) { + emptyView!!.showEmptyPage("没有需要您处理的工单") { + pageIndex = 1 + obtainWorkOrderList() + } + } else { + emptyView!!.hide() + notProcessedAdapter = OrderNotProcessedAdapter(requireContext(), dataBeans) + notProcessedView!!.layoutManager = LinearLayoutManager(requireContext()) + notProcessedView!!.adapter = notProcessedAdapter + notProcessedAdapter.setOnItemClickListener(object : + OrderNotProcessedAdapter.OnItemClickListener { + override fun onClicked(position: Int) { + val jobId = dataBeans[position].jobId.toString() + if (jobId.isBlank()) { + "工单编号异常,无法查看详情".show() + return + } // requireContext().navigatePageTo(jobId) - } + } - override fun onOperationClicked(position: Int) { - AlertControlDialog.Builder() - .setContext(requireContext()) - .setTitle("操作提示") - .setMessage("确定要接单吗") - .setNegativeButton("取消") - .setPositiveButton("确定") - .setOnDialogButtonClickListener(object : - AlertControlDialog.OnDialogButtonClickListener { - override fun onConfirmClick() { - val jobId = dataBeans[position].jobId.toString() - if (jobId.isBlank()) { - "工单ID异常,无法接单".show() - return + override fun onOperationClicked(position: Int) { + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("操作提示") + .setMessage("确定要接单吗") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + val jobId = dataBeans[position].jobId.toString() + if (jobId.isBlank()) { + "工单ID异常,无法接单".show() + return + } + operationViewModel.acceptOrder(jobId) } - operationViewModel.acceptOrder(jobId) - } - override fun onCancelClick() { + override fun onCancelClick() { - } - }).build().show() - } - }) + } + }).build().show() + } + }) + } } } true diff --git a/app/src/main/java/com/casic/qd/smartwell/model/SubordinateModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/SubordinateModel.kt new file mode 100644 index 0000000..3f2b287 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/model/SubordinateModel.kt @@ -0,0 +1,17 @@ +package com.casic.qd.smartwell.model + +class SubordinateModel { + var code = 0 + var data: List? = null + var message: String? = null + var isSuccess = false + + class DataBean { + var account: String? = null + var attr1: String? = null + var deptId: String? = null + var id: String? = null + var name: String? = null + var phone: String? = null + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt index 802ed6b..8b59d0d 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt @@ -8,7 +8,8 @@ val USER_PERMISSIONS = arrayOf( Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS, Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION, - Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE + Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE, + Manifest.permission.FOREGROUND_SERVICE ) const val PERMISSIONS_CODE = 999 @@ -36,6 +37,7 @@ R.color.color_7, R.color.color_8, R.color.color_9 ) + const val SERVER_BASE_URL = "http://111.198.10.15:20104" const val INTENT_PARAM = "intentParam" const val DEFAULT_SERVER_CONFIG = "defaultServerConfig" const val ACCOUNT = "account" diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/FileUtils.kt b/app/src/main/java/com/casic/qd/smartwell/utils/FileUtils.kt index 6b40d2e..c5743d3 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/FileUtils.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/FileUtils.kt @@ -7,9 +7,10 @@ object FileUtils { private val context = BaseApplication.obtainInstance() - val imageCompressPath: String + val compressImageDir: String get() { - val imageDir = File(context.getExternalFilesDir(Environment.DIRECTORY_PICTURES), "") + val imageDir = + File(context.getExternalFilesDir(Environment.DIRECTORY_PICTURES), "CompressImage") if (!imageDir.exists()) { imageDir.mkdir() } diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/OnImageCompressListener.kt b/app/src/main/java/com/casic/qd/smartwell/utils/OnImageCompressListener.kt new file mode 100644 index 0000000..53cbdb1 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/utils/OnImageCompressListener.kt @@ -0,0 +1,15 @@ +package com.casic.qd.smartwell.utils + +import java.io.File + +interface OnImageCompressListener { + /** + * Fired when a compression returns successfully, override to handle in your own code + */ + fun onSuccess(file: File) + + /** + * Fired when a compression fails to complete, override to handle in your own code + */ + fun onError(e: Throwable) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitFactory.kt b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitFactory.kt index 04579cf..2d9a4db 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitFactory.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitFactory.kt @@ -19,8 +19,7 @@ fun createRetrofit(clazz: Class): T { val defaultValue = SaveKeyValues.getValue( - Constant.DEFAULT_SERVER_CONFIG, - "http://111.198.10.15:20104" + Constant.DEFAULT_SERVER_CONFIG, Constant.SERVER_BASE_URL ) as String return Retrofit.Builder() .baseUrl(defaultValue) diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt index e20aa4e..a455056 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt @@ -352,4 +352,32 @@ @Header("token") token: String, @Part file: MultipartBody.Part ): String + + /** + * 查找同一单位下的用户 + * + * @param hasMine 是否包含本人,1包含, 0不包含 + * @param roleTips 角色类型,例:leader,member + */ + @FormUrlEncoded + @POST("/mgr/simplelist") + suspend fun obtainSubordinate( + @Header("token") token: String, + @Field("hasMine") hasMine: String?, + @Field("roleTips") roleTips: String? + ): String + + /** + * 转单 + * + * @param id 工单id + * @param transferPerson 转单人,转给谁 + */ + @FormUrlEncoded + @POST("/job/transferJob") + suspend fun transferWorkOrder( + @Header("token") token: String, + @Field("id") id: String, + @Field("transferPerson") transferPerson: String + ): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt index 8ce0fed..2de85eb 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt @@ -307,9 +307,7 @@ /** * 完成工单 */ - suspend fun completeOrder( - id: String, handleMessage: String, handlePhotos: String - ): String { + suspend fun completeOrder(id: String, handleMessage: String, handlePhotos: String): String { return api.completeOrder( AuthenticationHelper.token!!, id, handleMessage, handlePhotos ) @@ -323,4 +321,18 @@ val imagePart = MultipartBody.Part.createFormData("file", image.name, requestBody) return api.uploadImage(AuthenticationHelper.token!!, imagePart) } + + /** + * 查找同一单位下的用户 + */ + suspend fun obtainSubordinate(hasMine: String?, roleTips: String?): String { + return api.obtainSubordinate(AuthenticationHelper.token!!, hasMine, roleTips) + } + + /** + * 转单 + */ + suspend fun transferWorkOrder(id: String, userId: String): String { + return api.transferWorkOrder(AuthenticationHelper.token!!, id, userId) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/view/OrderCompletedDetailActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/OrderCompletedDetailActivity.kt index 227798b..5ce4b5c 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/OrderCompletedDetailActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/OrderCompletedDetailActivity.kt @@ -88,13 +88,13 @@ } //绑定窨井图片 - if (orderDetail.firstStatePhotos.toString().isBlank()) { + if (orderDetail.handlePhotos.toString().isBlank()) { imageRecyclerView.visibility = View.GONE } else { imageRecyclerView.visibility = View.VISIBLE //处理图片地址 val urls: ArrayList = ArrayList() - val imageArray = orderDetail.firstStatePhotos.toString().split(",") + val imageArray = orderDetail.handlePhotos.toString().split(",") imageArray.forEach { path -> if (path.isNotBlank()) { urls.add(path.combineImagePath()) diff --git a/app/build.gradle b/app/build.gradle index ea77e44..59e75eb 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -76,6 +76,8 @@ implementation 'com.github.bumptech.glide:glide:4.9.0' //图片选择框架 implementation 'io.github.lucksiege:pictureselector:v3.0.4' + //图片压缩 + implementation 'top.zibin:Luban:1.1.8' //高德地图 implementation 'com.amap.api:3dmap:7.9.1' //返回值转换器 diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index e361509..1e6c783 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -14,6 +14,7 @@ + diff --git a/app/src/main/java/com/casic/qd/smartwell/adapter/NineGridImageAdapter.kt b/app/src/main/java/com/casic/qd/smartwell/adapter/NineGridImageAdapter.kt index f07824e..e016832 100644 --- a/app/src/main/java/com/casic/qd/smartwell/adapter/NineGridImageAdapter.kt +++ b/app/src/main/java/com/casic/qd/smartwell/adapter/NineGridImageAdapter.kt @@ -30,9 +30,14 @@ } fun deleteImage(position: Int) { - if (imageData.size != 0) { - imageData.removeAt(position) - notifyDataSetChanged() + try { + if (imageData.size > position) { + imageData.removeAt(position) + notifyItemRemoved(position) + notifyItemRangeChanged(position, imageData.size) + } + } catch (e: Exception) { + e.printStackTrace() } } diff --git a/app/src/main/java/com/casic/qd/smartwell/adapter/OrderCompletedAdapter.kt b/app/src/main/java/com/casic/qd/smartwell/adapter/OrderCompletedAdapter.kt index f36c15d..6533b92 100644 --- a/app/src/main/java/com/casic/qd/smartwell/adapter/OrderCompletedAdapter.kt +++ b/app/src/main/java/com/casic/qd/smartwell/adapter/OrderCompletedAdapter.kt @@ -43,14 +43,14 @@ val rowsBean = dataRows[position] holder.alarmContentView.text = rowsBean.alarmContentName holder.createTimeView.text = rowsBean.createTime - holder.wellCodeView.text = rowsBean.wellCode - val alarmValue = rowsBean.alarmValue.toString() - if (alarmValue.isBlank()) { - holder.alarmValueView.text = "报警值未知" + holder.wellCodeView.text = String.format("井编号:${rowsBean.wellCode}") + val alarmValue = if (rowsBean.alarmValue.toString().isBlank()) { + "未知" } else { - holder.alarmValueView.text = alarmValue + rowsBean.alarmValue } - holder.wellLocationView.text = rowsBean.position + holder.alarmValueView.text = String.format("告警值:$alarmValue") + holder.wellLocationView.text = String.format("井位置:${rowsBean.position}") holder.currentStateView.text = String.format("${rowsBean.jobStatusName}-${rowsBean.jobBelongTo}") diff --git a/app/src/main/java/com/casic/qd/smartwell/adapter/OrderInHandleAdapter.kt b/app/src/main/java/com/casic/qd/smartwell/adapter/OrderInHandleAdapter.kt index a7fcfa8..74646d6 100644 --- a/app/src/main/java/com/casic/qd/smartwell/adapter/OrderInHandleAdapter.kt +++ b/app/src/main/java/com/casic/qd/smartwell/adapter/OrderInHandleAdapter.kt @@ -42,14 +42,14 @@ val rowsBean = dataRows[position] holder.alarmContentView.text = rowsBean.alarmContentName holder.createTimeView.text = rowsBean.createTime - holder.wellCodeView.text = rowsBean.wellCode - val alarmValue = rowsBean.alarmValue.toString() - if (alarmValue.isBlank()) { - holder.alarmValueView.text = "报警值未知" + holder.wellCodeView.text = String.format("井编号:${rowsBean.wellCode}") + val alarmValue = if (rowsBean.alarmValue.toString().isBlank()) { + "未知" } else { - holder.alarmValueView.text = alarmValue + rowsBean.alarmValue } - holder.wellLocationView.text = rowsBean.position + holder.alarmValueView.text = String.format("告警值:$alarmValue") + holder.wellLocationView.text = String.format("井位置:${rowsBean.position}") holder.currentStateView.text = String.format("${rowsBean.jobStatusName}-${rowsBean.jobBelongTo}") diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt index cd52782..149adf2 100644 --- a/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt @@ -1,6 +1,8 @@ package com.casic.qd.smartwell.extensions +import android.content.Context import android.graphics.Color +import android.text.TextUtils import android.view.Gravity import android.widget.TextView import android.widget.Toast @@ -8,11 +10,16 @@ import com.casic.qd.smartwell.base.BaseApplication import com.casic.qd.smartwell.model.ErrorMessageModel import com.casic.qd.smartwell.utils.Constant +import com.casic.qd.smartwell.utils.FileUtils +import com.casic.qd.smartwell.utils.OnImageCompressListener import com.casic.qd.smartwell.utils.SaveKeyValues import com.google.gson.Gson import com.google.gson.reflect.TypeToken import com.qmuiteam.qmui.util.QMUIDisplayHelper import org.json.JSONObject +import top.zibin.luban.Luban +import top.zibin.luban.OnCompressListener +import java.io.File import java.text.ParseException import java.text.SimpleDateFormat import java.util.* @@ -108,8 +115,30 @@ fun String.combineImagePath(): String { if (this.isEmpty()) return this val defaultValue = SaveKeyValues.getValue( - Constant.DEFAULT_SERVER_CONFIG, - "http://111.198.10.15:11304" + Constant.DEFAULT_SERVER_CONFIG, Constant.SERVER_BASE_URL ) as String return "$defaultValue/static/${this.replace("\\", "/")}" +} + +fun String.compressImage(context: Context, listener: OnImageCompressListener) { + Luban.with(context) + .load(this) + .ignoreBy(100) + .setTargetDir(FileUtils.compressImageDir) + .filter { path -> + !(TextUtils.isEmpty(path) || path.lowercase(Locale.getDefault()).endsWith(".gif")) + } + .setCompressListener(object : OnCompressListener { + override fun onStart() { + + } + + override fun onSuccess(file: File) { + listener.onSuccess(file) + } + + override fun onError(e: Throwable) { + listener.onError(e) + } + }).launch() } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotProcessedFragment.kt b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotProcessedFragment.kt index 7605a10..a06c5a5 100644 --- a/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotProcessedFragment.kt +++ b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotProcessedFragment.kt @@ -111,53 +111,55 @@ private val callback = Handler.Callback { if (it.what == 2022061504) { - notProcessedAdapter.notifyDataSetChanged() - } else { - if (dataBeans.size == 0) { - emptyView!!.showEmptyPage("没有需要您处理的工单") { - pageIndex = 1 - obtainWorkOrderList() - } + if (isRefresh || isLoadMore) { + notProcessedAdapter.notifyDataSetChanged() } else { - emptyView!!.hide() - notProcessedAdapter = OrderNotProcessedAdapter(requireContext(), dataBeans) - notProcessedView!!.layoutManager = LinearLayoutManager(requireContext()) - notProcessedView!!.adapter = notProcessedAdapter - notProcessedAdapter.setOnItemClickListener(object : - OrderNotProcessedAdapter.OnItemClickListener { - override fun onClicked(position: Int) { - val jobId = dataBeans[position].jobId.toString() - if (jobId.isBlank()) { - "工单编号异常,无法查看详情".show() - return - } + if (dataBeans.size == 0) { + emptyView!!.showEmptyPage("没有需要您处理的工单") { + pageIndex = 1 + obtainWorkOrderList() + } + } else { + emptyView!!.hide() + notProcessedAdapter = OrderNotProcessedAdapter(requireContext(), dataBeans) + notProcessedView!!.layoutManager = LinearLayoutManager(requireContext()) + notProcessedView!!.adapter = notProcessedAdapter + notProcessedAdapter.setOnItemClickListener(object : + OrderNotProcessedAdapter.OnItemClickListener { + override fun onClicked(position: Int) { + val jobId = dataBeans[position].jobId.toString() + if (jobId.isBlank()) { + "工单编号异常,无法查看详情".show() + return + } // requireContext().navigatePageTo(jobId) - } + } - override fun onOperationClicked(position: Int) { - AlertControlDialog.Builder() - .setContext(requireContext()) - .setTitle("操作提示") - .setMessage("确定要接单吗") - .setNegativeButton("取消") - .setPositiveButton("确定") - .setOnDialogButtonClickListener(object : - AlertControlDialog.OnDialogButtonClickListener { - override fun onConfirmClick() { - val jobId = dataBeans[position].jobId.toString() - if (jobId.isBlank()) { - "工单ID异常,无法接单".show() - return + override fun onOperationClicked(position: Int) { + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("操作提示") + .setMessage("确定要接单吗") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + val jobId = dataBeans[position].jobId.toString() + if (jobId.isBlank()) { + "工单ID异常,无法接单".show() + return + } + operationViewModel.acceptOrder(jobId) } - operationViewModel.acceptOrder(jobId) - } - override fun onCancelClick() { + override fun onCancelClick() { - } - }).build().show() - } - }) + } + }).build().show() + } + }) + } } } true diff --git a/app/src/main/java/com/casic/qd/smartwell/model/SubordinateModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/SubordinateModel.kt new file mode 100644 index 0000000..3f2b287 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/model/SubordinateModel.kt @@ -0,0 +1,17 @@ +package com.casic.qd.smartwell.model + +class SubordinateModel { + var code = 0 + var data: List? = null + var message: String? = null + var isSuccess = false + + class DataBean { + var account: String? = null + var attr1: String? = null + var deptId: String? = null + var id: String? = null + var name: String? = null + var phone: String? = null + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt index 802ed6b..8b59d0d 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt @@ -8,7 +8,8 @@ val USER_PERMISSIONS = arrayOf( Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS, Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION, - Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE + Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE, + Manifest.permission.FOREGROUND_SERVICE ) const val PERMISSIONS_CODE = 999 @@ -36,6 +37,7 @@ R.color.color_7, R.color.color_8, R.color.color_9 ) + const val SERVER_BASE_URL = "http://111.198.10.15:20104" const val INTENT_PARAM = "intentParam" const val DEFAULT_SERVER_CONFIG = "defaultServerConfig" const val ACCOUNT = "account" diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/FileUtils.kt b/app/src/main/java/com/casic/qd/smartwell/utils/FileUtils.kt index 6b40d2e..c5743d3 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/FileUtils.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/FileUtils.kt @@ -7,9 +7,10 @@ object FileUtils { private val context = BaseApplication.obtainInstance() - val imageCompressPath: String + val compressImageDir: String get() { - val imageDir = File(context.getExternalFilesDir(Environment.DIRECTORY_PICTURES), "") + val imageDir = + File(context.getExternalFilesDir(Environment.DIRECTORY_PICTURES), "CompressImage") if (!imageDir.exists()) { imageDir.mkdir() } diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/OnImageCompressListener.kt b/app/src/main/java/com/casic/qd/smartwell/utils/OnImageCompressListener.kt new file mode 100644 index 0000000..53cbdb1 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/utils/OnImageCompressListener.kt @@ -0,0 +1,15 @@ +package com.casic.qd.smartwell.utils + +import java.io.File + +interface OnImageCompressListener { + /** + * Fired when a compression returns successfully, override to handle in your own code + */ + fun onSuccess(file: File) + + /** + * Fired when a compression fails to complete, override to handle in your own code + */ + fun onError(e: Throwable) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitFactory.kt b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitFactory.kt index 04579cf..2d9a4db 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitFactory.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitFactory.kt @@ -19,8 +19,7 @@ fun createRetrofit(clazz: Class): T { val defaultValue = SaveKeyValues.getValue( - Constant.DEFAULT_SERVER_CONFIG, - "http://111.198.10.15:20104" + Constant.DEFAULT_SERVER_CONFIG, Constant.SERVER_BASE_URL ) as String return Retrofit.Builder() .baseUrl(defaultValue) diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt index e20aa4e..a455056 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt @@ -352,4 +352,32 @@ @Header("token") token: String, @Part file: MultipartBody.Part ): String + + /** + * 查找同一单位下的用户 + * + * @param hasMine 是否包含本人,1包含, 0不包含 + * @param roleTips 角色类型,例:leader,member + */ + @FormUrlEncoded + @POST("/mgr/simplelist") + suspend fun obtainSubordinate( + @Header("token") token: String, + @Field("hasMine") hasMine: String?, + @Field("roleTips") roleTips: String? + ): String + + /** + * 转单 + * + * @param id 工单id + * @param transferPerson 转单人,转给谁 + */ + @FormUrlEncoded + @POST("/job/transferJob") + suspend fun transferWorkOrder( + @Header("token") token: String, + @Field("id") id: String, + @Field("transferPerson") transferPerson: String + ): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt index 8ce0fed..2de85eb 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt @@ -307,9 +307,7 @@ /** * 完成工单 */ - suspend fun completeOrder( - id: String, handleMessage: String, handlePhotos: String - ): String { + suspend fun completeOrder(id: String, handleMessage: String, handlePhotos: String): String { return api.completeOrder( AuthenticationHelper.token!!, id, handleMessage, handlePhotos ) @@ -323,4 +321,18 @@ val imagePart = MultipartBody.Part.createFormData("file", image.name, requestBody) return api.uploadImage(AuthenticationHelper.token!!, imagePart) } + + /** + * 查找同一单位下的用户 + */ + suspend fun obtainSubordinate(hasMine: String?, roleTips: String?): String { + return api.obtainSubordinate(AuthenticationHelper.token!!, hasMine, roleTips) + } + + /** + * 转单 + */ + suspend fun transferWorkOrder(id: String, userId: String): String { + return api.transferWorkOrder(AuthenticationHelper.token!!, id, userId) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/view/OrderCompletedDetailActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/OrderCompletedDetailActivity.kt index 227798b..5ce4b5c 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/OrderCompletedDetailActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/OrderCompletedDetailActivity.kt @@ -88,13 +88,13 @@ } //绑定窨井图片 - if (orderDetail.firstStatePhotos.toString().isBlank()) { + if (orderDetail.handlePhotos.toString().isBlank()) { imageRecyclerView.visibility = View.GONE } else { imageRecyclerView.visibility = View.VISIBLE //处理图片地址 val urls: ArrayList = ArrayList() - val imageArray = orderDetail.firstStatePhotos.toString().split(",") + val imageArray = orderDetail.handlePhotos.toString().split(",") imageArray.forEach { path -> if (path.isNotBlank()) { urls.add(path.combineImagePath()) diff --git a/app/src/main/java/com/casic/qd/smartwell/view/OrderInHandleDetailActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/OrderInHandleDetailActivity.kt index 25f30c1..090003d 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/OrderInHandleDetailActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/OrderInHandleDetailActivity.kt @@ -1,8 +1,11 @@ package com.casic.qd.smartwell.view import android.content.Context +import android.os.CountDownTimer +import android.os.Handler import android.text.Editable import android.text.TextWatcher +import android.util.Log import android.view.View import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.GridLayoutManager @@ -12,9 +15,11 @@ import com.casic.qd.smartwell.base.BaseActivity import com.casic.qd.smartwell.extensions.* import com.casic.qd.smartwell.utils.* +import com.casic.qd.smartwell.vm.AuthenticateViewModel import com.casic.qd.smartwell.vm.OperationViewModel import com.casic.qd.smartwell.vm.UploadImageViewModel import com.casic.qd.smartwell.vm.WorkOrderViewModel +import com.casic.qd.smartwell.widgets.SingleChoiceDialog import com.casic.qd.smartwell.widgets.TimeLineBottomSheet import com.luck.picture.lib.basic.PictureSelector import com.luck.picture.lib.config.SelectMimeType @@ -31,12 +36,13 @@ class OrderInHandleDetailActivity : BaseActivity() { + private val kTag = "OrderInHandleDetailActivity" private lateinit var workOrderViewModel: WorkOrderViewModel private lateinit var uploadImageViewModel: UploadImageViewModel - - // private lateinit var userViewModel: UserViewModel + private lateinit var authenticateViewModel: AuthenticateViewModel private lateinit var operationViewModel: OperationViewModel private lateinit var imageAdapter: NineGridImageAdapter + private lateinit var weakReferenceHandler: WeakReferenceHandler private val context: Context = this@OrderInHandleDetailActivity private val imagePaths: ArrayList = ArrayList() //服务器返回的拍照数据集 private val realPaths: ArrayList = ArrayList() //真实图片路径 @@ -57,9 +63,11 @@ workOrderViewModel = ViewModelProvider(this).get(WorkOrderViewModel::class.java) uploadImageViewModel = ViewModelProvider(this).get(UploadImageViewModel::class.java) -// userViewModel = ViewModelProvider(this).get(UserViewModel::class.java) + authenticateViewModel = ViewModelProvider(this).get(AuthenticateViewModel::class.java) operationViewModel = ViewModelProvider(this).get(OperationViewModel::class.java) + weakReferenceHandler = WeakReferenceHandler(callback) + workOrderViewModel.obtainWorkOrderDetail(jobId) } @@ -164,7 +172,7 @@ confirmPersonView.text = orderDetail.confirmJobPerson - //维护情况 TODO 输入内容长度校验好像没用? + //TODO 维护情况 输入内容长度校验好像没用? sceneEditView.setText(orderDetail.handleMessage) confirmDateView.text = orderDetail.confirmJobTime @@ -186,53 +194,55 @@ transferTipsView.visibility = View.GONE } //转单 -// transferOrderButton.setChangeAlphaWhenPress(true) -// transferOrderButton.setOnClickListener { -// userViewModel.obtainSubordinate("0", "leader,member") -// } -// userViewModel.subordinateModel.observe(this, { subordinate -> -// if (subordinate.code == 200) { -// val roleArray: ArrayList = ArrayList() //下级流转人员集合 -// subordinate.data?.forEach { dataBean -> -// roleArray.add(dataBean.name.toString()) -// } -// SingleChoiceDialog.Builder() -// .setContext(this) -// .setChoiceItemTitles(roleArray) -// .setOnSingleChoiceClickListener(object : -// SingleChoiceDialog.OnSingleChoiceClickListener { -// override fun onItemClick(position: Int) { -// val personBean = subordinate.data!![position] -// AlertControlDialog.Builder() -// .setContext(context) -// .setTitle("操作提示") -// .setMessage("确定要转单吗") -// .setNegativeButton("取消") -// .setPositiveButton("确定") -// .setOnDialogButtonClickListener(object : -// AlertControlDialog.OnDialogButtonClickListener { -// override fun onConfirmClick() { -// val orderId = orderDetail.jobId.toString() -// if (orderId.isBlank()) { -// "工单ID异常,无法转单".show() -// return -// } -// operationViewModel.transferWorkOrder( -// id = orderId, userId = personBean.id!! -// ) -// } -// -// override fun onCancelClick() { -// -// } -// }).build().show() -// } -// }).build().show() -// } -// }) + transferOrderButton.setOnClickListener { + authenticateViewModel.obtainSubordinate("0", "leader,member") + } + authenticateViewModel.subordinateModel.observe(this, { subordinate -> + if (subordinate.code == 200) { + if (subordinate.data!!.isEmpty()) { + "无下级转单人员,无法转单".show() + } else { + val roleArray: ArrayList = ArrayList() //下级流转人员集合 + subordinate.data?.forEach { dataBean -> + roleArray.add(dataBean.name.toString()) + } + SingleChoiceDialog.Builder() + .setContext(this) + .setChoiceItemTitles(roleArray) + .setOnSingleChoiceClickListener(object : + SingleChoiceDialog.OnSingleChoiceClickListener { + override fun onItemClick(position: Int) { + val personBean = subordinate.data!![position] + AlertControlDialog.Builder() + .setContext(context) + .setTitle("操作提示") + .setMessage("确定要转单吗") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + val orderId = orderDetail.jobId.toString() + if (orderId.isBlank()) { + "工单ID异常,无法转单".show() + return + } + operationViewModel.transferWorkOrder( + orderId, personBean.id!! + ) + } + + override fun onCancelClick() { + + } + }).build().show() + } + }).build().show() + } + } + }) //提交工单处理 - submitButton.setChangeAlphaWhenPress(true) submitButton.setOnClickListener { val orderId = orderDetail.jobId.toString() if (orderId.isBlank()) { @@ -314,7 +324,7 @@ imagePaths.add(url) realPaths.add(url.combineImagePath()) } - imageAdapter.setupImage(images = realPaths) + imageAdapter.setupImage(realPaths) } else { "最多只能上传3张图片".show() } @@ -325,26 +335,26 @@ }) //转单状态处理 -// operationViewModel.loadState.observe(this, { -// when (it) { -// is LoadState.Loading -> { -// DialogHelper.showLoadingDialog(this, "转单中,请稍后") -// } -// is LoadState.Success -> { -// DialogHelper.dismissLoadingDialog() -// /** -// * 转单需要刷新处理中和超时未处理的列表 -// * */ + operationViewModel.loadState.observe(this, { + when (it) { + is LoadState.Loading -> { + DialogHelper.showLoadingDialog(this, "转单中,请稍后") + } + is LoadState.Success -> { + DialogHelper.dismissLoadingDialog() + /** + * 转单需要刷新处理中和超时未处理的列表 + * */ // BroadcastReceiverManager.instance.sendMultiBroadcast( // Constant.IN_HANDLE_ACTION, Constant.NOT_HANDLE_ACTION // ) -// this.finish() -// } -// else -> { -// DialogHelper.dismissLoadingDialog() -// } -// } -// }) + this.finish() + } + else -> { + DialogHelper.dismissLoadingDialog() + } + } + }) //处理完成工单状态处理 operationViewModel.loadState.observe(this, { @@ -380,9 +390,11 @@ .openCamera(SelectMimeType.ofImage()) .forResult(object : OnResultCallbackListener { override fun onResult(result: ArrayList?) { - val cameraResult = result?.get(0) - //上传图片 -// uploadImageViewModel.uploadImage(File(cameraResult)) + if (result == null) { + "拍照保存失败,请重试".show() + return + } + analyticalSelectResults(result[0]) } override fun onCancel() { @@ -393,15 +405,34 @@ 1 -> { PictureSelector.create(this) .openGallery(SelectMimeType.ofImage()) + .isGif(false) + .isMaxSelectEnabledMask(true) + .setFilterMinFileSize(100) + .setMaxSelectNum(3) + .isDisplayCamera(false) .setImageEngine(GlideLoadEngine.instance) .forResult(object : OnResultCallbackListener { override fun onResult(result: ArrayList?) { showLoadingDialog(context, "图片上传中,请稍后...") - result?.forEach { - val file = File(it.compressPath) - //上传图片 -// uploadImageViewModel.uploadImage(image = file) + if (result == null) { + "选择照片失败,请重试".show() + return } + // 线程控制图片压缩上传过程,防止速度过快导致压缩失败 + val sum = (result.size * 500).toLong() + object : CountDownTimer(sum, 500) { + override fun onTick(millisUntilFinished: Long) { + val i = millisUntilFinished / 500 + val message = weakReferenceHandler.obtainMessage() + message.obj = result[i.toInt()] + message.what = 2022061701 + weakReferenceHandler.handleMessage(message) + } + + override fun onFinish() { + + } + }.start() } override fun onCancel() { @@ -413,6 +444,37 @@ }.build().show() } + private val callback = Handler.Callback { + if (it.what == 2022061701) { + analyticalSelectResults(it.obj as LocalMedia) + } + true + } + + private fun analyticalSelectResults(result: LocalMedia) { + //压缩图片 +// val realPath = if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) { +// result.realPath +// } else { +// result.sandboxPath +// } +// Log.d(kTag, "初始路径:" + result.path) +// Log.d(kTag, "绝对路径:" + result.realPath) +// Log.d(kTag, "原图路径:" + result.originalPath) +// Log.d(kTag, "沙盒路径:" + result.sandboxPath) + result.realPath.compressImage(context, object : OnImageCompressListener { + override fun onSuccess(file: File) { + Log.d(kTag, "onSuccess: " + file.absolutePath) + //上传图片 + uploadImageViewModel.uploadImage(file) + } + + override fun onError(e: Throwable) { + e.printStackTrace() + } + }) + } + private var loadingDialog: QMUITipDialog? = null fun showLoadingDialog(context: Context?, message: String?) { diff --git a/app/build.gradle b/app/build.gradle index ea77e44..59e75eb 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -76,6 +76,8 @@ implementation 'com.github.bumptech.glide:glide:4.9.0' //图片选择框架 implementation 'io.github.lucksiege:pictureselector:v3.0.4' + //图片压缩 + implementation 'top.zibin:Luban:1.1.8' //高德地图 implementation 'com.amap.api:3dmap:7.9.1' //返回值转换器 diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index e361509..1e6c783 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -14,6 +14,7 @@ + diff --git a/app/src/main/java/com/casic/qd/smartwell/adapter/NineGridImageAdapter.kt b/app/src/main/java/com/casic/qd/smartwell/adapter/NineGridImageAdapter.kt index f07824e..e016832 100644 --- a/app/src/main/java/com/casic/qd/smartwell/adapter/NineGridImageAdapter.kt +++ b/app/src/main/java/com/casic/qd/smartwell/adapter/NineGridImageAdapter.kt @@ -30,9 +30,14 @@ } fun deleteImage(position: Int) { - if (imageData.size != 0) { - imageData.removeAt(position) - notifyDataSetChanged() + try { + if (imageData.size > position) { + imageData.removeAt(position) + notifyItemRemoved(position) + notifyItemRangeChanged(position, imageData.size) + } + } catch (e: Exception) { + e.printStackTrace() } } diff --git a/app/src/main/java/com/casic/qd/smartwell/adapter/OrderCompletedAdapter.kt b/app/src/main/java/com/casic/qd/smartwell/adapter/OrderCompletedAdapter.kt index f36c15d..6533b92 100644 --- a/app/src/main/java/com/casic/qd/smartwell/adapter/OrderCompletedAdapter.kt +++ b/app/src/main/java/com/casic/qd/smartwell/adapter/OrderCompletedAdapter.kt @@ -43,14 +43,14 @@ val rowsBean = dataRows[position] holder.alarmContentView.text = rowsBean.alarmContentName holder.createTimeView.text = rowsBean.createTime - holder.wellCodeView.text = rowsBean.wellCode - val alarmValue = rowsBean.alarmValue.toString() - if (alarmValue.isBlank()) { - holder.alarmValueView.text = "报警值未知" + holder.wellCodeView.text = String.format("井编号:${rowsBean.wellCode}") + val alarmValue = if (rowsBean.alarmValue.toString().isBlank()) { + "未知" } else { - holder.alarmValueView.text = alarmValue + rowsBean.alarmValue } - holder.wellLocationView.text = rowsBean.position + holder.alarmValueView.text = String.format("告警值:$alarmValue") + holder.wellLocationView.text = String.format("井位置:${rowsBean.position}") holder.currentStateView.text = String.format("${rowsBean.jobStatusName}-${rowsBean.jobBelongTo}") diff --git a/app/src/main/java/com/casic/qd/smartwell/adapter/OrderInHandleAdapter.kt b/app/src/main/java/com/casic/qd/smartwell/adapter/OrderInHandleAdapter.kt index a7fcfa8..74646d6 100644 --- a/app/src/main/java/com/casic/qd/smartwell/adapter/OrderInHandleAdapter.kt +++ b/app/src/main/java/com/casic/qd/smartwell/adapter/OrderInHandleAdapter.kt @@ -42,14 +42,14 @@ val rowsBean = dataRows[position] holder.alarmContentView.text = rowsBean.alarmContentName holder.createTimeView.text = rowsBean.createTime - holder.wellCodeView.text = rowsBean.wellCode - val alarmValue = rowsBean.alarmValue.toString() - if (alarmValue.isBlank()) { - holder.alarmValueView.text = "报警值未知" + holder.wellCodeView.text = String.format("井编号:${rowsBean.wellCode}") + val alarmValue = if (rowsBean.alarmValue.toString().isBlank()) { + "未知" } else { - holder.alarmValueView.text = alarmValue + rowsBean.alarmValue } - holder.wellLocationView.text = rowsBean.position + holder.alarmValueView.text = String.format("告警值:$alarmValue") + holder.wellLocationView.text = String.format("井位置:${rowsBean.position}") holder.currentStateView.text = String.format("${rowsBean.jobStatusName}-${rowsBean.jobBelongTo}") diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt index cd52782..149adf2 100644 --- a/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt @@ -1,6 +1,8 @@ package com.casic.qd.smartwell.extensions +import android.content.Context import android.graphics.Color +import android.text.TextUtils import android.view.Gravity import android.widget.TextView import android.widget.Toast @@ -8,11 +10,16 @@ import com.casic.qd.smartwell.base.BaseApplication import com.casic.qd.smartwell.model.ErrorMessageModel import com.casic.qd.smartwell.utils.Constant +import com.casic.qd.smartwell.utils.FileUtils +import com.casic.qd.smartwell.utils.OnImageCompressListener import com.casic.qd.smartwell.utils.SaveKeyValues import com.google.gson.Gson import com.google.gson.reflect.TypeToken import com.qmuiteam.qmui.util.QMUIDisplayHelper import org.json.JSONObject +import top.zibin.luban.Luban +import top.zibin.luban.OnCompressListener +import java.io.File import java.text.ParseException import java.text.SimpleDateFormat import java.util.* @@ -108,8 +115,30 @@ fun String.combineImagePath(): String { if (this.isEmpty()) return this val defaultValue = SaveKeyValues.getValue( - Constant.DEFAULT_SERVER_CONFIG, - "http://111.198.10.15:11304" + Constant.DEFAULT_SERVER_CONFIG, Constant.SERVER_BASE_URL ) as String return "$defaultValue/static/${this.replace("\\", "/")}" +} + +fun String.compressImage(context: Context, listener: OnImageCompressListener) { + Luban.with(context) + .load(this) + .ignoreBy(100) + .setTargetDir(FileUtils.compressImageDir) + .filter { path -> + !(TextUtils.isEmpty(path) || path.lowercase(Locale.getDefault()).endsWith(".gif")) + } + .setCompressListener(object : OnCompressListener { + override fun onStart() { + + } + + override fun onSuccess(file: File) { + listener.onSuccess(file) + } + + override fun onError(e: Throwable) { + listener.onError(e) + } + }).launch() } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotProcessedFragment.kt b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotProcessedFragment.kt index 7605a10..a06c5a5 100644 --- a/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotProcessedFragment.kt +++ b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotProcessedFragment.kt @@ -111,53 +111,55 @@ private val callback = Handler.Callback { if (it.what == 2022061504) { - notProcessedAdapter.notifyDataSetChanged() - } else { - if (dataBeans.size == 0) { - emptyView!!.showEmptyPage("没有需要您处理的工单") { - pageIndex = 1 - obtainWorkOrderList() - } + if (isRefresh || isLoadMore) { + notProcessedAdapter.notifyDataSetChanged() } else { - emptyView!!.hide() - notProcessedAdapter = OrderNotProcessedAdapter(requireContext(), dataBeans) - notProcessedView!!.layoutManager = LinearLayoutManager(requireContext()) - notProcessedView!!.adapter = notProcessedAdapter - notProcessedAdapter.setOnItemClickListener(object : - OrderNotProcessedAdapter.OnItemClickListener { - override fun onClicked(position: Int) { - val jobId = dataBeans[position].jobId.toString() - if (jobId.isBlank()) { - "工单编号异常,无法查看详情".show() - return - } + if (dataBeans.size == 0) { + emptyView!!.showEmptyPage("没有需要您处理的工单") { + pageIndex = 1 + obtainWorkOrderList() + } + } else { + emptyView!!.hide() + notProcessedAdapter = OrderNotProcessedAdapter(requireContext(), dataBeans) + notProcessedView!!.layoutManager = LinearLayoutManager(requireContext()) + notProcessedView!!.adapter = notProcessedAdapter + notProcessedAdapter.setOnItemClickListener(object : + OrderNotProcessedAdapter.OnItemClickListener { + override fun onClicked(position: Int) { + val jobId = dataBeans[position].jobId.toString() + if (jobId.isBlank()) { + "工单编号异常,无法查看详情".show() + return + } // requireContext().navigatePageTo(jobId) - } + } - override fun onOperationClicked(position: Int) { - AlertControlDialog.Builder() - .setContext(requireContext()) - .setTitle("操作提示") - .setMessage("确定要接单吗") - .setNegativeButton("取消") - .setPositiveButton("确定") - .setOnDialogButtonClickListener(object : - AlertControlDialog.OnDialogButtonClickListener { - override fun onConfirmClick() { - val jobId = dataBeans[position].jobId.toString() - if (jobId.isBlank()) { - "工单ID异常,无法接单".show() - return + override fun onOperationClicked(position: Int) { + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("操作提示") + .setMessage("确定要接单吗") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + val jobId = dataBeans[position].jobId.toString() + if (jobId.isBlank()) { + "工单ID异常,无法接单".show() + return + } + operationViewModel.acceptOrder(jobId) } - operationViewModel.acceptOrder(jobId) - } - override fun onCancelClick() { + override fun onCancelClick() { - } - }).build().show() - } - }) + } + }).build().show() + } + }) + } } } true diff --git a/app/src/main/java/com/casic/qd/smartwell/model/SubordinateModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/SubordinateModel.kt new file mode 100644 index 0000000..3f2b287 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/model/SubordinateModel.kt @@ -0,0 +1,17 @@ +package com.casic.qd.smartwell.model + +class SubordinateModel { + var code = 0 + var data: List? = null + var message: String? = null + var isSuccess = false + + class DataBean { + var account: String? = null + var attr1: String? = null + var deptId: String? = null + var id: String? = null + var name: String? = null + var phone: String? = null + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt index 802ed6b..8b59d0d 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt @@ -8,7 +8,8 @@ val USER_PERMISSIONS = arrayOf( Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS, Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION, - Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE + Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE, + Manifest.permission.FOREGROUND_SERVICE ) const val PERMISSIONS_CODE = 999 @@ -36,6 +37,7 @@ R.color.color_7, R.color.color_8, R.color.color_9 ) + const val SERVER_BASE_URL = "http://111.198.10.15:20104" const val INTENT_PARAM = "intentParam" const val DEFAULT_SERVER_CONFIG = "defaultServerConfig" const val ACCOUNT = "account" diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/FileUtils.kt b/app/src/main/java/com/casic/qd/smartwell/utils/FileUtils.kt index 6b40d2e..c5743d3 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/FileUtils.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/FileUtils.kt @@ -7,9 +7,10 @@ object FileUtils { private val context = BaseApplication.obtainInstance() - val imageCompressPath: String + val compressImageDir: String get() { - val imageDir = File(context.getExternalFilesDir(Environment.DIRECTORY_PICTURES), "") + val imageDir = + File(context.getExternalFilesDir(Environment.DIRECTORY_PICTURES), "CompressImage") if (!imageDir.exists()) { imageDir.mkdir() } diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/OnImageCompressListener.kt b/app/src/main/java/com/casic/qd/smartwell/utils/OnImageCompressListener.kt new file mode 100644 index 0000000..53cbdb1 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/utils/OnImageCompressListener.kt @@ -0,0 +1,15 @@ +package com.casic.qd.smartwell.utils + +import java.io.File + +interface OnImageCompressListener { + /** + * Fired when a compression returns successfully, override to handle in your own code + */ + fun onSuccess(file: File) + + /** + * Fired when a compression fails to complete, override to handle in your own code + */ + fun onError(e: Throwable) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitFactory.kt b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitFactory.kt index 04579cf..2d9a4db 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitFactory.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitFactory.kt @@ -19,8 +19,7 @@ fun createRetrofit(clazz: Class): T { val defaultValue = SaveKeyValues.getValue( - Constant.DEFAULT_SERVER_CONFIG, - "http://111.198.10.15:20104" + Constant.DEFAULT_SERVER_CONFIG, Constant.SERVER_BASE_URL ) as String return Retrofit.Builder() .baseUrl(defaultValue) diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt index e20aa4e..a455056 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt @@ -352,4 +352,32 @@ @Header("token") token: String, @Part file: MultipartBody.Part ): String + + /** + * 查找同一单位下的用户 + * + * @param hasMine 是否包含本人,1包含, 0不包含 + * @param roleTips 角色类型,例:leader,member + */ + @FormUrlEncoded + @POST("/mgr/simplelist") + suspend fun obtainSubordinate( + @Header("token") token: String, + @Field("hasMine") hasMine: String?, + @Field("roleTips") roleTips: String? + ): String + + /** + * 转单 + * + * @param id 工单id + * @param transferPerson 转单人,转给谁 + */ + @FormUrlEncoded + @POST("/job/transferJob") + suspend fun transferWorkOrder( + @Header("token") token: String, + @Field("id") id: String, + @Field("transferPerson") transferPerson: String + ): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt index 8ce0fed..2de85eb 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt @@ -307,9 +307,7 @@ /** * 完成工单 */ - suspend fun completeOrder( - id: String, handleMessage: String, handlePhotos: String - ): String { + suspend fun completeOrder(id: String, handleMessage: String, handlePhotos: String): String { return api.completeOrder( AuthenticationHelper.token!!, id, handleMessage, handlePhotos ) @@ -323,4 +321,18 @@ val imagePart = MultipartBody.Part.createFormData("file", image.name, requestBody) return api.uploadImage(AuthenticationHelper.token!!, imagePart) } + + /** + * 查找同一单位下的用户 + */ + suspend fun obtainSubordinate(hasMine: String?, roleTips: String?): String { + return api.obtainSubordinate(AuthenticationHelper.token!!, hasMine, roleTips) + } + + /** + * 转单 + */ + suspend fun transferWorkOrder(id: String, userId: String): String { + return api.transferWorkOrder(AuthenticationHelper.token!!, id, userId) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/view/OrderCompletedDetailActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/OrderCompletedDetailActivity.kt index 227798b..5ce4b5c 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/OrderCompletedDetailActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/OrderCompletedDetailActivity.kt @@ -88,13 +88,13 @@ } //绑定窨井图片 - if (orderDetail.firstStatePhotos.toString().isBlank()) { + if (orderDetail.handlePhotos.toString().isBlank()) { imageRecyclerView.visibility = View.GONE } else { imageRecyclerView.visibility = View.VISIBLE //处理图片地址 val urls: ArrayList = ArrayList() - val imageArray = orderDetail.firstStatePhotos.toString().split(",") + val imageArray = orderDetail.handlePhotos.toString().split(",") imageArray.forEach { path -> if (path.isNotBlank()) { urls.add(path.combineImagePath()) diff --git a/app/src/main/java/com/casic/qd/smartwell/view/OrderInHandleDetailActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/OrderInHandleDetailActivity.kt index 25f30c1..090003d 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/OrderInHandleDetailActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/OrderInHandleDetailActivity.kt @@ -1,8 +1,11 @@ package com.casic.qd.smartwell.view import android.content.Context +import android.os.CountDownTimer +import android.os.Handler import android.text.Editable import android.text.TextWatcher +import android.util.Log import android.view.View import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.GridLayoutManager @@ -12,9 +15,11 @@ import com.casic.qd.smartwell.base.BaseActivity import com.casic.qd.smartwell.extensions.* import com.casic.qd.smartwell.utils.* +import com.casic.qd.smartwell.vm.AuthenticateViewModel import com.casic.qd.smartwell.vm.OperationViewModel import com.casic.qd.smartwell.vm.UploadImageViewModel import com.casic.qd.smartwell.vm.WorkOrderViewModel +import com.casic.qd.smartwell.widgets.SingleChoiceDialog import com.casic.qd.smartwell.widgets.TimeLineBottomSheet import com.luck.picture.lib.basic.PictureSelector import com.luck.picture.lib.config.SelectMimeType @@ -31,12 +36,13 @@ class OrderInHandleDetailActivity : BaseActivity() { + private val kTag = "OrderInHandleDetailActivity" private lateinit var workOrderViewModel: WorkOrderViewModel private lateinit var uploadImageViewModel: UploadImageViewModel - - // private lateinit var userViewModel: UserViewModel + private lateinit var authenticateViewModel: AuthenticateViewModel private lateinit var operationViewModel: OperationViewModel private lateinit var imageAdapter: NineGridImageAdapter + private lateinit var weakReferenceHandler: WeakReferenceHandler private val context: Context = this@OrderInHandleDetailActivity private val imagePaths: ArrayList = ArrayList() //服务器返回的拍照数据集 private val realPaths: ArrayList = ArrayList() //真实图片路径 @@ -57,9 +63,11 @@ workOrderViewModel = ViewModelProvider(this).get(WorkOrderViewModel::class.java) uploadImageViewModel = ViewModelProvider(this).get(UploadImageViewModel::class.java) -// userViewModel = ViewModelProvider(this).get(UserViewModel::class.java) + authenticateViewModel = ViewModelProvider(this).get(AuthenticateViewModel::class.java) operationViewModel = ViewModelProvider(this).get(OperationViewModel::class.java) + weakReferenceHandler = WeakReferenceHandler(callback) + workOrderViewModel.obtainWorkOrderDetail(jobId) } @@ -164,7 +172,7 @@ confirmPersonView.text = orderDetail.confirmJobPerson - //维护情况 TODO 输入内容长度校验好像没用? + //TODO 维护情况 输入内容长度校验好像没用? sceneEditView.setText(orderDetail.handleMessage) confirmDateView.text = orderDetail.confirmJobTime @@ -186,53 +194,55 @@ transferTipsView.visibility = View.GONE } //转单 -// transferOrderButton.setChangeAlphaWhenPress(true) -// transferOrderButton.setOnClickListener { -// userViewModel.obtainSubordinate("0", "leader,member") -// } -// userViewModel.subordinateModel.observe(this, { subordinate -> -// if (subordinate.code == 200) { -// val roleArray: ArrayList = ArrayList() //下级流转人员集合 -// subordinate.data?.forEach { dataBean -> -// roleArray.add(dataBean.name.toString()) -// } -// SingleChoiceDialog.Builder() -// .setContext(this) -// .setChoiceItemTitles(roleArray) -// .setOnSingleChoiceClickListener(object : -// SingleChoiceDialog.OnSingleChoiceClickListener { -// override fun onItemClick(position: Int) { -// val personBean = subordinate.data!![position] -// AlertControlDialog.Builder() -// .setContext(context) -// .setTitle("操作提示") -// .setMessage("确定要转单吗") -// .setNegativeButton("取消") -// .setPositiveButton("确定") -// .setOnDialogButtonClickListener(object : -// AlertControlDialog.OnDialogButtonClickListener { -// override fun onConfirmClick() { -// val orderId = orderDetail.jobId.toString() -// if (orderId.isBlank()) { -// "工单ID异常,无法转单".show() -// return -// } -// operationViewModel.transferWorkOrder( -// id = orderId, userId = personBean.id!! -// ) -// } -// -// override fun onCancelClick() { -// -// } -// }).build().show() -// } -// }).build().show() -// } -// }) + transferOrderButton.setOnClickListener { + authenticateViewModel.obtainSubordinate("0", "leader,member") + } + authenticateViewModel.subordinateModel.observe(this, { subordinate -> + if (subordinate.code == 200) { + if (subordinate.data!!.isEmpty()) { + "无下级转单人员,无法转单".show() + } else { + val roleArray: ArrayList = ArrayList() //下级流转人员集合 + subordinate.data?.forEach { dataBean -> + roleArray.add(dataBean.name.toString()) + } + SingleChoiceDialog.Builder() + .setContext(this) + .setChoiceItemTitles(roleArray) + .setOnSingleChoiceClickListener(object : + SingleChoiceDialog.OnSingleChoiceClickListener { + override fun onItemClick(position: Int) { + val personBean = subordinate.data!![position] + AlertControlDialog.Builder() + .setContext(context) + .setTitle("操作提示") + .setMessage("确定要转单吗") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + val orderId = orderDetail.jobId.toString() + if (orderId.isBlank()) { + "工单ID异常,无法转单".show() + return + } + operationViewModel.transferWorkOrder( + orderId, personBean.id!! + ) + } + + override fun onCancelClick() { + + } + }).build().show() + } + }).build().show() + } + } + }) //提交工单处理 - submitButton.setChangeAlphaWhenPress(true) submitButton.setOnClickListener { val orderId = orderDetail.jobId.toString() if (orderId.isBlank()) { @@ -314,7 +324,7 @@ imagePaths.add(url) realPaths.add(url.combineImagePath()) } - imageAdapter.setupImage(images = realPaths) + imageAdapter.setupImage(realPaths) } else { "最多只能上传3张图片".show() } @@ -325,26 +335,26 @@ }) //转单状态处理 -// operationViewModel.loadState.observe(this, { -// when (it) { -// is LoadState.Loading -> { -// DialogHelper.showLoadingDialog(this, "转单中,请稍后") -// } -// is LoadState.Success -> { -// DialogHelper.dismissLoadingDialog() -// /** -// * 转单需要刷新处理中和超时未处理的列表 -// * */ + operationViewModel.loadState.observe(this, { + when (it) { + is LoadState.Loading -> { + DialogHelper.showLoadingDialog(this, "转单中,请稍后") + } + is LoadState.Success -> { + DialogHelper.dismissLoadingDialog() + /** + * 转单需要刷新处理中和超时未处理的列表 + * */ // BroadcastReceiverManager.instance.sendMultiBroadcast( // Constant.IN_HANDLE_ACTION, Constant.NOT_HANDLE_ACTION // ) -// this.finish() -// } -// else -> { -// DialogHelper.dismissLoadingDialog() -// } -// } -// }) + this.finish() + } + else -> { + DialogHelper.dismissLoadingDialog() + } + } + }) //处理完成工单状态处理 operationViewModel.loadState.observe(this, { @@ -380,9 +390,11 @@ .openCamera(SelectMimeType.ofImage()) .forResult(object : OnResultCallbackListener { override fun onResult(result: ArrayList?) { - val cameraResult = result?.get(0) - //上传图片 -// uploadImageViewModel.uploadImage(File(cameraResult)) + if (result == null) { + "拍照保存失败,请重试".show() + return + } + analyticalSelectResults(result[0]) } override fun onCancel() { @@ -393,15 +405,34 @@ 1 -> { PictureSelector.create(this) .openGallery(SelectMimeType.ofImage()) + .isGif(false) + .isMaxSelectEnabledMask(true) + .setFilterMinFileSize(100) + .setMaxSelectNum(3) + .isDisplayCamera(false) .setImageEngine(GlideLoadEngine.instance) .forResult(object : OnResultCallbackListener { override fun onResult(result: ArrayList?) { showLoadingDialog(context, "图片上传中,请稍后...") - result?.forEach { - val file = File(it.compressPath) - //上传图片 -// uploadImageViewModel.uploadImage(image = file) + if (result == null) { + "选择照片失败,请重试".show() + return } + // 线程控制图片压缩上传过程,防止速度过快导致压缩失败 + val sum = (result.size * 500).toLong() + object : CountDownTimer(sum, 500) { + override fun onTick(millisUntilFinished: Long) { + val i = millisUntilFinished / 500 + val message = weakReferenceHandler.obtainMessage() + message.obj = result[i.toInt()] + message.what = 2022061701 + weakReferenceHandler.handleMessage(message) + } + + override fun onFinish() { + + } + }.start() } override fun onCancel() { @@ -413,6 +444,37 @@ }.build().show() } + private val callback = Handler.Callback { + if (it.what == 2022061701) { + analyticalSelectResults(it.obj as LocalMedia) + } + true + } + + private fun analyticalSelectResults(result: LocalMedia) { + //压缩图片 +// val realPath = if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) { +// result.realPath +// } else { +// result.sandboxPath +// } +// Log.d(kTag, "初始路径:" + result.path) +// Log.d(kTag, "绝对路径:" + result.realPath) +// Log.d(kTag, "原图路径:" + result.originalPath) +// Log.d(kTag, "沙盒路径:" + result.sandboxPath) + result.realPath.compressImage(context, object : OnImageCompressListener { + override fun onSuccess(file: File) { + Log.d(kTag, "onSuccess: " + file.absolutePath) + //上传图片 + uploadImageViewModel.uploadImage(file) + } + + override fun onError(e: Throwable) { + e.printStackTrace() + } + }) + } + private var loadingDialog: QMUITipDialog? = null fun showLoadingDialog(context: Context?, message: String?) { diff --git a/app/src/main/java/com/casic/qd/smartwell/view/OrderSearchResultActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/OrderSearchResultActivity.kt index 659e64a..085ff5a 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/OrderSearchResultActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/OrderSearchResultActivity.kt @@ -193,7 +193,7 @@ "工单ID异常,无法接单".show() return } - operationViewModel.acceptWorkOrder(jobId) + operationViewModel.acceptOrder(jobId) } override fun onCancelClick() { diff --git a/app/build.gradle b/app/build.gradle index ea77e44..59e75eb 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -76,6 +76,8 @@ implementation 'com.github.bumptech.glide:glide:4.9.0' //图片选择框架 implementation 'io.github.lucksiege:pictureselector:v3.0.4' + //图片压缩 + implementation 'top.zibin:Luban:1.1.8' //高德地图 implementation 'com.amap.api:3dmap:7.9.1' //返回值转换器 diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index e361509..1e6c783 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -14,6 +14,7 @@ + diff --git a/app/src/main/java/com/casic/qd/smartwell/adapter/NineGridImageAdapter.kt b/app/src/main/java/com/casic/qd/smartwell/adapter/NineGridImageAdapter.kt index f07824e..e016832 100644 --- a/app/src/main/java/com/casic/qd/smartwell/adapter/NineGridImageAdapter.kt +++ b/app/src/main/java/com/casic/qd/smartwell/adapter/NineGridImageAdapter.kt @@ -30,9 +30,14 @@ } fun deleteImage(position: Int) { - if (imageData.size != 0) { - imageData.removeAt(position) - notifyDataSetChanged() + try { + if (imageData.size > position) { + imageData.removeAt(position) + notifyItemRemoved(position) + notifyItemRangeChanged(position, imageData.size) + } + } catch (e: Exception) { + e.printStackTrace() } } diff --git a/app/src/main/java/com/casic/qd/smartwell/adapter/OrderCompletedAdapter.kt b/app/src/main/java/com/casic/qd/smartwell/adapter/OrderCompletedAdapter.kt index f36c15d..6533b92 100644 --- a/app/src/main/java/com/casic/qd/smartwell/adapter/OrderCompletedAdapter.kt +++ b/app/src/main/java/com/casic/qd/smartwell/adapter/OrderCompletedAdapter.kt @@ -43,14 +43,14 @@ val rowsBean = dataRows[position] holder.alarmContentView.text = rowsBean.alarmContentName holder.createTimeView.text = rowsBean.createTime - holder.wellCodeView.text = rowsBean.wellCode - val alarmValue = rowsBean.alarmValue.toString() - if (alarmValue.isBlank()) { - holder.alarmValueView.text = "报警值未知" + holder.wellCodeView.text = String.format("井编号:${rowsBean.wellCode}") + val alarmValue = if (rowsBean.alarmValue.toString().isBlank()) { + "未知" } else { - holder.alarmValueView.text = alarmValue + rowsBean.alarmValue } - holder.wellLocationView.text = rowsBean.position + holder.alarmValueView.text = String.format("告警值:$alarmValue") + holder.wellLocationView.text = String.format("井位置:${rowsBean.position}") holder.currentStateView.text = String.format("${rowsBean.jobStatusName}-${rowsBean.jobBelongTo}") diff --git a/app/src/main/java/com/casic/qd/smartwell/adapter/OrderInHandleAdapter.kt b/app/src/main/java/com/casic/qd/smartwell/adapter/OrderInHandleAdapter.kt index a7fcfa8..74646d6 100644 --- a/app/src/main/java/com/casic/qd/smartwell/adapter/OrderInHandleAdapter.kt +++ b/app/src/main/java/com/casic/qd/smartwell/adapter/OrderInHandleAdapter.kt @@ -42,14 +42,14 @@ val rowsBean = dataRows[position] holder.alarmContentView.text = rowsBean.alarmContentName holder.createTimeView.text = rowsBean.createTime - holder.wellCodeView.text = rowsBean.wellCode - val alarmValue = rowsBean.alarmValue.toString() - if (alarmValue.isBlank()) { - holder.alarmValueView.text = "报警值未知" + holder.wellCodeView.text = String.format("井编号:${rowsBean.wellCode}") + val alarmValue = if (rowsBean.alarmValue.toString().isBlank()) { + "未知" } else { - holder.alarmValueView.text = alarmValue + rowsBean.alarmValue } - holder.wellLocationView.text = rowsBean.position + holder.alarmValueView.text = String.format("告警值:$alarmValue") + holder.wellLocationView.text = String.format("井位置:${rowsBean.position}") holder.currentStateView.text = String.format("${rowsBean.jobStatusName}-${rowsBean.jobBelongTo}") diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt index cd52782..149adf2 100644 --- a/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt @@ -1,6 +1,8 @@ package com.casic.qd.smartwell.extensions +import android.content.Context import android.graphics.Color +import android.text.TextUtils import android.view.Gravity import android.widget.TextView import android.widget.Toast @@ -8,11 +10,16 @@ import com.casic.qd.smartwell.base.BaseApplication import com.casic.qd.smartwell.model.ErrorMessageModel import com.casic.qd.smartwell.utils.Constant +import com.casic.qd.smartwell.utils.FileUtils +import com.casic.qd.smartwell.utils.OnImageCompressListener import com.casic.qd.smartwell.utils.SaveKeyValues import com.google.gson.Gson import com.google.gson.reflect.TypeToken import com.qmuiteam.qmui.util.QMUIDisplayHelper import org.json.JSONObject +import top.zibin.luban.Luban +import top.zibin.luban.OnCompressListener +import java.io.File import java.text.ParseException import java.text.SimpleDateFormat import java.util.* @@ -108,8 +115,30 @@ fun String.combineImagePath(): String { if (this.isEmpty()) return this val defaultValue = SaveKeyValues.getValue( - Constant.DEFAULT_SERVER_CONFIG, - "http://111.198.10.15:11304" + Constant.DEFAULT_SERVER_CONFIG, Constant.SERVER_BASE_URL ) as String return "$defaultValue/static/${this.replace("\\", "/")}" +} + +fun String.compressImage(context: Context, listener: OnImageCompressListener) { + Luban.with(context) + .load(this) + .ignoreBy(100) + .setTargetDir(FileUtils.compressImageDir) + .filter { path -> + !(TextUtils.isEmpty(path) || path.lowercase(Locale.getDefault()).endsWith(".gif")) + } + .setCompressListener(object : OnCompressListener { + override fun onStart() { + + } + + override fun onSuccess(file: File) { + listener.onSuccess(file) + } + + override fun onError(e: Throwable) { + listener.onError(e) + } + }).launch() } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotProcessedFragment.kt b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotProcessedFragment.kt index 7605a10..a06c5a5 100644 --- a/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotProcessedFragment.kt +++ b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotProcessedFragment.kt @@ -111,53 +111,55 @@ private val callback = Handler.Callback { if (it.what == 2022061504) { - notProcessedAdapter.notifyDataSetChanged() - } else { - if (dataBeans.size == 0) { - emptyView!!.showEmptyPage("没有需要您处理的工单") { - pageIndex = 1 - obtainWorkOrderList() - } + if (isRefresh || isLoadMore) { + notProcessedAdapter.notifyDataSetChanged() } else { - emptyView!!.hide() - notProcessedAdapter = OrderNotProcessedAdapter(requireContext(), dataBeans) - notProcessedView!!.layoutManager = LinearLayoutManager(requireContext()) - notProcessedView!!.adapter = notProcessedAdapter - notProcessedAdapter.setOnItemClickListener(object : - OrderNotProcessedAdapter.OnItemClickListener { - override fun onClicked(position: Int) { - val jobId = dataBeans[position].jobId.toString() - if (jobId.isBlank()) { - "工单编号异常,无法查看详情".show() - return - } + if (dataBeans.size == 0) { + emptyView!!.showEmptyPage("没有需要您处理的工单") { + pageIndex = 1 + obtainWorkOrderList() + } + } else { + emptyView!!.hide() + notProcessedAdapter = OrderNotProcessedAdapter(requireContext(), dataBeans) + notProcessedView!!.layoutManager = LinearLayoutManager(requireContext()) + notProcessedView!!.adapter = notProcessedAdapter + notProcessedAdapter.setOnItemClickListener(object : + OrderNotProcessedAdapter.OnItemClickListener { + override fun onClicked(position: Int) { + val jobId = dataBeans[position].jobId.toString() + if (jobId.isBlank()) { + "工单编号异常,无法查看详情".show() + return + } // requireContext().navigatePageTo(jobId) - } + } - override fun onOperationClicked(position: Int) { - AlertControlDialog.Builder() - .setContext(requireContext()) - .setTitle("操作提示") - .setMessage("确定要接单吗") - .setNegativeButton("取消") - .setPositiveButton("确定") - .setOnDialogButtonClickListener(object : - AlertControlDialog.OnDialogButtonClickListener { - override fun onConfirmClick() { - val jobId = dataBeans[position].jobId.toString() - if (jobId.isBlank()) { - "工单ID异常,无法接单".show() - return + override fun onOperationClicked(position: Int) { + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("操作提示") + .setMessage("确定要接单吗") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + val jobId = dataBeans[position].jobId.toString() + if (jobId.isBlank()) { + "工单ID异常,无法接单".show() + return + } + operationViewModel.acceptOrder(jobId) } - operationViewModel.acceptOrder(jobId) - } - override fun onCancelClick() { + override fun onCancelClick() { - } - }).build().show() - } - }) + } + }).build().show() + } + }) + } } } true diff --git a/app/src/main/java/com/casic/qd/smartwell/model/SubordinateModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/SubordinateModel.kt new file mode 100644 index 0000000..3f2b287 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/model/SubordinateModel.kt @@ -0,0 +1,17 @@ +package com.casic.qd.smartwell.model + +class SubordinateModel { + var code = 0 + var data: List? = null + var message: String? = null + var isSuccess = false + + class DataBean { + var account: String? = null + var attr1: String? = null + var deptId: String? = null + var id: String? = null + var name: String? = null + var phone: String? = null + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt index 802ed6b..8b59d0d 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt @@ -8,7 +8,8 @@ val USER_PERMISSIONS = arrayOf( Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS, Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION, - Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE + Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE, + Manifest.permission.FOREGROUND_SERVICE ) const val PERMISSIONS_CODE = 999 @@ -36,6 +37,7 @@ R.color.color_7, R.color.color_8, R.color.color_9 ) + const val SERVER_BASE_URL = "http://111.198.10.15:20104" const val INTENT_PARAM = "intentParam" const val DEFAULT_SERVER_CONFIG = "defaultServerConfig" const val ACCOUNT = "account" diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/FileUtils.kt b/app/src/main/java/com/casic/qd/smartwell/utils/FileUtils.kt index 6b40d2e..c5743d3 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/FileUtils.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/FileUtils.kt @@ -7,9 +7,10 @@ object FileUtils { private val context = BaseApplication.obtainInstance() - val imageCompressPath: String + val compressImageDir: String get() { - val imageDir = File(context.getExternalFilesDir(Environment.DIRECTORY_PICTURES), "") + val imageDir = + File(context.getExternalFilesDir(Environment.DIRECTORY_PICTURES), "CompressImage") if (!imageDir.exists()) { imageDir.mkdir() } diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/OnImageCompressListener.kt b/app/src/main/java/com/casic/qd/smartwell/utils/OnImageCompressListener.kt new file mode 100644 index 0000000..53cbdb1 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/utils/OnImageCompressListener.kt @@ -0,0 +1,15 @@ +package com.casic.qd.smartwell.utils + +import java.io.File + +interface OnImageCompressListener { + /** + * Fired when a compression returns successfully, override to handle in your own code + */ + fun onSuccess(file: File) + + /** + * Fired when a compression fails to complete, override to handle in your own code + */ + fun onError(e: Throwable) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitFactory.kt b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitFactory.kt index 04579cf..2d9a4db 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitFactory.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitFactory.kt @@ -19,8 +19,7 @@ fun createRetrofit(clazz: Class): T { val defaultValue = SaveKeyValues.getValue( - Constant.DEFAULT_SERVER_CONFIG, - "http://111.198.10.15:20104" + Constant.DEFAULT_SERVER_CONFIG, Constant.SERVER_BASE_URL ) as String return Retrofit.Builder() .baseUrl(defaultValue) diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt index e20aa4e..a455056 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt @@ -352,4 +352,32 @@ @Header("token") token: String, @Part file: MultipartBody.Part ): String + + /** + * 查找同一单位下的用户 + * + * @param hasMine 是否包含本人,1包含, 0不包含 + * @param roleTips 角色类型,例:leader,member + */ + @FormUrlEncoded + @POST("/mgr/simplelist") + suspend fun obtainSubordinate( + @Header("token") token: String, + @Field("hasMine") hasMine: String?, + @Field("roleTips") roleTips: String? + ): String + + /** + * 转单 + * + * @param id 工单id + * @param transferPerson 转单人,转给谁 + */ + @FormUrlEncoded + @POST("/job/transferJob") + suspend fun transferWorkOrder( + @Header("token") token: String, + @Field("id") id: String, + @Field("transferPerson") transferPerson: String + ): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt index 8ce0fed..2de85eb 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt @@ -307,9 +307,7 @@ /** * 完成工单 */ - suspend fun completeOrder( - id: String, handleMessage: String, handlePhotos: String - ): String { + suspend fun completeOrder(id: String, handleMessage: String, handlePhotos: String): String { return api.completeOrder( AuthenticationHelper.token!!, id, handleMessage, handlePhotos ) @@ -323,4 +321,18 @@ val imagePart = MultipartBody.Part.createFormData("file", image.name, requestBody) return api.uploadImage(AuthenticationHelper.token!!, imagePart) } + + /** + * 查找同一单位下的用户 + */ + suspend fun obtainSubordinate(hasMine: String?, roleTips: String?): String { + return api.obtainSubordinate(AuthenticationHelper.token!!, hasMine, roleTips) + } + + /** + * 转单 + */ + suspend fun transferWorkOrder(id: String, userId: String): String { + return api.transferWorkOrder(AuthenticationHelper.token!!, id, userId) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/view/OrderCompletedDetailActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/OrderCompletedDetailActivity.kt index 227798b..5ce4b5c 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/OrderCompletedDetailActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/OrderCompletedDetailActivity.kt @@ -88,13 +88,13 @@ } //绑定窨井图片 - if (orderDetail.firstStatePhotos.toString().isBlank()) { + if (orderDetail.handlePhotos.toString().isBlank()) { imageRecyclerView.visibility = View.GONE } else { imageRecyclerView.visibility = View.VISIBLE //处理图片地址 val urls: ArrayList = ArrayList() - val imageArray = orderDetail.firstStatePhotos.toString().split(",") + val imageArray = orderDetail.handlePhotos.toString().split(",") imageArray.forEach { path -> if (path.isNotBlank()) { urls.add(path.combineImagePath()) diff --git a/app/src/main/java/com/casic/qd/smartwell/view/OrderInHandleDetailActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/OrderInHandleDetailActivity.kt index 25f30c1..090003d 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/OrderInHandleDetailActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/OrderInHandleDetailActivity.kt @@ -1,8 +1,11 @@ package com.casic.qd.smartwell.view import android.content.Context +import android.os.CountDownTimer +import android.os.Handler import android.text.Editable import android.text.TextWatcher +import android.util.Log import android.view.View import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.GridLayoutManager @@ -12,9 +15,11 @@ import com.casic.qd.smartwell.base.BaseActivity import com.casic.qd.smartwell.extensions.* import com.casic.qd.smartwell.utils.* +import com.casic.qd.smartwell.vm.AuthenticateViewModel import com.casic.qd.smartwell.vm.OperationViewModel import com.casic.qd.smartwell.vm.UploadImageViewModel import com.casic.qd.smartwell.vm.WorkOrderViewModel +import com.casic.qd.smartwell.widgets.SingleChoiceDialog import com.casic.qd.smartwell.widgets.TimeLineBottomSheet import com.luck.picture.lib.basic.PictureSelector import com.luck.picture.lib.config.SelectMimeType @@ -31,12 +36,13 @@ class OrderInHandleDetailActivity : BaseActivity() { + private val kTag = "OrderInHandleDetailActivity" private lateinit var workOrderViewModel: WorkOrderViewModel private lateinit var uploadImageViewModel: UploadImageViewModel - - // private lateinit var userViewModel: UserViewModel + private lateinit var authenticateViewModel: AuthenticateViewModel private lateinit var operationViewModel: OperationViewModel private lateinit var imageAdapter: NineGridImageAdapter + private lateinit var weakReferenceHandler: WeakReferenceHandler private val context: Context = this@OrderInHandleDetailActivity private val imagePaths: ArrayList = ArrayList() //服务器返回的拍照数据集 private val realPaths: ArrayList = ArrayList() //真实图片路径 @@ -57,9 +63,11 @@ workOrderViewModel = ViewModelProvider(this).get(WorkOrderViewModel::class.java) uploadImageViewModel = ViewModelProvider(this).get(UploadImageViewModel::class.java) -// userViewModel = ViewModelProvider(this).get(UserViewModel::class.java) + authenticateViewModel = ViewModelProvider(this).get(AuthenticateViewModel::class.java) operationViewModel = ViewModelProvider(this).get(OperationViewModel::class.java) + weakReferenceHandler = WeakReferenceHandler(callback) + workOrderViewModel.obtainWorkOrderDetail(jobId) } @@ -164,7 +172,7 @@ confirmPersonView.text = orderDetail.confirmJobPerson - //维护情况 TODO 输入内容长度校验好像没用? + //TODO 维护情况 输入内容长度校验好像没用? sceneEditView.setText(orderDetail.handleMessage) confirmDateView.text = orderDetail.confirmJobTime @@ -186,53 +194,55 @@ transferTipsView.visibility = View.GONE } //转单 -// transferOrderButton.setChangeAlphaWhenPress(true) -// transferOrderButton.setOnClickListener { -// userViewModel.obtainSubordinate("0", "leader,member") -// } -// userViewModel.subordinateModel.observe(this, { subordinate -> -// if (subordinate.code == 200) { -// val roleArray: ArrayList = ArrayList() //下级流转人员集合 -// subordinate.data?.forEach { dataBean -> -// roleArray.add(dataBean.name.toString()) -// } -// SingleChoiceDialog.Builder() -// .setContext(this) -// .setChoiceItemTitles(roleArray) -// .setOnSingleChoiceClickListener(object : -// SingleChoiceDialog.OnSingleChoiceClickListener { -// override fun onItemClick(position: Int) { -// val personBean = subordinate.data!![position] -// AlertControlDialog.Builder() -// .setContext(context) -// .setTitle("操作提示") -// .setMessage("确定要转单吗") -// .setNegativeButton("取消") -// .setPositiveButton("确定") -// .setOnDialogButtonClickListener(object : -// AlertControlDialog.OnDialogButtonClickListener { -// override fun onConfirmClick() { -// val orderId = orderDetail.jobId.toString() -// if (orderId.isBlank()) { -// "工单ID异常,无法转单".show() -// return -// } -// operationViewModel.transferWorkOrder( -// id = orderId, userId = personBean.id!! -// ) -// } -// -// override fun onCancelClick() { -// -// } -// }).build().show() -// } -// }).build().show() -// } -// }) + transferOrderButton.setOnClickListener { + authenticateViewModel.obtainSubordinate("0", "leader,member") + } + authenticateViewModel.subordinateModel.observe(this, { subordinate -> + if (subordinate.code == 200) { + if (subordinate.data!!.isEmpty()) { + "无下级转单人员,无法转单".show() + } else { + val roleArray: ArrayList = ArrayList() //下级流转人员集合 + subordinate.data?.forEach { dataBean -> + roleArray.add(dataBean.name.toString()) + } + SingleChoiceDialog.Builder() + .setContext(this) + .setChoiceItemTitles(roleArray) + .setOnSingleChoiceClickListener(object : + SingleChoiceDialog.OnSingleChoiceClickListener { + override fun onItemClick(position: Int) { + val personBean = subordinate.data!![position] + AlertControlDialog.Builder() + .setContext(context) + .setTitle("操作提示") + .setMessage("确定要转单吗") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + val orderId = orderDetail.jobId.toString() + if (orderId.isBlank()) { + "工单ID异常,无法转单".show() + return + } + operationViewModel.transferWorkOrder( + orderId, personBean.id!! + ) + } + + override fun onCancelClick() { + + } + }).build().show() + } + }).build().show() + } + } + }) //提交工单处理 - submitButton.setChangeAlphaWhenPress(true) submitButton.setOnClickListener { val orderId = orderDetail.jobId.toString() if (orderId.isBlank()) { @@ -314,7 +324,7 @@ imagePaths.add(url) realPaths.add(url.combineImagePath()) } - imageAdapter.setupImage(images = realPaths) + imageAdapter.setupImage(realPaths) } else { "最多只能上传3张图片".show() } @@ -325,26 +335,26 @@ }) //转单状态处理 -// operationViewModel.loadState.observe(this, { -// when (it) { -// is LoadState.Loading -> { -// DialogHelper.showLoadingDialog(this, "转单中,请稍后") -// } -// is LoadState.Success -> { -// DialogHelper.dismissLoadingDialog() -// /** -// * 转单需要刷新处理中和超时未处理的列表 -// * */ + operationViewModel.loadState.observe(this, { + when (it) { + is LoadState.Loading -> { + DialogHelper.showLoadingDialog(this, "转单中,请稍后") + } + is LoadState.Success -> { + DialogHelper.dismissLoadingDialog() + /** + * 转单需要刷新处理中和超时未处理的列表 + * */ // BroadcastReceiverManager.instance.sendMultiBroadcast( // Constant.IN_HANDLE_ACTION, Constant.NOT_HANDLE_ACTION // ) -// this.finish() -// } -// else -> { -// DialogHelper.dismissLoadingDialog() -// } -// } -// }) + this.finish() + } + else -> { + DialogHelper.dismissLoadingDialog() + } + } + }) //处理完成工单状态处理 operationViewModel.loadState.observe(this, { @@ -380,9 +390,11 @@ .openCamera(SelectMimeType.ofImage()) .forResult(object : OnResultCallbackListener { override fun onResult(result: ArrayList?) { - val cameraResult = result?.get(0) - //上传图片 -// uploadImageViewModel.uploadImage(File(cameraResult)) + if (result == null) { + "拍照保存失败,请重试".show() + return + } + analyticalSelectResults(result[0]) } override fun onCancel() { @@ -393,15 +405,34 @@ 1 -> { PictureSelector.create(this) .openGallery(SelectMimeType.ofImage()) + .isGif(false) + .isMaxSelectEnabledMask(true) + .setFilterMinFileSize(100) + .setMaxSelectNum(3) + .isDisplayCamera(false) .setImageEngine(GlideLoadEngine.instance) .forResult(object : OnResultCallbackListener { override fun onResult(result: ArrayList?) { showLoadingDialog(context, "图片上传中,请稍后...") - result?.forEach { - val file = File(it.compressPath) - //上传图片 -// uploadImageViewModel.uploadImage(image = file) + if (result == null) { + "选择照片失败,请重试".show() + return } + // 线程控制图片压缩上传过程,防止速度过快导致压缩失败 + val sum = (result.size * 500).toLong() + object : CountDownTimer(sum, 500) { + override fun onTick(millisUntilFinished: Long) { + val i = millisUntilFinished / 500 + val message = weakReferenceHandler.obtainMessage() + message.obj = result[i.toInt()] + message.what = 2022061701 + weakReferenceHandler.handleMessage(message) + } + + override fun onFinish() { + + } + }.start() } override fun onCancel() { @@ -413,6 +444,37 @@ }.build().show() } + private val callback = Handler.Callback { + if (it.what == 2022061701) { + analyticalSelectResults(it.obj as LocalMedia) + } + true + } + + private fun analyticalSelectResults(result: LocalMedia) { + //压缩图片 +// val realPath = if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) { +// result.realPath +// } else { +// result.sandboxPath +// } +// Log.d(kTag, "初始路径:" + result.path) +// Log.d(kTag, "绝对路径:" + result.realPath) +// Log.d(kTag, "原图路径:" + result.originalPath) +// Log.d(kTag, "沙盒路径:" + result.sandboxPath) + result.realPath.compressImage(context, object : OnImageCompressListener { + override fun onSuccess(file: File) { + Log.d(kTag, "onSuccess: " + file.absolutePath) + //上传图片 + uploadImageViewModel.uploadImage(file) + } + + override fun onError(e: Throwable) { + e.printStackTrace() + } + }) + } + private var loadingDialog: QMUITipDialog? = null fun showLoadingDialog(context: Context?, message: String?) { diff --git a/app/src/main/java/com/casic/qd/smartwell/view/OrderSearchResultActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/OrderSearchResultActivity.kt index 659e64a..085ff5a 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/OrderSearchResultActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/OrderSearchResultActivity.kt @@ -193,7 +193,7 @@ "工单ID异常,无法接单".show() return } - operationViewModel.acceptWorkOrder(jobId) + operationViewModel.acceptOrder(jobId) } override fun onCancelClick() { diff --git a/app/src/main/java/com/casic/qd/smartwell/vm/AuthenticateViewModel.kt b/app/src/main/java/com/casic/qd/smartwell/vm/AuthenticateViewModel.kt index 3aaa8a7..a416f02 100644 --- a/app/src/main/java/com/casic/qd/smartwell/vm/AuthenticateViewModel.kt +++ b/app/src/main/java/com/casic/qd/smartwell/vm/AuthenticateViewModel.kt @@ -5,6 +5,7 @@ import com.casic.qd.smartwell.extensions.* import com.casic.qd.smartwell.model.OwnerShipModel import com.casic.qd.smartwell.model.PublicKeyModel +import com.casic.qd.smartwell.model.SubordinateModel import com.casic.qd.smartwell.utils.Constant import com.casic.qd.smartwell.utils.LoadState import com.casic.qd.smartwell.utils.SaveKeyValues @@ -18,6 +19,7 @@ private val gson = Gson() val keyModel = MutableLiveData() val resultModel = MutableLiveData() + val subordinateModel = MutableLiveData() fun obtainPublicKey() = launch({ loadState.value = LoadState.Loading @@ -62,4 +64,21 @@ }, { it.printStackTrace() }) + + /** + * 转单下一级人员 + * */ + fun obtainSubordinate(hasMine: String?, roleTips: String?) = launch({ + val response = RetrofitServiceManager.obtainSubordinate(hasMine, roleTips) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + subordinateModel.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 ea77e44..59e75eb 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -76,6 +76,8 @@ implementation 'com.github.bumptech.glide:glide:4.9.0' //图片选择框架 implementation 'io.github.lucksiege:pictureselector:v3.0.4' + //图片压缩 + implementation 'top.zibin:Luban:1.1.8' //高德地图 implementation 'com.amap.api:3dmap:7.9.1' //返回值转换器 diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index e361509..1e6c783 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -14,6 +14,7 @@ + diff --git a/app/src/main/java/com/casic/qd/smartwell/adapter/NineGridImageAdapter.kt b/app/src/main/java/com/casic/qd/smartwell/adapter/NineGridImageAdapter.kt index f07824e..e016832 100644 --- a/app/src/main/java/com/casic/qd/smartwell/adapter/NineGridImageAdapter.kt +++ b/app/src/main/java/com/casic/qd/smartwell/adapter/NineGridImageAdapter.kt @@ -30,9 +30,14 @@ } fun deleteImage(position: Int) { - if (imageData.size != 0) { - imageData.removeAt(position) - notifyDataSetChanged() + try { + if (imageData.size > position) { + imageData.removeAt(position) + notifyItemRemoved(position) + notifyItemRangeChanged(position, imageData.size) + } + } catch (e: Exception) { + e.printStackTrace() } } diff --git a/app/src/main/java/com/casic/qd/smartwell/adapter/OrderCompletedAdapter.kt b/app/src/main/java/com/casic/qd/smartwell/adapter/OrderCompletedAdapter.kt index f36c15d..6533b92 100644 --- a/app/src/main/java/com/casic/qd/smartwell/adapter/OrderCompletedAdapter.kt +++ b/app/src/main/java/com/casic/qd/smartwell/adapter/OrderCompletedAdapter.kt @@ -43,14 +43,14 @@ val rowsBean = dataRows[position] holder.alarmContentView.text = rowsBean.alarmContentName holder.createTimeView.text = rowsBean.createTime - holder.wellCodeView.text = rowsBean.wellCode - val alarmValue = rowsBean.alarmValue.toString() - if (alarmValue.isBlank()) { - holder.alarmValueView.text = "报警值未知" + holder.wellCodeView.text = String.format("井编号:${rowsBean.wellCode}") + val alarmValue = if (rowsBean.alarmValue.toString().isBlank()) { + "未知" } else { - holder.alarmValueView.text = alarmValue + rowsBean.alarmValue } - holder.wellLocationView.text = rowsBean.position + holder.alarmValueView.text = String.format("告警值:$alarmValue") + holder.wellLocationView.text = String.format("井位置:${rowsBean.position}") holder.currentStateView.text = String.format("${rowsBean.jobStatusName}-${rowsBean.jobBelongTo}") diff --git a/app/src/main/java/com/casic/qd/smartwell/adapter/OrderInHandleAdapter.kt b/app/src/main/java/com/casic/qd/smartwell/adapter/OrderInHandleAdapter.kt index a7fcfa8..74646d6 100644 --- a/app/src/main/java/com/casic/qd/smartwell/adapter/OrderInHandleAdapter.kt +++ b/app/src/main/java/com/casic/qd/smartwell/adapter/OrderInHandleAdapter.kt @@ -42,14 +42,14 @@ val rowsBean = dataRows[position] holder.alarmContentView.text = rowsBean.alarmContentName holder.createTimeView.text = rowsBean.createTime - holder.wellCodeView.text = rowsBean.wellCode - val alarmValue = rowsBean.alarmValue.toString() - if (alarmValue.isBlank()) { - holder.alarmValueView.text = "报警值未知" + holder.wellCodeView.text = String.format("井编号:${rowsBean.wellCode}") + val alarmValue = if (rowsBean.alarmValue.toString().isBlank()) { + "未知" } else { - holder.alarmValueView.text = alarmValue + rowsBean.alarmValue } - holder.wellLocationView.text = rowsBean.position + holder.alarmValueView.text = String.format("告警值:$alarmValue") + holder.wellLocationView.text = String.format("井位置:${rowsBean.position}") holder.currentStateView.text = String.format("${rowsBean.jobStatusName}-${rowsBean.jobBelongTo}") diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt index cd52782..149adf2 100644 --- a/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt @@ -1,6 +1,8 @@ package com.casic.qd.smartwell.extensions +import android.content.Context import android.graphics.Color +import android.text.TextUtils import android.view.Gravity import android.widget.TextView import android.widget.Toast @@ -8,11 +10,16 @@ import com.casic.qd.smartwell.base.BaseApplication import com.casic.qd.smartwell.model.ErrorMessageModel import com.casic.qd.smartwell.utils.Constant +import com.casic.qd.smartwell.utils.FileUtils +import com.casic.qd.smartwell.utils.OnImageCompressListener import com.casic.qd.smartwell.utils.SaveKeyValues import com.google.gson.Gson import com.google.gson.reflect.TypeToken import com.qmuiteam.qmui.util.QMUIDisplayHelper import org.json.JSONObject +import top.zibin.luban.Luban +import top.zibin.luban.OnCompressListener +import java.io.File import java.text.ParseException import java.text.SimpleDateFormat import java.util.* @@ -108,8 +115,30 @@ fun String.combineImagePath(): String { if (this.isEmpty()) return this val defaultValue = SaveKeyValues.getValue( - Constant.DEFAULT_SERVER_CONFIG, - "http://111.198.10.15:11304" + Constant.DEFAULT_SERVER_CONFIG, Constant.SERVER_BASE_URL ) as String return "$defaultValue/static/${this.replace("\\", "/")}" +} + +fun String.compressImage(context: Context, listener: OnImageCompressListener) { + Luban.with(context) + .load(this) + .ignoreBy(100) + .setTargetDir(FileUtils.compressImageDir) + .filter { path -> + !(TextUtils.isEmpty(path) || path.lowercase(Locale.getDefault()).endsWith(".gif")) + } + .setCompressListener(object : OnCompressListener { + override fun onStart() { + + } + + override fun onSuccess(file: File) { + listener.onSuccess(file) + } + + override fun onError(e: Throwable) { + listener.onError(e) + } + }).launch() } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotProcessedFragment.kt b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotProcessedFragment.kt index 7605a10..a06c5a5 100644 --- a/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotProcessedFragment.kt +++ b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotProcessedFragment.kt @@ -111,53 +111,55 @@ private val callback = Handler.Callback { if (it.what == 2022061504) { - notProcessedAdapter.notifyDataSetChanged() - } else { - if (dataBeans.size == 0) { - emptyView!!.showEmptyPage("没有需要您处理的工单") { - pageIndex = 1 - obtainWorkOrderList() - } + if (isRefresh || isLoadMore) { + notProcessedAdapter.notifyDataSetChanged() } else { - emptyView!!.hide() - notProcessedAdapter = OrderNotProcessedAdapter(requireContext(), dataBeans) - notProcessedView!!.layoutManager = LinearLayoutManager(requireContext()) - notProcessedView!!.adapter = notProcessedAdapter - notProcessedAdapter.setOnItemClickListener(object : - OrderNotProcessedAdapter.OnItemClickListener { - override fun onClicked(position: Int) { - val jobId = dataBeans[position].jobId.toString() - if (jobId.isBlank()) { - "工单编号异常,无法查看详情".show() - return - } + if (dataBeans.size == 0) { + emptyView!!.showEmptyPage("没有需要您处理的工单") { + pageIndex = 1 + obtainWorkOrderList() + } + } else { + emptyView!!.hide() + notProcessedAdapter = OrderNotProcessedAdapter(requireContext(), dataBeans) + notProcessedView!!.layoutManager = LinearLayoutManager(requireContext()) + notProcessedView!!.adapter = notProcessedAdapter + notProcessedAdapter.setOnItemClickListener(object : + OrderNotProcessedAdapter.OnItemClickListener { + override fun onClicked(position: Int) { + val jobId = dataBeans[position].jobId.toString() + if (jobId.isBlank()) { + "工单编号异常,无法查看详情".show() + return + } // requireContext().navigatePageTo(jobId) - } + } - override fun onOperationClicked(position: Int) { - AlertControlDialog.Builder() - .setContext(requireContext()) - .setTitle("操作提示") - .setMessage("确定要接单吗") - .setNegativeButton("取消") - .setPositiveButton("确定") - .setOnDialogButtonClickListener(object : - AlertControlDialog.OnDialogButtonClickListener { - override fun onConfirmClick() { - val jobId = dataBeans[position].jobId.toString() - if (jobId.isBlank()) { - "工单ID异常,无法接单".show() - return + override fun onOperationClicked(position: Int) { + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("操作提示") + .setMessage("确定要接单吗") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + val jobId = dataBeans[position].jobId.toString() + if (jobId.isBlank()) { + "工单ID异常,无法接单".show() + return + } + operationViewModel.acceptOrder(jobId) } - operationViewModel.acceptOrder(jobId) - } - override fun onCancelClick() { + override fun onCancelClick() { - } - }).build().show() - } - }) + } + }).build().show() + } + }) + } } } true diff --git a/app/src/main/java/com/casic/qd/smartwell/model/SubordinateModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/SubordinateModel.kt new file mode 100644 index 0000000..3f2b287 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/model/SubordinateModel.kt @@ -0,0 +1,17 @@ +package com.casic.qd.smartwell.model + +class SubordinateModel { + var code = 0 + var data: List? = null + var message: String? = null + var isSuccess = false + + class DataBean { + var account: String? = null + var attr1: String? = null + var deptId: String? = null + var id: String? = null + var name: String? = null + var phone: String? = null + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt index 802ed6b..8b59d0d 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt @@ -8,7 +8,8 @@ val USER_PERMISSIONS = arrayOf( Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS, Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION, - Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE + Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE, + Manifest.permission.FOREGROUND_SERVICE ) const val PERMISSIONS_CODE = 999 @@ -36,6 +37,7 @@ R.color.color_7, R.color.color_8, R.color.color_9 ) + const val SERVER_BASE_URL = "http://111.198.10.15:20104" const val INTENT_PARAM = "intentParam" const val DEFAULT_SERVER_CONFIG = "defaultServerConfig" const val ACCOUNT = "account" diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/FileUtils.kt b/app/src/main/java/com/casic/qd/smartwell/utils/FileUtils.kt index 6b40d2e..c5743d3 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/FileUtils.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/FileUtils.kt @@ -7,9 +7,10 @@ object FileUtils { private val context = BaseApplication.obtainInstance() - val imageCompressPath: String + val compressImageDir: String get() { - val imageDir = File(context.getExternalFilesDir(Environment.DIRECTORY_PICTURES), "") + val imageDir = + File(context.getExternalFilesDir(Environment.DIRECTORY_PICTURES), "CompressImage") if (!imageDir.exists()) { imageDir.mkdir() } diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/OnImageCompressListener.kt b/app/src/main/java/com/casic/qd/smartwell/utils/OnImageCompressListener.kt new file mode 100644 index 0000000..53cbdb1 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/utils/OnImageCompressListener.kt @@ -0,0 +1,15 @@ +package com.casic.qd.smartwell.utils + +import java.io.File + +interface OnImageCompressListener { + /** + * Fired when a compression returns successfully, override to handle in your own code + */ + fun onSuccess(file: File) + + /** + * Fired when a compression fails to complete, override to handle in your own code + */ + fun onError(e: Throwable) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitFactory.kt b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitFactory.kt index 04579cf..2d9a4db 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitFactory.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitFactory.kt @@ -19,8 +19,7 @@ fun createRetrofit(clazz: Class): T { val defaultValue = SaveKeyValues.getValue( - Constant.DEFAULT_SERVER_CONFIG, - "http://111.198.10.15:20104" + Constant.DEFAULT_SERVER_CONFIG, Constant.SERVER_BASE_URL ) as String return Retrofit.Builder() .baseUrl(defaultValue) diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt index e20aa4e..a455056 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt @@ -352,4 +352,32 @@ @Header("token") token: String, @Part file: MultipartBody.Part ): String + + /** + * 查找同一单位下的用户 + * + * @param hasMine 是否包含本人,1包含, 0不包含 + * @param roleTips 角色类型,例:leader,member + */ + @FormUrlEncoded + @POST("/mgr/simplelist") + suspend fun obtainSubordinate( + @Header("token") token: String, + @Field("hasMine") hasMine: String?, + @Field("roleTips") roleTips: String? + ): String + + /** + * 转单 + * + * @param id 工单id + * @param transferPerson 转单人,转给谁 + */ + @FormUrlEncoded + @POST("/job/transferJob") + suspend fun transferWorkOrder( + @Header("token") token: String, + @Field("id") id: String, + @Field("transferPerson") transferPerson: String + ): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt index 8ce0fed..2de85eb 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt @@ -307,9 +307,7 @@ /** * 完成工单 */ - suspend fun completeOrder( - id: String, handleMessage: String, handlePhotos: String - ): String { + suspend fun completeOrder(id: String, handleMessage: String, handlePhotos: String): String { return api.completeOrder( AuthenticationHelper.token!!, id, handleMessage, handlePhotos ) @@ -323,4 +321,18 @@ val imagePart = MultipartBody.Part.createFormData("file", image.name, requestBody) return api.uploadImage(AuthenticationHelper.token!!, imagePart) } + + /** + * 查找同一单位下的用户 + */ + suspend fun obtainSubordinate(hasMine: String?, roleTips: String?): String { + return api.obtainSubordinate(AuthenticationHelper.token!!, hasMine, roleTips) + } + + /** + * 转单 + */ + suspend fun transferWorkOrder(id: String, userId: String): String { + return api.transferWorkOrder(AuthenticationHelper.token!!, id, userId) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/view/OrderCompletedDetailActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/OrderCompletedDetailActivity.kt index 227798b..5ce4b5c 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/OrderCompletedDetailActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/OrderCompletedDetailActivity.kt @@ -88,13 +88,13 @@ } //绑定窨井图片 - if (orderDetail.firstStatePhotos.toString().isBlank()) { + if (orderDetail.handlePhotos.toString().isBlank()) { imageRecyclerView.visibility = View.GONE } else { imageRecyclerView.visibility = View.VISIBLE //处理图片地址 val urls: ArrayList = ArrayList() - val imageArray = orderDetail.firstStatePhotos.toString().split(",") + val imageArray = orderDetail.handlePhotos.toString().split(",") imageArray.forEach { path -> if (path.isNotBlank()) { urls.add(path.combineImagePath()) diff --git a/app/src/main/java/com/casic/qd/smartwell/view/OrderInHandleDetailActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/OrderInHandleDetailActivity.kt index 25f30c1..090003d 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/OrderInHandleDetailActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/OrderInHandleDetailActivity.kt @@ -1,8 +1,11 @@ package com.casic.qd.smartwell.view import android.content.Context +import android.os.CountDownTimer +import android.os.Handler import android.text.Editable import android.text.TextWatcher +import android.util.Log import android.view.View import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.GridLayoutManager @@ -12,9 +15,11 @@ import com.casic.qd.smartwell.base.BaseActivity import com.casic.qd.smartwell.extensions.* import com.casic.qd.smartwell.utils.* +import com.casic.qd.smartwell.vm.AuthenticateViewModel import com.casic.qd.smartwell.vm.OperationViewModel import com.casic.qd.smartwell.vm.UploadImageViewModel import com.casic.qd.smartwell.vm.WorkOrderViewModel +import com.casic.qd.smartwell.widgets.SingleChoiceDialog import com.casic.qd.smartwell.widgets.TimeLineBottomSheet import com.luck.picture.lib.basic.PictureSelector import com.luck.picture.lib.config.SelectMimeType @@ -31,12 +36,13 @@ class OrderInHandleDetailActivity : BaseActivity() { + private val kTag = "OrderInHandleDetailActivity" private lateinit var workOrderViewModel: WorkOrderViewModel private lateinit var uploadImageViewModel: UploadImageViewModel - - // private lateinit var userViewModel: UserViewModel + private lateinit var authenticateViewModel: AuthenticateViewModel private lateinit var operationViewModel: OperationViewModel private lateinit var imageAdapter: NineGridImageAdapter + private lateinit var weakReferenceHandler: WeakReferenceHandler private val context: Context = this@OrderInHandleDetailActivity private val imagePaths: ArrayList = ArrayList() //服务器返回的拍照数据集 private val realPaths: ArrayList = ArrayList() //真实图片路径 @@ -57,9 +63,11 @@ workOrderViewModel = ViewModelProvider(this).get(WorkOrderViewModel::class.java) uploadImageViewModel = ViewModelProvider(this).get(UploadImageViewModel::class.java) -// userViewModel = ViewModelProvider(this).get(UserViewModel::class.java) + authenticateViewModel = ViewModelProvider(this).get(AuthenticateViewModel::class.java) operationViewModel = ViewModelProvider(this).get(OperationViewModel::class.java) + weakReferenceHandler = WeakReferenceHandler(callback) + workOrderViewModel.obtainWorkOrderDetail(jobId) } @@ -164,7 +172,7 @@ confirmPersonView.text = orderDetail.confirmJobPerson - //维护情况 TODO 输入内容长度校验好像没用? + //TODO 维护情况 输入内容长度校验好像没用? sceneEditView.setText(orderDetail.handleMessage) confirmDateView.text = orderDetail.confirmJobTime @@ -186,53 +194,55 @@ transferTipsView.visibility = View.GONE } //转单 -// transferOrderButton.setChangeAlphaWhenPress(true) -// transferOrderButton.setOnClickListener { -// userViewModel.obtainSubordinate("0", "leader,member") -// } -// userViewModel.subordinateModel.observe(this, { subordinate -> -// if (subordinate.code == 200) { -// val roleArray: ArrayList = ArrayList() //下级流转人员集合 -// subordinate.data?.forEach { dataBean -> -// roleArray.add(dataBean.name.toString()) -// } -// SingleChoiceDialog.Builder() -// .setContext(this) -// .setChoiceItemTitles(roleArray) -// .setOnSingleChoiceClickListener(object : -// SingleChoiceDialog.OnSingleChoiceClickListener { -// override fun onItemClick(position: Int) { -// val personBean = subordinate.data!![position] -// AlertControlDialog.Builder() -// .setContext(context) -// .setTitle("操作提示") -// .setMessage("确定要转单吗") -// .setNegativeButton("取消") -// .setPositiveButton("确定") -// .setOnDialogButtonClickListener(object : -// AlertControlDialog.OnDialogButtonClickListener { -// override fun onConfirmClick() { -// val orderId = orderDetail.jobId.toString() -// if (orderId.isBlank()) { -// "工单ID异常,无法转单".show() -// return -// } -// operationViewModel.transferWorkOrder( -// id = orderId, userId = personBean.id!! -// ) -// } -// -// override fun onCancelClick() { -// -// } -// }).build().show() -// } -// }).build().show() -// } -// }) + transferOrderButton.setOnClickListener { + authenticateViewModel.obtainSubordinate("0", "leader,member") + } + authenticateViewModel.subordinateModel.observe(this, { subordinate -> + if (subordinate.code == 200) { + if (subordinate.data!!.isEmpty()) { + "无下级转单人员,无法转单".show() + } else { + val roleArray: ArrayList = ArrayList() //下级流转人员集合 + subordinate.data?.forEach { dataBean -> + roleArray.add(dataBean.name.toString()) + } + SingleChoiceDialog.Builder() + .setContext(this) + .setChoiceItemTitles(roleArray) + .setOnSingleChoiceClickListener(object : + SingleChoiceDialog.OnSingleChoiceClickListener { + override fun onItemClick(position: Int) { + val personBean = subordinate.data!![position] + AlertControlDialog.Builder() + .setContext(context) + .setTitle("操作提示") + .setMessage("确定要转单吗") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + val orderId = orderDetail.jobId.toString() + if (orderId.isBlank()) { + "工单ID异常,无法转单".show() + return + } + operationViewModel.transferWorkOrder( + orderId, personBean.id!! + ) + } + + override fun onCancelClick() { + + } + }).build().show() + } + }).build().show() + } + } + }) //提交工单处理 - submitButton.setChangeAlphaWhenPress(true) submitButton.setOnClickListener { val orderId = orderDetail.jobId.toString() if (orderId.isBlank()) { @@ -314,7 +324,7 @@ imagePaths.add(url) realPaths.add(url.combineImagePath()) } - imageAdapter.setupImage(images = realPaths) + imageAdapter.setupImage(realPaths) } else { "最多只能上传3张图片".show() } @@ -325,26 +335,26 @@ }) //转单状态处理 -// operationViewModel.loadState.observe(this, { -// when (it) { -// is LoadState.Loading -> { -// DialogHelper.showLoadingDialog(this, "转单中,请稍后") -// } -// is LoadState.Success -> { -// DialogHelper.dismissLoadingDialog() -// /** -// * 转单需要刷新处理中和超时未处理的列表 -// * */ + operationViewModel.loadState.observe(this, { + when (it) { + is LoadState.Loading -> { + DialogHelper.showLoadingDialog(this, "转单中,请稍后") + } + is LoadState.Success -> { + DialogHelper.dismissLoadingDialog() + /** + * 转单需要刷新处理中和超时未处理的列表 + * */ // BroadcastReceiverManager.instance.sendMultiBroadcast( // Constant.IN_HANDLE_ACTION, Constant.NOT_HANDLE_ACTION // ) -// this.finish() -// } -// else -> { -// DialogHelper.dismissLoadingDialog() -// } -// } -// }) + this.finish() + } + else -> { + DialogHelper.dismissLoadingDialog() + } + } + }) //处理完成工单状态处理 operationViewModel.loadState.observe(this, { @@ -380,9 +390,11 @@ .openCamera(SelectMimeType.ofImage()) .forResult(object : OnResultCallbackListener { override fun onResult(result: ArrayList?) { - val cameraResult = result?.get(0) - //上传图片 -// uploadImageViewModel.uploadImage(File(cameraResult)) + if (result == null) { + "拍照保存失败,请重试".show() + return + } + analyticalSelectResults(result[0]) } override fun onCancel() { @@ -393,15 +405,34 @@ 1 -> { PictureSelector.create(this) .openGallery(SelectMimeType.ofImage()) + .isGif(false) + .isMaxSelectEnabledMask(true) + .setFilterMinFileSize(100) + .setMaxSelectNum(3) + .isDisplayCamera(false) .setImageEngine(GlideLoadEngine.instance) .forResult(object : OnResultCallbackListener { override fun onResult(result: ArrayList?) { showLoadingDialog(context, "图片上传中,请稍后...") - result?.forEach { - val file = File(it.compressPath) - //上传图片 -// uploadImageViewModel.uploadImage(image = file) + if (result == null) { + "选择照片失败,请重试".show() + return } + // 线程控制图片压缩上传过程,防止速度过快导致压缩失败 + val sum = (result.size * 500).toLong() + object : CountDownTimer(sum, 500) { + override fun onTick(millisUntilFinished: Long) { + val i = millisUntilFinished / 500 + val message = weakReferenceHandler.obtainMessage() + message.obj = result[i.toInt()] + message.what = 2022061701 + weakReferenceHandler.handleMessage(message) + } + + override fun onFinish() { + + } + }.start() } override fun onCancel() { @@ -413,6 +444,37 @@ }.build().show() } + private val callback = Handler.Callback { + if (it.what == 2022061701) { + analyticalSelectResults(it.obj as LocalMedia) + } + true + } + + private fun analyticalSelectResults(result: LocalMedia) { + //压缩图片 +// val realPath = if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) { +// result.realPath +// } else { +// result.sandboxPath +// } +// Log.d(kTag, "初始路径:" + result.path) +// Log.d(kTag, "绝对路径:" + result.realPath) +// Log.d(kTag, "原图路径:" + result.originalPath) +// Log.d(kTag, "沙盒路径:" + result.sandboxPath) + result.realPath.compressImage(context, object : OnImageCompressListener { + override fun onSuccess(file: File) { + Log.d(kTag, "onSuccess: " + file.absolutePath) + //上传图片 + uploadImageViewModel.uploadImage(file) + } + + override fun onError(e: Throwable) { + e.printStackTrace() + } + }) + } + private var loadingDialog: QMUITipDialog? = null fun showLoadingDialog(context: Context?, message: String?) { diff --git a/app/src/main/java/com/casic/qd/smartwell/view/OrderSearchResultActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/OrderSearchResultActivity.kt index 659e64a..085ff5a 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/OrderSearchResultActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/OrderSearchResultActivity.kt @@ -193,7 +193,7 @@ "工单ID异常,无法接单".show() return } - operationViewModel.acceptWorkOrder(jobId) + operationViewModel.acceptOrder(jobId) } override fun onCancelClick() { diff --git a/app/src/main/java/com/casic/qd/smartwell/vm/AuthenticateViewModel.kt b/app/src/main/java/com/casic/qd/smartwell/vm/AuthenticateViewModel.kt index 3aaa8a7..a416f02 100644 --- a/app/src/main/java/com/casic/qd/smartwell/vm/AuthenticateViewModel.kt +++ b/app/src/main/java/com/casic/qd/smartwell/vm/AuthenticateViewModel.kt @@ -5,6 +5,7 @@ import com.casic.qd.smartwell.extensions.* import com.casic.qd.smartwell.model.OwnerShipModel import com.casic.qd.smartwell.model.PublicKeyModel +import com.casic.qd.smartwell.model.SubordinateModel import com.casic.qd.smartwell.utils.Constant import com.casic.qd.smartwell.utils.LoadState import com.casic.qd.smartwell.utils.SaveKeyValues @@ -18,6 +19,7 @@ private val gson = Gson() val keyModel = MutableLiveData() val resultModel = MutableLiveData() + val subordinateModel = MutableLiveData() fun obtainPublicKey() = launch({ loadState.value = LoadState.Loading @@ -62,4 +64,21 @@ }, { it.printStackTrace() }) + + /** + * 转单下一级人员 + * */ + fun obtainSubordinate(hasMine: String?, roleTips: String?) = launch({ + val response = RetrofitServiceManager.obtainSubordinate(hasMine, roleTips) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + subordinateModel.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/qd/smartwell/vm/OperationViewModel.kt b/app/src/main/java/com/casic/qd/smartwell/vm/OperationViewModel.kt index 03fe6e6..ca8de57 100644 --- a/app/src/main/java/com/casic/qd/smartwell/vm/OperationViewModel.kt +++ b/app/src/main/java/com/casic/qd/smartwell/vm/OperationViewModel.kt @@ -49,21 +49,21 @@ // it.printStackTrace() // }) // -// fun transferWorkOrder(id: String, userId: String) = launch({ -// loadState.value = LoadState.Loading -// val response = RetrofitServiceManager.transferWorkOrder(id, userId) -// val responseCode = response.separateResponseCode() -// if (responseCode == 200) { -// loadState.value = LoadState.Success -// "转单成功".show() -// } else { -// loadState.value = LoadState.Fail -// response.toErrorMessage().show() -// } -// }, { -// loadState.value = LoadState.Fail -// it.printStackTrace() -// }) +fun transferWorkOrder(id: String, userId: String) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.transferWorkOrder(id, userId) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + "转单成功".show() + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show() + } +}, { + loadState.value = LoadState.Fail + it.printStackTrace() +}) fun completeOrder(id: String, handleMessage: String, handlePhotos: String) = launch({ loadState.value = LoadState.Loading diff --git a/app/build.gradle b/app/build.gradle index ea77e44..59e75eb 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -76,6 +76,8 @@ implementation 'com.github.bumptech.glide:glide:4.9.0' //图片选择框架 implementation 'io.github.lucksiege:pictureselector:v3.0.4' + //图片压缩 + implementation 'top.zibin:Luban:1.1.8' //高德地图 implementation 'com.amap.api:3dmap:7.9.1' //返回值转换器 diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index e361509..1e6c783 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -14,6 +14,7 @@ + diff --git a/app/src/main/java/com/casic/qd/smartwell/adapter/NineGridImageAdapter.kt b/app/src/main/java/com/casic/qd/smartwell/adapter/NineGridImageAdapter.kt index f07824e..e016832 100644 --- a/app/src/main/java/com/casic/qd/smartwell/adapter/NineGridImageAdapter.kt +++ b/app/src/main/java/com/casic/qd/smartwell/adapter/NineGridImageAdapter.kt @@ -30,9 +30,14 @@ } fun deleteImage(position: Int) { - if (imageData.size != 0) { - imageData.removeAt(position) - notifyDataSetChanged() + try { + if (imageData.size > position) { + imageData.removeAt(position) + notifyItemRemoved(position) + notifyItemRangeChanged(position, imageData.size) + } + } catch (e: Exception) { + e.printStackTrace() } } diff --git a/app/src/main/java/com/casic/qd/smartwell/adapter/OrderCompletedAdapter.kt b/app/src/main/java/com/casic/qd/smartwell/adapter/OrderCompletedAdapter.kt index f36c15d..6533b92 100644 --- a/app/src/main/java/com/casic/qd/smartwell/adapter/OrderCompletedAdapter.kt +++ b/app/src/main/java/com/casic/qd/smartwell/adapter/OrderCompletedAdapter.kt @@ -43,14 +43,14 @@ val rowsBean = dataRows[position] holder.alarmContentView.text = rowsBean.alarmContentName holder.createTimeView.text = rowsBean.createTime - holder.wellCodeView.text = rowsBean.wellCode - val alarmValue = rowsBean.alarmValue.toString() - if (alarmValue.isBlank()) { - holder.alarmValueView.text = "报警值未知" + holder.wellCodeView.text = String.format("井编号:${rowsBean.wellCode}") + val alarmValue = if (rowsBean.alarmValue.toString().isBlank()) { + "未知" } else { - holder.alarmValueView.text = alarmValue + rowsBean.alarmValue } - holder.wellLocationView.text = rowsBean.position + holder.alarmValueView.text = String.format("告警值:$alarmValue") + holder.wellLocationView.text = String.format("井位置:${rowsBean.position}") holder.currentStateView.text = String.format("${rowsBean.jobStatusName}-${rowsBean.jobBelongTo}") diff --git a/app/src/main/java/com/casic/qd/smartwell/adapter/OrderInHandleAdapter.kt b/app/src/main/java/com/casic/qd/smartwell/adapter/OrderInHandleAdapter.kt index a7fcfa8..74646d6 100644 --- a/app/src/main/java/com/casic/qd/smartwell/adapter/OrderInHandleAdapter.kt +++ b/app/src/main/java/com/casic/qd/smartwell/adapter/OrderInHandleAdapter.kt @@ -42,14 +42,14 @@ val rowsBean = dataRows[position] holder.alarmContentView.text = rowsBean.alarmContentName holder.createTimeView.text = rowsBean.createTime - holder.wellCodeView.text = rowsBean.wellCode - val alarmValue = rowsBean.alarmValue.toString() - if (alarmValue.isBlank()) { - holder.alarmValueView.text = "报警值未知" + holder.wellCodeView.text = String.format("井编号:${rowsBean.wellCode}") + val alarmValue = if (rowsBean.alarmValue.toString().isBlank()) { + "未知" } else { - holder.alarmValueView.text = alarmValue + rowsBean.alarmValue } - holder.wellLocationView.text = rowsBean.position + holder.alarmValueView.text = String.format("告警值:$alarmValue") + holder.wellLocationView.text = String.format("井位置:${rowsBean.position}") holder.currentStateView.text = String.format("${rowsBean.jobStatusName}-${rowsBean.jobBelongTo}") diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt index cd52782..149adf2 100644 --- a/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt @@ -1,6 +1,8 @@ package com.casic.qd.smartwell.extensions +import android.content.Context import android.graphics.Color +import android.text.TextUtils import android.view.Gravity import android.widget.TextView import android.widget.Toast @@ -8,11 +10,16 @@ import com.casic.qd.smartwell.base.BaseApplication import com.casic.qd.smartwell.model.ErrorMessageModel import com.casic.qd.smartwell.utils.Constant +import com.casic.qd.smartwell.utils.FileUtils +import com.casic.qd.smartwell.utils.OnImageCompressListener import com.casic.qd.smartwell.utils.SaveKeyValues import com.google.gson.Gson import com.google.gson.reflect.TypeToken import com.qmuiteam.qmui.util.QMUIDisplayHelper import org.json.JSONObject +import top.zibin.luban.Luban +import top.zibin.luban.OnCompressListener +import java.io.File import java.text.ParseException import java.text.SimpleDateFormat import java.util.* @@ -108,8 +115,30 @@ fun String.combineImagePath(): String { if (this.isEmpty()) return this val defaultValue = SaveKeyValues.getValue( - Constant.DEFAULT_SERVER_CONFIG, - "http://111.198.10.15:11304" + Constant.DEFAULT_SERVER_CONFIG, Constant.SERVER_BASE_URL ) as String return "$defaultValue/static/${this.replace("\\", "/")}" +} + +fun String.compressImage(context: Context, listener: OnImageCompressListener) { + Luban.with(context) + .load(this) + .ignoreBy(100) + .setTargetDir(FileUtils.compressImageDir) + .filter { path -> + !(TextUtils.isEmpty(path) || path.lowercase(Locale.getDefault()).endsWith(".gif")) + } + .setCompressListener(object : OnCompressListener { + override fun onStart() { + + } + + override fun onSuccess(file: File) { + listener.onSuccess(file) + } + + override fun onError(e: Throwable) { + listener.onError(e) + } + }).launch() } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotProcessedFragment.kt b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotProcessedFragment.kt index 7605a10..a06c5a5 100644 --- a/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotProcessedFragment.kt +++ b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotProcessedFragment.kt @@ -111,53 +111,55 @@ private val callback = Handler.Callback { if (it.what == 2022061504) { - notProcessedAdapter.notifyDataSetChanged() - } else { - if (dataBeans.size == 0) { - emptyView!!.showEmptyPage("没有需要您处理的工单") { - pageIndex = 1 - obtainWorkOrderList() - } + if (isRefresh || isLoadMore) { + notProcessedAdapter.notifyDataSetChanged() } else { - emptyView!!.hide() - notProcessedAdapter = OrderNotProcessedAdapter(requireContext(), dataBeans) - notProcessedView!!.layoutManager = LinearLayoutManager(requireContext()) - notProcessedView!!.adapter = notProcessedAdapter - notProcessedAdapter.setOnItemClickListener(object : - OrderNotProcessedAdapter.OnItemClickListener { - override fun onClicked(position: Int) { - val jobId = dataBeans[position].jobId.toString() - if (jobId.isBlank()) { - "工单编号异常,无法查看详情".show() - return - } + if (dataBeans.size == 0) { + emptyView!!.showEmptyPage("没有需要您处理的工单") { + pageIndex = 1 + obtainWorkOrderList() + } + } else { + emptyView!!.hide() + notProcessedAdapter = OrderNotProcessedAdapter(requireContext(), dataBeans) + notProcessedView!!.layoutManager = LinearLayoutManager(requireContext()) + notProcessedView!!.adapter = notProcessedAdapter + notProcessedAdapter.setOnItemClickListener(object : + OrderNotProcessedAdapter.OnItemClickListener { + override fun onClicked(position: Int) { + val jobId = dataBeans[position].jobId.toString() + if (jobId.isBlank()) { + "工单编号异常,无法查看详情".show() + return + } // requireContext().navigatePageTo(jobId) - } + } - override fun onOperationClicked(position: Int) { - AlertControlDialog.Builder() - .setContext(requireContext()) - .setTitle("操作提示") - .setMessage("确定要接单吗") - .setNegativeButton("取消") - .setPositiveButton("确定") - .setOnDialogButtonClickListener(object : - AlertControlDialog.OnDialogButtonClickListener { - override fun onConfirmClick() { - val jobId = dataBeans[position].jobId.toString() - if (jobId.isBlank()) { - "工单ID异常,无法接单".show() - return + override fun onOperationClicked(position: Int) { + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("操作提示") + .setMessage("确定要接单吗") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + val jobId = dataBeans[position].jobId.toString() + if (jobId.isBlank()) { + "工单ID异常,无法接单".show() + return + } + operationViewModel.acceptOrder(jobId) } - operationViewModel.acceptOrder(jobId) - } - override fun onCancelClick() { + override fun onCancelClick() { - } - }).build().show() - } - }) + } + }).build().show() + } + }) + } } } true diff --git a/app/src/main/java/com/casic/qd/smartwell/model/SubordinateModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/SubordinateModel.kt new file mode 100644 index 0000000..3f2b287 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/model/SubordinateModel.kt @@ -0,0 +1,17 @@ +package com.casic.qd.smartwell.model + +class SubordinateModel { + var code = 0 + var data: List? = null + var message: String? = null + var isSuccess = false + + class DataBean { + var account: String? = null + var attr1: String? = null + var deptId: String? = null + var id: String? = null + var name: String? = null + var phone: String? = null + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt index 802ed6b..8b59d0d 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt @@ -8,7 +8,8 @@ val USER_PERMISSIONS = arrayOf( Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS, Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION, - Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE + Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE, + Manifest.permission.FOREGROUND_SERVICE ) const val PERMISSIONS_CODE = 999 @@ -36,6 +37,7 @@ R.color.color_7, R.color.color_8, R.color.color_9 ) + const val SERVER_BASE_URL = "http://111.198.10.15:20104" const val INTENT_PARAM = "intentParam" const val DEFAULT_SERVER_CONFIG = "defaultServerConfig" const val ACCOUNT = "account" diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/FileUtils.kt b/app/src/main/java/com/casic/qd/smartwell/utils/FileUtils.kt index 6b40d2e..c5743d3 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/FileUtils.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/FileUtils.kt @@ -7,9 +7,10 @@ object FileUtils { private val context = BaseApplication.obtainInstance() - val imageCompressPath: String + val compressImageDir: String get() { - val imageDir = File(context.getExternalFilesDir(Environment.DIRECTORY_PICTURES), "") + val imageDir = + File(context.getExternalFilesDir(Environment.DIRECTORY_PICTURES), "CompressImage") if (!imageDir.exists()) { imageDir.mkdir() } diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/OnImageCompressListener.kt b/app/src/main/java/com/casic/qd/smartwell/utils/OnImageCompressListener.kt new file mode 100644 index 0000000..53cbdb1 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/utils/OnImageCompressListener.kt @@ -0,0 +1,15 @@ +package com.casic.qd.smartwell.utils + +import java.io.File + +interface OnImageCompressListener { + /** + * Fired when a compression returns successfully, override to handle in your own code + */ + fun onSuccess(file: File) + + /** + * Fired when a compression fails to complete, override to handle in your own code + */ + fun onError(e: Throwable) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitFactory.kt b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitFactory.kt index 04579cf..2d9a4db 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitFactory.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitFactory.kt @@ -19,8 +19,7 @@ fun createRetrofit(clazz: Class): T { val defaultValue = SaveKeyValues.getValue( - Constant.DEFAULT_SERVER_CONFIG, - "http://111.198.10.15:20104" + Constant.DEFAULT_SERVER_CONFIG, Constant.SERVER_BASE_URL ) as String return Retrofit.Builder() .baseUrl(defaultValue) diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt index e20aa4e..a455056 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt @@ -352,4 +352,32 @@ @Header("token") token: String, @Part file: MultipartBody.Part ): String + + /** + * 查找同一单位下的用户 + * + * @param hasMine 是否包含本人,1包含, 0不包含 + * @param roleTips 角色类型,例:leader,member + */ + @FormUrlEncoded + @POST("/mgr/simplelist") + suspend fun obtainSubordinate( + @Header("token") token: String, + @Field("hasMine") hasMine: String?, + @Field("roleTips") roleTips: String? + ): String + + /** + * 转单 + * + * @param id 工单id + * @param transferPerson 转单人,转给谁 + */ + @FormUrlEncoded + @POST("/job/transferJob") + suspend fun transferWorkOrder( + @Header("token") token: String, + @Field("id") id: String, + @Field("transferPerson") transferPerson: String + ): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt index 8ce0fed..2de85eb 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt @@ -307,9 +307,7 @@ /** * 完成工单 */ - suspend fun completeOrder( - id: String, handleMessage: String, handlePhotos: String - ): String { + suspend fun completeOrder(id: String, handleMessage: String, handlePhotos: String): String { return api.completeOrder( AuthenticationHelper.token!!, id, handleMessage, handlePhotos ) @@ -323,4 +321,18 @@ val imagePart = MultipartBody.Part.createFormData("file", image.name, requestBody) return api.uploadImage(AuthenticationHelper.token!!, imagePart) } + + /** + * 查找同一单位下的用户 + */ + suspend fun obtainSubordinate(hasMine: String?, roleTips: String?): String { + return api.obtainSubordinate(AuthenticationHelper.token!!, hasMine, roleTips) + } + + /** + * 转单 + */ + suspend fun transferWorkOrder(id: String, userId: String): String { + return api.transferWorkOrder(AuthenticationHelper.token!!, id, userId) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/view/OrderCompletedDetailActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/OrderCompletedDetailActivity.kt index 227798b..5ce4b5c 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/OrderCompletedDetailActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/OrderCompletedDetailActivity.kt @@ -88,13 +88,13 @@ } //绑定窨井图片 - if (orderDetail.firstStatePhotos.toString().isBlank()) { + if (orderDetail.handlePhotos.toString().isBlank()) { imageRecyclerView.visibility = View.GONE } else { imageRecyclerView.visibility = View.VISIBLE //处理图片地址 val urls: ArrayList = ArrayList() - val imageArray = orderDetail.firstStatePhotos.toString().split(",") + val imageArray = orderDetail.handlePhotos.toString().split(",") imageArray.forEach { path -> if (path.isNotBlank()) { urls.add(path.combineImagePath()) diff --git a/app/src/main/java/com/casic/qd/smartwell/view/OrderInHandleDetailActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/OrderInHandleDetailActivity.kt index 25f30c1..090003d 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/OrderInHandleDetailActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/OrderInHandleDetailActivity.kt @@ -1,8 +1,11 @@ package com.casic.qd.smartwell.view import android.content.Context +import android.os.CountDownTimer +import android.os.Handler import android.text.Editable import android.text.TextWatcher +import android.util.Log import android.view.View import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.GridLayoutManager @@ -12,9 +15,11 @@ import com.casic.qd.smartwell.base.BaseActivity import com.casic.qd.smartwell.extensions.* import com.casic.qd.smartwell.utils.* +import com.casic.qd.smartwell.vm.AuthenticateViewModel import com.casic.qd.smartwell.vm.OperationViewModel import com.casic.qd.smartwell.vm.UploadImageViewModel import com.casic.qd.smartwell.vm.WorkOrderViewModel +import com.casic.qd.smartwell.widgets.SingleChoiceDialog import com.casic.qd.smartwell.widgets.TimeLineBottomSheet import com.luck.picture.lib.basic.PictureSelector import com.luck.picture.lib.config.SelectMimeType @@ -31,12 +36,13 @@ class OrderInHandleDetailActivity : BaseActivity() { + private val kTag = "OrderInHandleDetailActivity" private lateinit var workOrderViewModel: WorkOrderViewModel private lateinit var uploadImageViewModel: UploadImageViewModel - - // private lateinit var userViewModel: UserViewModel + private lateinit var authenticateViewModel: AuthenticateViewModel private lateinit var operationViewModel: OperationViewModel private lateinit var imageAdapter: NineGridImageAdapter + private lateinit var weakReferenceHandler: WeakReferenceHandler private val context: Context = this@OrderInHandleDetailActivity private val imagePaths: ArrayList = ArrayList() //服务器返回的拍照数据集 private val realPaths: ArrayList = ArrayList() //真实图片路径 @@ -57,9 +63,11 @@ workOrderViewModel = ViewModelProvider(this).get(WorkOrderViewModel::class.java) uploadImageViewModel = ViewModelProvider(this).get(UploadImageViewModel::class.java) -// userViewModel = ViewModelProvider(this).get(UserViewModel::class.java) + authenticateViewModel = ViewModelProvider(this).get(AuthenticateViewModel::class.java) operationViewModel = ViewModelProvider(this).get(OperationViewModel::class.java) + weakReferenceHandler = WeakReferenceHandler(callback) + workOrderViewModel.obtainWorkOrderDetail(jobId) } @@ -164,7 +172,7 @@ confirmPersonView.text = orderDetail.confirmJobPerson - //维护情况 TODO 输入内容长度校验好像没用? + //TODO 维护情况 输入内容长度校验好像没用? sceneEditView.setText(orderDetail.handleMessage) confirmDateView.text = orderDetail.confirmJobTime @@ -186,53 +194,55 @@ transferTipsView.visibility = View.GONE } //转单 -// transferOrderButton.setChangeAlphaWhenPress(true) -// transferOrderButton.setOnClickListener { -// userViewModel.obtainSubordinate("0", "leader,member") -// } -// userViewModel.subordinateModel.observe(this, { subordinate -> -// if (subordinate.code == 200) { -// val roleArray: ArrayList = ArrayList() //下级流转人员集合 -// subordinate.data?.forEach { dataBean -> -// roleArray.add(dataBean.name.toString()) -// } -// SingleChoiceDialog.Builder() -// .setContext(this) -// .setChoiceItemTitles(roleArray) -// .setOnSingleChoiceClickListener(object : -// SingleChoiceDialog.OnSingleChoiceClickListener { -// override fun onItemClick(position: Int) { -// val personBean = subordinate.data!![position] -// AlertControlDialog.Builder() -// .setContext(context) -// .setTitle("操作提示") -// .setMessage("确定要转单吗") -// .setNegativeButton("取消") -// .setPositiveButton("确定") -// .setOnDialogButtonClickListener(object : -// AlertControlDialog.OnDialogButtonClickListener { -// override fun onConfirmClick() { -// val orderId = orderDetail.jobId.toString() -// if (orderId.isBlank()) { -// "工单ID异常,无法转单".show() -// return -// } -// operationViewModel.transferWorkOrder( -// id = orderId, userId = personBean.id!! -// ) -// } -// -// override fun onCancelClick() { -// -// } -// }).build().show() -// } -// }).build().show() -// } -// }) + transferOrderButton.setOnClickListener { + authenticateViewModel.obtainSubordinate("0", "leader,member") + } + authenticateViewModel.subordinateModel.observe(this, { subordinate -> + if (subordinate.code == 200) { + if (subordinate.data!!.isEmpty()) { + "无下级转单人员,无法转单".show() + } else { + val roleArray: ArrayList = ArrayList() //下级流转人员集合 + subordinate.data?.forEach { dataBean -> + roleArray.add(dataBean.name.toString()) + } + SingleChoiceDialog.Builder() + .setContext(this) + .setChoiceItemTitles(roleArray) + .setOnSingleChoiceClickListener(object : + SingleChoiceDialog.OnSingleChoiceClickListener { + override fun onItemClick(position: Int) { + val personBean = subordinate.data!![position] + AlertControlDialog.Builder() + .setContext(context) + .setTitle("操作提示") + .setMessage("确定要转单吗") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + val orderId = orderDetail.jobId.toString() + if (orderId.isBlank()) { + "工单ID异常,无法转单".show() + return + } + operationViewModel.transferWorkOrder( + orderId, personBean.id!! + ) + } + + override fun onCancelClick() { + + } + }).build().show() + } + }).build().show() + } + } + }) //提交工单处理 - submitButton.setChangeAlphaWhenPress(true) submitButton.setOnClickListener { val orderId = orderDetail.jobId.toString() if (orderId.isBlank()) { @@ -314,7 +324,7 @@ imagePaths.add(url) realPaths.add(url.combineImagePath()) } - imageAdapter.setupImage(images = realPaths) + imageAdapter.setupImage(realPaths) } else { "最多只能上传3张图片".show() } @@ -325,26 +335,26 @@ }) //转单状态处理 -// operationViewModel.loadState.observe(this, { -// when (it) { -// is LoadState.Loading -> { -// DialogHelper.showLoadingDialog(this, "转单中,请稍后") -// } -// is LoadState.Success -> { -// DialogHelper.dismissLoadingDialog() -// /** -// * 转单需要刷新处理中和超时未处理的列表 -// * */ + operationViewModel.loadState.observe(this, { + when (it) { + is LoadState.Loading -> { + DialogHelper.showLoadingDialog(this, "转单中,请稍后") + } + is LoadState.Success -> { + DialogHelper.dismissLoadingDialog() + /** + * 转单需要刷新处理中和超时未处理的列表 + * */ // BroadcastReceiverManager.instance.sendMultiBroadcast( // Constant.IN_HANDLE_ACTION, Constant.NOT_HANDLE_ACTION // ) -// this.finish() -// } -// else -> { -// DialogHelper.dismissLoadingDialog() -// } -// } -// }) + this.finish() + } + else -> { + DialogHelper.dismissLoadingDialog() + } + } + }) //处理完成工单状态处理 operationViewModel.loadState.observe(this, { @@ -380,9 +390,11 @@ .openCamera(SelectMimeType.ofImage()) .forResult(object : OnResultCallbackListener { override fun onResult(result: ArrayList?) { - val cameraResult = result?.get(0) - //上传图片 -// uploadImageViewModel.uploadImage(File(cameraResult)) + if (result == null) { + "拍照保存失败,请重试".show() + return + } + analyticalSelectResults(result[0]) } override fun onCancel() { @@ -393,15 +405,34 @@ 1 -> { PictureSelector.create(this) .openGallery(SelectMimeType.ofImage()) + .isGif(false) + .isMaxSelectEnabledMask(true) + .setFilterMinFileSize(100) + .setMaxSelectNum(3) + .isDisplayCamera(false) .setImageEngine(GlideLoadEngine.instance) .forResult(object : OnResultCallbackListener { override fun onResult(result: ArrayList?) { showLoadingDialog(context, "图片上传中,请稍后...") - result?.forEach { - val file = File(it.compressPath) - //上传图片 -// uploadImageViewModel.uploadImage(image = file) + if (result == null) { + "选择照片失败,请重试".show() + return } + // 线程控制图片压缩上传过程,防止速度过快导致压缩失败 + val sum = (result.size * 500).toLong() + object : CountDownTimer(sum, 500) { + override fun onTick(millisUntilFinished: Long) { + val i = millisUntilFinished / 500 + val message = weakReferenceHandler.obtainMessage() + message.obj = result[i.toInt()] + message.what = 2022061701 + weakReferenceHandler.handleMessage(message) + } + + override fun onFinish() { + + } + }.start() } override fun onCancel() { @@ -413,6 +444,37 @@ }.build().show() } + private val callback = Handler.Callback { + if (it.what == 2022061701) { + analyticalSelectResults(it.obj as LocalMedia) + } + true + } + + private fun analyticalSelectResults(result: LocalMedia) { + //压缩图片 +// val realPath = if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) { +// result.realPath +// } else { +// result.sandboxPath +// } +// Log.d(kTag, "初始路径:" + result.path) +// Log.d(kTag, "绝对路径:" + result.realPath) +// Log.d(kTag, "原图路径:" + result.originalPath) +// Log.d(kTag, "沙盒路径:" + result.sandboxPath) + result.realPath.compressImage(context, object : OnImageCompressListener { + override fun onSuccess(file: File) { + Log.d(kTag, "onSuccess: " + file.absolutePath) + //上传图片 + uploadImageViewModel.uploadImage(file) + } + + override fun onError(e: Throwable) { + e.printStackTrace() + } + }) + } + private var loadingDialog: QMUITipDialog? = null fun showLoadingDialog(context: Context?, message: String?) { diff --git a/app/src/main/java/com/casic/qd/smartwell/view/OrderSearchResultActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/OrderSearchResultActivity.kt index 659e64a..085ff5a 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/OrderSearchResultActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/OrderSearchResultActivity.kt @@ -193,7 +193,7 @@ "工单ID异常,无法接单".show() return } - operationViewModel.acceptWorkOrder(jobId) + operationViewModel.acceptOrder(jobId) } override fun onCancelClick() { diff --git a/app/src/main/java/com/casic/qd/smartwell/vm/AuthenticateViewModel.kt b/app/src/main/java/com/casic/qd/smartwell/vm/AuthenticateViewModel.kt index 3aaa8a7..a416f02 100644 --- a/app/src/main/java/com/casic/qd/smartwell/vm/AuthenticateViewModel.kt +++ b/app/src/main/java/com/casic/qd/smartwell/vm/AuthenticateViewModel.kt @@ -5,6 +5,7 @@ import com.casic.qd.smartwell.extensions.* import com.casic.qd.smartwell.model.OwnerShipModel import com.casic.qd.smartwell.model.PublicKeyModel +import com.casic.qd.smartwell.model.SubordinateModel import com.casic.qd.smartwell.utils.Constant import com.casic.qd.smartwell.utils.LoadState import com.casic.qd.smartwell.utils.SaveKeyValues @@ -18,6 +19,7 @@ private val gson = Gson() val keyModel = MutableLiveData() val resultModel = MutableLiveData() + val subordinateModel = MutableLiveData() fun obtainPublicKey() = launch({ loadState.value = LoadState.Loading @@ -62,4 +64,21 @@ }, { it.printStackTrace() }) + + /** + * 转单下一级人员 + * */ + fun obtainSubordinate(hasMine: String?, roleTips: String?) = launch({ + val response = RetrofitServiceManager.obtainSubordinate(hasMine, roleTips) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + subordinateModel.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/qd/smartwell/vm/OperationViewModel.kt b/app/src/main/java/com/casic/qd/smartwell/vm/OperationViewModel.kt index 03fe6e6..ca8de57 100644 --- a/app/src/main/java/com/casic/qd/smartwell/vm/OperationViewModel.kt +++ b/app/src/main/java/com/casic/qd/smartwell/vm/OperationViewModel.kt @@ -49,21 +49,21 @@ // it.printStackTrace() // }) // -// fun transferWorkOrder(id: String, userId: String) = launch({ -// loadState.value = LoadState.Loading -// val response = RetrofitServiceManager.transferWorkOrder(id, userId) -// val responseCode = response.separateResponseCode() -// if (responseCode == 200) { -// loadState.value = LoadState.Success -// "转单成功".show() -// } else { -// loadState.value = LoadState.Fail -// response.toErrorMessage().show() -// } -// }, { -// loadState.value = LoadState.Fail -// it.printStackTrace() -// }) +fun transferWorkOrder(id: String, userId: String) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.transferWorkOrder(id, userId) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + "转单成功".show() + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show() + } +}, { + loadState.value = LoadState.Fail + it.printStackTrace() +}) fun completeOrder(id: String, handleMessage: String, handlePhotos: String) = launch({ loadState.value = LoadState.Loading diff --git a/app/src/main/java/com/casic/qd/smartwell/widgets/SingleChoiceDialog.kt b/app/src/main/java/com/casic/qd/smartwell/widgets/SingleChoiceDialog.kt new file mode 100644 index 0000000..b3071c7 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/widgets/SingleChoiceDialog.kt @@ -0,0 +1,111 @@ +package com.casic.qd.smartwell.widgets + +import android.app.Dialog +import android.content.Context +import android.os.Bundle +import android.view.* +import android.widget.* +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.extensions.initDialogLayoutParams +import com.pengxh.app.multilib.utils.SizeUtil +import java.util.* + +class SingleChoiceDialog private constructor(builder: Builder) : Dialog( + builder.context, R.style.UserDefinedDialogStyle +) { + private val ctx: Context = builder.context + private val choiceItems: ArrayList = builder.actionItems + private val clickListener: OnSingleChoiceClickListener = builder.listener + + class Builder { + lateinit var context: Context + lateinit var actionItems: ArrayList + lateinit var listener: OnSingleChoiceClickListener + + fun setContext(context: Context): Builder { + this.context = context + return this + } + + fun setChoiceItemTitles(items: ArrayList): Builder { + actionItems = items + return this + } + + fun setOnSingleChoiceClickListener(listener: OnSingleChoiceClickListener): Builder { + this.listener = listener + return this + } + + fun build(): SingleChoiceDialog { + return SingleChoiceDialog(this) + } + } + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + this.initDialogLayoutParams(Gravity.CENTER, R.style.UserDefinedAnimation, 0.75f) + this.setContentView(R.layout.dialog_single_choice) + this.setCancelable(false) + this.setCanceledOnTouchOutside(false) + + val dismissView = findViewById(R.id.dismissView) + dismissView.setOnClickListener { dismiss() } + + val itemListView = findViewById(R.id.itemListView) + itemListView.adapter = object : BaseAdapter() { + private val inflater = LayoutInflater.from(ctx) + override fun getCount(): Int { + return choiceItems.size + } + + override fun getItem(position: Int): Any { + return choiceItems[position] + } + + override fun getItemId(position: Int): Long { + return position.toLong() + } + + override fun getView(position: Int, convertView: View?, viewGroup: ViewGroup): View { + val view: View + val holder: ItemViewHolder + if (convertView == null) { + holder = ItemViewHolder() + view = inflater.inflate(R.layout.item_choice_dialog, null) + holder.choiceItemView = view.findViewById(R.id.choiceItemView) + view.tag = holder + } else { + view = convertView + holder = view.tag as ItemViewHolder + } + if (position == choiceItems.size - 1) { + holder.choiceItemView.setBackgroundResource(com.pengxh.app.multilib.R.drawable.sheet_item_bottom_selector) + } else { + holder.choiceItemView.setBackgroundResource(com.pengxh.app.multilib.R.drawable.sheet_item_middle_selector) + } + holder.choiceItemView.text = choiceItems[position] + holder.choiceItemView.textSize = 18f + //需要动态设置item的高度 + val param = AbsListView.LayoutParams( + WindowManager.LayoutParams.MATCH_PARENT, + SizeUtil.dp2px(ctx, 46f) + ) + view.layoutParams = param + return view + } + } + itemListView.onItemClickListener = AdapterView.OnItemClickListener { _, _, position, _ -> + clickListener.onItemClick(position) + dismiss() + } + } + + interface OnSingleChoiceClickListener { + fun onItemClick(position: Int) + } + + internal class ItemViewHolder { + lateinit var choiceItemView: TextView + } +} \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index ea77e44..59e75eb 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -76,6 +76,8 @@ implementation 'com.github.bumptech.glide:glide:4.9.0' //图片选择框架 implementation 'io.github.lucksiege:pictureselector:v3.0.4' + //图片压缩 + implementation 'top.zibin:Luban:1.1.8' //高德地图 implementation 'com.amap.api:3dmap:7.9.1' //返回值转换器 diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index e361509..1e6c783 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -14,6 +14,7 @@ + diff --git a/app/src/main/java/com/casic/qd/smartwell/adapter/NineGridImageAdapter.kt b/app/src/main/java/com/casic/qd/smartwell/adapter/NineGridImageAdapter.kt index f07824e..e016832 100644 --- a/app/src/main/java/com/casic/qd/smartwell/adapter/NineGridImageAdapter.kt +++ b/app/src/main/java/com/casic/qd/smartwell/adapter/NineGridImageAdapter.kt @@ -30,9 +30,14 @@ } fun deleteImage(position: Int) { - if (imageData.size != 0) { - imageData.removeAt(position) - notifyDataSetChanged() + try { + if (imageData.size > position) { + imageData.removeAt(position) + notifyItemRemoved(position) + notifyItemRangeChanged(position, imageData.size) + } + } catch (e: Exception) { + e.printStackTrace() } } diff --git a/app/src/main/java/com/casic/qd/smartwell/adapter/OrderCompletedAdapter.kt b/app/src/main/java/com/casic/qd/smartwell/adapter/OrderCompletedAdapter.kt index f36c15d..6533b92 100644 --- a/app/src/main/java/com/casic/qd/smartwell/adapter/OrderCompletedAdapter.kt +++ b/app/src/main/java/com/casic/qd/smartwell/adapter/OrderCompletedAdapter.kt @@ -43,14 +43,14 @@ val rowsBean = dataRows[position] holder.alarmContentView.text = rowsBean.alarmContentName holder.createTimeView.text = rowsBean.createTime - holder.wellCodeView.text = rowsBean.wellCode - val alarmValue = rowsBean.alarmValue.toString() - if (alarmValue.isBlank()) { - holder.alarmValueView.text = "报警值未知" + holder.wellCodeView.text = String.format("井编号:${rowsBean.wellCode}") + val alarmValue = if (rowsBean.alarmValue.toString().isBlank()) { + "未知" } else { - holder.alarmValueView.text = alarmValue + rowsBean.alarmValue } - holder.wellLocationView.text = rowsBean.position + holder.alarmValueView.text = String.format("告警值:$alarmValue") + holder.wellLocationView.text = String.format("井位置:${rowsBean.position}") holder.currentStateView.text = String.format("${rowsBean.jobStatusName}-${rowsBean.jobBelongTo}") diff --git a/app/src/main/java/com/casic/qd/smartwell/adapter/OrderInHandleAdapter.kt b/app/src/main/java/com/casic/qd/smartwell/adapter/OrderInHandleAdapter.kt index a7fcfa8..74646d6 100644 --- a/app/src/main/java/com/casic/qd/smartwell/adapter/OrderInHandleAdapter.kt +++ b/app/src/main/java/com/casic/qd/smartwell/adapter/OrderInHandleAdapter.kt @@ -42,14 +42,14 @@ val rowsBean = dataRows[position] holder.alarmContentView.text = rowsBean.alarmContentName holder.createTimeView.text = rowsBean.createTime - holder.wellCodeView.text = rowsBean.wellCode - val alarmValue = rowsBean.alarmValue.toString() - if (alarmValue.isBlank()) { - holder.alarmValueView.text = "报警值未知" + holder.wellCodeView.text = String.format("井编号:${rowsBean.wellCode}") + val alarmValue = if (rowsBean.alarmValue.toString().isBlank()) { + "未知" } else { - holder.alarmValueView.text = alarmValue + rowsBean.alarmValue } - holder.wellLocationView.text = rowsBean.position + holder.alarmValueView.text = String.format("告警值:$alarmValue") + holder.wellLocationView.text = String.format("井位置:${rowsBean.position}") holder.currentStateView.text = String.format("${rowsBean.jobStatusName}-${rowsBean.jobBelongTo}") diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt index cd52782..149adf2 100644 --- a/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt @@ -1,6 +1,8 @@ package com.casic.qd.smartwell.extensions +import android.content.Context import android.graphics.Color +import android.text.TextUtils import android.view.Gravity import android.widget.TextView import android.widget.Toast @@ -8,11 +10,16 @@ import com.casic.qd.smartwell.base.BaseApplication import com.casic.qd.smartwell.model.ErrorMessageModel import com.casic.qd.smartwell.utils.Constant +import com.casic.qd.smartwell.utils.FileUtils +import com.casic.qd.smartwell.utils.OnImageCompressListener import com.casic.qd.smartwell.utils.SaveKeyValues import com.google.gson.Gson import com.google.gson.reflect.TypeToken import com.qmuiteam.qmui.util.QMUIDisplayHelper import org.json.JSONObject +import top.zibin.luban.Luban +import top.zibin.luban.OnCompressListener +import java.io.File import java.text.ParseException import java.text.SimpleDateFormat import java.util.* @@ -108,8 +115,30 @@ fun String.combineImagePath(): String { if (this.isEmpty()) return this val defaultValue = SaveKeyValues.getValue( - Constant.DEFAULT_SERVER_CONFIG, - "http://111.198.10.15:11304" + Constant.DEFAULT_SERVER_CONFIG, Constant.SERVER_BASE_URL ) as String return "$defaultValue/static/${this.replace("\\", "/")}" +} + +fun String.compressImage(context: Context, listener: OnImageCompressListener) { + Luban.with(context) + .load(this) + .ignoreBy(100) + .setTargetDir(FileUtils.compressImageDir) + .filter { path -> + !(TextUtils.isEmpty(path) || path.lowercase(Locale.getDefault()).endsWith(".gif")) + } + .setCompressListener(object : OnCompressListener { + override fun onStart() { + + } + + override fun onSuccess(file: File) { + listener.onSuccess(file) + } + + override fun onError(e: Throwable) { + listener.onError(e) + } + }).launch() } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotProcessedFragment.kt b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotProcessedFragment.kt index 7605a10..a06c5a5 100644 --- a/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotProcessedFragment.kt +++ b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotProcessedFragment.kt @@ -111,53 +111,55 @@ private val callback = Handler.Callback { if (it.what == 2022061504) { - notProcessedAdapter.notifyDataSetChanged() - } else { - if (dataBeans.size == 0) { - emptyView!!.showEmptyPage("没有需要您处理的工单") { - pageIndex = 1 - obtainWorkOrderList() - } + if (isRefresh || isLoadMore) { + notProcessedAdapter.notifyDataSetChanged() } else { - emptyView!!.hide() - notProcessedAdapter = OrderNotProcessedAdapter(requireContext(), dataBeans) - notProcessedView!!.layoutManager = LinearLayoutManager(requireContext()) - notProcessedView!!.adapter = notProcessedAdapter - notProcessedAdapter.setOnItemClickListener(object : - OrderNotProcessedAdapter.OnItemClickListener { - override fun onClicked(position: Int) { - val jobId = dataBeans[position].jobId.toString() - if (jobId.isBlank()) { - "工单编号异常,无法查看详情".show() - return - } + if (dataBeans.size == 0) { + emptyView!!.showEmptyPage("没有需要您处理的工单") { + pageIndex = 1 + obtainWorkOrderList() + } + } else { + emptyView!!.hide() + notProcessedAdapter = OrderNotProcessedAdapter(requireContext(), dataBeans) + notProcessedView!!.layoutManager = LinearLayoutManager(requireContext()) + notProcessedView!!.adapter = notProcessedAdapter + notProcessedAdapter.setOnItemClickListener(object : + OrderNotProcessedAdapter.OnItemClickListener { + override fun onClicked(position: Int) { + val jobId = dataBeans[position].jobId.toString() + if (jobId.isBlank()) { + "工单编号异常,无法查看详情".show() + return + } // requireContext().navigatePageTo(jobId) - } + } - override fun onOperationClicked(position: Int) { - AlertControlDialog.Builder() - .setContext(requireContext()) - .setTitle("操作提示") - .setMessage("确定要接单吗") - .setNegativeButton("取消") - .setPositiveButton("确定") - .setOnDialogButtonClickListener(object : - AlertControlDialog.OnDialogButtonClickListener { - override fun onConfirmClick() { - val jobId = dataBeans[position].jobId.toString() - if (jobId.isBlank()) { - "工单ID异常,无法接单".show() - return + override fun onOperationClicked(position: Int) { + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("操作提示") + .setMessage("确定要接单吗") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + val jobId = dataBeans[position].jobId.toString() + if (jobId.isBlank()) { + "工单ID异常,无法接单".show() + return + } + operationViewModel.acceptOrder(jobId) } - operationViewModel.acceptOrder(jobId) - } - override fun onCancelClick() { + override fun onCancelClick() { - } - }).build().show() - } - }) + } + }).build().show() + } + }) + } } } true diff --git a/app/src/main/java/com/casic/qd/smartwell/model/SubordinateModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/SubordinateModel.kt new file mode 100644 index 0000000..3f2b287 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/model/SubordinateModel.kt @@ -0,0 +1,17 @@ +package com.casic.qd.smartwell.model + +class SubordinateModel { + var code = 0 + var data: List? = null + var message: String? = null + var isSuccess = false + + class DataBean { + var account: String? = null + var attr1: String? = null + var deptId: String? = null + var id: String? = null + var name: String? = null + var phone: String? = null + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt index 802ed6b..8b59d0d 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt @@ -8,7 +8,8 @@ val USER_PERMISSIONS = arrayOf( Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS, Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION, - Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE + Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE, + Manifest.permission.FOREGROUND_SERVICE ) const val PERMISSIONS_CODE = 999 @@ -36,6 +37,7 @@ R.color.color_7, R.color.color_8, R.color.color_9 ) + const val SERVER_BASE_URL = "http://111.198.10.15:20104" const val INTENT_PARAM = "intentParam" const val DEFAULT_SERVER_CONFIG = "defaultServerConfig" const val ACCOUNT = "account" diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/FileUtils.kt b/app/src/main/java/com/casic/qd/smartwell/utils/FileUtils.kt index 6b40d2e..c5743d3 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/FileUtils.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/FileUtils.kt @@ -7,9 +7,10 @@ object FileUtils { private val context = BaseApplication.obtainInstance() - val imageCompressPath: String + val compressImageDir: String get() { - val imageDir = File(context.getExternalFilesDir(Environment.DIRECTORY_PICTURES), "") + val imageDir = + File(context.getExternalFilesDir(Environment.DIRECTORY_PICTURES), "CompressImage") if (!imageDir.exists()) { imageDir.mkdir() } diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/OnImageCompressListener.kt b/app/src/main/java/com/casic/qd/smartwell/utils/OnImageCompressListener.kt new file mode 100644 index 0000000..53cbdb1 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/utils/OnImageCompressListener.kt @@ -0,0 +1,15 @@ +package com.casic.qd.smartwell.utils + +import java.io.File + +interface OnImageCompressListener { + /** + * Fired when a compression returns successfully, override to handle in your own code + */ + fun onSuccess(file: File) + + /** + * Fired when a compression fails to complete, override to handle in your own code + */ + fun onError(e: Throwable) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitFactory.kt b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitFactory.kt index 04579cf..2d9a4db 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitFactory.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitFactory.kt @@ -19,8 +19,7 @@ fun createRetrofit(clazz: Class): T { val defaultValue = SaveKeyValues.getValue( - Constant.DEFAULT_SERVER_CONFIG, - "http://111.198.10.15:20104" + Constant.DEFAULT_SERVER_CONFIG, Constant.SERVER_BASE_URL ) as String return Retrofit.Builder() .baseUrl(defaultValue) diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt index e20aa4e..a455056 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt @@ -352,4 +352,32 @@ @Header("token") token: String, @Part file: MultipartBody.Part ): String + + /** + * 查找同一单位下的用户 + * + * @param hasMine 是否包含本人,1包含, 0不包含 + * @param roleTips 角色类型,例:leader,member + */ + @FormUrlEncoded + @POST("/mgr/simplelist") + suspend fun obtainSubordinate( + @Header("token") token: String, + @Field("hasMine") hasMine: String?, + @Field("roleTips") roleTips: String? + ): String + + /** + * 转单 + * + * @param id 工单id + * @param transferPerson 转单人,转给谁 + */ + @FormUrlEncoded + @POST("/job/transferJob") + suspend fun transferWorkOrder( + @Header("token") token: String, + @Field("id") id: String, + @Field("transferPerson") transferPerson: String + ): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt index 8ce0fed..2de85eb 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt @@ -307,9 +307,7 @@ /** * 完成工单 */ - suspend fun completeOrder( - id: String, handleMessage: String, handlePhotos: String - ): String { + suspend fun completeOrder(id: String, handleMessage: String, handlePhotos: String): String { return api.completeOrder( AuthenticationHelper.token!!, id, handleMessage, handlePhotos ) @@ -323,4 +321,18 @@ val imagePart = MultipartBody.Part.createFormData("file", image.name, requestBody) return api.uploadImage(AuthenticationHelper.token!!, imagePart) } + + /** + * 查找同一单位下的用户 + */ + suspend fun obtainSubordinate(hasMine: String?, roleTips: String?): String { + return api.obtainSubordinate(AuthenticationHelper.token!!, hasMine, roleTips) + } + + /** + * 转单 + */ + suspend fun transferWorkOrder(id: String, userId: String): String { + return api.transferWorkOrder(AuthenticationHelper.token!!, id, userId) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/view/OrderCompletedDetailActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/OrderCompletedDetailActivity.kt index 227798b..5ce4b5c 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/OrderCompletedDetailActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/OrderCompletedDetailActivity.kt @@ -88,13 +88,13 @@ } //绑定窨井图片 - if (orderDetail.firstStatePhotos.toString().isBlank()) { + if (orderDetail.handlePhotos.toString().isBlank()) { imageRecyclerView.visibility = View.GONE } else { imageRecyclerView.visibility = View.VISIBLE //处理图片地址 val urls: ArrayList = ArrayList() - val imageArray = orderDetail.firstStatePhotos.toString().split(",") + val imageArray = orderDetail.handlePhotos.toString().split(",") imageArray.forEach { path -> if (path.isNotBlank()) { urls.add(path.combineImagePath()) diff --git a/app/src/main/java/com/casic/qd/smartwell/view/OrderInHandleDetailActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/OrderInHandleDetailActivity.kt index 25f30c1..090003d 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/OrderInHandleDetailActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/OrderInHandleDetailActivity.kt @@ -1,8 +1,11 @@ package com.casic.qd.smartwell.view import android.content.Context +import android.os.CountDownTimer +import android.os.Handler import android.text.Editable import android.text.TextWatcher +import android.util.Log import android.view.View import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.GridLayoutManager @@ -12,9 +15,11 @@ import com.casic.qd.smartwell.base.BaseActivity import com.casic.qd.smartwell.extensions.* import com.casic.qd.smartwell.utils.* +import com.casic.qd.smartwell.vm.AuthenticateViewModel import com.casic.qd.smartwell.vm.OperationViewModel import com.casic.qd.smartwell.vm.UploadImageViewModel import com.casic.qd.smartwell.vm.WorkOrderViewModel +import com.casic.qd.smartwell.widgets.SingleChoiceDialog import com.casic.qd.smartwell.widgets.TimeLineBottomSheet import com.luck.picture.lib.basic.PictureSelector import com.luck.picture.lib.config.SelectMimeType @@ -31,12 +36,13 @@ class OrderInHandleDetailActivity : BaseActivity() { + private val kTag = "OrderInHandleDetailActivity" private lateinit var workOrderViewModel: WorkOrderViewModel private lateinit var uploadImageViewModel: UploadImageViewModel - - // private lateinit var userViewModel: UserViewModel + private lateinit var authenticateViewModel: AuthenticateViewModel private lateinit var operationViewModel: OperationViewModel private lateinit var imageAdapter: NineGridImageAdapter + private lateinit var weakReferenceHandler: WeakReferenceHandler private val context: Context = this@OrderInHandleDetailActivity private val imagePaths: ArrayList = ArrayList() //服务器返回的拍照数据集 private val realPaths: ArrayList = ArrayList() //真实图片路径 @@ -57,9 +63,11 @@ workOrderViewModel = ViewModelProvider(this).get(WorkOrderViewModel::class.java) uploadImageViewModel = ViewModelProvider(this).get(UploadImageViewModel::class.java) -// userViewModel = ViewModelProvider(this).get(UserViewModel::class.java) + authenticateViewModel = ViewModelProvider(this).get(AuthenticateViewModel::class.java) operationViewModel = ViewModelProvider(this).get(OperationViewModel::class.java) + weakReferenceHandler = WeakReferenceHandler(callback) + workOrderViewModel.obtainWorkOrderDetail(jobId) } @@ -164,7 +172,7 @@ confirmPersonView.text = orderDetail.confirmJobPerson - //维护情况 TODO 输入内容长度校验好像没用? + //TODO 维护情况 输入内容长度校验好像没用? sceneEditView.setText(orderDetail.handleMessage) confirmDateView.text = orderDetail.confirmJobTime @@ -186,53 +194,55 @@ transferTipsView.visibility = View.GONE } //转单 -// transferOrderButton.setChangeAlphaWhenPress(true) -// transferOrderButton.setOnClickListener { -// userViewModel.obtainSubordinate("0", "leader,member") -// } -// userViewModel.subordinateModel.observe(this, { subordinate -> -// if (subordinate.code == 200) { -// val roleArray: ArrayList = ArrayList() //下级流转人员集合 -// subordinate.data?.forEach { dataBean -> -// roleArray.add(dataBean.name.toString()) -// } -// SingleChoiceDialog.Builder() -// .setContext(this) -// .setChoiceItemTitles(roleArray) -// .setOnSingleChoiceClickListener(object : -// SingleChoiceDialog.OnSingleChoiceClickListener { -// override fun onItemClick(position: Int) { -// val personBean = subordinate.data!![position] -// AlertControlDialog.Builder() -// .setContext(context) -// .setTitle("操作提示") -// .setMessage("确定要转单吗") -// .setNegativeButton("取消") -// .setPositiveButton("确定") -// .setOnDialogButtonClickListener(object : -// AlertControlDialog.OnDialogButtonClickListener { -// override fun onConfirmClick() { -// val orderId = orderDetail.jobId.toString() -// if (orderId.isBlank()) { -// "工单ID异常,无法转单".show() -// return -// } -// operationViewModel.transferWorkOrder( -// id = orderId, userId = personBean.id!! -// ) -// } -// -// override fun onCancelClick() { -// -// } -// }).build().show() -// } -// }).build().show() -// } -// }) + transferOrderButton.setOnClickListener { + authenticateViewModel.obtainSubordinate("0", "leader,member") + } + authenticateViewModel.subordinateModel.observe(this, { subordinate -> + if (subordinate.code == 200) { + if (subordinate.data!!.isEmpty()) { + "无下级转单人员,无法转单".show() + } else { + val roleArray: ArrayList = ArrayList() //下级流转人员集合 + subordinate.data?.forEach { dataBean -> + roleArray.add(dataBean.name.toString()) + } + SingleChoiceDialog.Builder() + .setContext(this) + .setChoiceItemTitles(roleArray) + .setOnSingleChoiceClickListener(object : + SingleChoiceDialog.OnSingleChoiceClickListener { + override fun onItemClick(position: Int) { + val personBean = subordinate.data!![position] + AlertControlDialog.Builder() + .setContext(context) + .setTitle("操作提示") + .setMessage("确定要转单吗") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + val orderId = orderDetail.jobId.toString() + if (orderId.isBlank()) { + "工单ID异常,无法转单".show() + return + } + operationViewModel.transferWorkOrder( + orderId, personBean.id!! + ) + } + + override fun onCancelClick() { + + } + }).build().show() + } + }).build().show() + } + } + }) //提交工单处理 - submitButton.setChangeAlphaWhenPress(true) submitButton.setOnClickListener { val orderId = orderDetail.jobId.toString() if (orderId.isBlank()) { @@ -314,7 +324,7 @@ imagePaths.add(url) realPaths.add(url.combineImagePath()) } - imageAdapter.setupImage(images = realPaths) + imageAdapter.setupImage(realPaths) } else { "最多只能上传3张图片".show() } @@ -325,26 +335,26 @@ }) //转单状态处理 -// operationViewModel.loadState.observe(this, { -// when (it) { -// is LoadState.Loading -> { -// DialogHelper.showLoadingDialog(this, "转单中,请稍后") -// } -// is LoadState.Success -> { -// DialogHelper.dismissLoadingDialog() -// /** -// * 转单需要刷新处理中和超时未处理的列表 -// * */ + operationViewModel.loadState.observe(this, { + when (it) { + is LoadState.Loading -> { + DialogHelper.showLoadingDialog(this, "转单中,请稍后") + } + is LoadState.Success -> { + DialogHelper.dismissLoadingDialog() + /** + * 转单需要刷新处理中和超时未处理的列表 + * */ // BroadcastReceiverManager.instance.sendMultiBroadcast( // Constant.IN_HANDLE_ACTION, Constant.NOT_HANDLE_ACTION // ) -// this.finish() -// } -// else -> { -// DialogHelper.dismissLoadingDialog() -// } -// } -// }) + this.finish() + } + else -> { + DialogHelper.dismissLoadingDialog() + } + } + }) //处理完成工单状态处理 operationViewModel.loadState.observe(this, { @@ -380,9 +390,11 @@ .openCamera(SelectMimeType.ofImage()) .forResult(object : OnResultCallbackListener { override fun onResult(result: ArrayList?) { - val cameraResult = result?.get(0) - //上传图片 -// uploadImageViewModel.uploadImage(File(cameraResult)) + if (result == null) { + "拍照保存失败,请重试".show() + return + } + analyticalSelectResults(result[0]) } override fun onCancel() { @@ -393,15 +405,34 @@ 1 -> { PictureSelector.create(this) .openGallery(SelectMimeType.ofImage()) + .isGif(false) + .isMaxSelectEnabledMask(true) + .setFilterMinFileSize(100) + .setMaxSelectNum(3) + .isDisplayCamera(false) .setImageEngine(GlideLoadEngine.instance) .forResult(object : OnResultCallbackListener { override fun onResult(result: ArrayList?) { showLoadingDialog(context, "图片上传中,请稍后...") - result?.forEach { - val file = File(it.compressPath) - //上传图片 -// uploadImageViewModel.uploadImage(image = file) + if (result == null) { + "选择照片失败,请重试".show() + return } + // 线程控制图片压缩上传过程,防止速度过快导致压缩失败 + val sum = (result.size * 500).toLong() + object : CountDownTimer(sum, 500) { + override fun onTick(millisUntilFinished: Long) { + val i = millisUntilFinished / 500 + val message = weakReferenceHandler.obtainMessage() + message.obj = result[i.toInt()] + message.what = 2022061701 + weakReferenceHandler.handleMessage(message) + } + + override fun onFinish() { + + } + }.start() } override fun onCancel() { @@ -413,6 +444,37 @@ }.build().show() } + private val callback = Handler.Callback { + if (it.what == 2022061701) { + analyticalSelectResults(it.obj as LocalMedia) + } + true + } + + private fun analyticalSelectResults(result: LocalMedia) { + //压缩图片 +// val realPath = if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) { +// result.realPath +// } else { +// result.sandboxPath +// } +// Log.d(kTag, "初始路径:" + result.path) +// Log.d(kTag, "绝对路径:" + result.realPath) +// Log.d(kTag, "原图路径:" + result.originalPath) +// Log.d(kTag, "沙盒路径:" + result.sandboxPath) + result.realPath.compressImage(context, object : OnImageCompressListener { + override fun onSuccess(file: File) { + Log.d(kTag, "onSuccess: " + file.absolutePath) + //上传图片 + uploadImageViewModel.uploadImage(file) + } + + override fun onError(e: Throwable) { + e.printStackTrace() + } + }) + } + private var loadingDialog: QMUITipDialog? = null fun showLoadingDialog(context: Context?, message: String?) { diff --git a/app/src/main/java/com/casic/qd/smartwell/view/OrderSearchResultActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/OrderSearchResultActivity.kt index 659e64a..085ff5a 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/OrderSearchResultActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/OrderSearchResultActivity.kt @@ -193,7 +193,7 @@ "工单ID异常,无法接单".show() return } - operationViewModel.acceptWorkOrder(jobId) + operationViewModel.acceptOrder(jobId) } override fun onCancelClick() { diff --git a/app/src/main/java/com/casic/qd/smartwell/vm/AuthenticateViewModel.kt b/app/src/main/java/com/casic/qd/smartwell/vm/AuthenticateViewModel.kt index 3aaa8a7..a416f02 100644 --- a/app/src/main/java/com/casic/qd/smartwell/vm/AuthenticateViewModel.kt +++ b/app/src/main/java/com/casic/qd/smartwell/vm/AuthenticateViewModel.kt @@ -5,6 +5,7 @@ import com.casic.qd.smartwell.extensions.* import com.casic.qd.smartwell.model.OwnerShipModel import com.casic.qd.smartwell.model.PublicKeyModel +import com.casic.qd.smartwell.model.SubordinateModel import com.casic.qd.smartwell.utils.Constant import com.casic.qd.smartwell.utils.LoadState import com.casic.qd.smartwell.utils.SaveKeyValues @@ -18,6 +19,7 @@ private val gson = Gson() val keyModel = MutableLiveData() val resultModel = MutableLiveData() + val subordinateModel = MutableLiveData() fun obtainPublicKey() = launch({ loadState.value = LoadState.Loading @@ -62,4 +64,21 @@ }, { it.printStackTrace() }) + + /** + * 转单下一级人员 + * */ + fun obtainSubordinate(hasMine: String?, roleTips: String?) = launch({ + val response = RetrofitServiceManager.obtainSubordinate(hasMine, roleTips) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + subordinateModel.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/qd/smartwell/vm/OperationViewModel.kt b/app/src/main/java/com/casic/qd/smartwell/vm/OperationViewModel.kt index 03fe6e6..ca8de57 100644 --- a/app/src/main/java/com/casic/qd/smartwell/vm/OperationViewModel.kt +++ b/app/src/main/java/com/casic/qd/smartwell/vm/OperationViewModel.kt @@ -49,21 +49,21 @@ // it.printStackTrace() // }) // -// fun transferWorkOrder(id: String, userId: String) = launch({ -// loadState.value = LoadState.Loading -// val response = RetrofitServiceManager.transferWorkOrder(id, userId) -// val responseCode = response.separateResponseCode() -// if (responseCode == 200) { -// loadState.value = LoadState.Success -// "转单成功".show() -// } else { -// loadState.value = LoadState.Fail -// response.toErrorMessage().show() -// } -// }, { -// loadState.value = LoadState.Fail -// it.printStackTrace() -// }) +fun transferWorkOrder(id: String, userId: String) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.transferWorkOrder(id, userId) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + "转单成功".show() + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show() + } +}, { + loadState.value = LoadState.Fail + it.printStackTrace() +}) fun completeOrder(id: String, handleMessage: String, handlePhotos: String) = launch({ loadState.value = LoadState.Loading diff --git a/app/src/main/java/com/casic/qd/smartwell/widgets/SingleChoiceDialog.kt b/app/src/main/java/com/casic/qd/smartwell/widgets/SingleChoiceDialog.kt new file mode 100644 index 0000000..b3071c7 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/widgets/SingleChoiceDialog.kt @@ -0,0 +1,111 @@ +package com.casic.qd.smartwell.widgets + +import android.app.Dialog +import android.content.Context +import android.os.Bundle +import android.view.* +import android.widget.* +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.extensions.initDialogLayoutParams +import com.pengxh.app.multilib.utils.SizeUtil +import java.util.* + +class SingleChoiceDialog private constructor(builder: Builder) : Dialog( + builder.context, R.style.UserDefinedDialogStyle +) { + private val ctx: Context = builder.context + private val choiceItems: ArrayList = builder.actionItems + private val clickListener: OnSingleChoiceClickListener = builder.listener + + class Builder { + lateinit var context: Context + lateinit var actionItems: ArrayList + lateinit var listener: OnSingleChoiceClickListener + + fun setContext(context: Context): Builder { + this.context = context + return this + } + + fun setChoiceItemTitles(items: ArrayList): Builder { + actionItems = items + return this + } + + fun setOnSingleChoiceClickListener(listener: OnSingleChoiceClickListener): Builder { + this.listener = listener + return this + } + + fun build(): SingleChoiceDialog { + return SingleChoiceDialog(this) + } + } + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + this.initDialogLayoutParams(Gravity.CENTER, R.style.UserDefinedAnimation, 0.75f) + this.setContentView(R.layout.dialog_single_choice) + this.setCancelable(false) + this.setCanceledOnTouchOutside(false) + + val dismissView = findViewById(R.id.dismissView) + dismissView.setOnClickListener { dismiss() } + + val itemListView = findViewById(R.id.itemListView) + itemListView.adapter = object : BaseAdapter() { + private val inflater = LayoutInflater.from(ctx) + override fun getCount(): Int { + return choiceItems.size + } + + override fun getItem(position: Int): Any { + return choiceItems[position] + } + + override fun getItemId(position: Int): Long { + return position.toLong() + } + + override fun getView(position: Int, convertView: View?, viewGroup: ViewGroup): View { + val view: View + val holder: ItemViewHolder + if (convertView == null) { + holder = ItemViewHolder() + view = inflater.inflate(R.layout.item_choice_dialog, null) + holder.choiceItemView = view.findViewById(R.id.choiceItemView) + view.tag = holder + } else { + view = convertView + holder = view.tag as ItemViewHolder + } + if (position == choiceItems.size - 1) { + holder.choiceItemView.setBackgroundResource(com.pengxh.app.multilib.R.drawable.sheet_item_bottom_selector) + } else { + holder.choiceItemView.setBackgroundResource(com.pengxh.app.multilib.R.drawable.sheet_item_middle_selector) + } + holder.choiceItemView.text = choiceItems[position] + holder.choiceItemView.textSize = 18f + //需要动态设置item的高度 + val param = AbsListView.LayoutParams( + WindowManager.LayoutParams.MATCH_PARENT, + SizeUtil.dp2px(ctx, 46f) + ) + view.layoutParams = param + return view + } + } + itemListView.onItemClickListener = AdapterView.OnItemClickListener { _, _, position, _ -> + clickListener.onItemClick(position) + dismiss() + } + } + + interface OnSingleChoiceClickListener { + fun onItemClick(position: Int) + } + + internal class ItemViewHolder { + lateinit var choiceItemView: TextView + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_down.xml b/app/src/main/res/drawable/ic_down.xml index 20e6476..c6d8b0d 100644 --- a/app/src/main/res/drawable/ic_down.xml +++ b/app/src/main/res/drawable/ic_down.xml @@ -1,6 +1,6 @@ + diff --git a/app/src/main/java/com/casic/qd/smartwell/adapter/NineGridImageAdapter.kt b/app/src/main/java/com/casic/qd/smartwell/adapter/NineGridImageAdapter.kt index f07824e..e016832 100644 --- a/app/src/main/java/com/casic/qd/smartwell/adapter/NineGridImageAdapter.kt +++ b/app/src/main/java/com/casic/qd/smartwell/adapter/NineGridImageAdapter.kt @@ -30,9 +30,14 @@ } fun deleteImage(position: Int) { - if (imageData.size != 0) { - imageData.removeAt(position) - notifyDataSetChanged() + try { + if (imageData.size > position) { + imageData.removeAt(position) + notifyItemRemoved(position) + notifyItemRangeChanged(position, imageData.size) + } + } catch (e: Exception) { + e.printStackTrace() } } diff --git a/app/src/main/java/com/casic/qd/smartwell/adapter/OrderCompletedAdapter.kt b/app/src/main/java/com/casic/qd/smartwell/adapter/OrderCompletedAdapter.kt index f36c15d..6533b92 100644 --- a/app/src/main/java/com/casic/qd/smartwell/adapter/OrderCompletedAdapter.kt +++ b/app/src/main/java/com/casic/qd/smartwell/adapter/OrderCompletedAdapter.kt @@ -43,14 +43,14 @@ val rowsBean = dataRows[position] holder.alarmContentView.text = rowsBean.alarmContentName holder.createTimeView.text = rowsBean.createTime - holder.wellCodeView.text = rowsBean.wellCode - val alarmValue = rowsBean.alarmValue.toString() - if (alarmValue.isBlank()) { - holder.alarmValueView.text = "报警值未知" + holder.wellCodeView.text = String.format("井编号:${rowsBean.wellCode}") + val alarmValue = if (rowsBean.alarmValue.toString().isBlank()) { + "未知" } else { - holder.alarmValueView.text = alarmValue + rowsBean.alarmValue } - holder.wellLocationView.text = rowsBean.position + holder.alarmValueView.text = String.format("告警值:$alarmValue") + holder.wellLocationView.text = String.format("井位置:${rowsBean.position}") holder.currentStateView.text = String.format("${rowsBean.jobStatusName}-${rowsBean.jobBelongTo}") diff --git a/app/src/main/java/com/casic/qd/smartwell/adapter/OrderInHandleAdapter.kt b/app/src/main/java/com/casic/qd/smartwell/adapter/OrderInHandleAdapter.kt index a7fcfa8..74646d6 100644 --- a/app/src/main/java/com/casic/qd/smartwell/adapter/OrderInHandleAdapter.kt +++ b/app/src/main/java/com/casic/qd/smartwell/adapter/OrderInHandleAdapter.kt @@ -42,14 +42,14 @@ val rowsBean = dataRows[position] holder.alarmContentView.text = rowsBean.alarmContentName holder.createTimeView.text = rowsBean.createTime - holder.wellCodeView.text = rowsBean.wellCode - val alarmValue = rowsBean.alarmValue.toString() - if (alarmValue.isBlank()) { - holder.alarmValueView.text = "报警值未知" + holder.wellCodeView.text = String.format("井编号:${rowsBean.wellCode}") + val alarmValue = if (rowsBean.alarmValue.toString().isBlank()) { + "未知" } else { - holder.alarmValueView.text = alarmValue + rowsBean.alarmValue } - holder.wellLocationView.text = rowsBean.position + holder.alarmValueView.text = String.format("告警值:$alarmValue") + holder.wellLocationView.text = String.format("井位置:${rowsBean.position}") holder.currentStateView.text = String.format("${rowsBean.jobStatusName}-${rowsBean.jobBelongTo}") diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt index cd52782..149adf2 100644 --- a/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/String.kt @@ -1,6 +1,8 @@ package com.casic.qd.smartwell.extensions +import android.content.Context import android.graphics.Color +import android.text.TextUtils import android.view.Gravity import android.widget.TextView import android.widget.Toast @@ -8,11 +10,16 @@ import com.casic.qd.smartwell.base.BaseApplication import com.casic.qd.smartwell.model.ErrorMessageModel import com.casic.qd.smartwell.utils.Constant +import com.casic.qd.smartwell.utils.FileUtils +import com.casic.qd.smartwell.utils.OnImageCompressListener import com.casic.qd.smartwell.utils.SaveKeyValues import com.google.gson.Gson import com.google.gson.reflect.TypeToken import com.qmuiteam.qmui.util.QMUIDisplayHelper import org.json.JSONObject +import top.zibin.luban.Luban +import top.zibin.luban.OnCompressListener +import java.io.File import java.text.ParseException import java.text.SimpleDateFormat import java.util.* @@ -108,8 +115,30 @@ fun String.combineImagePath(): String { if (this.isEmpty()) return this val defaultValue = SaveKeyValues.getValue( - Constant.DEFAULT_SERVER_CONFIG, - "http://111.198.10.15:11304" + Constant.DEFAULT_SERVER_CONFIG, Constant.SERVER_BASE_URL ) as String return "$defaultValue/static/${this.replace("\\", "/")}" +} + +fun String.compressImage(context: Context, listener: OnImageCompressListener) { + Luban.with(context) + .load(this) + .ignoreBy(100) + .setTargetDir(FileUtils.compressImageDir) + .filter { path -> + !(TextUtils.isEmpty(path) || path.lowercase(Locale.getDefault()).endsWith(".gif")) + } + .setCompressListener(object : OnCompressListener { + override fun onStart() { + + } + + override fun onSuccess(file: File) { + listener.onSuccess(file) + } + + override fun onError(e: Throwable) { + listener.onError(e) + } + }).launch() } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotProcessedFragment.kt b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotProcessedFragment.kt index 7605a10..a06c5a5 100644 --- a/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotProcessedFragment.kt +++ b/app/src/main/java/com/casic/qd/smartwell/fragment/OrderNotProcessedFragment.kt @@ -111,53 +111,55 @@ private val callback = Handler.Callback { if (it.what == 2022061504) { - notProcessedAdapter.notifyDataSetChanged() - } else { - if (dataBeans.size == 0) { - emptyView!!.showEmptyPage("没有需要您处理的工单") { - pageIndex = 1 - obtainWorkOrderList() - } + if (isRefresh || isLoadMore) { + notProcessedAdapter.notifyDataSetChanged() } else { - emptyView!!.hide() - notProcessedAdapter = OrderNotProcessedAdapter(requireContext(), dataBeans) - notProcessedView!!.layoutManager = LinearLayoutManager(requireContext()) - notProcessedView!!.adapter = notProcessedAdapter - notProcessedAdapter.setOnItemClickListener(object : - OrderNotProcessedAdapter.OnItemClickListener { - override fun onClicked(position: Int) { - val jobId = dataBeans[position].jobId.toString() - if (jobId.isBlank()) { - "工单编号异常,无法查看详情".show() - return - } + if (dataBeans.size == 0) { + emptyView!!.showEmptyPage("没有需要您处理的工单") { + pageIndex = 1 + obtainWorkOrderList() + } + } else { + emptyView!!.hide() + notProcessedAdapter = OrderNotProcessedAdapter(requireContext(), dataBeans) + notProcessedView!!.layoutManager = LinearLayoutManager(requireContext()) + notProcessedView!!.adapter = notProcessedAdapter + notProcessedAdapter.setOnItemClickListener(object : + OrderNotProcessedAdapter.OnItemClickListener { + override fun onClicked(position: Int) { + val jobId = dataBeans[position].jobId.toString() + if (jobId.isBlank()) { + "工单编号异常,无法查看详情".show() + return + } // requireContext().navigatePageTo(jobId) - } + } - override fun onOperationClicked(position: Int) { - AlertControlDialog.Builder() - .setContext(requireContext()) - .setTitle("操作提示") - .setMessage("确定要接单吗") - .setNegativeButton("取消") - .setPositiveButton("确定") - .setOnDialogButtonClickListener(object : - AlertControlDialog.OnDialogButtonClickListener { - override fun onConfirmClick() { - val jobId = dataBeans[position].jobId.toString() - if (jobId.isBlank()) { - "工单ID异常,无法接单".show() - return + override fun onOperationClicked(position: Int) { + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("操作提示") + .setMessage("确定要接单吗") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + val jobId = dataBeans[position].jobId.toString() + if (jobId.isBlank()) { + "工单ID异常,无法接单".show() + return + } + operationViewModel.acceptOrder(jobId) } - operationViewModel.acceptOrder(jobId) - } - override fun onCancelClick() { + override fun onCancelClick() { - } - }).build().show() - } - }) + } + }).build().show() + } + }) + } } } true diff --git a/app/src/main/java/com/casic/qd/smartwell/model/SubordinateModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/SubordinateModel.kt new file mode 100644 index 0000000..3f2b287 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/model/SubordinateModel.kt @@ -0,0 +1,17 @@ +package com.casic.qd.smartwell.model + +class SubordinateModel { + var code = 0 + var data: List? = null + var message: String? = null + var isSuccess = false + + class DataBean { + var account: String? = null + var attr1: String? = null + var deptId: String? = null + var id: String? = null + var name: String? = null + var phone: String? = null + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt index 802ed6b..8b59d0d 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt @@ -8,7 +8,8 @@ val USER_PERMISSIONS = arrayOf( Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS, Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION, - Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE + Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE, + Manifest.permission.FOREGROUND_SERVICE ) const val PERMISSIONS_CODE = 999 @@ -36,6 +37,7 @@ R.color.color_7, R.color.color_8, R.color.color_9 ) + const val SERVER_BASE_URL = "http://111.198.10.15:20104" const val INTENT_PARAM = "intentParam" const val DEFAULT_SERVER_CONFIG = "defaultServerConfig" const val ACCOUNT = "account" diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/FileUtils.kt b/app/src/main/java/com/casic/qd/smartwell/utils/FileUtils.kt index 6b40d2e..c5743d3 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/FileUtils.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/FileUtils.kt @@ -7,9 +7,10 @@ object FileUtils { private val context = BaseApplication.obtainInstance() - val imageCompressPath: String + val compressImageDir: String get() { - val imageDir = File(context.getExternalFilesDir(Environment.DIRECTORY_PICTURES), "") + val imageDir = + File(context.getExternalFilesDir(Environment.DIRECTORY_PICTURES), "CompressImage") if (!imageDir.exists()) { imageDir.mkdir() } diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/OnImageCompressListener.kt b/app/src/main/java/com/casic/qd/smartwell/utils/OnImageCompressListener.kt new file mode 100644 index 0000000..53cbdb1 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/utils/OnImageCompressListener.kt @@ -0,0 +1,15 @@ +package com.casic.qd.smartwell.utils + +import java.io.File + +interface OnImageCompressListener { + /** + * Fired when a compression returns successfully, override to handle in your own code + */ + fun onSuccess(file: File) + + /** + * Fired when a compression fails to complete, override to handle in your own code + */ + fun onError(e: Throwable) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitFactory.kt b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitFactory.kt index 04579cf..2d9a4db 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitFactory.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitFactory.kt @@ -19,8 +19,7 @@ fun createRetrofit(clazz: Class): T { val defaultValue = SaveKeyValues.getValue( - Constant.DEFAULT_SERVER_CONFIG, - "http://111.198.10.15:20104" + Constant.DEFAULT_SERVER_CONFIG, Constant.SERVER_BASE_URL ) as String return Retrofit.Builder() .baseUrl(defaultValue) diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt index e20aa4e..a455056 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt @@ -352,4 +352,32 @@ @Header("token") token: String, @Part file: MultipartBody.Part ): String + + /** + * 查找同一单位下的用户 + * + * @param hasMine 是否包含本人,1包含, 0不包含 + * @param roleTips 角色类型,例:leader,member + */ + @FormUrlEncoded + @POST("/mgr/simplelist") + suspend fun obtainSubordinate( + @Header("token") token: String, + @Field("hasMine") hasMine: String?, + @Field("roleTips") roleTips: String? + ): String + + /** + * 转单 + * + * @param id 工单id + * @param transferPerson 转单人,转给谁 + */ + @FormUrlEncoded + @POST("/job/transferJob") + suspend fun transferWorkOrder( + @Header("token") token: String, + @Field("id") id: String, + @Field("transferPerson") transferPerson: String + ): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt index 8ce0fed..2de85eb 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt @@ -307,9 +307,7 @@ /** * 完成工单 */ - suspend fun completeOrder( - id: String, handleMessage: String, handlePhotos: String - ): String { + suspend fun completeOrder(id: String, handleMessage: String, handlePhotos: String): String { return api.completeOrder( AuthenticationHelper.token!!, id, handleMessage, handlePhotos ) @@ -323,4 +321,18 @@ val imagePart = MultipartBody.Part.createFormData("file", image.name, requestBody) return api.uploadImage(AuthenticationHelper.token!!, imagePart) } + + /** + * 查找同一单位下的用户 + */ + suspend fun obtainSubordinate(hasMine: String?, roleTips: String?): String { + return api.obtainSubordinate(AuthenticationHelper.token!!, hasMine, roleTips) + } + + /** + * 转单 + */ + suspend fun transferWorkOrder(id: String, userId: String): String { + return api.transferWorkOrder(AuthenticationHelper.token!!, id, userId) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/view/OrderCompletedDetailActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/OrderCompletedDetailActivity.kt index 227798b..5ce4b5c 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/OrderCompletedDetailActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/OrderCompletedDetailActivity.kt @@ -88,13 +88,13 @@ } //绑定窨井图片 - if (orderDetail.firstStatePhotos.toString().isBlank()) { + if (orderDetail.handlePhotos.toString().isBlank()) { imageRecyclerView.visibility = View.GONE } else { imageRecyclerView.visibility = View.VISIBLE //处理图片地址 val urls: ArrayList = ArrayList() - val imageArray = orderDetail.firstStatePhotos.toString().split(",") + val imageArray = orderDetail.handlePhotos.toString().split(",") imageArray.forEach { path -> if (path.isNotBlank()) { urls.add(path.combineImagePath()) diff --git a/app/src/main/java/com/casic/qd/smartwell/view/OrderInHandleDetailActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/OrderInHandleDetailActivity.kt index 25f30c1..090003d 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/OrderInHandleDetailActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/OrderInHandleDetailActivity.kt @@ -1,8 +1,11 @@ package com.casic.qd.smartwell.view import android.content.Context +import android.os.CountDownTimer +import android.os.Handler import android.text.Editable import android.text.TextWatcher +import android.util.Log import android.view.View import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.GridLayoutManager @@ -12,9 +15,11 @@ import com.casic.qd.smartwell.base.BaseActivity import com.casic.qd.smartwell.extensions.* import com.casic.qd.smartwell.utils.* +import com.casic.qd.smartwell.vm.AuthenticateViewModel import com.casic.qd.smartwell.vm.OperationViewModel import com.casic.qd.smartwell.vm.UploadImageViewModel import com.casic.qd.smartwell.vm.WorkOrderViewModel +import com.casic.qd.smartwell.widgets.SingleChoiceDialog import com.casic.qd.smartwell.widgets.TimeLineBottomSheet import com.luck.picture.lib.basic.PictureSelector import com.luck.picture.lib.config.SelectMimeType @@ -31,12 +36,13 @@ class OrderInHandleDetailActivity : BaseActivity() { + private val kTag = "OrderInHandleDetailActivity" private lateinit var workOrderViewModel: WorkOrderViewModel private lateinit var uploadImageViewModel: UploadImageViewModel - - // private lateinit var userViewModel: UserViewModel + private lateinit var authenticateViewModel: AuthenticateViewModel private lateinit var operationViewModel: OperationViewModel private lateinit var imageAdapter: NineGridImageAdapter + private lateinit var weakReferenceHandler: WeakReferenceHandler private val context: Context = this@OrderInHandleDetailActivity private val imagePaths: ArrayList = ArrayList() //服务器返回的拍照数据集 private val realPaths: ArrayList = ArrayList() //真实图片路径 @@ -57,9 +63,11 @@ workOrderViewModel = ViewModelProvider(this).get(WorkOrderViewModel::class.java) uploadImageViewModel = ViewModelProvider(this).get(UploadImageViewModel::class.java) -// userViewModel = ViewModelProvider(this).get(UserViewModel::class.java) + authenticateViewModel = ViewModelProvider(this).get(AuthenticateViewModel::class.java) operationViewModel = ViewModelProvider(this).get(OperationViewModel::class.java) + weakReferenceHandler = WeakReferenceHandler(callback) + workOrderViewModel.obtainWorkOrderDetail(jobId) } @@ -164,7 +172,7 @@ confirmPersonView.text = orderDetail.confirmJobPerson - //维护情况 TODO 输入内容长度校验好像没用? + //TODO 维护情况 输入内容长度校验好像没用? sceneEditView.setText(orderDetail.handleMessage) confirmDateView.text = orderDetail.confirmJobTime @@ -186,53 +194,55 @@ transferTipsView.visibility = View.GONE } //转单 -// transferOrderButton.setChangeAlphaWhenPress(true) -// transferOrderButton.setOnClickListener { -// userViewModel.obtainSubordinate("0", "leader,member") -// } -// userViewModel.subordinateModel.observe(this, { subordinate -> -// if (subordinate.code == 200) { -// val roleArray: ArrayList = ArrayList() //下级流转人员集合 -// subordinate.data?.forEach { dataBean -> -// roleArray.add(dataBean.name.toString()) -// } -// SingleChoiceDialog.Builder() -// .setContext(this) -// .setChoiceItemTitles(roleArray) -// .setOnSingleChoiceClickListener(object : -// SingleChoiceDialog.OnSingleChoiceClickListener { -// override fun onItemClick(position: Int) { -// val personBean = subordinate.data!![position] -// AlertControlDialog.Builder() -// .setContext(context) -// .setTitle("操作提示") -// .setMessage("确定要转单吗") -// .setNegativeButton("取消") -// .setPositiveButton("确定") -// .setOnDialogButtonClickListener(object : -// AlertControlDialog.OnDialogButtonClickListener { -// override fun onConfirmClick() { -// val orderId = orderDetail.jobId.toString() -// if (orderId.isBlank()) { -// "工单ID异常,无法转单".show() -// return -// } -// operationViewModel.transferWorkOrder( -// id = orderId, userId = personBean.id!! -// ) -// } -// -// override fun onCancelClick() { -// -// } -// }).build().show() -// } -// }).build().show() -// } -// }) + transferOrderButton.setOnClickListener { + authenticateViewModel.obtainSubordinate("0", "leader,member") + } + authenticateViewModel.subordinateModel.observe(this, { subordinate -> + if (subordinate.code == 200) { + if (subordinate.data!!.isEmpty()) { + "无下级转单人员,无法转单".show() + } else { + val roleArray: ArrayList = ArrayList() //下级流转人员集合 + subordinate.data?.forEach { dataBean -> + roleArray.add(dataBean.name.toString()) + } + SingleChoiceDialog.Builder() + .setContext(this) + .setChoiceItemTitles(roleArray) + .setOnSingleChoiceClickListener(object : + SingleChoiceDialog.OnSingleChoiceClickListener { + override fun onItemClick(position: Int) { + val personBean = subordinate.data!![position] + AlertControlDialog.Builder() + .setContext(context) + .setTitle("操作提示") + .setMessage("确定要转单吗") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + val orderId = orderDetail.jobId.toString() + if (orderId.isBlank()) { + "工单ID异常,无法转单".show() + return + } + operationViewModel.transferWorkOrder( + orderId, personBean.id!! + ) + } + + override fun onCancelClick() { + + } + }).build().show() + } + }).build().show() + } + } + }) //提交工单处理 - submitButton.setChangeAlphaWhenPress(true) submitButton.setOnClickListener { val orderId = orderDetail.jobId.toString() if (orderId.isBlank()) { @@ -314,7 +324,7 @@ imagePaths.add(url) realPaths.add(url.combineImagePath()) } - imageAdapter.setupImage(images = realPaths) + imageAdapter.setupImage(realPaths) } else { "最多只能上传3张图片".show() } @@ -325,26 +335,26 @@ }) //转单状态处理 -// operationViewModel.loadState.observe(this, { -// when (it) { -// is LoadState.Loading -> { -// DialogHelper.showLoadingDialog(this, "转单中,请稍后") -// } -// is LoadState.Success -> { -// DialogHelper.dismissLoadingDialog() -// /** -// * 转单需要刷新处理中和超时未处理的列表 -// * */ + operationViewModel.loadState.observe(this, { + when (it) { + is LoadState.Loading -> { + DialogHelper.showLoadingDialog(this, "转单中,请稍后") + } + is LoadState.Success -> { + DialogHelper.dismissLoadingDialog() + /** + * 转单需要刷新处理中和超时未处理的列表 + * */ // BroadcastReceiverManager.instance.sendMultiBroadcast( // Constant.IN_HANDLE_ACTION, Constant.NOT_HANDLE_ACTION // ) -// this.finish() -// } -// else -> { -// DialogHelper.dismissLoadingDialog() -// } -// } -// }) + this.finish() + } + else -> { + DialogHelper.dismissLoadingDialog() + } + } + }) //处理完成工单状态处理 operationViewModel.loadState.observe(this, { @@ -380,9 +390,11 @@ .openCamera(SelectMimeType.ofImage()) .forResult(object : OnResultCallbackListener { override fun onResult(result: ArrayList?) { - val cameraResult = result?.get(0) - //上传图片 -// uploadImageViewModel.uploadImage(File(cameraResult)) + if (result == null) { + "拍照保存失败,请重试".show() + return + } + analyticalSelectResults(result[0]) } override fun onCancel() { @@ -393,15 +405,34 @@ 1 -> { PictureSelector.create(this) .openGallery(SelectMimeType.ofImage()) + .isGif(false) + .isMaxSelectEnabledMask(true) + .setFilterMinFileSize(100) + .setMaxSelectNum(3) + .isDisplayCamera(false) .setImageEngine(GlideLoadEngine.instance) .forResult(object : OnResultCallbackListener { override fun onResult(result: ArrayList?) { showLoadingDialog(context, "图片上传中,请稍后...") - result?.forEach { - val file = File(it.compressPath) - //上传图片 -// uploadImageViewModel.uploadImage(image = file) + if (result == null) { + "选择照片失败,请重试".show() + return } + // 线程控制图片压缩上传过程,防止速度过快导致压缩失败 + val sum = (result.size * 500).toLong() + object : CountDownTimer(sum, 500) { + override fun onTick(millisUntilFinished: Long) { + val i = millisUntilFinished / 500 + val message = weakReferenceHandler.obtainMessage() + message.obj = result[i.toInt()] + message.what = 2022061701 + weakReferenceHandler.handleMessage(message) + } + + override fun onFinish() { + + } + }.start() } override fun onCancel() { @@ -413,6 +444,37 @@ }.build().show() } + private val callback = Handler.Callback { + if (it.what == 2022061701) { + analyticalSelectResults(it.obj as LocalMedia) + } + true + } + + private fun analyticalSelectResults(result: LocalMedia) { + //压缩图片 +// val realPath = if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) { +// result.realPath +// } else { +// result.sandboxPath +// } +// Log.d(kTag, "初始路径:" + result.path) +// Log.d(kTag, "绝对路径:" + result.realPath) +// Log.d(kTag, "原图路径:" + result.originalPath) +// Log.d(kTag, "沙盒路径:" + result.sandboxPath) + result.realPath.compressImage(context, object : OnImageCompressListener { + override fun onSuccess(file: File) { + Log.d(kTag, "onSuccess: " + file.absolutePath) + //上传图片 + uploadImageViewModel.uploadImage(file) + } + + override fun onError(e: Throwable) { + e.printStackTrace() + } + }) + } + private var loadingDialog: QMUITipDialog? = null fun showLoadingDialog(context: Context?, message: String?) { diff --git a/app/src/main/java/com/casic/qd/smartwell/view/OrderSearchResultActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/OrderSearchResultActivity.kt index 659e64a..085ff5a 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/OrderSearchResultActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/OrderSearchResultActivity.kt @@ -193,7 +193,7 @@ "工单ID异常,无法接单".show() return } - operationViewModel.acceptWorkOrder(jobId) + operationViewModel.acceptOrder(jobId) } override fun onCancelClick() { diff --git a/app/src/main/java/com/casic/qd/smartwell/vm/AuthenticateViewModel.kt b/app/src/main/java/com/casic/qd/smartwell/vm/AuthenticateViewModel.kt index 3aaa8a7..a416f02 100644 --- a/app/src/main/java/com/casic/qd/smartwell/vm/AuthenticateViewModel.kt +++ b/app/src/main/java/com/casic/qd/smartwell/vm/AuthenticateViewModel.kt @@ -5,6 +5,7 @@ import com.casic.qd.smartwell.extensions.* import com.casic.qd.smartwell.model.OwnerShipModel import com.casic.qd.smartwell.model.PublicKeyModel +import com.casic.qd.smartwell.model.SubordinateModel import com.casic.qd.smartwell.utils.Constant import com.casic.qd.smartwell.utils.LoadState import com.casic.qd.smartwell.utils.SaveKeyValues @@ -18,6 +19,7 @@ private val gson = Gson() val keyModel = MutableLiveData() val resultModel = MutableLiveData() + val subordinateModel = MutableLiveData() fun obtainPublicKey() = launch({ loadState.value = LoadState.Loading @@ -62,4 +64,21 @@ }, { it.printStackTrace() }) + + /** + * 转单下一级人员 + * */ + fun obtainSubordinate(hasMine: String?, roleTips: String?) = launch({ + val response = RetrofitServiceManager.obtainSubordinate(hasMine, roleTips) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + subordinateModel.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/qd/smartwell/vm/OperationViewModel.kt b/app/src/main/java/com/casic/qd/smartwell/vm/OperationViewModel.kt index 03fe6e6..ca8de57 100644 --- a/app/src/main/java/com/casic/qd/smartwell/vm/OperationViewModel.kt +++ b/app/src/main/java/com/casic/qd/smartwell/vm/OperationViewModel.kt @@ -49,21 +49,21 @@ // it.printStackTrace() // }) // -// fun transferWorkOrder(id: String, userId: String) = launch({ -// loadState.value = LoadState.Loading -// val response = RetrofitServiceManager.transferWorkOrder(id, userId) -// val responseCode = response.separateResponseCode() -// if (responseCode == 200) { -// loadState.value = LoadState.Success -// "转单成功".show() -// } else { -// loadState.value = LoadState.Fail -// response.toErrorMessage().show() -// } -// }, { -// loadState.value = LoadState.Fail -// it.printStackTrace() -// }) +fun transferWorkOrder(id: String, userId: String) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.transferWorkOrder(id, userId) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + "转单成功".show() + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show() + } +}, { + loadState.value = LoadState.Fail + it.printStackTrace() +}) fun completeOrder(id: String, handleMessage: String, handlePhotos: String) = launch({ loadState.value = LoadState.Loading diff --git a/app/src/main/java/com/casic/qd/smartwell/widgets/SingleChoiceDialog.kt b/app/src/main/java/com/casic/qd/smartwell/widgets/SingleChoiceDialog.kt new file mode 100644 index 0000000..b3071c7 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/widgets/SingleChoiceDialog.kt @@ -0,0 +1,111 @@ +package com.casic.qd.smartwell.widgets + +import android.app.Dialog +import android.content.Context +import android.os.Bundle +import android.view.* +import android.widget.* +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.extensions.initDialogLayoutParams +import com.pengxh.app.multilib.utils.SizeUtil +import java.util.* + +class SingleChoiceDialog private constructor(builder: Builder) : Dialog( + builder.context, R.style.UserDefinedDialogStyle +) { + private val ctx: Context = builder.context + private val choiceItems: ArrayList = builder.actionItems + private val clickListener: OnSingleChoiceClickListener = builder.listener + + class Builder { + lateinit var context: Context + lateinit var actionItems: ArrayList + lateinit var listener: OnSingleChoiceClickListener + + fun setContext(context: Context): Builder { + this.context = context + return this + } + + fun setChoiceItemTitles(items: ArrayList): Builder { + actionItems = items + return this + } + + fun setOnSingleChoiceClickListener(listener: OnSingleChoiceClickListener): Builder { + this.listener = listener + return this + } + + fun build(): SingleChoiceDialog { + return SingleChoiceDialog(this) + } + } + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + this.initDialogLayoutParams(Gravity.CENTER, R.style.UserDefinedAnimation, 0.75f) + this.setContentView(R.layout.dialog_single_choice) + this.setCancelable(false) + this.setCanceledOnTouchOutside(false) + + val dismissView = findViewById(R.id.dismissView) + dismissView.setOnClickListener { dismiss() } + + val itemListView = findViewById(R.id.itemListView) + itemListView.adapter = object : BaseAdapter() { + private val inflater = LayoutInflater.from(ctx) + override fun getCount(): Int { + return choiceItems.size + } + + override fun getItem(position: Int): Any { + return choiceItems[position] + } + + override fun getItemId(position: Int): Long { + return position.toLong() + } + + override fun getView(position: Int, convertView: View?, viewGroup: ViewGroup): View { + val view: View + val holder: ItemViewHolder + if (convertView == null) { + holder = ItemViewHolder() + view = inflater.inflate(R.layout.item_choice_dialog, null) + holder.choiceItemView = view.findViewById(R.id.choiceItemView) + view.tag = holder + } else { + view = convertView + holder = view.tag as ItemViewHolder + } + if (position == choiceItems.size - 1) { + holder.choiceItemView.setBackgroundResource(com.pengxh.app.multilib.R.drawable.sheet_item_bottom_selector) + } else { + holder.choiceItemView.setBackgroundResource(com.pengxh.app.multilib.R.drawable.sheet_item_middle_selector) + } + holder.choiceItemView.text = choiceItems[position] + holder.choiceItemView.textSize = 18f + //需要动态设置item的高度 + val param = AbsListView.LayoutParams( + WindowManager.LayoutParams.MATCH_PARENT, + SizeUtil.dp2px(ctx, 46f) + ) + view.layoutParams = param + return view + } + } + itemListView.onItemClickListener = AdapterView.OnItemClickListener { _, _, position, _ -> + clickListener.onItemClick(position) + dismiss() + } + } + + interface OnSingleChoiceClickListener { + fun onItemClick(position: Int) + } + + internal class ItemViewHolder { + lateinit var choiceItemView: TextView + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_down.xml b/app/src/main/res/drawable/ic_down.xml index 20e6476..c6d8b0d 100644 --- a/app/src/main/res/drawable/ic_down.xml +++ b/app/src/main/res/drawable/ic_down.xml @@ -1,6 +1,6 @@ - - - + +