diff --git a/code/fms/fms-vue/src/App.vue b/code/fms/fms-vue/src/App.vue
index 6dcdd937..2f0531a0 100644
--- a/code/fms/fms-vue/src/App.vue
+++ b/code/fms/fms-vue/src/App.vue
@@ -1,7 +1,30 @@
+
+
+
+
+
+
diff --git a/code/fms/fms-vue/src/views/base/contact/index.vue b/code/fms/fms-vue/src/views/base/contact/index.vue
index 7118c7a8..4369aade 100644
--- a/code/fms/fms-vue/src/views/base/contact/index.vue
+++ b/code/fms/fms-vue/src/views/base/contact/index.vue
@@ -1,10 +1,82 @@
-
+
+
+
+
+ 新增
+
+
+ 批量删除
+
+
+
+
diff --git a/code/fms/fms-vue/src/views/base/othercompany/detail.vue b/code/fms/fms-vue/src/views/base/othercompany/detail.vue
new file mode 100644
index 00000000..26721368
--- /dev/null
+++ b/code/fms/fms-vue/src/views/base/othercompany/detail.vue
@@ -0,0 +1,537 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/code/fms/fms-vue/src/views/base/othercompany/index.vue b/code/fms/fms-vue/src/views/base/othercompany/index.vue
index e9bf5c0c..f9112722 100644
--- a/code/fms/fms-vue/src/views/base/othercompany/index.vue
+++ b/code/fms/fms-vue/src/views/base/othercompany/index.vue
@@ -6,14 +6,35 @@ import FmsModuleListPage from "@/components/fms-module-list/FmsModuleListPage.vu
import FmsTree from "@/components/FmsTree.vue";
import { escapeSqlText } from "@/components/fms-module-list/moduleListUtils";
import { loadDataApi, nextIdApi, pageDataApi, saveObjectApi } from "@/services/api";
+import { usePermissionStore } from "@/stores/permissions";
import { buildTree, sortTree } from "@/utils/tree";
+const OTHERCOMPANY_MODULE_CODE = "v_b_othercompany";
const ALL_CATEGORIES_KEY = "__fms_tree_root__";
const categories = ref([]);
const categoryLoading = ref(false);
const selectedCategoryKey = ref(ALL_CATEGORIES_KEY);
const expandedCategoryKeys = ref([ALL_CATEGORIES_KEY]);
+const permissionStore = usePermissionStore();
+const canCreateRow = computed(() => permissionStore.canPower(OTHERCOMPANY_MODULE_CODE, "create"));
+const canUpdateRow = computed(() => permissionStore.canPower(OTHERCOMPANY_MODULE_CODE, "update"));
+const canDeleteRow = computed(() => permissionStore.canPower(OTHERCOMPANY_MODULE_CODE, "delete"));
+
+import { useRouter } from "vue-router";
+
+const moduleListRef = ref(null);
+const selectedRowKeys = ref([]);
+const dirtyCount = ref(0);
+const router = useRouter();
+
+const rowSelection = computed(() => ({
+ selectedRowKeys: selectedRowKeys.value,
+ onChange: (keys) => {
+ selectedRowKeys.value = keys;
+ },
+}));
+
const categoryById = computed(
() => new Map(categories.value.map((item) => [String(item.b_id), item])),
);
@@ -368,6 +389,36 @@ async function confirmDeleteCategory(node) {
});
}
+// ── 新增 / 批量删除 ──
+function goCreate() {
+ if (canCreateRow.value) {
+ router.push({ name: "base-othercompany-detail", query: { mode: "create" } });
+ }
+}
+
+function confirmBatchDelete() {
+ if (!canDeleteRow.value || !selectedRowKeys.value.length) {
+ message.warning("请先选择要删除的记录");
+ return;
+ }
+ Modal.confirm({
+ title: `确定删除选中的 ${selectedRowKeys.value.length} 条记录?`,
+ content: "此操作不可恢复",
+ okText: "删除",
+ cancelText: "取消",
+ okButtonProps: { danger: true },
+ onOk: async () => {
+ try {
+ await moduleListRef.value?.deleteSelected?.(selectedRowKeys.value);
+ selectedRowKeys.value = [];
+ dirtyCount.value = 0;
+ } finally {
+ // noop
+ }
+ },
+ });
+}
+
onMounted(() => {
loadCategories();
});
@@ -396,10 +447,28 @@ onMounted(() => {
+ :row-selection="rowSelection"
+ >
+
+
+
+ 新增
+
+
+ 批量删除
+
+
+
+