diff --git a/app/src/main/java/com/casic/electric/detector/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/electric/detector/retrofit/RetrofitService.kt index a79a691..950fb91 100644 --- a/app/src/main/java/com/casic/electric/detector/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/electric/detector/retrofit/RetrofitService.kt @@ -64,6 +64,18 @@ ): String /** + * 安装新电子标签 + */ + @Multipart + @POST("/ems/smallMarker/save-smallMarker-na.do") + suspend fun installSmallLabel( + @PartMap jsonMarker: Map, + @Part fileBuffer1: MultipartBody.Part?, + @Part fileBuffer2: MultipartBody.Part?, + @Part fileBuffer3: MultipartBody.Part? + ): String + + /** * 上报事件 */ @Multipart diff --git a/app/src/main/java/com/casic/electric/detector/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/electric/detector/retrofit/RetrofitService.kt index a79a691..950fb91 100644 --- a/app/src/main/java/com/casic/electric/detector/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/electric/detector/retrofit/RetrofitService.kt @@ -64,6 +64,18 @@ ): String /** + * 安装新电子标签 + */ + @Multipart + @POST("/ems/smallMarker/save-smallMarker-na.do") + suspend fun installSmallLabel( + @PartMap jsonMarker: Map, + @Part fileBuffer1: MultipartBody.Part?, + @Part fileBuffer2: MultipartBody.Part?, + @Part fileBuffer3: MultipartBody.Part? + ): String + + /** * 上报事件 */ @Multipart diff --git a/app/src/main/java/com/casic/electric/detector/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/electric/detector/retrofit/RetrofitServiceManager.kt index 9d65bc5..6834fc5 100644 --- a/app/src/main/java/com/casic/electric/detector/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/electric/detector/retrofit/RetrofitServiceManager.kt @@ -2,6 +2,7 @@ import com.casic.electric.detector.utils.LabelDataClass import com.casic.electric.detector.utils.LocaleConstant +import com.casic.electric.detector.utils.SmallLabelDataClass import com.google.gson.JsonObject import com.pengxh.kt.lite.utils.RetrofitFactory import com.pengxh.kt.lite.utils.SaveKeyValues @@ -189,6 +190,72 @@ } /** + * 安装新电子标签 + * Multipart上传图片,文件,带多参数上传 + */ + suspend fun installSmallLabel(labelData: SmallLabelDataClass): String { + val param = JsonObject() + param.addProperty("companyId", labelData.companyId) // 公司ID + param.addProperty("markerId", labelData.markerId) // 标识器ID号 + param.addProperty("locationNo", labelData.locationNo) // 位置点编号 + param.addProperty("locationName", labelData.locationName) // 位置点名称 + param.addProperty("smallMarkerId", labelData.smallMarkerId) // 电子标签ID号 + param.addProperty("cableName", labelData.cableName) // 电缆名称 + param.addProperty("cableNo", labelData.cableNo) // 电缆编号 + param.addProperty("line", labelData.line) // 所属线路 + param.addProperty("pressLevel", labelData.pressLevel) // 电压等级 + param.addProperty("cableType", labelData.cableType) // 电缆型号 + param.addProperty("cableSpec", labelData.cableSpec) // 电缆规格 + param.addProperty("cableBrand", labelData.cableBrand) // 电缆品牌 + param.addProperty("cableStart", labelData.cableStart) // 电缆起点 + param.addProperty("cableEnd", labelData.cableEnd) // 电缆终点 + param.addProperty("hasJoint", labelData.hasJoint) // 中间接头 + param.addProperty("jointCreator", labelData.jointCreator) // 中间接头制作人 + param.addProperty("memo1", labelData.memo1) // 备注1 + param.addProperty("memo2", labelData.memo2) // 备注2 + param.addProperty("memo3", labelData.memo3) // 备注3 + + val requestBody = param.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + val res = HashMap() + res["jsonMarker"] = requestBody + + val multiParts = ArrayList() + labelData.realPaths.forEachIndexed { index, s -> + val file = File(s) + val fileMultipart = MultipartBody.Part.createFormData( + "fileBuffer${index + 1}", file.name, file.asRequestBody("image/png".toMediaType()) + ) + multiParts.add(fileMultipart) + } + + val api by lazy { + val serverIp = SaveKeyValues.getValue(LocaleConstant.SERVER_IP, "") as String + val serverPort = SaveKeyValues.getValue(LocaleConstant.SERVER_PORT, "") as String + val httpConfig = "http://${serverIp}:${serverPort}" + RetrofitFactory.createRetrofit(httpConfig) + } + return when (multiParts.size) { + 3 -> { + api.installSmallLabel(res, multiParts[0], multiParts[1], multiParts[2]) + } + + 2 -> { + api.installSmallLabel(res, multiParts[0], multiParts[1], null) + } + + 1 -> { + api.installSmallLabel(res, multiParts[0], null, null) + } + + else -> { + api.installSmallLabel(res, null, null, null) + } + } + } + + /** * 上报事件 * Multipart上传图片,文件,带多参数上传 */ diff --git a/app/src/main/java/com/casic/electric/detector/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/electric/detector/retrofit/RetrofitService.kt index a79a691..950fb91 100644 --- a/app/src/main/java/com/casic/electric/detector/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/electric/detector/retrofit/RetrofitService.kt @@ -64,6 +64,18 @@ ): String /** + * 安装新电子标签 + */ + @Multipart + @POST("/ems/smallMarker/save-smallMarker-na.do") + suspend fun installSmallLabel( + @PartMap jsonMarker: Map, + @Part fileBuffer1: MultipartBody.Part?, + @Part fileBuffer2: MultipartBody.Part?, + @Part fileBuffer3: MultipartBody.Part? + ): String + + /** * 上报事件 */ @Multipart diff --git a/app/src/main/java/com/casic/electric/detector/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/electric/detector/retrofit/RetrofitServiceManager.kt index 9d65bc5..6834fc5 100644 --- a/app/src/main/java/com/casic/electric/detector/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/electric/detector/retrofit/RetrofitServiceManager.kt @@ -2,6 +2,7 @@ import com.casic.electric.detector.utils.LabelDataClass import com.casic.electric.detector.utils.LocaleConstant +import com.casic.electric.detector.utils.SmallLabelDataClass import com.google.gson.JsonObject import com.pengxh.kt.lite.utils.RetrofitFactory import com.pengxh.kt.lite.utils.SaveKeyValues @@ -189,6 +190,72 @@ } /** + * 安装新电子标签 + * Multipart上传图片,文件,带多参数上传 + */ + suspend fun installSmallLabel(labelData: SmallLabelDataClass): String { + val param = JsonObject() + param.addProperty("companyId", labelData.companyId) // 公司ID + param.addProperty("markerId", labelData.markerId) // 标识器ID号 + param.addProperty("locationNo", labelData.locationNo) // 位置点编号 + param.addProperty("locationName", labelData.locationName) // 位置点名称 + param.addProperty("smallMarkerId", labelData.smallMarkerId) // 电子标签ID号 + param.addProperty("cableName", labelData.cableName) // 电缆名称 + param.addProperty("cableNo", labelData.cableNo) // 电缆编号 + param.addProperty("line", labelData.line) // 所属线路 + param.addProperty("pressLevel", labelData.pressLevel) // 电压等级 + param.addProperty("cableType", labelData.cableType) // 电缆型号 + param.addProperty("cableSpec", labelData.cableSpec) // 电缆规格 + param.addProperty("cableBrand", labelData.cableBrand) // 电缆品牌 + param.addProperty("cableStart", labelData.cableStart) // 电缆起点 + param.addProperty("cableEnd", labelData.cableEnd) // 电缆终点 + param.addProperty("hasJoint", labelData.hasJoint) // 中间接头 + param.addProperty("jointCreator", labelData.jointCreator) // 中间接头制作人 + param.addProperty("memo1", labelData.memo1) // 备注1 + param.addProperty("memo2", labelData.memo2) // 备注2 + param.addProperty("memo3", labelData.memo3) // 备注3 + + val requestBody = param.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + val res = HashMap() + res["jsonMarker"] = requestBody + + val multiParts = ArrayList() + labelData.realPaths.forEachIndexed { index, s -> + val file = File(s) + val fileMultipart = MultipartBody.Part.createFormData( + "fileBuffer${index + 1}", file.name, file.asRequestBody("image/png".toMediaType()) + ) + multiParts.add(fileMultipart) + } + + val api by lazy { + val serverIp = SaveKeyValues.getValue(LocaleConstant.SERVER_IP, "") as String + val serverPort = SaveKeyValues.getValue(LocaleConstant.SERVER_PORT, "") as String + val httpConfig = "http://${serverIp}:${serverPort}" + RetrofitFactory.createRetrofit(httpConfig) + } + return when (multiParts.size) { + 3 -> { + api.installSmallLabel(res, multiParts[0], multiParts[1], multiParts[2]) + } + + 2 -> { + api.installSmallLabel(res, multiParts[0], multiParts[1], null) + } + + 1 -> { + api.installSmallLabel(res, multiParts[0], null, null) + } + + else -> { + api.installSmallLabel(res, null, null, null) + } + } + } + + /** * 上报事件 * Multipart上传图片,文件,带多参数上传 */ diff --git a/app/src/main/java/com/casic/electric/detector/utils/DataBaseManager.kt b/app/src/main/java/com/casic/electric/detector/utils/DataBaseManager.kt index 798f310..8f6caba 100644 --- a/app/src/main/java/com/casic/electric/detector/utils/DataBaseManager.kt +++ b/app/src/main/java/com/casic/electric/detector/utils/DataBaseManager.kt @@ -136,10 +136,37 @@ /******************************* Small Lable *** Start **************************************/ + //下载服务器表格后存本地 fun insertSmallLabel(bean: SmallLabelBean) { smallLabelBeanDao.insert(bean) } + //上传服务器之前存本地 + fun insertSmallLabel(labelData: SmallLabelDataClass) { + val labelBean = SmallLabelBean() + labelBean.markerId = labelData.markerId + labelBean.locationNumber = labelData.locationNo + labelBean.locationName = labelData.locationName + labelBean.electricMarkerId = labelData.smallMarkerId + labelBean.cableName = labelData.cableName + labelBean.cableNumber = labelData.cableNo + labelBean.line = labelData.line + labelBean.voltageLevel = labelData.pressLevel + labelBean.cableType = labelData.cableType + labelBean.cableSpec = labelData.cableSpec + labelBean.cableBrand = labelData.cableBrand + labelBean.cableStart = labelData.cableStart + labelBean.cableEnd = labelData.cableEnd + labelBean.hasJoint = labelData.hasJoint + labelBean.jointCreator = labelData.jointCreator + labelBean.imagePath = labelData.realPaths.toJson() + labelBean.memo1 = labelData.memo1 + labelBean.memo2 = labelData.memo2 + labelBean.memo3 = labelData.memo3 + + smallLabelBeanDao.insert(labelBean) + } + fun clearSmallLabels() { smallLabelBeanDao.deleteAll() } diff --git a/app/src/main/java/com/casic/electric/detector/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/electric/detector/retrofit/RetrofitService.kt index a79a691..950fb91 100644 --- a/app/src/main/java/com/casic/electric/detector/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/electric/detector/retrofit/RetrofitService.kt @@ -64,6 +64,18 @@ ): String /** + * 安装新电子标签 + */ + @Multipart + @POST("/ems/smallMarker/save-smallMarker-na.do") + suspend fun installSmallLabel( + @PartMap jsonMarker: Map, + @Part fileBuffer1: MultipartBody.Part?, + @Part fileBuffer2: MultipartBody.Part?, + @Part fileBuffer3: MultipartBody.Part? + ): String + + /** * 上报事件 */ @Multipart diff --git a/app/src/main/java/com/casic/electric/detector/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/electric/detector/retrofit/RetrofitServiceManager.kt index 9d65bc5..6834fc5 100644 --- a/app/src/main/java/com/casic/electric/detector/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/electric/detector/retrofit/RetrofitServiceManager.kt @@ -2,6 +2,7 @@ import com.casic.electric.detector.utils.LabelDataClass import com.casic.electric.detector.utils.LocaleConstant +import com.casic.electric.detector.utils.SmallLabelDataClass import com.google.gson.JsonObject import com.pengxh.kt.lite.utils.RetrofitFactory import com.pengxh.kt.lite.utils.SaveKeyValues @@ -189,6 +190,72 @@ } /** + * 安装新电子标签 + * Multipart上传图片,文件,带多参数上传 + */ + suspend fun installSmallLabel(labelData: SmallLabelDataClass): String { + val param = JsonObject() + param.addProperty("companyId", labelData.companyId) // 公司ID + param.addProperty("markerId", labelData.markerId) // 标识器ID号 + param.addProperty("locationNo", labelData.locationNo) // 位置点编号 + param.addProperty("locationName", labelData.locationName) // 位置点名称 + param.addProperty("smallMarkerId", labelData.smallMarkerId) // 电子标签ID号 + param.addProperty("cableName", labelData.cableName) // 电缆名称 + param.addProperty("cableNo", labelData.cableNo) // 电缆编号 + param.addProperty("line", labelData.line) // 所属线路 + param.addProperty("pressLevel", labelData.pressLevel) // 电压等级 + param.addProperty("cableType", labelData.cableType) // 电缆型号 + param.addProperty("cableSpec", labelData.cableSpec) // 电缆规格 + param.addProperty("cableBrand", labelData.cableBrand) // 电缆品牌 + param.addProperty("cableStart", labelData.cableStart) // 电缆起点 + param.addProperty("cableEnd", labelData.cableEnd) // 电缆终点 + param.addProperty("hasJoint", labelData.hasJoint) // 中间接头 + param.addProperty("jointCreator", labelData.jointCreator) // 中间接头制作人 + param.addProperty("memo1", labelData.memo1) // 备注1 + param.addProperty("memo2", labelData.memo2) // 备注2 + param.addProperty("memo3", labelData.memo3) // 备注3 + + val requestBody = param.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + val res = HashMap() + res["jsonMarker"] = requestBody + + val multiParts = ArrayList() + labelData.realPaths.forEachIndexed { index, s -> + val file = File(s) + val fileMultipart = MultipartBody.Part.createFormData( + "fileBuffer${index + 1}", file.name, file.asRequestBody("image/png".toMediaType()) + ) + multiParts.add(fileMultipart) + } + + val api by lazy { + val serverIp = SaveKeyValues.getValue(LocaleConstant.SERVER_IP, "") as String + val serverPort = SaveKeyValues.getValue(LocaleConstant.SERVER_PORT, "") as String + val httpConfig = "http://${serverIp}:${serverPort}" + RetrofitFactory.createRetrofit(httpConfig) + } + return when (multiParts.size) { + 3 -> { + api.installSmallLabel(res, multiParts[0], multiParts[1], multiParts[2]) + } + + 2 -> { + api.installSmallLabel(res, multiParts[0], multiParts[1], null) + } + + 1 -> { + api.installSmallLabel(res, multiParts[0], null, null) + } + + else -> { + api.installSmallLabel(res, null, null, null) + } + } + } + + /** * 上报事件 * Multipart上传图片,文件,带多参数上传 */ diff --git a/app/src/main/java/com/casic/electric/detector/utils/DataBaseManager.kt b/app/src/main/java/com/casic/electric/detector/utils/DataBaseManager.kt index 798f310..8f6caba 100644 --- a/app/src/main/java/com/casic/electric/detector/utils/DataBaseManager.kt +++ b/app/src/main/java/com/casic/electric/detector/utils/DataBaseManager.kt @@ -136,10 +136,37 @@ /******************************* Small Lable *** Start **************************************/ + //下载服务器表格后存本地 fun insertSmallLabel(bean: SmallLabelBean) { smallLabelBeanDao.insert(bean) } + //上传服务器之前存本地 + fun insertSmallLabel(labelData: SmallLabelDataClass) { + val labelBean = SmallLabelBean() + labelBean.markerId = labelData.markerId + labelBean.locationNumber = labelData.locationNo + labelBean.locationName = labelData.locationName + labelBean.electricMarkerId = labelData.smallMarkerId + labelBean.cableName = labelData.cableName + labelBean.cableNumber = labelData.cableNo + labelBean.line = labelData.line + labelBean.voltageLevel = labelData.pressLevel + labelBean.cableType = labelData.cableType + labelBean.cableSpec = labelData.cableSpec + labelBean.cableBrand = labelData.cableBrand + labelBean.cableStart = labelData.cableStart + labelBean.cableEnd = labelData.cableEnd + labelBean.hasJoint = labelData.hasJoint + labelBean.jointCreator = labelData.jointCreator + labelBean.imagePath = labelData.realPaths.toJson() + labelBean.memo1 = labelData.memo1 + labelBean.memo2 = labelData.memo2 + labelBean.memo3 = labelData.memo3 + + smallLabelBeanDao.insert(labelBean) + } + fun clearSmallLabels() { smallLabelBeanDao.deleteAll() } diff --git a/app/src/main/java/com/casic/electric/detector/utils/SmallLabelDataClass.kt b/app/src/main/java/com/casic/electric/detector/utils/SmallLabelDataClass.kt new file mode 100644 index 0000000..bafe034 --- /dev/null +++ b/app/src/main/java/com/casic/electric/detector/utils/SmallLabelDataClass.kt @@ -0,0 +1,24 @@ +package com.casic.electric.detector.utils + +data class SmallLabelDataClass( + var companyId: String, + var markerId: String, + var locationNo: String, + var locationName: String, + var smallMarkerId: String, + var cableName: String, + var cableNo: String, + var line: String, + var pressLevel: String, + var cableType: String, + var cableSpec: String, + var cableBrand: String, + var cableStart: String, + var cableEnd: String, + var hasJoint: String, + var jointCreator: String, + var memo1: String, + var memo2: String, + var memo3: String, + var realPaths: ArrayList +) diff --git a/app/src/main/java/com/casic/electric/detector/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/electric/detector/retrofit/RetrofitService.kt index a79a691..950fb91 100644 --- a/app/src/main/java/com/casic/electric/detector/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/electric/detector/retrofit/RetrofitService.kt @@ -64,6 +64,18 @@ ): String /** + * 安装新电子标签 + */ + @Multipart + @POST("/ems/smallMarker/save-smallMarker-na.do") + suspend fun installSmallLabel( + @PartMap jsonMarker: Map, + @Part fileBuffer1: MultipartBody.Part?, + @Part fileBuffer2: MultipartBody.Part?, + @Part fileBuffer3: MultipartBody.Part? + ): String + + /** * 上报事件 */ @Multipart diff --git a/app/src/main/java/com/casic/electric/detector/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/electric/detector/retrofit/RetrofitServiceManager.kt index 9d65bc5..6834fc5 100644 --- a/app/src/main/java/com/casic/electric/detector/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/electric/detector/retrofit/RetrofitServiceManager.kt @@ -2,6 +2,7 @@ import com.casic.electric.detector.utils.LabelDataClass import com.casic.electric.detector.utils.LocaleConstant +import com.casic.electric.detector.utils.SmallLabelDataClass import com.google.gson.JsonObject import com.pengxh.kt.lite.utils.RetrofitFactory import com.pengxh.kt.lite.utils.SaveKeyValues @@ -189,6 +190,72 @@ } /** + * 安装新电子标签 + * Multipart上传图片,文件,带多参数上传 + */ + suspend fun installSmallLabel(labelData: SmallLabelDataClass): String { + val param = JsonObject() + param.addProperty("companyId", labelData.companyId) // 公司ID + param.addProperty("markerId", labelData.markerId) // 标识器ID号 + param.addProperty("locationNo", labelData.locationNo) // 位置点编号 + param.addProperty("locationName", labelData.locationName) // 位置点名称 + param.addProperty("smallMarkerId", labelData.smallMarkerId) // 电子标签ID号 + param.addProperty("cableName", labelData.cableName) // 电缆名称 + param.addProperty("cableNo", labelData.cableNo) // 电缆编号 + param.addProperty("line", labelData.line) // 所属线路 + param.addProperty("pressLevel", labelData.pressLevel) // 电压等级 + param.addProperty("cableType", labelData.cableType) // 电缆型号 + param.addProperty("cableSpec", labelData.cableSpec) // 电缆规格 + param.addProperty("cableBrand", labelData.cableBrand) // 电缆品牌 + param.addProperty("cableStart", labelData.cableStart) // 电缆起点 + param.addProperty("cableEnd", labelData.cableEnd) // 电缆终点 + param.addProperty("hasJoint", labelData.hasJoint) // 中间接头 + param.addProperty("jointCreator", labelData.jointCreator) // 中间接头制作人 + param.addProperty("memo1", labelData.memo1) // 备注1 + param.addProperty("memo2", labelData.memo2) // 备注2 + param.addProperty("memo3", labelData.memo3) // 备注3 + + val requestBody = param.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + val res = HashMap() + res["jsonMarker"] = requestBody + + val multiParts = ArrayList() + labelData.realPaths.forEachIndexed { index, s -> + val file = File(s) + val fileMultipart = MultipartBody.Part.createFormData( + "fileBuffer${index + 1}", file.name, file.asRequestBody("image/png".toMediaType()) + ) + multiParts.add(fileMultipart) + } + + val api by lazy { + val serverIp = SaveKeyValues.getValue(LocaleConstant.SERVER_IP, "") as String + val serverPort = SaveKeyValues.getValue(LocaleConstant.SERVER_PORT, "") as String + val httpConfig = "http://${serverIp}:${serverPort}" + RetrofitFactory.createRetrofit(httpConfig) + } + return when (multiParts.size) { + 3 -> { + api.installSmallLabel(res, multiParts[0], multiParts[1], multiParts[2]) + } + + 2 -> { + api.installSmallLabel(res, multiParts[0], multiParts[1], null) + } + + 1 -> { + api.installSmallLabel(res, multiParts[0], null, null) + } + + else -> { + api.installSmallLabel(res, null, null, null) + } + } + } + + /** * 上报事件 * Multipart上传图片,文件,带多参数上传 */ diff --git a/app/src/main/java/com/casic/electric/detector/utils/DataBaseManager.kt b/app/src/main/java/com/casic/electric/detector/utils/DataBaseManager.kt index 798f310..8f6caba 100644 --- a/app/src/main/java/com/casic/electric/detector/utils/DataBaseManager.kt +++ b/app/src/main/java/com/casic/electric/detector/utils/DataBaseManager.kt @@ -136,10 +136,37 @@ /******************************* Small Lable *** Start **************************************/ + //下载服务器表格后存本地 fun insertSmallLabel(bean: SmallLabelBean) { smallLabelBeanDao.insert(bean) } + //上传服务器之前存本地 + fun insertSmallLabel(labelData: SmallLabelDataClass) { + val labelBean = SmallLabelBean() + labelBean.markerId = labelData.markerId + labelBean.locationNumber = labelData.locationNo + labelBean.locationName = labelData.locationName + labelBean.electricMarkerId = labelData.smallMarkerId + labelBean.cableName = labelData.cableName + labelBean.cableNumber = labelData.cableNo + labelBean.line = labelData.line + labelBean.voltageLevel = labelData.pressLevel + labelBean.cableType = labelData.cableType + labelBean.cableSpec = labelData.cableSpec + labelBean.cableBrand = labelData.cableBrand + labelBean.cableStart = labelData.cableStart + labelBean.cableEnd = labelData.cableEnd + labelBean.hasJoint = labelData.hasJoint + labelBean.jointCreator = labelData.jointCreator + labelBean.imagePath = labelData.realPaths.toJson() + labelBean.memo1 = labelData.memo1 + labelBean.memo2 = labelData.memo2 + labelBean.memo3 = labelData.memo3 + + smallLabelBeanDao.insert(labelBean) + } + fun clearSmallLabels() { smallLabelBeanDao.deleteAll() } diff --git a/app/src/main/java/com/casic/electric/detector/utils/SmallLabelDataClass.kt b/app/src/main/java/com/casic/electric/detector/utils/SmallLabelDataClass.kt new file mode 100644 index 0000000..bafe034 --- /dev/null +++ b/app/src/main/java/com/casic/electric/detector/utils/SmallLabelDataClass.kt @@ -0,0 +1,24 @@ +package com.casic.electric.detector.utils + +data class SmallLabelDataClass( + var companyId: String, + var markerId: String, + var locationNo: String, + var locationName: String, + var smallMarkerId: String, + var cableName: String, + var cableNo: String, + var line: String, + var pressLevel: String, + var cableType: String, + var cableSpec: String, + var cableBrand: String, + var cableStart: String, + var cableEnd: String, + var hasJoint: String, + var jointCreator: String, + var memo1: String, + var memo2: String, + var memo3: String, + var realPaths: ArrayList +) diff --git a/app/src/main/java/com/casic/electric/detector/view/InstallLabelActivity.kt b/app/src/main/java/com/casic/electric/detector/view/InstallLabelActivity.kt index 175291e..07626d6 100644 --- a/app/src/main/java/com/casic/electric/detector/view/InstallLabelActivity.kt +++ b/app/src/main/java/com/casic/electric/detector/view/InstallLabelActivity.kt @@ -63,7 +63,6 @@ private lateinit var soundPool: SoundPool private lateinit var imageAdapter: EditableImageAdapter private lateinit var taskViewModel: TaskViewModel - private lateinit var labelData: LabelDataClass override fun initLayoutView(): Int = R.layout.activity_install_label @@ -367,7 +366,7 @@ val objectTypeCode = itemPosition + 1 if (markerIdView.text.isNullOrBlank()) { - "ID号不能为空,请读标识器".show(this) + "标识器ID不能为空,请读标识器".show(this) return@setOnClickListener } @@ -417,7 +416,7 @@ "remarkView2".setDefaultValue(remarkView2) "remarkView3".setDefaultValue(remarkView3) - labelData = LabelDataClass( + val labelData = LabelDataClass( companyId, objectTypeCode.toString(), objectCodeView.text.toString(), @@ -575,9 +574,9 @@ } override fun onDestroy() { + super.onDestroy() soundPool.release() gpioManager.setGpioLow("18") - super.onDestroy() } override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean { diff --git a/app/src/main/java/com/casic/electric/detector/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/electric/detector/retrofit/RetrofitService.kt index a79a691..950fb91 100644 --- a/app/src/main/java/com/casic/electric/detector/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/electric/detector/retrofit/RetrofitService.kt @@ -64,6 +64,18 @@ ): String /** + * 安装新电子标签 + */ + @Multipart + @POST("/ems/smallMarker/save-smallMarker-na.do") + suspend fun installSmallLabel( + @PartMap jsonMarker: Map, + @Part fileBuffer1: MultipartBody.Part?, + @Part fileBuffer2: MultipartBody.Part?, + @Part fileBuffer3: MultipartBody.Part? + ): String + + /** * 上报事件 */ @Multipart diff --git a/app/src/main/java/com/casic/electric/detector/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/electric/detector/retrofit/RetrofitServiceManager.kt index 9d65bc5..6834fc5 100644 --- a/app/src/main/java/com/casic/electric/detector/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/electric/detector/retrofit/RetrofitServiceManager.kt @@ -2,6 +2,7 @@ import com.casic.electric.detector.utils.LabelDataClass import com.casic.electric.detector.utils.LocaleConstant +import com.casic.electric.detector.utils.SmallLabelDataClass import com.google.gson.JsonObject import com.pengxh.kt.lite.utils.RetrofitFactory import com.pengxh.kt.lite.utils.SaveKeyValues @@ -189,6 +190,72 @@ } /** + * 安装新电子标签 + * Multipart上传图片,文件,带多参数上传 + */ + suspend fun installSmallLabel(labelData: SmallLabelDataClass): String { + val param = JsonObject() + param.addProperty("companyId", labelData.companyId) // 公司ID + param.addProperty("markerId", labelData.markerId) // 标识器ID号 + param.addProperty("locationNo", labelData.locationNo) // 位置点编号 + param.addProperty("locationName", labelData.locationName) // 位置点名称 + param.addProperty("smallMarkerId", labelData.smallMarkerId) // 电子标签ID号 + param.addProperty("cableName", labelData.cableName) // 电缆名称 + param.addProperty("cableNo", labelData.cableNo) // 电缆编号 + param.addProperty("line", labelData.line) // 所属线路 + param.addProperty("pressLevel", labelData.pressLevel) // 电压等级 + param.addProperty("cableType", labelData.cableType) // 电缆型号 + param.addProperty("cableSpec", labelData.cableSpec) // 电缆规格 + param.addProperty("cableBrand", labelData.cableBrand) // 电缆品牌 + param.addProperty("cableStart", labelData.cableStart) // 电缆起点 + param.addProperty("cableEnd", labelData.cableEnd) // 电缆终点 + param.addProperty("hasJoint", labelData.hasJoint) // 中间接头 + param.addProperty("jointCreator", labelData.jointCreator) // 中间接头制作人 + param.addProperty("memo1", labelData.memo1) // 备注1 + param.addProperty("memo2", labelData.memo2) // 备注2 + param.addProperty("memo3", labelData.memo3) // 备注3 + + val requestBody = param.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + val res = HashMap() + res["jsonMarker"] = requestBody + + val multiParts = ArrayList() + labelData.realPaths.forEachIndexed { index, s -> + val file = File(s) + val fileMultipart = MultipartBody.Part.createFormData( + "fileBuffer${index + 1}", file.name, file.asRequestBody("image/png".toMediaType()) + ) + multiParts.add(fileMultipart) + } + + val api by lazy { + val serverIp = SaveKeyValues.getValue(LocaleConstant.SERVER_IP, "") as String + val serverPort = SaveKeyValues.getValue(LocaleConstant.SERVER_PORT, "") as String + val httpConfig = "http://${serverIp}:${serverPort}" + RetrofitFactory.createRetrofit(httpConfig) + } + return when (multiParts.size) { + 3 -> { + api.installSmallLabel(res, multiParts[0], multiParts[1], multiParts[2]) + } + + 2 -> { + api.installSmallLabel(res, multiParts[0], multiParts[1], null) + } + + 1 -> { + api.installSmallLabel(res, multiParts[0], null, null) + } + + else -> { + api.installSmallLabel(res, null, null, null) + } + } + } + + /** * 上报事件 * Multipart上传图片,文件,带多参数上传 */ diff --git a/app/src/main/java/com/casic/electric/detector/utils/DataBaseManager.kt b/app/src/main/java/com/casic/electric/detector/utils/DataBaseManager.kt index 798f310..8f6caba 100644 --- a/app/src/main/java/com/casic/electric/detector/utils/DataBaseManager.kt +++ b/app/src/main/java/com/casic/electric/detector/utils/DataBaseManager.kt @@ -136,10 +136,37 @@ /******************************* Small Lable *** Start **************************************/ + //下载服务器表格后存本地 fun insertSmallLabel(bean: SmallLabelBean) { smallLabelBeanDao.insert(bean) } + //上传服务器之前存本地 + fun insertSmallLabel(labelData: SmallLabelDataClass) { + val labelBean = SmallLabelBean() + labelBean.markerId = labelData.markerId + labelBean.locationNumber = labelData.locationNo + labelBean.locationName = labelData.locationName + labelBean.electricMarkerId = labelData.smallMarkerId + labelBean.cableName = labelData.cableName + labelBean.cableNumber = labelData.cableNo + labelBean.line = labelData.line + labelBean.voltageLevel = labelData.pressLevel + labelBean.cableType = labelData.cableType + labelBean.cableSpec = labelData.cableSpec + labelBean.cableBrand = labelData.cableBrand + labelBean.cableStart = labelData.cableStart + labelBean.cableEnd = labelData.cableEnd + labelBean.hasJoint = labelData.hasJoint + labelBean.jointCreator = labelData.jointCreator + labelBean.imagePath = labelData.realPaths.toJson() + labelBean.memo1 = labelData.memo1 + labelBean.memo2 = labelData.memo2 + labelBean.memo3 = labelData.memo3 + + smallLabelBeanDao.insert(labelBean) + } + fun clearSmallLabels() { smallLabelBeanDao.deleteAll() } diff --git a/app/src/main/java/com/casic/electric/detector/utils/SmallLabelDataClass.kt b/app/src/main/java/com/casic/electric/detector/utils/SmallLabelDataClass.kt new file mode 100644 index 0000000..bafe034 --- /dev/null +++ b/app/src/main/java/com/casic/electric/detector/utils/SmallLabelDataClass.kt @@ -0,0 +1,24 @@ +package com.casic.electric.detector.utils + +data class SmallLabelDataClass( + var companyId: String, + var markerId: String, + var locationNo: String, + var locationName: String, + var smallMarkerId: String, + var cableName: String, + var cableNo: String, + var line: String, + var pressLevel: String, + var cableType: String, + var cableSpec: String, + var cableBrand: String, + var cableStart: String, + var cableEnd: String, + var hasJoint: String, + var jointCreator: String, + var memo1: String, + var memo2: String, + var memo3: String, + var realPaths: ArrayList +) diff --git a/app/src/main/java/com/casic/electric/detector/view/InstallLabelActivity.kt b/app/src/main/java/com/casic/electric/detector/view/InstallLabelActivity.kt index 175291e..07626d6 100644 --- a/app/src/main/java/com/casic/electric/detector/view/InstallLabelActivity.kt +++ b/app/src/main/java/com/casic/electric/detector/view/InstallLabelActivity.kt @@ -63,7 +63,6 @@ private lateinit var soundPool: SoundPool private lateinit var imageAdapter: EditableImageAdapter private lateinit var taskViewModel: TaskViewModel - private lateinit var labelData: LabelDataClass override fun initLayoutView(): Int = R.layout.activity_install_label @@ -367,7 +366,7 @@ val objectTypeCode = itemPosition + 1 if (markerIdView.text.isNullOrBlank()) { - "ID号不能为空,请读标识器".show(this) + "标识器ID不能为空,请读标识器".show(this) return@setOnClickListener } @@ -417,7 +416,7 @@ "remarkView2".setDefaultValue(remarkView2) "remarkView3".setDefaultValue(remarkView3) - labelData = LabelDataClass( + val labelData = LabelDataClass( companyId, objectTypeCode.toString(), objectCodeView.text.toString(), @@ -575,9 +574,9 @@ } override fun onDestroy() { + super.onDestroy() soundPool.release() gpioManager.setGpioLow("18") - super.onDestroy() } override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean { diff --git a/app/src/main/java/com/casic/electric/detector/view/InstallSmallLabelActivity.kt b/app/src/main/java/com/casic/electric/detector/view/InstallSmallLabelActivity.kt index 0eb09ef..d6888ee 100644 --- a/app/src/main/java/com/casic/electric/detector/view/InstallSmallLabelActivity.kt +++ b/app/src/main/java/com/casic/electric/detector/view/InstallSmallLabelActivity.kt @@ -1,31 +1,63 @@ package com.casic.electric.detector.view +import android.annotation.SuppressLint import android.content.Context +import android.content.Intent import android.media.AudioAttributes import android.media.SoundPool import android.os.Bundle import android.os.Handler import android.os.Message +import android.provider.Settings import android.util.Log import android.view.KeyEvent +import android.view.View +import android.view.WindowManager +import android.widget.AdapterView +import androidx.lifecycle.ViewModelProvider +import androidx.lifecycle.lifecycleScope import com.casic.electric.detector.R +import com.casic.electric.detector.adapter.EditableImageAdapter import com.casic.electric.detector.base.SerialPortActivity -import com.casic.electric.detector.extensions.initLayoutImmersionBar -import com.casic.electric.detector.utils.GpioManager +import com.casic.electric.detector.callback.OnImageCompressListener +import com.casic.electric.detector.extensions.* +import com.casic.electric.detector.utils.* +import com.casic.electric.detector.vm.TaskViewModel import com.gyf.immersionbar.ImmersionBar +import com.luck.picture.lib.basic.PictureSelector +import com.luck.picture.lib.config.SelectMimeType +import com.luck.picture.lib.entity.LocalMedia +import com.luck.picture.lib.interfaces.OnResultCallbackListener import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.isNetworkConnected +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.vm.LoadState +import com.pengxh.kt.lite.widget.dialog.NoNetworkDialog import kotlinx.android.synthetic.main.activity_install_small_label.* import kotlinx.android.synthetic.main.include_base_title.* +import kotlinx.android.synthetic.main.include_open_camera.* +import kotlinx.android.synthetic.main.include_small_label_object_attribute.* +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext +import java.io.File +import java.io.IOException +@SuppressLint("SetTextI18n") class InstallSmallLabelActivity : SerialPortActivity(), Handler.Callback { private val kTag = "SmallLabelActivity" private val context: Context = this@InstallSmallLabelActivity private val gpioManager by lazy { GpioManager() } + private val realPaths: ArrayList = ArrayList() //真实图片路径 private var soundResId = 0 private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var soundPool: SoundPool + private lateinit var imageAdapter: EditableImageAdapter + private lateinit var taskViewModel: TaskViewModel override fun initLayoutView(): Int = R.layout.activity_install_small_label @@ -41,6 +73,8 @@ } override fun initData(savedInstanceState: Bundle?) { + window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN or WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN) + weakReferenceHandler = WeakReferenceHandler(this) val audioAttributes = AudioAttributes.Builder() @@ -51,18 +85,225 @@ .setMaxStreams(16) .setAudioAttributes(audioAttributes) .build() + + //设置上次填写过的值 + cableNumberView.setText("cableNumberView".getDefaultValue()) + cableNameView.setText("cableNameView".getDefaultValue()) + lineView.setText("lineView".getDefaultValue()) + voltageLevelView.setText("voltageLevelView".getDefaultValue()) + cableModelView.setText("cableModelView".getDefaultValue()) + cableSpecView.setText("cableSpecView".getDefaultValue()) + cableBrandView.setText("cableBrandView".getDefaultValue()) + cableStartView.setText("cableStartView".getDefaultValue()) + cableEndView.setText("cableEndView".getDefaultValue()) + jointCreatorView.setText("jointCreatorView".getDefaultValue()) + objectRemarkView1.setText("objectRemarkView1".getDefaultValue()) + objectRemarkView2.setText("objectRemarkView2".getDefaultValue()) + objectRemarkView3.setText("objectRemarkView3".getDefaultValue()) + + //初始化图片九宫格 + imageAdapter = EditableImageAdapter(this, 3, 3f) + addImageRecyclerView.adapter = imageAdapter + + taskViewModel = ViewModelProvider(this)[TaskViewModel::class.java] } override fun observeRequestState() { - + taskViewModel.loadState.observe(this) { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(this, "电子标签安装中,请稍后...") + LoadState.Success -> { + LoadingDialogHub.dismiss() + finish() + } + else -> LoadingDialogHub.dismiss() + } + } } override fun initEvent() { + leftBackView.setOnClickListener { finish() } + /**************************************************************************************/ + + //TODO 读取电子标签为未实现 + readElectricTagButton.setOnClickListener { + gpioManager.setGpioHigh("18") + + LoadingDialogHub.show(this, "电子标签读取中,请稍后...") + + soundResId = soundPool.load(this, R.raw.ring3, 1) + soundPool.setOnLoadCompleteListener { soundPool, _, _ -> + soundPool.play(soundResId, 1f, 1f, 0, -1, 1f) + } + + // 1000ms后发送读标识器或搜索信号 + weakReferenceHandler.postDelayed({ + try { + // 发送读标识器或搜索信号 + outputStream?.write("00".toByteArray()) + outputStream?.flush() + } catch (e: IOException) { + e.printStackTrace() + } + }, 1000) + } + + bindMarkerSpinner.show(this, arrayOf("是", "否"), 0) + bindMarkerSpinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener { + override fun onItemSelected( + parent: AdapterView<*>?, view: View?, position: Int, id: Long + ) { + if (position == 0) { + markerLayout.visibility = View.VISIBLE + } else { + markerLayout.visibility = View.GONE + } + } + + override fun onNothingSelected(parent: AdapterView<*>?) { + + } + } + + middleJointSpinner.show(this, arrayOf("有", "无"), 0) + + imageAdapter.setOnItemClickListener(object : EditableImageAdapter.OnItemClickListener { + override fun onAddImageClick() { + PictureSelector.create(this@InstallSmallLabelActivity) + .openCamera(SelectMimeType.ofImage()) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: java.util.ArrayList?) { + if (result == null) { + "拍照失败,请重试".show(context) + return + } + analyticalSelectResult(result[0]) + } + + override fun onCancel() { + + } + }) + } + + override fun onItemClick(position: Int) { + if (realPaths[position].isEmpty()) { + "图片加载失败,无法查看大图".show(context) + } else { + context.navigatePageTo(position, realPaths) + } + } + + override fun onItemLongClick(view: View?, position: Int) { + imageAdapter.deleteImage(position) + } + }) + + /**************************************************************************************/ + installButton.setOnClickListener { + if (isNetworkConnected()) { + val companyId = SaveKeyValues.getValue(LocaleConstant.USER_COMPANY_ID, "") as String + + if (markerIdView.text.isNullOrBlank()) { + "标识器ID不能为空,请读标识器".show(this) + return@setOnClickListener + } + + if (smallLabelIdView.text.isNullOrBlank()) { + "电子标签ID不能为空,请读电子标签".show(this) + return@setOnClickListener + } + + if (voltageLevelView.text.isNullOrBlank()) { + "电压等级不能为空,请输入电压等级".show(this) + return@setOnClickListener + } + + //保存默认值 + "cableNumberView".setDefaultValue(cableNumberView) + "cableNameView".setDefaultValue(cableNameView) + "lineView".setDefaultValue(lineView) + "voltageLevelView".setDefaultValue(voltageLevelView) + "cableModelView".setDefaultValue(cableModelView) + "cableSpecView".setDefaultValue(cableSpecView) + "cableBrandView".setDefaultValue(cableBrandView) + "cableStartView".setDefaultValue(cableStartView) + "cableEndView".setDefaultValue(cableEndView) + "jointCreatorView".setDefaultValue(jointCreatorView) + "objectRemarkView1".setDefaultValue(objectRemarkView1) + "objectRemarkView2".setDefaultValue(objectRemarkView2) + "objectRemarkView3".setDefaultValue(objectRemarkView3) + + val smallLabelData = SmallLabelDataClass( + companyId, + markerIdView.text.toString(), + markerNumberView.text.toString(), + markerNameView.text.toString(), + smallLabelIdView.text.toString(), + cableNameView.toString(), + cableNumberView.toString(), + lineView.text.toString(), + voltageLevelView.toString(), + cableModelView.text.toString(), + cableSpecView.text.toString(), + cableBrandView.text.toString(), + cableStartView.text.toString(), + cableEndView.text.toString(), + middleJointSpinner.selectedItem.toString(), + jointCreatorView.text.toString(), + objectRemarkView1.text.toString(), + objectRemarkView2.text.toString(), + objectRemarkView3.text.toString(), + realPaths + ) + + //先存本地 + lifecycleScope.launch { + withContext(Dispatchers.IO) { + DataBaseManager.get.insertSmallLabel(smallLabelData) + } + } + + //再存服务器 + taskViewModel.installSmallLabel(smallLabelData) + } else { + NoNetworkDialog.Builder() + .setContext(context) + .setOnDialogButtonClickListener(object : + NoNetworkDialog.OnDialogButtonClickListener { + override fun onButtonClick() { + val intent = Intent(Settings.ACTION_SETTINGS) + startActivity(intent) + } + }).build().show() + } + } + + readLabelButton.setOnClickListener { + gpioManager.setGpioHigh("18") + + LoadingDialogHub.show(this, "标识器读取中,请稍后...") + + soundResId = soundPool.load(this, R.raw.ring3, 1) + soundPool.setOnLoadCompleteListener { soundPool, _, _ -> + soundPool.play(soundResId, 1f, 1f, 0, -1, 1f) + } + + // 1000ms后发送读标识器或搜索信号 + weakReferenceHandler.postDelayed({ + try { + // 发送读标识器或搜索信号 + outputStream?.write("2".toByteArray()) + outputStream?.flush() + } catch (e: IOException) { + e.printStackTrace() + } + }, 1000) + } } override fun onDataReceived(buffer: ByteArray?, size: Int) { - Log.d(kTag, "onDataReceived => " + buffer.contentToString()) if (buffer != null) { val message = weakReferenceHandler.obtainMessage() message.what = 2023081702 @@ -73,15 +314,48 @@ override fun handleMessage(msg: Message): Boolean { if (msg.what == 2023081702) { + soundPool.release() + val buffer = msg.obj as ByteArray + val hex = buffer.toHex() + + Log.d(kTag, "handleMessage => $hex") + if (hex.length >= 20) { + val markerId = hex.substring(0, 20).hexToString() + + gpioManager.setGpioLow("18") + + //查本地库 + val result = DataBaseManager.get.queryLabelById(markerId) + if (result.isEmpty()) { + markerIdView.text = markerId + } else { + "此标识器已安装,请更换标识器!".show(this) + } + LoadingDialogHub.dismiss() + } } return true } + private fun analyticalSelectResult(result: LocalMedia) { + //压缩图片 + result.realPath.compressImage(this, object : OnImageCompressListener { + override fun onSuccess(file: File) { + realPaths.add(file.absolutePath) + imageAdapter.setupImage(realPaths) + } + + override fun onError(e: Throwable) { + e.printStackTrace() + } + }) + } + override fun onDestroy() { + super.onDestroy() soundPool.release() gpioManager.setGpioLow("18") - super.onDestroy() } override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean { diff --git a/app/src/main/java/com/casic/electric/detector/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/electric/detector/retrofit/RetrofitService.kt index a79a691..950fb91 100644 --- a/app/src/main/java/com/casic/electric/detector/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/electric/detector/retrofit/RetrofitService.kt @@ -64,6 +64,18 @@ ): String /** + * 安装新电子标签 + */ + @Multipart + @POST("/ems/smallMarker/save-smallMarker-na.do") + suspend fun installSmallLabel( + @PartMap jsonMarker: Map, + @Part fileBuffer1: MultipartBody.Part?, + @Part fileBuffer2: MultipartBody.Part?, + @Part fileBuffer3: MultipartBody.Part? + ): String + + /** * 上报事件 */ @Multipart diff --git a/app/src/main/java/com/casic/electric/detector/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/electric/detector/retrofit/RetrofitServiceManager.kt index 9d65bc5..6834fc5 100644 --- a/app/src/main/java/com/casic/electric/detector/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/electric/detector/retrofit/RetrofitServiceManager.kt @@ -2,6 +2,7 @@ import com.casic.electric.detector.utils.LabelDataClass import com.casic.electric.detector.utils.LocaleConstant +import com.casic.electric.detector.utils.SmallLabelDataClass import com.google.gson.JsonObject import com.pengxh.kt.lite.utils.RetrofitFactory import com.pengxh.kt.lite.utils.SaveKeyValues @@ -189,6 +190,72 @@ } /** + * 安装新电子标签 + * Multipart上传图片,文件,带多参数上传 + */ + suspend fun installSmallLabel(labelData: SmallLabelDataClass): String { + val param = JsonObject() + param.addProperty("companyId", labelData.companyId) // 公司ID + param.addProperty("markerId", labelData.markerId) // 标识器ID号 + param.addProperty("locationNo", labelData.locationNo) // 位置点编号 + param.addProperty("locationName", labelData.locationName) // 位置点名称 + param.addProperty("smallMarkerId", labelData.smallMarkerId) // 电子标签ID号 + param.addProperty("cableName", labelData.cableName) // 电缆名称 + param.addProperty("cableNo", labelData.cableNo) // 电缆编号 + param.addProperty("line", labelData.line) // 所属线路 + param.addProperty("pressLevel", labelData.pressLevel) // 电压等级 + param.addProperty("cableType", labelData.cableType) // 电缆型号 + param.addProperty("cableSpec", labelData.cableSpec) // 电缆规格 + param.addProperty("cableBrand", labelData.cableBrand) // 电缆品牌 + param.addProperty("cableStart", labelData.cableStart) // 电缆起点 + param.addProperty("cableEnd", labelData.cableEnd) // 电缆终点 + param.addProperty("hasJoint", labelData.hasJoint) // 中间接头 + param.addProperty("jointCreator", labelData.jointCreator) // 中间接头制作人 + param.addProperty("memo1", labelData.memo1) // 备注1 + param.addProperty("memo2", labelData.memo2) // 备注2 + param.addProperty("memo3", labelData.memo3) // 备注3 + + val requestBody = param.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + val res = HashMap() + res["jsonMarker"] = requestBody + + val multiParts = ArrayList() + labelData.realPaths.forEachIndexed { index, s -> + val file = File(s) + val fileMultipart = MultipartBody.Part.createFormData( + "fileBuffer${index + 1}", file.name, file.asRequestBody("image/png".toMediaType()) + ) + multiParts.add(fileMultipart) + } + + val api by lazy { + val serverIp = SaveKeyValues.getValue(LocaleConstant.SERVER_IP, "") as String + val serverPort = SaveKeyValues.getValue(LocaleConstant.SERVER_PORT, "") as String + val httpConfig = "http://${serverIp}:${serverPort}" + RetrofitFactory.createRetrofit(httpConfig) + } + return when (multiParts.size) { + 3 -> { + api.installSmallLabel(res, multiParts[0], multiParts[1], multiParts[2]) + } + + 2 -> { + api.installSmallLabel(res, multiParts[0], multiParts[1], null) + } + + 1 -> { + api.installSmallLabel(res, multiParts[0], null, null) + } + + else -> { + api.installSmallLabel(res, null, null, null) + } + } + } + + /** * 上报事件 * Multipart上传图片,文件,带多参数上传 */ diff --git a/app/src/main/java/com/casic/electric/detector/utils/DataBaseManager.kt b/app/src/main/java/com/casic/electric/detector/utils/DataBaseManager.kt index 798f310..8f6caba 100644 --- a/app/src/main/java/com/casic/electric/detector/utils/DataBaseManager.kt +++ b/app/src/main/java/com/casic/electric/detector/utils/DataBaseManager.kt @@ -136,10 +136,37 @@ /******************************* Small Lable *** Start **************************************/ + //下载服务器表格后存本地 fun insertSmallLabel(bean: SmallLabelBean) { smallLabelBeanDao.insert(bean) } + //上传服务器之前存本地 + fun insertSmallLabel(labelData: SmallLabelDataClass) { + val labelBean = SmallLabelBean() + labelBean.markerId = labelData.markerId + labelBean.locationNumber = labelData.locationNo + labelBean.locationName = labelData.locationName + labelBean.electricMarkerId = labelData.smallMarkerId + labelBean.cableName = labelData.cableName + labelBean.cableNumber = labelData.cableNo + labelBean.line = labelData.line + labelBean.voltageLevel = labelData.pressLevel + labelBean.cableType = labelData.cableType + labelBean.cableSpec = labelData.cableSpec + labelBean.cableBrand = labelData.cableBrand + labelBean.cableStart = labelData.cableStart + labelBean.cableEnd = labelData.cableEnd + labelBean.hasJoint = labelData.hasJoint + labelBean.jointCreator = labelData.jointCreator + labelBean.imagePath = labelData.realPaths.toJson() + labelBean.memo1 = labelData.memo1 + labelBean.memo2 = labelData.memo2 + labelBean.memo3 = labelData.memo3 + + smallLabelBeanDao.insert(labelBean) + } + fun clearSmallLabels() { smallLabelBeanDao.deleteAll() } diff --git a/app/src/main/java/com/casic/electric/detector/utils/SmallLabelDataClass.kt b/app/src/main/java/com/casic/electric/detector/utils/SmallLabelDataClass.kt new file mode 100644 index 0000000..bafe034 --- /dev/null +++ b/app/src/main/java/com/casic/electric/detector/utils/SmallLabelDataClass.kt @@ -0,0 +1,24 @@ +package com.casic.electric.detector.utils + +data class SmallLabelDataClass( + var companyId: String, + var markerId: String, + var locationNo: String, + var locationName: String, + var smallMarkerId: String, + var cableName: String, + var cableNo: String, + var line: String, + var pressLevel: String, + var cableType: String, + var cableSpec: String, + var cableBrand: String, + var cableStart: String, + var cableEnd: String, + var hasJoint: String, + var jointCreator: String, + var memo1: String, + var memo2: String, + var memo3: String, + var realPaths: ArrayList +) diff --git a/app/src/main/java/com/casic/electric/detector/view/InstallLabelActivity.kt b/app/src/main/java/com/casic/electric/detector/view/InstallLabelActivity.kt index 175291e..07626d6 100644 --- a/app/src/main/java/com/casic/electric/detector/view/InstallLabelActivity.kt +++ b/app/src/main/java/com/casic/electric/detector/view/InstallLabelActivity.kt @@ -63,7 +63,6 @@ private lateinit var soundPool: SoundPool private lateinit var imageAdapter: EditableImageAdapter private lateinit var taskViewModel: TaskViewModel - private lateinit var labelData: LabelDataClass override fun initLayoutView(): Int = R.layout.activity_install_label @@ -367,7 +366,7 @@ val objectTypeCode = itemPosition + 1 if (markerIdView.text.isNullOrBlank()) { - "ID号不能为空,请读标识器".show(this) + "标识器ID不能为空,请读标识器".show(this) return@setOnClickListener } @@ -417,7 +416,7 @@ "remarkView2".setDefaultValue(remarkView2) "remarkView3".setDefaultValue(remarkView3) - labelData = LabelDataClass( + val labelData = LabelDataClass( companyId, objectTypeCode.toString(), objectCodeView.text.toString(), @@ -575,9 +574,9 @@ } override fun onDestroy() { + super.onDestroy() soundPool.release() gpioManager.setGpioLow("18") - super.onDestroy() } override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean { diff --git a/app/src/main/java/com/casic/electric/detector/view/InstallSmallLabelActivity.kt b/app/src/main/java/com/casic/electric/detector/view/InstallSmallLabelActivity.kt index 0eb09ef..d6888ee 100644 --- a/app/src/main/java/com/casic/electric/detector/view/InstallSmallLabelActivity.kt +++ b/app/src/main/java/com/casic/electric/detector/view/InstallSmallLabelActivity.kt @@ -1,31 +1,63 @@ package com.casic.electric.detector.view +import android.annotation.SuppressLint import android.content.Context +import android.content.Intent import android.media.AudioAttributes import android.media.SoundPool import android.os.Bundle import android.os.Handler import android.os.Message +import android.provider.Settings import android.util.Log import android.view.KeyEvent +import android.view.View +import android.view.WindowManager +import android.widget.AdapterView +import androidx.lifecycle.ViewModelProvider +import androidx.lifecycle.lifecycleScope import com.casic.electric.detector.R +import com.casic.electric.detector.adapter.EditableImageAdapter import com.casic.electric.detector.base.SerialPortActivity -import com.casic.electric.detector.extensions.initLayoutImmersionBar -import com.casic.electric.detector.utils.GpioManager +import com.casic.electric.detector.callback.OnImageCompressListener +import com.casic.electric.detector.extensions.* +import com.casic.electric.detector.utils.* +import com.casic.electric.detector.vm.TaskViewModel import com.gyf.immersionbar.ImmersionBar +import com.luck.picture.lib.basic.PictureSelector +import com.luck.picture.lib.config.SelectMimeType +import com.luck.picture.lib.entity.LocalMedia +import com.luck.picture.lib.interfaces.OnResultCallbackListener import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.isNetworkConnected +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.vm.LoadState +import com.pengxh.kt.lite.widget.dialog.NoNetworkDialog import kotlinx.android.synthetic.main.activity_install_small_label.* import kotlinx.android.synthetic.main.include_base_title.* +import kotlinx.android.synthetic.main.include_open_camera.* +import kotlinx.android.synthetic.main.include_small_label_object_attribute.* +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext +import java.io.File +import java.io.IOException +@SuppressLint("SetTextI18n") class InstallSmallLabelActivity : SerialPortActivity(), Handler.Callback { private val kTag = "SmallLabelActivity" private val context: Context = this@InstallSmallLabelActivity private val gpioManager by lazy { GpioManager() } + private val realPaths: ArrayList = ArrayList() //真实图片路径 private var soundResId = 0 private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var soundPool: SoundPool + private lateinit var imageAdapter: EditableImageAdapter + private lateinit var taskViewModel: TaskViewModel override fun initLayoutView(): Int = R.layout.activity_install_small_label @@ -41,6 +73,8 @@ } override fun initData(savedInstanceState: Bundle?) { + window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN or WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN) + weakReferenceHandler = WeakReferenceHandler(this) val audioAttributes = AudioAttributes.Builder() @@ -51,18 +85,225 @@ .setMaxStreams(16) .setAudioAttributes(audioAttributes) .build() + + //设置上次填写过的值 + cableNumberView.setText("cableNumberView".getDefaultValue()) + cableNameView.setText("cableNameView".getDefaultValue()) + lineView.setText("lineView".getDefaultValue()) + voltageLevelView.setText("voltageLevelView".getDefaultValue()) + cableModelView.setText("cableModelView".getDefaultValue()) + cableSpecView.setText("cableSpecView".getDefaultValue()) + cableBrandView.setText("cableBrandView".getDefaultValue()) + cableStartView.setText("cableStartView".getDefaultValue()) + cableEndView.setText("cableEndView".getDefaultValue()) + jointCreatorView.setText("jointCreatorView".getDefaultValue()) + objectRemarkView1.setText("objectRemarkView1".getDefaultValue()) + objectRemarkView2.setText("objectRemarkView2".getDefaultValue()) + objectRemarkView3.setText("objectRemarkView3".getDefaultValue()) + + //初始化图片九宫格 + imageAdapter = EditableImageAdapter(this, 3, 3f) + addImageRecyclerView.adapter = imageAdapter + + taskViewModel = ViewModelProvider(this)[TaskViewModel::class.java] } override fun observeRequestState() { - + taskViewModel.loadState.observe(this) { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(this, "电子标签安装中,请稍后...") + LoadState.Success -> { + LoadingDialogHub.dismiss() + finish() + } + else -> LoadingDialogHub.dismiss() + } + } } override fun initEvent() { + leftBackView.setOnClickListener { finish() } + /**************************************************************************************/ + + //TODO 读取电子标签为未实现 + readElectricTagButton.setOnClickListener { + gpioManager.setGpioHigh("18") + + LoadingDialogHub.show(this, "电子标签读取中,请稍后...") + + soundResId = soundPool.load(this, R.raw.ring3, 1) + soundPool.setOnLoadCompleteListener { soundPool, _, _ -> + soundPool.play(soundResId, 1f, 1f, 0, -1, 1f) + } + + // 1000ms后发送读标识器或搜索信号 + weakReferenceHandler.postDelayed({ + try { + // 发送读标识器或搜索信号 + outputStream?.write("00".toByteArray()) + outputStream?.flush() + } catch (e: IOException) { + e.printStackTrace() + } + }, 1000) + } + + bindMarkerSpinner.show(this, arrayOf("是", "否"), 0) + bindMarkerSpinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener { + override fun onItemSelected( + parent: AdapterView<*>?, view: View?, position: Int, id: Long + ) { + if (position == 0) { + markerLayout.visibility = View.VISIBLE + } else { + markerLayout.visibility = View.GONE + } + } + + override fun onNothingSelected(parent: AdapterView<*>?) { + + } + } + + middleJointSpinner.show(this, arrayOf("有", "无"), 0) + + imageAdapter.setOnItemClickListener(object : EditableImageAdapter.OnItemClickListener { + override fun onAddImageClick() { + PictureSelector.create(this@InstallSmallLabelActivity) + .openCamera(SelectMimeType.ofImage()) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: java.util.ArrayList?) { + if (result == null) { + "拍照失败,请重试".show(context) + return + } + analyticalSelectResult(result[0]) + } + + override fun onCancel() { + + } + }) + } + + override fun onItemClick(position: Int) { + if (realPaths[position].isEmpty()) { + "图片加载失败,无法查看大图".show(context) + } else { + context.navigatePageTo(position, realPaths) + } + } + + override fun onItemLongClick(view: View?, position: Int) { + imageAdapter.deleteImage(position) + } + }) + + /**************************************************************************************/ + installButton.setOnClickListener { + if (isNetworkConnected()) { + val companyId = SaveKeyValues.getValue(LocaleConstant.USER_COMPANY_ID, "") as String + + if (markerIdView.text.isNullOrBlank()) { + "标识器ID不能为空,请读标识器".show(this) + return@setOnClickListener + } + + if (smallLabelIdView.text.isNullOrBlank()) { + "电子标签ID不能为空,请读电子标签".show(this) + return@setOnClickListener + } + + if (voltageLevelView.text.isNullOrBlank()) { + "电压等级不能为空,请输入电压等级".show(this) + return@setOnClickListener + } + + //保存默认值 + "cableNumberView".setDefaultValue(cableNumberView) + "cableNameView".setDefaultValue(cableNameView) + "lineView".setDefaultValue(lineView) + "voltageLevelView".setDefaultValue(voltageLevelView) + "cableModelView".setDefaultValue(cableModelView) + "cableSpecView".setDefaultValue(cableSpecView) + "cableBrandView".setDefaultValue(cableBrandView) + "cableStartView".setDefaultValue(cableStartView) + "cableEndView".setDefaultValue(cableEndView) + "jointCreatorView".setDefaultValue(jointCreatorView) + "objectRemarkView1".setDefaultValue(objectRemarkView1) + "objectRemarkView2".setDefaultValue(objectRemarkView2) + "objectRemarkView3".setDefaultValue(objectRemarkView3) + + val smallLabelData = SmallLabelDataClass( + companyId, + markerIdView.text.toString(), + markerNumberView.text.toString(), + markerNameView.text.toString(), + smallLabelIdView.text.toString(), + cableNameView.toString(), + cableNumberView.toString(), + lineView.text.toString(), + voltageLevelView.toString(), + cableModelView.text.toString(), + cableSpecView.text.toString(), + cableBrandView.text.toString(), + cableStartView.text.toString(), + cableEndView.text.toString(), + middleJointSpinner.selectedItem.toString(), + jointCreatorView.text.toString(), + objectRemarkView1.text.toString(), + objectRemarkView2.text.toString(), + objectRemarkView3.text.toString(), + realPaths + ) + + //先存本地 + lifecycleScope.launch { + withContext(Dispatchers.IO) { + DataBaseManager.get.insertSmallLabel(smallLabelData) + } + } + + //再存服务器 + taskViewModel.installSmallLabel(smallLabelData) + } else { + NoNetworkDialog.Builder() + .setContext(context) + .setOnDialogButtonClickListener(object : + NoNetworkDialog.OnDialogButtonClickListener { + override fun onButtonClick() { + val intent = Intent(Settings.ACTION_SETTINGS) + startActivity(intent) + } + }).build().show() + } + } + + readLabelButton.setOnClickListener { + gpioManager.setGpioHigh("18") + + LoadingDialogHub.show(this, "标识器读取中,请稍后...") + + soundResId = soundPool.load(this, R.raw.ring3, 1) + soundPool.setOnLoadCompleteListener { soundPool, _, _ -> + soundPool.play(soundResId, 1f, 1f, 0, -1, 1f) + } + + // 1000ms后发送读标识器或搜索信号 + weakReferenceHandler.postDelayed({ + try { + // 发送读标识器或搜索信号 + outputStream?.write("2".toByteArray()) + outputStream?.flush() + } catch (e: IOException) { + e.printStackTrace() + } + }, 1000) + } } override fun onDataReceived(buffer: ByteArray?, size: Int) { - Log.d(kTag, "onDataReceived => " + buffer.contentToString()) if (buffer != null) { val message = weakReferenceHandler.obtainMessage() message.what = 2023081702 @@ -73,15 +314,48 @@ override fun handleMessage(msg: Message): Boolean { if (msg.what == 2023081702) { + soundPool.release() + val buffer = msg.obj as ByteArray + val hex = buffer.toHex() + + Log.d(kTag, "handleMessage => $hex") + if (hex.length >= 20) { + val markerId = hex.substring(0, 20).hexToString() + + gpioManager.setGpioLow("18") + + //查本地库 + val result = DataBaseManager.get.queryLabelById(markerId) + if (result.isEmpty()) { + markerIdView.text = markerId + } else { + "此标识器已安装,请更换标识器!".show(this) + } + LoadingDialogHub.dismiss() + } } return true } + private fun analyticalSelectResult(result: LocalMedia) { + //压缩图片 + result.realPath.compressImage(this, object : OnImageCompressListener { + override fun onSuccess(file: File) { + realPaths.add(file.absolutePath) + imageAdapter.setupImage(realPaths) + } + + override fun onError(e: Throwable) { + e.printStackTrace() + } + }) + } + override fun onDestroy() { + super.onDestroy() soundPool.release() gpioManager.setGpioLow("18") - super.onDestroy() } override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean { diff --git a/app/src/main/java/com/casic/electric/detector/vm/TaskViewModel.kt b/app/src/main/java/com/casic/electric/detector/vm/TaskViewModel.kt index c51e2aa..476a5f0 100644 --- a/app/src/main/java/com/casic/electric/detector/vm/TaskViewModel.kt +++ b/app/src/main/java/com/casic/electric/detector/vm/TaskViewModel.kt @@ -8,6 +8,7 @@ import com.casic.electric.detector.model.MarkerFileModel import com.casic.electric.detector.retrofit.RetrofitServiceManager import com.casic.electric.detector.utils.LabelDataClass +import com.casic.electric.detector.utils.SmallLabelDataClass import com.google.gson.Gson import com.google.gson.reflect.TypeToken import com.pengxh.kt.lite.extensions.launch @@ -61,6 +62,20 @@ it.convertChinese().show(BaseApplication.get()) }) + fun installSmallLabel(labelData: SmallLabelDataClass) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.installSmallLabel(labelData) + if (response.separateResponseState()) { + loadState.value = LoadState.Success + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show(BaseApplication.get()) + } + }, { + loadState.value = LoadState.Fail + it.convertChinese().show(BaseApplication.get()) + }) + // fun uploadTask(userId: String, taskId: String?, state: String) = launch({ // loadState.value = LoadState.Loading // val response = RetrofitServiceManager.uploadTask(userId, taskId, state) diff --git a/app/src/main/java/com/casic/electric/detector/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/electric/detector/retrofit/RetrofitService.kt index a79a691..950fb91 100644 --- a/app/src/main/java/com/casic/electric/detector/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/electric/detector/retrofit/RetrofitService.kt @@ -64,6 +64,18 @@ ): String /** + * 安装新电子标签 + */ + @Multipart + @POST("/ems/smallMarker/save-smallMarker-na.do") + suspend fun installSmallLabel( + @PartMap jsonMarker: Map, + @Part fileBuffer1: MultipartBody.Part?, + @Part fileBuffer2: MultipartBody.Part?, + @Part fileBuffer3: MultipartBody.Part? + ): String + + /** * 上报事件 */ @Multipart diff --git a/app/src/main/java/com/casic/electric/detector/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/electric/detector/retrofit/RetrofitServiceManager.kt index 9d65bc5..6834fc5 100644 --- a/app/src/main/java/com/casic/electric/detector/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/electric/detector/retrofit/RetrofitServiceManager.kt @@ -2,6 +2,7 @@ import com.casic.electric.detector.utils.LabelDataClass import com.casic.electric.detector.utils.LocaleConstant +import com.casic.electric.detector.utils.SmallLabelDataClass import com.google.gson.JsonObject import com.pengxh.kt.lite.utils.RetrofitFactory import com.pengxh.kt.lite.utils.SaveKeyValues @@ -189,6 +190,72 @@ } /** + * 安装新电子标签 + * Multipart上传图片,文件,带多参数上传 + */ + suspend fun installSmallLabel(labelData: SmallLabelDataClass): String { + val param = JsonObject() + param.addProperty("companyId", labelData.companyId) // 公司ID + param.addProperty("markerId", labelData.markerId) // 标识器ID号 + param.addProperty("locationNo", labelData.locationNo) // 位置点编号 + param.addProperty("locationName", labelData.locationName) // 位置点名称 + param.addProperty("smallMarkerId", labelData.smallMarkerId) // 电子标签ID号 + param.addProperty("cableName", labelData.cableName) // 电缆名称 + param.addProperty("cableNo", labelData.cableNo) // 电缆编号 + param.addProperty("line", labelData.line) // 所属线路 + param.addProperty("pressLevel", labelData.pressLevel) // 电压等级 + param.addProperty("cableType", labelData.cableType) // 电缆型号 + param.addProperty("cableSpec", labelData.cableSpec) // 电缆规格 + param.addProperty("cableBrand", labelData.cableBrand) // 电缆品牌 + param.addProperty("cableStart", labelData.cableStart) // 电缆起点 + param.addProperty("cableEnd", labelData.cableEnd) // 电缆终点 + param.addProperty("hasJoint", labelData.hasJoint) // 中间接头 + param.addProperty("jointCreator", labelData.jointCreator) // 中间接头制作人 + param.addProperty("memo1", labelData.memo1) // 备注1 + param.addProperty("memo2", labelData.memo2) // 备注2 + param.addProperty("memo3", labelData.memo3) // 备注3 + + val requestBody = param.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + val res = HashMap() + res["jsonMarker"] = requestBody + + val multiParts = ArrayList() + labelData.realPaths.forEachIndexed { index, s -> + val file = File(s) + val fileMultipart = MultipartBody.Part.createFormData( + "fileBuffer${index + 1}", file.name, file.asRequestBody("image/png".toMediaType()) + ) + multiParts.add(fileMultipart) + } + + val api by lazy { + val serverIp = SaveKeyValues.getValue(LocaleConstant.SERVER_IP, "") as String + val serverPort = SaveKeyValues.getValue(LocaleConstant.SERVER_PORT, "") as String + val httpConfig = "http://${serverIp}:${serverPort}" + RetrofitFactory.createRetrofit(httpConfig) + } + return when (multiParts.size) { + 3 -> { + api.installSmallLabel(res, multiParts[0], multiParts[1], multiParts[2]) + } + + 2 -> { + api.installSmallLabel(res, multiParts[0], multiParts[1], null) + } + + 1 -> { + api.installSmallLabel(res, multiParts[0], null, null) + } + + else -> { + api.installSmallLabel(res, null, null, null) + } + } + } + + /** * 上报事件 * Multipart上传图片,文件,带多参数上传 */ diff --git a/app/src/main/java/com/casic/electric/detector/utils/DataBaseManager.kt b/app/src/main/java/com/casic/electric/detector/utils/DataBaseManager.kt index 798f310..8f6caba 100644 --- a/app/src/main/java/com/casic/electric/detector/utils/DataBaseManager.kt +++ b/app/src/main/java/com/casic/electric/detector/utils/DataBaseManager.kt @@ -136,10 +136,37 @@ /******************************* Small Lable *** Start **************************************/ + //下载服务器表格后存本地 fun insertSmallLabel(bean: SmallLabelBean) { smallLabelBeanDao.insert(bean) } + //上传服务器之前存本地 + fun insertSmallLabel(labelData: SmallLabelDataClass) { + val labelBean = SmallLabelBean() + labelBean.markerId = labelData.markerId + labelBean.locationNumber = labelData.locationNo + labelBean.locationName = labelData.locationName + labelBean.electricMarkerId = labelData.smallMarkerId + labelBean.cableName = labelData.cableName + labelBean.cableNumber = labelData.cableNo + labelBean.line = labelData.line + labelBean.voltageLevel = labelData.pressLevel + labelBean.cableType = labelData.cableType + labelBean.cableSpec = labelData.cableSpec + labelBean.cableBrand = labelData.cableBrand + labelBean.cableStart = labelData.cableStart + labelBean.cableEnd = labelData.cableEnd + labelBean.hasJoint = labelData.hasJoint + labelBean.jointCreator = labelData.jointCreator + labelBean.imagePath = labelData.realPaths.toJson() + labelBean.memo1 = labelData.memo1 + labelBean.memo2 = labelData.memo2 + labelBean.memo3 = labelData.memo3 + + smallLabelBeanDao.insert(labelBean) + } + fun clearSmallLabels() { smallLabelBeanDao.deleteAll() } diff --git a/app/src/main/java/com/casic/electric/detector/utils/SmallLabelDataClass.kt b/app/src/main/java/com/casic/electric/detector/utils/SmallLabelDataClass.kt new file mode 100644 index 0000000..bafe034 --- /dev/null +++ b/app/src/main/java/com/casic/electric/detector/utils/SmallLabelDataClass.kt @@ -0,0 +1,24 @@ +package com.casic.electric.detector.utils + +data class SmallLabelDataClass( + var companyId: String, + var markerId: String, + var locationNo: String, + var locationName: String, + var smallMarkerId: String, + var cableName: String, + var cableNo: String, + var line: String, + var pressLevel: String, + var cableType: String, + var cableSpec: String, + var cableBrand: String, + var cableStart: String, + var cableEnd: String, + var hasJoint: String, + var jointCreator: String, + var memo1: String, + var memo2: String, + var memo3: String, + var realPaths: ArrayList +) diff --git a/app/src/main/java/com/casic/electric/detector/view/InstallLabelActivity.kt b/app/src/main/java/com/casic/electric/detector/view/InstallLabelActivity.kt index 175291e..07626d6 100644 --- a/app/src/main/java/com/casic/electric/detector/view/InstallLabelActivity.kt +++ b/app/src/main/java/com/casic/electric/detector/view/InstallLabelActivity.kt @@ -63,7 +63,6 @@ private lateinit var soundPool: SoundPool private lateinit var imageAdapter: EditableImageAdapter private lateinit var taskViewModel: TaskViewModel - private lateinit var labelData: LabelDataClass override fun initLayoutView(): Int = R.layout.activity_install_label @@ -367,7 +366,7 @@ val objectTypeCode = itemPosition + 1 if (markerIdView.text.isNullOrBlank()) { - "ID号不能为空,请读标识器".show(this) + "标识器ID不能为空,请读标识器".show(this) return@setOnClickListener } @@ -417,7 +416,7 @@ "remarkView2".setDefaultValue(remarkView2) "remarkView3".setDefaultValue(remarkView3) - labelData = LabelDataClass( + val labelData = LabelDataClass( companyId, objectTypeCode.toString(), objectCodeView.text.toString(), @@ -575,9 +574,9 @@ } override fun onDestroy() { + super.onDestroy() soundPool.release() gpioManager.setGpioLow("18") - super.onDestroy() } override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean { diff --git a/app/src/main/java/com/casic/electric/detector/view/InstallSmallLabelActivity.kt b/app/src/main/java/com/casic/electric/detector/view/InstallSmallLabelActivity.kt index 0eb09ef..d6888ee 100644 --- a/app/src/main/java/com/casic/electric/detector/view/InstallSmallLabelActivity.kt +++ b/app/src/main/java/com/casic/electric/detector/view/InstallSmallLabelActivity.kt @@ -1,31 +1,63 @@ package com.casic.electric.detector.view +import android.annotation.SuppressLint import android.content.Context +import android.content.Intent import android.media.AudioAttributes import android.media.SoundPool import android.os.Bundle import android.os.Handler import android.os.Message +import android.provider.Settings import android.util.Log import android.view.KeyEvent +import android.view.View +import android.view.WindowManager +import android.widget.AdapterView +import androidx.lifecycle.ViewModelProvider +import androidx.lifecycle.lifecycleScope import com.casic.electric.detector.R +import com.casic.electric.detector.adapter.EditableImageAdapter import com.casic.electric.detector.base.SerialPortActivity -import com.casic.electric.detector.extensions.initLayoutImmersionBar -import com.casic.electric.detector.utils.GpioManager +import com.casic.electric.detector.callback.OnImageCompressListener +import com.casic.electric.detector.extensions.* +import com.casic.electric.detector.utils.* +import com.casic.electric.detector.vm.TaskViewModel import com.gyf.immersionbar.ImmersionBar +import com.luck.picture.lib.basic.PictureSelector +import com.luck.picture.lib.config.SelectMimeType +import com.luck.picture.lib.entity.LocalMedia +import com.luck.picture.lib.interfaces.OnResultCallbackListener import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.isNetworkConnected +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.vm.LoadState +import com.pengxh.kt.lite.widget.dialog.NoNetworkDialog import kotlinx.android.synthetic.main.activity_install_small_label.* import kotlinx.android.synthetic.main.include_base_title.* +import kotlinx.android.synthetic.main.include_open_camera.* +import kotlinx.android.synthetic.main.include_small_label_object_attribute.* +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext +import java.io.File +import java.io.IOException +@SuppressLint("SetTextI18n") class InstallSmallLabelActivity : SerialPortActivity(), Handler.Callback { private val kTag = "SmallLabelActivity" private val context: Context = this@InstallSmallLabelActivity private val gpioManager by lazy { GpioManager() } + private val realPaths: ArrayList = ArrayList() //真实图片路径 private var soundResId = 0 private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var soundPool: SoundPool + private lateinit var imageAdapter: EditableImageAdapter + private lateinit var taskViewModel: TaskViewModel override fun initLayoutView(): Int = R.layout.activity_install_small_label @@ -41,6 +73,8 @@ } override fun initData(savedInstanceState: Bundle?) { + window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN or WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN) + weakReferenceHandler = WeakReferenceHandler(this) val audioAttributes = AudioAttributes.Builder() @@ -51,18 +85,225 @@ .setMaxStreams(16) .setAudioAttributes(audioAttributes) .build() + + //设置上次填写过的值 + cableNumberView.setText("cableNumberView".getDefaultValue()) + cableNameView.setText("cableNameView".getDefaultValue()) + lineView.setText("lineView".getDefaultValue()) + voltageLevelView.setText("voltageLevelView".getDefaultValue()) + cableModelView.setText("cableModelView".getDefaultValue()) + cableSpecView.setText("cableSpecView".getDefaultValue()) + cableBrandView.setText("cableBrandView".getDefaultValue()) + cableStartView.setText("cableStartView".getDefaultValue()) + cableEndView.setText("cableEndView".getDefaultValue()) + jointCreatorView.setText("jointCreatorView".getDefaultValue()) + objectRemarkView1.setText("objectRemarkView1".getDefaultValue()) + objectRemarkView2.setText("objectRemarkView2".getDefaultValue()) + objectRemarkView3.setText("objectRemarkView3".getDefaultValue()) + + //初始化图片九宫格 + imageAdapter = EditableImageAdapter(this, 3, 3f) + addImageRecyclerView.adapter = imageAdapter + + taskViewModel = ViewModelProvider(this)[TaskViewModel::class.java] } override fun observeRequestState() { - + taskViewModel.loadState.observe(this) { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(this, "电子标签安装中,请稍后...") + LoadState.Success -> { + LoadingDialogHub.dismiss() + finish() + } + else -> LoadingDialogHub.dismiss() + } + } } override fun initEvent() { + leftBackView.setOnClickListener { finish() } + /**************************************************************************************/ + + //TODO 读取电子标签为未实现 + readElectricTagButton.setOnClickListener { + gpioManager.setGpioHigh("18") + + LoadingDialogHub.show(this, "电子标签读取中,请稍后...") + + soundResId = soundPool.load(this, R.raw.ring3, 1) + soundPool.setOnLoadCompleteListener { soundPool, _, _ -> + soundPool.play(soundResId, 1f, 1f, 0, -1, 1f) + } + + // 1000ms后发送读标识器或搜索信号 + weakReferenceHandler.postDelayed({ + try { + // 发送读标识器或搜索信号 + outputStream?.write("00".toByteArray()) + outputStream?.flush() + } catch (e: IOException) { + e.printStackTrace() + } + }, 1000) + } + + bindMarkerSpinner.show(this, arrayOf("是", "否"), 0) + bindMarkerSpinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener { + override fun onItemSelected( + parent: AdapterView<*>?, view: View?, position: Int, id: Long + ) { + if (position == 0) { + markerLayout.visibility = View.VISIBLE + } else { + markerLayout.visibility = View.GONE + } + } + + override fun onNothingSelected(parent: AdapterView<*>?) { + + } + } + + middleJointSpinner.show(this, arrayOf("有", "无"), 0) + + imageAdapter.setOnItemClickListener(object : EditableImageAdapter.OnItemClickListener { + override fun onAddImageClick() { + PictureSelector.create(this@InstallSmallLabelActivity) + .openCamera(SelectMimeType.ofImage()) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: java.util.ArrayList?) { + if (result == null) { + "拍照失败,请重试".show(context) + return + } + analyticalSelectResult(result[0]) + } + + override fun onCancel() { + + } + }) + } + + override fun onItemClick(position: Int) { + if (realPaths[position].isEmpty()) { + "图片加载失败,无法查看大图".show(context) + } else { + context.navigatePageTo(position, realPaths) + } + } + + override fun onItemLongClick(view: View?, position: Int) { + imageAdapter.deleteImage(position) + } + }) + + /**************************************************************************************/ + installButton.setOnClickListener { + if (isNetworkConnected()) { + val companyId = SaveKeyValues.getValue(LocaleConstant.USER_COMPANY_ID, "") as String + + if (markerIdView.text.isNullOrBlank()) { + "标识器ID不能为空,请读标识器".show(this) + return@setOnClickListener + } + + if (smallLabelIdView.text.isNullOrBlank()) { + "电子标签ID不能为空,请读电子标签".show(this) + return@setOnClickListener + } + + if (voltageLevelView.text.isNullOrBlank()) { + "电压等级不能为空,请输入电压等级".show(this) + return@setOnClickListener + } + + //保存默认值 + "cableNumberView".setDefaultValue(cableNumberView) + "cableNameView".setDefaultValue(cableNameView) + "lineView".setDefaultValue(lineView) + "voltageLevelView".setDefaultValue(voltageLevelView) + "cableModelView".setDefaultValue(cableModelView) + "cableSpecView".setDefaultValue(cableSpecView) + "cableBrandView".setDefaultValue(cableBrandView) + "cableStartView".setDefaultValue(cableStartView) + "cableEndView".setDefaultValue(cableEndView) + "jointCreatorView".setDefaultValue(jointCreatorView) + "objectRemarkView1".setDefaultValue(objectRemarkView1) + "objectRemarkView2".setDefaultValue(objectRemarkView2) + "objectRemarkView3".setDefaultValue(objectRemarkView3) + + val smallLabelData = SmallLabelDataClass( + companyId, + markerIdView.text.toString(), + markerNumberView.text.toString(), + markerNameView.text.toString(), + smallLabelIdView.text.toString(), + cableNameView.toString(), + cableNumberView.toString(), + lineView.text.toString(), + voltageLevelView.toString(), + cableModelView.text.toString(), + cableSpecView.text.toString(), + cableBrandView.text.toString(), + cableStartView.text.toString(), + cableEndView.text.toString(), + middleJointSpinner.selectedItem.toString(), + jointCreatorView.text.toString(), + objectRemarkView1.text.toString(), + objectRemarkView2.text.toString(), + objectRemarkView3.text.toString(), + realPaths + ) + + //先存本地 + lifecycleScope.launch { + withContext(Dispatchers.IO) { + DataBaseManager.get.insertSmallLabel(smallLabelData) + } + } + + //再存服务器 + taskViewModel.installSmallLabel(smallLabelData) + } else { + NoNetworkDialog.Builder() + .setContext(context) + .setOnDialogButtonClickListener(object : + NoNetworkDialog.OnDialogButtonClickListener { + override fun onButtonClick() { + val intent = Intent(Settings.ACTION_SETTINGS) + startActivity(intent) + } + }).build().show() + } + } + + readLabelButton.setOnClickListener { + gpioManager.setGpioHigh("18") + + LoadingDialogHub.show(this, "标识器读取中,请稍后...") + + soundResId = soundPool.load(this, R.raw.ring3, 1) + soundPool.setOnLoadCompleteListener { soundPool, _, _ -> + soundPool.play(soundResId, 1f, 1f, 0, -1, 1f) + } + + // 1000ms后发送读标识器或搜索信号 + weakReferenceHandler.postDelayed({ + try { + // 发送读标识器或搜索信号 + outputStream?.write("2".toByteArray()) + outputStream?.flush() + } catch (e: IOException) { + e.printStackTrace() + } + }, 1000) + } } override fun onDataReceived(buffer: ByteArray?, size: Int) { - Log.d(kTag, "onDataReceived => " + buffer.contentToString()) if (buffer != null) { val message = weakReferenceHandler.obtainMessage() message.what = 2023081702 @@ -73,15 +314,48 @@ override fun handleMessage(msg: Message): Boolean { if (msg.what == 2023081702) { + soundPool.release() + val buffer = msg.obj as ByteArray + val hex = buffer.toHex() + + Log.d(kTag, "handleMessage => $hex") + if (hex.length >= 20) { + val markerId = hex.substring(0, 20).hexToString() + + gpioManager.setGpioLow("18") + + //查本地库 + val result = DataBaseManager.get.queryLabelById(markerId) + if (result.isEmpty()) { + markerIdView.text = markerId + } else { + "此标识器已安装,请更换标识器!".show(this) + } + LoadingDialogHub.dismiss() + } } return true } + private fun analyticalSelectResult(result: LocalMedia) { + //压缩图片 + result.realPath.compressImage(this, object : OnImageCompressListener { + override fun onSuccess(file: File) { + realPaths.add(file.absolutePath) + imageAdapter.setupImage(realPaths) + } + + override fun onError(e: Throwable) { + e.printStackTrace() + } + }) + } + override fun onDestroy() { + super.onDestroy() soundPool.release() gpioManager.setGpioLow("18") - super.onDestroy() } override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean { diff --git a/app/src/main/java/com/casic/electric/detector/vm/TaskViewModel.kt b/app/src/main/java/com/casic/electric/detector/vm/TaskViewModel.kt index c51e2aa..476a5f0 100644 --- a/app/src/main/java/com/casic/electric/detector/vm/TaskViewModel.kt +++ b/app/src/main/java/com/casic/electric/detector/vm/TaskViewModel.kt @@ -8,6 +8,7 @@ import com.casic.electric.detector.model.MarkerFileModel import com.casic.electric.detector.retrofit.RetrofitServiceManager import com.casic.electric.detector.utils.LabelDataClass +import com.casic.electric.detector.utils.SmallLabelDataClass import com.google.gson.Gson import com.google.gson.reflect.TypeToken import com.pengxh.kt.lite.extensions.launch @@ -61,6 +62,20 @@ it.convertChinese().show(BaseApplication.get()) }) + fun installSmallLabel(labelData: SmallLabelDataClass) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.installSmallLabel(labelData) + if (response.separateResponseState()) { + loadState.value = LoadState.Success + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show(BaseApplication.get()) + } + }, { + loadState.value = LoadState.Fail + it.convertChinese().show(BaseApplication.get()) + }) + // fun uploadTask(userId: String, taskId: String?, state: String) = launch({ // loadState.value = LoadState.Loading // val response = RetrofitServiceManager.uploadTask(userId, taskId, state) diff --git a/app/src/main/res/drawable/btn_back.xml b/app/src/main/res/drawable/btn_back.xml deleted file mode 100644 index f3405f5..0000000 --- a/app/src/main/res/drawable/btn_back.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/java/com/casic/electric/detector/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/electric/detector/retrofit/RetrofitService.kt index a79a691..950fb91 100644 --- a/app/src/main/java/com/casic/electric/detector/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/electric/detector/retrofit/RetrofitService.kt @@ -64,6 +64,18 @@ ): String /** + * 安装新电子标签 + */ + @Multipart + @POST("/ems/smallMarker/save-smallMarker-na.do") + suspend fun installSmallLabel( + @PartMap jsonMarker: Map, + @Part fileBuffer1: MultipartBody.Part?, + @Part fileBuffer2: MultipartBody.Part?, + @Part fileBuffer3: MultipartBody.Part? + ): String + + /** * 上报事件 */ @Multipart diff --git a/app/src/main/java/com/casic/electric/detector/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/electric/detector/retrofit/RetrofitServiceManager.kt index 9d65bc5..6834fc5 100644 --- a/app/src/main/java/com/casic/electric/detector/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/electric/detector/retrofit/RetrofitServiceManager.kt @@ -2,6 +2,7 @@ import com.casic.electric.detector.utils.LabelDataClass import com.casic.electric.detector.utils.LocaleConstant +import com.casic.electric.detector.utils.SmallLabelDataClass import com.google.gson.JsonObject import com.pengxh.kt.lite.utils.RetrofitFactory import com.pengxh.kt.lite.utils.SaveKeyValues @@ -189,6 +190,72 @@ } /** + * 安装新电子标签 + * Multipart上传图片,文件,带多参数上传 + */ + suspend fun installSmallLabel(labelData: SmallLabelDataClass): String { + val param = JsonObject() + param.addProperty("companyId", labelData.companyId) // 公司ID + param.addProperty("markerId", labelData.markerId) // 标识器ID号 + param.addProperty("locationNo", labelData.locationNo) // 位置点编号 + param.addProperty("locationName", labelData.locationName) // 位置点名称 + param.addProperty("smallMarkerId", labelData.smallMarkerId) // 电子标签ID号 + param.addProperty("cableName", labelData.cableName) // 电缆名称 + param.addProperty("cableNo", labelData.cableNo) // 电缆编号 + param.addProperty("line", labelData.line) // 所属线路 + param.addProperty("pressLevel", labelData.pressLevel) // 电压等级 + param.addProperty("cableType", labelData.cableType) // 电缆型号 + param.addProperty("cableSpec", labelData.cableSpec) // 电缆规格 + param.addProperty("cableBrand", labelData.cableBrand) // 电缆品牌 + param.addProperty("cableStart", labelData.cableStart) // 电缆起点 + param.addProperty("cableEnd", labelData.cableEnd) // 电缆终点 + param.addProperty("hasJoint", labelData.hasJoint) // 中间接头 + param.addProperty("jointCreator", labelData.jointCreator) // 中间接头制作人 + param.addProperty("memo1", labelData.memo1) // 备注1 + param.addProperty("memo2", labelData.memo2) // 备注2 + param.addProperty("memo3", labelData.memo3) // 备注3 + + val requestBody = param.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + val res = HashMap() + res["jsonMarker"] = requestBody + + val multiParts = ArrayList() + labelData.realPaths.forEachIndexed { index, s -> + val file = File(s) + val fileMultipart = MultipartBody.Part.createFormData( + "fileBuffer${index + 1}", file.name, file.asRequestBody("image/png".toMediaType()) + ) + multiParts.add(fileMultipart) + } + + val api by lazy { + val serverIp = SaveKeyValues.getValue(LocaleConstant.SERVER_IP, "") as String + val serverPort = SaveKeyValues.getValue(LocaleConstant.SERVER_PORT, "") as String + val httpConfig = "http://${serverIp}:${serverPort}" + RetrofitFactory.createRetrofit(httpConfig) + } + return when (multiParts.size) { + 3 -> { + api.installSmallLabel(res, multiParts[0], multiParts[1], multiParts[2]) + } + + 2 -> { + api.installSmallLabel(res, multiParts[0], multiParts[1], null) + } + + 1 -> { + api.installSmallLabel(res, multiParts[0], null, null) + } + + else -> { + api.installSmallLabel(res, null, null, null) + } + } + } + + /** * 上报事件 * Multipart上传图片,文件,带多参数上传 */ diff --git a/app/src/main/java/com/casic/electric/detector/utils/DataBaseManager.kt b/app/src/main/java/com/casic/electric/detector/utils/DataBaseManager.kt index 798f310..8f6caba 100644 --- a/app/src/main/java/com/casic/electric/detector/utils/DataBaseManager.kt +++ b/app/src/main/java/com/casic/electric/detector/utils/DataBaseManager.kt @@ -136,10 +136,37 @@ /******************************* Small Lable *** Start **************************************/ + //下载服务器表格后存本地 fun insertSmallLabel(bean: SmallLabelBean) { smallLabelBeanDao.insert(bean) } + //上传服务器之前存本地 + fun insertSmallLabel(labelData: SmallLabelDataClass) { + val labelBean = SmallLabelBean() + labelBean.markerId = labelData.markerId + labelBean.locationNumber = labelData.locationNo + labelBean.locationName = labelData.locationName + labelBean.electricMarkerId = labelData.smallMarkerId + labelBean.cableName = labelData.cableName + labelBean.cableNumber = labelData.cableNo + labelBean.line = labelData.line + labelBean.voltageLevel = labelData.pressLevel + labelBean.cableType = labelData.cableType + labelBean.cableSpec = labelData.cableSpec + labelBean.cableBrand = labelData.cableBrand + labelBean.cableStart = labelData.cableStart + labelBean.cableEnd = labelData.cableEnd + labelBean.hasJoint = labelData.hasJoint + labelBean.jointCreator = labelData.jointCreator + labelBean.imagePath = labelData.realPaths.toJson() + labelBean.memo1 = labelData.memo1 + labelBean.memo2 = labelData.memo2 + labelBean.memo3 = labelData.memo3 + + smallLabelBeanDao.insert(labelBean) + } + fun clearSmallLabels() { smallLabelBeanDao.deleteAll() } diff --git a/app/src/main/java/com/casic/electric/detector/utils/SmallLabelDataClass.kt b/app/src/main/java/com/casic/electric/detector/utils/SmallLabelDataClass.kt new file mode 100644 index 0000000..bafe034 --- /dev/null +++ b/app/src/main/java/com/casic/electric/detector/utils/SmallLabelDataClass.kt @@ -0,0 +1,24 @@ +package com.casic.electric.detector.utils + +data class SmallLabelDataClass( + var companyId: String, + var markerId: String, + var locationNo: String, + var locationName: String, + var smallMarkerId: String, + var cableName: String, + var cableNo: String, + var line: String, + var pressLevel: String, + var cableType: String, + var cableSpec: String, + var cableBrand: String, + var cableStart: String, + var cableEnd: String, + var hasJoint: String, + var jointCreator: String, + var memo1: String, + var memo2: String, + var memo3: String, + var realPaths: ArrayList +) diff --git a/app/src/main/java/com/casic/electric/detector/view/InstallLabelActivity.kt b/app/src/main/java/com/casic/electric/detector/view/InstallLabelActivity.kt index 175291e..07626d6 100644 --- a/app/src/main/java/com/casic/electric/detector/view/InstallLabelActivity.kt +++ b/app/src/main/java/com/casic/electric/detector/view/InstallLabelActivity.kt @@ -63,7 +63,6 @@ private lateinit var soundPool: SoundPool private lateinit var imageAdapter: EditableImageAdapter private lateinit var taskViewModel: TaskViewModel - private lateinit var labelData: LabelDataClass override fun initLayoutView(): Int = R.layout.activity_install_label @@ -367,7 +366,7 @@ val objectTypeCode = itemPosition + 1 if (markerIdView.text.isNullOrBlank()) { - "ID号不能为空,请读标识器".show(this) + "标识器ID不能为空,请读标识器".show(this) return@setOnClickListener } @@ -417,7 +416,7 @@ "remarkView2".setDefaultValue(remarkView2) "remarkView3".setDefaultValue(remarkView3) - labelData = LabelDataClass( + val labelData = LabelDataClass( companyId, objectTypeCode.toString(), objectCodeView.text.toString(), @@ -575,9 +574,9 @@ } override fun onDestroy() { + super.onDestroy() soundPool.release() gpioManager.setGpioLow("18") - super.onDestroy() } override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean { diff --git a/app/src/main/java/com/casic/electric/detector/view/InstallSmallLabelActivity.kt b/app/src/main/java/com/casic/electric/detector/view/InstallSmallLabelActivity.kt index 0eb09ef..d6888ee 100644 --- a/app/src/main/java/com/casic/electric/detector/view/InstallSmallLabelActivity.kt +++ b/app/src/main/java/com/casic/electric/detector/view/InstallSmallLabelActivity.kt @@ -1,31 +1,63 @@ package com.casic.electric.detector.view +import android.annotation.SuppressLint import android.content.Context +import android.content.Intent import android.media.AudioAttributes import android.media.SoundPool import android.os.Bundle import android.os.Handler import android.os.Message +import android.provider.Settings import android.util.Log import android.view.KeyEvent +import android.view.View +import android.view.WindowManager +import android.widget.AdapterView +import androidx.lifecycle.ViewModelProvider +import androidx.lifecycle.lifecycleScope import com.casic.electric.detector.R +import com.casic.electric.detector.adapter.EditableImageAdapter import com.casic.electric.detector.base.SerialPortActivity -import com.casic.electric.detector.extensions.initLayoutImmersionBar -import com.casic.electric.detector.utils.GpioManager +import com.casic.electric.detector.callback.OnImageCompressListener +import com.casic.electric.detector.extensions.* +import com.casic.electric.detector.utils.* +import com.casic.electric.detector.vm.TaskViewModel import com.gyf.immersionbar.ImmersionBar +import com.luck.picture.lib.basic.PictureSelector +import com.luck.picture.lib.config.SelectMimeType +import com.luck.picture.lib.entity.LocalMedia +import com.luck.picture.lib.interfaces.OnResultCallbackListener import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.isNetworkConnected +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.vm.LoadState +import com.pengxh.kt.lite.widget.dialog.NoNetworkDialog import kotlinx.android.synthetic.main.activity_install_small_label.* import kotlinx.android.synthetic.main.include_base_title.* +import kotlinx.android.synthetic.main.include_open_camera.* +import kotlinx.android.synthetic.main.include_small_label_object_attribute.* +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext +import java.io.File +import java.io.IOException +@SuppressLint("SetTextI18n") class InstallSmallLabelActivity : SerialPortActivity(), Handler.Callback { private val kTag = "SmallLabelActivity" private val context: Context = this@InstallSmallLabelActivity private val gpioManager by lazy { GpioManager() } + private val realPaths: ArrayList = ArrayList() //真实图片路径 private var soundResId = 0 private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var soundPool: SoundPool + private lateinit var imageAdapter: EditableImageAdapter + private lateinit var taskViewModel: TaskViewModel override fun initLayoutView(): Int = R.layout.activity_install_small_label @@ -41,6 +73,8 @@ } override fun initData(savedInstanceState: Bundle?) { + window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN or WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN) + weakReferenceHandler = WeakReferenceHandler(this) val audioAttributes = AudioAttributes.Builder() @@ -51,18 +85,225 @@ .setMaxStreams(16) .setAudioAttributes(audioAttributes) .build() + + //设置上次填写过的值 + cableNumberView.setText("cableNumberView".getDefaultValue()) + cableNameView.setText("cableNameView".getDefaultValue()) + lineView.setText("lineView".getDefaultValue()) + voltageLevelView.setText("voltageLevelView".getDefaultValue()) + cableModelView.setText("cableModelView".getDefaultValue()) + cableSpecView.setText("cableSpecView".getDefaultValue()) + cableBrandView.setText("cableBrandView".getDefaultValue()) + cableStartView.setText("cableStartView".getDefaultValue()) + cableEndView.setText("cableEndView".getDefaultValue()) + jointCreatorView.setText("jointCreatorView".getDefaultValue()) + objectRemarkView1.setText("objectRemarkView1".getDefaultValue()) + objectRemarkView2.setText("objectRemarkView2".getDefaultValue()) + objectRemarkView3.setText("objectRemarkView3".getDefaultValue()) + + //初始化图片九宫格 + imageAdapter = EditableImageAdapter(this, 3, 3f) + addImageRecyclerView.adapter = imageAdapter + + taskViewModel = ViewModelProvider(this)[TaskViewModel::class.java] } override fun observeRequestState() { - + taskViewModel.loadState.observe(this) { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(this, "电子标签安装中,请稍后...") + LoadState.Success -> { + LoadingDialogHub.dismiss() + finish() + } + else -> LoadingDialogHub.dismiss() + } + } } override fun initEvent() { + leftBackView.setOnClickListener { finish() } + /**************************************************************************************/ + + //TODO 读取电子标签为未实现 + readElectricTagButton.setOnClickListener { + gpioManager.setGpioHigh("18") + + LoadingDialogHub.show(this, "电子标签读取中,请稍后...") + + soundResId = soundPool.load(this, R.raw.ring3, 1) + soundPool.setOnLoadCompleteListener { soundPool, _, _ -> + soundPool.play(soundResId, 1f, 1f, 0, -1, 1f) + } + + // 1000ms后发送读标识器或搜索信号 + weakReferenceHandler.postDelayed({ + try { + // 发送读标识器或搜索信号 + outputStream?.write("00".toByteArray()) + outputStream?.flush() + } catch (e: IOException) { + e.printStackTrace() + } + }, 1000) + } + + bindMarkerSpinner.show(this, arrayOf("是", "否"), 0) + bindMarkerSpinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener { + override fun onItemSelected( + parent: AdapterView<*>?, view: View?, position: Int, id: Long + ) { + if (position == 0) { + markerLayout.visibility = View.VISIBLE + } else { + markerLayout.visibility = View.GONE + } + } + + override fun onNothingSelected(parent: AdapterView<*>?) { + + } + } + + middleJointSpinner.show(this, arrayOf("有", "无"), 0) + + imageAdapter.setOnItemClickListener(object : EditableImageAdapter.OnItemClickListener { + override fun onAddImageClick() { + PictureSelector.create(this@InstallSmallLabelActivity) + .openCamera(SelectMimeType.ofImage()) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: java.util.ArrayList?) { + if (result == null) { + "拍照失败,请重试".show(context) + return + } + analyticalSelectResult(result[0]) + } + + override fun onCancel() { + + } + }) + } + + override fun onItemClick(position: Int) { + if (realPaths[position].isEmpty()) { + "图片加载失败,无法查看大图".show(context) + } else { + context.navigatePageTo(position, realPaths) + } + } + + override fun onItemLongClick(view: View?, position: Int) { + imageAdapter.deleteImage(position) + } + }) + + /**************************************************************************************/ + installButton.setOnClickListener { + if (isNetworkConnected()) { + val companyId = SaveKeyValues.getValue(LocaleConstant.USER_COMPANY_ID, "") as String + + if (markerIdView.text.isNullOrBlank()) { + "标识器ID不能为空,请读标识器".show(this) + return@setOnClickListener + } + + if (smallLabelIdView.text.isNullOrBlank()) { + "电子标签ID不能为空,请读电子标签".show(this) + return@setOnClickListener + } + + if (voltageLevelView.text.isNullOrBlank()) { + "电压等级不能为空,请输入电压等级".show(this) + return@setOnClickListener + } + + //保存默认值 + "cableNumberView".setDefaultValue(cableNumberView) + "cableNameView".setDefaultValue(cableNameView) + "lineView".setDefaultValue(lineView) + "voltageLevelView".setDefaultValue(voltageLevelView) + "cableModelView".setDefaultValue(cableModelView) + "cableSpecView".setDefaultValue(cableSpecView) + "cableBrandView".setDefaultValue(cableBrandView) + "cableStartView".setDefaultValue(cableStartView) + "cableEndView".setDefaultValue(cableEndView) + "jointCreatorView".setDefaultValue(jointCreatorView) + "objectRemarkView1".setDefaultValue(objectRemarkView1) + "objectRemarkView2".setDefaultValue(objectRemarkView2) + "objectRemarkView3".setDefaultValue(objectRemarkView3) + + val smallLabelData = SmallLabelDataClass( + companyId, + markerIdView.text.toString(), + markerNumberView.text.toString(), + markerNameView.text.toString(), + smallLabelIdView.text.toString(), + cableNameView.toString(), + cableNumberView.toString(), + lineView.text.toString(), + voltageLevelView.toString(), + cableModelView.text.toString(), + cableSpecView.text.toString(), + cableBrandView.text.toString(), + cableStartView.text.toString(), + cableEndView.text.toString(), + middleJointSpinner.selectedItem.toString(), + jointCreatorView.text.toString(), + objectRemarkView1.text.toString(), + objectRemarkView2.text.toString(), + objectRemarkView3.text.toString(), + realPaths + ) + + //先存本地 + lifecycleScope.launch { + withContext(Dispatchers.IO) { + DataBaseManager.get.insertSmallLabel(smallLabelData) + } + } + + //再存服务器 + taskViewModel.installSmallLabel(smallLabelData) + } else { + NoNetworkDialog.Builder() + .setContext(context) + .setOnDialogButtonClickListener(object : + NoNetworkDialog.OnDialogButtonClickListener { + override fun onButtonClick() { + val intent = Intent(Settings.ACTION_SETTINGS) + startActivity(intent) + } + }).build().show() + } + } + + readLabelButton.setOnClickListener { + gpioManager.setGpioHigh("18") + + LoadingDialogHub.show(this, "标识器读取中,请稍后...") + + soundResId = soundPool.load(this, R.raw.ring3, 1) + soundPool.setOnLoadCompleteListener { soundPool, _, _ -> + soundPool.play(soundResId, 1f, 1f, 0, -1, 1f) + } + + // 1000ms后发送读标识器或搜索信号 + weakReferenceHandler.postDelayed({ + try { + // 发送读标识器或搜索信号 + outputStream?.write("2".toByteArray()) + outputStream?.flush() + } catch (e: IOException) { + e.printStackTrace() + } + }, 1000) + } } override fun onDataReceived(buffer: ByteArray?, size: Int) { - Log.d(kTag, "onDataReceived => " + buffer.contentToString()) if (buffer != null) { val message = weakReferenceHandler.obtainMessage() message.what = 2023081702 @@ -73,15 +314,48 @@ override fun handleMessage(msg: Message): Boolean { if (msg.what == 2023081702) { + soundPool.release() + val buffer = msg.obj as ByteArray + val hex = buffer.toHex() + + Log.d(kTag, "handleMessage => $hex") + if (hex.length >= 20) { + val markerId = hex.substring(0, 20).hexToString() + + gpioManager.setGpioLow("18") + + //查本地库 + val result = DataBaseManager.get.queryLabelById(markerId) + if (result.isEmpty()) { + markerIdView.text = markerId + } else { + "此标识器已安装,请更换标识器!".show(this) + } + LoadingDialogHub.dismiss() + } } return true } + private fun analyticalSelectResult(result: LocalMedia) { + //压缩图片 + result.realPath.compressImage(this, object : OnImageCompressListener { + override fun onSuccess(file: File) { + realPaths.add(file.absolutePath) + imageAdapter.setupImage(realPaths) + } + + override fun onError(e: Throwable) { + e.printStackTrace() + } + }) + } + override fun onDestroy() { + super.onDestroy() soundPool.release() gpioManager.setGpioLow("18") - super.onDestroy() } override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean { diff --git a/app/src/main/java/com/casic/electric/detector/vm/TaskViewModel.kt b/app/src/main/java/com/casic/electric/detector/vm/TaskViewModel.kt index c51e2aa..476a5f0 100644 --- a/app/src/main/java/com/casic/electric/detector/vm/TaskViewModel.kt +++ b/app/src/main/java/com/casic/electric/detector/vm/TaskViewModel.kt @@ -8,6 +8,7 @@ import com.casic.electric.detector.model.MarkerFileModel import com.casic.electric.detector.retrofit.RetrofitServiceManager import com.casic.electric.detector.utils.LabelDataClass +import com.casic.electric.detector.utils.SmallLabelDataClass import com.google.gson.Gson import com.google.gson.reflect.TypeToken import com.pengxh.kt.lite.extensions.launch @@ -61,6 +62,20 @@ it.convertChinese().show(BaseApplication.get()) }) + fun installSmallLabel(labelData: SmallLabelDataClass) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.installSmallLabel(labelData) + if (response.separateResponseState()) { + loadState.value = LoadState.Success + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show(BaseApplication.get()) + } + }, { + loadState.value = LoadState.Fail + it.convertChinese().show(BaseApplication.get()) + }) + // fun uploadTask(userId: String, taskId: String?, state: String) = launch({ // loadState.value = LoadState.Loading // val response = RetrofitServiceManager.uploadTask(userId, taskId, state) diff --git a/app/src/main/res/drawable/btn_back.xml b/app/src/main/res/drawable/btn_back.xml deleted file mode 100644 index f3405f5..0000000 --- a/app/src/main/res/drawable/btn_back.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/font/fzdhjt.ttf b/app/src/main/res/font/fzdhjt.ttf new file mode 100644 index 0000000..1c14f7f --- /dev/null +++ b/app/src/main/res/font/fzdhjt.ttf Binary files differ diff --git a/app/src/main/java/com/casic/electric/detector/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/electric/detector/retrofit/RetrofitService.kt index a79a691..950fb91 100644 --- a/app/src/main/java/com/casic/electric/detector/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/electric/detector/retrofit/RetrofitService.kt @@ -64,6 +64,18 @@ ): String /** + * 安装新电子标签 + */ + @Multipart + @POST("/ems/smallMarker/save-smallMarker-na.do") + suspend fun installSmallLabel( + @PartMap jsonMarker: Map, + @Part fileBuffer1: MultipartBody.Part?, + @Part fileBuffer2: MultipartBody.Part?, + @Part fileBuffer3: MultipartBody.Part? + ): String + + /** * 上报事件 */ @Multipart diff --git a/app/src/main/java/com/casic/electric/detector/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/electric/detector/retrofit/RetrofitServiceManager.kt index 9d65bc5..6834fc5 100644 --- a/app/src/main/java/com/casic/electric/detector/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/electric/detector/retrofit/RetrofitServiceManager.kt @@ -2,6 +2,7 @@ import com.casic.electric.detector.utils.LabelDataClass import com.casic.electric.detector.utils.LocaleConstant +import com.casic.electric.detector.utils.SmallLabelDataClass import com.google.gson.JsonObject import com.pengxh.kt.lite.utils.RetrofitFactory import com.pengxh.kt.lite.utils.SaveKeyValues @@ -189,6 +190,72 @@ } /** + * 安装新电子标签 + * Multipart上传图片,文件,带多参数上传 + */ + suspend fun installSmallLabel(labelData: SmallLabelDataClass): String { + val param = JsonObject() + param.addProperty("companyId", labelData.companyId) // 公司ID + param.addProperty("markerId", labelData.markerId) // 标识器ID号 + param.addProperty("locationNo", labelData.locationNo) // 位置点编号 + param.addProperty("locationName", labelData.locationName) // 位置点名称 + param.addProperty("smallMarkerId", labelData.smallMarkerId) // 电子标签ID号 + param.addProperty("cableName", labelData.cableName) // 电缆名称 + param.addProperty("cableNo", labelData.cableNo) // 电缆编号 + param.addProperty("line", labelData.line) // 所属线路 + param.addProperty("pressLevel", labelData.pressLevel) // 电压等级 + param.addProperty("cableType", labelData.cableType) // 电缆型号 + param.addProperty("cableSpec", labelData.cableSpec) // 电缆规格 + param.addProperty("cableBrand", labelData.cableBrand) // 电缆品牌 + param.addProperty("cableStart", labelData.cableStart) // 电缆起点 + param.addProperty("cableEnd", labelData.cableEnd) // 电缆终点 + param.addProperty("hasJoint", labelData.hasJoint) // 中间接头 + param.addProperty("jointCreator", labelData.jointCreator) // 中间接头制作人 + param.addProperty("memo1", labelData.memo1) // 备注1 + param.addProperty("memo2", labelData.memo2) // 备注2 + param.addProperty("memo3", labelData.memo3) // 备注3 + + val requestBody = param.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + val res = HashMap() + res["jsonMarker"] = requestBody + + val multiParts = ArrayList() + labelData.realPaths.forEachIndexed { index, s -> + val file = File(s) + val fileMultipart = MultipartBody.Part.createFormData( + "fileBuffer${index + 1}", file.name, file.asRequestBody("image/png".toMediaType()) + ) + multiParts.add(fileMultipart) + } + + val api by lazy { + val serverIp = SaveKeyValues.getValue(LocaleConstant.SERVER_IP, "") as String + val serverPort = SaveKeyValues.getValue(LocaleConstant.SERVER_PORT, "") as String + val httpConfig = "http://${serverIp}:${serverPort}" + RetrofitFactory.createRetrofit(httpConfig) + } + return when (multiParts.size) { + 3 -> { + api.installSmallLabel(res, multiParts[0], multiParts[1], multiParts[2]) + } + + 2 -> { + api.installSmallLabel(res, multiParts[0], multiParts[1], null) + } + + 1 -> { + api.installSmallLabel(res, multiParts[0], null, null) + } + + else -> { + api.installSmallLabel(res, null, null, null) + } + } + } + + /** * 上报事件 * Multipart上传图片,文件,带多参数上传 */ diff --git a/app/src/main/java/com/casic/electric/detector/utils/DataBaseManager.kt b/app/src/main/java/com/casic/electric/detector/utils/DataBaseManager.kt index 798f310..8f6caba 100644 --- a/app/src/main/java/com/casic/electric/detector/utils/DataBaseManager.kt +++ b/app/src/main/java/com/casic/electric/detector/utils/DataBaseManager.kt @@ -136,10 +136,37 @@ /******************************* Small Lable *** Start **************************************/ + //下载服务器表格后存本地 fun insertSmallLabel(bean: SmallLabelBean) { smallLabelBeanDao.insert(bean) } + //上传服务器之前存本地 + fun insertSmallLabel(labelData: SmallLabelDataClass) { + val labelBean = SmallLabelBean() + labelBean.markerId = labelData.markerId + labelBean.locationNumber = labelData.locationNo + labelBean.locationName = labelData.locationName + labelBean.electricMarkerId = labelData.smallMarkerId + labelBean.cableName = labelData.cableName + labelBean.cableNumber = labelData.cableNo + labelBean.line = labelData.line + labelBean.voltageLevel = labelData.pressLevel + labelBean.cableType = labelData.cableType + labelBean.cableSpec = labelData.cableSpec + labelBean.cableBrand = labelData.cableBrand + labelBean.cableStart = labelData.cableStart + labelBean.cableEnd = labelData.cableEnd + labelBean.hasJoint = labelData.hasJoint + labelBean.jointCreator = labelData.jointCreator + labelBean.imagePath = labelData.realPaths.toJson() + labelBean.memo1 = labelData.memo1 + labelBean.memo2 = labelData.memo2 + labelBean.memo3 = labelData.memo3 + + smallLabelBeanDao.insert(labelBean) + } + fun clearSmallLabels() { smallLabelBeanDao.deleteAll() } diff --git a/app/src/main/java/com/casic/electric/detector/utils/SmallLabelDataClass.kt b/app/src/main/java/com/casic/electric/detector/utils/SmallLabelDataClass.kt new file mode 100644 index 0000000..bafe034 --- /dev/null +++ b/app/src/main/java/com/casic/electric/detector/utils/SmallLabelDataClass.kt @@ -0,0 +1,24 @@ +package com.casic.electric.detector.utils + +data class SmallLabelDataClass( + var companyId: String, + var markerId: String, + var locationNo: String, + var locationName: String, + var smallMarkerId: String, + var cableName: String, + var cableNo: String, + var line: String, + var pressLevel: String, + var cableType: String, + var cableSpec: String, + var cableBrand: String, + var cableStart: String, + var cableEnd: String, + var hasJoint: String, + var jointCreator: String, + var memo1: String, + var memo2: String, + var memo3: String, + var realPaths: ArrayList +) diff --git a/app/src/main/java/com/casic/electric/detector/view/InstallLabelActivity.kt b/app/src/main/java/com/casic/electric/detector/view/InstallLabelActivity.kt index 175291e..07626d6 100644 --- a/app/src/main/java/com/casic/electric/detector/view/InstallLabelActivity.kt +++ b/app/src/main/java/com/casic/electric/detector/view/InstallLabelActivity.kt @@ -63,7 +63,6 @@ private lateinit var soundPool: SoundPool private lateinit var imageAdapter: EditableImageAdapter private lateinit var taskViewModel: TaskViewModel - private lateinit var labelData: LabelDataClass override fun initLayoutView(): Int = R.layout.activity_install_label @@ -367,7 +366,7 @@ val objectTypeCode = itemPosition + 1 if (markerIdView.text.isNullOrBlank()) { - "ID号不能为空,请读标识器".show(this) + "标识器ID不能为空,请读标识器".show(this) return@setOnClickListener } @@ -417,7 +416,7 @@ "remarkView2".setDefaultValue(remarkView2) "remarkView3".setDefaultValue(remarkView3) - labelData = LabelDataClass( + val labelData = LabelDataClass( companyId, objectTypeCode.toString(), objectCodeView.text.toString(), @@ -575,9 +574,9 @@ } override fun onDestroy() { + super.onDestroy() soundPool.release() gpioManager.setGpioLow("18") - super.onDestroy() } override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean { diff --git a/app/src/main/java/com/casic/electric/detector/view/InstallSmallLabelActivity.kt b/app/src/main/java/com/casic/electric/detector/view/InstallSmallLabelActivity.kt index 0eb09ef..d6888ee 100644 --- a/app/src/main/java/com/casic/electric/detector/view/InstallSmallLabelActivity.kt +++ b/app/src/main/java/com/casic/electric/detector/view/InstallSmallLabelActivity.kt @@ -1,31 +1,63 @@ package com.casic.electric.detector.view +import android.annotation.SuppressLint import android.content.Context +import android.content.Intent import android.media.AudioAttributes import android.media.SoundPool import android.os.Bundle import android.os.Handler import android.os.Message +import android.provider.Settings import android.util.Log import android.view.KeyEvent +import android.view.View +import android.view.WindowManager +import android.widget.AdapterView +import androidx.lifecycle.ViewModelProvider +import androidx.lifecycle.lifecycleScope import com.casic.electric.detector.R +import com.casic.electric.detector.adapter.EditableImageAdapter import com.casic.electric.detector.base.SerialPortActivity -import com.casic.electric.detector.extensions.initLayoutImmersionBar -import com.casic.electric.detector.utils.GpioManager +import com.casic.electric.detector.callback.OnImageCompressListener +import com.casic.electric.detector.extensions.* +import com.casic.electric.detector.utils.* +import com.casic.electric.detector.vm.TaskViewModel import com.gyf.immersionbar.ImmersionBar +import com.luck.picture.lib.basic.PictureSelector +import com.luck.picture.lib.config.SelectMimeType +import com.luck.picture.lib.entity.LocalMedia +import com.luck.picture.lib.interfaces.OnResultCallbackListener import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.isNetworkConnected +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.vm.LoadState +import com.pengxh.kt.lite.widget.dialog.NoNetworkDialog import kotlinx.android.synthetic.main.activity_install_small_label.* import kotlinx.android.synthetic.main.include_base_title.* +import kotlinx.android.synthetic.main.include_open_camera.* +import kotlinx.android.synthetic.main.include_small_label_object_attribute.* +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext +import java.io.File +import java.io.IOException +@SuppressLint("SetTextI18n") class InstallSmallLabelActivity : SerialPortActivity(), Handler.Callback { private val kTag = "SmallLabelActivity" private val context: Context = this@InstallSmallLabelActivity private val gpioManager by lazy { GpioManager() } + private val realPaths: ArrayList = ArrayList() //真实图片路径 private var soundResId = 0 private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var soundPool: SoundPool + private lateinit var imageAdapter: EditableImageAdapter + private lateinit var taskViewModel: TaskViewModel override fun initLayoutView(): Int = R.layout.activity_install_small_label @@ -41,6 +73,8 @@ } override fun initData(savedInstanceState: Bundle?) { + window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN or WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN) + weakReferenceHandler = WeakReferenceHandler(this) val audioAttributes = AudioAttributes.Builder() @@ -51,18 +85,225 @@ .setMaxStreams(16) .setAudioAttributes(audioAttributes) .build() + + //设置上次填写过的值 + cableNumberView.setText("cableNumberView".getDefaultValue()) + cableNameView.setText("cableNameView".getDefaultValue()) + lineView.setText("lineView".getDefaultValue()) + voltageLevelView.setText("voltageLevelView".getDefaultValue()) + cableModelView.setText("cableModelView".getDefaultValue()) + cableSpecView.setText("cableSpecView".getDefaultValue()) + cableBrandView.setText("cableBrandView".getDefaultValue()) + cableStartView.setText("cableStartView".getDefaultValue()) + cableEndView.setText("cableEndView".getDefaultValue()) + jointCreatorView.setText("jointCreatorView".getDefaultValue()) + objectRemarkView1.setText("objectRemarkView1".getDefaultValue()) + objectRemarkView2.setText("objectRemarkView2".getDefaultValue()) + objectRemarkView3.setText("objectRemarkView3".getDefaultValue()) + + //初始化图片九宫格 + imageAdapter = EditableImageAdapter(this, 3, 3f) + addImageRecyclerView.adapter = imageAdapter + + taskViewModel = ViewModelProvider(this)[TaskViewModel::class.java] } override fun observeRequestState() { - + taskViewModel.loadState.observe(this) { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(this, "电子标签安装中,请稍后...") + LoadState.Success -> { + LoadingDialogHub.dismiss() + finish() + } + else -> LoadingDialogHub.dismiss() + } + } } override fun initEvent() { + leftBackView.setOnClickListener { finish() } + /**************************************************************************************/ + + //TODO 读取电子标签为未实现 + readElectricTagButton.setOnClickListener { + gpioManager.setGpioHigh("18") + + LoadingDialogHub.show(this, "电子标签读取中,请稍后...") + + soundResId = soundPool.load(this, R.raw.ring3, 1) + soundPool.setOnLoadCompleteListener { soundPool, _, _ -> + soundPool.play(soundResId, 1f, 1f, 0, -1, 1f) + } + + // 1000ms后发送读标识器或搜索信号 + weakReferenceHandler.postDelayed({ + try { + // 发送读标识器或搜索信号 + outputStream?.write("00".toByteArray()) + outputStream?.flush() + } catch (e: IOException) { + e.printStackTrace() + } + }, 1000) + } + + bindMarkerSpinner.show(this, arrayOf("是", "否"), 0) + bindMarkerSpinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener { + override fun onItemSelected( + parent: AdapterView<*>?, view: View?, position: Int, id: Long + ) { + if (position == 0) { + markerLayout.visibility = View.VISIBLE + } else { + markerLayout.visibility = View.GONE + } + } + + override fun onNothingSelected(parent: AdapterView<*>?) { + + } + } + + middleJointSpinner.show(this, arrayOf("有", "无"), 0) + + imageAdapter.setOnItemClickListener(object : EditableImageAdapter.OnItemClickListener { + override fun onAddImageClick() { + PictureSelector.create(this@InstallSmallLabelActivity) + .openCamera(SelectMimeType.ofImage()) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: java.util.ArrayList?) { + if (result == null) { + "拍照失败,请重试".show(context) + return + } + analyticalSelectResult(result[0]) + } + + override fun onCancel() { + + } + }) + } + + override fun onItemClick(position: Int) { + if (realPaths[position].isEmpty()) { + "图片加载失败,无法查看大图".show(context) + } else { + context.navigatePageTo(position, realPaths) + } + } + + override fun onItemLongClick(view: View?, position: Int) { + imageAdapter.deleteImage(position) + } + }) + + /**************************************************************************************/ + installButton.setOnClickListener { + if (isNetworkConnected()) { + val companyId = SaveKeyValues.getValue(LocaleConstant.USER_COMPANY_ID, "") as String + + if (markerIdView.text.isNullOrBlank()) { + "标识器ID不能为空,请读标识器".show(this) + return@setOnClickListener + } + + if (smallLabelIdView.text.isNullOrBlank()) { + "电子标签ID不能为空,请读电子标签".show(this) + return@setOnClickListener + } + + if (voltageLevelView.text.isNullOrBlank()) { + "电压等级不能为空,请输入电压等级".show(this) + return@setOnClickListener + } + + //保存默认值 + "cableNumberView".setDefaultValue(cableNumberView) + "cableNameView".setDefaultValue(cableNameView) + "lineView".setDefaultValue(lineView) + "voltageLevelView".setDefaultValue(voltageLevelView) + "cableModelView".setDefaultValue(cableModelView) + "cableSpecView".setDefaultValue(cableSpecView) + "cableBrandView".setDefaultValue(cableBrandView) + "cableStartView".setDefaultValue(cableStartView) + "cableEndView".setDefaultValue(cableEndView) + "jointCreatorView".setDefaultValue(jointCreatorView) + "objectRemarkView1".setDefaultValue(objectRemarkView1) + "objectRemarkView2".setDefaultValue(objectRemarkView2) + "objectRemarkView3".setDefaultValue(objectRemarkView3) + + val smallLabelData = SmallLabelDataClass( + companyId, + markerIdView.text.toString(), + markerNumberView.text.toString(), + markerNameView.text.toString(), + smallLabelIdView.text.toString(), + cableNameView.toString(), + cableNumberView.toString(), + lineView.text.toString(), + voltageLevelView.toString(), + cableModelView.text.toString(), + cableSpecView.text.toString(), + cableBrandView.text.toString(), + cableStartView.text.toString(), + cableEndView.text.toString(), + middleJointSpinner.selectedItem.toString(), + jointCreatorView.text.toString(), + objectRemarkView1.text.toString(), + objectRemarkView2.text.toString(), + objectRemarkView3.text.toString(), + realPaths + ) + + //先存本地 + lifecycleScope.launch { + withContext(Dispatchers.IO) { + DataBaseManager.get.insertSmallLabel(smallLabelData) + } + } + + //再存服务器 + taskViewModel.installSmallLabel(smallLabelData) + } else { + NoNetworkDialog.Builder() + .setContext(context) + .setOnDialogButtonClickListener(object : + NoNetworkDialog.OnDialogButtonClickListener { + override fun onButtonClick() { + val intent = Intent(Settings.ACTION_SETTINGS) + startActivity(intent) + } + }).build().show() + } + } + + readLabelButton.setOnClickListener { + gpioManager.setGpioHigh("18") + + LoadingDialogHub.show(this, "标识器读取中,请稍后...") + + soundResId = soundPool.load(this, R.raw.ring3, 1) + soundPool.setOnLoadCompleteListener { soundPool, _, _ -> + soundPool.play(soundResId, 1f, 1f, 0, -1, 1f) + } + + // 1000ms后发送读标识器或搜索信号 + weakReferenceHandler.postDelayed({ + try { + // 发送读标识器或搜索信号 + outputStream?.write("2".toByteArray()) + outputStream?.flush() + } catch (e: IOException) { + e.printStackTrace() + } + }, 1000) + } } override fun onDataReceived(buffer: ByteArray?, size: Int) { - Log.d(kTag, "onDataReceived => " + buffer.contentToString()) if (buffer != null) { val message = weakReferenceHandler.obtainMessage() message.what = 2023081702 @@ -73,15 +314,48 @@ override fun handleMessage(msg: Message): Boolean { if (msg.what == 2023081702) { + soundPool.release() + val buffer = msg.obj as ByteArray + val hex = buffer.toHex() + + Log.d(kTag, "handleMessage => $hex") + if (hex.length >= 20) { + val markerId = hex.substring(0, 20).hexToString() + + gpioManager.setGpioLow("18") + + //查本地库 + val result = DataBaseManager.get.queryLabelById(markerId) + if (result.isEmpty()) { + markerIdView.text = markerId + } else { + "此标识器已安装,请更换标识器!".show(this) + } + LoadingDialogHub.dismiss() + } } return true } + private fun analyticalSelectResult(result: LocalMedia) { + //压缩图片 + result.realPath.compressImage(this, object : OnImageCompressListener { + override fun onSuccess(file: File) { + realPaths.add(file.absolutePath) + imageAdapter.setupImage(realPaths) + } + + override fun onError(e: Throwable) { + e.printStackTrace() + } + }) + } + override fun onDestroy() { + super.onDestroy() soundPool.release() gpioManager.setGpioLow("18") - super.onDestroy() } override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean { diff --git a/app/src/main/java/com/casic/electric/detector/vm/TaskViewModel.kt b/app/src/main/java/com/casic/electric/detector/vm/TaskViewModel.kt index c51e2aa..476a5f0 100644 --- a/app/src/main/java/com/casic/electric/detector/vm/TaskViewModel.kt +++ b/app/src/main/java/com/casic/electric/detector/vm/TaskViewModel.kt @@ -8,6 +8,7 @@ import com.casic.electric.detector.model.MarkerFileModel import com.casic.electric.detector.retrofit.RetrofitServiceManager import com.casic.electric.detector.utils.LabelDataClass +import com.casic.electric.detector.utils.SmallLabelDataClass import com.google.gson.Gson import com.google.gson.reflect.TypeToken import com.pengxh.kt.lite.extensions.launch @@ -61,6 +62,20 @@ it.convertChinese().show(BaseApplication.get()) }) + fun installSmallLabel(labelData: SmallLabelDataClass) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.installSmallLabel(labelData) + if (response.separateResponseState()) { + loadState.value = LoadState.Success + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show(BaseApplication.get()) + } + }, { + loadState.value = LoadState.Fail + it.convertChinese().show(BaseApplication.get()) + }) + // fun uploadTask(userId: String, taskId: String?, state: String) = launch({ // loadState.value = LoadState.Loading // val response = RetrofitServiceManager.uploadTask(userId, taskId, state) diff --git a/app/src/main/res/drawable/btn_back.xml b/app/src/main/res/drawable/btn_back.xml deleted file mode 100644 index f3405f5..0000000 --- a/app/src/main/res/drawable/btn_back.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/font/fzdhjt.ttf b/app/src/main/res/font/fzdhjt.ttf new file mode 100644 index 0000000..1c14f7f --- /dev/null +++ b/app/src/main/res/font/fzdhjt.ttf Binary files differ diff --git a/app/src/main/res/layout/activity_install_small_label.xml b/app/src/main/res/layout/activity_install_small_label.xml index 13924c2..ed2ceec 100644 --- a/app/src/main/res/layout/activity_install_small_label.xml +++ b/app/src/main/res/layout/activity_install_small_label.xml @@ -23,7 +23,32 @@ android:layout_height="wrap_content" android:orientation="vertical"> +