Browse Source

2026-09-08

项目信息增加oa流程
master
fengyuan_yang 2 weeks ago
parent
commit
f139457e3c
  1. 4
      src/api/project/project.js
  2. 6
      src/views/modules/processManagement/processBindingInfo.vue
  3. 261
      src/views/modules/project/projectInfo/com_projectInfo-add-or-update.vue
  4. 223
      src/views/modules/project/projectInfo/projectInfo.vue

4
src/api/project/project.js

@ -64,3 +64,7 @@ export const queryUsernameByRoleSuperFlag = (data) => createAPI(`/project/site/u
export const projectInfoSearchByAnyField = data => createAPI(`/project/projectInfoSearch/any`,'Post',data) export const projectInfoSearchByAnyField = data => createAPI(`/project/projectInfoSearch/any`,'Post',data)
export const projectPartSearchByAnyField = data => createAPI(`/project/part/any`,'Post',data) export const projectPartSearchByAnyField = data => createAPI(`/project/part/any`,'Post',data)
export const issueProjectInfo = data => createAPI(`/project/issue`,'Post',data)
export const submitProjectInfo = data => createAPI(`/project/submit`,'Post',data)
export const getProjectApprovalList = data => createAPI(`/project/approvalList`,'Post',data)

6
src/views/modules/processManagement/processBindingInfo.vue

@ -1337,6 +1337,12 @@
passTable: [], passTable: [],
addTable: [] addTable: []
} }
} else if (row.menuId === '101002001') { //
this.queryTableParam = {
tableType: 'plm_project_info',
passTable: [],
addTable: ['plm_project_team']
}
} else { } else {
return return
} }

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

@ -10,40 +10,42 @@
</el-col> </el-col>
<el-col :span="12"> <el-col :span="12">
<el-form-item label="项目名称" prop="projectName"> <el-form-item label="项目名称" prop="projectName">
<el-input v-model="dataForm.projectName" ></el-input>
<el-input v-model="dataForm.projectName" :disabled="isProjectFieldDisabled('projectName')" ></el-input>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="6"> <el-col :span="6">
<el-form-item prop="projectTypeDb" label="项目类型"> <el-form-item prop="projectTypeDb" label="项目类型">
<dict-data-select dict-type="project_info_type_db" v-if="visible" v-model="dataForm.projectTypeDb"></dict-data-select>
<dict-data-select dict-type="project_info_type_db" v-if="visible" v-model="dataForm.projectTypeDb" :disabled="isProjectFieldDisabled('projectTypeDb')"></dict-data-select>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="6"> <el-col :span="6">
<el-form-item prop="industry" label="行业"> <el-form-item prop="industry" label="行业">
<dict-data-select dict-type="project_info_industry" v-if="visible" v-model="dataForm.industry"></dict-data-select>
<dict-data-select dict-type="project_info_industry" v-if="visible" v-model="dataForm.industry" :disabled="isProjectFieldDisabled('industry')"></dict-data-select>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="6"> <el-col :span="6">
<el-form-item prop="priority" label="优先级"> <el-form-item prop="priority" label="优先级">
<dict-data-select dict-type="project_info_priority" v-if="visible" v-model="dataForm.priority"></dict-data-select>
<dict-data-select dict-type="project_info_priority" v-if="visible" v-model="dataForm.priority" :disabled="isProjectFieldDisabled('priority')"></dict-data-select>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="6"> <el-col :span="6">
<el-form-item prop="projectManagerName"> <el-form-item prop="projectManagerName">
<span slot="label" style="" @click="managerChooseModal()"><a herf="#">项目经理</a></span>
<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 ></el-input>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="6"> <el-col :span="6">
<el-form-item prop="projectOwnerName" :rules="projectRole.projectOwnerName"> <el-form-item prop="projectOwnerName" :rules="projectRole.projectOwnerName">
<span slot="label" style="" @click="ownerChooseModal()"><a herf="#">项目审批人</a></span>
<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></el-input>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="6"> <el-col :span="6">
<el-form-item prop="customerId"> <el-form-item prop="customerId">
<span slot="label" style="" @click="getBaseList(102,1)"><a herf="#">客户</a></span>
<el-input v-model="dataForm.customerId" @blur="getCustomerName(1)"></el-input>
<span slot="label" style="" @click="!isProjectFieldDisabled('customerId') && 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-form-item>
</el-col> </el-col>
<el-col :span="12"> <el-col :span="12">
@ -65,37 +67,51 @@
<!-- </el-col>--> <!-- </el-col>-->
<el-col :span="6"> <el-col :span="6">
<el-form-item label="客户项目号"> <el-form-item label="客户项目号">
<el-input v-model="dataForm.customerProjectNo" ></el-input>
<el-input v-model="dataForm.customerProjectNo" :disabled="isProjectFieldDisabled('customerProjectNo')" ></el-input>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="6"> <el-col :span="6">
<el-form-item label="项目年销售额"> <el-form-item label="项目年销售额">
<el-input v-model="dataForm.projectAmount" @input="dataForm.projectAmount = dataForm.projectAmount.replace(/[^\d.]/g, '').replace(/\.{2,}/g, '.').replace(/^(\d+\.\d{1,6}).*$/, '$1')"></el-input>
<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-form-item>
</el-col> </el-col>
<el-col :span="12"> <el-col :span="12">
<el-form-item label="直接客户"> <el-form-item label="直接客户">
<el-input v-model="dataForm.finalCustomerId"></el-input>
<el-input v-model="dataForm.finalCustomerId" :disabled="isProjectFieldDisabled('finalCustomerId')"></el-input>
</el-form-item> </el-form-item>
</el-col> </el-col>
</el-row> </el-row>
<el-form-item label="项目描述" style="height: 70px"> <el-form-item label="项目描述" style="height: 70px">
<el-input type="textarea" resize="none" :autosize="{minRows: 2, maxRows: 2}" v-model="dataForm.projectDesc" ></el-input>
<el-input type="textarea" resize="none" :autosize="{minRows: 2, maxRows: 2}" v-model="dataForm.projectDesc" :disabled="isProjectFieldDisabled('projectDesc')" ></el-input>
</el-form-item> </el-form-item>
<el-form-item label="客户应用/要求" style="height: 70px"> <el-form-item label="客户应用/要求" style="height: 70px">
<el-input type="textarea" resize="none" :autosize="{minRows: 2, maxRows: 2}" v-model="dataForm.customerRemark" ></el-input>
<el-input type="textarea" resize="none" :autosize="{minRows: 2, maxRows: 2}" v-model="dataForm.customerRemark" :disabled="isProjectFieldDisabled('customerRemark')" ></el-input>
</el-form-item> </el-form-item>
<el-form-item label="其他要求" style="height: 70px"> <el-form-item label="其他要求" style="height: 70px">
<el-input type="textarea" resize="none" :autosize="{minRows: 2, maxRows: 2}" v-model="dataForm.remark" ></el-input>
<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>
<el-form-item prop="userRoleName" :rules="projectRole.userRoleName"> <el-form-item prop="userRoleName" :rules="projectRole.userRoleName">
<span slot="label" style="" @click="userRollModal()"><a herf="#">项目权限</a></span>
<el-input v-model="dataForm.userRoleName" ></el-input>
<span slot="label" style="" @click="!isProjectFieldDisabled('userRoleName') && userRollModal()"><a herf="#">项目权限</a></span>
<el-input v-model="dataForm.userRoleName" :disabled="isProjectFieldDisabled('userRoleName')" ></el-input>
</el-form-item> </el-form-item>
</el-form> </el-form>
<span slot="footer" class="dialog-footer"> <span slot="footer" class="dialog-footer">
<el-button type="primary" @click="dataFormSubmit()">{{'确定'}}</el-button>
<el-button type="primary" v-if="canSaveAction()" @click="dataFormSubmit()">{{'确定'}}</el-button>
<el-button type="primary" @click="visible = false">{{'关闭'}}</el-button> <el-button type="primary" @click="visible = false">{{'关闭'}}</el-button>
<el-button type="primary" v-if="canAgreeAction()" :loading="submitLoading" @click="agreeSubmit">同意</el-button>
<el-button type="primary" v-if="canRejectAction()" :loading="submitLoading" @click="openRejectModal">驳回</el-button>
</span>
</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="驳回意见">
<el-input type="textarea" v-model="rejectOpinion" :rows="3" resize="none"></el-input>
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button type="primary" :loading="submitLoading" @click="rejectSubmit">确定</el-button>
<el-button type="primary" @click="submitModalFlag = false">取消</el-button>
</span> </span>
</el-dialog> </el-dialog>
@ -248,6 +264,7 @@
searchUserRoll, searchUserRoll,
searchSelectionUserRole, searchSelectionUserRole,
saveProjectInfo, saveProjectInfo,
submitProjectInfo,
} from "@/api/project/project.js" } from "@/api/project/project.js"
import Chooselist from '@/views/modules/common/Chooselist' import Chooselist from '@/views/modules/common/Chooselist'
import DictDataSelect from "../../sys/dict-data-select.vue"; import DictDataSelect from "../../sys/dict-data-select.vue";
@ -255,6 +272,8 @@
} from "@/api/customer/customerInformation"; } from "@/api/customer/customerInformation";
import item from "../../code/item.vue"; import item from "../../code/item.vue";
import {queryUsernameByRoleSuperFlag} from "../../../../api/project/project"; import {queryUsernameByRoleSuperFlag} from "../../../../api/project/project";
import {getNodeAuthority, checkSuperAdmin} from "@/api/changeManagement/changeManagement"
import {isAuth} from "../../../../utils";
export default { export default {
@ -281,6 +300,17 @@
managerFlag:false, managerFlag:false,
userRoleFlag:false, userRoleFlag:false,
ownerFlag:false, ownerFlag:false,
submitModalFlag:false,
submitLoading:false,
rejectOpinion:'',
nodeAuthorityLoaded: true,
plmProjectAuthorityArr: [],
plmProjectTeamAuthorityArr: [],
menuId: '101002001',
authSubmit: false,
authReject: false,
superAdmin: false,
createBy2: this.$store.state.user.name,
operatorList:[], operatorList:[],
dataForm: { dataForm: {
id: 0, id: 0,
@ -313,6 +343,11 @@
userRoleList:[], userRoleList:[],
productSet:'', productSet:'',
projectAmount:'', projectAmount:'',
status:'草稿',
stepId: 10,
rejectFlag: 'N',
createBy2: '',
isReject: 'N'
}, },
userRoleForm:{ userRoleForm:{
username:'', username:'',
@ -374,7 +409,12 @@
} }
}, },
created () { created () {
this.menuId = (this.$route.meta && this.$route.meta.menuId) || this.menuId
this.authSubmit = isAuth(this.menuId + ':submit')
this.authReject = isAuth(this.menuId + ':reject')
checkSuperAdmin().then(({data}) => {
this.superAdmin = !!(data && data.superAdmin)
})
}, },
watch:{ watch:{
userRoleFlag(newVal,oldVal){ userRoleFlag(newVal,oldVal){
@ -544,6 +584,7 @@
this.dataForm.projectOwnerList=data.rows this.dataForm.projectOwnerList=data.rows
}) })
this.searchUserRollAll(); this.searchUserRollAll();
this.loadNodeAuthority(this.dataForm.site, this.dataForm.stepId || 10)
} }
}) })
} else { // } else { //
@ -578,7 +619,15 @@
userRoleList: [], userRoleList: [],
productSet: '', productSet: '',
projectAmount: '', projectAmount: '',
status: '草稿',
stepId: 10,
rejectFlag: 'N',
createBy2: '',
isReject: 'N'
} }
this.plmProjectAuthorityArr = []
this.plmProjectTeamAuthorityArr = []
this.nodeAuthorityLoaded = true
// //
this.addRollForUsername(this.$store.state.user.name,this.$store.state.user.userDisplay) this.addRollForUsername(this.$store.state.user.name,this.$store.state.user.userDisplay)
// this.searchUserRollAll(); // this.searchUserRollAll();
@ -658,13 +707,6 @@
return this.projectManagerList.includes(item.operatorId); return this.projectManagerList.includes(item.operatorId);
}) })
projectManagerName=selectionManagerList.map(item => item.operatorName).join(';'); projectManagerName=selectionManagerList.map(item => item.operatorName).join(';');
// for (let i = 0; i < this.projectManagerList.length; i++) {
// let select= this.operatorList.filter(item => item.operatorId === this.projectManagerList[i])
// if(select.length > 0){
// projectManagerName+=select[0].operatorName+';'
// this.addRollForUsername(select[0].operatorId,select[0].operatorName);
// }
// }
for (let i = 0; i < selectionManagerList.length; i++) { for (let i = 0; i < selectionManagerList.length; i++) {
let row = selectionManagerList[i] let row = selectionManagerList[i]
this.addRollForUsername(row.operatorId,row.operatorName) this.addRollForUsername(row.operatorId,row.operatorName)
@ -702,8 +744,6 @@
this.dataForm.projectOwnerName = projectOwnerName this.dataForm.projectOwnerName = projectOwnerName
this.dataForm.projectOwnerList=JSON.parse(JSON.stringify(this.projectOwnerList)); this.dataForm.projectOwnerList=JSON.parse(JSON.stringify(this.projectOwnerList));
this.ownerFlag=false this.ownerFlag=false
}, },
addRollForUsername(username,userDisplay){ addRollForUsername(username,userDisplay){
if(this.dataForm.userRoleList.length>0) { if(this.dataForm.userRoleList.length>0) {
@ -910,6 +950,173 @@
this.$refs.saveForm.resetFields(); this.$refs.saveForm.resetFields();
}, },
isCurrentApprover () {
return this.superAdmin || (this.dataForm.createBy2 && String(this.dataForm.createBy2).split(';').includes(this.createBy2))
},
canSaveAction () {
if (this.dataForm.status === '已完成') {
return false
}
if (!this.dataForm.status || this.dataForm.status === '草稿') {
return true
}
return this.dataForm.status === '审批中' && this.isCurrentApprover()
},
canAgreeAction () {
return this.authSubmit && this.isCurrentApprover() && this.dataForm.status === '审批中'
},
canRejectAction () {
return this.authReject && this.isCurrentApprover() && this.dataForm.status === '审批中' && this.dataForm.isReject === 'Y'
},
projectFieldFlag (fieldId) {
if (!this.plmProjectAuthorityArr || this.plmProjectAuthorityArr.length === 0) {
return this.dataForm.id ? 'N' : 'Y'
}
let target = this.plmProjectAuthorityArr.find(item => item.fieldId === fieldId)
return target ? target.updateFlag : 'N'
},
isProjectFieldDisabled (fieldId) {
if (this.dataForm.status === '已完成') {
return true
}
if (!this.dataForm.id) {
return false
}
return this.projectFieldFlag(fieldId) === 'N'
},
plmProjectTeamArrFlag (fieldId) {
if (!this.plmProjectTeamAuthorityArr) {
return 'N'
}
let arr = this.plmProjectTeamAuthorityArr.filter(a => a.fieldId === fieldId)
if (arr.length > 0) {
return arr[0].updateFlag
}
return 'N'
},
isProjectTeamFieldDisabled (fieldId) {
if (this.dataForm.status === '已完成') {
return true
}
if (!this.dataForm.id || this.dataForm.status === '草稿') {
return false
}
return this.plmProjectTeamArrFlag(fieldId) === 'N'
},
loadNodeAuthority (site, stepId) {
if (!site || stepId === null || stepId === undefined || !this.menuId) {
this.plmProjectAuthorityArr = []
this.plmProjectTeamAuthorityArr = []
this.nodeAuthorityLoaded = true
return Promise.resolve()
}
this.nodeAuthorityLoaded = false
return getNodeAuthority({
site: site,
stepId: stepId,
menuId: this.menuId
}).then(({data}) => {
if (data && data.code === 0 && data.rows) {
this.plmProjectAuthorityArr = data.rows.plm_project_info || []
this.plmProjectTeamAuthorityArr = data.rows.plm_project_team || []
} else {
this.plmProjectAuthorityArr = []
this.plmProjectTeamAuthorityArr = []
}
this.nodeAuthorityLoaded = true
}).catch(() => {
this.plmProjectAuthorityArr = []
this.plmProjectTeamAuthorityArr = []
this.nodeAuthorityLoaded = true
})
},
validateSubmitRequiredFields () {
if (this.plmProjectAuthorityArr) {
for (let i = 0; i < this.plmProjectAuthorityArr.length; i++) {
const fieldConfig = this.plmProjectAuthorityArr[i]
if (fieldConfig.required !== 'Y') {
continue
}
const value = this.dataForm[fieldConfig.fieldId]
if (value === null || value === undefined || String(value).trim() === '') {
this.$message.warning((fieldConfig.fieldName || fieldConfig.fieldId) + '不能为空!')
return false
}
}
}
if (this.plmProjectTeamAuthorityArr) {
for (let i = 0; i < this.plmProjectTeamAuthorityArr.length; i++) {
const fieldConfig = this.plmProjectTeamAuthorityArr[i]
if (fieldConfig.required !== 'Y') {
continue
}
const value = this.dataForm[fieldConfig.fieldId]
if (!value || value.length === 0) {
this.$message.warning((fieldConfig.fieldName || fieldConfig.fieldId) + '不能为空!')
return false
}
}
}
return true
},
agreeSubmit () {
if (!this.canAgreeAction()) {
this.$message.warning('当前状态不允许同意')
return
}
this.$confirm('确认同意该项目?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
this.submitProject('Y')
})
},
openRejectModal () {
if (!this.canRejectAction()) {
this.$message.warning('当前状态不允许驳回')
return
}
this.rejectOpinion = ''
this.submitModalFlag = true
},
rejectSubmit () {
if (!this.rejectOpinion || !this.rejectOpinion.trim()) {
this.$message.warning('请填写驳回意见')
return
}
this.submitProject('N')
},
submitProject (nodeConclusion) {
if (!this.nodeAuthorityLoaded) {
this.$message.warning('节点权限加载中,请稍后重试')
return
}
if (nodeConclusion === 'Y' && !this.validateSubmitRequiredFields()) {
return
}
this.submitLoading = true
submitProjectInfo({
...this.dataForm,
nodeConclusion: nodeConclusion,
rejectOpinion: this.rejectOpinion,
menuId: this.menuId
}).then(({data}) => {
this.submitLoading = false
if (data && data.code === 0) {
this.$message.success(nodeConclusion === 'Y' ? '同意成功' : '驳回成功')
this.submitModalFlag = false
this.visible = false
this.$emit('refreshDataList', this.dataForm.projectId)
} else {
this.$message.error((data && data.msg) || '提交失败')
}
}).catch(err => {
this.submitLoading = false
this.$message.error((err && err.message) || '提交失败')
})
},
updateDataForm (val) { updateDataForm (val) {
this.dataForm.projectId = val; this.dataForm.projectId = val;
}, },

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

@ -18,6 +18,26 @@
<el-form-item label="项目优先级"> <el-form-item label="项目优先级">
<dict-data-select dict-type="project_info_priority" clearable v-model="searchData.priority" style="width: 100px"></dict-data-select> <dict-data-select dict-type="project_info_priority" clearable v-model="searchData.priority" style="width: 100px"></dict-data-select>
</el-form-item> </el-form-item>
<el-form-item label="单据状态">
<el-select v-model="searchData.status" clearable style="width: 100px">
<el-option label="草稿" value="草稿"></el-option>
<el-option label="审批中" value="审批中"></el-option>
<el-option label="已完成" value="已完成"></el-option>
</el-select>
</el-form-item>
<el-form-item label="节点审批人">
<el-input v-model="searchData.currentApprover" clearable style="width: 120px"></el-input>
</el-form-item>
<el-form-item label="当前节点">
<el-select v-model="searchData.nodeId" placeholder="请选择节点" clearable style="width: 140px">
<el-option
v-for="option in nodeOptions"
:key="option.id"
:label="option.name"
:value="option.id">
</el-option>
</el-select>
</el-form-item>
<el-form-item label="客户代码"> <el-form-item label="客户代码">
<el-input v-model="searchData.customerId" clearable style="width: 120px"></el-input> <el-input v-model="searchData.customerId" clearable style="width: 120px"></el-input>
</el-form-item> </el-form-item>
@ -43,6 +63,7 @@
<span>{{ '导出' }}</span> <span>{{ '导出' }}</span>
</download-excel> </download-excel>
<el-button @click="filterVisible = true">搜索</el-button> <el-button @click="filterVisible = true">搜索</el-button>
<el-button type="warning" @click="closeProcessModal()">流程关闭</el-button>
</el-form-item> </el-form-item>
</el-form> </el-form>
<el-table <el-table
@ -51,6 +72,7 @@
border border
ref="mainTable" ref="mainTable"
@row-click="changeData" @row-click="changeData"
@selection-change="dataListSelectionChange"
highlight-current-row highlight-current-row
v-loading="dataListLoading" v-loading="dataListLoading"
style="width: 100%;"> style="width: 100%;">
@ -64,8 +86,10 @@
<a type="text" size="small" @click="addOrUpdateHandle(scope.row.projectId)">新增</a> <a type="text" size="small" @click="addOrUpdateHandle(scope.row.projectId)">新增</a>
<a type="text" size="small" @click="UpdateHandle(scope.row)">修改</a> <a type="text" size="small" @click="UpdateHandle(scope.row)">修改</a>
<a type="text" size="small" @click="deleteProjectInfo(scope.row)">删除</a> <a type="text" size="small" @click="deleteProjectInfo(scope.row)">删除</a>
<a v-if="authIssue && scope.row.status === '草稿'" type="text" size="small" @click="issueModal(scope.row)">下达</a>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column type="selection" header-align="center" align="center" width="50"></el-table-column>
<el-table-column <el-table-column
v-for="(item,index) in columnList1" :key="index" v-for="(item,index) in columnList1" :key="index"
:sortable="item.columnSortable" :sortable="item.columnSortable"
@ -103,6 +127,11 @@
<el-input v-model="projectData.projectId" readonly ></el-input> <el-input v-model="projectData.projectId" readonly ></el-input>
</el-form-item> </el-form-item>
</div></el-col> </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-form-item>
</div></el-col>
<el-col :span="3"><div class="grid-content bg-purple"> <el-col :span="3"><div class="grid-content bg-purple">
<el-form-item :label="'项目类型'"> <el-form-item :label="'项目类型'">
<el-input v-model="projectData.projectType" readonly ></el-input> <el-input v-model="projectData.projectType" readonly ></el-input>
@ -268,6 +297,9 @@
<el-tab-pane label="变更记录" v-if="isAuth('101002001:change')" name="changeRecord"> <el-tab-pane label="变更记录" v-if="isAuth('101002001:change')" name="changeRecord">
<change-record :data-list="changeRecordList" :height="240" :columns="columnChangeRecord"></change-record> <change-record :data-list="changeRecordList" :height="240" :columns="columnChangeRecord"></change-record>
</el-tab-pane> </el-tab-pane>
<el-tab-pane label="审批信息" name="approvalInformation">
<approval-information v-model:data-list="approvalList" :height="240"></approval-information>
</el-tab-pane>
</el-tabs> </el-tabs>
@ -398,7 +430,9 @@
getProjectUserRole, getProjectUserRole,
addContact, addContact,
deleteContact, deleteContact,
queryCustomerContact
queryCustomerContact,
issueProjectInfo,
getProjectApprovalList
} from "@/api/project/project.js" } from "@/api/project/project.js"
import { import {
getChangeRecordByPartNo, // getChangeRecordByPartNo, //
@ -411,6 +445,7 @@
import technicalSpecification from "./com_project_technicalSpecification"; import technicalSpecification from "./com_project_technicalSpecification";
import DictDataSelect from "../../sys/dict-data-select.vue"; import DictDataSelect from "../../sys/dict-data-select.vue";
import ChangeRecord from "./com_project_change_record.vue"; import ChangeRecord from "./com_project_change_record.vue";
import ApprovalInformation from "../../changeManagement/approvalInformation.vue";
import OssComponents from "../../oss/ossComponents.vue"; import OssComponents from "../../oss/ossComponents.vue";
import toolApply from "./com_project_toolApplyCation.vue"; import toolApply from "./com_project_toolApplyCation.vue";
import { Divider } from 'element-ui'; import { Divider } from 'element-ui';
@ -428,7 +463,8 @@
import {proofingInformationSearch} from "../../../../api/proofing/proofingInformation"; import {proofingInformationSearch} from "../../../../api/proofing/proofingInformation";
import {testInformationList} from "../../../../api/test/testInformation"; import {testInformationList} from "../../../../api/test/testInformation";
import {searchProjectToolApplyDetail} from "../../../../api/tool/toolApply"; import {searchProjectToolApplyDetail} from "../../../../api/tool/toolApply";
import {technicalSpecificationListSearch} from "../../../../api/sampleManagement/technicalSpecificationList";
import {technicalSpecificationListSearch, getNodeList} from "../../../../api/sampleManagement/technicalSpecificationList";
import {checkSuperAdmin, closeProcess} from "@/api/changeManagement/changeManagement"
/*組件*/ /*組件*/
export default { export default {
components: { components: {
@ -439,6 +475,7 @@
CustomerInfo, CustomerInfo,
OssComponents, OssComponents,
ChangeRecord, ChangeRecord,
ApprovalInformation,
DictDataSelect, DictDataSelect,
Chooselist, Chooselist,
AddOrUpdate, AddOrUpdate,
@ -467,6 +504,12 @@
filterVisible:false, filterVisible:false,
isFilterSearch: false, isFilterSearch: false,
filterSearchData: {}, filterSearchData: {},
nodeOptions: [],
approvalList: [],
dataListSelections: [],
menuId: '101002001',
authIssue: false,
superAdmin: false,
searchData:{ searchData:{
page: 1, page: 1,
limit: 100, limit: 100,
@ -480,6 +523,10 @@
customerId:'', customerId:'',
customerName:'', customerName:'',
userName:this.$store.state.user.name, userName:this.$store.state.user.name,
status:'',
currentApprover:'',
nodeId:'',
menuId: this.$route.meta.menuId || '101002001',
}, },
contactChooseFlag:false, contactChooseFlag:false,
currentRow:'', currentRow:'',
@ -561,6 +608,60 @@
fixed: '', fixed: '',
columnWidth: 200 columnWidth: 200
}, },
{
userId: this.$store.state.user.name,
functionId: 101002001,
serialNumber: '101002001Table1Status',
tableId: "101002001Table1",
tableName: "项目信息主表",
columnProp: "status",
headerAlign: "center",
align: "center",
columnLabel: "单据状态",
columnHidden: false,
columnImage: false,
columnSortable: false,
sortLv: 0,
status: true,
fixed: '',
columnWidth: 100
},
{
userId: this.$store.state.user.name,
functionId: 101002001,
serialNumber: '101002001Table1NodeName',
tableId: "101002001Table1",
tableName: "项目信息主表",
columnProp: "nodeName",
headerAlign: "center",
align: "left",
columnLabel: "当前节点",
columnHidden: false,
columnImage: false,
columnSortable: false,
sortLv: 0,
status: true,
fixed: '',
columnWidth: 140
},
{
userId: this.$store.state.user.name,
functionId: 101002001,
serialNumber: '101002001Table1CurrentApprover',
tableId: "101002001Table1",
tableName: "项目信息主表",
columnProp: "currentApprover",
headerAlign: "center",
align: "left",
columnLabel: "当前节点审批人",
columnHidden: false,
columnImage: false,
columnSortable: false,
sortLv: 0,
status: true,
fixed: '',
columnWidth: 130
},
{ {
userId: this.$store.state.user.name, userId: this.$store.state.user.name,
functionId: 101002001, functionId: 101002001,
@ -988,6 +1089,9 @@
productSet:'', productSet:'',
projectAmount:'', projectAmount:'',
finalCustomerId:'', finalCustomerId:'',
status:'',
nodeName:'',
currentApprover:'',
}, },
customerData:{ customerData:{
site: '', site: '',
@ -1315,6 +1419,11 @@
} }
}, },
mounted() { mounted() {
this.menuId = (this.$route.meta && this.$route.meta.menuId) || this.menuId
this.searchData.menuId = this.menuId
this.authIssue = this.isAuth(this.menuId + ':issue')
this.checkSuperAdmin()
this.fetchNodeOptions()
this.$nextTick(() => { this.$nextTick(() => {
//this.height = window.innerHeight - 520; //this.height = window.innerHeight - 520;
this.height = window.innerHeight / 2 - 50 this.height = window.innerHeight / 2 - 50
@ -1445,6 +1554,7 @@
this.searchData.limit = this.pageSize this.searchData.limit = this.pageSize
this.searchData.page = this.pageIndex this.searchData.page = this.pageIndex
this.searchData.userId = this.$store.state.user.id this.searchData.userId = this.$store.state.user.id
this.searchData.menuId = this.menuId
projectInfoSearch(this.searchData).then(({data}) => { projectInfoSearch(this.searchData).then(({data}) => {
if (data.code == 0) { if (data.code == 0) {
this.dataList1 = data.page.list this.dataList1 = data.page.list
@ -1471,6 +1581,7 @@
limit: 10, limit: 10,
} }
this.refreshCurrentTabTable (); this.refreshCurrentTabTable ();
this.loadApprovalList(row);
customerInformationSearchForCheck(inData).then(({data}) => { customerInformationSearchForCheck(inData).then(({data}) => {
if (data.code == 0) { if (data.code == 0) {
if(data.page.list.length>0){ if(data.page.list.length>0){
@ -1990,6 +2101,10 @@
} }
getProjectUserRole(inData).then(({data}) => { getProjectUserRole(inData).then(({data}) => {
if(data.row.superFlag==='Y'||data.row.deleteFlag==='Y') { if(data.row.superFlag==='Y'||data.row.deleteFlag==='Y') {
if (row.status && row.status !== '草稿') {
this.$message.warning('仅草稿状态的单据允许删除')
return
}
this.$confirm(`确定删除当前记录?`, '提示', { this.$confirm(`确定删除当前记录?`, '提示', {
confirmButtonText: '确定', confirmButtonText: '确定',
cancelButtonText: '取消', cancelButtonText: '取消',
@ -2035,6 +2150,110 @@
} }
}, },
fetchNodeOptions () {
if (!this.searchData.site || !this.menuId) {
this.nodeOptions = []
return
}
getNodeList({
site: this.searchData.site,
menuId: this.menuId
}).then(({data}) => {
if (data && data.code === 0 && Array.isArray(data.rows)) {
this.nodeOptions = data.rows
.filter(item => item && item.nodeId)
.map(item => ({
id: item.nodeId,
name: item.nodeName
}))
} else {
this.nodeOptions = []
}
}).catch(() => {
this.nodeOptions = []
})
},
checkSuperAdmin () {
checkSuperAdmin().then(({data}) => {
this.superAdmin = !!(data && data.superAdmin)
})
},
dataListSelectionChange (val) {
this.dataListSelections = val || []
},
loadApprovalList (row) {
if (!row || !row.site || !row.projectId) {
this.approvalList = []
return
}
getProjectApprovalList({
site: row.site,
menuId: this.menuId,
documentNo: row.projectId
}).then(({data}) => {
this.approvalList = (data && data.code === 0) ? (data.rows || []) : []
}).catch(() => {
this.approvalList = []
})
},
issueModal (row) {
if (!this.authIssue) {
this.$message.warning('没有下达权限')
return
}
if (!row || row.status !== '草稿') {
this.$message.warning('仅草稿状态的单据允许下达')
return
}
this.$confirm('确认下达该项目?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
issueProjectInfo({
site: row.site,
projectId: row.projectId,
menuId: this.menuId
}).then(({data}) => {
if (data && data.code === 0) {
this.$message.success('下达成功')
this.search()
} else {
this.$message.error((data && data.msg) || '下达失败')
}
}).catch(err => {
this.$message.error((err && err.message) || '下达失败')
})
}).catch(() => {})
},
closeProcessModal () {
const approvedRows = (this.dataListSelections || []).filter(item => item && item.status === '审批中' && item.projectId)
if (!approvedRows.length) {
this.$message.warning('请勾选状态为"审批中"的单据!')
return
}
this.$confirm(`确定关闭这 ${approvedRows.length} 条项目单据的OA流程?关闭后状态将变为"草稿"。`, '流程关闭', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
closeProcess({
site: this.$store.state.user.site,
documentNos: approvedRows.map(row => row.projectId),
documentType: 'PROJECT'
}).then(({data}) => {
if (data && data.code === 0) {
this.$message.success('流程关闭成功')
this.search()
} else {
this.$message.error((data && data.msg) || '流程关闭失败')
}
}).catch(err => {
this.$message.error((err && err.message) || '流程关闭失败')
})
}).catch(() => {})
},
projectInfoSearchByAnyField(params){ projectInfoSearchByAnyField(params){
params.no = this.pageIndex params.no = this.pageIndex
params.size = this.pageSize params.size = this.pageSize

Loading…
Cancel
Save