duy 10 місяців тому
батько
коміт
af3d475009

+ 202 - 0
src/views/desk/wbs/create-new-excel.vue

@@ -0,0 +1,202 @@
+<template>
+    <hc-dialog
+        v-model="isShow"
+        is-footer-center
+        title="创建新的元素表"
+        @close="dialogClose"
+        widths="1200px"
+    >
+        <el-form
+            ref="formRef"
+            :model="formModel"
+            :rules="formRules"
+            label-position="top"
+            label-width="auto"
+        >
+            <el-row :gutter="60">
+                <el-col :span="12">
+                    <el-form-item label="表名">
+                        <el-input v-model="formModel.tableName" />
+                    </el-form-item>
+                </el-col>
+                <el-col :span="12">
+                    <el-form-item label="填报率">
+                        <el-input v-model="formModel.fillRate" />
+                    </el-form-item>
+                </el-col>
+            </el-row>
+            <el-row :gutter="60">
+                <el-col :span="12">
+                    <el-form-item label="表类型:" prop="tableType">
+                        <el-select
+                            v-model="formModel.tableType"
+                            placeholder="选择表类型"
+                            filterable
+                            block
+                        >
+                            <el-option
+                                v-for="item in tableTypelist"
+                                :key="item.value"
+                                :label="item.label"
+                                :value="item.value"
+                            />
+                        </el-select>
+                    </el-form-item>
+                </el-col>
+                <el-col :span="12">
+                    <el-form-item label="所属方:" prop="tableOwner">
+                        <el-select
+                            v-model="formModel.tableOwner"
+                            placeholder="选择所属方"
+                            filterable
+                            block
+                        >
+                            <el-option
+                                v-for="item in ownerTypeList"
+                                :key="item.value"
+                                :label="item.label"
+                                :value="item.value"
+                            />
+                        </el-select>
+                    </el-form-item>
+                </el-col>
+            </el-row>
+        </el-form>
+        <hc-card-item>
+            <template #header>
+                <div class="text-sm text-red">编辑元素信息(请谨慎操作)</div>
+            </template>
+            <template #extra>
+                <el-button size="small" type="primary">快捷导入</el-button>
+                <el-button size="small" type="warning">下载导入模板</el-button>
+            </template>
+
+            <hc-table :column="tableColumn" :datas="tableData">
+                <template #eName="{ row }">
+                    <hc-table-input v-model="row.eName" />
+                </template>
+                <template #eType="{ row }">
+                    <el-select
+                        v-model="row.eType"
+                        @change="setDefaultLength(row)"
+                        placeholder="请选择"
+                    >
+                        <el-option
+                            v-for="item in dataTypeList"
+                            :key="item.id"
+                            :label="item.dictValue"
+                            :value="item.dictKey"
+                        ></el-option>
+                    </el-select>
+                </template>
+                <template #eLength="{ row }">
+                    <hc-table-input v-model="row.eLength" />
+                </template>
+                <template #eAllowDeviation="{ row }">
+                    <div class="flex">
+                        <el-select
+                            v-model="row.allow"
+                            :popper-append-to-body="false"
+                            placeholder="请选择"
+                        >
+                            <el-option :key="1" label="-" value="-"></el-option>
+                            <el-option :key="2" label=">" value=">"></el-option>
+                            <el-option :key="3" label="<" value="<"></el-option>
+                            <el-option :key="4" label="≥" value="≥"></el-option>
+                            <el-option :key="5" label="≤" value="≤"></el-option>
+                            <el-option :key="6" label="±" value="±"></el-option>
+                            <el-option
+                                :key="7"
+                                label="【】"
+                                value="【】"
+                            ></el-option>
+                        </el-select>
+                        <hc-table-input v-model="row.deviation" />
+                    </div>
+                </template>
+                <template #eInspectionMethod="{ row }">
+                    <hc-table-input v-model="row.eInspectionMethod" />
+                </template>
+            </hc-table>
+        </hc-card-item>
+    </hc-dialog>
+</template>
+<script setup>
+import { ref, watch } from "vue";
+const props = defineProps({
+    ownerTypeList: {
+        type: Array,
+        default: () => [],
+    },
+    tableTypelist: {
+        type: Array,
+        default: () => [],
+    },
+});
+//事件
+const emit = defineEmits(["close"]);
+//双向绑定
+// eslint-disable-next-line no-undef
+const isShow = defineModel("modelValue", {
+    default: false,
+});
+//监听显示
+watch(isShow, (val) => {
+    if (val) {
+        // getDataInfo();
+        // geStandardTypeOptions();
+    } else {
+        emit("close");
+    }
+});
+const ownerTypeList = ref([]);
+const tableTypelist = ref([]);
+//监听数据
+watch(
+    () => [props.ownerTypeList, props.tableTypelist],
+    ([own, table]) => {
+        ownerTypeList.value = own;
+        tableTypelist.value = table;
+    },
+    { deep: true }
+);
+//表单
+const formRef = ref(null);
+const formRules = {
+    tableName: {
+        required: true,
+        trigger: "blur",
+        message: "请输入表单名称",
+    },
+    tableType: {
+        required: true,
+        trigger: "blur",
+        message: "请选择表单类型",
+    },
+    tableOwner: {
+        required: true,
+        trigger: "blur",
+        message: "请选择所属方",
+    },
+};
+const formModel = ref({});
+const tableColumn = [
+    { key: "eName", name: "元素名称" },
+    { key: "eType", name: "数据类型" },
+    { key: "eLength", name: "长度" },
+    { key: "eAllowDeviation", name: "允许偏差值" },
+    { key: "eInspectionMethod", name: "检查方法和频率" },
+    { key: "action", name: "操作", width: 100 },
+];
+const tableData = ref([
+    { name: "名称1", text: "文本1", color: "red" },
+    { name: "名称2", text: "文本2", color: "blue" },
+]);
+const dataTypeList = ref([]);
+const setDefaultLength = () => {};
+//关闭弹窗
+const dialogClose = () => {
+    isShow.value = false;
+    emit("close");
+};
+</script>

+ 241 - 506
src/views/desk/wbs/drawer-wbs.vue

@@ -5,297 +5,153 @@
         is-close
         @close="drawerClose"
     >
-        <hc-body split>
-            <template #left>
-                <hc-card scrollbar>
-                    <template #header>
-                        <hc-search-input
-                            v-model="searchTreeName"
-                            @search="searchTreeNameClick"
-                            @clear="searchTreeNameClick"
-                        >
-                            <template #prepend>
-                                <el-select
-                                    v-model="queryType"
-                                    placeholder="类型"
-                                    style="width: 75px"
-                                >
-                                    <el-option label="节点" value="1" />
-                                    <el-option label="表名" value="2" />
-                                </el-select>
-                            </template>
-                        </hc-search-input>
-                    </template>
-                    <hc-lazy-tree
-                        v-if="isTreeMode"
-                        :root-menu="treeMenuData"
-                        :menus="treeMenuDatas"
-                        :h-props="treeProps"
-                        tree-key="id"
-                        @load="treeLoadNode"
-                        @node-tap="treeNodeTap"
-                        @menu-tap="treeMenuClick"
-                        :autoExpandKeys="autoExpandKeys"
-                    >
-                        <template #nodeName="{ data }">
-                            <span class="text-16px font-400">{{
-                                data.nodeName
-                            }}</span>
-                        </template>
-                    </hc-lazy-tree>
-                    <template v-if="isTreeMode === false">
-                        <hc-data-tree
-                            defaultExpandAll
-                            ref="treeRef"
-                            :h-props="treeProps"
-                            tree-key="id"
-                            :datas="treeData"
-                            @node-tap="treeNodeTap"
-                        >
-                            <template #name="{ data }">
-                                <span class="text-16px font-400">{{
-                                    data.title
-                                }}</span>
-                            </template>
-                        </hc-data-tree>
-                    </template>
-                </hc-card>
-            </template>
-            <hc-card class="hc-desk-system-unit-temp">
-                <template v-if="!isNullES(nodeInfo.id)">
-                    <hc-card-item title="节点信息">
-                        <el-descriptions
-                            :column="3"
-                            border
-                            direction="vertical"
-                        >
-                            <el-descriptions-item label="当前节点">{{
-                                nodeInfo.nodeName ?? "-"
-                            }}</el-descriptions-item>
-                            <el-descriptions-item label="节点类型:">{{
-                                nodeInfo.nodeTypeName ?? "-"
-                            }}</el-descriptions-item>
-                            <el-descriptions-item label="上级节点:">{{
-                                nodeInfo.parentName ?? "-"
-                            }}</el-descriptions-item>
-                        </el-descriptions>
-                    </hc-card-item>
-                    <hc-card-item title="当前已创建的元素表">
-                        <template #extra>
-                            <el-button size="small" type="primary"
-                                >新增</el-button
-                            >
-                            <el-button size="small" type="warning"
-                                >编辑</el-button
-                            >
-                            <el-button size="small" type="success"
-                                >排序</el-button
-                            >
-                        </template>
-                        <hc-table
-                            :column="tableColumn"
-                            :datas="tableData"
-                            :loading="tableLoading"
-                            :is-index="false"
-                            :is-current-row="false"
-                        >
-                            <template #tableType="{ row }">{{
-                                getDictionaryName(
-                                    tableTypelist,
-                                    row.tableType,
-                                    true
-                                )
-                            }}</template>
-                            <template #tableOwner="{ row }">{{
-                                getDictionaryName(
-                                    ownerTypeList,
-                                    row.tableOwner,
-                                    true
-                                )
-                            }}</template>
-                            <template #action="{ row, index }">
-                                <el-link
-                                    type="warning"
-                                    @click="editRowClick(row)"
-                                    >修改</el-link
-                                >
-                                <el-link type="danger" @click="rowDelClick(row)"
-                                    >删除</el-link
+        <div class="hc-project-wbs-tree flex">
+            <div class="header hc-flex">
+                <div class="name flex-1">
+                    {{ dataInfo.wbsName }}
+                </div>
+                <div class="hc-flex">
+                    <el-button hc-btn type="primary">导入划分</el-button>
+                    <el-button hc-btn type="primary">元素设置</el-button>
+                    <el-button hc-btn type="primary">元素公式设置</el-button>
+
+                    <el-button hc-btn type="warning">节点参数设置</el-button>
+                </div>
+            </div>
+            <div class="body">
+                <hc-body split>
+                    <template #left>
+                        <hc-card scrollbar>
+                            <template #header>
+                                <hc-search-input
+                                    v-model="searchTreeName"
+                                    @search="searchTreeNameClick"
+                                    @clear="searchTreeNameClick"
                                 >
+                                    <template #prepend>
+                                        <el-select
+                                            v-model="queryType"
+                                            placeholder="类型"
+                                            style="width: 75px"
+                                        >
+                                            <el-option label="节点" value="1" />
+                                            <el-option label="表名" value="2" />
+                                        </el-select>
+                                    </template>
+                                </hc-search-input>
                             </template>
-                        </hc-table>
-                    </hc-card-item>
-                </template>
-                <hc-empty v-else title="请先点击左侧树节点" />
-            </hc-card>
-        </hc-body>
-
-        <!-- 新增/修改 -->
-        <hc-dialog
-            v-model="isAddEditShow"
-            widths="24rem"
-            is-footer-center
-            :title="formModel.id ? '修改' : '新增'"
-            @close="addEditClose"
-            @save="addEditSubmit"
-            :loading="addEditLoading"
-        >
-            <el-form
-                ref="formRef"
-                :model="formModel"
-                :rules="formRules"
-                label-position="top"
-                label-width="auto"
-            >
-                <el-form-item label="节点名称:" prop="nodeName">
-                    <el-input
-                        v-model="formModel.nodeName"
-                        clearable
-                        placeholder="请输入节点名称"
-                        class="is-right-btn"
-                    >
-                        <template #append>
-                            <el-button
-                                hc-btn
-                                type="primary"
-                                @click="aliasShowClick"
-                                >添加别名</el-button
+                            <hc-lazy-tree
+                                v-if="isTreeMode"
+                                :root-menu="treeMenuData"
+                                :menus="treeMenuDatas"
+                                :h-props="treeProps"
+                                tree-key="id"
+                                @load="treeLoadNode"
+                                @node-tap="treeNodeTap"
+                                @menu-tap="treeMenuClick"
+                                :autoExpandKeys="autoExpandKeys"
                             >
-                        </template>
-                    </el-input>
-                </el-form-item>
-                <el-form-item label="上级节点:">
-                    <el-input
-                        v-model="formModel.parentName"
-                        clearable
-                        disabled
-                    />
-                </el-form-item>
-                <el-form-item label="节点类型:" prop="nodeType">
-                    <el-select
-                        v-model="formModel.nodeType"
-                        filterable
-                        clearable
-                        block
-                        placeholder="请选择节点类型"
-                        @change="nodeTypeChange"
-                    >
-                        <el-option
-                            v-for="item in majorDatatype"
-                            :key="item.value"
-                            :label="item.label"
-                            :value="item.value"
-                        />
-                    </el-select>
-                </el-form-item>
-                <el-form-item
-                    label="划分编号"
-                    v-if="wbsType !== 2 && wbsType !== 5 && wbsType !== 3"
-                >
-                    <el-input v-model="formModel.partitionCode"></el-input>
-                </el-form-item>
-
-                <el-form-item
-                    label="唯一编码"
-                    v-if="(wbsType !== 5) & (wbsType !== 3)"
-                >
-                    <el-input v-model="formModel.uniqueCode"></el-input>
-                </el-form-item>
-                <template v-if="formModel.nodeType == 6 && wbsType !== 3">
-                    <el-form-item label="是否有混凝土">
-                        <el-radio-group
-                            v-model="formModel.isConcrete"
-                            size="small"
-                        >
-                            <el-radio :value="0">无</el-radio>
-                            <el-radio :value="1">有</el-radio>
-                        </el-radio-group>
-                    </el-form-item>
-                    <el-form-item label="是否试验节点">
-                        <el-radio-group
-                            v-model="formModel.isExpernode"
-                            size="small"
-                        >
-                            <el-radio :value="0">否</el-radio>
-                            <el-radio :value="1">是</el-radio>
-                        </el-radio-group>
-                    </el-form-item>
-                </template>
-                <el-form-item
-                    label="内业资料类型"
-                    prop="majorDataType"
-                    v-if="wbsType !== 2 && (wbsType !== 5) & (wbsType !== 3)"
-                >
-                    <el-select
-                        v-model="formModel.majorDataType"
-                        placeholder="请选择"
-                        class="w-100p"
-                    >
-                        <el-option
-                            v-for="item in majorDataTypeList"
-                            :key="item.value"
-                            :label="item.label"
-                            :value="item.value"
-                        ></el-option>
-                    </el-select>
-                </el-form-item>
-                <el-form-item
-                    label="勾选相关联试验"
-                    prop="mixRatioTestIds"
-                    v-if="wbsType === 2 && formModel.nodeType === 53"
-                >
-                    <div class="border-class">
-                        <el-scrollbar>
-                            <div v-loading="testTreeLoad">
+                                <template #nodeName="{ data }">
+                                    <span class="text-16px font-400">{{
+                                        data.nodeName
+                                    }}</span>
+                                </template>
+                            </hc-lazy-tree>
+                            <template v-if="isTreeMode === false">
                                 <hc-data-tree
                                     defaultExpandAll
+                                    ref="treeRef"
                                     :h-props="treeProps"
                                     tree-key="id"
-                                    :datas="testTreeData"
-                                    @check="TestTreeCheckChange"
-                                    showCheckbox
-                                    :defaultCheckedKeys="defaultCheckedKeys"
+                                    :datas="treeData"
+                                    @node-tap="treeNodeTap"
                                 >
+                                    <template #name="{ data }">
+                                        <span class="text-16px font-400">{{
+                                            data.title
+                                        }}</span>
+                                    </template>
                                 </hc-data-tree>
+                            </template>
+                        </hc-card>
+                    </template>
+                    <hc-card class="hc-desk-system-unit-temp">
+                        <template v-if="!isNullES(nodeInfo.id)">
+                            <div class="body-top">
+                                <hc-card title="节点信息">
+                                    <hc-table
+                                        :is-index="false"
+                                        :column="nodeTableColumn"
+                                        :datas="nodeTableData"
+                                    >
+                                        <template #nodeType="{ row }">{{
+                                            getDictionaryName(
+                                                majorDatatype,
+                                                row.nodeType,
+                                                true
+                                            )
+                                        }}</template>
+                                    </hc-table>
+                                </hc-card>
                             </div>
-                        </el-scrollbar>
-                    </div>
-                </el-form-item>
-                <el-form-item
-                    label="标准分类"
-                    v-if="formModel.isExistForm == 1"
-                >
-                    <el-select
-                        v-model="formModel.className"
-                        placeholder="请选择"
-                        @change="changeStandType"
-                    >
-                        <el-option
-                            v-for="item in standardTypeOptions"
-                            :key="item.value"
-                            :label="item.label"
-                            :value="item.value"
-                        ></el-option>
-                    </el-select>
-                </el-form-item>
-                <el-form-item
-                    label="单元名称"
-                    v-if="formModel.isExistForm == 1"
-                >
-                    <el-select
-                        v-model="formModel.unitName"
-                        placeholder="请选择"
-                    >
-                        <el-option
-                            v-for="item in unitOptions"
-                            :key="item.id"
-                            :label="item.dictValue"
-                            :value="item.dictKey"
-                        ></el-option>
-                    </el-select>
-                </el-form-item>
-            </el-form>
-        </hc-dialog>
+                            <div class="body-content">
+                                <hc-card title="当前已创建的元素表">
+                                    <template #extra>
+                                        <el-button
+                                            size="small"
+                                            type="primary"
+                                            @click="createNew"
+                                            >创建元素表</el-button
+                                        >
+                                        <el-button size="small" type="warning"
+                                            >编辑元素表单</el-button
+                                        >
+                                        <el-button size="small" type="success"
+                                            >排序</el-button
+                                        >
+                                    </template>
+                                    <hc-table
+                                        :column="tableColumn"
+                                        :datas="tableData"
+                                        :loading="tableLoading"
+                                        :is-index="false"
+                                        :is-current-row="false"
+                                    >
+                                        <template #tableType="{ row }">{{
+                                            getDictionaryName(
+                                                tableTypelist,
+                                                row.tableType,
+                                                true
+                                            )
+                                        }}</template>
+                                        <template #tableOwner="{ row }">{{
+                                            getDictionaryName(
+                                                ownerTypeList,
+                                                row.tableOwner,
+                                                true
+                                            )
+                                        }}</template>
+                                        <template #action="{ row, index }">
+                                            <el-link
+                                                type="warning"
+                                                @click="editRowClick(row)"
+                                                >修改</el-link
+                                            >
+                                            <el-link
+                                                type="danger"
+                                                @click="rowDelClick(row)"
+                                                >删除</el-link
+                                            >
+                                        </template>
+                                    </hc-table>
+                                </hc-card>
+                            </div>
+                        </template>
+                        <hc-empty v-else title="请先点击左侧树节点" />
+                    </hc-card>
+                </hc-body>
+            </div>
+        </div>
 
         <!-- 调整排序 -->
         <hc-dialog
@@ -328,63 +184,25 @@
             </template>
         </hc-dialog>
 
-        <!-- 节点别名 -->
-        <hc-dialog
-            v-model="isAliasShow"
-            widths="26rem"
-            title="节点别名"
-            is-footer-center
-            @close="aliasDialogClose"
-        >
-            <el-form
-                ref="formAliasRef"
-                :model="formAliasModel"
-                :rules="formAliasRules"
-                label-position="top"
-                label-width="auto"
-            >
-                <el-form-item prop="aliasName">
-                    <el-input
-                        v-model="formAliasModel.aliasName"
-                        placeholder="请输入节点别名"
-                        clearable
-                        class="is-right-btn"
-                    >
-                        <template v-if="formModel.id" #append>
-                            <el-button
-                                hc-btn
-                                type="primary"
-                                @click="addAliasName"
-                                >添加</el-button
-                            >
-                        </template>
-                    </el-input>
-                </el-form-item>
-            </el-form>
-            <div
-                v-if="aliasArr.length > 0"
-                class="hc-tree-node-edit-form-alias-name"
-            >
-                <template v-for="(item, index) in aliasArr" :key="index">
-                    <el-tag
-                        closable
-                        type="primary"
-                        @close="aliasNameClose(index)"
-                        >{{ item }}</el-tag
-                    >
-                </template>
-            </div>
-            <template #footer>
-                <el-button hc-btn @click="aliasDialogClose">取消</el-button>
-                <el-button
-                    hc-btn
-                    type="primary"
-                    :loading="submitAliasLoading"
-                    @click="aliasSubmit"
-                    >提交</el-button
-                >
-            </template>
-        </hc-dialog>
+        <!-- 新增修改 -->
+        <TreeNodeEditDialog
+            v-model="isAddEditShow"
+            :node="formModel"
+            :type="Number(wbsType)"
+            :wid="dataInfo.id"
+            :tree-props="treeProps"
+            :node-type="majorDatatype"
+            :major-type="majorDataTypeList"
+            @close="addEditClose"
+            @change="treeNodeEditChange"
+        />
+        <!-- 创建新的元素表 -->
+        <createNewExcel
+            v-model="isCreateShow"
+            @close="createClose"
+            :tableTypelist="tableTypelist"
+            :ownerTypeList="ownerTypeList"
+        ></createNewExcel>
     </hc-drawer>
 </template>
 
@@ -392,7 +210,7 @@
 import { nextTick, ref, watch, onMounted } from "vue";
 import { HcDelMsg } from "hc-vue3-ui";
 import { getDictionaryData, getDictionaryName } from "~src/utils/tools";
-import { getDictionary } from "~api/other";
+
 import { getStoreValue, setStoreValue } from "~uti/storage";
 import {
     arrToId,
@@ -403,8 +221,10 @@ import {
     isNullES,
 } from "js-fast-way";
 import mainApi from "~api/wbs/tree";
-import { getChildList } from "~api/other";
+
 import { useAppStore } from "~src/store";
+import TreeNodeEditDialog from "./tree-node-edit.vue";
+import createNewExcel from "./create-new-excel.vue";
 //缓存
 const store = useAppStore();
 const userInfo = ref(store.getUserInfo);
@@ -446,8 +266,9 @@ watch(
 watch(isShow, (val) => {
     if (val) getDataApi();
     getMajorList();
-    geStandardTypeOptions();
+
     getOwnerTypelist();
+    getTableTypelist(Number(wbsType.value - 1));
 });
 //渲染完成
 onMounted(() => {
@@ -459,8 +280,6 @@ const majorDatatype = ref([]);
 const getDataApi = async () => {
     isTreeMode.value = true;
     const type = wbsType.value;
-    console.log(wbsType.value, "wbsType.value");
-
     let code = "";
     if (type === 5) {
         code = "lar_node_type"; //征拆
@@ -499,6 +318,7 @@ const getSearchData = async () => {
 };
 //节点详情
 const nodeDetail = ref({});
+
 const getNodeDetail = async (data1, node) => {
     let parentName = "";
     if (node.parent.data) {
@@ -518,51 +338,14 @@ const getNodeDetail = async (data1, node) => {
     defaultCheckedKeys.value = nodeDetail.value.mixRatioTestIds
         ? nodeDetail.value.mixRatioTestIds.split(",")
         : [];
+    const res = getObjValue(data);
+    nodeTableData.value = [res];
 };
 //内业资料类型
 const majorDataTypeList = ref([]);
 const getMajorList = async () => {
     majorDataTypeList.value = await getDictionaryData("major_data_type", false);
 };
-//标砖分类类型
-const standardTypeOptions = ref([]);
-const geStandardTypeOptions = async () => {
-    const { data } = await getDictionary({
-        code: "classification",
-    });
-    standardTypeOptions.value = await getDictionaryData(
-        "classification",
-        false
-    );
-
-    standardTypeOptions.value.forEach((element) => {
-        // element.parentId=
-        data.forEach((ele) => {
-            if (ele.dictKey == element.value) {
-                element.id = ele.id;
-            }
-        });
-    });
-    // 定义要过滤的 dictKey 值
-    const targetKeys = [1, 2, 3, 4];
-    // 过滤数组
-    standardTypeOptions.value = standardTypeOptions.value.filter((item) =>
-        targetKeys.includes(item.value)
-    );
-};
-//单元名称
-const unitOptions = ref([]);
-const changeStandType = async (val) => {
-    formModel.value.unitName = "";
-    let parentId = "";
-    standardTypeOptions.value.forEach((item) => {
-        if (item.value == val) {
-            parentId = item.id;
-        }
-    });
-    const { data } = await getChildList({ current: 1, size: 10000, parentId });
-    unitOptions.value = data;
-};
 
 //树配置
 const isTreeMode = ref(false);
@@ -581,6 +364,7 @@ const treeProps = {
 };
 const treeData = ref([]);
 const autoExpandKeys = ref([]);
+const defaultCheckedKeys = ref([]);
 //懒加载树
 const treeLoadNode = async ({ item, level }, resolve) => {
     const { tenant_id } = getObjValue(userInfo.value);
@@ -607,30 +391,7 @@ const treeMenuDatas = [
     { icon: "delete-bin", label: "删除节点", key: "del" },
 ];
 //试验树数据
-const testTreeData = ref([]);
-const testTreeLoad = ref(false);
-const nodeTypeChange = async (val) => {
-    const { tenant_id } = getObjValue(userInfo.value);
-    const { id } = getObjValue(dataInfo.value);
-    if (val === 53) {
-        if (testTreeData.value.length > 0) {
-            return;
-        }
-        testTreeLoad.value = true;
-        const { data } = await mainApi.getAlltree({
-            tenantId: tenant_id,
-            type: 1,
-            wbsId: id,
-        });
-        testTreeLoad.value = false;
-        testTreeData.value = data;
-    }
-};
-const defaultCheckedKeys = ref([]);
-const TestTreeCheckChange = (_, { checkedKeys }) => {
-    const newarr = [...checkedKeys];
-    nodeDetail.value.mixRatioTestIds = newarr.join(",");
-};
+
 //菜单被点击
 const treeMenuClick = async ({ key, data, node, keys }) => {
     nodeInfo.value = data;
@@ -650,6 +411,7 @@ const treeMenuClick = async ({ key, data, node, keys }) => {
         formModel.value.partitionCode = "";
         formModel.value.uniqueCode = "";
 
+        formModel.value.majorDataType = "";
         await nextTick();
         isAddEditShow.value = true;
     } else if (key === "edit") {
@@ -683,72 +445,14 @@ const treeNodeTap = async ({ data, node, keys }) => {
     await getNodeDetail(data, node);
     await getTableData();
 };
-//节点别名
-const isAliasShow = ref(false);
-
-//节点别名
-const formAliasRef = ref(null);
-const formAliasModel = ref({});
-const formAliasRules = {
-    aliasName: {
-        required: true,
-        trigger: "blur",
-        message: "请输入节点别名",
-    },
-};
-
-//显示节点别名弹窗
-const aliasArr = ref([]);
-const aliasShowClick = () => {
-    isAliasShow.value = true;
-    aliasArr.value = [];
-    const { fullName } = deepClone(formModel.value);
-    if (isNullES(fullName)) return;
-    aliasArr.value = fullName.split(",");
-};
-
-//添加别名
-const addAliasName = async () => {
-    const formRes = await formValidate(formAliasRef.value);
-    if (!formRes) return false;
 
-    const { aliasName } = deepClone(formAliasModel.value);
-    if (aliasArr.value.indexOf(aliasName) !== -1) {
-        window.$message.warning("请不要重复别名");
-        return;
-    }
-    aliasArr.value.push(aliasName);
-    formAliasModel.value.aliasName = "";
-};
-
-//移除别名
-const aliasNameClose = (index) => {
-    aliasArr.value.splice(index, 1);
-};
-
-//提交别名
-const submitAliasLoading = ref(false);
-const aliasSubmit = async () => {
-    submitAliasLoading.value = true;
-    const { id } = formModel.value;
-    const fullName = aliasArr.value.join(",");
-    const { isRes } = await mainApi.submitFullName({
-        id: id,
-        fullNames: fullName,
-    });
-    submitAliasLoading.value = false;
-    const { data } = await mainApi.getDetail(id);
-    formModel.value = data;
-    if (!isRes) return;
-    aliasDialogClose();
-    window?.$message?.success("操作成功");
-};
-
-//关闭节点别名弹窗
-const aliasDialogClose = () => {
-    isAliasShow.value = false;
-    formAliasModel.value = {};
-};
+//节点信息
+const nodeTableColumn = ref([
+    { key: "nodeName", name: "当前节点", align: "center" },
+    { key: "nodeType", name: "节点类型", align: "center" },
+    { key: "parentName", name: "上级节点", align: "center" },
+]);
+const nodeTableData = ref([]);
 //表格数据
 const tableColumn = ref([
     { key: "tableName", name: "表单名称" },
@@ -806,47 +510,18 @@ const formRules = {
 };
 
 //新增、编辑节点提交
-const addEditLoading = ref(false);
-const addEditSubmit = async () => {
-    //验证表单
-    const isForm = await formValidate(formRef.value);
-    if (!isForm) return false;
-    addEditLoading.value = true;
-    //处理表单
-    const form = formModel.value;
-    form.nodeTypeName = getDictionaryName(majorDatatype.value, form.nodeType);
-    //发起请求
-    let res;
-    if (isNullES(form.id)) {
-        console.log(nodeInfo.value, "nodeInfo.value");
-
-        const { ancestors, id } = nodeInfo.value;
-
-        form.parentId = id;
-        form.ancestors = ancestors;
-        form.wbsId = dataInfo.value.id;
-        const { tenant_id } = getObjValue(userInfo.value);
-        form.tenantId = tenant_id;
-        res = await mainApi.submit(form);
-    } else {
-        res = await mainApi.submit(form);
-    }
-    //处理结果
-    const { error, code } = getObjValue(res);
-    addEditLoading.value = false;
-    if (!error && code === 200) {
-        window?.$message?.success("操作成功");
-        addEditClose();
-        setTreeMode();
-    }
-};
 
 //关闭 新增、编辑节点
 const addEditClose = () => {
     isAddEditShow.value = false;
     formModel.value = {};
 };
-
+//编辑节点被修改
+const treeNodeEditChange = () => {
+    isAddEditShow.value = false;
+    formModel.value = {};
+    console.log("编辑节点被修改");
+};
 //树重加载
 const setTreeMode = () => {
     isTreeMode.value = false;
@@ -917,6 +592,20 @@ const drawerClose = () => {
 
 const editRowClick = () => {};
 const rowDelClick = () => {};
+
+//创建新的元素表
+const isCreateShow = ref(false);
+const createClose = () => {
+    isCreateShow.value = false;
+};
+const createNew = () => {
+    const { id } = nodeInfo.value;
+    if (id) {
+        isCreateShow.value = true;
+    } else {
+        window.$message.warning("请先选择在哪个节点下创建表");
+    }
+};
 </script>
 
 <style lang="scss">
@@ -939,3 +628,49 @@ const rowDelClick = () => {};
     border: 1px solid #dddfe6;
 }
 </style>
+<style scoped lang="scss">
+.hc-project-wbs-tree {
+    position: relative;
+    background: #ececec;
+    border-radius: 4px;
+    height: 100%;
+    flex-direction: column;
+    overflow: hidden;
+    .header {
+        color: white;
+        background: #54565a;
+        padding: 10px 14px;
+        flex-shrink: 0;
+        .name {
+            white-space: nowrap;
+            overflow: hidden;
+            text-overflow: ellipsis;
+        }
+    }
+    .body {
+        flex: 1;
+        flex-basis: auto;
+        position: relative;
+    }
+}
+</style>
+<style lang="scss">
+.hc-project-wbs-tree .body {
+    .el-card.hc-card-box {
+        --el-card-padding: 12px;
+        --el-card-border-radius: 5px;
+    }
+    .hc-page-split-content {
+        position: relative;
+        .body-top {
+            position: relative;
+            height: 119.5px;
+        }
+        .body-content {
+            position: relative;
+            margin-top: 10px;
+            height: calc(100% - 129.5px);
+        }
+    }
+}
+</style>

+ 493 - 0
src/views/desk/wbs/tree-node-edit.vue

@@ -0,0 +1,493 @@
+<template>
+    <hc-dialog
+        v-model="isShow"
+        widths="26rem"
+        title="编辑节点"
+        is-footer-center
+        @close="dialogClose"
+    >
+        <el-form
+            ref="formRef"
+            :model="formModel"
+            :rules="formRules"
+            label-position="top"
+            label-width="auto"
+        >
+            <el-form-item label="节点名称:" prop="nodeName">
+                <el-input
+                    v-model="formModel.nodeName"
+                    clearable
+                    class="is-right-btn"
+                >
+                    <template #append>
+                        <el-button hc-btn type="primary" @click="aliasShowClick"
+                            >添加别名</el-button
+                        >
+                    </template>
+                </el-input>
+            </el-form-item>
+            <el-form-item label="上级节点:">
+                <el-input v-model="formModel.parentName" disabled />
+            </el-form-item>
+            <el-form-item label="节点类型:" prop="nodeType">
+                <el-select
+                    v-model="formModel.nodeType"
+                    placeholder="选择节点类型"
+                    filterable
+                    block
+                >
+                    <el-option
+                        v-for="item in nodeTypelist"
+                        :key="item.value"
+                        :label="item.label"
+                        :value="item.value"
+                    />
+                </el-select>
+            </el-form-item>
+            <el-form-item
+                v-if="wbsType !== 2 && wbsType !== 5"
+                label="划分编号:"
+            >
+                <el-input v-model="formModel.partitionCode" clearable />
+            </el-form-item>
+            <el-form-item v-if="wbsType !== 5" label="唯一编码:">
+                <el-input v-model="formModel.uniqueCode" clearable />
+            </el-form-item>
+            <el-form-item v-if="wbsType === 6" label="是否有混凝土:">
+                <div class="form-item-div">
+                    <el-radio-group v-model="formModel.isConcrete">
+                        <el-radio :value="0">否</el-radio>
+                        <el-radio :value="1">有</el-radio>
+                    </el-radio-group>
+                </div>
+            </el-form-item>
+            <el-form-item v-if="wbsType === 6" label="是否试验节点:">
+                <div class="form-item-div">
+                    <el-radio-group v-model="formModel.isExpernode">
+                        <el-radio :value="0">否</el-radio>
+                        <el-radio :value="1">是</el-radio>
+                    </el-radio-group>
+                </div>
+            </el-form-item>
+            <el-form-item
+                v-if="wbsType !== 2 && wbsType !== 5"
+                label="内业资料类型:"
+                prop="majorDataType"
+            >
+                <el-select
+                    v-model="formModel.majorDataType"
+                    placeholder="选择内业资料类型"
+                    filterable
+                    block
+                >
+                    <el-option
+                        v-for="item in majorDataType"
+                        :key="item.value"
+                        :label="item.label"
+                        :value="item.value"
+                    />
+                </el-select>
+            </el-form-item>
+            <el-form-item
+                v-if="wbsType === 2 && formModel.nodeType === 53"
+                label="勾选相关联试验:"
+                prop="mixRatioTestIds"
+                :f="getTestTreeData()"
+            >
+                <el-tree-select
+                    v-model="mixRatioTestIds"
+                    placeholder="选择勾选相关联试验"
+                    show-checkbox
+                    clearable
+                    filterable
+                    multiple
+                    block
+                    node-key="id"
+                    :data="testData"
+                    :props="testProps"
+                    :render-after-expand="false"
+                    @check="testTreeCheckChange"
+                />
+            </el-form-item>
+            <el-form-item label="标准分类" v-if="formModel.isExistForm == 1">
+                <el-select
+                    v-model="formModel.className"
+                    placeholder="请选择"
+                    @change="changeStandType"
+                >
+                    <el-option
+                        v-for="item in standardTypeOptions"
+                        :key="item.value"
+                        :label="item.label"
+                        :value="item.value"
+                    ></el-option>
+                </el-select>
+            </el-form-item>
+            <el-form-item label="单元名称" v-if="formModel.isExistForm == 1">
+                <el-select v-model="formModel.unitName" placeholder="请选择">
+                    <el-option
+                        v-for="item in unitOptions"
+                        :key="item.id"
+                        :label="item.dictValue"
+                        :value="item.dictKey"
+                    ></el-option>
+                </el-select>
+            </el-form-item>
+        </el-form>
+        <template #footer>
+            <el-button hc-btn @click="dialogClose">取消</el-button>
+            <el-button
+                hc-btn
+                type="primary"
+                :loading="submitLoading"
+                @click="dialogSubmit"
+                >提交</el-button
+            >
+        </template>
+    </hc-dialog>
+
+    <!-- 节点别名 -->
+    <hc-dialog
+        v-model="isAliasShow"
+        widths="26rem"
+        title="节点别名"
+        is-footer-center
+        @close="aliasDialogClose"
+    >
+        <el-form
+            ref="formAliasRef"
+            :model="formAliasModel"
+            :rules="formAliasRules"
+            label-position="top"
+            label-width="auto"
+        >
+            <el-form-item prop="aliasName">
+                <el-input
+                    v-model="formAliasModel.aliasName"
+                    placeholder="请输入节点别名"
+                    clearable
+                    class="is-right-btn"
+                >
+                    <template v-if="formModel.pKeyId" #append>
+                        <el-button hc-btn type="primary" @click="addAliasName"
+                            >添加</el-button
+                        >
+                    </template>
+                </el-input>
+            </el-form-item>
+        </el-form>
+        <div
+            v-if="aliasArr.length > 0"
+            class="hc-tree-node-edit-form-alias-name"
+        >
+            <template v-for="(item, index) in aliasArr" :key="index">
+                <el-tag
+                    closable
+                    type="primary"
+                    @close="aliasNameClose(index)"
+                    >{{ item }}</el-tag
+                >
+            </template>
+        </div>
+        <template #footer>
+            <el-button hc-btn @click="aliasDialogClose">取消</el-button>
+            <el-button
+                hc-btn
+                type="primary"
+                :loading="submitAliasLoading"
+                @click="aliasSubmit"
+                >提交</el-button
+            >
+        </template>
+    </hc-dialog>
+</template>
+
+<script setup>
+import { ref, watch } from "vue";
+import { getDictionary } from "~api/other";
+import { getDictionaryData, getDictionaryName } from "~src/utils/tools";
+import {
+    deepClone,
+    formValidate,
+    getArrValue,
+    isNullES,
+    getObjValue,
+} from "js-fast-way";
+import { useAppStore } from "~src/store";
+import mainApi from "~api/wbs/tree";
+const store = useAppStore();
+const userInfo = ref(store.getUserInfo);
+const props = defineProps({
+    node: {
+        type: Object,
+        default: () => ({}),
+    },
+    type: {
+        type: Number,
+        default: 1,
+    },
+    wid: {
+        type: [String, Number],
+        default: "",
+    },
+
+    treeProps: {
+        type: Object,
+        default: () => ({}),
+    },
+    nodeType: {
+        type: Array,
+        default: () => [],
+    },
+    majorType: {
+        type: Array,
+        default: () => [],
+    },
+});
+
+//事件
+const emit = defineEmits(["change", "close"]);
+
+//双向绑定
+// eslint-disable-next-line no-undef
+const isShow = defineModel("modelValue", {
+    default: false,
+});
+
+//数据变量
+const formModel = ref(props.node);
+const wbsType = ref(props.type);
+const wbsId = ref(props.wid);
+
+const nodeTypelist = ref(props.nodeType);
+const majorDataType = ref(props.majorType);
+const testProps = ref(props.treeProps);
+
+//监听数据
+watch(
+    () => [
+        props.node,
+        props.type,
+        props.wid,
+
+        props.nodeType,
+        props.majorType,
+        props.treeProps,
+    ],
+    ([node, type, wid, nodeType, majorType, treeProps]) => {
+        formModel.value = node;
+        wbsType.value = type;
+        wbsId.value = wid;
+
+        nodeTypelist.value = nodeType;
+        majorDataType.value = majorType;
+        testProps.value = treeProps;
+    },
+    { deep: true }
+);
+
+//监听显示
+watch(isShow, (val) => {
+    if (val) {
+        getDataInfo();
+        geStandardTypeOptions();
+    } else {
+        emit("close");
+    }
+});
+
+//获取数据
+const getDataInfo = () => {
+    const { nodeType } = formModel.value;
+    if (nodeType === 53) {
+        getTestTreeData();
+    }
+};
+
+//节点别名
+const isAliasShow = ref(false);
+
+//节点别名
+const formAliasRef = ref(null);
+const formAliasModel = ref({});
+const formAliasRules = {
+    aliasName: {
+        required: true,
+        trigger: "blur",
+        message: "请输入节点别名",
+    },
+};
+
+//显示节点别名弹窗
+const aliasArr = ref([]);
+const aliasShowClick = () => {
+    isAliasShow.value = true;
+    aliasArr.value = [];
+    const { fullName } = deepClone(formModel.value);
+    if (isNullES(fullName)) return;
+    aliasArr.value = fullName.split(",");
+};
+
+//添加别名
+const addAliasName = async () => {
+    const formRes = await formValidate(formAliasRef.value);
+    if (!formRes) return false;
+    const { aliasName } = deepClone(formAliasModel.value);
+    if (aliasArr.value.indexOf(aliasName) !== -1) {
+        window.$message.warning("请不要重复别名");
+        return;
+    }
+    aliasArr.value.push(aliasName);
+    formAliasModel.value.aliasName = "";
+};
+
+//移除别名
+const aliasNameClose = (index) => {
+    aliasArr.value.splice(index, 1);
+};
+
+//提交别名
+const submitAliasLoading = ref(false);
+const aliasSubmit = async () => {
+    submitAliasLoading.value = true;
+    const { id } = formModel.value;
+    const fullName = aliasArr.value.join(",");
+    const { isRes } = await mainApi.submitFullName({
+        id: id,
+        fullNames: fullName,
+    });
+    submitAliasLoading.value = false;
+    if (!isRes) return;
+    aliasDialogClose();
+    window?.$message?.success("操作成功");
+};
+
+//关闭节点别名弹窗
+const aliasDialogClose = () => {
+    isAliasShow.value = false;
+    formAliasModel.value = {};
+};
+
+//获取实验树的数据
+const testData = ref([]);
+const mixRatioTestIds = ref([]);
+const getTestTreeData = async () => {
+    const { tenant_id } = getObjValue(userInfo.value);
+    testData.value = [];
+    const { primaryKeyId, pKeyId, mixRatioTestIds: testIds } = formModel.value;
+    let pid = primaryKeyId ?? pKeyId;
+    const { data } = await mainApi.getAlltree({
+        tenantId: tenant_id,
+        type: 1,
+        wbsId: formModel.value.wbsId,
+    });
+    testData.value = getArrValue(data);
+    if (!isNullES(testIds)) {
+        mixRatioTestIds.value = testIds?.split(",") ?? [];
+    } else {
+        mixRatioTestIds.value = [];
+    }
+};
+//监听实验树的勾选, halfCheckedKeys
+const testTreeCheckChange = (_, { checkedKeys }) => {
+    formModel.value.mixRatioTestIds = checkedKeys.join(",");
+};
+
+//表单
+const formRef = ref(null);
+const formRules = {
+    nodeName: {
+        required: true,
+        trigger: "blur",
+        message: "请输入节点名称",
+    },
+    nodeType: {
+        required: true,
+        trigger: "blur",
+        message: "请选择节点类型",
+    },
+    majorDataType: {
+        required: true,
+        trigger: "blur",
+        message: "请选择内业资料类型",
+    },
+    mixRatioTestIds: {
+        required: true,
+        trigger: "blur",
+        message: "请勾选相关联试验",
+    },
+};
+
+//提交表单
+const submitLoading = ref(false);
+const dialogSubmit = async () => {
+    const formRes = await formValidate(formRef.value);
+    if (!formRes) return false;
+    submitLoading.value = true;
+    //发起请求
+    const { isRes } = await mainApi.submit(formModel.value);
+    submitLoading.value = false;
+    if (!isRes) return;
+    dialogClose();
+    window?.$message?.success("操作成功");
+    emit("change");
+};
+
+//关闭弹窗
+const dialogClose = () => {
+    isShow.value = false;
+    emit("close");
+};
+//标砖分类类型
+const standardTypeOptions = ref([]);
+const geStandardTypeOptions = async () => {
+    const { data } = await getDictionary({
+        code: "classification",
+    });
+    standardTypeOptions.value = await getDictionaryData(
+        "classification",
+        false
+    );
+
+    standardTypeOptions.value.forEach((element) => {
+        // element.parentId=
+        data.forEach((ele) => {
+            if (ele.dictKey == element.value) {
+                element.id = ele.id;
+            }
+        });
+    });
+    // 定义要过滤的 dictKey 值
+    const targetKeys = [1, 2, 3, 4];
+    // 过滤数组
+    standardTypeOptions.value = standardTypeOptions.value.filter((item) =>
+        targetKeys.includes(item.value)
+    );
+};
+//单元名称
+const unitOptions = ref([]);
+const changeStandType = async (val) => {
+    formModel.value.unitName = "";
+    let parentId = "";
+    standardTypeOptions.value.forEach((item) => {
+        if (item.value == val) {
+            parentId = item.id;
+        }
+    });
+    const { data } = await getChildList({ current: 1, size: 10000, parentId });
+    unitOptions.value = data;
+};
+</script>
+
+<style lang="scss">
+.hc-tree-node-edit-form-alias-name {
+    position: relative;
+    border: 1px dashed #dcdfe6;
+    border-radius: 4px;
+    padding: 5px 5px 0;
+    .el-tag {
+        margin-right: 5px;
+        margin-bottom: 5px;
+    }
+}
+</style>