parent
a4db733512
commit
56064ea46a
3 changed files with 276 additions and 11 deletions
@ -0,0 +1,265 @@ |
||||
package com.bingce.controlnetwork.util; |
||||
|
||||
import android.app.Activity; |
||||
import android.content.Context; |
||||
import android.content.Intent; |
||||
import android.text.TextUtils; |
||||
|
||||
import androidx.activity.result.ActivityResultLauncher; |
||||
import androidx.activity.result.contract.ActivityResultContracts; |
||||
import androidx.annotation.NonNull; |
||||
import androidx.annotation.WorkerThread; |
||||
import androidx.fragment.app.Fragment; |
||||
|
||||
import com.afollestad.materialdialogs.MaterialDialog; |
||||
import com.bingce.BaseApp; |
||||
import com.bingce.controlapphelper.R; |
||||
import com.bingce.controlapphelper.datasource.database.SurveyorDatabaseFactory; |
||||
import com.bingce.controlapphelper.datasource.database.point.PointRecord; |
||||
import com.bingce.controlapphelper.util.CheckStorageUtil; |
||||
import com.bingce.controlapphelper.util.importpoint.PointLibraryUtil; |
||||
import com.bingce.surveyor.agentweb.AgentWebActivity; |
||||
import com.bingce.utils.ThreadPoolUtil; |
||||
|
||||
import java.io.File; |
||||
import java.util.ArrayList; |
||||
import java.util.HashMap; |
||||
import java.util.List; |
||||
import java.util.Map; |
||||
|
||||
import blankj.utilcode.util.ToastUtils; |
||||
import blankj.utilcode.util.Utils; |
||||
import ru.bartwell.exfilepicker.ExFilePicker; |
||||
import ru.bartwell.exfilepicker.data.ExFilePickerResult; |
||||
|
||||
public class ImportPointsUtilPla { |
||||
private static final int THEME = android.R.style.Theme_Material_Dialog_Alert; |
||||
// private static final int THEME = android.R.style.ThemeOverlay_Material_Dialog_Alert;
|
||||
@NonNull |
||||
private final Fragment fragment; |
||||
@NonNull |
||||
private final ActivityResultLauncher<Intent> activityResultLauncher; |
||||
private String projectId; |
||||
private String pointType; |
||||
private Context mContext; |
||||
private ImportFileType importFileType; |
||||
|
||||
public ImportPointsUtilPla(@NonNull Fragment fragment) { |
||||
this.fragment = fragment; |
||||
activityResultLauncher = fragment.registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), result -> { |
||||
if (result != null && Activity.RESULT_OK == result.getResultCode()) { |
||||
Intent data = result.getData(); |
||||
if (data != null) { |
||||
ExFilePickerResult object = ExFilePickerResult.getFromIntent(data); |
||||
if (object != null && object.getCount() > 0) { |
||||
try { |
||||
String path = object.getPath() + object.getNames().get(0); |
||||
List<PointRecord> list = new ArrayList<>(); |
||||
String error = null; |
||||
switch (importFileType) { |
||||
case EXCLE: |
||||
error = PointLibraryUtil.importStakingJobPointExcel(new File(path), |
||||
(name, code, x, y, z, remarks) -> addPointToList(list, projectId, pointType, name, code, x, y, z, remarks, list.size())); |
||||
break; |
||||
case TEXT: |
||||
error = PointLibraryUtil.importStakingJobPointTxt(new File(path), |
||||
(name, code, x, y, z, remarks) -> addPointToList(list, projectId, pointType, name, code, x, y, z, remarks, list.size())); |
||||
break; |
||||
case CASS: |
||||
error = PointLibraryUtil.importStakingJobPointCassDat(new File(path), isCassXY(), |
||||
(name, code, x, y, z, remarks) -> addPointToList(list, projectId, pointType, name, code, x, y, z, remarks, list.size())); |
||||
break; |
||||
} |
||||
if (!TextUtils.isEmpty(error)) { |
||||
ToastUtils.showShort(error); |
||||
} |
||||
if (!list.isEmpty()) { |
||||
saveRecord(list); |
||||
} |
||||
} catch (Exception exception) { |
||||
exception.printStackTrace(); |
||||
} |
||||
} else { |
||||
ToastUtils.showShort(R.string.file_is_empty); |
||||
} |
||||
} |
||||
} |
||||
}); |
||||
} |
||||
|
||||
/** |
||||
* 存储数据 |
||||
* 查询是否有同名点 有同名提示是否覆盖点坐标信息,没有同名直接保存 |
||||
* |
||||
* @param list 读取的导入点列表 |
||||
*/ |
||||
private void saveRecord(List<PointRecord> list) { |
||||
Object waitObj = new Object(); |
||||
ThreadPoolUtil.execute(() -> { |
||||
//获取已有的数据点
|
||||
List<PointRecord> pointListAgo = SurveyorDatabaseFactory.instance.getPointDataSource().getListByProjectId(projectId, pointType); |
||||
Map<String, PointRecord> pointRecordAgoMap = new HashMap<>(); |
||||
for (PointRecord pointRecordAgo : pointListAgo) { |
||||
pointRecordAgoMap.put(pointRecordAgo.getName(), pointRecordAgo); |
||||
} |
||||
//遍历要导入的数据点
|
||||
for (PointRecord pointRecordImport : list) { |
||||
if (pointRecordAgoMap.containsKey(pointRecordImport.getName())) { |
||||
//存在同名 提示是否覆盖
|
||||
showOverrideDialog(waitObj, pointRecordAgoMap.get(pointRecordImport.getName()), pointRecordImport); |
||||
synchronized (waitObj) { |
||||
try { |
||||
waitObj.wait(); |
||||
} catch (InterruptedException e) { |
||||
e.printStackTrace(); |
||||
} |
||||
} |
||||
} else { |
||||
savePointRecord(pointRecordImport); |
||||
} |
||||
} |
||||
}); |
||||
} |
||||
|
||||
@WorkerThread |
||||
private void savePointRecord(PointRecord pointRecord) { |
||||
SurveyorDatabaseFactory.instance.getPointDataSource().saveSync(pointRecord); |
||||
} |
||||
|
||||
private void showOverrideDialog(Object waitObj, PointRecord pointRecordAgo, PointRecord pointImport) { |
||||
ThreadPoolUtil.executeInMain(() -> { |
||||
new MaterialDialog.Builder(mContext) |
||||
.title("提示") |
||||
.content("点名:" + pointRecordAgo.getName() + "重复,是否覆盖?") |
||||
.positiveText("覆盖") |
||||
.negativeText("不覆盖") |
||||
.neutralText("取消") |
||||
.onPositive((dialog, which) -> { |
||||
ThreadPoolUtil.execute(() -> { |
||||
synchronized (waitObj) { |
||||
pointRecordAgo.x = pointImport.x; |
||||
pointRecordAgo.y = pointImport.y; |
||||
pointRecordAgo.z = pointImport.z; |
||||
pointRecordAgo.remarks = pointImport.remarks; |
||||
pointRecordAgo.code = pointImport.code; |
||||
pointRecordAgo.category = pointImport.category; |
||||
savePointRecord(pointRecordAgo); |
||||
waitObj.notify(); |
||||
} |
||||
}); |
||||
}) |
||||
.onNegative((dialog, which) -> { |
||||
synchronized (waitObj) { |
||||
waitObj.notify(); |
||||
} |
||||
}) |
||||
.show(); |
||||
}); |
||||
} |
||||
|
||||
private void addPointToList(List<PointRecord> list, String projectId, String pointType, String name, String code, double x, double y, double z, String remarks, int orderIndex) { |
||||
PointRecord point = PointRecord.point( |
||||
projectId, pointType, name, code, |
||||
x, y, z, |
||||
remarks, list.size()); |
||||
list.add(point); |
||||
} |
||||
|
||||
/** |
||||
* 入口 |
||||
* |
||||
* @param projectId |
||||
* @param pointType |
||||
*/ |
||||
public void showImportDialog(String projectId, String pointType) { |
||||
this.projectId = projectId; |
||||
this.pointType = pointType; |
||||
mContext = fragment.requireContext(); |
||||
|
||||
importFileType = null; |
||||
|
||||
new MaterialDialog.Builder(mContext) |
||||
.title(R.string.please_choose_import_format) |
||||
.items(new String[]{mContext.getString(R.string.excel_xls) |
||||
, mContext.getString(R.string.text_txt) |
||||
, mContext.getString(R.string.cass_dat_txt)}) |
||||
.itemsCallback((dialog, itemView, which, text) -> { |
||||
switch (which) { |
||||
case 0: |
||||
importFileType = ImportFileType.EXCLE; |
||||
break; |
||||
case 1: |
||||
importFileType = ImportFileType.TEXT; |
||||
break; |
||||
case 2: |
||||
importFileType = ImportFileType.CASS; |
||||
break; |
||||
} |
||||
|
||||
if (importFileType != null) { |
||||
showImportAppendOrOverideDialog(); |
||||
} |
||||
|
||||
}).show(); |
||||
} |
||||
|
||||
private void showImportAppendOrOverideDialog() { |
||||
String message = ""; |
||||
switch (importFileType) { |
||||
case EXCLE: |
||||
message = mContext.getString(R.string.import_point_excel_guide); |
||||
break; |
||||
case TEXT: |
||||
message = mContext.getString(R.string.import_point_text_guide); |
||||
break; |
||||
case CASS: |
||||
if (isCassXY()) { |
||||
message = mContext.getString(R.string.import_point_cass_xy_dat); |
||||
} else { |
||||
message = mContext.getString(R.string.import_point_cass_yx_dat); |
||||
} |
||||
break; |
||||
} |
||||
|
||||
new MaterialDialog.Builder(mContext) |
||||
.title(R.string.import_points) |
||||
.content(message) |
||||
.positiveText(R.string.import_points) |
||||
.neutralText(R.string.view_sample) |
||||
.onPositive((dialog, which) -> checkStoragePermission()) |
||||
.onNeutral((dialog, which) -> { |
||||
AgentWebActivity.navigation2(mContext, "android_url_import_point_sample"); |
||||
}) |
||||
.show(); |
||||
|
||||
} |
||||
|
||||
private void checkStoragePermission() { |
||||
CheckStorageUtil.check(mContext, this::selectFolder); |
||||
} |
||||
|
||||
private void selectFolder() { |
||||
BaseApp app = (BaseApp) Utils.getApp(); |
||||
ExFilePicker exFilePicker = new ExFilePicker(); |
||||
exFilePicker.setLandscape(app.isLandscape()); |
||||
exFilePicker.setShowOnlyExtensions(importFileType.filters); |
||||
activityResultLauncher.launch(exFilePicker.createIntent(fragment.requireContext())); |
||||
} |
||||
|
||||
private enum ImportFileType { |
||||
EXCLE(new String[]{"xls", "xlsx"}), |
||||
TEXT(new String[]{"txt"}), |
||||
CASS(new String[]{"dat", "txt"}); |
||||
|
||||
private String[] filters; |
||||
|
||||
ImportFileType(String[] filters) { |
||||
this.filters = filters; |
||||
} |
||||
} |
||||
|
||||
private boolean isCassXY() { |
||||
return false; |
||||
} |
||||
|
||||
} |
@ -1 +1 @@ |
||||
Subproject commit 8afd2f2b66bd232cf6f19e571e5c12efd5ad1b3d |
||||
Subproject commit edf00a6ca7b5afe3a544292bf320eea526d2b511 |
Loading…
Reference in new issue