lj-zhgd-htweb/src/views/base/project/index.vue

514 lines
18 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<div class="app-container">
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
<el-form-item prop="projectDepartName">
<el-input
v-model="queryParams.projectDepartName"
placeholder="项目部名称"
clearable
@keyup.enter.native="handleQuery"
maxlength="20"
/>
</el-form-item>
<el-form-item prop="projectHeadName">
<el-input
v-model="queryParams.projectHeadName"
placeholder="负责人"
clearable
@keyup.enter.native="handleQuery"
maxlength="20"
/>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
</el-form-item>
</el-form>
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button
type="primary"
plain
icon="el-icon-plus"
size="mini"
@click="handleAdd"
v-hasPermi="['bracelet:project:add']"
>新增项目部</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="warning"
plain
icon="el-icon-download"
size="mini"
@click="handleExport"
v-hasPermi="['bracelet:project:export']"
>导出</el-button>
</el-col>
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
<el-table v-loading="loading" :data="projectList" ref="multipleTable" row-key="projectId" @selection-change="handleSelectionChange" @select="handlerSelect" @select-all="handlerSelectAll">
<!-- <el-table-column type="selection" width="55" align="center" /> -->
<el-table-column label="序号" align="center" width="80" type="index" sortable>
<template slot-scope="scope">
<span>{{ (queryParams.pageNum - 1) * queryParams.pageSize + scope.$index + 1 }}</span>
</template>
</el-table-column>
<el-table-column label="项目部名称" align="center" prop="projectDepartName" sortable/>
<el-table-column label="负责人" align="center" prop="projectHeadName" sortable/>
<el-table-column label="电话" align="center" prop="contactInformation" sortable/>
<el-table-column label="APP轮播图" align="center" prop="appnum">
<template slot-scope="scope">
<div @click="picturesPreview(scope.row)" style="color: #02a7f0; cursor: pointer">
{{ scope.row.appnum }}
</div>
</template>
</el-table-column>
<!-- -->
<el-table-column label="备注" align="center" prop="remarks" :show-overflow-tooltip='true' sortable/>
<el-table-column label="项目部Id" width="0" prop="projectId" v-if="showName" />
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<template slot-scope="scope">
<el-button
size="mini"
type="text"
icon="el-icon-edit"
@click="handleUpdate(scope.row)"
v-hasPermi="['bracelet:project:edit']"
>修改</el-button>
<el-button
size="mini"
type="text"
icon="el-icon-delete"
@click="handleDelete(scope.row)"
v-hasPermi="['bracelet:project:remove']"
>删除</el-button>
</template>
</el-table-column>
</el-table>
<pagination
v-show="total>0"
:total="total"
:page.sync="queryParams.pageNum"
:limit.sync="queryParams.pageSize"
@pagination="getList"
/>
<!-- 添加或修改岗位对话框 -->
<el-dialog :title="title" :visible.sync="open" width="800px" append-to-body>
<el-form ref="form" :model="form" :rules="rules" label-width="80px">
<el-form-item label="项目名称" prop="projectDepartName">
<el-input v-model="form.projectDepartName" maxlength="20" placeholder="请输入项目名称" />
</el-form-item>
<el-form-item label="负责人" prop="projectHeadName">
<el-input v-model="form.projectHeadName" maxlength="20" placeholder="请输入负责人名称" />
</el-form-item>
<el-form-item label="电话" prop="contactInformation">
<el-input v-model="form.contactInformation" maxlength="11" placeholder="请输入负责人电话号码"/>
</el-form-item>
<el-form-item label="备注" prop="remarks">
<el-input v-model="form.remarks" maxlength="50" placeholder="请输入备注内容" />
</el-form-item>
<el-form-item label="APP展示图片 " label-width="120px">
<el-upload
action="#"
:limit="5"
:file-list="fileList"
:show-file-list="true"
:auto-upload="false"
list-type="picture-card"
accept=".png, .jpg, .jpeg"
:on-change="handleChange"
:class="{ disabled: uploadDisabled }"
:on-preview="picturePreview"
:on-remove="handleRemove"
>
<i class="el-icon-plus avatar-uploader-icon"></i>
</el-upload>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="submitForm">确 定</el-button>
<el-button @click="cancel">取 消</el-button>
</div>
</el-dialog>
<!-- 图片查看弹窗 -->
<el-dialog :visible.sync="dialogVisible">
<img width="100%" height="650px" :src="dialogImageUrl" alt />
</el-dialog>
<!--多图片查看弹窗 -->
<el-dialog :visible.sync="dialogVisibles">
<div style="width: 100%;height: 600px;display: flex;justify-content: space-between;align-items: center;">
<div style="width: 5%;height: 100%;display: flex;align-items: center;justify-content: center;" >
<i class="el-icon-caret-left" style="font-size: 32px;" @click="imgIndex=imgIndex-1" v-show="imgIndex>0"></i>
</div>
<div style="width: 90%;height: 100%;overflow: hidden;">
<img v-for="(item,index) of dialogImageUrls" :key="index" v-show="imgIndex==index" width="100%" height="500px" :src="item.url" alt />
</div>
<div style="width: 5%;height: 100%;display: flex;align-items: center;" >
<i class="el-icon-caret-right" style="font-size: 32px;" @click="imgIndex=imgIndex+1" v-show="(imgIndex+1)<(dialogImageUrls.length)"></i>
</div>
</div>
</el-dialog>
</div>
</template>
<script>
import { listProject, getProject, delProject, addProject, updateProject,exportProject,exportProjectSome } from "@/api/base/project";
import { downloadFile } from '@/utils/download'
export default {
name: "Project",
dicts: ['sys_normal_disable'],
data() {
return {
// 遮罩层
loading: true,
// 选中数组
ids: [],
// 非单个禁用
single: true,
// 非多个禁用
multiple: true,
// 是否显示项目部Id
showName: false,
maxLength:100,//已选列表上限,防止数据过多请求报错
currentSelection:[],//工程已选列表
// 显示搜索条件
showSearch: true,
// 总条数
total: 0,
// 项目表格数据
projectList: [],
// 弹出层标题
title: "",
// 是否显示弹出层
open: false,
// 查询参数
queryParams: {
pageNum: 1,
pageSize: 10,
projectDepartName: undefined,
projectHeadName: undefined,
},
// 表单参数
form: {},
//删除图片fileId
delFileIdList:[],
//图片上传
fileList: [],
//图片查看弹窗
dialogImageUrl: '',
dialogVisible: false,
//多图片查看弹窗
dialogImageUrls: [],
dialogVisibles: false,
imgIndex:0,
// 表单校验
rules: {
projectDepartName: [
{ required: true, message: "项目名称不能为空", trigger: "blur" }
],
// projectHeadName: [
// { required: true, message: "负责人名称不能为空", trigger: "blur" }
// ],
// appnum: [
// { required: true, message: "APP轮播图数量不能为空", trigger: "blur" }
// ],
contactInformation: [
// { required: true, message: "手机号码不能为空", trigger: "blur" },
{
pattern: /^1[3|4|5|6|7|8|9][0-9]\d{8}$/,
message: "请输入正确的手机号码",
trigger: "blur"
}
]
}
};
},
created() {
this.getList();
},
computed: {
//图片上传1张后隐藏上传框
uploadDisabled() {
return this.fileList.length > 4
},
},
methods: {
//单选操作-跨页
handlerSelect(val, row) {
this.currentSelection.indexOf(row.projectId) === -1
? this.currentSelection.push(row.projectId)
: this.currentSelection.splice(this.currentSelection.indexOf(row.projectId), 1)
},
//全选操作-跨页
handlerSelectAll(val) {
if (val.length) {
// 进来此处说明:
// 1 当前页的全选 2 其他页有数据然后当前页的取消全选
// 比较全选或者取消全选与当前页的数据,得到差集
// 如果projectList中的数据在val中不存在则说明是取消全选需要从currentSelection中移除
// 如果projectList中所有的数据都在val中存在则说明是全选需要将差集添加到currentSelection中
const isAllSelect = this.projectList.every(item =>
val.some(valItem => valItem.projectId === item.projectId)
)
if (isAllSelect) {
// 全选中新增的差集
const diff = val.filter(
item => !this.currentSelection.some(projectId => projectId === item.projectId)
)
if (this.currentSelection.length + diff.length > this.maxLength) {
this.currentSelection = this.currentSelection.concat(
diff.splice(0, this.maxLength - this.currentSelection.length)
.map(item => item.projectId))
diff.forEach(item => this.$refs.multipleTable.toggleRowSelection(item, false))
} else {
this.currentSelection = this.currentSelection.concat(diff.map(item => item.projectId))
}
} else {
this.currentSelection = this.currentSelection.filter(
projectId => !this.projectList.some(item => item.projectId === projectId)
)
}
} else {
// 进来此处说明:
// 其他页并无勾选数据,且当前页取消勾选
this.currentSelection = []
}
},
/** 查询岗位列表 */
getList() {
this.loading = true;
listProject(this.queryParams).then(response => {
this.projectList = response.rows;
this.total = response.total;
this.loading = false;
if (this.currentSelection.length) {
this.$nextTick(() => {
this.currentSelection.forEach(row => {
this.projectList.forEach(item => {
if (item.projectId === row) {
this.$refs.multipleTable?.toggleRowSelection(item, true)
}
})
})
})
} else {
this.$refs.multipleTable?.clearSelection()
}
});
},
// 取消按钮
cancel() {
this.open = false;
this.fileList=[];
this.reset();
},
// 表单重置
reset() {
this.form = {
appnum: undefined,
projectDepartName: undefined,
projectHeadName: undefined,
contactInformation: undefined,
projectHeadName: undefined,
remarks: undefined
};
this.resetForm("form");
},
/** 搜索按钮操作 */
handleQuery() {
this.queryParams.pageNum = 1;
this.getList();
},
/** 重置按钮操作 */
resetQuery() {
this.resetForm("queryForm");
this.currentSelection = []//重置清除已选列表
this.handleQuery();
},
// 多选框选中数据
handleSelectionChange(selection) {
this.ids = selection.map(item => item.projectId)
this.single = selection.length!=1
this.multiple = !selection.length
},
/** 新增按钮操作 */
handleAdd() {
this.fileList = []
this.reset();
this.open = true;
this.title = "添加项目";
},
/** 修改按钮操作 */
handleUpdate(row) {
this.fileList = []
this.reset();
const projectId = row.projectId
getProject(projectId).then(response => {
this.form = response.data;
this.form.fileList.forEach(item => {
this.fileList.push({
fileId: item.filePath,
url: item.bast64Image
})
});
// response.data.fileList = [];
this.open = true;
this.title = "修改项目";
});
},
// 图片上传
handleChange(file, fileList) {
console.log(file)
// this.$refs["form"].clearValidate()
this.fileList = fileList;
},
handleRemove(file, fileList) {
let sum = 0
this.fileList.forEach((item, index) => {
if (item.uid == file.uid) {
sum = index
}
})
this.delFileIdList.push(this.fileList[sum].fileId)
console.log(this.delFileIdList)
this.fileList.splice(sum, 1)
},
//上传组件-图片查看
picturePreview(file) {
console.log(file)
this.dialogImageUrl = file.url
this.dialogVisible = true
},
//多图片查看
picturesPreview(row) {
this.dialogImageUrls = [];
if(row.appnum==0){
this.$alert('该项目部暂无APP轮播图', '提示', {
type: 'warning',
confirmButtonText: '确定',
});
return;
}
getProject(row.projectId).then(response => {
response.data.fileList.forEach(item => {
this.dialogImageUrls.push({
fileId: item.filePath,
url: item.bast64Image
})
});
this.imgIndex=0
this.dialogVisibles = true;
});
},
//提交时循环fileList 获取raw文件
getFileData() {
const file = []
this.fileList.forEach(item => {
if (item?.hasOwnProperty('raw')) {
file.push(item.raw)
}
})
return { file }
},
/** 提交按钮 */
submitForm() {
this.$refs["form"].validate(valid => {
if (valid) {
if (this.form.projectId != undefined) {
const reqData = new FormData();
this.form.delFileIdList = this.delFileIdList;
reqData.append('params', JSON.stringify(this.form))
const { file } = this.getFileData()
file.forEach(item => {
reqData.append('file', item)
})
updateProject(reqData).then(response => {
this.$modal.msgSuccess("修改成功");
this.open = false;
this.fileList=[];
this.getList();
});
} else {
console.log(this.form)
const reqData = new FormData()
reqData.append('params', JSON.stringify(this.form))
const { file } = this.getFileData()
file.forEach(item => {
reqData.append('file', item)
})
addProject(reqData).then(response => {
this.$modal.msgSuccess("新增成功");
this.open = false;
this.getList();
});
}
}
});
},
/** 删除按钮操作 */
handleDelete(row) {
const projectId = row.projectId || this.ids;
if(row.pronum>0){
this.$alert('该项目部存在工程,无法删除', '提示', {
type: 'warning',
confirmButtonText: '确定',
});
return;
}
if(row.appnum>0){
this.$alert('该项目部存在APP轮播图无法删除', '提示', {
type: 'warning',
confirmButtonText: '确定',
});
return;
}
this.$modal.confirm('是否确认删除项目名称为"' + projectId + '"的数据项?').then(function() {
return delProject(projectId);
}).then(() => {
this.getList();
this.$modal.msgSuccess("删除成功");
}).catch(() => {});
},
/** 导出按钮操作 */
handleExport() {
if(this.ids.length == 0){
exportProject(this.queryParams).then(res => {
downloadFile({ fileName: `项目部管理表_${new Date().getTime()}.xlsx`, fileData: res, fileType: 'application/vnd.ms-excel;charset=utf-8' })
})
}else{
const ids = this.ids.join(',')
exportProjectSome({ids:ids}).then(res => {
downloadFile({ fileName: `项目部管理表_${new Date().getTime()}.xlsx`, fileData: res, fileType: 'application/vnd.ms-excel;charset=utf-8' })
})
}
}
}
};
</script>
<style lang="scss" scoped>
::v-deep.el-table .fixed-width .el-button--mini {
width: 60px !important;
margin-bottom: 10px;
}
//隐藏图片上传框的css
::v-deep.disabled {
.el-upload--picture-card {
display: none;
}
}
</style>