Browse Source

临时版本

不会爬树的猴 1 year ago
parent
commit
b2fd76ba46

+ 12 - 0
.idea/deploymentTargetDropDown.xml

@@ -1,6 +1,18 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <project version="4">
   <component name="deploymentTargetDropDown">
+    <runningDeviceTargetSelectedWithDropDown>
+      <Target>
+        <type value="RUNNING_DEVICE_TARGET" />
+        <deviceKey>
+          <Key>
+            <type value="SERIAL_NUMBER" />
+            <value value="10.88.88.112:5555" />
+          </Key>
+        </deviceKey>
+      </Target>
+    </runningDeviceTargetSelectedWithDropDown>
+    <timeTargetWasSelectedWithDropDown value="2023-09-01T00:33:47.138494Z" />
     <runningDeviceTargetsSelectedWithDialog>
       <Target>
         <type value="RUNNING_DEVICE_TARGET" />

+ 4 - 4
app/src/main/java/com/cr/adapter/DownloadDataAdapter.kt

@@ -107,13 +107,13 @@ class DownloadDataAdapter @JvmOverloads constructor(
                     }
 
                     // todo: 2023/4/12 下载进度
-                    override fun onProgress(progress: Int, total: Int) {
-                        holder.progressBar?.max = total
-                        holder.progressBar?.progress = progress
+                    override fun onProgress(progress: Long, total: Long) {
+                        holder.progressBar?.max = total.toInt()
+                        holder.progressBar?.progress = progress.toInt()
                     }
 
                     // todo: 2023/4/12 下载完成
-                    override fun onComplete() {
+                    override fun onSuccess(message:String) {
                         holder.model?.isDownload = CrFileManager.isExists(fullName)
                         holder.lblIsDownload?.text = if (holder.model!!.isDownload) "已下载" else "未下载"
                         holder.lblIsDownload?.setTextColor(

+ 3 - 1
app/src/main/java/com/cr/common/ClassManager.java

@@ -48,7 +48,9 @@ public class ClassManager {
                 if(cls == String.class){
                     fldValue = (String)field.get(object);
                     jsonObj.put(fldName,fldValue);
-                }else if(cls.isEnum()){
+                }else if(cls == double.class){
+                    jsonObj.put(fldName,(double)field.get(object));
+                } else if(cls.isEnum()){
                     Object obj = field.get(object);
                 }else if(iNetDataModel.class.isAssignableFrom(cls)){
                     iNetDataModel model = (iNetDataModel) field.get(object);

+ 3 - 0
app/src/main/java/com/cr/cruav/AvLogin.kt

@@ -78,6 +78,9 @@ class AvLogin : CrActivity(), OnClickListener {
         checkAndRequestPermissions()
         // todo: 2023/4/3 订阅事件
         CrApplication.getEventBus().register(this)
+        // todo: 2023/8/14 此语句非常重要 需要创建一个静态的Context,且该上下文可以用于创建对话框
+        // todo: 2023/8/14 如果AvMain窗体关闭,则在窗体中继续执行该方法
+        CrApplication.setContext(this)
     }
 
     /**

+ 8 - 0
app/src/main/java/com/cr/map/CaseLocalPolygonModel.kt

@@ -24,4 +24,12 @@ class CaseLocalPolygonModel {
         this.coords = ""
         this.type = FragmentMap.FIELD_CASE_POLYGON_BZ_VALUE_NO
     }
+
+    /**
+     * 重写转换为字符串
+     * @return String
+     */
+    override fun toString(): String {
+        return "名称:${this.name} 面积:${this.area} 坐标串:${this.coords}"
+    }
 }

+ 3 - 3
app/src/main/java/com/cr/map/CaseModel.kt

@@ -22,7 +22,7 @@ class CaseModel {
     var caseType: CaseType? = CaseType.Non // define: 2023/6/12 案件点类型
     var joinPolygon: CaseLocalPolygonModel? = null // define: 2023/6/12 关联的案件图斑
     var isCheck: Boolean? = false // define: 2023/6/12 是否已选中
-    var joinNetCaseAJHArray: List<String>? = null // define: 2023/6/12 关联的网络案件号数组
+    var joinNetCaseAJHArray: MutableList<String>? = null // define: 2023/6/12 关联的网络案件号数组
 
     /**
      * 默认初始化
@@ -39,8 +39,8 @@ class CaseModel {
         this.isCheck = false
         this.caseType = CaseType.Non
         this.joinPolygon = CaseLocalPolygonModel()
-        this.joinNetCaseAJHArray = ArrayList()
-        this.imgArray = ArrayList()
+        this.joinNetCaseAJHArray = mutableListOf()
+        this.imgArray = mutableListOf()
         this.date = CrUnitManager.toSystemYMDHMSDate()
     }
 

+ 1 - 1
app/src/main/java/com/cr/models/CompletionModel.kt

@@ -16,7 +16,7 @@ class CompletionModel<T> {
      * @param message String
      * @constructor
      */
-    constructor(isSuccess:Boolean,message:T){
+    constructor(isSuccess:Boolean,message:T?){
         this.isSuccess = isSuccess
         this.result = message
     }

+ 45 - 0
app/src/main/java/com/cr/models/SubmitCaseModel.kt

@@ -0,0 +1,45 @@
+package com.cr.models
+
+import com.cr.common.ClassManager
+import org.json.JSONObject
+
+/**
+ * 操作系统:MAC系统
+ * 创建者:王成
+ * 创建日期:2023/9/1 09:38
+ * 描述:上传案件模型
+ */
+class SubmitCaseModel @JvmOverloads constructor(
+    userId:String,
+) :iNetDataModel<SubmitCaseModel>{
+    var userId:String = "" // define: 2023/9/1 上报用户
+    var name:String = "" // define: 2023/9/1 案件名称Id
+    var longitude:Double = 0.0 // define: 2023/9/1 经度
+    var latitude:Double = 0.0 // define: 2023/9/1 纬度
+    var altitude:Double = 0.0 // define: 2023/9/1 高度
+    var angle:Double = 0.0 // define: 2023/9/1 角度
+    var joinPolygon:String = "" // define: 2023/9/1 关联的案件图斑坐标串
+    var joinCaseId:String = "" // define: 2023/9/1 关联的案件Id
+    var caseDesc:String = "" // define: 2023/9/1 上报描述信息
+    var caseType:String = "" // define: 2023/9/1 案件类型
+    var caseArea:String = "" // define: 2023/9/1 案件面积
+    var submitType:String = "" // define: 2023/9/1 上报类型 add或者upp
+    var constructProgress:String = ""  // define: 2023/9/1 建设程度
+    var submitImages:String = ""  // define: 2023/9/1 上报照片名称
+
+    /**
+     * 初始化
+     */
+    init {
+        this.userId = userId
+    }
+
+    /**
+     * 转换为JSON字符串
+     * @return String
+     */
+    override fun toJSON(): String {
+        var jsonObj: JSONObject = ClassManager.fieldsToJSONObject(this)
+        return jsonObj.toString()
+    }
+}

+ 188 - 0
app/src/main/java/com/cr/network/CrProgressMultipartRequestBody.kt

@@ -0,0 +1,188 @@
+package com.cr.network
+
+import com.cr.data.CrUtil
+import okhttp3.Headers
+import okhttp3.MediaType
+import okhttp3.MultipartBody
+import okhttp3.MultipartBody.Companion.ALTERNATIVE
+import okhttp3.MultipartBody.Companion.DIGEST
+import okhttp3.MultipartBody.Companion.FORM
+import okhttp3.MultipartBody.Companion.MIXED
+import okhttp3.MultipartBody.Companion.PARALLEL
+import okhttp3.RequestBody
+import okhttp3.internal.toImmutableList
+import okio.*
+import okio.ByteString.Companion.encodeUtf8
+import java.util.*
+import kotlin.jvm.JvmOverloads
+
+/**
+ * 操作系统:MAC系统
+ * 创建者:王成
+ * 创建日期:2023/8/28 14:55
+ * 描述:多内容上传body
+ */
+class CrProgressMultipartRequestBody @JvmOverloads constructor(
+    requestBody: MultipartBody,
+    listener:ICallback?= null
+) : RequestBody(){
+    /**
+     * 进度接口
+     */
+    interface ICallback{
+        // todo: 2023/8/28 进度回调
+        fun onProgress(currentBytes:Long,totalBytes:Long)
+
+        // todo: 2023/8/28 错误回调
+        fun onFailed(error:String)
+    }
+
+    private var requestBody:MultipartBody?= null // define: 2023/8/28 body定义
+    private var listener:ICallback?= null // define: 2023/8/28 回调监听
+    private var bufferedSink:BufferedSink?= null // define: 2023/8/28 sink缓冲区
+
+    private var bytesWritten:Long = 0  // define: 2023/8/28 写入长度
+    private var contentLength:Long = 0 // define: 2023/8/28 总长度
+
+    /**
+     * 初始化
+     */
+    init {
+        this.requestBody = requestBody
+        this.listener = listener
+        this.contentLength = this.requestBody!!.contentLength()
+    }
+
+    /**
+     * 覆写 获取内容长度
+     * @return MediaType?
+     */
+    override fun contentType(): MediaType? {
+        return requestBody?.contentType()
+    }
+
+    /**
+     * 覆写 获取内容长度
+     * @return Long
+     */
+    override fun contentLength(): Long {
+        return requestBody!!.contentLength()
+    }
+
+    /**
+     * 覆写 写入内容
+     * @param sink BufferedSink
+     */
+    override fun writeTo(sink: BufferedSink) {
+        if(bufferedSink == null){
+            bufferedSink = ProgressBufferSink(sink).buffer()
+        }
+        requestBody?.writeTo(bufferedSink!!)
+        bufferedSink?.flush()
+    }
+
+    /**
+     * 内部类 注意 不是嵌套类 内部类需要使用inner限制
+     * @constructor
+     */
+    inner class ProgressBufferSink @JvmOverloads constructor(
+        delegate:Sink
+    ) : ForwardingSink(delegate) {
+        /**
+         * 覆写 写入方法
+         * @param source Buffer
+         * @param byteCount Long
+         */
+        override fun write(source: Buffer, byteCount: Long) {
+            super.write(source, byteCount)
+            bytesWritten += byteCount
+            listener?.onProgress(bytesWritten,contentLength)
+        }
+    }
+
+    class Builder @JvmOverloads constructor() {
+        private var type = MIXED
+        private val parts = mutableListOf<MultipartBody.Part>()
+        private var listener:ICallback?= null
+
+        /**
+         * 设置类型
+         * @param type MediaType 类型
+         * @return Builder
+         */
+        fun setType(type: MediaType) = apply {
+            this.type = type
+        }
+
+        /**
+         * 添加body部分
+         * @param body RequestBody body
+         * @return Builder
+         */
+        fun addPart(body: RequestBody) = apply {
+            addPart(MultipartBody.Part.create(body))
+        }
+
+        /**
+         * 添加body部分
+         * @param headers Headers? 头部
+         * @param body RequestBody 体
+         * @return Builder
+         */
+        fun addPart(headers: Headers?, body: RequestBody) = apply {
+            addPart(MultipartBody.Part.create(headers, body))
+        }
+
+        /**
+         * 添加数据
+         * @param name String 数据名称
+         * @param value String 数据内容
+         * @return Builder
+         */
+        fun addFormDataPart(name: String, value: String) = apply {
+            addPart(MultipartBody.Part.createFormData(name, value))
+        }
+
+        /**
+         * 添加文件数据
+         * @param name String 数据名称
+         * @param filename String? 文件名称
+         * @param body RequestBody 体
+         * @return Builder
+         */
+        fun addFormDataPart(name: String, filename: String?, body: RequestBody) = apply {
+            addPart(MultipartBody.Part.createFormData(name, filename, body))
+        }
+
+        /**
+         * 添加body部分
+         * @param part Part 部分
+         * @return Builder
+         */
+        private fun addPart(part: MultipartBody.Part) = apply {
+            parts.add(part)
+            return this
+        }
+
+        /**
+         * 添加监听
+         * @param listener ICallback? 监听
+         */
+        fun addListener(listener: ICallback?){
+            this.listener = listener
+        }
+
+        /**
+         * 编译
+         * @return MultipartBody
+         */
+        fun build(): CrProgressMultipartRequestBody {
+            check(parts.isNotEmpty()) { "Multipart body must have at least one part." }
+            var builder = MultipartBody.Builder().setType(type)
+            for (part in parts){
+                builder.addPart(part)
+            }
+            return CrProgressMultipartRequestBody(builder.build(),listener)
+        }
+    }
+}

+ 1 - 0
app/src/main/java/com/cr/network/CrProgressRequestBody.kt

@@ -1,5 +1,6 @@
 package com.cr.network
 
+import com.cr.data.CrUtil
 import okhttp3.MediaType
 import okhttp3.RequestBody
 import okio.*

+ 103 - 63
app/src/main/java/com/cr/network/TCPDataTask.kt

@@ -33,9 +33,6 @@ class TCPDataTask {
     val PROGRESS_SHOW: Int = 1001
     val PROGRESS_CLOSE: Int = 1002
     val SHOW_MESSAGE: Int = 1003
-    var DOWNLOAD_ERROR: Int = 1004
-    var DOWNLOAD_PROGRESS: Int = 1005
-    var DOWNLOAD_COMPLETE: Int = 1006
 
     // define: 2023/4/10 定义变量
     var context: Context? = null
@@ -79,14 +76,15 @@ class TCPDataTask {
         fun onFailed(message: String)
 
         // todo: 2023/4/12 下载进度
-        fun onProgress(progress: Int, total: Int)
+        fun onProgress(progress: Long, total: Long)
 
         // todo: 2023/4/12 下载完成
-        fun onComplete()
+        fun onSuccess(message: String)
     }
 
     // todo: 2023/4/8 网络连接
     var okHttp: OkHttpClient? = null
+    var okHttpBuilder: OkHttpClient.Builder? = null
 
     /**
      * 单例方法
@@ -104,32 +102,15 @@ class TCPDataTask {
      * @constructor
      */
     constructor() {
-        /**
-         * 初始化连接
-         */
-        okHttp = OkHttpClient.Builder()
-            .connectTimeout(6 * 1000, TimeUnit.MILLISECONDS)
-            .readTimeout(6 * 1000, TimeUnit.MILLISECONDS)
-            .writeTimeout(6 * 1000, TimeUnit.MILLISECONDS)
-            .addNetworkInterceptor(interceptor).build()
+        // todo: 2023/8/28 初始化连接编辑器
+        okHttpBuilder = OkHttpClient.Builder()
+        okHttpBuilder?.connectTimeout(6 * 1000, TimeUnit.MILLISECONDS)
+        okHttpBuilder?.readTimeout(6 * 1000, TimeUnit.MILLISECONDS)
+        okHttpBuilder?.writeTimeout(6 * 1000, TimeUnit.MILLISECONDS)
+        // todo: 2023/8/28 初始化网络连接器
+        okHttp = okHttpBuilder?.build()
     }
 
-    /**
-     * 创建拦截器
-     */
-    private val interceptor = object :Interceptor{
-        // todo: 2023/8/26 拦截器监听
-        override fun intercept(chain: Interceptor.Chain): Response {
-            var originalRequest = chain.request()
-            if(originalRequest.body == null){
-                return chain.proceed(originalRequest)
-            }
-            var progressRequest = originalRequest.newBuilder()
-                .method(originalRequest.method,CrProgressRequestBody(originalRequest.body!!))
-                .build()
-            return chain.proceed(progressRequest)
-        }
-    }
 
     /**
      * 显示等待框
@@ -253,7 +234,7 @@ class TCPDataTask {
             override fun onFailure(call: Call, e: IOException) {
                 handler.post(Runnable {
                     if (callBack != null) {
-                        callBack.onComplete()
+                        callBack.onSuccess("")
                         callBack.onFailed(e.message!!)
                     }
                 })
@@ -277,9 +258,9 @@ class TCPDataTask {
                         if (len == -1) break
                         fos.write(buf, 0, len)
                         sum += len
-                        handler.post(Runnable {
-                            if (callBack != null) callBack.onProgress(sum.toInt(), total.toInt())
-                        })
+                        handler.post {
+                            if (callBack != null) callBack.onProgress(sum, total)
+                        }
                     }
                     fos.flush()
                 } catch (e: IOException) {
@@ -290,7 +271,7 @@ class TCPDataTask {
                     inputStream!!.close()
                     fos!!.close()
                     handler.post(Runnable {
-                        if (callBack != null) callBack.onComplete()
+                        if (callBack != null) callBack.onSuccess("")
                     })
                 }
             }
@@ -298,29 +279,55 @@ class TCPDataTask {
         })
     }
 
+    /**
+     * 上传文件及文字内容
+     * @param context Context 上下文
+     * @param url String 接口地址
+     * @param filePathList List<String> 文件路径数据集
+     * @param iModel iNetDataModel<T> 文字内容
+     * @param callback IProgressCallback? 回调
+     */
     fun <T> sendUploadFiles(
         context: Context,
-        url:String,
+        url: String,
         filePathList: List<String>,
         iModel: iNetDataModel<T>,
-        callback:IProgressCallback?
+        callback: IProgressCallback?
     ) {
+        // todo: 2023/8/28 开始回调
+        callback?.onStart()
         // todo: 2023/8/26 设置媒体格式
         val mediaType = "application/form-data;charset=utf-8".toMediaType()
         // todo: 2023/8/26 创建数据body
         var dataBody: RequestBody = iModel.toJSON().toRequestBody(mediaType)
         // todo: 2023/8/26 创建body
-        var requestBodyBuilder = MultipartBody.Builder().setType(MultipartBody.FORM)
-            //.addFormDataPart("data", "", dataBody)
+        var requestBodyBuilder =
+            CrProgressMultipartRequestBody.Builder().setType(MultipartBody.FORM)
+        //.addFormDataPart("data", "", dataBody)
+        // todo: 2023/8/28 添加进度监听
+        requestBodyBuilder.addListener(object : CrProgressMultipartRequestBody.ICallback {
+            // todo: 2023/8/28 进度
+            override fun onProgress(currentBytes: Long, totalBytes: Long) {
+                handler.post { callback?.onProgress(currentBytes, totalBytes) }
+            }
+
+            // todo: 2023/8/28 错误
+            override fun onFailed(error: String) {
+                handler.post { callback?.onFailed(error) }
+            }
+
+        })
         // todo: 2023/8/26 添加文件
-        for (filePath in filePathList){
+        for (filePath in filePathList) {
             val file = File(filePath)
-            requestBodyBuilder.addFormDataPart("files",file.name, file.asRequestBody(mediaType))
+            requestBodyBuilder.addFormDataPart("files", file.name, file.asRequestBody(mediaType))
         }
+        // todo: 2023/9/1 添加文字信息
+        requestBodyBuilder.addFormDataPart("data", iModel.toJSON());
         // todo: 2023/8/26 创建执行体
         var requestBody = requestBodyBuilder.build()
         var request = Request.Builder().url(url).post(requestBody).build()
-        okHttp?.newCall(request)?.enqueue(object:Callback{
+        okHttp?.newCall(request)?.enqueue(object : Callback {
             // todo: 2023/8/26 执行失败
             override fun onFailure(call: Call, e: IOException) {
                 handler.post(Runnable {
@@ -330,7 +337,36 @@ class TCPDataTask {
 
             // todo: 2023/8/26 执行结果
             override fun onResponse(call: Call, response: Response) {
+                if (response.code == 200) {
+                    try {
+                        var successMessage: String = response.body!!.string()
+                        checkJSON(successMessage, object : IChangeCallback {
+                            // todo: 2023/8/28 解析成功
+                            override fun onSuccess(jsonArray: JSONArray) {
+                                var objResult = jsonArray.getJSONObject(0).optString(RES_ERR_CODE)
+                                if (objResult == "1002") {
+                                    callback?.onFailed(
+                                        jsonArray.getJSONObject(0).optString(RES_ERR_DES)
+                                    )
+                                } else {
+                                    callback?.onSuccess(
+                                        jsonArray.getJSONObject(0).optString(RES_ERR_DES)
+                                    )
+                                }
+                            }
 
+                            // todo: 2023/8/28 解析失败
+                            override fun onFailed(message: String) {
+                                callback?.onFailed(message)
+                            }
+
+                        })
+                    } catch (e: java.lang.Exception) {
+                        callback?.onFailed(e.message!!)
+                    }
+                } else {
+                    callback?.onFailed("服务器连接异常!")
+                }
             }
         })
     }
@@ -340,33 +376,37 @@ class TCPDataTask {
      * @param JSON String JSON字符串
      * @param callback OnChangeListener
      */
-    private fun checkJSON(JSON: String, callback: IChangeCallback) {
+    private fun checkJSON(JSON: String, callback: IChangeCallback?) {
         val jsonObject: JSONObject
         try {
             jsonObject = JSONObject(JSON)
-            val res = jsonObject.optString(RES_HEAD)
-            if (res == RES_ERR_FLAG) {
-                // todo: 2023/4/10 服务器返回错误消息
-                val resObj = jsonObject.getJSONArray(RES_CONTENT)
-                if (callback != null) callback.onFailed(
-                    resObj.getJSONObject(0).optString(RES_ERR_DES)
-                )
-            } else if (res == RES_NULL_FLAG) {
-                // todo: 2023/4/10 未获取到任何服务条件的数据
-                val resObj = jsonObject.getJSONArray(RES_CONTENT)
-                if (callback != null) callback.onFailed(
-                    resObj.getJSONObject(0).optString(RES_ERR_DES)
-                )
-            } else if (res == RES_SUCCESS_FLAG) {
-                // todo: 2023/4/10 正确返回
-                val resObj = jsonObject.getJSONArray(RES_CONTENT)
-                if (callback != null) callback.onSuccess(resObj)
-            } else {
-                // todo: 2023/4/10 服务器返回类型未知
-                if (callback != null) callback.onFailed("服务器返回数据错误!")
+            when (jsonObject.optString(RES_HEAD)) {
+                RES_ERR_FLAG -> {
+                    // todo: 2023/4/10 服务器返回错误消息
+                    val resObj = jsonObject.getJSONArray(RES_CONTENT)
+                    callback?.onFailed(
+                        resObj.getJSONObject(0).optString(RES_ERR_DES)
+                    )
+                }
+                RES_NULL_FLAG -> {
+                    // todo: 2023/4/10 未获取到任何服务条件的数据
+                    val resObj = jsonObject.getJSONArray(RES_CONTENT)
+                    callback?.onFailed(
+                        resObj.getJSONObject(0).optString(RES_ERR_DES)
+                    )
+                }
+                RES_SUCCESS_FLAG -> {
+                    // todo: 2023/4/10 正确返回
+                    val resObj = jsonObject.getJSONArray(RES_CONTENT)
+                    callback?.onSuccess(resObj)
+                }
+                else -> {
+                    // todo: 2023/4/10 服务器返回类型未知
+                    callback?.onFailed("服务器返回数据错误!")
+                }
             }
         } catch (ex: JSONException) {
-            if (callback != null) callback.onFailed("数据解析错误!")
+            callback?.onFailed("数据解析错误!")
         }
     }
 }

+ 111 - 3
app/src/main/java/com/cr/pages/FragmentMap.kt

@@ -41,8 +41,8 @@ import kotlinx.coroutines.*
 import java.io.File
 import java.io.FileOutputStream
 import java.lang.Runnable
-import java.util.*
 import java.util.concurrent.ExecutionException
+import kotlin.collections.ArrayList
 import kotlin.math.abs
 
 /**
@@ -1673,8 +1673,35 @@ class FragmentMap : CrAnimationFragment() {
                     if (elements.size <= 0) {
                         CrUtil.showToast("未选择上传案件!")
                     } else {
-                        fLayerMedia?.selectFeature(elements.last() as Feature)
-                        if (eventListener != null) eventListener?.onCaseUpdate(CaseModel(elements.last().attributes))
+                        val caseFeature = elements.last() as Feature
+                        // todo: 2023/9/1 选择要素
+                        fLayerMedia?.selectFeature(caseFeature)
+                        var caseModel = CaseModel(elements.last().attributes)
+                        // todo: 2023/9/1 查询关联的本地案件
+                        queryJoinLocalCasePolygon(caseFeature,object:ICompletion<CaseLocalPolygonModel>{
+                            // todo: 2023/9/1 完成回调
+                            override fun onCompletion(completion: CompletionModel<CaseLocalPolygonModel>) {
+                                if(completion.isSuccess == false){
+                                    showError("未关联本地案件图斑,禁止上传!")
+                                }else{
+                                    // todo: 2023/9/1 关联本地案件
+                                    caseModel.joinPolygon = completion.result
+                                    // todo: 2023/9/1 查询是否关联了网络案件图斑
+                                    queryJoinNetCasePolygon(caseFeature,object:ICompletion<MutableList<String>>{
+                                        // todo: 2023/9/1 查询完成
+                                        override fun onCompletion(completion: CompletionModel<MutableList<String>>) {
+                                            if(completion.isSuccess == true){
+                                                caseModel.joinNetCaseAJHArray?.clear()
+                                                for (caseId in completion.result!!){
+                                                    caseModel.joinNetCaseAJHArray?.add(caseId)
+                                                }
+                                            }
+                                            if (eventListener != null) eventListener?.onCaseUpdate(caseModel)
+                                        }
+                                    })
+                                }
+                            }
+                        })
                     }
                 }
             } catch (ex: java.lang.IllegalArgumentException) {
@@ -1931,6 +1958,87 @@ class FragmentMap : CrAnimationFragment() {
         }
     }
 
+    /**
+     * 查询案件点关联的本地案件
+     * @param feature Feature 案件点要素
+     * @param callback ICompletion<Feature>? 回调
+     */
+    private fun queryJoinLocalCasePolygon(feature:Feature,callback:ICompletion<CaseLocalPolygonModel>?){
+        // todo: 2023/9/1 构建参数
+        var param = QueryParameters()
+        param.geometry = feature.geometry
+        param.spatialRelationship = QueryParameters.SpatialRelationship.INTERSECTS
+        param.whereClause = "1=1"
+        // todo: 2023/9/1 开始查询
+        var asyncQuery = fTableCasePolygon?.queryFeaturesAsync(param)
+        asyncQuery?.addDoneListener {
+            if(asyncQuery.isDone){
+                var result = asyncQuery.get().iterator()
+                var feature:Feature? = null
+                while (result.hasNext()){
+                    feature = result.next()
+                }
+                if(feature == null){
+                    callback?.onCompletion(CompletionModel(false,null))
+                }else{
+                    // todo: 2023/9/1 创建案件图斑
+                    var casePolygon = CaseLocalPolygonModel()
+                    casePolygon.area = feature.attributes[FIELD_CASE_POLYGON_MJ].toString()
+                    casePolygon.coords = getCoordinatesFromPolygon(feature.geometry as Polygon)
+                    callback?.onCompletion(CompletionModel(true,casePolygon))
+                }
+            }
+        }
+    }
+
+    /**
+     * 获取面对象的坐标串
+     * @param polygon Polygon 面
+     * @return String 坐标串
+     */
+    private fun getCoordinatesFromPolygon(polygon:Polygon):String{
+        var coordinatesList = mutableListOf<String>()
+        // todo: 2023/9/1 获取点集合
+        val points = polygon.parts[0].points
+        for(pt in points){
+            coordinatesList.add(String.format("%.6f",pt.x))
+            coordinatesList.add(String.format("%.6f",pt.y))
+        }
+        coordinatesList.add(String.format("%.6f",points.first().x))
+        coordinatesList.add(String.format("%.6f",points.first().y))
+        return coordinatesList.joinToString(",")
+    }
+
+
+    /**
+     * 查询案件点关联的网络案件
+     * @param feature Feature 案件点
+     * @param callback ICompletion<List<String>>? 回调
+     */
+    private fun queryJoinNetCasePolygon(feature:Feature, callback: ICompletion<MutableList<String>>){
+        // todo: 2023/9/1 构建参数
+        var param = QueryParameters()
+        param.geometry = feature.geometry
+        param.spatialRelationship = QueryParameters.SpatialRelationship.INTERSECTS
+        param.whereClause = "1=1"
+        // todo: 2023/9/1 开始查询
+        var asyncQuery = fTableNetCasePolygon?.queryFeaturesAsync(param)
+        asyncQuery?.addDoneListener {
+            if(asyncQuery.isDone){
+                var result = asyncQuery.get().iterator()
+                var caseIdList = mutableListOf<String>()
+                while (result.hasNext()){
+                    caseIdList.add(result.next().attributes[FIELD_NET_CASE_POLYGON_AJH].toString())
+                }
+                if(caseIdList.size == 0){
+                    callback?.onCompletion(CompletionModel(false,null))
+                }else{
+                    callback?.onCompletion(CompletionModel(true,caseIdList))
+                }
+            }
+        }
+    }
+
 
     /**
      * 订阅地图事件执行动作

+ 5 - 5
app/src/main/java/com/cr/pages/FragmentSetIpAndCom.kt

@@ -138,15 +138,15 @@ class FragmentSetIpAndCom : CrNavigationFragment(),View.OnClickListener{
     private fun setLink(){
         // todo: 2023/4/3 先进行检测
         if (lblIp?.getContent().equals("") || !CrUtil.checkIP(lblIp?.getContent())!!){
-            DialogNormal(context!!,"警告","Ip地址不符合要求!").show()
+            showWarning("Ip地址不符合要求!")
             return
         }
         if (lblCom?.getContent().equals("") || !CrUtil.checkCOM(lblCom?.getContent())!!){
-            DialogNormal(context!!,"警告","端口不符合要求!").show()
+            showWarning("端口不符合要求!")
             return
         }
         if (lblServerName?.getContent().equals("")){
-            DialogNormal(context!!,"警告","服务名不符合要求!").show()
+            showWarning("服务名不符合要求!")
             return
         }
         var link = IPAndComModel(lblIp!!.getContent(),lblCom!!.getContent(),lblServerName!!.getContent())
@@ -156,12 +156,12 @@ class FragmentSetIpAndCom : CrNavigationFragment(),View.OnClickListener{
             // todo: 2023/4/3 存在则更新
             var isReset:Boolean = DataManager.cancelNetworkChecked()
             var isUpdate:Boolean = DataManager.updateNetworkChecked(link,true)
-            DialogNormal(context!!,"提示",if(isReset && isUpdate) "设置成功" else "设置失败").show()
+            showInformation(if(isReset && isUpdate) "设置成功" else "设置失败")
         }else{
             // todo: 2023/4/3 不存在 则追加
             var isReset:Boolean = DataManager.cancelNetworkChecked()
             var isInsert:Boolean = DataManager.insertNetworkLink(link)
-            DialogNormal(context!!,"提示",if(isReset && isInsert) "设置成功" else "设置失败").show()
+            showInformation(if(isReset && isInsert) "设置成功" else "设置失败")
         }
         // todo: 2023/4/3 重置页面
         initPage()

+ 216 - 85
app/src/main/java/com/cr/pages/FragmentUploadAction.kt

@@ -7,7 +7,9 @@ import android.view.View
 import android.view.ViewGroup
 import android.widget.Button
 import android.widget.LinearLayout
+import android.widget.ProgressBar
 import android.widget.TextView
+import cn.carbs.android.segmentcontrolview.library.SegmentControlView
 import com.bigkoo.pickerview.adapter.ArrayWheelAdapter
 import com.contrarywind.listener.OnItemSelectedListener
 import com.cr.common.CrUnitManager
@@ -16,8 +18,10 @@ import com.cr.cruav.CrApplication
 import com.cr.cruav.R
 import com.cr.data.CrConfig
 import com.cr.data.CrUtil
+import com.cr.dialog.DialogLoadingUtil
 import com.cr.map.CaseModel
 import com.cr.models.SelModel
+import com.cr.models.SubmitCaseModel
 import com.cr.network.NetManager
 import com.cr.network.TCPDataTask
 import com.cr.view.CrViewWheel
@@ -31,28 +35,37 @@ import org.json.JSONArray
  * 创建日期:2023/8/18 10:26
  * 描述:案件上传页面
  */
-class FragmentUploadAction:CrNavigationFragment(), View.OnClickListener {
+class FragmentUploadAction : CrNavigationFragment(), View.OnClickListener {
     // todo: 2023/8/18 控件定义
-    private var btnAsyncCaseType:Button?= null // define: 2023/8/18 同步案件类型按钮
-    private var btnAsyncCaseDesc:Button?= null // define: 2023/8/18 同步案件描述信息按钮
-    private var wheelCaseType:CrViewWheel?= null // define: 2023/8/18 案件类型选择器
-    private var wheelCaseDesc:CrViewWheel?=null // define: 2023/8/18 案件描述选择器
-    private var lblMessage:TextView?=null  // define: 2023/8/23 信息显示
-    private var lblLongitude:TextView?= null // define: 2023/8/25 经度
-    private var lblLatitude:TextView?=null // define: 2023/8/25 纬度
-    private var lblAngle:TextView?=null // define: 2023/8/25 角度
-    private var lblAltitude:TextView?=null // define: 2023/8/25 高度
-    private var imageBrowser:CrImageBrowserWidget?=null // define: 2023/8/26 图片浏览器
-    private var btnSubmit:LinearLayout?= null // define: 2023/8/26 上传按钮
+    private var btnAsyncCaseType: Button? = null // define: 2023/8/18 同步案件类型按钮
+    private var btnAsyncCaseDesc: Button? = null // define: 2023/8/18 同步案件描述信息按钮
+    private var wheelCaseType: CrViewWheel? = null // define: 2023/8/18 案件类型选择器
+    private var wheelCaseDesc: CrViewWheel? = null // define: 2023/8/18 案件描述选择器
+    private var lblMessage: TextView? = null  // define: 2023/8/23 信息显示
+    private var lblLongitude: TextView? = null // define: 2023/8/25 经度
+    private var lblLatitude: TextView? = null // define: 2023/8/25 纬度
+    private var lblAngle: TextView? = null // define: 2023/8/25 角度
+    private var lblAltitude: TextView? = null // define: 2023/8/25 高度
+    private var imageBrowser: CrImageBrowserWidget? = null // define: 2023/8/26 图片浏览器
+    private var btnSubmit: LinearLayout? = null // define: 2023/8/26 上传按钮
+    private var progressBar: ProgressBar? = null // define: 2023/8/28 进度条
+    private var lblProgress: TextView? = null // define: 2023/8/28 进度条文字提示
+    private var segmentSubmitType: SegmentControlView? = null // define: 2023/9/1 上传方式
+    private var segmentConstructProgress:SegmentControlView?=null // define: 2023/9/1 建设程度
 
     // todo: 2023/8/23 变量定义
-    private var caseSubmitDescriptionList:List<SelModel>?=null // define: 2023/8/23 案件上传描述信息列表
-    private var caseTypeList:List<SelModel>?=null // define: 2023/8/24 案件类型列表
-    private var adapterCaseType:ArrayWheelAdapter<String>?= null // define: 2023/8/24 案件类型适配器
-    private var adapterCaseDesc:ArrayWheelAdapter<String>?=null // define: 2023/8/24 案件描述适配器
-    private var itemsCaseType:MutableList<String>?= null // define: 2023/8/24 案件类型数据集
-    private var itemsCaseDesc:MutableList<String>?=null // define: 2023/8/24 案件描述信息数据集
-    private var joinCase:CaseModel?=null // define: 2023/8/25 关联的案件
+    private var caseSubmitDescriptionList: List<SelModel>? = null // define: 2023/8/23 案件上传描述信息列表
+    private var caseTypeList: List<SelModel>? = null // define: 2023/8/24 案件类型列表
+    private var adapterCaseType: ArrayWheelAdapter<String>? = null // define: 2023/8/24 案件类型适配器
+    private var adapterCaseDesc: ArrayWheelAdapter<String>? = null // define: 2023/8/24 案件描述适配器
+    private var itemsCaseType: MutableList<String>? = null // define: 2023/8/24 案件类型数据集
+    private var itemsCaseDesc: MutableList<String>? = null // define: 2023/8/24 案件描述信息数据集
+    private var joinCase: CaseModel? = null // define: 2023/8/25 关联的案件
+    private var caseType: String? = null // define: 2023/9/1 案件类型
+    private var caseDesc: String? = null // define: 2023/9/1 案件描述
+    private var strSubmitType:String = "ADD"  // define: 2023/9/1 上传案件方式
+    private var strConstructProgress:String = "在建"  // define: 2023/9/1 建设程度
+
     /**
      * 初始化
      * @param inflater LayoutInflater
@@ -66,7 +79,7 @@ class FragmentUploadAction:CrNavigationFragment(), View.OnClickListener {
         savedInstanceState: Bundle?
     ): View? {
         self = this
-        mainView = inflater.inflate(R.layout.frag_case_upload_upload,null)
+        mainView = inflater.inflate(R.layout.frag_case_upload_upload, null)
         // todo: 2023/8/18 挂载控件
         joinControls()
         // todo: 2023/8/24 初始化页面
@@ -86,8 +99,8 @@ class FragmentUploadAction:CrNavigationFragment(), View.OnClickListener {
             btnAsyncCaseDesc?.setOnClickListener(this)
             wheelCaseType = it.findViewById(R.id.wheel_case_type)
             wheelCaseDesc = it.findViewById(R.id.wheel_case_desc)
-            setWheel(wheelCaseType!!,listenerWheelCaseType)
-            setWheel(wheelCaseDesc!!,listenerWheelCaseDesc)
+            setWheel(wheelCaseType!!, listenerWheelCaseType)
+            setWheel(wheelCaseDesc!!, listenerWheelCaseDesc)
             lblMessage = it.findViewById(R.id.lbl_message)
             lblLongitude = it.findViewById(R.id.lbl_longitude)
             lblLatitude = it.findViewById(R.id.lbl_latitude)
@@ -98,6 +111,14 @@ class FragmentUploadAction:CrNavigationFragment(), View.OnClickListener {
             // todo: 2023/8/26 挂载上传按钮
             btnSubmit = it.findViewById(R.id.btn_submit)
             btnSubmit?.setOnClickListener(this)
+            // todo: 2023/8/28 挂载进度条
+            progressBar = it.findViewById(R.id.progress_bar)
+            lblProgress = it.findViewById(R.id.lbl_progress)
+            // todo: 2023/9/1 挂载上传方式及建设程度控件
+            segmentSubmitType = it.findViewById(R.id.segment_submit_type)
+            segmentConstructProgress = it.findViewById(R.id.segment_construct_progress)
+            segmentSubmitType?.setOnSegmentChangedListener(segmentSubmitTypeListener)
+            segmentConstructProgress?.setOnSegmentChangedListener(segmentConstructProgressListener)
         }
     }
 
@@ -128,34 +149,34 @@ class FragmentUploadAction:CrNavigationFragment(), View.OnClickListener {
      * @param wheel CrViewWheel 选择器
      * @param listener OnItemSelectedListener 监听
      */
-    private fun setWheel(wheel:CrViewWheel,listener: OnItemSelectedListener){
-        wheel?.setTextColorCenter(Color.YELLOW) // TODO: 4/17/21 设置选中项颜色
-        wheel?.setItemsVisibleCount(5)
-        wheel?.setTextSize(CrUtil.getDimens(R.dimen.sp_6))
-        wheel?.setTypeface(CrUtil.getFont(ContextUtil.getContext()))
-        wheel?.setCyclic(false) // TODO: 6/9/21 禁止循环
-        wheel?.setOnItemSelectedListener(listener)
+    private fun setWheel(wheel: CrViewWheel, listener: OnItemSelectedListener) {
+        wheel.setTextColorCenter(Color.YELLOW) // TODO: 4/17/21 设置选中项颜色
+        wheel.setItemsVisibleCount(5)
+        wheel.setTextSize(CrUtil.getDimens(R.dimen.sp_6))
+        wheel.setTypeface(CrUtil.getFont(ContextUtil.getContext()))
+        wheel.setCyclic(false) // TODO: 6/9/21 禁止循环
+        wheel.setOnItemSelectedListener(listener)
     }
 
     /**
      * 案件类型选择器监听
      */
-    private val listenerWheelCaseType = OnItemSelectedListener {
-
+    private val listenerWheelCaseType = OnItemSelectedListener { index ->
+        caseType = caseTypeList!![index].name
     }
 
     /**
      * 案件描述选择器监听
      */
-    private val listenerWheelCaseDesc = OnItemSelectedListener {
-
+    private val listenerWheelCaseDesc = OnItemSelectedListener { index ->
+        caseDesc = caseSubmitDescriptionList!![index].name
     }
 
     /**
      * 显示消息
      * @param message String 消息内容
      */
-    private fun setMessage(message:String){
+    private fun setMessage(message: String) {
         mainHandler.post {
             lblMessage?.text = "${CrUnitManager.toSystemYMDHMSDate()} $message"
         }
@@ -164,73 +185,88 @@ class FragmentUploadAction:CrNavigationFragment(), View.OnClickListener {
     /**
      * 同步本地案件描述信息
      */
-    private fun syncLocalCaseDescription(){
+    private fun syncLocalCaseDescription() {
         caseSubmitDescriptionList = DataManager.getCaseSubmitDescription()
         itemsCaseDesc!!.clear()
         for (model in caseSubmitDescriptionList!!) {
             itemsCaseDesc?.add(model.name!!)
         }
         wheelCaseDesc?.setSelectItem(itemsCaseDesc!![0])
+        wheelCaseDesc?.onItemSelected()
     }
 
     /**
      * 同步本地案件类型
      */
-    private fun syncLocalCaseType(){
+    private fun syncLocalCaseType() {
         caseTypeList = DataManager.getCaseType()
         itemsCaseType!!.clear()
         for (model in caseTypeList!!) {
             itemsCaseType?.add(model.name!!)
         }
         wheelCaseType?.setSelectItem("违章建筑")
+        // todo: 2023/9/1 赋值
+        wheelCaseType?.onItemSelected()
     }
 
     /**
      * 同步案件描述信息
      */
-    private fun asyncCaseDescription(){
-        TCPDataTask.getInstance().sendJSON(NetManager.getServerUrl("appQueryCaseDescription"),CrConfig.user!!,object:TCPDataTask.IChangeCallback{
-            // todo: 2023/8/23 成功
-            override fun onSuccess(jsonArray: JSONArray) {
-                var list = SelModel.fromJSONArray(jsonArray)
-                if(DataManager.saveCaseSubmitDescription(list!!)){
-                    setMessage("案件描述信息同步成功!")
-                    syncLocalCaseDescription()
-                }else{
-                    setMessage("案件描述信息同步成功,本地化存储失败!")
+    private fun asyncCaseDescription() {
+        TCPDataTask.getInstance().sendJSON(
+            NetManager.getServerUrl("appQueryCaseDescription"),
+            CrConfig.user!!,
+            object : TCPDataTask.IChangeCallback {
+                // todo: 2023/8/23 成功
+                override fun onSuccess(jsonArray: JSONArray) {
+                    var list = SelModel.fromJSONArray(jsonArray)
+                    if (DataManager.saveCaseSubmitDescription(list!!)) {
+                        setMessage("案件描述信息同步成功!")
+                        syncLocalCaseDescription()
+                    } else {
+                        setMessage("案件描述信息同步成功,本地化存储失败!")
+                    }
                 }
-            }
 
-            // todo: 2023/8/23 失败
-            override fun onFailed(message: String) {
-                showError(message)
-            }
+                // todo: 2023/8/23 失败
+                override fun onFailed(message: String) {
+                    showError(message)
+                }
 
-        },CrApplication.getContext(),"获取中...")
+            },
+            CrApplication.getContext(),
+            "获取中..."
+        )
     }
 
     /**
      * 同步案件类型信息
      */
-    private fun asyncCaseType(){
-        TCPDataTask.getInstance().sendJSON(NetManager.getServerUrl("appQueryCaseSource"),CrConfig.user!!,object:TCPDataTask.IChangeCallback{
-            // todo: 2023/8/23 成功
-            override fun onSuccess(jsonArray: JSONArray) {
-                var list = SelModel.fromJSONArray(jsonArray)
-                if(DataManager.saveCaseType(list!!)){
-                    setMessage("案件类型同步成功!")
-                    syncLocalCaseType()
-                }else{
-                    setMessage("案件类型同步成功,本地化存储失败!")
+    private fun asyncCaseType() {
+        TCPDataTask.getInstance().sendJSON(
+            NetManager.getServerUrl("appQueryCaseSource"),
+            CrConfig.user!!,
+            object : TCPDataTask.IChangeCallback {
+                // todo: 2023/8/23 成功
+                override fun onSuccess(jsonArray: JSONArray) {
+                    var list = SelModel.fromJSONArray(jsonArray)
+                    if (DataManager.saveCaseType(list!!)) {
+                        setMessage("案件类型同步成功!")
+                        syncLocalCaseType()
+                    } else {
+                        setMessage("案件类型同步成功,本地化存储失败!")
+                    }
                 }
-            }
 
-            // todo: 2023/8/23 失败
-            override fun onFailed(message: String) {
-                showError(message)
-            }
+                // todo: 2023/8/23 失败
+                override fun onFailed(message: String) {
+                    showError(message)
+                }
 
-        },CrApplication.getContext(),"获取中...")
+            },
+            CrApplication.getContext(),
+            "获取中..."
+        )
     }
 
     /**
@@ -238,16 +274,16 @@ class FragmentUploadAction:CrNavigationFragment(), View.OnClickListener {
      * @param view View 视图
      */
     override fun onClick(view: View?) {
-        when(view?.id){
-            R.id.btn_async_desc->{
+        when (view?.id) {
+            R.id.btn_async_desc -> {
                 // todo: 2023/8/23 同步描述信息
                 asyncCaseDescription()
             }
-            R.id.btn_async_case_type->{
+            R.id.btn_async_case_type -> {
                 // todo: 2023/8/24 同步案件类型
                 asyncCaseType()
             }
-            R.id.btn_submit->{
+            R.id.btn_submit -> {
                 // todo: 2023/8/26 提报
                 submit()
             }
@@ -255,30 +291,123 @@ class FragmentUploadAction:CrNavigationFragment(), View.OnClickListener {
     }
 
     /**
+     * 检查上传信息
+     * @return SubmitCaseModel?
+     */
+    private fun checkSubmitInfo(): SubmitCaseModel? {
+        if (caseDesc == null) {
+            showError("请选择案件描述信息!")
+            return null
+        }
+        if (caseType == null) {
+            showError("请选择案件类型信息!")
+            return null
+        }
+        var resModel = SubmitCaseModel(CrConfig.user!!.userId!!)
+        resModel.name = joinCase!!.name!!
+        resModel.longitude = joinCase!!.longitude!!
+        resModel.latitude = joinCase!!.latitude!!
+        resModel.altitude = joinCase!!.altitude!!
+        resModel.angle = joinCase!!.angle!!
+        resModel.joinCaseId = joinCase!!.joinNetCaseAJHArray!!.joinToString(",")
+        resModel.joinPolygon = joinCase!!.joinPolygon!!.coords!!
+        resModel.caseArea = joinCase!!.joinPolygon!!.area!!
+        resModel.submitType = strSubmitType
+        resModel.constructProgress = strConstructProgress
+        return resModel
+    }
+
+    /**
+     * 案件上传方式选择监听
+     */
+    private val segmentSubmitTypeListener =
+        SegmentControlView.OnSegmentChangedListener { newSelectedIndex ->
+            when(newSelectedIndex){
+                0->{
+                    strSubmitType = "ADD"
+                }
+                1->{
+                    strSubmitType = "UPP"
+                }
+            }
+        }
+
+    /**
+     * 案件建设程度选择监听
+     */
+    private val segmentConstructProgressListener =
+        SegmentControlView.OnSegmentChangedListener { newSelectedIndex ->
+            when(newSelectedIndex){
+                0->{
+                    strSubmitType = "在建"
+                }
+                1->{
+                    strSubmitType = "完工"
+                }
+            }
+        }
+
+    /**
      * 提报
      */
-    private fun submit(){
+    private fun submit() {
+        // todo: 2023/9/1 检查上传信息
+        var submitCaseModel: SubmitCaseModel? = checkSubmitInfo() ?: return
         var filePathList = mutableListOf<String>()
-        for (fileName in joinCase!!.imgArray!!){
-            filePathList.add("${CrUtil.IMAGE_PATH}${fileName}")
+        // todo: 2023/8/28 加入文件
+        for (name in joinCase?.imgArray!!) {
+            filePathList.add("${CrUtil.IMAGE_PATH}${name}")
+            // todo: 2023/9/1 挂载上报照片名称
+            submitCaseModel?.submitImages += "${name};"
         }
-        TCPDataTask.getInstance().sendUploadFiles(CrApplication.getContext(),NetManager.getServerUrl("appUploadCase"),filePathList,CrConfig.user!!)
+        TCPDataTask.getInstance().sendUploadFiles(
+            CrApplication.getContext(),
+            NetManager.getServerUrl("appUploadCase"),
+            filePathList,
+            submitCaseModel!!,
+            object : TCPDataTask.IProgressCallback {
+                // todo: 2023/8/28 开始
+                override fun onStart() {
+                    DialogLoadingUtil.show(CrApplication.getContext(),"案件上传中...")
+                }
+
+                // todo: 2023/8/28 上传失败
+                override fun onFailed(message: String) {
+                    DialogLoadingUtil.dismiss()
+                    showError(message)
+                }
+
+                // todo: 2023/8/28 上传进度
+                override fun onProgress(progress: Long, total: Long) {
+                    progressBar?.max = total.toInt()
+                    progressBar?.progress = progress.toInt()
+                    // todo: 2023/8/31 显示上传进度
+                    var jd = (progress * 1f / total * 1f) * 100;
+                    lblProgress?.text = String.format("%.2f", jd) + "%";
+                }
+
+                // todo: 2023/8/28 上传完成
+                override fun onSuccess(message: String) {
+                    DialogLoadingUtil.dismiss()
+                    showInformation(message)
+                }
+
+            })
     }
 
     /**
      * 更新关联案件信息展示
      */
-    private fun updateCaseView(){
+    private fun updateCaseView() {
         this.joinCase?.let {
             // todo: 2023/8/25 设置显示
-            lblLongitude?.text = String.format("%.6f",it.longitude)
-            lblLatitude?.text = String.format("%.6f",it.latitude)
-            lblAngle?.text = String.format("%.3f",it.angle)
-            lblAltitude?.text = String.format("%.3f",it.altitude)
+            lblLongitude?.text = String.format("%.6f", it.longitude)
+            lblLatitude?.text = String.format("%.6f", it.latitude)
+            lblAngle?.text = String.format("%.3f", it.angle)
+            lblAltitude?.text = String.format("%.3f", it.altitude)
             // todo: 2023/8/26 挂接关联照片
-            for(fileName in it.imgArray!!){
-                val filePath= "${CrUtil.IMAGE_PATH}${fileName}"
-                CrUtil.print(filePath)
+            for (fileName in it.imgArray!!) {
+                val filePath = "${CrUtil.IMAGE_PATH}${fileName}"
                 imageBrowser?.crAppendImage(filePath)
             }
         }
@@ -288,8 +417,10 @@ class FragmentUploadAction:CrNavigationFragment(), View.OnClickListener {
      * 设置关联的案件
      * @param joinCase CaseModel 案件
      */
-    fun crSetJoinCase(joinCase:CaseModel){
+    fun crSetJoinCase(joinCase: CaseModel) {
         this.joinCase = joinCase;
+        // todo: 2023/9/1 打印
+        this.joinCase?.joinPolygon?.toString()?.let { CrUtil.print(it) }
         updateCaseView()
     }
 }

+ 0 - 1
app/src/main/java/com/cr/widget/CrImageBrowserWidget.kt

@@ -129,7 +129,6 @@ class CrImageBrowserWidget @JvmOverloads constructor(
          * 初始化
          */
         init {
-            CrUtil.print("初始化...")
             this.dataList = dataList
             initFileList()
         }

+ 7 - 4
app/src/main/res/layout/frag_case_upload_upload.xml

@@ -90,7 +90,8 @@
                         app:scv_TextSelectedColor="@color/yellow"
                         app:scv_TextNormalColor="@color/common_back"
                         android:layout_marginTop="@dimen/cr_8_dp"
-                        android:layout_marginBottom="@dimen/cr_8_dp" />
+                        android:layout_marginBottom="@dimen/cr_8_dp"
+                        android:id="@+id/segment_submit_type"/>
                     <TextView
                         style="@style/lbl_value_common"
                         android:text="@string/up_submit_type_description"
@@ -113,7 +114,8 @@
                         app:scv_TextSelectedColor="@color/yellow"
                         app:scv_TextNormalColor="@color/common_back"
                         android:layout_marginTop="@dimen/cr_8_dp"
-                        android:layout_marginBottom="@dimen/cr_8_dp" />
+                        android:layout_marginBottom="@dimen/cr_8_dp"
+                        android:id="@+id/segment_construct_progress"/>
                     <TextView
                         style="@style/lbl_value_common"
                         android:text="@string/up_construct_progress_description"
@@ -222,13 +224,14 @@
                     android:paddingStart="@dimen/cr_10_dp"
                     android:textSize="@dimen/sp_10"
                     android:layout_marginTop="@dimen/common_margin"
-                    android:layout_marginBottom="@dimen/common_margin"/>
+                    android:layout_marginBottom="@dimen/common_margin"
+                    android:id="@+id/lbl_progress"/>
                 <ProgressBar
                     android:layout_width="match_parent"
                     android:layout_height="@dimen/cr_10_dp"
                     style="@style/Widget.AppCompat.ProgressBar.Horizontal"
                     android:progressDrawable="@drawable/progress_bar"
-                    android:id="@+id/item_down_bar"/>
+                    android:id="@+id/progress_bar"/>
             </LinearLayout>
             <LinearLayout
                 android:layout_width="@dimen/cr_60_dp"