基础管理-项目管理整体完善,优化

This commit is contained in:
BianLzhaoMin 2025-08-14 17:16:31 +08:00
parent ab9d2d856c
commit 64f549744f
10 changed files with 367 additions and 169 deletions

View File

@ -1,35 +1,27 @@
import request from '@/utils/request'
// 新增项目部
export const addDeptProjectAPI = (data) => {
// 新增和修改项目部
export const addAndEditDeptProjectAPI = (data) => {
return request({
url: '/project/***',
method: 'POST',
data,
})
}
// 修改项目部
export const editDeptProjectAPI = (data) => {
return request({
url: '/project/***',
url: '/bmw/pmOrg/addOrUpdatePmOrg',
method: 'POST',
data,
})
}
// 删除项目部
export const deleteDeptProjectAPI = (id) => {
export const deleteDeptProjectAPI = (data) => {
return request({
url: `/project/****/${id}`,
method: 'DELETE',
url: '/bmw/pmOrg/delPmOrg',
method: 'POST',
data,
})
}
// 获取项目部列表
export const getDeptProjectListAPI = (data) => {
return request({
url: '/project/***',
url: '/bmw/pmOrg/list',
method: 'GET',
params: data,
})

View File

@ -9,6 +9,7 @@ export function getCompanySelectListAPI() {
method: 'get',
})
}
// 获取总包工程列表
export function getMainProjectListAllAPI() {
return request({
@ -16,3 +17,19 @@ export function getMainProjectListAllAPI() {
method: 'get',
})
}
// 获取分公司下拉列表
export function getSubCompanySelectListAPI() {
return request({
url: '/bmw/subCompany/listAll',
method: 'get',
})
}
// 获取标段工程下拉列表
export function getLotProjectSelectListAPI() {
return request({
url: '/bmw/pmProject/listAll',
method: 'get',
})
}

View File

@ -4,16 +4,24 @@ const common = {
companySelectList: [],
// 总包工程列表
mainProjectList: [],
// 分公司下拉列表
subCompanySelectList: [],
// 标段工程下拉列表
lotProjectSelectList: [],
},
mutations: {
SET_COMPANY_SELECT_LIST(state, companySelectList) {
state.companySelectList = companySelectList
},
SET_MAIN_PROJECT_LIST(state, mainProjectList) {
console.log(mainProjectList, 'mainProjectList--store')
state.mainProjectList = mainProjectList
},
SET_SUB_COMPANY_SELECT_LIST(state, subCompanySelectList) {
state.subCompanySelectList = subCompanySelectList
},
SET_LOT_PROJECT_SELECT_LIST(state, lotProjectSelectList) {
state.lotProjectSelectList = lotProjectSelectList
},
},
}

View File

@ -1,5 +1,10 @@
import store from '@/store'
import { getCompanySelectListAPI, getMainProjectListAllAPI } from '@/api/common'
import {
getCompanySelectListAPI,
getMainProjectListAllAPI,
getSubCompanySelectListAPI,
getLotProjectSelectListAPI,
} from '@/api/common'
// 获取公司下拉列表
export async function getCompanySelectListCommonFun() {
@ -30,3 +35,31 @@ export async function getMainProjectListCommonFun() {
}
return []
}
// 获取分公司下拉列表
export async function getSubCompanySelectListCommonFun() {
const { subCompanySelectList } = store.state.common
if (subCompanySelectList.length > 0) {
return subCompanySelectList
}
const res = await getSubCompanySelectListAPI()
if (res.code === 200) {
store.commit('SET_SUB_COMPANY_SELECT_LIST', res.rows)
return res.rows
}
return []
}
// 获取标段工程下拉列表
export async function getLotProjectSelectListCommonFun() {
const { lotProjectSelectList } = store.state.common
if (lotProjectSelectList.length > 0) {
return lotProjectSelectList
}
const res = await getLotProjectSelectListAPI()
if (res.code === 200) {
store.commit('SET_LOT_PROJECT_SELECT_LIST', res.rows)
return res.rows
}
return []
}

View File

@ -146,11 +146,13 @@
label="子项目名称"
prop="proName"
/>
<el-table-column
label="工程类型"
align="center"
prop="proType"
/>
<el-table-column label="工程类型" align="center">
<template slot-scope="{ row }">
<el-tag size="mini" type="primary">
{{ initProType(row.proType) }}
</el-tag>
</template>
</el-table-column>
<el-table-column
align="center"
label="所属分公司"
@ -173,7 +175,7 @@
>
<template slot-scope="{ row }">
<el-tag size="mini" type="primary">
{{ row.proStatus }}
{{ initProStatus(row.proStatus) }}
</el-tag>
</template>
</el-table-column>
@ -195,7 +197,7 @@ import {
} from '@/api/basic-manage/project-manage/all-project'
export default {
name: 'AllProject',
dicts: ['voltage_level'],
dicts: ['voltage_level', 'project_type', 'project_status'],
components: {
TableModel,
DialogModel,
@ -356,6 +358,26 @@ export default {
}
this.dialogConfig.outerVisible = false
},
initProType(data) {
if (typeof data === 'string') {
return this.dict.type.project_type.find(
(item) => item.value == data,
).label
}
return data || ''
},
initProStatus(data) {
if (typeof data === 'string') {
return this.dict.type.project_status.find(
(item) => item.value == data,
).label
}
return data || ''
},
},
}
</script>

View File

@ -8,42 +8,20 @@ export const formLabel = [
]
export const columnsList = [
{ t_props: 'projectName', t_label: '分公司' },
{ t_props: 'level', t_label: '项目部名称' },
{ t_props: 'subComName', t_label: '分公司' },
{ t_props: 'orgName', t_label: '项目部名称' },
{
t_props: 'count',
t_label: '项目部工程数量',
t_slot: 'count',
},
{ t_props: 'status', t_label: '状态' },
]
export const testTableList = [
{
projectName: '总工程名称',
level: '电压等级',
status: '在建',
count: '6',
},
{
projectName: '总工程名称2',
level: '电压等级',
status: '停工',
count: '5',
},
{
projectName: '总工程名称3',
level: '电压等级',
status: '筹建',
count: '10',
},
{ t_slot: 'isEnable', t_label: '状态' },
]
export const dialogConfig = {
outerVisible: false,
outerTitle: '',
outerWidth: '50%',
outerWidth: '40%',
minHeight: '',
maxHeight: '',
}

View File

@ -5,9 +5,8 @@
:formLabel="formLabel"
:showOperation="true"
:showRightTools="true"
ref="allProjectTableRef"
ref="deptProjectTableRef"
:columnsList="columnsList"
:testTableList="testTableList"
:request-api="getDeptProjectListAPI"
>
<template slot="btn" slot-scope="{ queryParams }">
@ -16,7 +15,7 @@
size="mini"
type="success"
icon="el-icon-download"
@click="onHandleExportAllProject(queryParams)"
@click="onHandleExportDeptProject(queryParams)"
>
导出
</el-button>
@ -26,7 +25,8 @@
size="mini"
type="primary"
icon="el-icon-plus"
@click="onHandleAddOrEditAllProject(1, null)"
v-hasPermi="['dept:project:add']"
@click="onHandleAddOrEditDeptProject(1, null)"
>
新增
</el-button>
@ -35,17 +35,27 @@
<!-- 标段工程数量 -->
<template slot="count" slot-scope="{ data }">
<span class="cursor-blue" @click="onHandleViewLotProject(data)">
{{ data.count }}
{{ data.pmProjectVoList.length }}
</span>
</template>
<template slot="isEnable" slot-scope="{ data }">
<el-tag
size="mini"
:type="data.isEnable === 1 ? 'success' : 'danger'"
>
{{ data.isEnable === 1 ? '启用' : '解散' }}
</el-tag>
</template>
<template slot="handle" slot-scope="{ data }">
<el-button
plain
size="mini"
type="primary"
icon="el-icon-edit"
@click="onHandleAddOrEditAllProject(2, data)"
v-hasPermi="['dept:project:edit']"
@click="onHandleAddOrEditDeptProject(2, data)"
>
修改
</el-button>
@ -53,7 +63,8 @@
size="mini"
type="danger"
icon="el-icon-delete"
@click="onHandleDeleteAllProject(data)"
v-hasPermi="['dept:project:delete']"
@click="onHandleDeleteDeptProject(data)"
>
删除
</el-button>
@ -75,38 +86,42 @@
:model="addOrEditForm"
:rules="addOrEditFormRules"
>
<el-form-item label="所属分公司" prop="branchCompany">
<el-form-item label="所属分公司" prop="subComId">
<el-select
clearable
filterable
style="width: 100%"
placeholder="请选择所属分公司"
v-model="addOrEditForm.branchCompany"
v-model="addOrEditForm.subComId"
>
<el-option
:key="item.value"
:label="item.label"
:value="item.value"
:key="item.id"
:value="item.id"
:label="item.subCompanyName"
v-for="item in branchCompanyOptions"
/>
</el-select>
</el-form-item>
<el-form-item label="项目部名称" prop="projectName">
<el-form-item label="项目部名称" prop="orgName">
<el-input
clearable
placeholder="请输入项目部名称"
v-model="addOrEditForm.projectName"
v-model="addOrEditForm.orgName"
/>
</el-form-item>
<el-form-item label="项目部状态" prop="projectStatus">
<el-form-item label="项目部状态" prop="isEnable">
<el-radio-group
size="medium"
v-model="addOrEditForm.projectStatus"
v-model="addOrEditForm.isEnable"
>
<el-radio-button label="启用" />
<el-radio-button label="解散" />
<el-radio-button :label="1">
启用
</el-radio-button>
<el-radio-button :label="0">
解散
</el-radio-button>
</el-radio-group>
</el-form-item>
</el-form>
@ -140,33 +155,41 @@
<el-table-column
align="center"
label="子项目名称"
prop="lotProjectName"
/>
<el-table-column
label="专业"
align="center"
prop="professional"
prop="proName"
/>
<el-table-column label="工程类型" align="center">
<template slot-scope="{ row }">
<el-tag size="mini" type="primary">
{{ initProType(row.proType) }}
</el-tag>
</template>
</el-table-column>
<el-table-column
align="center"
label="所属分公司"
prop="branchCompany"
prop="subComName"
/>
<el-table-column
align="center"
label="电压等级"
prop="voltageLevel"
prop="volLevel"
/>
<el-table-column
label="工程地址"
align="center"
prop="engineeringAddress"
prop="proAddress"
/>
<el-table-column
align="center"
label="工程状态"
prop="engineeringStatus"
/>
prop="proStatus"
>
<template slot-scope="{ row }">
<el-tag size="mini" type="primary">
{{ initProStatus(row.proStatus) }}
</el-tag>
</template>
</el-table-column>
</el-table>
</template>
</template>
@ -177,15 +200,16 @@
<script>
import TableModel from '@/components/TableModel'
import DialogModel from '@/components/DialogModel'
import { formLabel, columnsList, dialogConfig, testTableList } from './config'
import { formLabel, columnsList, dialogConfig } from './config'
import {
addDeptProjectAPI,
editDeptProjectAPI,
addAndEditDeptProjectAPI,
deleteDeptProjectAPI,
getDeptProjectListAPI,
} from '@/api/basic-manage/project-manage/dept-project'
import { getSubCompanySelectListCommonFun } from '@/utils/getCommonData'
export default {
name: 'DeptProject',
dicts: ['project_type', 'project_status'],
components: {
TableModel,
DialogModel,
@ -196,33 +220,33 @@ export default {
formLabel,
columnsList,
dialogConfig,
testTableList,
getDeptProjectListAPI,
//
addOrEditForm: {
projectName: '', //
branchCompany: '', //
projectStatus: '启用', //
subComId: '', //
orgName: '', //
isEnable: 1, //
},
//
addOrEditFormRules: {
projectName: [
{
required: true,
trigger: 'blur',
message: '请输入项目部名称',
},
],
branchCompany: [
subComId: [
{
required: true,
trigger: 'change',
message: '请选择所属分公司',
},
],
projectStatus: [
orgName: [
{
required: true,
trigger: 'blur',
message: '请输入项目部名称',
},
],
isEnable: [
{
required: true,
trigger: 'change',
@ -232,65 +256,42 @@ export default {
},
//
branchCompanyOptions: [
{
label: '上海分公司',
value: '上海分公司',
},
{
label: '北京分公司',
value: '北京分公司',
},
{
label: '天津分公司',
value: '天津分公司',
},
{
label: '河北分公司',
value: '河北分公司',
},
],
branchCompanyOptions: [],
// ()
lotProjectList: [
{
lotProjectName: '子项目名称1',
professional: '专业',
branchCompany: '所属分公司1',
voltageLevel: '电压等级',
engineeringAddress: '工程地址',
engineeringStatus: '工程状态',
},
{
lotProjectName: '子项目名称2',
professional: '专业',
branchCompany: '所属分公司1',
voltageLevel: '电压等级',
engineeringAddress: '工程地址',
engineeringStatus: '工程状态',
},
{
lotProjectName: '子项目名称3',
professional: '专业',
branchCompany: '所属分公司',
voltageLevel: '电压等级',
engineeringAddress: '工程地址',
engineeringStatus: '工程状态',
},
],
lotProjectList: [],
}
},
async created() {
this.branchCompanyOptions = await getSubCompanySelectListCommonFun()
},
methods: {
//
onHandleExportAllProject(queryParams) {
console.log(queryParams, '导出')
onHandleExportDeptProject(queryParams) {
this.download(
'/bmw/pmOrg/export',
{
...queryParams,
},
`项目部列表.xlsx`,
)
},
//
onHandleAddOrEditAllProject(type, data) {
onHandleAddOrEditDeptProject(type, data) {
this.dialogConfig.outerTitle =
type === 1 ? '新增项目部' : '修改项目部'
if (type === 2) {
const { subComId, orgName, isEnable, id } = data
this.addOrEditForm = {
subComId,
orgName,
isEnable,
id,
}
}
this.dialogConfig.outerWidth = ''
this.dialogConfig.minHeight = ''
this.dialogConfig.maxHeight = ''
@ -298,18 +299,18 @@ export default {
},
//
onHandleDeleteAllProject(data) {
onHandleDeleteDeptProject(data) {
this.$confirm('确定删除该项目部吗?', '温馨提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
})
.then(async () => {
const res = await deleteDeptProjectAPI(data.id)
const res = await deleteDeptProjectAPI({ id: data.id })
console.log(res, '删除结果')
if (res.code === 200) {
this.$msgSuccess('删除成功')
this.$refs.allProjectTableRef.getTableList() //
this.$modal.msgSuccess('删除成功')
this.$refs.deptProjectTableRef.getTableList() //
}
})
.catch(() => {
@ -321,17 +322,24 @@ export default {
onHandleConfirmAddOrEdit() {
this.$refs.addOrEditFormRef.validate(async (valid) => {
if (valid) {
const API =
this.dialogConfig.outerTitle === '新增项目部'
? addDeptProjectAPI
: editDeptProjectAPI
const params = {
...this.addOrEditForm,
}
const res = await API(this.addOrEditForm)
if (this.dialogConfig.outerTitle === '新增项目部') {
delete params.id
}
const res = await addAndEditDeptProjectAPI(params)
console.log(res, '新增或修改结果')
if (res.code === 200) {
this.$msgSuccess('操作成功')
this.$modal.msgSuccess(
this.dialogConfig.outerTitle === '新增项目部'
? '新增成功'
: '修改成功',
)
this.handleCloseDialogOuter()
this.$refs.allProjectTableRef.getTableList() //
this.$refs.deptProjectTableRef.getTableList() //
}
}
})
@ -339,8 +347,14 @@ export default {
//
onHandleViewLotProject(data) {
console.log(data, '查看标段工程数量')
// console.log(data, '')
if (data.pmProjectVoList.length === 0) {
this.$modal.msgError('暂无标段工程')
return
}
this.dialogConfig.outerTitle = '子项目(标段工程)概况'
this.lotProjectList = data.pmProjectVoList
this.dialogConfig.outerWidth = '80%'
this.dialogConfig.minHeight = '90vh'
this.dialogConfig.maxHeight = '90vh'
@ -354,6 +368,26 @@ export default {
}
this.dialogConfig.outerVisible = false
},
initProType(data) {
if (typeof data === 'string') {
return this.dict.type.project_type.find(
(item) => item.value == data,
).label
}
return data || ''
},
initProStatus(data) {
if (typeof data === 'string') {
return this.dict.type.project_status.find(
(item) => item.value == data,
).label
}
return data || ''
},
},
}
</script>

View File

@ -28,7 +28,7 @@
</el-col>
<el-col :span="12">
<el-form-item label="所属项目部" prop="orgId">
<el-select
<!-- <el-select
clearable
filterable
style="width: 100%"
@ -41,7 +41,21 @@
:value="item.value"
v-for="item in xmbOptions"
/>
</el-select>
</el-select> -->
<treeselect
:flat="true"
:searchable="false"
:show-count="true"
noOptionsText="没有数据"
placeholder="请选择项目部"
noChildrenText="没有数据了"
noResultsText="没有搜索结果"
:disable-branch-nodes="true"
:options="subCompanyOptions"
v-model="addOrEditForm.orgId"
@select="onHandleSelectOrgId"
/>
</el-form-item>
</el-col>
</el-row>
@ -193,10 +207,16 @@
<script>
import { addAndEditLotLotProjectAPI } from '@/api/basic-manage/project-manage/lot-project'
import { getMainProjectListCommonFun } from '@/utils/getCommonData'
import Treeselect from '@riophae/vue-treeselect'
import '@riophae/vue-treeselect/dist/vue-treeselect.css'
import {
getMainProjectListCommonFun,
getSubCompanySelectListCommonFun,
} from '@/utils/getCommonData'
export default {
name: 'AddOrEditForm',
dicts: ['project_status', 'project_type', 'voltage_level'],
components: { Treeselect },
props: {
editFormData: {
type: Object,
@ -227,7 +247,8 @@ export default {
return {
addOrEditForm: {
mainProId: '', // id
orgId: '', // id
subComId: '', // id
orgId: undefined, // id
proName: '', //
simpleName: '', //
proType: '', //
@ -358,13 +379,40 @@ export default {
label: '项目部2',
},
],
subCompanyOptions: [],
}
},
async created() {
//
const mainProjectList = await getMainProjectListCommonFun()
this.allProjectOptions = mainProjectList
this.allProjectOptions = await getMainProjectListCommonFun()
//
const res = await getSubCompanySelectListCommonFun()
this.subCompanyOptions = res.map((item) => {
if (item.pmOrgList && item.pmOrgList.length > 0) {
return {
id: item.id,
label: item.subCompanyName,
children: item.pmOrgList.map((j) => {
return {
id: j.id,
label: j.orgName,
parentId: item.id,
}
}),
}
} else {
return {
id: item.id,
label: item.subCompanyName,
children: [],
}
}
})
},
methods: {
@ -402,6 +450,11 @@ export default {
resetForm() {
this.$refs.addOrEditFormRef.resetFields()
},
onHandleSelectOrgId(node) {
this.addOrEditForm.subComId = node.parentId
this.addOrEditForm.orgId = node.id
},
},
watch: {
@ -410,6 +463,7 @@ export default {
if (Object.keys(newVal).length > 0) {
const {
mainProId,
subComId,
orgId,
proName,
simpleName,
@ -428,6 +482,7 @@ export default {
this.addOrEditForm = {
mainProId,
orgId,
subComId,
proName,
simpleName,
proType,

View File

@ -1,33 +1,48 @@
export const formLabel = [
{
f_label: '分公司',
f_model: 'company',
f_model: 'subComId',
f_type: 'sel',
isShow: false, // 是否展示label
f_selList: [],
},
{
f_label: '总包工程',
f_model: 'allProject',
f_model: 'mainProId',
f_type: 'sel',
isShow: false, // 是否展示label
f_selList: [],
},
{
f_label: '标段工程',
f_model: 'lotProject',
f_model: 'proName',
f_type: 'sel',
isShow: false, // 是否展示label
f_selList: [],
},
{
f_label: '工程状态',
f_model: 'status',
f_model: 'proStatus',
f_type: 'sel',
isShow: false, // 是否展示label
f_selList: [],
},
{
f_label: '是否上海外项目',
f_model: 'isForeignProject',
f_model: 'isShanghai',
f_type: 'sel',
isShow: false, // 是否展示label
f_selList: [
{
label: '是',
value: 1,
},
{
label: '否',
value: 0,
},
], // 状态列表
},
]

View File

@ -116,6 +116,12 @@ import {
getLotLotProjectListAPI,
completeLotLotProjectAPI,
} from '@/api/basic-manage/project-manage/lot-project'
import {
getSubCompanySelectListCommonFun,
getMainProjectListCommonFun,
getLotProjectSelectListCommonFun,
} from '@/utils/getCommonData'
export default {
name: 'LotProject',
dicts: ['project_type', 'project_status'],
@ -132,7 +138,6 @@ export default {
columnsList,
dialogConfig,
editFormData: {},
getLotLotProjectListAPI,
}
},
@ -297,5 +302,44 @@ export default {
this.dialogConfig.outerVisible = false
},
},
async created() {
const subCompany = await getSubCompanySelectListCommonFun()
const mainProject = await getMainProjectListCommonFun()
const lotProject = await getLotProjectSelectListCommonFun()
console.log('lotProject', lotProject)
formLabel.forEach((item) => {
if (item.f_model === 'subComId') {
item.f_selList = subCompany.map((item) => {
return {
label: item.subCompanyName,
value: item.id,
}
})
}
if (item.f_model === 'mainProId') {
item.f_selList = mainProject.map((item) => {
return {
label: item.mainProName,
value: item.id,
}
})
}
if (item.f_model === 'proStatus') {
item.f_selList = this.dict.type.project_status
}
if (item.f_model === 'proName') {
item.f_selList = lotProject.map((item) => {
return {
label: item.proName,
value: item.proName,
}
})
}
})
},
}
</script>