diff --git a/app/src/main/java/com/bingce/controlnetwork/fragment/PointListFragment.java b/app/src/main/java/com/bingce/controlnetwork/fragment/PointListFragment.java index d3c81ac..4d3b31a 100644 --- a/app/src/main/java/com/bingce/controlnetwork/fragment/PointListFragment.java +++ b/app/src/main/java/com/bingce/controlnetwork/fragment/PointListFragment.java @@ -10,14 +10,12 @@ import android.view.ViewGroup; import androidx.annotation.NonNull; import androidx.annotation.Nullable; -import androidx.annotation.WorkerThread; import com.bingce.controlapphelper.datasource.database.ProjectType; import com.bingce.controlapphelper.datasource.database.SurveyorDatabaseFactory; import com.bingce.controlapphelper.datasource.database.point.PointRecord; import com.bingce.controlapphelper.model.BundleConstants; import com.bingce.controlapphelper.util.Tools; -import com.bingce.controlapphelper.util.importpoint.ImportPointsUtil; import com.bingce.controlapphelper.widget.swiperecyclerview.widget.DefaultItemDecoration; import com.bingce.controlnetwork.R; import com.bingce.controlnetwork.activity.fragmentcontainer.FragmentContainerActivity; @@ -27,16 +25,12 @@ import com.bingce.controlnetwork.newui.base.BaseFragmentBinding; import com.bingce.controlnetwork.newui.createeditpoint.CreateEditPointActvity; import com.bingce.controlnetwork.newui.widget.swipemenu.SwipeMenuEditDelete; import com.bingce.controlnetwork.util.DialogUtil; -import com.bingce.coordlib.model.Blh; -import com.bingce.coordlib.model.Coordinate; -import com.bingce.coordlib.model.CoordinateSystem; +import com.bingce.controlnetwork.util.ImportPointsUtilPla; import com.bingce.utils.ThreadPoolUtil; import java.util.Collections; import java.util.List; -import blankj.utilcode.util.ToastUtils; - /** * 点列表 @@ -48,7 +42,7 @@ public class PointListFragment extends BaseFragmentBinding SurveyorDatabaseFactory .instance .getPointDataSource() diff --git a/app/src/main/java/com/bingce/controlnetwork/util/ImportPointsUtilPla.java b/app/src/main/java/com/bingce/controlnetwork/util/ImportPointsUtilPla.java new file mode 100644 index 0000000..6e771d7 --- /dev/null +++ b/app/src/main/java/com/bingce/controlnetwork/util/ImportPointsUtilPla.java @@ -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 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 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 list) { + Object waitObj = new Object(); + ThreadPoolUtil.execute(() -> { + //获取已有的数据点 + List pointListAgo = SurveyorDatabaseFactory.instance.getPointDataSource().getListByProjectId(projectId, pointType); + Map 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 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; + } + +} diff --git a/control_common b/control_common index 8afd2f2..edf00a6 160000 --- a/control_common +++ b/control_common @@ -1 +1 @@ -Subproject commit 8afd2f2b66bd232cf6f19e571e5c12efd5ad1b3d +Subproject commit edf00a6ca7b5afe3a544292bf320eea526d2b511