|
|
@@ -99,7 +99,9 @@
|
|
|
<el-input v-model="queryParams.backendStaff" placeholder="请输入后端人员" clearable class="search-input"
|
|
|
size="default" />
|
|
|
</el-form-item>
|
|
|
-
|
|
|
+ <!-- <el-form-item label="需求类型" prop="type">
|
|
|
+ <dictionary type="button" code="demand-type" placeholder="请选择需求类型" v-model="queryParams.type" />
|
|
|
+ </el-form-item> -->
|
|
|
<el-form-item class="form-actions">
|
|
|
<el-button type="primary" @click="handleQuery()" size="default">
|
|
|
<i-ep-search class="icon-mr" />搜索
|
|
|
@@ -113,7 +115,7 @@
|
|
|
|
|
|
<el-card shadow="never" class="table-container">
|
|
|
<template #header>
|
|
|
- <el-button v-hasPerm="['system:mineDemand:add']" type="success" @click="handleOpenDialog()">
|
|
|
+ <!-- <el-button v-hasPerm="['system:mineDemand:add']" type="success" @click="handleOpenDialog()">
|
|
|
<i-ep-plus />
|
|
|
新增
|
|
|
</el-button>
|
|
|
@@ -121,6 +123,33 @@
|
|
|
@click="handleDelete()"><i-ep-delete />
|
|
|
删除
|
|
|
</el-button>
|
|
|
+ <div>
|
|
|
+ <el-button class="ml-3" @click="handleExport">
|
|
|
+ <template #icon><i-ep-download /></template>
|
|
|
+ 导出
|
|
|
+ </el-button>
|
|
|
+ </div> -->
|
|
|
+
|
|
|
+ <div class="flex-x-between">
|
|
|
+ <div>
|
|
|
+ <el-button v-hasPerm="['system:mineDemand:add']" type="success" @click="handleOpenDialog()">
|
|
|
+ <i-ep-plus />
|
|
|
+ 新增
|
|
|
+ </el-button>
|
|
|
+ <el-button v-hasPerm="['system:mineDemand:delete']" type="danger" :disabled="removeIds.length === 0"
|
|
|
+ @click="handleDelete()"><i-ep-delete />
|
|
|
+ 删除
|
|
|
+ </el-button>
|
|
|
+ </div>
|
|
|
+ <div>
|
|
|
+
|
|
|
+
|
|
|
+ <el-button class="ml-3" @click="handleExport">
|
|
|
+ <template #icon><i-ep-download /></template>
|
|
|
+ 导出
|
|
|
+ </el-button>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
</template>
|
|
|
<div class="breadcrumb-card">
|
|
|
<!-- 使用flex布局并控制整体对齐方式 -->
|
|
|
@@ -142,8 +171,13 @@
|
|
|
</el-breadcrumb-item>
|
|
|
</el-breadcrumb>
|
|
|
</div>
|
|
|
-
|
|
|
<!-- 右侧:单选按钮组 -->
|
|
|
+ <div style="white-space: nowrap; border-radius: 6px; ">
|
|
|
+ <el-radio-group v-model="queryParams.onlyViewMe" @change="handleQuery" fill="var(--el-color-success)">
|
|
|
+ <el-radio-button label="全部" :value="0" style=" border-radius: 4px; transition: all 0.2s ease;" />
|
|
|
+ <el-radio-button label="只看我" :value="1" style=" border-radius: 4px; transition: all 0.2s ease;" />
|
|
|
+ </el-radio-group>
|
|
|
+ </div>
|
|
|
<div style="white-space: nowrap; border-radius: 6px; ">
|
|
|
<el-radio-group v-model="queryParams.completeStatus" @change="handleQuery">
|
|
|
<el-radio-button label="全部" :value="0" style=" border-radius: 4px; transition: all 0.2s ease;" />
|
|
|
@@ -152,17 +186,26 @@
|
|
|
<el-radio-button label="未完成" :value="3" style=" border-radius: 4px; transition: all 0.2s ease;" />
|
|
|
</el-radio-group>
|
|
|
</div>
|
|
|
+
|
|
|
</el-row>
|
|
|
</div>
|
|
|
|
|
|
<el-table ref="dataTableRef" v-loading="loading" :data="pageData" highlight-current-row border
|
|
|
@selection-change="handleSelectionChange">
|
|
|
<el-table-column fixed type="selection" width="55" align="center" />
|
|
|
- <el-table-column fixed key="area" label="所属片区" prop="area" min-width="150" align="center" />
|
|
|
- <el-table-column fixed key="mineName" label="矿名" prop="mineName" min-width="150" align="center" />
|
|
|
- <el-table-column fixed key="demandName" label="需求名称" prop="demandName" min-width="150" align="center"
|
|
|
+ <el-table-column fixed key="area" label="片区" prop="area" min-width="75" align="center"
|
|
|
+ show-overflow-tooltip />
|
|
|
+ <el-table-column fixed key="mineName" label="矿名" prop="mineName" min-width="100" align="center"
|
|
|
+ show-overflow-tooltip />
|
|
|
+ <el-table-column fixed key="demandName" label="需求名称" prop="demandName" min-width="200" align="center"
|
|
|
+ show-overflow-tooltip />
|
|
|
+ <el-table-column fixed align="center" label="需求类型" width="170">
|
|
|
+ <template #default="scope">
|
|
|
+ <DictLabel code="demand-type" v-model="scope.row.type" />
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column key="submitter" label="需求提交人" prop="submitter" min-width="150" align="center"
|
|
|
show-overflow-tooltip />
|
|
|
- <el-table-column key="submitter" label="需求提交人" prop="submitter" min-width="150" align="center" />
|
|
|
<el-table-column key="operationStaff" label="运维人员" prop="operationStaff" min-width="150" align="center" />
|
|
|
<el-table-column key="ventilationTechStaff" label="通防技术人员" prop="ventilationTechStaff" min-width="150"
|
|
|
align="center" />
|
|
|
@@ -305,7 +348,7 @@
|
|
|
</template>
|
|
|
</el-dialog>
|
|
|
<el-dialog v-model="progressVisible" title="进度管理" width="800px" @close="handleCloseDialog" draggable>
|
|
|
- <el-form ref="dataFormRef" :model="formData" :rules="rules" label-width="120px"
|
|
|
+ <el-form ref="dataFormRef" :model="formData" :rules="rules" label-width="120px" v-loading="detailLoading"
|
|
|
:autosize="{ minRows: 4, maxRows: 88 }">
|
|
|
<el-form-item label="前端">
|
|
|
<el-input type="textarea" v-model="formData.frontendProgress" placeholder="前端进度"
|
|
|
@@ -329,31 +372,53 @@
|
|
|
</el-dialog>
|
|
|
<!-- 煤矿需求管理表单弹窗 -->
|
|
|
<el-dialog v-model="dialog.visible" :title="dialog.title" width="800px" @close="handleCloseDialog" draggable>
|
|
|
- <el-form ref="dataFormRef" :model="formData" :rules="rules" label-width="120px">
|
|
|
- <el-form-item label="所属片区" prop="area">
|
|
|
- <el-input v-model="formData.area" placeholder="所属片区" />
|
|
|
- </el-form-item>
|
|
|
- <el-form-item label="矿名" prop="mineName">
|
|
|
- <el-input v-model="formData.mineName" placeholder="矿名" />
|
|
|
- </el-form-item>
|
|
|
+ <el-form ref="dataFormRef" :model="formData" :rules="rules" label-width="120px" v-loading="detailLoading">
|
|
|
+ <el-row>
|
|
|
+ <el-form-item label="所属片区" prop="area">
|
|
|
+ <el-input v-model="formData.area" placeholder="所属片区" />
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="矿名" prop="mineName">
|
|
|
+ <el-input v-model="formData.mineName" placeholder="矿名" />
|
|
|
+ </el-form-item>
|
|
|
+ </el-row>
|
|
|
+
|
|
|
<el-form-item label="需求名称" prop="demandName">
|
|
|
<el-input v-model="formData.demandName" placeholder="需求名称" />
|
|
|
</el-form-item>
|
|
|
- <el-form-item label="需求提交人" prop="submitter">
|
|
|
- <el-input v-model="formData.submitter" placeholder="需求提交人" />
|
|
|
- </el-form-item>
|
|
|
- <el-form-item label="运维人员" prop="operationStaff">
|
|
|
- <el-input v-model="formData.operationStaff" placeholder="运维人员" />
|
|
|
- </el-form-item>
|
|
|
- <el-form-item label="通防技术人员" prop="ventilationTechStaff">
|
|
|
- <el-input v-model="formData.ventilationTechStaff" placeholder="通防技术人员" />
|
|
|
- </el-form-item>
|
|
|
- <el-form-item label="前端人员" prop="frontendStaff">
|
|
|
- <el-input v-model="formData.frontendStaff" placeholder="前端人员" />
|
|
|
- </el-form-item>
|
|
|
- <el-form-item label="后端人员" prop="backendStaff">
|
|
|
- <el-input v-model="formData.backendStaff" placeholder="后端人员" />
|
|
|
- </el-form-item>
|
|
|
+
|
|
|
+ <el-row>
|
|
|
+ <el-form-item label="需求类型" prop="type">
|
|
|
+ <dictionary type="button" code="demand-type" v-model="formData.type" />
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="需求提交人" prop="submitter">
|
|
|
+ <el-input v-model="formData.submitter" placeholder="需求提交人" />
|
|
|
+ </el-form-item>
|
|
|
+ </el-row>
|
|
|
+
|
|
|
+ <el-row>
|
|
|
+ <el-form-item label="运维人员" prop="operationStaff">
|
|
|
+ <el-input v-model="formData.operationStaff" placeholder="运维人员" />
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="通防技术人员" prop="ventilationTechStaff">
|
|
|
+ <el-input v-model="formData.ventilationTechStaff" placeholder="通防技术人员" />
|
|
|
+ </el-form-item>
|
|
|
+ </el-row>
|
|
|
+ <el-row>
|
|
|
+ <el-form-item label="前端人员" prop="frontendStaff">
|
|
|
+ <el-input v-model="formData.frontendStaff" placeholder="前端人员" :disabled="!frontendStuffEdit" />
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="后端人员" prop="backendStaff">
|
|
|
+ <el-input v-model="formData.backendStaff" placeholder="后端人员" :disabled="!backendStuffEdit" />
|
|
|
+ </el-form-item>
|
|
|
+ </el-row>
|
|
|
+ <el-row>
|
|
|
+ <el-form-item label="前端复杂度" prop="frontendComplex">
|
|
|
+ <el-input type="number" v-model="formData.frontendComplex" placeholder="前端复杂度" :disabled="!complexEdit" />
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="后端复杂度" prop="backendComplex">
|
|
|
+ <el-input type="number" v-model="formData.backendComplex" placeholder="后端复杂度" :disabled="!complexEdit" />
|
|
|
+ </el-form-item>
|
|
|
+ </el-row>
|
|
|
<el-form-item label="前端版本号" prop="frontendVersion">
|
|
|
<el-input type="textarea" v-model="formData.frontendVersion" placeholder="前端版本号"
|
|
|
:autosize="{ minRows: 2, maxRows: 88 }" />
|
|
|
@@ -362,23 +427,46 @@
|
|
|
<el-input type="textarea" v-model="formData.backendVersion" placeholder="后端版本号"
|
|
|
:autosize="{ minRows: 2, maxRows: 88 }" />
|
|
|
</el-form-item>
|
|
|
- <el-row> <el-form-item label="提交时间" prop="submitTime">
|
|
|
- <el-date-picker class="!w-[240px]" v-model="formData.submitTime" type="date" placeholder="提交时间"
|
|
|
- value-format="YYYY-MM-DD" />
|
|
|
+ <el-row>
|
|
|
+ <el-form-item label="提交时间" prop="submitTime">
|
|
|
+ <el-date-picker v-model="formData.submitTime" type="date" placeholder="提交时间" value-format="YYYY-MM-DD" />
|
|
|
</el-form-item>
|
|
|
<el-form-item label="计划完成时间" prop="plannedCompleteTime">
|
|
|
- <el-date-picker class="!w-[240px]" v-model="formData.plannedCompleteTime" type="date" placeholder="计划完成时间"
|
|
|
+ <el-date-picker v-model="formData.plannedCompleteTime" type="date" placeholder="计划完成时间"
|
|
|
value-format="YYYY-MM-DD" />
|
|
|
- </el-form-item></el-row>
|
|
|
- <el-row> <el-form-item label="实际开始时间" prop="actualStartTime">
|
|
|
- <el-date-picker class="!w-[240px]" v-model="formData.actualStartTime" type="date" placeholder="实际开始时间"
|
|
|
+ </el-form-item>
|
|
|
+ </el-row>
|
|
|
+
|
|
|
+ <el-row>
|
|
|
+ <el-form-item label="实际开始时间" prop="actualStartTime">
|
|
|
+ <el-date-picker v-model="formData.actualStartTime" type="date" placeholder="实际开始时间"
|
|
|
value-format="YYYY-MM-DD" />
|
|
|
</el-form-item>
|
|
|
<el-form-item label="实际完成时间" prop="actualCompleteTime">
|
|
|
- <el-date-picker class="!w-[240px]" v-model="formData.actualCompleteTime" type="date" placeholder="实际完成时间"
|
|
|
+ <el-date-picker v-model="formData.actualCompleteTime" type="date" placeholder="实际完成时间"
|
|
|
value-format="YYYY-MM-DD" />
|
|
|
- </el-form-item></el-row>
|
|
|
-
|
|
|
+ </el-form-item>
|
|
|
+ </el-row>
|
|
|
+ <el-row>
|
|
|
+ <el-form-item label="前端开始时间" prop="frontendStartTime">
|
|
|
+ <el-date-picker v-model="formData.frontendStartTime" type="date" placeholder="前端开始时间"
|
|
|
+ value-format="YYYY-MM-DD" />
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="后端开始时间" prop="backendStartTime">
|
|
|
+ <el-date-picker v-model="formData.backendStartTime" type="date" placeholder="后端开始时间"
|
|
|
+ value-format="YYYY-MM-DD" />
|
|
|
+ </el-form-item>
|
|
|
+ </el-row>
|
|
|
+ <el-row>
|
|
|
+ <el-form-item label="前端完成时间" prop="frontendCompleteTime">
|
|
|
+ <el-date-picker v-model="formData.frontendCompleteTime" type="date" placeholder="前端完成时间"
|
|
|
+ value-format="YYYY-MM-DD" />
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="后端完成时间" prop="backendCompleteTime">
|
|
|
+ <el-date-picker v-model="formData.backendCompleteTime" type="date" placeholder="后端完成时间"
|
|
|
+ value-format="YYYY-MM-DD" />
|
|
|
+ </el-form-item>
|
|
|
+ </el-row>
|
|
|
<el-form-item label="需求说明" prop="demandDescription">
|
|
|
<el-input type="textarea" v-model="formData.demandDescription" placeholder="需求说明"
|
|
|
:autosize="{ minRows: 4, maxRows: 88 }" />
|
|
|
@@ -405,10 +493,52 @@ import { InfoFilled } from '@element-plus/icons-vue'
|
|
|
import MineDemandAPI, { MineDemandPageVO, MineDemandForm, MineDemandPageQuery, DemandFileForm } from "@/api/mine-demand";
|
|
|
import { Action, ElLoading } from "element-plus";
|
|
|
import FolderAPI, { SysFolder } from "@/api/folder";
|
|
|
-import { Tree } from "element-plus/es/components/tree-v2/src/types";
|
|
|
-import Node from "element-plus/es/components/cascader-panel/src/node";
|
|
|
-import { sample } from "lodash";
|
|
|
+
|
|
|
import { ArrowRight } from '@element-plus/icons-vue'
|
|
|
+import UserAPI, { type UserInfo } from "@/api/user";
|
|
|
+
|
|
|
+// ----------------------------------------------------------------------
|
|
|
+const userInfo = ref<UserInfo>({
|
|
|
+ roles: [],
|
|
|
+ perms: [],
|
|
|
+});
|
|
|
+
|
|
|
+const complexEdit = ref(false)
|
|
|
+const frontendStuffEdit = ref(false)
|
|
|
+const backendStuffEdit = ref(false)
|
|
|
+const isTeamLeader = ref(false)
|
|
|
+/** 加载用户信息 */
|
|
|
+const loadUserInfo = async () => {
|
|
|
+ const data = await UserAPI.getInfo();
|
|
|
+ userInfo.value = data;
|
|
|
+ console.log(userInfo);
|
|
|
+ let roles = userInfo.value.roles
|
|
|
+ if (roles && roles.includes('TEAM_LEADER')) {
|
|
|
+ isTeamLeader.value = true
|
|
|
+ complexEdit.value = true
|
|
|
+ }
|
|
|
+};
|
|
|
+const devStuffEditStatus = () => {
|
|
|
+ if (formData.frontendStaff) {
|
|
|
+ if (isTeamLeader.value) {
|
|
|
+ frontendStuffEdit.value = true
|
|
|
+ } else {
|
|
|
+ frontendStuffEdit.value = false
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ frontendStuffEdit.value = true
|
|
|
+ }
|
|
|
+ if (formData.backendStaff) {
|
|
|
+ if (isTeamLeader.value) {
|
|
|
+ backendStuffEdit.value = true
|
|
|
+ } else {
|
|
|
+ backendStuffEdit.value = false
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ backendStuffEdit.value = true
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
// ----------------------------------------------------------------------
|
|
|
const folderType = ref<string>("demand");
|
|
|
const curFolderNodeId = ref<number>(1)
|
|
|
@@ -421,6 +551,8 @@ const folderDialog = reactive({
|
|
|
visible: false,
|
|
|
msg: ""
|
|
|
});
|
|
|
+
|
|
|
+
|
|
|
function getFolderNode() {
|
|
|
dirTreeLoading.value = true
|
|
|
FolderAPI.getFolderTree(folderType.value).then(data => {
|
|
|
@@ -511,11 +643,13 @@ const loading = ref(false);
|
|
|
const removeIds = ref<number[]>([]);
|
|
|
const total = ref(0);
|
|
|
const uploadLoading = ref(false);
|
|
|
+const detailLoading = ref(false)
|
|
|
const queryParams = reactive<MineDemandPageQuery>({
|
|
|
pageNum: 1,
|
|
|
pageSize: 10,
|
|
|
folderId: 1,
|
|
|
- completeStatus: 0
|
|
|
+ completeStatus: 0,
|
|
|
+ onlyViewMe: 0,
|
|
|
});
|
|
|
const breadList = ref<any>([])
|
|
|
|
|
|
@@ -595,6 +729,7 @@ function handleResetQuery() {
|
|
|
queryParams.pageSize = pageSize
|
|
|
queryParams.completeStatus = completeStatus
|
|
|
queryParams.folderId = treeRef.value?.getCurrentKey()
|
|
|
+ queryParams.onlyViewMe = 0
|
|
|
handleQuery();
|
|
|
}
|
|
|
function handleFileDialog(id: number) {
|
|
|
@@ -688,21 +823,30 @@ function handleSelectionChange(selection: any) {
|
|
|
/** 打开煤矿需求管理弹窗 */
|
|
|
function handleOpenDialog(id?: number) {
|
|
|
dialog.visible = true;
|
|
|
+ detailLoading.value = true
|
|
|
+
|
|
|
if (id) {
|
|
|
dialog.title = "修改煤矿需求管理";
|
|
|
MineDemandAPI.getFormData(id).then((data) => {
|
|
|
Object.assign(formData, data);
|
|
|
+ devStuffEditStatus()
|
|
|
+ detailLoading.value = false
|
|
|
});
|
|
|
} else {
|
|
|
dialog.title = "新增煤矿需求管理";
|
|
|
+ detailLoading.value = false
|
|
|
+ devStuffEditStatus()
|
|
|
}
|
|
|
}
|
|
|
|
|
|
function handleProgressDialog(id?: number) {
|
|
|
progressVisible.value = true;
|
|
|
+ detailLoading.value = true
|
|
|
if (id) {
|
|
|
MineDemandAPI.getFormData(id).then((data) => {
|
|
|
Object.assign(formData, data);
|
|
|
+ devStuffEditStatus()
|
|
|
+ detailLoading.value = false
|
|
|
});
|
|
|
}
|
|
|
}
|
|
|
@@ -751,7 +895,35 @@ function handleCloseDialog() {
|
|
|
dataFormRef.value.resetFields();
|
|
|
dataFormRef.value.clearValidate();
|
|
|
formData.id = undefined;
|
|
|
+ Object.keys(formData).forEach(key => {
|
|
|
+ formData[key] = undefined;
|
|
|
+ });
|
|
|
}
|
|
|
+
|
|
|
+function handleExport() {
|
|
|
+ MineDemandAPI.export(queryParams).then((response: any) => {
|
|
|
+ const fileData = response.data;
|
|
|
+ const fileName = decodeURI(
|
|
|
+ response.headers["content-disposition"].split(";")[1].split("=")[1]
|
|
|
+ );
|
|
|
+ const fileType =
|
|
|
+ "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8";
|
|
|
+
|
|
|
+ const blob = new Blob([fileData], { type: fileType });
|
|
|
+ const downloadUrl = window.URL.createObjectURL(blob);
|
|
|
+
|
|
|
+ const downloadLink = document.createElement("a");
|
|
|
+ downloadLink.href = downloadUrl;
|
|
|
+ downloadLink.download = fileName;
|
|
|
+
|
|
|
+ document.body.appendChild(downloadLink);
|
|
|
+ downloadLink.click();
|
|
|
+
|
|
|
+ document.body.removeChild(downloadLink);
|
|
|
+ window.URL.revokeObjectURL(downloadUrl);
|
|
|
+ });
|
|
|
+}
|
|
|
+
|
|
|
function getBreadcrumb(id: number) {
|
|
|
FolderAPI.getAncestor(id).then((data) => {
|
|
|
breadList.value = data
|
|
|
@@ -790,8 +962,11 @@ function handleDelete(id?: number) {
|
|
|
}
|
|
|
|
|
|
onMounted(() => {
|
|
|
+ console.log(111);
|
|
|
+
|
|
|
+ loadUserInfo()
|
|
|
handleQuery();
|
|
|
- getFolderNode()
|
|
|
+ getFolderNode();
|
|
|
});
|
|
|
</script>
|
|
|
<style scoped>
|
|
|
@@ -1027,7 +1202,7 @@ onMounted(() => {
|
|
|
.custom-tree-container {
|
|
|
width: 100%;
|
|
|
box-sizing: border-box;
|
|
|
- height: 820px;
|
|
|
+ height: 815px;
|
|
|
overflow: hidden;
|
|
|
overflow-x: auto;
|
|
|
}
|