Browse Source

2026-09-18

优化项目信息
master
fengyuan_yang 3 days ago
parent
commit
c9e789aa3d
  1. 1
      src/api/project/project.js
  2. 107
      src/views/modules/project/projectInfo/com_projectInfo-add-or-update.vue
  3. 144
      src/views/modules/project/projectInfo/projectInfo.vue
  4. 49
      src/views/modules/quote/index.vue

1
src/api/project/project.js

@ -19,6 +19,7 @@ export const searchUserRoll = data => createAPI(`/project/searchUserRoll`,'Post'
export const searchSelectionUserRole = data => createAPI(`/project/searchSelectionUserRole`,'post',data)
export const saveProjectInfo = data => createAPI(`/project/saveProjectInfo`,'Post',data)
export const updateProjectAmount = data => createAPI(`/project/updateProjectAmount`,'Post',data)
/*查询文件内容*/
export const getFileContentList = data => createAPI('sys/file/getSysFileByOrderRef2','post',data)

107
src/views/modules/project/projectInfo/com_projectInfo-add-or-update.vue

@ -32,19 +32,20 @@
<el-form-item prop="projectManagerName">
<span v-if="isProjectTeamFieldDisabled('projectManagerList')" slot="label">项目经理</span>
<span v-else slot="label" @click="managerChooseModal()"><a herf="#">项目经理</a></span>
<el-input v-model="dataForm.projectManagerName" readonly ></el-input>
<el-input v-model="dataForm.projectManagerName" readonly :disabled="isProjectTeamFieldDisabled('projectManagerList')"></el-input>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item prop="projectOwnerName" :rules="projectRole.projectOwnerName">
<span v-if="isProjectTeamFieldDisabled('projectOwnerList')" slot="label">项目审批人</span>
<span v-else slot="label" @click="ownerChooseModal()"><a herf="#">项目审批人</a></span>
<el-input v-model="dataForm.projectOwnerName" readonly></el-input>
<el-input v-model="dataForm.projectOwnerName" readonly :disabled="isProjectTeamFieldDisabled('projectOwnerList')"></el-input>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item prop="customerId">
<span slot="label" style="" @click="!isProjectFieldDisabled('customerId') && getBaseList(102,1)"><a herf="#">客户</a></span>
<span v-if="isProjectFieldDisabled('customerId')" slot="label">客户</span>
<span v-else slot="label" @click="getBaseList(102,1)"><a herf="#">客户</a></span>
<el-input v-model="dataForm.customerId" @blur="getCustomerName(1)" :disabled="isProjectFieldDisabled('customerId')"></el-input>
</el-form-item>
</el-col>
@ -70,9 +71,16 @@
<el-input v-model="dataForm.customerProjectNo" :disabled="isProjectFieldDisabled('customerProjectNo')" ></el-input>
</el-form-item>
</el-col>
<el-col :span="6">
<el-col :span="10">
<el-form-item class="project-amount-form-item">
<span slot="label" class="project-amount-label">项目年销售额CNY(K)</span>
<template slot="label">
<span>项目年销售额CNY(K)</span>
<el-button
v-if="authProjectAmount"
style="margin-left: 2px;width: 83px;line-height: 0.5;font-size: 10px;"
type="primary"
@click="openProjectAmountDialog">编辑</el-button>
</template>
<el-input v-model="dataForm.projectAmount" :disabled="isProjectFieldDisabled('projectAmount')" @input="dataForm.projectAmount = dataForm.projectAmount.replace(/[^\d.]/g, '').replace(/\.{2,}/g, '.').replace(/^(\d+\.\d{1,6}).*$/, '$1')"></el-input>
</el-form-item>
</el-col>
@ -92,7 +100,8 @@
<el-input type="textarea" resize="none" :autosize="{minRows: 2, maxRows: 2}" v-model="dataForm.remark" :disabled="isProjectFieldDisabled('remark')" ></el-input>
</el-form-item>
<el-form-item prop="userRoleName" :rules="projectRole.userRoleName">
<span slot="label" style="" @click="!isProjectFieldDisabled('userRoleName') && userRollModal()"><a herf="#">项目权限</a></span>
<span v-if="isProjectFieldDisabled('userRoleName')" slot="label">项目权限</span>
<span v-else slot="label" @click="userRollModal()"><a herf="#">项目权限</a></span>
<el-input v-model="dataForm.userRoleName" :disabled="isProjectFieldDisabled('userRoleName')" ></el-input>
</el-form-item>
</el-form>
@ -104,6 +113,22 @@
</span>
</el-dialog>
<el-dialog width="500px" title="项目年销售额CNY(K)" :close-on-click-modal="false" :visible.sync="projectAmountFlag" v-drag>
<el-form label-position="top">
<el-form-item label="项目年销售额CNY(K)">
<el-input
v-model="projectAmountForm.projectAmount"
@input="projectAmountForm.projectAmount = String(projectAmountForm.projectAmount || '').replace(/[^\d.]/g, '').replace(/\.{2,}/g, '.').replace(/^(\d+\.\d{1,6}).*$/, '$1')">
</el-input>
</el-form-item>
</el-form>
<el-footer style="height:35px;margin-top:50px;text-align:center">
<el-button type="primary" @click="refreshProjectAmount">刷新</el-button>
<el-button type="primary" :loading="projectAmountLoading" @click="saveProjectAmount">保存</el-button>
<el-button type="primary" @click="projectAmountFlag = false">取消</el-button>
</el-footer>
</el-dialog>
<el-dialog title="驳回" top="30vh" :close-on-click-modal="false" :visible.sync="submitModalFlag" width="500px">
<el-form label-position="top">
<el-form-item label="驳回意见">
@ -266,6 +291,7 @@
searchSelectionUserRole,
saveProjectInfo,
submitProjectInfo,
updateProjectAmount,
} from "@/api/project/project.js"
import Chooselist from '@/views/modules/common/Chooselist'
import DictDataSelect from "../../sys/dict-data-select.vue";
@ -310,6 +336,12 @@
menuId: '101002001',
authSubmit: false,
authReject: false,
authProjectAmount: false,
projectAmountFlag: false,
projectAmountLoading: false,
projectAmountForm: {
projectAmount: ''
},
superAdmin: false,
createBy2: this.$store.state.user.name,
operatorList:[],
@ -413,6 +445,7 @@
this.menuId = (this.$route.meta && this.$route.meta.menuId) || this.menuId
this.authSubmit = isAuth(this.menuId + ':submit')
this.authReject = isAuth(this.menuId + ':reject')
this.authProjectAmount = isAuth(this.menuId + ':projectAmount')
checkSuperAdmin().then(({data}) => {
this.superAdmin = !!(data && data.superAdmin)
})
@ -955,6 +988,60 @@
this.$refs.saveForm.resetFields();
},
openProjectAmountDialog () {
this.$set(this.projectAmountForm, 'projectAmount', this.dataForm.projectAmount == null ? '' : this.dataForm.projectAmount)
this.projectAmountFlag = true
},
refreshProjectAmount () {
if (!this.dataForm.id) {
this.$set(this.projectAmountForm, 'projectAmount', this.dataForm.projectAmount == null ? '' : this.dataForm.projectAmount)
return
}
projectInfoSearch({
page: 1,
limit: 10,
id: this.dataForm.id,
menuId: this.menuId,
userId: this.$store.state.user.name
}).then(({data}) => {
if (data && data.page && data.page.list && data.page.list.length > 0) {
this.$set(this.projectAmountForm, 'projectAmount', data.page.list[0].projectAmount == null ? '' : data.page.list[0].projectAmount)
} else {
this.$message.error((data && data.msg) || '刷新失败')
}
}).catch(() => {
this.$message.error('刷新失败')
})
},
saveProjectAmount () {
const amount = this.projectAmountForm.projectAmount
if (!this.dataForm.id) {
this.$set(this.dataForm, 'projectAmount', amount)
this.projectAmountFlag = false
this.$message.success('暂存成功,保存单据后写入数据库')
return
}
this.projectAmountLoading = true
updateProjectAmount({
site: this.dataForm.site,
projectId: this.dataForm.projectId,
projectAmount: amount === '' ? null : amount
}).then(({data}) => {
if (data && data.code === 0) {
this.$set(this.dataForm, 'projectAmount', amount)
this.projectAmountFlag = false
this.$message.success('操作成功')
this.$emit('refreshDataList', this.dataForm.projectId)
} else {
this.$message.error((data && data.msg) || '保存失败')
}
}).catch(() => {
this.$message.error('保存失败')
}).finally(() => {
this.projectAmountLoading = false
})
},
isCurrentApprover () {
return this.superAdmin || (this.dataForm.createBy2 && String(this.dataForm.createBy2).split(';').includes(this.createBy2))
},
@ -1255,12 +1342,10 @@
.project-amount-form-item .el-form-item__label {
overflow: visible;
}
.project-amount-label {
display: inline-block;
width: 160px;
height: auto;
line-height: 22px;
white-space: nowrap;
width: auto !important;
}
</style>

144
src/views/modules/project/projectInfo/projectInfo.vue

@ -121,106 +121,82 @@
<el-tabs style="font-size: 12px;min-height: 330px" class="customer-tab" v-model="activeName" type="border-card" @tab-click="tabClick">
<el-tab-pane label="项目信息" name="info">
<el-form label-position="top" style="margin-top: 0px; margin-left: 0px;">
<el-row :gutter="20">
<el-col :span="3"><div class="grid-content bg-purple">
<el-form-item :label="'项目号'">
<el-input v-model="projectData.projectId" readonly ></el-input>
<el-row :gutter="25">
<el-col :span="6">
<el-form-item label="项目号">
<el-input v-model="projectData.projectId" readonly></el-input>
</el-form-item>
</div></el-col>
<el-col :span="3"><div class="grid-content bg-purple">
<el-form-item :label="'单据状态'">
<el-input v-model="projectData.status" readonly ></el-input>
</el-col>
<el-col :span="12">
<el-form-item label="项目名称">
<el-input v-model="projectData.projectName" readonly></el-input>
</el-form-item>
</div></el-col>
<el-col :span="3"><div class="grid-content bg-purple">
<el-form-item :label="'项目类型'">
<el-input v-model="projectData.projectType" readonly ></el-input>
</el-col>
<el-col :span="6">
<el-form-item label="项目类型">
<el-input v-model="projectData.projectType" readonly></el-input>
</el-form-item>
</div></el-col>
<el-col :span="3"><div class="grid-content bg-purple">
<el-form-item :label="'行业'">
<el-input v-model="projectData.industryDesc" readonly ></el-input>
</el-col>
<el-col :span="6">
<el-form-item label="行业">
<el-input v-model="projectData.industryDesc" readonly></el-input>
</el-form-item>
</div></el-col>
<el-col :span="3"><div class="grid-content bg-purple">
<el-form-item :label="'优先级'">
</el-col>
<el-col :span="6">
<el-form-item label="优先级">
<el-input v-model="projectData.priorityDesc" readonly></el-input>
</el-form-item>
</div></el-col>
<el-col :span="4"><div class="grid-content bg-purple">
<el-form-item :label="'项目年销售额CNY(K)'">
<el-input v-model="projectData.projectAmount" readonly style=""></el-input>
</el-form-item>
</div></el-col>
<el-col :span="5"><div class="grid-content bg-purple">
<el-form-item :label="'直接客户'">
<el-input v-model="projectData.finalCustomerId" readonly style=""></el-input>
</el-form-item>
</div></el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="5">
<div class="grid-content bg-purple">
<el-form-item :label="'项目名称'">
<el-input v-model="projectData.projectName" readonly style="" ></el-input>
</el-form-item>
</div>
</el-col>
<el-col :span="5"><div class="grid-content bg-purple">
<el-form-item :label="'项目描述'">
<el-input v-model="projectData.projectDesc" readonly style="" ></el-input>
<el-col :span="6">
<el-form-item label="项目经理">
<el-input v-model="projectData.projectManagerName" readonly></el-input>
</el-form-item>
</div></el-col>
<!-- <el-col :span="5"><div class="grid-content bg-purple">-->
<!-- <el-form-item :label="'最终客户'">-->
<!-- <el-input v-model="projectData.finalCustomerName" readonly style="" ></el-input>-->
<!-- </el-form-item>-->
<!-- </div></el-col>-->
<el-col :span="5"><div class="grid-content bg-purple">
<el-form-item :label="'客户项目编号'">
<el-input v-model="projectData.customerProjectNo" readonly style="" ></el-input>
</el-col>
<el-col :span="6">
<el-form-item label="项目审批人">
<el-input v-model="projectData.projectOwnerName" readonly></el-input>
</el-form-item>
</div></el-col>
<el-col :span="5"><div class="grid-content bg-purple">
<!-- <el-col :span="8"><div class="grid-content bg-purple">-->
<el-form-item :label="'项目经理'">
<el-input v-model="projectData.projectManagerName" readonly style="" ></el-input>
</el-col>
<el-col :span="6">
<el-form-item label="客户">
<el-input v-model="projectData.customerId" readonly></el-input>
</el-form-item>
</div></el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="8"><div class="grid-content bg-purple">
<el-form-item :label="'项目审批人'">
<el-input v-model="projectData.projectOwnerName" readonly style="" ></el-input>
</el-col>
<el-col :span="12">
<el-form-item label="客户名称">
<el-input v-model="projectData.customerName" readonly></el-input>
</el-form-item>
</div></el-col>
<el-col :span="16"><div class="grid-content bg-purple">
<!-- <el-col :span="8"><div class="grid-content bg-purple">-->
<el-form-item :label="'项目权限'">
<el-input v-model="projectData.userRoleName" readonly style="" ></el-input>
</el-col>
<el-col :span="6"></el-col>
<el-col :span="6">
<el-form-item label="客户项目号">
<el-input v-model="projectData.customerProjectNo" readonly></el-input>
</el-form-item>
</div></el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="24"><div class="grid-content bg-purple">
<el-form-item :label="'客户应用/要求'">
<el-input v-model="projectData.customerRemark" readonly style="" ></el-input>
</el-col>
<el-col :span="10">
<el-form-item label="项目年销售额CNY(K)">
<el-input v-model="projectData.projectAmount" readonly></el-input>
</el-form-item>
</div></el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="24"><div class="grid-content bg-purple">
<el-form-item :label="'其他特殊要求'">
<el-input v-model="projectData.remark" readonly style="" ></el-input>
</el-col>
<el-col :span="8">
<el-form-item label="直接客户">
<el-input v-model="projectData.finalCustomerId" readonly></el-input>
</el-form-item>
</div></el-col>
</el-col>
</el-row>
<el-form-item label="项目描述" style="height: 70px">
<el-input type="textarea" resize="none" :autosize="{minRows: 2, maxRows: 2}" v-model="projectData.projectDesc" readonly></el-input>
</el-form-item>
<el-form-item label="客户应用/要求" style="height: 70px">
<el-input type="textarea" resize="none" :autosize="{minRows: 2, maxRows: 2}" v-model="projectData.customerRemark" readonly></el-input>
</el-form-item>
<el-form-item label="其他要求" style="height: 70px">
<el-input type="textarea" resize="none" :autosize="{minRows: 2, maxRows: 2}" v-model="projectData.remark" readonly></el-input>
</el-form-item>
<el-form-item label="项目权限">
<el-input v-model="projectData.userRoleName" readonly></el-input>
</el-form-item>
</el-form>
</el-tab-pane>
<el-tab-pane label="客户信息" v-if="isAuth('101002001:customer')" name="customer">
<customer-info :project="currentRow"></customer-info>

49
src/views/modules/quote/index.vue

@ -576,6 +576,7 @@ export default {
insideInquiryVisible:false,
detailFlag:false,
skipAnnualSalesAssign: false,
ossColumns:[
{
@ -797,11 +798,27 @@ export default {
if (!this.currentQuote.approvalUsername) return false
return this.currentQuote.approvalUsername.split(';').includes(this.$store.state.user.name)
},
isAnnualSalesDisabled() {
if (this.detailFlag) {
return true
}
if (this.saveQuote.status === '已完成') {
return true
}
if (!this.plmQuoteArr || this.plmQuoteArr.length === 0) {
return true
}
const field = this.plmQuoteArr.find(item => item.fieldId === 'annualSales')
if (!field) {
return true
}
return field.updateFlag !== 'Y'
},
//
async getNodeAuthority() {
let tempData = {
site: this.currentQuote.site,
stepId: this.currentQuote.stepId,
stepId: this.currentQuote.stepId || 10,
menuId: this.$route.meta.menuId
}
await getNodeAuthority(tempData).then(({data}) => {
@ -956,20 +973,34 @@ export default {
if (row){
// currentQuote getNodeAuthority stepId
this.currentQuote = {...row}
this.skipAnnualSalesAssign = true
this.saveQuote = {
...row
}
//
if (row.status === '审批中') {
this.skipAnnualSalesAssign = false
// 稿(10)/
if (row.status !== '已完成') {
await this.getNodeAuthority()
await this.getDefaultQuoteDetailRow()
if (row.status === '审批中') {
await this.getDefaultQuoteDetailRow()
}
} else {
this.plmQuoteArr = []
this.plmQuoteDetailArr = []
}
}else {
this.currentQuote = {
site: this.$store.state.user.site,
stepId: 10
}
this.saveQuote = {
...this.quote,
buNo:'*',
site:this.$store.state.user.site
site:this.$store.state.user.site,
status: '草稿',
stepId: 10
}
await this.getNodeAuthority()
this.$nextTick(()=>{
this.saveQuote.buId = this.userBuList.length > 0? this.userBuList[0].id:null;
})
@ -1402,6 +1433,12 @@ export default {
return Number.isNaN(amount) ? undefined : amount
},
assignAnnualSalesFromProject(project, projectId) {
if (this.skipAnnualSalesAssign) {
return
}
if (!this.isAnnualSalesDisabled() && this.saveQuote && this.saveQuote.annualSales != null && this.saveQuote.annualSales !== '') {
return
}
const amount = this.pickProjectAmount(project)
if (amount != null) {
this.$set(this.saveQuote, 'annualSales', amount)
@ -1880,7 +1917,7 @@ export default {
</el-col>
<el-col :span="8">
<el-form-item label="项目年销售额CNY(K)" prop="annualSales" :show-message="false">
<el-input v-model="saveQuote.annualSales" disabled placeholder="随项目自动带出"></el-input>
<el-input v-model="saveQuote.annualSales" :disabled="isAnnualSalesDisabled()" placeholder="随项目自动带出"></el-input>
</el-form-item>
</el-col>
<el-col :span="24">

Loading…
Cancel
Save