分包商基础信息页面基础逻辑完善

This commit is contained in:
BianLzhaoMin 2025-08-08 16:59:55 +08:00
parent e167c8df6c
commit 80f50bcf8c
5 changed files with 739 additions and 1 deletions

View File

@ -0,0 +1,36 @@
import request from '@/utils/request'
// 新增分包商基础信息
export const addSubBaseInfoAPI = (data) => {
return request({
url: '/project/***',
method: 'POST',
data,
})
}
// 修改分包商基础信息
export const editSubBaseInfoAPI = (data) => {
return request({
url: '/project/***',
method: 'POST',
data,
})
}
// 删除分包商基础信息
export const deleteSubBaseInfoAPI = (id) => {
return request({
url: `/project/****/${id}`,
method: 'DELETE',
})
}
// 获取分包商基础信息列表
export const getSubBaseInfoListAPI = (data) => {
return request({
url: '/project/***',
method: 'GET',
params: data,
})
}

View File

@ -0,0 +1,222 @@
<template>
<div>
<el-upload
:limit="limit"
:multiple="multiple"
:action="uploadFileUrl"
list-type="picture-card"
:file-list="fileListInner"
:headers="headers"
:on-error="handleError"
:on-remove="handleRemove"
:on-preview="handlePreview"
:on-success="handleSuccess"
:before-upload="handleBeforeUpload"
:show-file-list="true"
:on-exceed="handleExceed"
name="files"
:class="isDetail || isUploaded ? 'upload-img' : ''"
>
<i class="el-icon-plus" />
<div class="upload-img-box">
<slot name="upload-img-box"></slot>
</div>
</el-upload>
<el-dialog
width="30%"
append-to-body
:before-close="
() => {
dialogInnerVisible = false
}
"
:visible.sync="dialogInnerVisible"
>
<img
:src="previewUrl"
style="display: block; max-width: 100%; margin: 0 auto"
/>
</el-dialog>
</div>
</template>
<script>
import { getToken } from '@/utils/auth'
export default {
props: {
//
fileList: {
type: Array,
default: () => [],
},
//
uploadFileUrl: {
type: String,
default: '',
},
//
fileType: {
type: Array,
default: ['png', 'jpg', 'jpeg'],
},
//
fileSize: {
type: Number,
default: 10,
},
//
limit: {
type: Number,
default: 1,
},
//
multiple: {
type: Boolean,
default: false,
},
//
isDetail: {
type: Boolean,
default: false,
},
//
isUploaded: {
type: Boolean,
default: false,
},
},
data() {
return {
// addOrEditForm: {
// fileList: [],
// },
headers: {
Authorization: 'Bearer ' + getToken(),
},
dialogInnerVisible: false,
previewUrl: '',
deleteFileList: [],
}
},
methods: {
//
async handleRemove(file, fileList) {
if (file.response && file.response.data.length > 0) {
this.$emit('deleteFile', {
filePath: file.response.data[0].filePath,
isNew: true,
})
} else {
if (file.isNew) {
this.$emit('deleteFile', {
filePath: file.filePath,
isNew: true,
})
} else {
this.$emit('deleteFile', {
filePath: file.filePath,
isNew: false,
})
}
}
this.$emit('update:fileList', fileList)
},
//
handlePreview(file) {
this.dialogInnerVisible = true
this.previewUrl = file.url
},
//
handleSuccess(response, file, fileList) {
this.$emit('update:fileList', [])
if (response.code === 200) {
this.$emit('update:fileList', fileList)
this.$emit('uploadSuccess')
} else {
this.$modal.msgError('上传失败')
}
this.$modal.closeLoading()
},
//
handleError() {
this.$modal.msgError('上传失败')
this.$modal.closeLoading()
},
//
handleBeforeUpload(file) {
// filename
console.log(file, 'file')
const isFormat = this.fileType.some((e) => file.name.endsWith(e))
if (!isFormat) {
this.$modal.msgError(
`文件格式不正确, 请上传${this.fileType.join(
'、',
)}格式的文件!`,
)
return false
}
//
const isLt = file.size / 1024 / 1024 < this.fileSize
if (!isLt) {
this.$modal.msgError(`图片大小不能超过 ${this.fileSize} MB`)
return false
}
this.$modal.loading('图片正在上传,请稍候...')
// #
const newFileName = file.name.replace(/#/g, '@')
const newFile = new File([file], newFileName, { type: file.type })
// name
Object.defineProperty(file, 'name', {
value: newFileName,
})
return true
},
//
handleExceed(files, fileList) {
this.$modal.msgError(`上传的图片数量不能超过 ${this.limit}`)
},
},
computed: {
fileListInner: {
get() {
return this.fileList
},
set(newValue) {
this.$emit('update:fileList', newValue)
},
},
},
}
</script>
<style scoped lang="scss">
::v-deep .el-upload--picture-card {
position: relative;
margin-right: 10px;
.upload-img-box {
position: absolute;
bottom: -15%;
left: 0;
width: 100%;
height: 100%;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
}
}
::v-deep .upload-img .el-upload--picture-card {
display: none;
}
</style>

View File

@ -0,0 +1,231 @@
<template>
<!-- 新增或修改标段工程表单 -->
<div>
<el-form
label-width="140px"
ref="addOrEditFormRef"
:model="addOrEditForm"
:rules="addOrEditFormRules"
>
<el-row>
<el-col :span="12">
<el-form-item label="分包商名称" prop="subName">
<el-input
clearable
placeholder="请输入分包商名称"
v-model="addOrEditForm.subName"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="法定代表人" prop="legalRepresentative">
<el-input
clearable
placeholder="请输入法定代表人"
v-model="addOrEditForm.legalRepresentative"
/>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="法人联系电话" prop="phone">
<el-input
clearable
placeholder="请输入法人联系电话"
v-model="addOrEditForm.phone"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="营业住址" prop="businessAddress">
<el-input
clearable
placeholder="请输入营业住址"
v-model="addOrEditForm.businessAddress"
/>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="营业执照" prop="businessLicense">
<UploadImg
:limit="30"
:file-size="10"
:multiple="true"
:is-detail="formType === 2"
:file-type="['jpg', 'png', 'jpeg']"
:upload-file-url="uploadFileUrl"
:file-list.sync="addOrEditForm.businessLicense"
:is-uploaded="
addOrEditForm.businessLicense.length >= 2
"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="电子公章" prop="electronicStamp">
<UploadImg
:limit="30"
:file-size="10"
:multiple="true"
:is-detail="formType === 2"
:file-type="['jpg', 'png', 'jpeg']"
:upload-file-url="uploadFileUrl"
:file-list.sync="addOrEditForm.electronicStamp"
:is-uploaded="
addOrEditForm.electronicStamp.length >= 2
"
/>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="身份证正反面" prop="idCard">
<UploadImg
:limit="30"
:file-size="10"
:multiple="true"
:is-detail="formType === 2"
:file-type="['jpg', 'png', 'jpeg']"
:upload-file-url="uploadFileUrl"
:file-list.sync="addOrEditForm.idCard"
:is-uploaded="addOrEditForm.idCard.length >= 2"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item
label="电子签名/法人印章"
prop="electronicSignature"
>
<UploadImg
:limit="30"
:file-size="10"
:multiple="true"
:is-detail="formType === 2"
:file-type="['jpg', 'png', 'jpeg']"
:upload-file-url="uploadFileUrl"
:file-list.sync="addOrEditForm.electronicSignature"
:is-uploaded="
addOrEditForm.electronicSignature.length >= 2
"
/>
</el-form-item>
</el-col>
</el-row>
</el-form>
</div>
</template>
<script>
import UploadImg from '@/components/UploadImg'
import {
addSubBaseInfoAPI,
editSubBaseInfoAPI,
} from '@/api/basic-manage/sub-manage/sub-base-info'
export default {
name: 'AddOrEditForm',
components: {
UploadImg,
},
data() {
return {
formType: 1,
uploadFileUrl:
process.env.VUE_APP_BASE_API + '/system/file/uploadFiles',
addOrEditForm: {
subName: '', //
legalRepresentative: '', //
phone: '', //
businessAddress: '', //
businessLicense: [], //
electronicStamp: [], //
idCard: [], //
electronicSignature: [], // /
},
addOrEditFormRules: {
subName: [
{
required: true,
message: '请输入分包商名称',
trigger: 'blur',
},
],
legalRepresentative: [
{
required: true,
message: '请输入法定代表人',
trigger: 'blur',
},
],
businessLicense: [
{
required: true,
message: '请上传营业执照',
trigger: 'blur',
},
],
electronicStamp: [
{
required: true,
message: '请上传电子公章',
trigger: 'blur',
},
],
idCard: [
{
required: true,
message: '请上传身份证正反面',
trigger: 'blur',
},
],
electronicSignature: [
{
required: true,
message: '请上传电子签名/法人印章',
trigger: 'blur',
},
],
},
}
},
methods: {
//
onHandleConfirmAddOrEditFun() {
return new Promise((resolve, reject) => {
this.$refs.addOrEditFormRef.validate(async (valid) => {
if (valid) {
console.log(this.addOrEditForm)
const API =
this.formType === 1
? addSubBaseInfoAPI
: editSubBaseInfoAPI
const res = await API(this.addOrEditForm)
console.log(res, '新增或修改结果')
if (res.code === 200) {
resolve()
} else {
reject(new Error(res.message))
}
} else {
reject(new Error('表单验证失败'))
}
})
})
},
//
resetForm() {
this.$refs.addOrEditFormRef.resetFields()
},
},
}
</script>

View File

@ -0,0 +1,81 @@
export const formLabel = [
{
f_label: '关键词',
f_model: 'keyword',
f_type: 'input',
isShow: false, // 是否展示label
},
]
export const columnsList = [
{ t_props: 'projectName', t_label: '分包商名称' },
{ t_props: 'xmb', t_label: '法定代表人' },
{ t_props: 'name', t_label: '联系电话' },
{ t_props: 'type', t_label: '营业住址' },
{
t_props: 'businessLicense',
t_label: '营业执照',
t_slot: 'businessLicense',
},
{ t_props: 'idCard', t_label: '身份证', t_slot: 'idCard' },
{
t_props: 'electronicStamp',
t_label: '电子公章',
t_slot: 'electronicStamp',
},
{
t_props: 'electronicSignature',
t_label: '电子签名/法人印章',
t_slot: 'electronicSignature',
},
]
export const testTableList = [
{
projectName: '总工程名称',
level: '等级3',
xmb: 'xxx项目部',
name: '110kv工程',
type: '基建变电',
address: '安徽省合肥市110k工程',
status: '在建',
businessLicense: '已上传',
idCard: '已上传',
electronicStamp: '已上传',
electronicSignature: '未上传',
},
{
projectName: '总工程名称21',
level: '等级3',
xmb: 'xxx项目部',
name: '110kv工程',
type: '基建变电',
address: '安徽省合肥市110k工程',
status: '在建',
businessLicense: '已上传',
idCard: '已上传',
electronicStamp: '已上传',
electronicSignature: '未上传',
},
{
projectName: '总工程名称3',
level: '等级3',
xmb: 'xxx项目部',
name: '110kv工程',
type: '基建变电',
address: '安徽省合肥市110k工程',
status: '在建',
businessLicense: '已上传',
idCard: '已上传',
electronicStamp: '已上传',
electronicSignature: '未上传',
},
]
export const dialogConfig = {
outerVisible: false,
outerTitle: '',
outerWidth: '80%',
minHeight: '',
maxHeight: '',
}

View File

@ -1,10 +1,178 @@
<template> <template>
<!-- 基础管理 ---- 分包商管理 ---- 基础信息 --> <!-- 基础管理 ---- 分包商管理 ---- 基础信息 -->
<div class="app-container"> </div> <div class="app-container">
<TableModel
:formLabel="formLabel"
:showOperation="true"
:showRightTools="true"
ref="allProjectTableRef"
:columnsList="columnsList"
:testTableList="testTableList"
:request-api="getSubBaseInfoListAPI"
>
<template slot="btn" slot-scope="{ queryParams }">
<el-button
plain
size="mini"
type="success"
icon="el-icon-download"
@click="onHandleExportAllProject(queryParams)"
>
导出
</el-button>
<el-button
plain
size="mini"
type="primary"
icon="el-icon-plus"
@click="onHandleAddOrEditAllProject(1, null)"
>
新增
</el-button>
</template>
<!-- 标段工程数量 -->
<template :slot="item" slot-scope="{ data }" v-for="item in slots">
<span
:style="{
color: data[item] === '已上传' ? '#67C23A' : '#F56C6C',
}"
:key="item"
style="font-size: 12px"
@click="onHandleViewLotProject(data)"
>
{{ data[item] }}
</span>
</template>
<template slot="handle" slot-scope="{ data }">
<el-button
plain
size="mini"
type="primary"
icon="el-icon-edit"
@click="onHandleAddOrEditAllProject(2, data)"
>
修改
</el-button>
<el-button
size="mini"
type="danger"
icon="el-icon-delete"
@click="onHandleDeleteAllProject(data)"
>
删除
</el-button>
</template>
</TableModel>
<DialogModel
:dialogConfig="dialogConfig"
@closeDialogOuter="handleCloseDialogOuter"
>
<template slot="outerContent">
<AddOrEditForm ref="addOrEditFormContentRef" />
<el-row class="dialog-footer-btn">
<el-button size="medium" @click="handleCloseDialogOuter">
取消
</el-button>
<el-button
size="medium"
type="primary"
@click="onHandleConfirmAddOrEdit"
>
确定
</el-button>
</el-row>
</template>
</DialogModel>
</div>
</template> </template>
<script> <script>
import TableModel from '@/components/TableModel'
import DialogModel from '@/components/DialogModel'
import AddOrEditForm from './add-or-edit-form'
import { formLabel, columnsList, dialogConfig, testTableList } from './config'
import {
deleteSubBaseInfoAPI,
getSubBaseInfoListAPI,
} from '@/api/basic-manage/sub-manage/sub-base-info'
export default { export default {
name: 'SubBaseInfo', name: 'SubBaseInfo',
components: {
TableModel,
DialogModel,
AddOrEditForm,
},
data() {
return {
formLabel,
columnsList,
dialogConfig,
testTableList,
getSubBaseInfoListAPI,
slots: {
businessLicense: 'businessLicense',
idCard: 'idCard',
electronicStamp: 'electronicStamp',
electronicSignature: 'electronicSignature',
},
}
},
methods: {
//
onHandleExportAllProject(queryParams) {
console.log(queryParams, '导出')
},
//
onHandleAddOrEditAllProject(type, data) {
this.dialogConfig.outerTitle =
type === 1 ? '新增标段工程' : '修改标段工程'
this.dialogConfig.outerVisible = true
},
//
onHandleDeleteAllProject(data) {
this.$confirm('确定删除该工程吗?', '温馨提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
})
.then(async () => {
const res = await deleteSubBaseInfoAPI(data.id)
console.log(res, '删除结果')
if (res.code === 200) {
this.$msgSuccess('删除成功')
this.$refs.allProjectTableRef.getTableList() //
}
})
.catch(() => {
console.log('取消')
})
},
//
async onHandleConfirmAddOrEdit() {
this.$refs.addOrEditFormContentRef.formType =
this.dialogConfig.outerTitle === '新增标段工程' ? 1 : 2
try {
await this.$refs.addOrEditFormContentRef.onHandleConfirmAddOrEditFun()
} catch (error) {
console.log('表单提交失败', error)
}
},
//
handleCloseDialogOuter() {
this.$refs.addOrEditFormContentRef.resetForm()
this.dialogConfig.outerVisible = false
},
},
} }
</script> </script>