Browse Source

项目管理

ZaiZai 1 year ago
parent
commit
3b85d63fec

+ 2 - 2
src/api/modules/project/project.js

@@ -66,11 +66,11 @@ export default {
             params: { type },
         }, false)
     },
-    async findProjectTree(projectId, wbsId) {
+    async findProjectTree(form) {
         return HcApi({
             url: '/api/blade-manager/projectInfo/tree',
             method: 'get',
-            params: { projectId, wbsId },
+            params: form,
         }, false)
     },
     //获取试验配合比树接口

+ 16 - 0
src/styles/app/element.scss

@@ -222,3 +222,19 @@
 .hc-div-new-card-box.is-tree .el-card.hc-new-card-box .hc-card-main .hc-card-main-body {
     left: -12px;
 }
+
+//输入框有右侧按钮
+.el-input.is-right-btn {
+    .el-input-group__append {
+        padding: 0;
+        color: white;
+    }
+    .el-button[hc-btn] {
+        margin: 0;
+        height: 100%;
+        border-radius: 0 4px 4px 0;
+    }
+    .el-button[hc-btn].el-button--primary {
+        color: var(--el-button-text-color);
+    }
+}

+ 216 - 0
src/views/project/modules/list/tree-node-edit.vue

@@ -0,0 +1,216 @@
+<template>
+    <hc-new-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">添加别名</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>
+        <template #footer>
+            <el-button hc-btn @click="dialogClose">取消</el-button>
+            <el-button hc-btn type="primary" :loading="submitLoading" @click="dialogSubmit">提交</el-button>
+        </template>
+    </hc-new-dialog>
+</template>
+
+<script setup>
+import { ref, watch } from 'vue'
+import { deepClone, getArrValue, getObjValue, isNullES } from 'js-fast-way'
+import projectApi from '~api/project/project'
+
+const props = defineProps({
+    node: {
+        type: Object,
+        default: () => ({}),
+    },
+    type: {
+        type: Number,
+        default: 1,
+    },
+    wid: {
+        type: [String, Number],
+        default: '',
+    },
+    pid: {
+        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 projectId = ref(props.pid)
+const nodeTypelist = ref(props.nodeType)
+const majorDataType = ref(props.majorType)
+const testProps = ref(props.treeProps)
+
+//监听数据
+watch(() => [
+    props.node,
+    props.type,
+    props.wid,
+    props.pid,
+    props.nodeType,
+    props.majorType,
+    props.treeProps,
+], ([node, type, wid, pid, nodeType, majorType, treeProps]) => {
+    formModel.value = node
+    wbsType.value = type
+    wbsId.value = wid
+    projectId.value = pid
+    nodeTypelist.value = nodeType
+    majorDataType.value = majorType
+    testProps.value = treeProps
+}, { deep: true })
+
+//监听显示
+watch(isShow, (val) => {
+    if (val) {
+        getDataInfo()
+    } else {
+        emit('close')
+    }
+})
+
+//获取数据
+const getDataInfo = () => {
+    const { nodeType } = formModel.value
+    console.log(formModel.value)
+    if (nodeType === 53) {
+        getTestTreeData()
+    }
+}
+
+//获取实验树的数据
+const testData = ref([])
+const mixRatioTestIds = ref([])
+const getTestTreeData = async () => {
+    testData.value = []
+    const { primaryKeyId, pKeyId, mixRatioTestIds: testIds } = formModel.value
+    let pid = primaryKeyId ?? pKeyId
+    const { data } = await projectApi.findProjectTree({
+        projectId: projectId.value,
+        wbsId: wbsId.value,
+        parentId: pid,
+    })
+    testData.value = getArrValue(data)
+    if (!isNullES(testIds)) {
+        mixRatioTestIds.value = testIds?.split(',') ?? []
+    } else {
+        mixRatioTestIds.value = []
+    }
+}
+//监听实验树的勾选
+const testTreeCheckChange = (_, { checkedKeys, halfCheckedKeys }) => {
+    formModel.value.mixRatioTestIds = checkedKeys.join(',')
+}
+
+//菜单表单
+const formRef = ref(null)
+const formRules = {
+    name: {
+        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 form = formModel.value
+    form.parentId = form.parentId ?? 0
+    form.alias = form.alias ?? form.code
+    //发起请求
+    const { error, code, msg } = await mainApi.submit(form)
+    submitLoading.value = false
+    if (!error && code === 200) {
+        dialogClose()
+        window?.$message?.success('操作成功')
+        reloadPage()
+    } else {
+        window?.$message?.error(msg ?? '操作失败')
+    }*/
+}
+
+//关闭弹窗
+const dialogClose = () => {
+    isShow.value = false
+    emit('close')
+}
+</script>
+
+<style scoped lang="scss">
+
+</style>

+ 29 - 3
src/views/project/modules/list/wbs-tree.vue

@@ -95,17 +95,23 @@
                 </hc-body>
             </div>
         </div>
+        <!-- 编辑节点 -->
+        <TreeNodeEditDialog
+            v-model="isTreeNodeEditShow" :node="treeMenuItem" :type="Number(isType)" :wid="wbsId" :pid="projectInfo.id" :tree-props="treeProps"
+            :node-type="nodeTypelist" :major-type="majorDataTypeList" @close="treeNodeEditClose" @change="treeNodeEditChange"
+        />
     </hc-new-drawer>
 </template>
 
 <script setup>
-import { ref, watch } from 'vue'
+import { nextTick, ref, watch } from 'vue'
 import { useAppStore } from '~src/store'
 import { getStore, setStore } from 'hc-vue3-ui'
 import { getArrValue, getObjValue, isNullES } from 'js-fast-way'
 import { getDictionaryData } from '~uti/tools'
 import wbsTreeApi from '~api/wbs/tree'
 import mainApi from '~api/wbs/private'
+import TreeNodeEditDialog from './tree-node-edit.vue'
 
 const props = defineProps({
     type: {
@@ -275,9 +281,15 @@ const treeMenus = [
     { icon: 'delete-bin', label: '删除节点', key: 'del' },
 ]
 //菜单被点击
+const treeMenuItem = ref({})
 const treeMenuClick = ({ key, node, data }) => {
-    if (key === 'edit') {
-        //编辑节点
+    if (key === 'edit') { //编辑节点
+        data.nodeName = data.title
+        data.parentName = node?.parent?.data?.title ?? '' //获取父节点名称
+        treeMenuItem.value = data
+        nextTick(() => {
+            isTreeNodeEditShow.value = true
+        })
     } else if (key === 'sync1') {
         //同步新增元素表单
     } else if (key === 'sync3') {
@@ -291,6 +303,20 @@ const treeMenuClick = ({ key, node, data }) => {
     }
 }
 
+//编辑节点
+const isTreeNodeEditShow = ref(false)
+//编辑节点被关闭
+const treeNodeEditClose = () => {
+    isTreeNodeEditShow.value = false
+    treeMenuItem.value = {}
+}
+//编辑节点被修改
+const treeNodeEditChange = () => {
+    isTreeNodeEditShow.value = false
+    treeMenuItem.value = {}
+    console.log('编辑节点被修改')
+}
+
 //懒加载树
 const treeLoadNode = async ({ item, level }, resolve) => {
     let pid = level !== 0 ? item.id : 0