初始化立项、任务书、执行、变更、验收、知识产权、公共实验室模块
parent
ecf9f26547
commit
f742e12dd4
2
.env
2
.env
|
|
@ -1,5 +1,5 @@
|
||||||
# 标题
|
# 标题
|
||||||
VITE_APP_TITLE=芋道管理系统
|
VITE_APP_TITLE=科研管理系统
|
||||||
|
|
||||||
# 项目本地运行端口号
|
# 项目本地运行端口号
|
||||||
VITE_PORT=80
|
VITE_PORT=80
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,67 @@
|
||||||
|
import request from '@/config/axios'
|
||||||
|
|
||||||
|
// 验收主 VO
|
||||||
|
export interface MainVO {
|
||||||
|
id: string // id
|
||||||
|
contractId: string // 合同主键ID
|
||||||
|
code: string // 课题编号
|
||||||
|
year: string // 年度
|
||||||
|
name: string // 课题名称
|
||||||
|
beginDate: string // 开始时间
|
||||||
|
endData: string // 结束时间
|
||||||
|
competentDeptId: string // 主管部门ID
|
||||||
|
competentDeptName: string // 主管部门
|
||||||
|
managerId: string // 主管工程师ID
|
||||||
|
managerName: string // 主管工程师
|
||||||
|
createdBy: string // 创建人
|
||||||
|
createdTime: Date // 创建时间
|
||||||
|
updatedBy: string // 更新人
|
||||||
|
updatedTime: Date // 更新时间
|
||||||
|
}
|
||||||
|
|
||||||
|
// 验收主 API
|
||||||
|
export const MainApi = {
|
||||||
|
// 查询验收主分页
|
||||||
|
getMainPage: async (params: any) => {
|
||||||
|
return await request.get({ url: `/acceptance/main/page`, params })
|
||||||
|
},
|
||||||
|
|
||||||
|
// 查询验收主详情
|
||||||
|
getMain: async (id: number) => {
|
||||||
|
return await request.get({ url: `/acceptance/main/get?id=` + id })
|
||||||
|
},
|
||||||
|
|
||||||
|
// 新增验收主
|
||||||
|
createMain: async (data: MainVO) => {
|
||||||
|
return await request.post({ url: `/acceptance/main/create`, data })
|
||||||
|
},
|
||||||
|
|
||||||
|
// 修改验收主
|
||||||
|
updateMain: async (data: MainVO) => {
|
||||||
|
return await request.put({ url: `/acceptance/main/update`, data })
|
||||||
|
},
|
||||||
|
|
||||||
|
// 删除验收主
|
||||||
|
deleteMain: async (id: number) => {
|
||||||
|
return await request.delete({ url: `/acceptance/main/delete?id=` + id })
|
||||||
|
},
|
||||||
|
|
||||||
|
// 导出验收主 Excel
|
||||||
|
exportMain: async (params) => {
|
||||||
|
return await request.download({ url: `/acceptance/main/export-excel`, params })
|
||||||
|
},
|
||||||
|
|
||||||
|
// ==================== 子表(验收详细信息) ====================
|
||||||
|
|
||||||
|
// 获得验收详细信息
|
||||||
|
getInfoByAcceptanceId: async (acceptanceId) => {
|
||||||
|
return await request.get({ url: `/acceptance/main/info/get-by-acceptance-id?acceptanceId=` + acceptanceId })
|
||||||
|
},
|
||||||
|
|
||||||
|
// ==================== 子表(验收经费) ====================
|
||||||
|
|
||||||
|
// 获得验收经费列表
|
||||||
|
getFundsListByAcceptanceId: async (acceptanceId) => {
|
||||||
|
return await request.get({ url: `/acceptance/main/funds/list-by-acceptance-id?acceptanceId=` + acceptanceId })
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,98 @@
|
||||||
|
import request from '@/config/axios'
|
||||||
|
|
||||||
|
// 立项申请 VO
|
||||||
|
export interface MainVO {
|
||||||
|
id: string // id
|
||||||
|
number: string // 编号
|
||||||
|
name: string // 项目名称
|
||||||
|
technicalField: string // 所属技术领域
|
||||||
|
year: string // 年度
|
||||||
|
beginDate: string // 开始时间
|
||||||
|
endData: string // 结束时间
|
||||||
|
directorId: string // 负责人Id
|
||||||
|
director: string // 负责人姓名
|
||||||
|
gender: string // 负责人性别
|
||||||
|
age: string // 年龄
|
||||||
|
education: string // 学历
|
||||||
|
major: string // 所学专业
|
||||||
|
engagMajor: string // 从事专业
|
||||||
|
position: string // 职务(职称)
|
||||||
|
phoneNo: string // 电话
|
||||||
|
email: string // 邮箱
|
||||||
|
fax: string // 传真
|
||||||
|
postalCode: string // 邮编
|
||||||
|
address: string // 通讯地址
|
||||||
|
achievement: string // 主要业绩
|
||||||
|
competentDeptId: string // 主管部门ID
|
||||||
|
competentDeptName: string // 主管部门
|
||||||
|
managerId: string // 主管工程师ID
|
||||||
|
managerName: string // 主管工程师
|
||||||
|
}
|
||||||
|
|
||||||
|
// 立项申请 API
|
||||||
|
export const MainApi = {
|
||||||
|
// 查询立项申请分页
|
||||||
|
getMainPage: async (params: any) => {
|
||||||
|
return await request.get({ url: `/apply/main/page`, params })
|
||||||
|
},
|
||||||
|
|
||||||
|
// 查询立项申请详情
|
||||||
|
getMain: async (id: number) => {
|
||||||
|
return await request.get({ url: `/apply/main/get?id=` + id })
|
||||||
|
},
|
||||||
|
|
||||||
|
// 新增立项申请
|
||||||
|
createMain: async (data: MainVO) => {
|
||||||
|
return await request.post({ url: `/apply/main/create`, data })
|
||||||
|
},
|
||||||
|
|
||||||
|
// 修改立项申请
|
||||||
|
updateMain: async (data: MainVO) => {
|
||||||
|
return await request.put({ url: `/apply/main/update`, data })
|
||||||
|
},
|
||||||
|
|
||||||
|
// 删除立项申请
|
||||||
|
deleteMain: async (id: number) => {
|
||||||
|
return await request.delete({ url: `/apply/main/delete?id=` + id })
|
||||||
|
},
|
||||||
|
|
||||||
|
// 导出立项申请 Excel
|
||||||
|
exportMain: async (params) => {
|
||||||
|
return await request.download({ url: `/apply/main/export-excel`, params })
|
||||||
|
},
|
||||||
|
|
||||||
|
// ==================== 子表(立项详细信息) ====================
|
||||||
|
|
||||||
|
// 获得立项详细信息
|
||||||
|
getInfoByApplyId: async (applyId) => {
|
||||||
|
return await request.get({ url: `/apply/main/info/get-by-apply-id?applyId=` + applyId })
|
||||||
|
},
|
||||||
|
|
||||||
|
// ==================== 子表(立项单位信息) ====================
|
||||||
|
|
||||||
|
// 获得立项单位信息列表
|
||||||
|
getUnitsListByApplyId: async (applyId) => {
|
||||||
|
return await request.get({ url: `/apply/main/units/list-by-apply-id?applyId=` + applyId })
|
||||||
|
},
|
||||||
|
|
||||||
|
// ==================== 子表(主要参加人员) ====================
|
||||||
|
|
||||||
|
// 获得主要参加人员列表
|
||||||
|
getParticipantListByApplyId: async (applyId) => {
|
||||||
|
return await request.get({ url: `/apply/main/participant/list-by-apply-id?applyId=` + applyId })
|
||||||
|
},
|
||||||
|
|
||||||
|
// ==================== 子表(立项实施计划) ====================
|
||||||
|
|
||||||
|
// 获得立项实施计划列表
|
||||||
|
getPlanListByApplyId: async (applyId) => {
|
||||||
|
return await request.get({ url: `/apply/main/plan/list-by-apply-id?applyId=` + applyId })
|
||||||
|
},
|
||||||
|
|
||||||
|
// ==================== 子表(立项经费) ====================
|
||||||
|
|
||||||
|
// 获得立项经费列表
|
||||||
|
getFundsListByApplyId: async (applyId) => {
|
||||||
|
return await request.get({ url: `/apply/main/funds/list-by-apply-id?applyId=` + applyId })
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,50 @@
|
||||||
|
import request from '@/config/axios'
|
||||||
|
|
||||||
|
// 变更主 VO
|
||||||
|
export interface MainVO {
|
||||||
|
id: string // id
|
||||||
|
contractId: string // 合同ID
|
||||||
|
changeType: string // 变更类型
|
||||||
|
changeContent: string // 变更内容
|
||||||
|
competentDeptId: string // 主管部门ID
|
||||||
|
competentDeptName: string // 主管部门
|
||||||
|
managerId: string // 主管工程师ID
|
||||||
|
managerName: string // 主管工程师
|
||||||
|
createdBy: string // 创建人
|
||||||
|
createdTime: Date // 创建时间
|
||||||
|
updatedBy: string // 更新人
|
||||||
|
updatedTime: Date // 更新时间
|
||||||
|
}
|
||||||
|
|
||||||
|
// 变更主 API
|
||||||
|
export const MainApi = {
|
||||||
|
// 查询变更主分页
|
||||||
|
getMainPage: async (params: any) => {
|
||||||
|
return await request.get({ url: `/change/main/page`, params })
|
||||||
|
},
|
||||||
|
|
||||||
|
// 查询变更主详情
|
||||||
|
getMain: async (id: number) => {
|
||||||
|
return await request.get({ url: `/change/main/get?id=` + id })
|
||||||
|
},
|
||||||
|
|
||||||
|
// 新增变更主
|
||||||
|
createMain: async (data: MainVO) => {
|
||||||
|
return await request.post({ url: `/change/main/create`, data })
|
||||||
|
},
|
||||||
|
|
||||||
|
// 修改变更主
|
||||||
|
updateMain: async (data: MainVO) => {
|
||||||
|
return await request.put({ url: `/change/main/update`, data })
|
||||||
|
},
|
||||||
|
|
||||||
|
// 删除变更主
|
||||||
|
deleteMain: async (id: number) => {
|
||||||
|
return await request.delete({ url: `/change/main/delete?id=` + id })
|
||||||
|
},
|
||||||
|
|
||||||
|
// 导出变更主 Excel
|
||||||
|
exportMain: async (params) => {
|
||||||
|
return await request.download({ url: `/change/main/export-excel`, params })
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,107 @@
|
||||||
|
import request from '@/config/axios'
|
||||||
|
|
||||||
|
// 合同(任务书)信息主 VO
|
||||||
|
export interface MainVO {
|
||||||
|
id: string // id
|
||||||
|
code: string // 合同编号
|
||||||
|
name: string // 任务名称
|
||||||
|
technicalField: string // 所属技术领域
|
||||||
|
planId: string // 计划类型Id
|
||||||
|
planName: string // 计划类型名称
|
||||||
|
year: string // 年度
|
||||||
|
beginDate: string // 开始时间
|
||||||
|
endData: string // 结束时间
|
||||||
|
directorId: string // 负责人Id
|
||||||
|
director: string // 负责人姓名
|
||||||
|
gender: string // 负责人性别
|
||||||
|
age: string // 年龄
|
||||||
|
education: string // 学历
|
||||||
|
major: string // 所学专业
|
||||||
|
engagMajor: string // 从事专业
|
||||||
|
position: string // 职务(职称)
|
||||||
|
phoneNo: string // 电话
|
||||||
|
email: string // 邮箱
|
||||||
|
fax: string // 传真
|
||||||
|
postalCode: string // 邮编
|
||||||
|
address: string // 通讯地址
|
||||||
|
achievement: string // 主要业绩
|
||||||
|
competentDeptId: string // 主管部门ID
|
||||||
|
competentDeptName: string // 主管部门
|
||||||
|
managerId: string // 主管工程师ID
|
||||||
|
managerName: string // 主管工程师
|
||||||
|
}
|
||||||
|
|
||||||
|
// 合同(任务书)信息主 API
|
||||||
|
export const MainApi = {
|
||||||
|
// 查询合同(任务书)信息主分页
|
||||||
|
getMainPage: async (params: any) => {
|
||||||
|
return await request.get({ url: `/contract/main/page`, params })
|
||||||
|
},
|
||||||
|
|
||||||
|
// 查询合同(任务书)信息主详情
|
||||||
|
getMain: async (id: number) => {
|
||||||
|
return await request.get({ url: `/contract/main/get?id=` + id })
|
||||||
|
},
|
||||||
|
|
||||||
|
// 新增合同(任务书)信息主
|
||||||
|
createMain: async (data: MainVO) => {
|
||||||
|
return await request.post({ url: `/contract/main/create`, data })
|
||||||
|
},
|
||||||
|
|
||||||
|
// 修改合同(任务书)信息主
|
||||||
|
updateMain: async (data: MainVO) => {
|
||||||
|
return await request.put({ url: `/contract/main/update`, data })
|
||||||
|
},
|
||||||
|
|
||||||
|
// 删除合同(任务书)信息主
|
||||||
|
deleteMain: async (id: number) => {
|
||||||
|
return await request.delete({ url: `/contract/main/delete?id=` + id })
|
||||||
|
},
|
||||||
|
|
||||||
|
// 导出合同(任务书)信息主 Excel
|
||||||
|
exportMain: async (params) => {
|
||||||
|
return await request.download({ url: `/contract/main/export-excel`, params })
|
||||||
|
},
|
||||||
|
|
||||||
|
// ==================== 子表(合同预期主要成果形式、知识产权归属) ====================
|
||||||
|
|
||||||
|
// 获得合同预期主要成果形式、知识产权归属列表
|
||||||
|
getAchieListByContractId: async (contractId) => {
|
||||||
|
return await request.get({ url: `/contract/main/achie/list-by-contract-id?contractId=` + contractId })
|
||||||
|
},
|
||||||
|
|
||||||
|
// ==================== 子表(合同经费) ====================
|
||||||
|
|
||||||
|
// 获得合同经费列表
|
||||||
|
getFundsListByContractId: async (contractId) => {
|
||||||
|
return await request.get({ url: `/contract/main/funds/list-by-contract-id?contractId=` + contractId })
|
||||||
|
},
|
||||||
|
|
||||||
|
// ==================== 子表(合同详细信息) ====================
|
||||||
|
|
||||||
|
// 获得合同详细信息
|
||||||
|
getInfoByContractId: async (contractId) => {
|
||||||
|
return await request.get({ url: `/contract/main/info/get-by-contract-id?contractId=` + contractId })
|
||||||
|
},
|
||||||
|
|
||||||
|
// ==================== 子表(合同主要参加人员) ====================
|
||||||
|
|
||||||
|
// 获得合同主要参加人员列表
|
||||||
|
getParticipantListByContractId: async (contractId) => {
|
||||||
|
return await request.get({ url: `/contract/main/participant/list-by-contract-id?contractId=` + contractId })
|
||||||
|
},
|
||||||
|
|
||||||
|
// ==================== 子表(合同实施计划) ====================
|
||||||
|
|
||||||
|
// 获得合同实施计划列表
|
||||||
|
getPlanListByContractId: async (contractId) => {
|
||||||
|
return await request.get({ url: `/contract/main/plan/list-by-contract-id?contractId=` + contractId })
|
||||||
|
},
|
||||||
|
|
||||||
|
// ==================== 子表(合同单位信息) ====================
|
||||||
|
|
||||||
|
// 获得合同单位信息列表
|
||||||
|
getUnitsListByContractId: async (contractId) => {
|
||||||
|
return await request.get({ url: `/contract/main/units/list-by-contract-id?contractId=` + contractId })
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,59 @@
|
||||||
|
import request from '@/config/axios'
|
||||||
|
|
||||||
|
// 专利信息 VO
|
||||||
|
export interface MainVO {
|
||||||
|
id: string // id
|
||||||
|
contractId: string // 合同id
|
||||||
|
contractCode: string // 合同编号
|
||||||
|
name: string // 专利名称
|
||||||
|
number: string // 专利号
|
||||||
|
inventorName: string // 发明人姓名
|
||||||
|
filingDate: string // 申请日期
|
||||||
|
publicationDate: string // 公开日期
|
||||||
|
grantDate: string // 授权日期
|
||||||
|
patentType: string // 专利类型(如发明、实用新型、外观设计等)
|
||||||
|
patenteeName: string // 专利权人姓名或公司名称
|
||||||
|
relatedTechArea: string // 相关技术领域
|
||||||
|
technicalEffect: string // 技术效果
|
||||||
|
legalStatus: string // 法律状态(如审查中、已授权、无效等)
|
||||||
|
}
|
||||||
|
|
||||||
|
// 专利信息 API
|
||||||
|
export const MainApi = {
|
||||||
|
// 查询专利信息分页
|
||||||
|
getMainPage: async (params: any) => {
|
||||||
|
return await request.get({ url: `/patents/main/page`, params })
|
||||||
|
},
|
||||||
|
|
||||||
|
// 查询专利信息详情
|
||||||
|
getMain: async (id: number) => {
|
||||||
|
return await request.get({ url: `/patents/main/get?id=` + id })
|
||||||
|
},
|
||||||
|
|
||||||
|
// 新增专利信息
|
||||||
|
createMain: async (data: MainVO) => {
|
||||||
|
return await request.post({ url: `/patents/main/create`, data })
|
||||||
|
},
|
||||||
|
|
||||||
|
// 修改专利信息
|
||||||
|
updateMain: async (data: MainVO) => {
|
||||||
|
return await request.put({ url: `/patents/main/update`, data })
|
||||||
|
},
|
||||||
|
|
||||||
|
// 删除专利信息
|
||||||
|
deleteMain: async (id: number) => {
|
||||||
|
return await request.delete({ url: `/patents/main/delete?id=` + id })
|
||||||
|
},
|
||||||
|
|
||||||
|
// 导出专利信息 Excel
|
||||||
|
exportMain: async (params) => {
|
||||||
|
return await request.download({ url: `/patents/main/export-excel`, params })
|
||||||
|
},
|
||||||
|
|
||||||
|
// ==================== 子表(专利信息) ====================
|
||||||
|
|
||||||
|
// 获得专利信息列表
|
||||||
|
getInfoListByPatentsId: async (patentsId) => {
|
||||||
|
return await request.get({ url: `/patents/main/info/list-by-patents-id?patentsId=` + patentsId })
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,60 @@
|
||||||
|
import request from '@/config/axios'
|
||||||
|
|
||||||
|
// 执行主 VO
|
||||||
|
export interface MainVO {
|
||||||
|
id: string // id
|
||||||
|
contractId: string // 合同主键Id
|
||||||
|
contractCode: string // 合同编号
|
||||||
|
section: string // 执行区段
|
||||||
|
progress: string // 进展情况(正常,拖延,停顿)
|
||||||
|
directorId: string // 负责人Id
|
||||||
|
director: string // 负责人姓名
|
||||||
|
competentDeptId: string // 主管部门ID
|
||||||
|
competentDeptName: string // 主管部门
|
||||||
|
managerId: string // 主管工程师ID
|
||||||
|
managerName: string // 主管工程师
|
||||||
|
createdBy: string // 创建人
|
||||||
|
createdTime: Date // 创建时间
|
||||||
|
updatedBy: string // 更新人
|
||||||
|
updatedTime: Date // 更新时间
|
||||||
|
}
|
||||||
|
|
||||||
|
// 执行主 API
|
||||||
|
export const MainApi = {
|
||||||
|
// 查询执行主分页
|
||||||
|
getMainPage: async (params: any) => {
|
||||||
|
return await request.get({ url: `/process/main/page`, params })
|
||||||
|
},
|
||||||
|
|
||||||
|
// 查询执行主详情
|
||||||
|
getMain: async (id: number) => {
|
||||||
|
return await request.get({ url: `/process/main/get?id=` + id })
|
||||||
|
},
|
||||||
|
|
||||||
|
// 新增执行主
|
||||||
|
createMain: async (data: MainVO) => {
|
||||||
|
return await request.post({ url: `/process/main/create`, data })
|
||||||
|
},
|
||||||
|
|
||||||
|
// 修改执行主
|
||||||
|
updateMain: async (data: MainVO) => {
|
||||||
|
return await request.put({ url: `/process/main/update`, data })
|
||||||
|
},
|
||||||
|
|
||||||
|
// 删除执行主
|
||||||
|
deleteMain: async (id: number) => {
|
||||||
|
return await request.delete({ url: `/process/main/delete?id=` + id })
|
||||||
|
},
|
||||||
|
|
||||||
|
// 导出执行主 Excel
|
||||||
|
exportMain: async (params) => {
|
||||||
|
return await request.download({ url: `/process/main/export-excel`, params })
|
||||||
|
},
|
||||||
|
|
||||||
|
// ==================== 子表(执行详细信息) ====================
|
||||||
|
|
||||||
|
// 获得执行详细信息
|
||||||
|
getInfoByProcessId: async (processId) => {
|
||||||
|
return await request.get({ url: `/process/main/info/get-by-process-id?processId=` + processId })
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,49 @@
|
||||||
|
import request from '@/config/axios'
|
||||||
|
|
||||||
|
// 公共实验室信 VO
|
||||||
|
export interface LabInfoVO {
|
||||||
|
id: string // id
|
||||||
|
userName: string // 用户姓名
|
||||||
|
userContact: string // 用户联系方式
|
||||||
|
reservationDate: string // 预约日期
|
||||||
|
labName: string // 实验室名称
|
||||||
|
reservationDuration: string // 预约时长(小时)
|
||||||
|
status: string // 预约状态(如待审核、已确认、已拒绝等)
|
||||||
|
reviewerId: string // 审核人ID
|
||||||
|
reviewerName: string // 审核人姓名
|
||||||
|
reviewComments: string // 审核意见(如有)
|
||||||
|
reservationNotes: string // 预约备注(如有)
|
||||||
|
}
|
||||||
|
|
||||||
|
// 公共实验室信 API
|
||||||
|
export const LabInfoApi = {
|
||||||
|
// 查询公共实验室信分页
|
||||||
|
getLabInfoPage: async (params: any) => {
|
||||||
|
return await request.get({ url: `/publicLab/lab-info/page`, params })
|
||||||
|
},
|
||||||
|
|
||||||
|
// 查询公共实验室信详情
|
||||||
|
getLabInfo: async (id: number) => {
|
||||||
|
return await request.get({ url: `/publicLab/lab-info/get?id=` + id })
|
||||||
|
},
|
||||||
|
|
||||||
|
// 新增公共实验室信
|
||||||
|
createLabInfo: async (data: LabInfoVO) => {
|
||||||
|
return await request.post({ url: `/publicLab/lab-info/create`, data })
|
||||||
|
},
|
||||||
|
|
||||||
|
// 修改公共实验室信
|
||||||
|
updateLabInfo: async (data: LabInfoVO) => {
|
||||||
|
return await request.put({ url: `/publicLab/lab-info/update`, data })
|
||||||
|
},
|
||||||
|
|
||||||
|
// 删除公共实验室信
|
||||||
|
deleteLabInfo: async (id: number) => {
|
||||||
|
return await request.delete({ url: `/publicLab/lab-info/delete?id=` + id })
|
||||||
|
},
|
||||||
|
|
||||||
|
// 导出公共实验室信 Excel
|
||||||
|
exportLabInfo: async (params) => {
|
||||||
|
return await request.download({ url: `/publicLab/lab-info/export-excel`, params })
|
||||||
|
},
|
||||||
|
}
|
||||||
Binary file not shown.
|
Before Width: | Height: | Size: 2.7 KiB After Width: | Height: | Size: 7.8 KiB |
|
|
@ -114,7 +114,7 @@ export default {
|
||||||
},
|
},
|
||||||
login: {
|
login: {
|
||||||
welcome: '欢迎使用本系统',
|
welcome: '欢迎使用本系统',
|
||||||
message: '开箱即用的中后台管理系统',
|
message: '北京金隅集团科研管理系统',
|
||||||
tenantname: '租户名称',
|
tenantname: '租户名称',
|
||||||
username: '用户名',
|
username: '用户名',
|
||||||
password: '密码',
|
password: '密码',
|
||||||
|
|
@ -368,7 +368,7 @@ export default {
|
||||||
qrSignInFormTitle: '二维码登录',
|
qrSignInFormTitle: '二维码登录',
|
||||||
signUpFormTitle: '注册',
|
signUpFormTitle: '注册',
|
||||||
forgetFormTitle: '重置密码',
|
forgetFormTitle: '重置密码',
|
||||||
signInTitle: '开箱即用的中后台管理系统',
|
signInTitle: '北京金隅集团科研管理系统',
|
||||||
signInDesc: '输入您的个人详细信息开始使用!',
|
signInDesc: '输入您的个人详细信息开始使用!',
|
||||||
policy: '我同意xxx隐私政策',
|
policy: '我同意xxx隐私政策',
|
||||||
scanSign: `扫码后点击"确认",即可完成登录`,
|
scanSign: `扫码后点击"确认",即可完成登录`,
|
||||||
|
|
|
||||||
|
|
@ -48,14 +48,14 @@
|
||||||
>
|
>
|
||||||
<!-- 账号登录 -->
|
<!-- 账号登录 -->
|
||||||
<LoginForm class="m-auto h-auto p-20px lt-xl:(rounded-3xl light:bg-white)" />
|
<LoginForm class="m-auto h-auto p-20px lt-xl:(rounded-3xl light:bg-white)" />
|
||||||
<!-- 手机登录 -->
|
<!-- <!– 手机登录 –>
|
||||||
<MobileForm class="m-auto h-auto p-20px lt-xl:(rounded-3xl light:bg-white)" />
|
<MobileForm class="m-auto h-auto p-20px lt-xl:(rounded-3xl light:bg-white)" />
|
||||||
<!-- 二维码登录 -->
|
<!– 二维码登录 –>
|
||||||
<QrCodeForm class="m-auto h-auto p-20px lt-xl:(rounded-3xl light:bg-white)" />
|
<QrCodeForm class="m-auto h-auto p-20px lt-xl:(rounded-3xl light:bg-white)" />
|
||||||
<!-- 注册 -->
|
<!– 注册 –>
|
||||||
<RegisterForm class="m-auto h-auto p-20px lt-xl:(rounded-3xl light:bg-white)" />
|
<RegisterForm class="m-auto h-auto p-20px lt-xl:(rounded-3xl light:bg-white)" />
|
||||||
<!-- 三方登录 -->
|
<!– 三方登录 –>
|
||||||
<SSOLoginVue class="m-auto h-auto p-20px lt-xl:(rounded-3xl light:bg-white)" />
|
<SSOLoginVue class="m-auto h-auto p-20px lt-xl:(rounded-3xl light:bg-white)" />-->
|
||||||
</div>
|
</div>
|
||||||
</Transition>
|
</Transition>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
||||||
|
|
@ -82,7 +82,7 @@
|
||||||
mode="pop"
|
mode="pop"
|
||||||
@success="handleLogin"
|
@success="handleLogin"
|
||||||
/>
|
/>
|
||||||
<el-col :span="24" style="padding-right: 10px; padding-left: 10px">
|
<!-- <el-col :span="24" style="padding-right: 10px; padding-left: 10px">
|
||||||
<el-form-item>
|
<el-form-item>
|
||||||
<el-row :gutter="5" justify="space-between" style="width: 100%">
|
<el-row :gutter="5" justify="space-between" style="width: 100%">
|
||||||
<el-col :span="8">
|
<el-col :span="8">
|
||||||
|
|
@ -108,8 +108,8 @@
|
||||||
</el-col>
|
</el-col>
|
||||||
</el-row>
|
</el-row>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>-->
|
||||||
<el-divider content-position="center">{{ t('login.otherLogin') }}</el-divider>
|
<!-- <el-divider content-position="center">{{ t('login.otherLogin') }}</el-divider>
|
||||||
<el-col :span="24" style="padding-right: 10px; padding-left: 10px">
|
<el-col :span="24" style="padding-right: 10px; padding-left: 10px">
|
||||||
<el-form-item>
|
<el-form-item>
|
||||||
<div class="w-[100%] flex justify-between">
|
<div class="w-[100%] flex justify-between">
|
||||||
|
|
@ -124,8 +124,8 @@
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>-->
|
||||||
<el-divider content-position="center">萌新必读</el-divider>
|
<!-- <el-divider content-position="center">萌新必读</el-divider>
|
||||||
<el-col :span="24" style="padding-right: 10px; padding-left: 10px">
|
<el-col :span="24" style="padding-right: 10px; padding-left: 10px">
|
||||||
<el-form-item>
|
<el-form-item>
|
||||||
<div class="w-[100%] flex justify-between">
|
<div class="w-[100%] flex justify-between">
|
||||||
|
|
@ -139,7 +139,7 @@
|
||||||
</el-link>
|
</el-link>
|
||||||
</div>
|
</div>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>-->
|
||||||
</el-row>
|
</el-row>
|
||||||
</el-form>
|
</el-form>
|
||||||
</template>
|
</template>
|
||||||
|
|
@ -184,7 +184,7 @@ const loginData = reactive({
|
||||||
captchaEnable: import.meta.env.VITE_APP_CAPTCHA_ENABLE,
|
captchaEnable: import.meta.env.VITE_APP_CAPTCHA_ENABLE,
|
||||||
tenantEnable: import.meta.env.VITE_APP_TENANT_ENABLE,
|
tenantEnable: import.meta.env.VITE_APP_TENANT_ENABLE,
|
||||||
loginForm: {
|
loginForm: {
|
||||||
tenantName: '芋道源码',
|
tenantName: '金隅集团',
|
||||||
username: 'admin',
|
username: 'admin',
|
||||||
password: 'admin123',
|
password: 'admin123',
|
||||||
captchaVerification: '',
|
captchaVerification: '',
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,208 @@
|
||||||
|
<template>
|
||||||
|
<Dialog :title="dialogTitle" v-model="dialogVisible">
|
||||||
|
<el-form
|
||||||
|
ref="formRef"
|
||||||
|
:model="formData"
|
||||||
|
:rules="formRules"
|
||||||
|
label-width="100px"
|
||||||
|
v-loading="formLoading"
|
||||||
|
>
|
||||||
|
<el-form-item label="合同主键ID" prop="contractId">
|
||||||
|
<el-input v-model="formData.contractId" placeholder="请输入合同主键ID" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="课题编号" prop="code">
|
||||||
|
<el-input v-model="formData.code" placeholder="请输入课题编号" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="年度" prop="year">
|
||||||
|
<el-input v-model="formData.year" placeholder="请输入年度" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="课题名称" prop="name">
|
||||||
|
<el-input v-model="formData.name" placeholder="请输入课题名称" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="开始时间" prop="beginDate">
|
||||||
|
<el-date-picker
|
||||||
|
v-model="formData.beginDate"
|
||||||
|
type="date"
|
||||||
|
value-format="x"
|
||||||
|
placeholder="选择开始时间"
|
||||||
|
/>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="结束时间" prop="endData">
|
||||||
|
<el-date-picker
|
||||||
|
v-model="formData.endData"
|
||||||
|
type="date"
|
||||||
|
value-format="x"
|
||||||
|
placeholder="选择结束时间"
|
||||||
|
/>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="主管部门ID" prop="competentDeptId">
|
||||||
|
<el-input v-model="formData.competentDeptId" placeholder="请输入主管部门ID" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="主管部门" prop="competentDeptName">
|
||||||
|
<el-input v-model="formData.competentDeptName" placeholder="请输入主管部门" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="主管工程师ID" prop="managerId">
|
||||||
|
<el-input v-model="formData.managerId" placeholder="请输入主管工程师ID" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="主管工程师" prop="managerName">
|
||||||
|
<el-input v-model="formData.managerName" placeholder="请输入主管工程师" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="创建人" prop="createdBy">
|
||||||
|
<el-input v-model="formData.createdBy" placeholder="请输入创建人" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="创建时间" prop="createdTime">
|
||||||
|
<el-date-picker
|
||||||
|
v-model="formData.createdTime"
|
||||||
|
type="date"
|
||||||
|
value-format="x"
|
||||||
|
placeholder="选择创建时间"
|
||||||
|
/>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="更新人" prop="updatedBy">
|
||||||
|
<el-input v-model="formData.updatedBy" placeholder="请输入更新人" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="更新时间" prop="updatedTime">
|
||||||
|
<el-date-picker
|
||||||
|
v-model="formData.updatedTime"
|
||||||
|
type="date"
|
||||||
|
value-format="x"
|
||||||
|
placeholder="选择更新时间"
|
||||||
|
/>
|
||||||
|
</el-form-item>
|
||||||
|
</el-form>
|
||||||
|
<!-- 子表的表单 -->
|
||||||
|
<el-tabs v-model="subTabsName">
|
||||||
|
<el-tab-pane label="验收详细信息" name="info">
|
||||||
|
<InfoForm ref="infoFormRef" :acceptance-id="formData.id" />
|
||||||
|
</el-tab-pane>
|
||||||
|
<el-tab-pane label="验收经费" name="funds">
|
||||||
|
<FundsForm ref="fundsFormRef" :acceptance-id="formData.id" />
|
||||||
|
</el-tab-pane>
|
||||||
|
</el-tabs>
|
||||||
|
<template #footer>
|
||||||
|
<el-button @click="submitForm" type="primary" :disabled="formLoading">确 定</el-button>
|
||||||
|
<el-button @click="dialogVisible = false">取 消</el-button>
|
||||||
|
</template>
|
||||||
|
</Dialog>
|
||||||
|
</template>
|
||||||
|
<script setup lang="ts">
|
||||||
|
import { MainApi, MainVO } from '@/api/acceptance/acceptance'
|
||||||
|
import InfoForm from './components/InfoForm.vue'
|
||||||
|
import FundsForm from './components/FundsForm.vue'
|
||||||
|
|
||||||
|
/** 验收主 表单 */
|
||||||
|
defineOptions({ name: 'MainForm' })
|
||||||
|
|
||||||
|
const { t } = useI18n() // 国际化
|
||||||
|
const message = useMessage() // 消息弹窗
|
||||||
|
|
||||||
|
const dialogVisible = ref(false) // 弹窗的是否展示
|
||||||
|
const dialogTitle = ref('') // 弹窗的标题
|
||||||
|
const formLoading = ref(false) // 表单的加载中:1)修改时的数据加载;2)提交的按钮禁用
|
||||||
|
const formType = ref('') // 表单的类型:create - 新增;update - 修改
|
||||||
|
const formData = ref({
|
||||||
|
id: undefined,
|
||||||
|
contractId: undefined,
|
||||||
|
code: undefined,
|
||||||
|
year: undefined,
|
||||||
|
name: undefined,
|
||||||
|
beginDate: undefined,
|
||||||
|
endData: undefined,
|
||||||
|
competentDeptId: undefined,
|
||||||
|
competentDeptName: undefined,
|
||||||
|
managerId: undefined,
|
||||||
|
managerName: undefined,
|
||||||
|
createdBy: undefined,
|
||||||
|
createdTime: undefined,
|
||||||
|
updatedBy: undefined,
|
||||||
|
updatedTime: undefined,
|
||||||
|
})
|
||||||
|
const formRules = reactive({
|
||||||
|
})
|
||||||
|
const formRef = ref() // 表单 Ref
|
||||||
|
|
||||||
|
/** 子表的表单 */
|
||||||
|
const subTabsName = ref('info')
|
||||||
|
const infoFormRef = ref()
|
||||||
|
const fundsFormRef = ref()
|
||||||
|
|
||||||
|
/** 打开弹窗 */
|
||||||
|
const open = async (type: string, id?: number) => {
|
||||||
|
dialogVisible.value = true
|
||||||
|
dialogTitle.value = t('action.' + type)
|
||||||
|
formType.value = type
|
||||||
|
resetForm()
|
||||||
|
// 修改时,设置数据
|
||||||
|
if (id) {
|
||||||
|
formLoading.value = true
|
||||||
|
try {
|
||||||
|
formData.value = await MainApi.getMain(id)
|
||||||
|
} finally {
|
||||||
|
formLoading.value = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
defineExpose({ open }) // 提供 open 方法,用于打开弹窗
|
||||||
|
|
||||||
|
/** 提交表单 */
|
||||||
|
const emit = defineEmits(['success']) // 定义 success 事件,用于操作成功后的回调
|
||||||
|
const submitForm = async () => {
|
||||||
|
// 校验表单
|
||||||
|
await formRef.value.validate()
|
||||||
|
// 校验子表单
|
||||||
|
try {
|
||||||
|
await infoFormRef.value.validate()
|
||||||
|
} catch (e) {
|
||||||
|
subTabsName.value = 'info'
|
||||||
|
return
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
await fundsFormRef.value.validate()
|
||||||
|
} catch (e) {
|
||||||
|
subTabsName.value = 'funds'
|
||||||
|
return
|
||||||
|
}
|
||||||
|
// 提交请求
|
||||||
|
formLoading.value = true
|
||||||
|
try {
|
||||||
|
const data = formData.value as unknown as MainVO
|
||||||
|
// 拼接子表的数据
|
||||||
|
data.info = infoFormRef.value.getData()
|
||||||
|
data.fundss = fundsFormRef.value.getData()
|
||||||
|
if (formType.value === 'create') {
|
||||||
|
await MainApi.createMain(data)
|
||||||
|
message.success(t('common.createSuccess'))
|
||||||
|
} else {
|
||||||
|
await MainApi.updateMain(data)
|
||||||
|
message.success(t('common.updateSuccess'))
|
||||||
|
}
|
||||||
|
dialogVisible.value = false
|
||||||
|
// 发送操作成功的事件
|
||||||
|
emit('success')
|
||||||
|
} finally {
|
||||||
|
formLoading.value = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 重置表单 */
|
||||||
|
const resetForm = () => {
|
||||||
|
formData.value = {
|
||||||
|
id: undefined,
|
||||||
|
contractId: undefined,
|
||||||
|
code: undefined,
|
||||||
|
year: undefined,
|
||||||
|
name: undefined,
|
||||||
|
beginDate: undefined,
|
||||||
|
endData: undefined,
|
||||||
|
competentDeptId: undefined,
|
||||||
|
competentDeptName: undefined,
|
||||||
|
managerId: undefined,
|
||||||
|
managerName: undefined,
|
||||||
|
createdBy: undefined,
|
||||||
|
createdTime: undefined,
|
||||||
|
updatedBy: undefined,
|
||||||
|
updatedTime: undefined,
|
||||||
|
}
|
||||||
|
formRef.value?.resetFields()
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
@ -0,0 +1,137 @@
|
||||||
|
<template>
|
||||||
|
<el-form
|
||||||
|
ref="formRef"
|
||||||
|
:model="formData"
|
||||||
|
:rules="formRules"
|
||||||
|
v-loading="formLoading"
|
||||||
|
label-width="0px"
|
||||||
|
:inline-message="true"
|
||||||
|
>
|
||||||
|
<el-table :data="formData" class="-mt-10px">
|
||||||
|
<el-table-column label="序号" type="index" width="100" />
|
||||||
|
<el-table-column label="经费来源ID" min-width="150">
|
||||||
|
<template #default="{ row, $index }">
|
||||||
|
<el-form-item :prop="`${$index}.sourceId`" :rules="formRules.sourceId" class="mb-0px!">
|
||||||
|
<el-input v-model="row.sourceId" placeholder="请输入经费来源ID" />
|
||||||
|
</el-form-item>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="支出类型ID" min-width="150">
|
||||||
|
<template #default="{ row, $index }">
|
||||||
|
<el-form-item :prop="`${$index}.expenseId`" :rules="formRules.expenseId" class="mb-0px!">
|
||||||
|
<el-input v-model="row.expenseId" placeholder="请输入支出类型ID" />
|
||||||
|
</el-form-item>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="经费科目" min-width="150">
|
||||||
|
<template #default="{ row, $index }">
|
||||||
|
<el-form-item :prop="`${$index}.secondaryCategory`" :rules="formRules.secondaryCategory" class="mb-0px!">
|
||||||
|
<el-input v-model="row.secondaryCategory" placeholder="请输入经费科目" />
|
||||||
|
</el-form-item>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="经费金额" min-width="150">
|
||||||
|
<template #default="{ row, $index }">
|
||||||
|
<el-form-item :prop="`${$index}.amount`" :rules="formRules.amount" class="mb-0px!">
|
||||||
|
<el-input v-model="row.amount" placeholder="请输入经费金额" />
|
||||||
|
</el-form-item>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="经费年度" min-width="150">
|
||||||
|
<template #default="{ row, $index }">
|
||||||
|
<el-form-item :prop="`${$index}.fiscalYear`" :rules="formRules.fiscalYear" class="mb-0px!">
|
||||||
|
<el-input v-model="row.fiscalYear" placeholder="请输入经费年度" />
|
||||||
|
</el-form-item>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="总金额" min-width="150">
|
||||||
|
<template #default="{ row, $index }">
|
||||||
|
<el-form-item :prop="`${$index}.totalAmount`" :rules="formRules.totalAmount" class="mb-0px!">
|
||||||
|
<el-input v-model="row.totalAmount" placeholder="请输入总金额" />
|
||||||
|
</el-form-item>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="单位名称" min-width="150">
|
||||||
|
<template #default="{ row, $index }">
|
||||||
|
<el-form-item :prop="`${$index}.unitName`" :rules="formRules.unitName" class="mb-0px!">
|
||||||
|
<el-input v-model="row.unitName" placeholder="请输入单位名称" />
|
||||||
|
</el-form-item>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column align="center" fixed="right" label="操作" width="60">
|
||||||
|
<template #default="{ $index }">
|
||||||
|
<el-button @click="handleDelete($index)" link>—</el-button>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
</el-table>
|
||||||
|
</el-form>
|
||||||
|
<el-row justify="center" class="mt-3">
|
||||||
|
<el-button @click="handleAdd" round>+ 添加验收经费</el-button>
|
||||||
|
</el-row>
|
||||||
|
</template>
|
||||||
|
<script setup lang="ts">
|
||||||
|
import { MainApi } from '@/api/acceptance/acceptance'
|
||||||
|
|
||||||
|
const props = defineProps<{
|
||||||
|
acceptanceId: undefined // 验收ID(主表的关联字段)
|
||||||
|
}>()
|
||||||
|
const formLoading = ref(false) // 表单的加载中
|
||||||
|
const formData = ref([])
|
||||||
|
const formRules = reactive({
|
||||||
|
})
|
||||||
|
const formRef = ref() // 表单 Ref
|
||||||
|
|
||||||
|
/** 监听主表的关联字段的变化,加载对应的子表数据 */
|
||||||
|
watch(
|
||||||
|
() => props.acceptanceId,
|
||||||
|
async (val) => {
|
||||||
|
// 1. 重置表单
|
||||||
|
formData.value = []
|
||||||
|
// 2. val 非空,则加载数据
|
||||||
|
if (!val) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
formLoading.value = true
|
||||||
|
formData.value = await MainApi.getFundsListByAcceptanceId(val)
|
||||||
|
} finally {
|
||||||
|
formLoading.value = false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{ immediate: true }
|
||||||
|
)
|
||||||
|
|
||||||
|
/** 新增按钮操作 */
|
||||||
|
const handleAdd = () => {
|
||||||
|
const row = {
|
||||||
|
id: undefined,
|
||||||
|
acceptanceId: undefined,
|
||||||
|
sourceId: undefined,
|
||||||
|
expenseId: undefined,
|
||||||
|
secondaryCategory: undefined,
|
||||||
|
amount: undefined,
|
||||||
|
fiscalYear: undefined,
|
||||||
|
totalAmount: undefined,
|
||||||
|
unitName: undefined,
|
||||||
|
}
|
||||||
|
row.acceptanceId = props.acceptanceId
|
||||||
|
formData.value.push(row)
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 删除按钮操作 */
|
||||||
|
const handleDelete = (index) => {
|
||||||
|
formData.value.splice(index, 1)
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 表单校验 */
|
||||||
|
const validate = () => {
|
||||||
|
return formRef.value.validate()
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 表单值 */
|
||||||
|
const getData = () => {
|
||||||
|
return formData.value
|
||||||
|
}
|
||||||
|
|
||||||
|
defineExpose({ validate, getData })
|
||||||
|
</script>
|
||||||
|
|
@ -0,0 +1,120 @@
|
||||||
|
<template>
|
||||||
|
<!-- 列表 -->
|
||||||
|
<ContentWrap>
|
||||||
|
<el-button
|
||||||
|
type="primary"
|
||||||
|
plain
|
||||||
|
@click="openForm('create')"
|
||||||
|
v-hasPermi="['acceptance:main:create']"
|
||||||
|
>
|
||||||
|
<Icon icon="ep:plus" class="mr-5px" /> 新增
|
||||||
|
</el-button>
|
||||||
|
<el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true">
|
||||||
|
<el-table-column label="主键ID" align="center" prop="id" />
|
||||||
|
<el-table-column label="经费科目" align="center" prop="secondaryCategory" />
|
||||||
|
<el-table-column label="经费金额" align="center" prop="amount" />
|
||||||
|
<el-table-column label="经费年度" align="center" prop="fiscalYear" />
|
||||||
|
<el-table-column label="总金额" align="center" prop="totalAmount" />
|
||||||
|
<el-table-column label="单位名称" align="center" prop="unitName" />
|
||||||
|
<el-table-column label="操作" align="center">
|
||||||
|
<template #default="scope">
|
||||||
|
<el-button
|
||||||
|
link
|
||||||
|
type="primary"
|
||||||
|
@click="openForm('update', scope.row.id)"
|
||||||
|
v-hasPermi="['acceptance:main:update']"
|
||||||
|
>
|
||||||
|
编辑
|
||||||
|
</el-button>
|
||||||
|
<el-button
|
||||||
|
link
|
||||||
|
type="danger"
|
||||||
|
@click="handleDelete(scope.row.id)"
|
||||||
|
v-hasPermi="['acceptance:main:delete']"
|
||||||
|
>
|
||||||
|
删除
|
||||||
|
</el-button>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
</el-table>
|
||||||
|
<!-- 分页 -->
|
||||||
|
<Pagination
|
||||||
|
:total="total"
|
||||||
|
v-model:page="queryParams.pageNo"
|
||||||
|
v-model:limit="queryParams.pageSize"
|
||||||
|
@pagination="getList"
|
||||||
|
/>
|
||||||
|
</ContentWrap>
|
||||||
|
<!-- 表单弹窗:添加/修改 -->
|
||||||
|
<FundsForm ref="formRef" @success="getList" />
|
||||||
|
</template>
|
||||||
|
<script setup lang="ts">
|
||||||
|
import { MainApi } from '@/api/acceptance/acceptance'
|
||||||
|
import FundsForm from './FundsForm.vue'
|
||||||
|
|
||||||
|
const { t } = useI18n() // 国际化
|
||||||
|
const message = useMessage() // 消息弹窗
|
||||||
|
|
||||||
|
const props = defineProps<{
|
||||||
|
acceptanceId: undefined // 验收ID(主表的关联字段)
|
||||||
|
}>()
|
||||||
|
const loading = ref(false) // 列表的加载中
|
||||||
|
const list = ref([]) // 列表的数据
|
||||||
|
const total = ref(0) // 列表的总页数
|
||||||
|
const queryParams = reactive({
|
||||||
|
pageNo: 1,
|
||||||
|
pageSize: 10,
|
||||||
|
acceptanceId: undefined
|
||||||
|
})
|
||||||
|
|
||||||
|
/** 监听主表的关联字段的变化,加载对应的子表数据 */
|
||||||
|
watch(
|
||||||
|
() => props.acceptanceId,
|
||||||
|
(val) => {
|
||||||
|
queryParams.acceptanceId = val
|
||||||
|
handleQuery()
|
||||||
|
},
|
||||||
|
{ immediate: false }
|
||||||
|
)
|
||||||
|
|
||||||
|
/** 查询列表 */
|
||||||
|
const getList = async () => {
|
||||||
|
loading.value = true
|
||||||
|
try {
|
||||||
|
const data = await MainApi.getFundsPage(queryParams)
|
||||||
|
list.value = data.list
|
||||||
|
total.value = data.total
|
||||||
|
} finally {
|
||||||
|
loading.value = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 搜索按钮操作 */
|
||||||
|
const handleQuery = () => {
|
||||||
|
queryParams.pageNo = 1
|
||||||
|
getList()
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 添加/修改操作 */
|
||||||
|
const formRef = ref()
|
||||||
|
const openForm = (type: string, id?: number) => {
|
||||||
|
if (!props.acceptanceId) {
|
||||||
|
message.error('请选择一个验收主')
|
||||||
|
return
|
||||||
|
}
|
||||||
|
formRef.value.open(type, id, props.acceptanceId)
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 删除按钮操作 */
|
||||||
|
const handleDelete = async (id: number) => {
|
||||||
|
try {
|
||||||
|
// 删除的二次确认
|
||||||
|
await message.delConfirm()
|
||||||
|
// 发起删除
|
||||||
|
await MainApi.deleteFunds(id)
|
||||||
|
message.success(t('common.delSuccess'))
|
||||||
|
// 刷新列表
|
||||||
|
await getList()
|
||||||
|
} catch {}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
@ -0,0 +1,77 @@
|
||||||
|
<template>
|
||||||
|
<el-form
|
||||||
|
ref="formRef"
|
||||||
|
:model="formData"
|
||||||
|
:rules="formRules"
|
||||||
|
label-width="100px"
|
||||||
|
v-loading="formLoading"
|
||||||
|
>
|
||||||
|
<el-form-item label="研究目标、考核指标等完成情况" prop="researchTarget">
|
||||||
|
<el-input v-model="formData.researchTarget" type="textarea" placeholder="请输入研究目标、考核指标等完成情况" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="主要研究工作" prop="mainWork">
|
||||||
|
<el-input v-model="formData.mainWork" type="textarea" placeholder="请输入主要研究工作" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="经济、社会与环境效益" prop="economicBenefits">
|
||||||
|
<el-input v-model="formData.economicBenefits" type="textarea" placeholder="请输入经济、社会与环境效益" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="产业化情况" prop="industrialize">
|
||||||
|
<el-input v-model="formData.industrialize" type="textarea" placeholder="请输入产业化情况" />
|
||||||
|
</el-form-item>
|
||||||
|
</el-form>
|
||||||
|
</template>
|
||||||
|
<script setup lang="ts">
|
||||||
|
import { MainApi } from '@/api/acceptance/acceptance'
|
||||||
|
|
||||||
|
const props = defineProps<{
|
||||||
|
acceptanceId: undefined // 验收ID(主表的关联字段)
|
||||||
|
}>()
|
||||||
|
const formLoading = ref(false) // 表单的加载中
|
||||||
|
const formData = ref([])
|
||||||
|
const formRules = reactive({
|
||||||
|
})
|
||||||
|
const formRef = ref() // 表单 Ref
|
||||||
|
|
||||||
|
/** 监听主表的关联字段的变化,加载对应的子表数据 */
|
||||||
|
watch(
|
||||||
|
() => props.acceptanceId,
|
||||||
|
async (val) => {
|
||||||
|
// 1. 重置表单
|
||||||
|
formData.value = {
|
||||||
|
id: undefined,
|
||||||
|
acceptanceId: undefined,
|
||||||
|
researchTarget: undefined,
|
||||||
|
mainWork: undefined,
|
||||||
|
economicBenefits: undefined,
|
||||||
|
industrialize: undefined,
|
||||||
|
}
|
||||||
|
// 2. val 非空,则加载数据
|
||||||
|
if (!val) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
formLoading.value = true
|
||||||
|
const data = await MainApi.getInfoByAcceptanceId(val)
|
||||||
|
if (!data) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
formData.value = data
|
||||||
|
} finally {
|
||||||
|
formLoading.value = false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{ immediate: true }
|
||||||
|
)
|
||||||
|
|
||||||
|
/** 表单校验 */
|
||||||
|
const validate = () => {
|
||||||
|
return formRef.value.validate()
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 表单值 */
|
||||||
|
const getData = () => {
|
||||||
|
return formData.value
|
||||||
|
}
|
||||||
|
|
||||||
|
defineExpose({ validate, getData })
|
||||||
|
</script>
|
||||||
|
|
@ -0,0 +1,119 @@
|
||||||
|
<template>
|
||||||
|
<!-- 列表 -->
|
||||||
|
<ContentWrap>
|
||||||
|
<el-button
|
||||||
|
type="primary"
|
||||||
|
plain
|
||||||
|
@click="openForm('create')"
|
||||||
|
v-hasPermi="['acceptance:main:create']"
|
||||||
|
>
|
||||||
|
<Icon icon="ep:plus" class="mr-5px" /> 新增
|
||||||
|
</el-button>
|
||||||
|
<el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true">
|
||||||
|
<el-table-column label="id" align="center" prop="id" />
|
||||||
|
<el-table-column label="研究目标、考核指标等完成情况" align="center" prop="researchTarget" />
|
||||||
|
<el-table-column label="主要研究工作" align="center" prop="mainWork" />
|
||||||
|
<el-table-column label="经济、社会与环境效益" align="center" prop="economicBenefits" />
|
||||||
|
<el-table-column label="产业化情况" align="center" prop="industrialize" />
|
||||||
|
<el-table-column label="操作" align="center">
|
||||||
|
<template #default="scope">
|
||||||
|
<el-button
|
||||||
|
link
|
||||||
|
type="primary"
|
||||||
|
@click="openForm('update', scope.row.id)"
|
||||||
|
v-hasPermi="['acceptance:main:update']"
|
||||||
|
>
|
||||||
|
编辑
|
||||||
|
</el-button>
|
||||||
|
<el-button
|
||||||
|
link
|
||||||
|
type="danger"
|
||||||
|
@click="handleDelete(scope.row.id)"
|
||||||
|
v-hasPermi="['acceptance:main:delete']"
|
||||||
|
>
|
||||||
|
删除
|
||||||
|
</el-button>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
</el-table>
|
||||||
|
<!-- 分页 -->
|
||||||
|
<Pagination
|
||||||
|
:total="total"
|
||||||
|
v-model:page="queryParams.pageNo"
|
||||||
|
v-model:limit="queryParams.pageSize"
|
||||||
|
@pagination="getList"
|
||||||
|
/>
|
||||||
|
</ContentWrap>
|
||||||
|
<!-- 表单弹窗:添加/修改 -->
|
||||||
|
<InfoForm ref="formRef" @success="getList" />
|
||||||
|
</template>
|
||||||
|
<script setup lang="ts">
|
||||||
|
import { MainApi } from '@/api/acceptance/acceptance'
|
||||||
|
import InfoForm from './InfoForm.vue'
|
||||||
|
|
||||||
|
const { t } = useI18n() // 国际化
|
||||||
|
const message = useMessage() // 消息弹窗
|
||||||
|
|
||||||
|
const props = defineProps<{
|
||||||
|
acceptanceId: undefined // 验收ID(主表的关联字段)
|
||||||
|
}>()
|
||||||
|
const loading = ref(false) // 列表的加载中
|
||||||
|
const list = ref([]) // 列表的数据
|
||||||
|
const total = ref(0) // 列表的总页数
|
||||||
|
const queryParams = reactive({
|
||||||
|
pageNo: 1,
|
||||||
|
pageSize: 10,
|
||||||
|
acceptanceId: undefined
|
||||||
|
})
|
||||||
|
|
||||||
|
/** 监听主表的关联字段的变化,加载对应的子表数据 */
|
||||||
|
watch(
|
||||||
|
() => props.acceptanceId,
|
||||||
|
(val) => {
|
||||||
|
queryParams.acceptanceId = val
|
||||||
|
handleQuery()
|
||||||
|
},
|
||||||
|
{ immediate: false }
|
||||||
|
)
|
||||||
|
|
||||||
|
/** 查询列表 */
|
||||||
|
const getList = async () => {
|
||||||
|
loading.value = true
|
||||||
|
try {
|
||||||
|
const data = await MainApi.getInfoPage(queryParams)
|
||||||
|
list.value = data.list
|
||||||
|
total.value = data.total
|
||||||
|
} finally {
|
||||||
|
loading.value = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 搜索按钮操作 */
|
||||||
|
const handleQuery = () => {
|
||||||
|
queryParams.pageNo = 1
|
||||||
|
getList()
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 添加/修改操作 */
|
||||||
|
const formRef = ref()
|
||||||
|
const openForm = (type: string, id?: number) => {
|
||||||
|
if (!props.acceptanceId) {
|
||||||
|
message.error('请选择一个验收主')
|
||||||
|
return
|
||||||
|
}
|
||||||
|
formRef.value.open(type, id, props.acceptanceId)
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 删除按钮操作 */
|
||||||
|
const handleDelete = async (id: number) => {
|
||||||
|
try {
|
||||||
|
// 删除的二次确认
|
||||||
|
await message.delConfirm()
|
||||||
|
// 发起删除
|
||||||
|
await MainApi.deleteInfo(id)
|
||||||
|
message.success(t('common.delSuccess'))
|
||||||
|
// 刷新列表
|
||||||
|
await getList()
|
||||||
|
} catch {}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
@ -0,0 +1,238 @@
|
||||||
|
<template>
|
||||||
|
<ContentWrap>
|
||||||
|
<!-- 搜索工作栏 -->
|
||||||
|
<el-form
|
||||||
|
class="-mb-15px"
|
||||||
|
:model="queryParams"
|
||||||
|
ref="queryFormRef"
|
||||||
|
:inline="true"
|
||||||
|
label-width="68px"
|
||||||
|
>
|
||||||
|
<el-form-item label="课题编号" prop="code">
|
||||||
|
<el-input
|
||||||
|
v-model="queryParams.code"
|
||||||
|
placeholder="请输入课题编号"
|
||||||
|
clearable
|
||||||
|
@keyup.enter="handleQuery"
|
||||||
|
class="!w-240px"
|
||||||
|
/>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="年度" prop="year">
|
||||||
|
<el-input
|
||||||
|
v-model="queryParams.year"
|
||||||
|
placeholder="请输入年度"
|
||||||
|
clearable
|
||||||
|
@keyup.enter="handleQuery"
|
||||||
|
class="!w-240px"
|
||||||
|
/>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="课题名称" prop="name">
|
||||||
|
<el-input
|
||||||
|
v-model="queryParams.name"
|
||||||
|
placeholder="请输入课题名称"
|
||||||
|
clearable
|
||||||
|
@keyup.enter="handleQuery"
|
||||||
|
class="!w-240px"
|
||||||
|
/>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="开始时间" prop="beginDate">
|
||||||
|
<el-date-picker
|
||||||
|
v-model="queryParams.beginDate"
|
||||||
|
value-format="YYYY-MM-DD HH:mm:ss"
|
||||||
|
type="daterange"
|
||||||
|
start-placeholder="开始日期"
|
||||||
|
end-placeholder="结束日期"
|
||||||
|
:default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"
|
||||||
|
class="!w-240px"
|
||||||
|
/>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="结束时间" prop="endData">
|
||||||
|
<el-date-picker
|
||||||
|
v-model="queryParams.endData"
|
||||||
|
value-format="YYYY-MM-DD"
|
||||||
|
type="date"
|
||||||
|
placeholder="选择结束时间"
|
||||||
|
clearable
|
||||||
|
class="!w-240px"
|
||||||
|
/>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="主管部门" prop="competentDeptName">
|
||||||
|
<el-input
|
||||||
|
v-model="queryParams.competentDeptName"
|
||||||
|
placeholder="请输入主管部门"
|
||||||
|
clearable
|
||||||
|
@keyup.enter="handleQuery"
|
||||||
|
class="!w-240px"
|
||||||
|
/>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="主管工程师" prop="managerName">
|
||||||
|
<el-input
|
||||||
|
v-model="queryParams.managerName"
|
||||||
|
placeholder="请输入主管工程师"
|
||||||
|
clearable
|
||||||
|
@keyup.enter="handleQuery"
|
||||||
|
class="!w-240px"
|
||||||
|
/>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item>
|
||||||
|
<el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> 搜索</el-button>
|
||||||
|
<el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> 重置</el-button>
|
||||||
|
<el-button
|
||||||
|
type="primary"
|
||||||
|
plain
|
||||||
|
@click="openForm('create')"
|
||||||
|
v-hasPermi="['acceptance:main:create']"
|
||||||
|
>
|
||||||
|
<Icon icon="ep:plus" class="mr-5px" /> 新增
|
||||||
|
</el-button>
|
||||||
|
<el-button
|
||||||
|
type="success"
|
||||||
|
plain
|
||||||
|
@click="handleExport"
|
||||||
|
:loading="exportLoading"
|
||||||
|
v-hasPermi="['acceptance:main:export']"
|
||||||
|
>
|
||||||
|
<Icon icon="ep:download" class="mr-5px" /> 导出
|
||||||
|
</el-button>
|
||||||
|
</el-form-item>
|
||||||
|
</el-form>
|
||||||
|
</ContentWrap>
|
||||||
|
|
||||||
|
<!-- 列表 -->
|
||||||
|
<ContentWrap>
|
||||||
|
<el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true">
|
||||||
|
<el-table-column label="id" align="center" prop="id" />
|
||||||
|
<el-table-column label="合同主键ID" align="center" prop="contractId" />
|
||||||
|
<el-table-column label="课题编号" align="center" prop="code" />
|
||||||
|
<el-table-column label="年度" align="center" prop="year" />
|
||||||
|
<el-table-column label="课题名称" align="center" prop="name" />
|
||||||
|
<el-table-column label="开始时间" align="center" prop="beginDate" />
|
||||||
|
<el-table-column label="结束时间" align="center" prop="endData" />
|
||||||
|
<el-table-column label="主管部门" align="center" prop="competentDeptName" />
|
||||||
|
<el-table-column label="主管工程师" align="center" prop="managerName" />
|
||||||
|
<el-table-column label="操作" align="center">
|
||||||
|
<template #default="scope">
|
||||||
|
<el-button
|
||||||
|
link
|
||||||
|
type="primary"
|
||||||
|
@click="openForm('update', scope.row.id)"
|
||||||
|
v-hasPermi="['acceptance:main:update']"
|
||||||
|
>
|
||||||
|
编辑
|
||||||
|
</el-button>
|
||||||
|
<el-button
|
||||||
|
link
|
||||||
|
type="danger"
|
||||||
|
@click="handleDelete(scope.row.id)"
|
||||||
|
v-hasPermi="['acceptance:main:delete']"
|
||||||
|
>
|
||||||
|
删除
|
||||||
|
</el-button>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
</el-table>
|
||||||
|
<!-- 分页 -->
|
||||||
|
<Pagination
|
||||||
|
:total="total"
|
||||||
|
v-model:page="queryParams.pageNo"
|
||||||
|
v-model:limit="queryParams.pageSize"
|
||||||
|
@pagination="getList"
|
||||||
|
/>
|
||||||
|
</ContentWrap>
|
||||||
|
|
||||||
|
<!-- 表单弹窗:添加/修改 -->
|
||||||
|
<MainForm ref="formRef" @success="getList" />
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup lang="ts">
|
||||||
|
import download from '@/utils/download'
|
||||||
|
import { MainApi, MainVO } from '@/api/acceptance/acceptance'
|
||||||
|
import MainForm from './MainForm.vue'
|
||||||
|
|
||||||
|
/** 验收主 列表 */
|
||||||
|
defineOptions({ name: 'AcceptanceMain' })
|
||||||
|
|
||||||
|
const message = useMessage() // 消息弹窗
|
||||||
|
const { t } = useI18n() // 国际化
|
||||||
|
|
||||||
|
const loading = ref(true) // 列表的加载中
|
||||||
|
const list = ref<MainVO[]>([]) // 列表的数据
|
||||||
|
const total = ref(0) // 列表的总页数
|
||||||
|
const queryParams = reactive({
|
||||||
|
pageNo: 1,
|
||||||
|
pageSize: 10,
|
||||||
|
code: undefined,
|
||||||
|
year: undefined,
|
||||||
|
name: undefined,
|
||||||
|
beginDate: [],
|
||||||
|
endData: undefined,
|
||||||
|
endData: [],
|
||||||
|
competentDeptName: undefined,
|
||||||
|
managerName: undefined,
|
||||||
|
})
|
||||||
|
const queryFormRef = ref() // 搜索的表单
|
||||||
|
const exportLoading = ref(false) // 导出的加载中
|
||||||
|
|
||||||
|
/** 查询列表 */
|
||||||
|
const getList = async () => {
|
||||||
|
loading.value = true
|
||||||
|
try {
|
||||||
|
const data = await MainApi.getMainPage(queryParams)
|
||||||
|
list.value = data.list
|
||||||
|
total.value = data.total
|
||||||
|
} finally {
|
||||||
|
loading.value = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 搜索按钮操作 */
|
||||||
|
const handleQuery = () => {
|
||||||
|
queryParams.pageNo = 1
|
||||||
|
getList()
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 重置按钮操作 */
|
||||||
|
const resetQuery = () => {
|
||||||
|
queryFormRef.value.resetFields()
|
||||||
|
handleQuery()
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 添加/修改操作 */
|
||||||
|
const formRef = ref()
|
||||||
|
const openForm = (type: string, id?: number) => {
|
||||||
|
formRef.value.open(type, id)
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 删除按钮操作 */
|
||||||
|
const handleDelete = async (id: number) => {
|
||||||
|
try {
|
||||||
|
// 删除的二次确认
|
||||||
|
await message.delConfirm()
|
||||||
|
// 发起删除
|
||||||
|
await MainApi.deleteMain(id)
|
||||||
|
message.success(t('common.delSuccess'))
|
||||||
|
// 刷新列表
|
||||||
|
await getList()
|
||||||
|
} catch {}
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 导出按钮操作 */
|
||||||
|
const handleExport = async () => {
|
||||||
|
try {
|
||||||
|
// 导出的二次确认
|
||||||
|
await message.exportConfirm()
|
||||||
|
// 发起导出
|
||||||
|
exportLoading.value = true
|
||||||
|
const data = await MainApi.exportMain(queryParams)
|
||||||
|
download.excel(data, '验收主.xls')
|
||||||
|
} catch {
|
||||||
|
} finally {
|
||||||
|
exportLoading.value = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 初始化 **/
|
||||||
|
onMounted(() => {
|
||||||
|
getList()
|
||||||
|
})
|
||||||
|
</script>
|
||||||
|
|
@ -0,0 +1,292 @@
|
||||||
|
<template>
|
||||||
|
<Dialog :title="dialogTitle" v-model="dialogVisible">
|
||||||
|
<el-form
|
||||||
|
ref="formRef"
|
||||||
|
:model="formData"
|
||||||
|
:rules="formRules"
|
||||||
|
label-width="100px"
|
||||||
|
v-loading="formLoading"
|
||||||
|
>
|
||||||
|
<el-form-item label="编号" prop="number">
|
||||||
|
<el-input v-model="formData.number" placeholder="请输入编号" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="项目名称" prop="name">
|
||||||
|
<el-input v-model="formData.name" placeholder="请输入项目名称" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="所属技术领域" prop="technicalField">
|
||||||
|
<el-select v-model="formData.technicalField" placeholder="请选择所属技术领域">
|
||||||
|
<el-option
|
||||||
|
v-for="dict in getStrDictOptions(DICT_TYPE.TECHNICAL_FIELD)"
|
||||||
|
:key="dict.value"
|
||||||
|
:label="dict.label"
|
||||||
|
:value="dict.value"
|
||||||
|
/>
|
||||||
|
</el-select>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="年度" prop="year">
|
||||||
|
<el-input v-model="formData.year" placeholder="请输入年度" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="开始时间" prop="beginDate">
|
||||||
|
<el-date-picker
|
||||||
|
v-model="formData.beginDate"
|
||||||
|
type="date"
|
||||||
|
value-format="x"
|
||||||
|
placeholder="选择开始时间"
|
||||||
|
/>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="结束时间" prop="endData">
|
||||||
|
<el-date-picker
|
||||||
|
v-model="formData.endData"
|
||||||
|
type="date"
|
||||||
|
value-format="x"
|
||||||
|
placeholder="选择结束时间"
|
||||||
|
/>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="负责人Id" prop="directorId">
|
||||||
|
<el-input v-model="formData.directorId" placeholder="请输入负责人Id" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="负责人姓名" prop="director">
|
||||||
|
<el-input v-model="formData.director" placeholder="请输入负责人姓名" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="负责人性别" prop="gender">
|
||||||
|
<el-input v-model="formData.gender" placeholder="请输入负责人性别" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="年龄" prop="age">
|
||||||
|
<el-input v-model="formData.age" placeholder="请输入年龄" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="学历" prop="education">
|
||||||
|
<el-input v-model="formData.education" placeholder="请输入学历" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="所学专业" prop="major">
|
||||||
|
<el-input v-model="formData.major" placeholder="请输入所学专业" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="从事专业" prop="engagMajor">
|
||||||
|
<el-input v-model="formData.engagMajor" placeholder="请输入从事专业" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="职务(职称)" prop="position">
|
||||||
|
<el-input v-model="formData.position" placeholder="请输入职务(职称)" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="电话" prop="phoneNo">
|
||||||
|
<el-input v-model="formData.phoneNo" placeholder="请输入电话" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="邮箱" prop="email">
|
||||||
|
<el-input v-model="formData.email" placeholder="请输入邮箱" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="传真" prop="fax">
|
||||||
|
<el-input v-model="formData.fax" placeholder="请输入传真" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="邮编" prop="postalCode">
|
||||||
|
<el-input v-model="formData.postalCode" placeholder="请输入邮编" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="通讯地址" prop="address">
|
||||||
|
<el-input v-model="formData.address" placeholder="请输入通讯地址" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="主要业绩" prop="achievement">
|
||||||
|
<el-input v-model="formData.achievement" type="textarea" placeholder="请输入主要业绩" />
|
||||||
|
</el-form-item>
|
||||||
|
<!-- <el-form-item label="主管部门ID" prop="competentDeptId">
|
||||||
|
<el-input v-model="formData.competentDeptId" placeholder="请输入主管部门ID" />
|
||||||
|
</el-form-item>-->
|
||||||
|
<el-form-item label="主管部门" prop="competentDeptName">
|
||||||
|
<el-input v-model="formData.competentDeptName" placeholder="请输入主管部门" />
|
||||||
|
</el-form-item>
|
||||||
|
<!-- <el-form-item label="主管工程师ID" prop="managerId">
|
||||||
|
<el-input v-model="formData.managerId" placeholder="请输入主管工程师ID" />
|
||||||
|
</el-form-item>-->
|
||||||
|
<el-form-item label="主管工程师" prop="managerName">
|
||||||
|
<el-input v-model="formData.managerName" placeholder="请输入主管工程师" />
|
||||||
|
</el-form-item>
|
||||||
|
</el-form>
|
||||||
|
<!-- 子表的表单 -->
|
||||||
|
<el-tabs v-model="subTabsName">
|
||||||
|
<el-tab-pane label="立项详细信息" name="info">
|
||||||
|
<InfoForm ref="infoFormRef" :apply-id="formData.id" />
|
||||||
|
</el-tab-pane>
|
||||||
|
<el-tab-pane label="立项单位信息" name="units">
|
||||||
|
<UnitsForm ref="unitsFormRef" :apply-id="formData.id" />
|
||||||
|
</el-tab-pane>
|
||||||
|
<el-tab-pane label="主要参加人员" name="participant">
|
||||||
|
<ParticipantForm ref="participantFormRef" :apply-id="formData.id" />
|
||||||
|
</el-tab-pane>
|
||||||
|
<el-tab-pane label="立项实施计划" name="plan">
|
||||||
|
<PlanForm ref="planFormRef" :apply-id="formData.id" />
|
||||||
|
</el-tab-pane>
|
||||||
|
<el-tab-pane label="立项经费" name="funds">
|
||||||
|
<FundsForm ref="fundsFormRef" :apply-id="formData.id" />
|
||||||
|
</el-tab-pane>
|
||||||
|
</el-tabs>
|
||||||
|
<template #footer>
|
||||||
|
<el-button @click="submitForm" type="primary" :disabled="formLoading">确 定</el-button>
|
||||||
|
<el-button @click="dialogVisible = false">取 消</el-button>
|
||||||
|
</template>
|
||||||
|
</Dialog>
|
||||||
|
</template>
|
||||||
|
<script setup lang="ts">
|
||||||
|
import { getStrDictOptions, DICT_TYPE } from '@/utils/dict'
|
||||||
|
import { MainApi, MainVO } from '@/api/apply/apply'
|
||||||
|
import InfoForm from './components/InfoForm.vue'
|
||||||
|
import UnitsForm from './components/UnitsForm.vue'
|
||||||
|
import ParticipantForm from './components/ParticipantForm.vue'
|
||||||
|
import PlanForm from './components/PlanForm.vue'
|
||||||
|
import FundsForm from './components/FundsForm.vue'
|
||||||
|
|
||||||
|
/** 立项申请 表单 */
|
||||||
|
defineOptions({ name: 'MainForm' })
|
||||||
|
|
||||||
|
const { t } = useI18n() // 国际化
|
||||||
|
const message = useMessage() // 消息弹窗
|
||||||
|
|
||||||
|
const dialogVisible = ref(false) // 弹窗的是否展示
|
||||||
|
const dialogTitle = ref('') // 弹窗的标题
|
||||||
|
const formLoading = ref(false) // 表单的加载中:1)修改时的数据加载;2)提交的按钮禁用
|
||||||
|
const formType = ref('') // 表单的类型:create - 新增;update - 修改
|
||||||
|
const formData = ref({
|
||||||
|
id: undefined,
|
||||||
|
number: undefined,
|
||||||
|
name: undefined,
|
||||||
|
technicalField: undefined,
|
||||||
|
year: undefined,
|
||||||
|
beginDate: undefined,
|
||||||
|
endData: undefined,
|
||||||
|
directorId: undefined,
|
||||||
|
director: undefined,
|
||||||
|
gender: undefined,
|
||||||
|
age: undefined,
|
||||||
|
education: undefined,
|
||||||
|
major: undefined,
|
||||||
|
engagMajor: undefined,
|
||||||
|
position: undefined,
|
||||||
|
phoneNo: undefined,
|
||||||
|
email: undefined,
|
||||||
|
fax: undefined,
|
||||||
|
postalCode: undefined,
|
||||||
|
address: undefined,
|
||||||
|
achievement: undefined,
|
||||||
|
competentDeptId: undefined,
|
||||||
|
competentDeptName: undefined,
|
||||||
|
managerId: undefined,
|
||||||
|
managerName: undefined,
|
||||||
|
})
|
||||||
|
const formRules = reactive({
|
||||||
|
})
|
||||||
|
const formRef = ref() // 表单 Ref
|
||||||
|
|
||||||
|
/** 子表的表单 */
|
||||||
|
const subTabsName = ref('info')
|
||||||
|
const infoFormRef = ref()
|
||||||
|
const unitsFormRef = ref()
|
||||||
|
const participantFormRef = ref()
|
||||||
|
const planFormRef = ref()
|
||||||
|
const fundsFormRef = ref()
|
||||||
|
|
||||||
|
/** 打开弹窗 */
|
||||||
|
const open = async (type: string, id?: number) => {
|
||||||
|
dialogVisible.value = true
|
||||||
|
dialogTitle.value = t('action.' + type)
|
||||||
|
formType.value = type
|
||||||
|
resetForm()
|
||||||
|
// 修改时,设置数据
|
||||||
|
if (id) {
|
||||||
|
formLoading.value = true
|
||||||
|
try {
|
||||||
|
formData.value = await MainApi.getMain(id)
|
||||||
|
} finally {
|
||||||
|
formLoading.value = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
defineExpose({ open }) // 提供 open 方法,用于打开弹窗
|
||||||
|
|
||||||
|
/** 提交表单 */
|
||||||
|
const emit = defineEmits(['success']) // 定义 success 事件,用于操作成功后的回调
|
||||||
|
const submitForm = async () => {
|
||||||
|
// 校验表单
|
||||||
|
await formRef.value.validate()
|
||||||
|
// 校验子表单
|
||||||
|
try {
|
||||||
|
await infoFormRef.value.validate()
|
||||||
|
} catch (e) {
|
||||||
|
subTabsName.value = 'info'
|
||||||
|
return
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
await unitsFormRef.value.validate()
|
||||||
|
} catch (e) {
|
||||||
|
subTabsName.value = 'units'
|
||||||
|
return
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
await participantFormRef.value.validate()
|
||||||
|
} catch (e) {
|
||||||
|
subTabsName.value = 'participant'
|
||||||
|
return
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
await planFormRef.value.validate()
|
||||||
|
} catch (e) {
|
||||||
|
subTabsName.value = 'plan'
|
||||||
|
return
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
await fundsFormRef.value.validate()
|
||||||
|
} catch (e) {
|
||||||
|
subTabsName.value = 'funds'
|
||||||
|
return
|
||||||
|
}
|
||||||
|
// 提交请求
|
||||||
|
formLoading.value = true
|
||||||
|
try {
|
||||||
|
const data = formData.value as unknown as MainVO
|
||||||
|
// 拼接子表的数据
|
||||||
|
data.info = infoFormRef.value.getData()
|
||||||
|
data.unitss = unitsFormRef.value.getData()
|
||||||
|
data.participants = participantFormRef.value.getData()
|
||||||
|
data.plans = planFormRef.value.getData()
|
||||||
|
data.fundss = fundsFormRef.value.getData()
|
||||||
|
if (formType.value === 'create') {
|
||||||
|
await MainApi.createMain(data)
|
||||||
|
message.success(t('common.createSuccess'))
|
||||||
|
} else {
|
||||||
|
await MainApi.updateMain(data)
|
||||||
|
message.success(t('common.updateSuccess'))
|
||||||
|
}
|
||||||
|
dialogVisible.value = false
|
||||||
|
// 发送操作成功的事件
|
||||||
|
emit('success')
|
||||||
|
} finally {
|
||||||
|
formLoading.value = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 重置表单 */
|
||||||
|
const resetForm = () => {
|
||||||
|
formData.value = {
|
||||||
|
id: undefined,
|
||||||
|
number: undefined,
|
||||||
|
name: undefined,
|
||||||
|
technicalField: undefined,
|
||||||
|
year: undefined,
|
||||||
|
beginDate: undefined,
|
||||||
|
endData: undefined,
|
||||||
|
directorId: undefined,
|
||||||
|
director: undefined,
|
||||||
|
gender: undefined,
|
||||||
|
age: undefined,
|
||||||
|
education: undefined,
|
||||||
|
major: undefined,
|
||||||
|
engagMajor: undefined,
|
||||||
|
position: undefined,
|
||||||
|
phoneNo: undefined,
|
||||||
|
email: undefined,
|
||||||
|
fax: undefined,
|
||||||
|
postalCode: undefined,
|
||||||
|
address: undefined,
|
||||||
|
achievement: undefined,
|
||||||
|
competentDeptId: undefined,
|
||||||
|
competentDeptName: undefined,
|
||||||
|
managerId: undefined,
|
||||||
|
managerName: undefined,
|
||||||
|
}
|
||||||
|
formRef.value?.resetFields()
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
@ -0,0 +1,171 @@
|
||||||
|
<template>
|
||||||
|
<el-form
|
||||||
|
ref="formRef"
|
||||||
|
:model="formData"
|
||||||
|
:rules="formRules"
|
||||||
|
v-loading="formLoading"
|
||||||
|
label-width="0px"
|
||||||
|
:inline-message="true"
|
||||||
|
>
|
||||||
|
<el-table :data="formData" class="-mt-10px">
|
||||||
|
<el-table-column label="序号" type="index" width="100" />
|
||||||
|
<el-table-column label="经费来源ID" min-width="150">
|
||||||
|
<template #default="{ row, $index }">
|
||||||
|
<el-form-item :prop="`${$index}.sourceId`" :rules="formRules.sourceId" class="mb-0px!">
|
||||||
|
<el-input v-model="row.sourceId" placeholder="请输入经费来源ID" />
|
||||||
|
</el-form-item>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="支出类型ID" min-width="150">
|
||||||
|
<template #default="{ row, $index }">
|
||||||
|
<el-form-item :prop="`${$index}.expenseId`" :rules="formRules.expenseId" class="mb-0px!">
|
||||||
|
<el-input v-model="row.expenseId" placeholder="请输入支出类型ID" />
|
||||||
|
</el-form-item>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="经费科目" min-width="150">
|
||||||
|
<template #default="{ row, $index }">
|
||||||
|
<el-form-item :prop="`${$index}.secondaryCategory`" :rules="formRules.secondaryCategory" class="mb-0px!">
|
||||||
|
<el-input v-model="row.secondaryCategory" placeholder="请输入经费科目" />
|
||||||
|
</el-form-item>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="经费金额" min-width="150">
|
||||||
|
<template #default="{ row, $index }">
|
||||||
|
<el-form-item :prop="`${$index}.amount`" :rules="formRules.amount" class="mb-0px!">
|
||||||
|
<el-input v-model="row.amount" placeholder="请输入经费金额" />
|
||||||
|
</el-form-item>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="经费年度" min-width="150">
|
||||||
|
<template #default="{ row, $index }">
|
||||||
|
<el-form-item :prop="`${$index}.fiscalYear`" :rules="formRules.fiscalYear" class="mb-0px!">
|
||||||
|
<el-input v-model="row.fiscalYear" placeholder="请输入经费年度" />
|
||||||
|
</el-form-item>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="总金额" min-width="150">
|
||||||
|
<template #default="{ row, $index }">
|
||||||
|
<el-form-item :prop="`${$index}.totalAmount`" :rules="formRules.totalAmount" class="mb-0px!">
|
||||||
|
<el-input v-model="row.totalAmount" placeholder="请输入总金额" />
|
||||||
|
</el-form-item>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="创建人" min-width="150">
|
||||||
|
<template #default="{ row, $index }">
|
||||||
|
<el-form-item :prop="`${$index}.createdBy`" :rules="formRules.createdBy" class="mb-0px!">
|
||||||
|
<el-input v-model="row.createdBy" placeholder="请输入创建人" />
|
||||||
|
</el-form-item>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="创建时间" min-width="150">
|
||||||
|
<template #default="{ row, $index }">
|
||||||
|
<el-form-item :prop="`${$index}.createdTime`" :rules="formRules.createdTime" class="mb-0px!">
|
||||||
|
<el-date-picker
|
||||||
|
v-model="row.createdTime"
|
||||||
|
type="date"
|
||||||
|
value-format="x"
|
||||||
|
placeholder="选择创建时间"
|
||||||
|
/>
|
||||||
|
</el-form-item>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="更新人" min-width="150">
|
||||||
|
<template #default="{ row, $index }">
|
||||||
|
<el-form-item :prop="`${$index}.updatedBy`" :rules="formRules.updatedBy" class="mb-0px!">
|
||||||
|
<el-input v-model="row.updatedBy" placeholder="请输入更新人" />
|
||||||
|
</el-form-item>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="更新时间" min-width="150">
|
||||||
|
<template #default="{ row, $index }">
|
||||||
|
<el-form-item :prop="`${$index}.updatedTime`" :rules="formRules.updatedTime" class="mb-0px!">
|
||||||
|
<el-date-picker
|
||||||
|
v-model="row.updatedTime"
|
||||||
|
type="date"
|
||||||
|
value-format="x"
|
||||||
|
placeholder="选择更新时间"
|
||||||
|
/>
|
||||||
|
</el-form-item>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column align="center" fixed="right" label="操作" width="60">
|
||||||
|
<template #default="{ $index }">
|
||||||
|
<el-button @click="handleDelete($index)" link>—</el-button>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
</el-table>
|
||||||
|
</el-form>
|
||||||
|
<el-row justify="center" class="mt-3">
|
||||||
|
<el-button @click="handleAdd" round>+ 添加立项经费</el-button>
|
||||||
|
</el-row>
|
||||||
|
</template>
|
||||||
|
<script setup lang="ts">
|
||||||
|
import { MainApi } from '@/api/apply/apply'
|
||||||
|
|
||||||
|
const props = defineProps<{
|
||||||
|
applyId: undefined // 立项ID(主表的关联字段)
|
||||||
|
}>()
|
||||||
|
const formLoading = ref(false) // 表单的加载中
|
||||||
|
const formData = ref([])
|
||||||
|
const formRules = reactive({
|
||||||
|
})
|
||||||
|
const formRef = ref() // 表单 Ref
|
||||||
|
|
||||||
|
/** 监听主表的关联字段的变化,加载对应的子表数据 */
|
||||||
|
watch(
|
||||||
|
() => props.applyId,
|
||||||
|
async (val) => {
|
||||||
|
// 1. 重置表单
|
||||||
|
formData.value = []
|
||||||
|
// 2. val 非空,则加载数据
|
||||||
|
if (!val) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
formLoading.value = true
|
||||||
|
formData.value = await MainApi.getFundsListByApplyId(val)
|
||||||
|
} finally {
|
||||||
|
formLoading.value = false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{ immediate: true }
|
||||||
|
)
|
||||||
|
|
||||||
|
/** 新增按钮操作 */
|
||||||
|
const handleAdd = () => {
|
||||||
|
const row = {
|
||||||
|
id: undefined,
|
||||||
|
applyId: undefined,
|
||||||
|
sourceId: undefined,
|
||||||
|
expenseId: undefined,
|
||||||
|
secondaryCategory: undefined,
|
||||||
|
amount: undefined,
|
||||||
|
fiscalYear: undefined,
|
||||||
|
totalAmount: undefined,
|
||||||
|
createdBy: undefined,
|
||||||
|
createdTime: undefined,
|
||||||
|
updatedBy: undefined,
|
||||||
|
updatedTime: undefined,
|
||||||
|
}
|
||||||
|
row.applyId = props.applyId
|
||||||
|
formData.value.push(row)
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 删除按钮操作 */
|
||||||
|
const handleDelete = (index) => {
|
||||||
|
formData.value.splice(index, 1)
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 表单校验 */
|
||||||
|
const validate = () => {
|
||||||
|
return formRef.value.validate()
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 表单值 */
|
||||||
|
const getData = () => {
|
||||||
|
return formData.value
|
||||||
|
}
|
||||||
|
|
||||||
|
defineExpose({ validate, getData })
|
||||||
|
</script>
|
||||||
|
|
@ -0,0 +1,105 @@
|
||||||
|
<template>
|
||||||
|
<el-form
|
||||||
|
ref="formRef"
|
||||||
|
:model="formData"
|
||||||
|
:rules="formRules"
|
||||||
|
label-width="150px"
|
||||||
|
v-loading="formLoading"
|
||||||
|
>
|
||||||
|
<el-form-item label="项目目的与意义" prop="purposeSignificance">
|
||||||
|
<el-input v-model="formData.purposeSignificance" type="textarea" placeholder="请输入项目目的与意义" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="项目所属领域国内外产业、技术的现状和发展趋势" prop="currentSituation">
|
||||||
|
<el-input v-model="formData.currentSituation" type="textarea" placeholder="请输入项目所属领域国内外产业、技术的现状和发展趋势" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="项目现有工作基础" prop="workFoundation">
|
||||||
|
<el-input v-model="formData.workFoundation" type="textarea" placeholder="请输入项目现有工作基础" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="项目实施目标及考核指标-项目目标" prop="objectives">
|
||||||
|
<el-input v-model="formData.objectives" type="textarea" placeholder="请输入项目实施目标及考核指标-项目目标" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="项目实施目标及考核指标-考核指标" prop="evaluation">
|
||||||
|
<el-input v-model="formData.evaluation" type="textarea" placeholder="请输入项目实施目标及考核指标-考核指标" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="项目实施目标及考核指标-考核指标依据" prop="according">
|
||||||
|
<el-input v-model="formData.according" type="textarea" placeholder="请输入项目实施目标及考核指标-考核指标依据" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="主要研究开发内容-主要研究内容" prop="researchContents">
|
||||||
|
<el-input v-model="formData.researchContents" type="textarea" placeholder="请输入主要研究开发内容-主要研究内容" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="主要研究开发内容-技术路线" prop="roadmap">
|
||||||
|
<el-input v-model="formData.roadmap" type="textarea" placeholder="请输入主要研究开发内容-技术路线" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="主要研究开发内容-创新性" prop="innovation">
|
||||||
|
<el-input v-model="formData.innovation" type="textarea" placeholder="请输入主要研究开发内容-创新性" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="课题实施的风险分析" prop="riskAnalysis">
|
||||||
|
<el-input v-model="formData.riskAnalysis" type="textarea" placeholder="请输入课题实施的风险分析" />
|
||||||
|
</el-form-item>
|
||||||
|
</el-form>
|
||||||
|
</template>
|
||||||
|
<script setup lang="ts">
|
||||||
|
import { MainApi } from '@/api/apply/apply'
|
||||||
|
|
||||||
|
const props = defineProps<{
|
||||||
|
applyId: undefined // 立项主表ID(主表的关联字段)
|
||||||
|
}>()
|
||||||
|
const formLoading = ref(false) // 表单的加载中
|
||||||
|
const formData = ref([])
|
||||||
|
const formRules = reactive({
|
||||||
|
})
|
||||||
|
const formRef = ref() // 表单 Ref
|
||||||
|
|
||||||
|
/** 监听主表的关联字段的变化,加载对应的子表数据 */
|
||||||
|
watch(
|
||||||
|
() => props.applyId,
|
||||||
|
async (val) => {
|
||||||
|
// 1. 重置表单
|
||||||
|
formData.value = {
|
||||||
|
id: undefined,
|
||||||
|
applyId: undefined,
|
||||||
|
purposeSignificance: undefined,
|
||||||
|
currentSituation: undefined,
|
||||||
|
workFoundation: undefined,
|
||||||
|
objectives: undefined,
|
||||||
|
evaluation: undefined,
|
||||||
|
according: undefined,
|
||||||
|
researchContents: undefined,
|
||||||
|
roadmap: undefined,
|
||||||
|
innovation: undefined,
|
||||||
|
riskAnalysis: undefined,
|
||||||
|
createdBy: undefined,
|
||||||
|
createdTime: undefined,
|
||||||
|
updatedBy: undefined,
|
||||||
|
updatedTime: undefined,
|
||||||
|
}
|
||||||
|
// 2. val 非空,则加载数据
|
||||||
|
if (!val) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
formLoading.value = true
|
||||||
|
const data = await MainApi.getInfoByApplyId(val)
|
||||||
|
if (!data) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
formData.value = data
|
||||||
|
} finally {
|
||||||
|
formLoading.value = false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{ immediate: true }
|
||||||
|
)
|
||||||
|
|
||||||
|
/** 表单校验 */
|
||||||
|
const validate = () => {
|
||||||
|
return formRef.value.validate()
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 表单值 */
|
||||||
|
const getData = () => {
|
||||||
|
return formData.value
|
||||||
|
}
|
||||||
|
|
||||||
|
defineExpose({ validate, getData })
|
||||||
|
</script>
|
||||||
|
|
@ -0,0 +1,203 @@
|
||||||
|
<template>
|
||||||
|
<el-form
|
||||||
|
ref="formRef"
|
||||||
|
:model="formData"
|
||||||
|
:rules="formRules"
|
||||||
|
v-loading="formLoading"
|
||||||
|
label-width="0px"
|
||||||
|
:inline-message="true"
|
||||||
|
>
|
||||||
|
<el-table :data="formData" class="-mt-10px">
|
||||||
|
<el-table-column label="序号" type="index" width="100" />
|
||||||
|
<el-table-column label="姓名" min-width="150">
|
||||||
|
<template #default="{ row, $index }">
|
||||||
|
<el-form-item :prop="`${$index}.name`" :rules="formRules.name" class="mb-0px!">
|
||||||
|
<el-input v-model="row.name" placeholder="请输入姓名" />
|
||||||
|
</el-form-item>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="性别" min-width="150">
|
||||||
|
<template #default="{ row, $index }">
|
||||||
|
<el-form-item :prop="`${$index}.gender`" :rules="formRules.gender" class="mb-0px!">
|
||||||
|
<el-input v-model="row.gender" placeholder="请输入性别" />
|
||||||
|
</el-form-item>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="年龄" min-width="150">
|
||||||
|
<template #default="{ row, $index }">
|
||||||
|
<el-form-item :prop="`${$index}.age`" :rules="formRules.age" class="mb-0px!">
|
||||||
|
<el-input v-model="row.age" placeholder="请输入年龄" />
|
||||||
|
</el-form-item>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="学历" min-width="150">
|
||||||
|
<template #default="{ row, $index }">
|
||||||
|
<el-form-item :prop="`${$index}.education`" :rules="formRules.education" class="mb-0px!">
|
||||||
|
<el-input v-model="row.education" placeholder="请输入学历" />
|
||||||
|
</el-form-item>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="职务(职称)" min-width="150">
|
||||||
|
<template #default="{ row, $index }">
|
||||||
|
<el-form-item :prop="`${$index}.position`" :rules="formRules.position" class="mb-0px!">
|
||||||
|
<el-input v-model="row.position" placeholder="请输入职务(职称)" />
|
||||||
|
</el-form-item>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="从事专业" min-width="150">
|
||||||
|
<template #default="{ row, $index }">
|
||||||
|
<el-form-item :prop="`${$index}.engagingProfession`" :rules="formRules.engagingProfession" class="mb-0px!">
|
||||||
|
<el-input v-model="row.engagingProfession" placeholder="请输入从事专业" />
|
||||||
|
</el-form-item>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="课题主要分工" min-width="150">
|
||||||
|
<template #default="{ row, $index }">
|
||||||
|
<el-form-item :prop="`${$index}.divideWork`" :rules="formRules.divideWork" class="mb-0px!">
|
||||||
|
<el-input v-model="row.divideWork" placeholder="请输入课题主要分工" />
|
||||||
|
</el-form-item>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="所在单位id" min-width="150">
|
||||||
|
<template #default="{ row, $index }">
|
||||||
|
<el-form-item :prop="`${$index}.deptId`" :rules="formRules.deptId" class="mb-0px!">
|
||||||
|
<el-input v-model="row.deptId" placeholder="请输入所在单位id" />
|
||||||
|
</el-form-item>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="所在单位名称" min-width="150">
|
||||||
|
<template #default="{ row, $index }">
|
||||||
|
<el-form-item :prop="`${$index}.deptName`" :rules="formRules.deptName" class="mb-0px!">
|
||||||
|
<el-input v-model="row.deptName" placeholder="请输入所在单位名称" />
|
||||||
|
</el-form-item>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="排序号" min-width="150">
|
||||||
|
<template #default="{ row, $index }">
|
||||||
|
<el-form-item :prop="`${$index}.orderNo`" :rules="formRules.orderNo" class="mb-0px!">
|
||||||
|
<el-input v-model="row.orderNo" placeholder="请输入排序号" />
|
||||||
|
</el-form-item>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="创建人" min-width="150">
|
||||||
|
<template #default="{ row, $index }">
|
||||||
|
<el-form-item :prop="`${$index}.createdBy`" :rules="formRules.createdBy" class="mb-0px!">
|
||||||
|
<el-input v-model="row.createdBy" placeholder="请输入创建人" />
|
||||||
|
</el-form-item>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="创建时间" min-width="150">
|
||||||
|
<template #default="{ row, $index }">
|
||||||
|
<el-form-item :prop="`${$index}.createdTime`" :rules="formRules.createdTime" class="mb-0px!">
|
||||||
|
<el-date-picker
|
||||||
|
v-model="row.createdTime"
|
||||||
|
type="date"
|
||||||
|
value-format="x"
|
||||||
|
placeholder="选择创建时间"
|
||||||
|
/>
|
||||||
|
</el-form-item>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="更新人" min-width="150">
|
||||||
|
<template #default="{ row, $index }">
|
||||||
|
<el-form-item :prop="`${$index}.updatedBy`" :rules="formRules.updatedBy" class="mb-0px!">
|
||||||
|
<el-input v-model="row.updatedBy" placeholder="请输入更新人" />
|
||||||
|
</el-form-item>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="更新时间" min-width="150">
|
||||||
|
<template #default="{ row, $index }">
|
||||||
|
<el-form-item :prop="`${$index}.updatedTime`" :rules="formRules.updatedTime" class="mb-0px!">
|
||||||
|
<el-date-picker
|
||||||
|
v-model="row.updatedTime"
|
||||||
|
type="date"
|
||||||
|
value-format="x"
|
||||||
|
placeholder="选择更新时间"
|
||||||
|
/>
|
||||||
|
</el-form-item>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column align="center" fixed="right" label="操作" width="60">
|
||||||
|
<template #default="{ $index }">
|
||||||
|
<el-button @click="handleDelete($index)" link>—</el-button>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
</el-table>
|
||||||
|
</el-form>
|
||||||
|
<el-row justify="center" class="mt-3">
|
||||||
|
<el-button @click="handleAdd" round>+ 添加主要参加人员</el-button>
|
||||||
|
</el-row>
|
||||||
|
</template>
|
||||||
|
<script setup lang="ts">
|
||||||
|
import { MainApi } from '@/api/apply/apply'
|
||||||
|
|
||||||
|
const props = defineProps<{
|
||||||
|
applyId: undefined // 立项ID(主表的关联字段)
|
||||||
|
}>()
|
||||||
|
const formLoading = ref(false) // 表单的加载中
|
||||||
|
const formData = ref([])
|
||||||
|
const formRules = reactive({
|
||||||
|
})
|
||||||
|
const formRef = ref() // 表单 Ref
|
||||||
|
|
||||||
|
/** 监听主表的关联字段的变化,加载对应的子表数据 */
|
||||||
|
watch(
|
||||||
|
() => props.applyId,
|
||||||
|
async (val) => {
|
||||||
|
// 1. 重置表单
|
||||||
|
formData.value = []
|
||||||
|
// 2. val 非空,则加载数据
|
||||||
|
if (!val) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
formLoading.value = true
|
||||||
|
formData.value = await MainApi.getParticipantListByApplyId(val)
|
||||||
|
} finally {
|
||||||
|
formLoading.value = false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{ immediate: true }
|
||||||
|
)
|
||||||
|
|
||||||
|
/** 新增按钮操作 */
|
||||||
|
const handleAdd = () => {
|
||||||
|
const row = {
|
||||||
|
id: undefined,
|
||||||
|
applyId: undefined,
|
||||||
|
name: undefined,
|
||||||
|
gender: undefined,
|
||||||
|
age: undefined,
|
||||||
|
education: undefined,
|
||||||
|
position: undefined,
|
||||||
|
engagingProfession: undefined,
|
||||||
|
divideWork: undefined,
|
||||||
|
deptId: undefined,
|
||||||
|
deptName: undefined,
|
||||||
|
orderNo: undefined,
|
||||||
|
createdBy: undefined,
|
||||||
|
createdTime: undefined,
|
||||||
|
updatedBy: undefined,
|
||||||
|
updatedTime: undefined,
|
||||||
|
}
|
||||||
|
row.applyId = props.applyId
|
||||||
|
formData.value.push(row)
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 删除按钮操作 */
|
||||||
|
const handleDelete = (index) => {
|
||||||
|
formData.value.splice(index, 1)
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 表单校验 */
|
||||||
|
const validate = () => {
|
||||||
|
return formRef.value.validate()
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 表单值 */
|
||||||
|
const getData = () => {
|
||||||
|
return formData.value
|
||||||
|
}
|
||||||
|
|
||||||
|
defineExpose({ validate, getData })
|
||||||
|
</script>
|
||||||
|
|
@ -0,0 +1,144 @@
|
||||||
|
<template>
|
||||||
|
<el-form
|
||||||
|
ref="formRef"
|
||||||
|
:model="formData"
|
||||||
|
:rules="formRules"
|
||||||
|
v-loading="formLoading"
|
||||||
|
label-width="0px"
|
||||||
|
:inline-message="true"
|
||||||
|
>
|
||||||
|
<el-table :data="formData" class="-mt-10px">
|
||||||
|
<el-table-column label="序号" type="index" width="100" />
|
||||||
|
<el-table-column label="时间" min-width="150">
|
||||||
|
<template #default="{ row, $index }">
|
||||||
|
<el-form-item :prop="`${$index}.implDate`" :rules="formRules.implDate" class="mb-0px!">
|
||||||
|
<el-date-picker
|
||||||
|
v-model="row.implDate"
|
||||||
|
type="date"
|
||||||
|
value-format="x"
|
||||||
|
placeholder="选择时间"
|
||||||
|
/>
|
||||||
|
</el-form-item>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="实施内容" min-width="200">
|
||||||
|
<template #default="{ row, $index }">
|
||||||
|
<el-form-item :prop="`${$index}.implContent`" :rules="formRules.implContent" class="mb-0px!">
|
||||||
|
<el-input v-model="row.implContent" type="textarea" placeholder="请输入实施内容" />
|
||||||
|
</el-form-item>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="创建人" min-width="150">
|
||||||
|
<template #default="{ row, $index }">
|
||||||
|
<el-form-item :prop="`${$index}.createdBy`" :rules="formRules.createdBy" class="mb-0px!">
|
||||||
|
<el-input v-model="row.createdBy" placeholder="请输入创建人" />
|
||||||
|
</el-form-item>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="创建时间" min-width="150">
|
||||||
|
<template #default="{ row, $index }">
|
||||||
|
<el-form-item :prop="`${$index}.createdTime`" :rules="formRules.createdTime" class="mb-0px!">
|
||||||
|
<el-date-picker
|
||||||
|
v-model="row.createdTime"
|
||||||
|
type="date"
|
||||||
|
value-format="x"
|
||||||
|
placeholder="选择创建时间"
|
||||||
|
/>
|
||||||
|
</el-form-item>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="更新人" min-width="150">
|
||||||
|
<template #default="{ row, $index }">
|
||||||
|
<el-form-item :prop="`${$index}.updatedBy`" :rules="formRules.updatedBy" class="mb-0px!">
|
||||||
|
<el-input v-model="row.updatedBy" placeholder="请输入更新人" />
|
||||||
|
</el-form-item>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="更新时间" min-width="150">
|
||||||
|
<template #default="{ row, $index }">
|
||||||
|
<el-form-item :prop="`${$index}.updatedTime`" :rules="formRules.updatedTime" class="mb-0px!">
|
||||||
|
<el-date-picker
|
||||||
|
v-model="row.updatedTime"
|
||||||
|
type="date"
|
||||||
|
value-format="x"
|
||||||
|
placeholder="选择更新时间"
|
||||||
|
/>
|
||||||
|
</el-form-item>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column align="center" fixed="right" label="操作" width="60">
|
||||||
|
<template #default="{ $index }">
|
||||||
|
<el-button @click="handleDelete($index)" link>—</el-button>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
</el-table>
|
||||||
|
</el-form>
|
||||||
|
<el-row justify="center" class="mt-3">
|
||||||
|
<el-button @click="handleAdd" round>+ 添加立项实施计划</el-button>
|
||||||
|
</el-row>
|
||||||
|
</template>
|
||||||
|
<script setup lang="ts">
|
||||||
|
import { MainApi } from '@/api/apply/apply'
|
||||||
|
|
||||||
|
const props = defineProps<{
|
||||||
|
applyId: undefined // 立项ID(主表的关联字段)
|
||||||
|
}>()
|
||||||
|
const formLoading = ref(false) // 表单的加载中
|
||||||
|
const formData = ref([])
|
||||||
|
const formRules = reactive({
|
||||||
|
})
|
||||||
|
const formRef = ref() // 表单 Ref
|
||||||
|
|
||||||
|
/** 监听主表的关联字段的变化,加载对应的子表数据 */
|
||||||
|
watch(
|
||||||
|
() => props.applyId,
|
||||||
|
async (val) => {
|
||||||
|
// 1. 重置表单
|
||||||
|
formData.value = []
|
||||||
|
// 2. val 非空,则加载数据
|
||||||
|
if (!val) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
formLoading.value = true
|
||||||
|
formData.value = await MainApi.getPlanListByApplyId(val)
|
||||||
|
} finally {
|
||||||
|
formLoading.value = false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{ immediate: true }
|
||||||
|
)
|
||||||
|
|
||||||
|
/** 新增按钮操作 */
|
||||||
|
const handleAdd = () => {
|
||||||
|
const row = {
|
||||||
|
id: undefined,
|
||||||
|
applyId: undefined,
|
||||||
|
implDate: undefined,
|
||||||
|
implContent: undefined,
|
||||||
|
createdBy: undefined,
|
||||||
|
createdTime: undefined,
|
||||||
|
updatedBy: undefined,
|
||||||
|
updatedTime: undefined,
|
||||||
|
}
|
||||||
|
row.applyId = props.applyId
|
||||||
|
formData.value.push(row)
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 删除按钮操作 */
|
||||||
|
const handleDelete = (index) => {
|
||||||
|
formData.value.splice(index, 1)
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 表单校验 */
|
||||||
|
const validate = () => {
|
||||||
|
return formRef.value.validate()
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 表单值 */
|
||||||
|
const getData = () => {
|
||||||
|
return formData.value
|
||||||
|
}
|
||||||
|
|
||||||
|
defineExpose({ validate, getData })
|
||||||
|
</script>
|
||||||
|
|
@ -0,0 +1,227 @@
|
||||||
|
<template>
|
||||||
|
<el-form
|
||||||
|
ref="formRef"
|
||||||
|
:model="formData"
|
||||||
|
:rules="formRules"
|
||||||
|
v-loading="formLoading"
|
||||||
|
label-width="0px"
|
||||||
|
:inline-message="true"
|
||||||
|
>
|
||||||
|
<el-table :data="formData" class="-mt-10px">
|
||||||
|
<el-table-column label="序号" type="index" width="100" />
|
||||||
|
<el-table-column label="单位ID" min-width="150">
|
||||||
|
<template #default="{ row, $index }">
|
||||||
|
<el-form-item :prop="`${$index}.deptId`" :rules="formRules.deptId" class="mb-0px!">
|
||||||
|
<el-input v-model="row.deptId" placeholder="请输入单位ID" />
|
||||||
|
</el-form-item>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="单位名称" min-width="150">
|
||||||
|
<template #default="{ row, $index }">
|
||||||
|
<el-form-item :prop="`${$index}.deptName`" :rules="formRules.deptName" class="mb-0px!">
|
||||||
|
<el-input v-model="row.deptName" placeholder="请输入单位名称" />
|
||||||
|
</el-form-item>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="集团经费" min-width="150">
|
||||||
|
<template #default="{ row, $index }">
|
||||||
|
<el-form-item :prop="`${$index}.groupFunds`" :rules="formRules.groupFunds" class="mb-0px!">
|
||||||
|
<el-input v-model="row.groupFunds" placeholder="请输入集团经费" />
|
||||||
|
</el-form-item>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="自筹" min-width="150">
|
||||||
|
<template #default="{ row, $index }">
|
||||||
|
<el-form-item :prop="`${$index}.selfFunds`" :rules="formRules.selfFunds" class="mb-0px!">
|
||||||
|
<el-input v-model="row.selfFunds" placeholder="请输入自筹" />
|
||||||
|
</el-form-item>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="其他" min-width="150">
|
||||||
|
<template #default="{ row, $index }">
|
||||||
|
<el-form-item :prop="`${$index}.otheerFunds`" :rules="formRules.otheerFunds" class="mb-0px!">
|
||||||
|
<el-input v-model="row.otheerFunds" placeholder="请输入其他" />
|
||||||
|
</el-form-item>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="联系人" min-width="150">
|
||||||
|
<template #default="{ row, $index }">
|
||||||
|
<el-form-item :prop="`${$index}.linkPerson`" :rules="formRules.linkPerson" class="mb-0px!">
|
||||||
|
<el-input v-model="row.linkPerson" placeholder="请输入联系人" />
|
||||||
|
</el-form-item>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="联系电话" min-width="150">
|
||||||
|
<template #default="{ row, $index }">
|
||||||
|
<el-form-item :prop="`${$index}.phoneNo`" :rules="formRules.phoneNo" class="mb-0px!">
|
||||||
|
<el-input v-model="row.phoneNo" placeholder="请输入联系电话" />
|
||||||
|
</el-form-item>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="邮箱" min-width="150">
|
||||||
|
<template #default="{ row, $index }">
|
||||||
|
<el-form-item :prop="`${$index}.email`" :rules="formRules.email" class="mb-0px!">
|
||||||
|
<el-input v-model="row.email" placeholder="请输入邮箱" />
|
||||||
|
</el-form-item>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="传真" min-width="150">
|
||||||
|
<template #default="{ row, $index }">
|
||||||
|
<el-form-item :prop="`${$index}.fax`" :rules="formRules.fax" class="mb-0px!">
|
||||||
|
<el-input v-model="row.fax" placeholder="请输入传真" />
|
||||||
|
</el-form-item>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="邮编" min-width="150">
|
||||||
|
<template #default="{ row, $index }">
|
||||||
|
<el-form-item :prop="`${$index}.postalCode`" :rules="formRules.postalCode" class="mb-0px!">
|
||||||
|
<el-input v-model="row.postalCode" placeholder="请输入邮编" />
|
||||||
|
</el-form-item>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="通讯地址" min-width="150">
|
||||||
|
<template #default="{ row, $index }">
|
||||||
|
<el-form-item :prop="`${$index}.address`" :rules="formRules.address" class="mb-0px!">
|
||||||
|
<el-input v-model="row.address" placeholder="请输入通讯地址" />
|
||||||
|
</el-form-item>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="标识(1:承担单位,2:联合承担单位,3:参加单位)" min-width="150">
|
||||||
|
<template #default="{ row, $index }">
|
||||||
|
<el-form-item :prop="`${$index}.sign`" :rules="formRules.sign" class="mb-0px!">
|
||||||
|
<el-input v-model="row.sign" placeholder="请输入标识(1:承担单位,2:联合承担单位,3:参加单位)" />
|
||||||
|
</el-form-item>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="排序号" min-width="150">
|
||||||
|
<template #default="{ row, $index }">
|
||||||
|
<el-form-item :prop="`${$index}.orderNo`" :rules="formRules.orderNo" class="mb-0px!">
|
||||||
|
<el-input v-model="row.orderNo" placeholder="请输入排序号" />
|
||||||
|
</el-form-item>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="创建人" min-width="150">
|
||||||
|
<template #default="{ row, $index }">
|
||||||
|
<el-form-item :prop="`${$index}.createdBy`" :rules="formRules.createdBy" class="mb-0px!">
|
||||||
|
<el-input v-model="row.createdBy" placeholder="请输入创建人" />
|
||||||
|
</el-form-item>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="创建时间" min-width="150">
|
||||||
|
<template #default="{ row, $index }">
|
||||||
|
<el-form-item :prop="`${$index}.createdTime`" :rules="formRules.createdTime" class="mb-0px!">
|
||||||
|
<el-date-picker
|
||||||
|
v-model="row.createdTime"
|
||||||
|
type="date"
|
||||||
|
value-format="x"
|
||||||
|
placeholder="选择创建时间"
|
||||||
|
/>
|
||||||
|
</el-form-item>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="更新人" min-width="150">
|
||||||
|
<template #default="{ row, $index }">
|
||||||
|
<el-form-item :prop="`${$index}.updatedBy`" :rules="formRules.updatedBy" class="mb-0px!">
|
||||||
|
<el-input v-model="row.updatedBy" placeholder="请输入更新人" />
|
||||||
|
</el-form-item>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="更新时间" min-width="150">
|
||||||
|
<template #default="{ row, $index }">
|
||||||
|
<el-form-item :prop="`${$index}.updatedTime`" :rules="formRules.updatedTime" class="mb-0px!">
|
||||||
|
<el-date-picker
|
||||||
|
v-model="row.updatedTime"
|
||||||
|
type="date"
|
||||||
|
value-format="x"
|
||||||
|
placeholder="选择更新时间"
|
||||||
|
/>
|
||||||
|
</el-form-item>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column align="center" fixed="right" label="操作" width="60">
|
||||||
|
<template #default="{ $index }">
|
||||||
|
<el-button @click="handleDelete($index)" link>—</el-button>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
</el-table>
|
||||||
|
</el-form>
|
||||||
|
<el-row justify="center" class="mt-3">
|
||||||
|
<el-button @click="handleAdd" round>+ 添加立项单位信息</el-button>
|
||||||
|
</el-row>
|
||||||
|
</template>
|
||||||
|
<script setup lang="ts">
|
||||||
|
import { MainApi } from '@/api/apply/apply'
|
||||||
|
|
||||||
|
const props = defineProps<{
|
||||||
|
applyId: undefined // 立项表ID(主表的关联字段)
|
||||||
|
}>()
|
||||||
|
const formLoading = ref(false) // 表单的加载中
|
||||||
|
const formData = ref([])
|
||||||
|
const formRules = reactive({
|
||||||
|
})
|
||||||
|
const formRef = ref() // 表单 Ref
|
||||||
|
|
||||||
|
/** 监听主表的关联字段的变化,加载对应的子表数据 */
|
||||||
|
watch(
|
||||||
|
() => props.applyId,
|
||||||
|
async (val) => {
|
||||||
|
// 1. 重置表单
|
||||||
|
formData.value = []
|
||||||
|
// 2. val 非空,则加载数据
|
||||||
|
if (!val) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
formLoading.value = true
|
||||||
|
formData.value = await MainApi.getUnitsListByApplyId(val)
|
||||||
|
} finally {
|
||||||
|
formLoading.value = false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{ immediate: true }
|
||||||
|
)
|
||||||
|
|
||||||
|
/** 新增按钮操作 */
|
||||||
|
const handleAdd = () => {
|
||||||
|
const row = {
|
||||||
|
id: undefined,
|
||||||
|
applyId: undefined,
|
||||||
|
deptId: undefined,
|
||||||
|
deptName: undefined,
|
||||||
|
groupFunds: undefined,
|
||||||
|
selfFunds: undefined,
|
||||||
|
otheerFunds: undefined,
|
||||||
|
linkPerson: undefined,
|
||||||
|
phoneNo: undefined,
|
||||||
|
email: undefined,
|
||||||
|
fax: undefined,
|
||||||
|
postalCode: undefined,
|
||||||
|
address: undefined,
|
||||||
|
sign: undefined,
|
||||||
|
orderNo: undefined,
|
||||||
|
createdBy: undefined,
|
||||||
|
createdTime: undefined,
|
||||||
|
updatedBy: undefined,
|
||||||
|
updatedTime: undefined,
|
||||||
|
}
|
||||||
|
row.applyId = props.applyId
|
||||||
|
formData.value.push(row)
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 删除按钮操作 */
|
||||||
|
const handleDelete = (index) => {
|
||||||
|
formData.value.splice(index, 1)
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 表单校验 */
|
||||||
|
const validate = () => {
|
||||||
|
return formRef.value.validate()
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 表单值 */
|
||||||
|
const getData = () => {
|
||||||
|
return formData.value
|
||||||
|
}
|
||||||
|
|
||||||
|
defineExpose({ validate, getData })
|
||||||
|
</script>
|
||||||
|
|
@ -0,0 +1,247 @@
|
||||||
|
<template>
|
||||||
|
<ContentWrap>
|
||||||
|
<!-- 搜索工作栏 -->
|
||||||
|
<el-form
|
||||||
|
class="-mb-15px"
|
||||||
|
:model="queryParams"
|
||||||
|
ref="queryFormRef"
|
||||||
|
:inline="true"
|
||||||
|
label-width="100px"
|
||||||
|
>
|
||||||
|
<el-form-item label="编号" prop="number">
|
||||||
|
<el-input
|
||||||
|
v-model="queryParams.number"
|
||||||
|
placeholder="请输入编号"
|
||||||
|
clearable
|
||||||
|
@keyup.enter="handleQuery"
|
||||||
|
class="!w-240px"
|
||||||
|
/>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="项目名称" prop="name">
|
||||||
|
<el-input
|
||||||
|
v-model="queryParams.name"
|
||||||
|
placeholder="请输入项目名称"
|
||||||
|
clearable
|
||||||
|
@keyup.enter="handleQuery"
|
||||||
|
class="!w-240px"
|
||||||
|
/>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="所属技术领域" prop="technicalField">
|
||||||
|
<el-select
|
||||||
|
v-model="queryParams.technicalField"
|
||||||
|
placeholder="请选择所属技术领域"
|
||||||
|
clearable
|
||||||
|
class="!w-240px"
|
||||||
|
>
|
||||||
|
<el-option
|
||||||
|
v-for="dict in getStrDictOptions(DICT_TYPE.TECHNICAL_FIELD)"
|
||||||
|
:key="dict.value"
|
||||||
|
:label="dict.label"
|
||||||
|
:value="dict.value"
|
||||||
|
/>
|
||||||
|
</el-select>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="年度" prop="year">
|
||||||
|
<el-input
|
||||||
|
v-model="queryParams.year"
|
||||||
|
placeholder="请输入年度"
|
||||||
|
clearable
|
||||||
|
@keyup.enter="handleQuery"
|
||||||
|
class="!w-240px"
|
||||||
|
/>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="负责人姓名" prop="director">
|
||||||
|
<el-input
|
||||||
|
v-model="queryParams.director"
|
||||||
|
placeholder="请输入负责人姓名"
|
||||||
|
clearable
|
||||||
|
@keyup.enter="handleQuery"
|
||||||
|
class="!w-240px"
|
||||||
|
/>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="主管部门" prop="competentDeptName">
|
||||||
|
<el-input
|
||||||
|
v-model="queryParams.competentDeptName"
|
||||||
|
placeholder="请输入主管部门"
|
||||||
|
clearable
|
||||||
|
@keyup.enter="handleQuery"
|
||||||
|
class="!w-240px"
|
||||||
|
/>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="主管工程师" prop="managerName">
|
||||||
|
<el-input
|
||||||
|
v-model="queryParams.managerName"
|
||||||
|
placeholder="请输入主管工程师"
|
||||||
|
clearable
|
||||||
|
@keyup.enter="handleQuery"
|
||||||
|
class="!w-240px"
|
||||||
|
/>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item>
|
||||||
|
<el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> 搜索</el-button>
|
||||||
|
<el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> 重置</el-button>
|
||||||
|
<el-button
|
||||||
|
type="primary"
|
||||||
|
plain
|
||||||
|
@click="openForm('create')"
|
||||||
|
v-hasPermi="['apply:main:create']"
|
||||||
|
>
|
||||||
|
<Icon icon="ep:plus" class="mr-5px" /> 新增
|
||||||
|
</el-button>
|
||||||
|
<el-button
|
||||||
|
type="success"
|
||||||
|
plain
|
||||||
|
@click="handleExport"
|
||||||
|
:loading="exportLoading"
|
||||||
|
v-hasPermi="['apply:main:export']"
|
||||||
|
>
|
||||||
|
<Icon icon="ep:download" class="mr-5px" /> 导出
|
||||||
|
</el-button>
|
||||||
|
</el-form-item>
|
||||||
|
</el-form>
|
||||||
|
</ContentWrap>
|
||||||
|
|
||||||
|
<!-- 列表 -->
|
||||||
|
<ContentWrap>
|
||||||
|
<el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true">
|
||||||
|
<el-table-column label="编号" align="center" prop="number" />
|
||||||
|
<el-table-column label="项目名称" align="center" prop="name" width="300px"/>
|
||||||
|
<el-table-column label="所属技术领域" align="center" prop="technicalField" width="200px">
|
||||||
|
<template #default="scope">
|
||||||
|
<dict-tag :type="DICT_TYPE.TECHNICAL_FIELD" :value="scope.row.technicalField" />
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="年度" align="center" prop="year" />
|
||||||
|
<el-table-column label="开始时间" align="center" prop="beginDate" />
|
||||||
|
<el-table-column label="结束时间" align="center" prop="endData" />
|
||||||
|
<el-table-column label="负责人" align="center" prop="director" />
|
||||||
|
<el-table-column label="电话" align="center" prop="phoneNo" />
|
||||||
|
<el-table-column label="邮箱" align="center" prop="email" />
|
||||||
|
<el-table-column label="主管部门" align="center" prop="competentDeptName" />
|
||||||
|
<el-table-column label="主管工程师" align="center" prop="managerName" />
|
||||||
|
<el-table-column label="操作" align="center">
|
||||||
|
<template #default="scope">
|
||||||
|
<el-button
|
||||||
|
link
|
||||||
|
type="primary"
|
||||||
|
@click="openForm('update', scope.row.id)"
|
||||||
|
v-hasPermi="['apply:main:update']"
|
||||||
|
>
|
||||||
|
编辑
|
||||||
|
</el-button>
|
||||||
|
<el-button
|
||||||
|
link
|
||||||
|
type="danger"
|
||||||
|
@click="handleDelete(scope.row.id)"
|
||||||
|
v-hasPermi="['apply:main:delete']"
|
||||||
|
>
|
||||||
|
删除
|
||||||
|
</el-button>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
</el-table>
|
||||||
|
<!-- 分页 -->
|
||||||
|
<Pagination
|
||||||
|
:total="total"
|
||||||
|
v-model:page="queryParams.pageNo"
|
||||||
|
v-model:limit="queryParams.pageSize"
|
||||||
|
@pagination="getList"
|
||||||
|
/>
|
||||||
|
</ContentWrap>
|
||||||
|
|
||||||
|
<!-- 表单弹窗:添加/修改 -->
|
||||||
|
<MainForm ref="formRef" @success="getList" />
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup lang="ts">
|
||||||
|
import { getStrDictOptions, DICT_TYPE } from '@/utils/dict'
|
||||||
|
import download from '@/utils/download'
|
||||||
|
import { MainApi, MainVO } from '@/api/apply/apply'
|
||||||
|
import MainForm from './MainForm.vue'
|
||||||
|
|
||||||
|
/** 立项申请 列表 */
|
||||||
|
defineOptions({ name: 'ApplyMain' })
|
||||||
|
|
||||||
|
const message = useMessage() // 消息弹窗
|
||||||
|
const { t } = useI18n() // 国际化
|
||||||
|
|
||||||
|
const loading = ref(true) // 列表的加载中
|
||||||
|
const list = ref<MainVO[]>([]) // 列表的数据
|
||||||
|
const total = ref(0) // 列表的总页数
|
||||||
|
const queryParams = reactive({
|
||||||
|
pageNo: 1,
|
||||||
|
pageSize: 10,
|
||||||
|
number: undefined,
|
||||||
|
name: undefined,
|
||||||
|
technicalField: undefined,
|
||||||
|
year: undefined,
|
||||||
|
director: undefined,
|
||||||
|
competentDeptName: undefined,
|
||||||
|
managerName: undefined,
|
||||||
|
})
|
||||||
|
const queryFormRef = ref() // 搜索的表单
|
||||||
|
const exportLoading = ref(false) // 导出的加载中
|
||||||
|
|
||||||
|
/** 查询列表 */
|
||||||
|
const getList = async () => {
|
||||||
|
loading.value = true
|
||||||
|
try {
|
||||||
|
const data = await MainApi.getMainPage(queryParams)
|
||||||
|
list.value = data.list
|
||||||
|
total.value = data.total
|
||||||
|
} finally {
|
||||||
|
loading.value = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 搜索按钮操作 */
|
||||||
|
const handleQuery = () => {
|
||||||
|
queryParams.pageNo = 1
|
||||||
|
getList()
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 重置按钮操作 */
|
||||||
|
const resetQuery = () => {
|
||||||
|
queryFormRef.value.resetFields()
|
||||||
|
handleQuery()
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 添加/修改操作 */
|
||||||
|
const formRef = ref()
|
||||||
|
const openForm = (type: string, id?: number) => {
|
||||||
|
formRef.value.open(type, id)
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 删除按钮操作 */
|
||||||
|
const handleDelete = async (id: number) => {
|
||||||
|
try {
|
||||||
|
// 删除的二次确认
|
||||||
|
await message.delConfirm()
|
||||||
|
// 发起删除
|
||||||
|
await MainApi.deleteMain(id)
|
||||||
|
message.success(t('common.delSuccess'))
|
||||||
|
// 刷新列表
|
||||||
|
await getList()
|
||||||
|
} catch {}
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 导出按钮操作 */
|
||||||
|
const handleExport = async () => {
|
||||||
|
try {
|
||||||
|
// 导出的二次确认
|
||||||
|
await message.exportConfirm()
|
||||||
|
// 发起导出
|
||||||
|
exportLoading.value = true
|
||||||
|
const data = await MainApi.exportMain(queryParams)
|
||||||
|
download.excel(data, '立项申请.xls')
|
||||||
|
} catch {
|
||||||
|
} finally {
|
||||||
|
exportLoading.value = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 初始化 **/
|
||||||
|
onMounted(() => {
|
||||||
|
getList()
|
||||||
|
})
|
||||||
|
</script>
|
||||||
|
|
@ -0,0 +1,153 @@
|
||||||
|
<template>
|
||||||
|
<Dialog :title="dialogTitle" v-model="dialogVisible">
|
||||||
|
<el-form
|
||||||
|
ref="formRef"
|
||||||
|
:model="formData"
|
||||||
|
:rules="formRules"
|
||||||
|
label-width="100px"
|
||||||
|
v-loading="formLoading"
|
||||||
|
>
|
||||||
|
<el-form-item label="合同ID" prop="contractId">
|
||||||
|
<el-input v-model="formData.contractId" placeholder="请输入合同ID" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="变更类型" prop="changeType">
|
||||||
|
<el-select v-model="formData.changeType" placeholder="请选择变更类型">
|
||||||
|
<el-option label="请选择字典生成" value="" />
|
||||||
|
</el-select>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="变更内容" prop="changeContent">
|
||||||
|
<el-input v-model="formData.changeContent" type="textarea" placeholder="请输入变更内容" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="主管部门ID" prop="competentDeptId">
|
||||||
|
<el-input v-model="formData.competentDeptId" placeholder="请输入主管部门ID" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="主管部门" prop="competentDeptName">
|
||||||
|
<el-input v-model="formData.competentDeptName" placeholder="请输入主管部门" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="主管工程师ID" prop="managerId">
|
||||||
|
<el-input v-model="formData.managerId" placeholder="请输入主管工程师ID" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="主管工程师" prop="managerName">
|
||||||
|
<el-input v-model="formData.managerName" placeholder="请输入主管工程师" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="创建人" prop="createdBy">
|
||||||
|
<el-input v-model="formData.createdBy" placeholder="请输入创建人" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="创建时间" prop="createdTime">
|
||||||
|
<el-date-picker
|
||||||
|
v-model="formData.createdTime"
|
||||||
|
type="date"
|
||||||
|
value-format="x"
|
||||||
|
placeholder="选择创建时间"
|
||||||
|
/>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="更新人" prop="updatedBy">
|
||||||
|
<el-input v-model="formData.updatedBy" placeholder="请输入更新人" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="更新时间" prop="updatedTime">
|
||||||
|
<el-date-picker
|
||||||
|
v-model="formData.updatedTime"
|
||||||
|
type="date"
|
||||||
|
value-format="x"
|
||||||
|
placeholder="选择更新时间"
|
||||||
|
/>
|
||||||
|
</el-form-item>
|
||||||
|
</el-form>
|
||||||
|
<template #footer>
|
||||||
|
<el-button @click="submitForm" type="primary" :disabled="formLoading">确 定</el-button>
|
||||||
|
<el-button @click="dialogVisible = false">取 消</el-button>
|
||||||
|
</template>
|
||||||
|
</Dialog>
|
||||||
|
</template>
|
||||||
|
<script setup lang="ts">
|
||||||
|
import { MainApi, MainVO } from '@/api/change/change'
|
||||||
|
|
||||||
|
/** 变更主 表单 */
|
||||||
|
defineOptions({ name: 'MainForm' })
|
||||||
|
|
||||||
|
const { t } = useI18n() // 国际化
|
||||||
|
const message = useMessage() // 消息弹窗
|
||||||
|
|
||||||
|
const dialogVisible = ref(false) // 弹窗的是否展示
|
||||||
|
const dialogTitle = ref('') // 弹窗的标题
|
||||||
|
const formLoading = ref(false) // 表单的加载中:1)修改时的数据加载;2)提交的按钮禁用
|
||||||
|
const formType = ref('') // 表单的类型:create - 新增;update - 修改
|
||||||
|
const formData = ref({
|
||||||
|
id: undefined,
|
||||||
|
contractId: undefined,
|
||||||
|
changeType: undefined,
|
||||||
|
changeContent: undefined,
|
||||||
|
competentDeptId: undefined,
|
||||||
|
competentDeptName: undefined,
|
||||||
|
managerId: undefined,
|
||||||
|
managerName: undefined,
|
||||||
|
createdBy: undefined,
|
||||||
|
createdTime: undefined,
|
||||||
|
updatedBy: undefined,
|
||||||
|
updatedTime: undefined,
|
||||||
|
})
|
||||||
|
const formRules = reactive({
|
||||||
|
})
|
||||||
|
const formRef = ref() // 表单 Ref
|
||||||
|
|
||||||
|
/** 打开弹窗 */
|
||||||
|
const open = async (type: string, id?: number) => {
|
||||||
|
dialogVisible.value = true
|
||||||
|
dialogTitle.value = t('action.' + type)
|
||||||
|
formType.value = type
|
||||||
|
resetForm()
|
||||||
|
// 修改时,设置数据
|
||||||
|
if (id) {
|
||||||
|
formLoading.value = true
|
||||||
|
try {
|
||||||
|
formData.value = await MainApi.getMain(id)
|
||||||
|
} finally {
|
||||||
|
formLoading.value = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
defineExpose({ open }) // 提供 open 方法,用于打开弹窗
|
||||||
|
|
||||||
|
/** 提交表单 */
|
||||||
|
const emit = defineEmits(['success']) // 定义 success 事件,用于操作成功后的回调
|
||||||
|
const submitForm = async () => {
|
||||||
|
// 校验表单
|
||||||
|
await formRef.value.validate()
|
||||||
|
// 提交请求
|
||||||
|
formLoading.value = true
|
||||||
|
try {
|
||||||
|
const data = formData.value as unknown as MainVO
|
||||||
|
if (formType.value === 'create') {
|
||||||
|
await MainApi.createMain(data)
|
||||||
|
message.success(t('common.createSuccess'))
|
||||||
|
} else {
|
||||||
|
await MainApi.updateMain(data)
|
||||||
|
message.success(t('common.updateSuccess'))
|
||||||
|
}
|
||||||
|
dialogVisible.value = false
|
||||||
|
// 发送操作成功的事件
|
||||||
|
emit('success')
|
||||||
|
} finally {
|
||||||
|
formLoading.value = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 重置表单 */
|
||||||
|
const resetForm = () => {
|
||||||
|
formData.value = {
|
||||||
|
id: undefined,
|
||||||
|
contractId: undefined,
|
||||||
|
changeType: undefined,
|
||||||
|
changeContent: undefined,
|
||||||
|
competentDeptId: undefined,
|
||||||
|
competentDeptName: undefined,
|
||||||
|
managerId: undefined,
|
||||||
|
managerName: undefined,
|
||||||
|
createdBy: undefined,
|
||||||
|
createdTime: undefined,
|
||||||
|
updatedBy: undefined,
|
||||||
|
updatedTime: undefined,
|
||||||
|
}
|
||||||
|
formRef.value?.resetFields()
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
@ -0,0 +1,194 @@
|
||||||
|
<template>
|
||||||
|
<ContentWrap>
|
||||||
|
<!-- 搜索工作栏 -->
|
||||||
|
<el-form
|
||||||
|
class="-mb-15px"
|
||||||
|
:model="queryParams"
|
||||||
|
ref="queryFormRef"
|
||||||
|
:inline="true"
|
||||||
|
label-width="68px"
|
||||||
|
>
|
||||||
|
<el-form-item label="变更类型" prop="changeType">
|
||||||
|
<el-select
|
||||||
|
v-model="queryParams.changeType"
|
||||||
|
placeholder="请选择变更类型"
|
||||||
|
clearable
|
||||||
|
class="!w-240px"
|
||||||
|
>
|
||||||
|
<el-option label="请选择字典生成" value="" />
|
||||||
|
</el-select>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="主管部门" prop="competentDeptName">
|
||||||
|
<el-input
|
||||||
|
v-model="queryParams.competentDeptName"
|
||||||
|
placeholder="请输入主管部门"
|
||||||
|
clearable
|
||||||
|
@keyup.enter="handleQuery"
|
||||||
|
class="!w-240px"
|
||||||
|
/>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="主管工程师" prop="managerName">
|
||||||
|
<el-input
|
||||||
|
v-model="queryParams.managerName"
|
||||||
|
placeholder="请输入主管工程师"
|
||||||
|
clearable
|
||||||
|
@keyup.enter="handleQuery"
|
||||||
|
class="!w-240px"
|
||||||
|
/>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item>
|
||||||
|
<el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> 搜索</el-button>
|
||||||
|
<el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> 重置</el-button>
|
||||||
|
<el-button
|
||||||
|
type="primary"
|
||||||
|
plain
|
||||||
|
@click="openForm('create')"
|
||||||
|
v-hasPermi="['change:main:create']"
|
||||||
|
>
|
||||||
|
<Icon icon="ep:plus" class="mr-5px" /> 新增
|
||||||
|
</el-button>
|
||||||
|
<el-button
|
||||||
|
type="success"
|
||||||
|
plain
|
||||||
|
@click="handleExport"
|
||||||
|
:loading="exportLoading"
|
||||||
|
v-hasPermi="['change:main:export']"
|
||||||
|
>
|
||||||
|
<Icon icon="ep:download" class="mr-5px" /> 导出
|
||||||
|
</el-button>
|
||||||
|
</el-form-item>
|
||||||
|
</el-form>
|
||||||
|
</ContentWrap>
|
||||||
|
|
||||||
|
<!-- 列表 -->
|
||||||
|
<ContentWrap>
|
||||||
|
<el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true">
|
||||||
|
<el-table-column label="id" align="center" prop="id" />
|
||||||
|
<el-table-column label="合同ID" align="center" prop="contractId" />
|
||||||
|
<el-table-column label="变更类型" align="center" prop="changeType" />
|
||||||
|
<el-table-column label="变更内容" align="center" prop="changeContent" />
|
||||||
|
<el-table-column label="主管部门ID" align="center" prop="competentDeptId" />
|
||||||
|
<el-table-column label="主管部门" align="center" prop="competentDeptName" />
|
||||||
|
<el-table-column label="主管工程师ID" align="center" prop="managerId" />
|
||||||
|
<el-table-column label="主管工程师" align="center" prop="managerName" />
|
||||||
|
<el-table-column label="操作" align="center">
|
||||||
|
<template #default="scope">
|
||||||
|
<el-button
|
||||||
|
link
|
||||||
|
type="primary"
|
||||||
|
@click="openForm('update', scope.row.id)"
|
||||||
|
v-hasPermi="['change:main:update']"
|
||||||
|
>
|
||||||
|
编辑
|
||||||
|
</el-button>
|
||||||
|
<el-button
|
||||||
|
link
|
||||||
|
type="danger"
|
||||||
|
@click="handleDelete(scope.row.id)"
|
||||||
|
v-hasPermi="['change:main:delete']"
|
||||||
|
>
|
||||||
|
删除
|
||||||
|
</el-button>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
</el-table>
|
||||||
|
<!-- 分页 -->
|
||||||
|
<Pagination
|
||||||
|
:total="total"
|
||||||
|
v-model:page="queryParams.pageNo"
|
||||||
|
v-model:limit="queryParams.pageSize"
|
||||||
|
@pagination="getList"
|
||||||
|
/>
|
||||||
|
</ContentWrap>
|
||||||
|
|
||||||
|
<!-- 表单弹窗:添加/修改 -->
|
||||||
|
<MainForm ref="formRef" @success="getList" />
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup lang="ts">
|
||||||
|
import download from '@/utils/download'
|
||||||
|
import { MainApi, MainVO } from '@/api/change/change'
|
||||||
|
import MainForm from './MainForm.vue'
|
||||||
|
|
||||||
|
/** 变更主 列表 */
|
||||||
|
defineOptions({ name: 'ChangeMain' })
|
||||||
|
|
||||||
|
const message = useMessage() // 消息弹窗
|
||||||
|
const { t } = useI18n() // 国际化
|
||||||
|
|
||||||
|
const loading = ref(true) // 列表的加载中
|
||||||
|
const list = ref<MainVO[]>([]) // 列表的数据
|
||||||
|
const total = ref(0) // 列表的总页数
|
||||||
|
const queryParams = reactive({
|
||||||
|
pageNo: 1,
|
||||||
|
pageSize: 10,
|
||||||
|
changeType: undefined,
|
||||||
|
competentDeptName: undefined,
|
||||||
|
managerName: undefined,
|
||||||
|
})
|
||||||
|
const queryFormRef = ref() // 搜索的表单
|
||||||
|
const exportLoading = ref(false) // 导出的加载中
|
||||||
|
|
||||||
|
/** 查询列表 */
|
||||||
|
const getList = async () => {
|
||||||
|
loading.value = true
|
||||||
|
try {
|
||||||
|
const data = await MainApi.getMainPage(queryParams)
|
||||||
|
list.value = data.list
|
||||||
|
total.value = data.total
|
||||||
|
} finally {
|
||||||
|
loading.value = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 搜索按钮操作 */
|
||||||
|
const handleQuery = () => {
|
||||||
|
queryParams.pageNo = 1
|
||||||
|
getList()
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 重置按钮操作 */
|
||||||
|
const resetQuery = () => {
|
||||||
|
queryFormRef.value.resetFields()
|
||||||
|
handleQuery()
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 添加/修改操作 */
|
||||||
|
const formRef = ref()
|
||||||
|
const openForm = (type: string, id?: number) => {
|
||||||
|
formRef.value.open(type, id)
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 删除按钮操作 */
|
||||||
|
const handleDelete = async (id: number) => {
|
||||||
|
try {
|
||||||
|
// 删除的二次确认
|
||||||
|
await message.delConfirm()
|
||||||
|
// 发起删除
|
||||||
|
await MainApi.deleteMain(id)
|
||||||
|
message.success(t('common.delSuccess'))
|
||||||
|
// 刷新列表
|
||||||
|
await getList()
|
||||||
|
} catch {}
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 导出按钮操作 */
|
||||||
|
const handleExport = async () => {
|
||||||
|
try {
|
||||||
|
// 导出的二次确认
|
||||||
|
await message.exportConfirm()
|
||||||
|
// 发起导出
|
||||||
|
exportLoading.value = true
|
||||||
|
const data = await MainApi.exportMain(queryParams)
|
||||||
|
download.excel(data, '变更主.xls')
|
||||||
|
} catch {
|
||||||
|
} finally {
|
||||||
|
exportLoading.value = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 初始化 **/
|
||||||
|
onMounted(() => {
|
||||||
|
getList()
|
||||||
|
})
|
||||||
|
</script>
|
||||||
|
|
@ -0,0 +1,321 @@
|
||||||
|
<template>
|
||||||
|
<Dialog :title="dialogTitle" v-model="dialogVisible">
|
||||||
|
<el-form
|
||||||
|
ref="formRef"
|
||||||
|
:model="formData"
|
||||||
|
:rules="formRules"
|
||||||
|
label-width="100px"
|
||||||
|
v-loading="formLoading"
|
||||||
|
>
|
||||||
|
<el-form-item label="合同编号" prop="code">
|
||||||
|
<el-input v-model="formData.code" placeholder="请输入合同编号" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="任务名称" prop="name">
|
||||||
|
<el-input v-model="formData.name" placeholder="请输入任务名称" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="所属技术领域" prop="technicalField">
|
||||||
|
<el-select v-model="formData.technicalField" placeholder="请选择所属技术领域">
|
||||||
|
<el-option
|
||||||
|
v-for="dict in getStrDictOptions(DICT_TYPE.TECHNICAL_FIELD)"
|
||||||
|
:key="dict.value"
|
||||||
|
:label="dict.label"
|
||||||
|
:value="dict.value"
|
||||||
|
/>
|
||||||
|
</el-select>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="计划类型Id" prop="planId">
|
||||||
|
<el-input v-model="formData.planId" placeholder="请输入计划类型Id" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="计划类型名称" prop="planName">
|
||||||
|
<el-select v-model="formData.planName" placeholder="请选择计划类型名称">
|
||||||
|
<el-option
|
||||||
|
v-for="dict in getStrDictOptions(DICT_TYPE.PLAN_ID)"
|
||||||
|
:key="dict.value"
|
||||||
|
:label="dict.label"
|
||||||
|
:value="dict.value"
|
||||||
|
/>
|
||||||
|
</el-select>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="年度" prop="year">
|
||||||
|
<el-input v-model="formData.year" placeholder="请输入年度" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="开始时间" prop="beginDate">
|
||||||
|
<el-date-picker
|
||||||
|
v-model="formData.beginDate"
|
||||||
|
type="date"
|
||||||
|
value-format="x"
|
||||||
|
placeholder="选择开始时间"
|
||||||
|
/>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="结束时间" prop="endData">
|
||||||
|
<el-date-picker
|
||||||
|
v-model="formData.endData"
|
||||||
|
type="date"
|
||||||
|
value-format="x"
|
||||||
|
placeholder="选择结束时间"
|
||||||
|
/>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="负责人Id" prop="directorId">
|
||||||
|
<el-input v-model="formData.directorId" placeholder="请输入负责人Id" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="负责人姓名" prop="director">
|
||||||
|
<el-input v-model="formData.director" placeholder="请输入负责人姓名" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="负责人性别" prop="gender">
|
||||||
|
<el-input v-model="formData.gender" placeholder="请输入负责人性别" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="年龄" prop="age">
|
||||||
|
<el-input v-model="formData.age" placeholder="请输入年龄" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="学历" prop="education">
|
||||||
|
<el-input v-model="formData.education" placeholder="请输入学历" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="所学专业" prop="major">
|
||||||
|
<el-input v-model="formData.major" placeholder="请输入所学专业" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="从事专业" prop="engagMajor">
|
||||||
|
<el-input v-model="formData.engagMajor" placeholder="请输入从事专业" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="职务(职称)" prop="position">
|
||||||
|
<el-input v-model="formData.position" placeholder="请输入职务(职称)" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="电话" prop="phoneNo">
|
||||||
|
<el-input v-model="formData.phoneNo" placeholder="请输入电话" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="邮箱" prop="email">
|
||||||
|
<el-input v-model="formData.email" placeholder="请输入邮箱" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="传真" prop="fax">
|
||||||
|
<el-input v-model="formData.fax" placeholder="请输入传真" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="邮编" prop="postalCode">
|
||||||
|
<el-input v-model="formData.postalCode" placeholder="请输入邮编" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="通讯地址" prop="address">
|
||||||
|
<el-input v-model="formData.address" placeholder="请输入通讯地址" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="主要业绩" prop="achievement">
|
||||||
|
<el-input v-model="formData.achievement" placeholder="请输入主要业绩" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="主管部门ID" prop="competentDeptId">
|
||||||
|
<el-input v-model="formData.competentDeptId" placeholder="请输入主管部门ID" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="主管部门" prop="competentDeptName">
|
||||||
|
<el-input v-model="formData.competentDeptName" placeholder="请输入主管部门" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="主管工程师ID" prop="managerId">
|
||||||
|
<el-input v-model="formData.managerId" placeholder="请输入主管工程师ID" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="主管工程师" prop="managerName">
|
||||||
|
<el-input v-model="formData.managerName" placeholder="请输入主管工程师" />
|
||||||
|
</el-form-item>
|
||||||
|
</el-form>
|
||||||
|
<!-- 子表的表单 -->
|
||||||
|
<el-tabs v-model="subTabsName">
|
||||||
|
<el-tab-pane label="合同预期主要成果形式、知识产权归属" name="achie">
|
||||||
|
<AchieForm ref="achieFormRef" :contract-id="formData.id" />
|
||||||
|
</el-tab-pane>
|
||||||
|
<el-tab-pane label="合同经费" name="funds">
|
||||||
|
<FundsForm ref="fundsFormRef" :contract-id="formData.id" />
|
||||||
|
</el-tab-pane>
|
||||||
|
<el-tab-pane label="合同详细信息" name="info">
|
||||||
|
<InfoForm ref="infoFormRef" :contract-id="formData.id" />
|
||||||
|
</el-tab-pane>
|
||||||
|
<el-tab-pane label="合同主要参加人员" name="participant">
|
||||||
|
<ParticipantForm ref="participantFormRef" :contract-id="formData.id" />
|
||||||
|
</el-tab-pane>
|
||||||
|
<el-tab-pane label="合同实施计划" name="plan">
|
||||||
|
<PlanForm ref="planFormRef" :contract-id="formData.id" />
|
||||||
|
</el-tab-pane>
|
||||||
|
<el-tab-pane label="合同单位信息" name="units">
|
||||||
|
<UnitsForm ref="unitsFormRef" :contract-id="formData.id" />
|
||||||
|
</el-tab-pane>
|
||||||
|
</el-tabs>
|
||||||
|
<template #footer>
|
||||||
|
<el-button @click="submitForm" type="primary" :disabled="formLoading">确 定</el-button>
|
||||||
|
<el-button @click="dialogVisible = false">取 消</el-button>
|
||||||
|
</template>
|
||||||
|
</Dialog>
|
||||||
|
</template>
|
||||||
|
<script setup lang="ts">
|
||||||
|
import { getStrDictOptions, DICT_TYPE } from '@/utils/dict'
|
||||||
|
import { MainApi, MainVO } from '@/api/contract/contract'
|
||||||
|
import AchieForm from './components/AchieForm.vue'
|
||||||
|
import FundsForm from './components/FundsForm.vue'
|
||||||
|
import InfoForm from './components/InfoForm.vue'
|
||||||
|
import ParticipantForm from './components/ParticipantForm.vue'
|
||||||
|
import PlanForm from './components/PlanForm.vue'
|
||||||
|
import UnitsForm from './components/UnitsForm.vue'
|
||||||
|
|
||||||
|
/** 合同(任务书)信息主 表单 */
|
||||||
|
defineOptions({ name: 'MainForm' })
|
||||||
|
|
||||||
|
const { t } = useI18n() // 国际化
|
||||||
|
const message = useMessage() // 消息弹窗
|
||||||
|
|
||||||
|
const dialogVisible = ref(false) // 弹窗的是否展示
|
||||||
|
const dialogTitle = ref('') // 弹窗的标题
|
||||||
|
const formLoading = ref(false) // 表单的加载中:1)修改时的数据加载;2)提交的按钮禁用
|
||||||
|
const formType = ref('') // 表单的类型:create - 新增;update - 修改
|
||||||
|
const formData = ref({
|
||||||
|
id: undefined,
|
||||||
|
code: undefined,
|
||||||
|
name: undefined,
|
||||||
|
technicalField: undefined,
|
||||||
|
planId: undefined,
|
||||||
|
planName: undefined,
|
||||||
|
year: undefined,
|
||||||
|
beginDate: undefined,
|
||||||
|
endData: undefined,
|
||||||
|
directorId: undefined,
|
||||||
|
director: undefined,
|
||||||
|
gender: undefined,
|
||||||
|
age: undefined,
|
||||||
|
education: undefined,
|
||||||
|
major: undefined,
|
||||||
|
engagMajor: undefined,
|
||||||
|
position: undefined,
|
||||||
|
phoneNo: undefined,
|
||||||
|
email: undefined,
|
||||||
|
fax: undefined,
|
||||||
|
postalCode: undefined,
|
||||||
|
address: undefined,
|
||||||
|
achievement: undefined,
|
||||||
|
competentDeptId: undefined,
|
||||||
|
competentDeptName: undefined,
|
||||||
|
managerId: undefined,
|
||||||
|
managerName: undefined,
|
||||||
|
})
|
||||||
|
const formRules = reactive({
|
||||||
|
})
|
||||||
|
const formRef = ref() // 表单 Ref
|
||||||
|
|
||||||
|
/** 子表的表单 */
|
||||||
|
const subTabsName = ref('achie')
|
||||||
|
const achieFormRef = ref()
|
||||||
|
const fundsFormRef = ref()
|
||||||
|
const infoFormRef = ref()
|
||||||
|
const participantFormRef = ref()
|
||||||
|
const planFormRef = ref()
|
||||||
|
const unitsFormRef = ref()
|
||||||
|
|
||||||
|
/** 打开弹窗 */
|
||||||
|
const open = async (type: string, id?: number) => {
|
||||||
|
dialogVisible.value = true
|
||||||
|
dialogTitle.value = t('action.' + type)
|
||||||
|
formType.value = type
|
||||||
|
resetForm()
|
||||||
|
// 修改时,设置数据
|
||||||
|
if (id) {
|
||||||
|
formLoading.value = true
|
||||||
|
try {
|
||||||
|
formData.value = await MainApi.getMain(id)
|
||||||
|
} finally {
|
||||||
|
formLoading.value = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
defineExpose({ open }) // 提供 open 方法,用于打开弹窗
|
||||||
|
|
||||||
|
/** 提交表单 */
|
||||||
|
const emit = defineEmits(['success']) // 定义 success 事件,用于操作成功后的回调
|
||||||
|
const submitForm = async () => {
|
||||||
|
// 校验表单
|
||||||
|
await formRef.value.validate()
|
||||||
|
// 校验子表单
|
||||||
|
try {
|
||||||
|
await achieFormRef.value.validate()
|
||||||
|
} catch (e) {
|
||||||
|
subTabsName.value = 'achie'
|
||||||
|
return
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
await fundsFormRef.value.validate()
|
||||||
|
} catch (e) {
|
||||||
|
subTabsName.value = 'funds'
|
||||||
|
return
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
await infoFormRef.value.validate()
|
||||||
|
} catch (e) {
|
||||||
|
subTabsName.value = 'info'
|
||||||
|
return
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
await participantFormRef.value.validate()
|
||||||
|
} catch (e) {
|
||||||
|
subTabsName.value = 'participant'
|
||||||
|
return
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
await planFormRef.value.validate()
|
||||||
|
} catch (e) {
|
||||||
|
subTabsName.value = 'plan'
|
||||||
|
return
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
await unitsFormRef.value.validate()
|
||||||
|
} catch (e) {
|
||||||
|
subTabsName.value = 'units'
|
||||||
|
return
|
||||||
|
}
|
||||||
|
// 提交请求
|
||||||
|
formLoading.value = true
|
||||||
|
try {
|
||||||
|
const data = formData.value as unknown as MainVO
|
||||||
|
// 拼接子表的数据
|
||||||
|
data.achies = achieFormRef.value.getData()
|
||||||
|
data.fundss = fundsFormRef.value.getData()
|
||||||
|
data.info = infoFormRef.value.getData()
|
||||||
|
data.participants = participantFormRef.value.getData()
|
||||||
|
data.plans = planFormRef.value.getData()
|
||||||
|
data.unitss = unitsFormRef.value.getData()
|
||||||
|
if (formType.value === 'create') {
|
||||||
|
await MainApi.createMain(data)
|
||||||
|
message.success(t('common.createSuccess'))
|
||||||
|
} else {
|
||||||
|
await MainApi.updateMain(data)
|
||||||
|
message.success(t('common.updateSuccess'))
|
||||||
|
}
|
||||||
|
dialogVisible.value = false
|
||||||
|
// 发送操作成功的事件
|
||||||
|
emit('success')
|
||||||
|
} finally {
|
||||||
|
formLoading.value = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 重置表单 */
|
||||||
|
const resetForm = () => {
|
||||||
|
formData.value = {
|
||||||
|
id: undefined,
|
||||||
|
code: undefined,
|
||||||
|
name: undefined,
|
||||||
|
technicalField: undefined,
|
||||||
|
planId: undefined,
|
||||||
|
planName: undefined,
|
||||||
|
year: undefined,
|
||||||
|
beginDate: undefined,
|
||||||
|
endData: undefined,
|
||||||
|
directorId: undefined,
|
||||||
|
director: undefined,
|
||||||
|
gender: undefined,
|
||||||
|
age: undefined,
|
||||||
|
education: undefined,
|
||||||
|
major: undefined,
|
||||||
|
engagMajor: undefined,
|
||||||
|
position: undefined,
|
||||||
|
phoneNo: undefined,
|
||||||
|
email: undefined,
|
||||||
|
fax: undefined,
|
||||||
|
postalCode: undefined,
|
||||||
|
address: undefined,
|
||||||
|
achievement: undefined,
|
||||||
|
competentDeptId: undefined,
|
||||||
|
competentDeptName: undefined,
|
||||||
|
managerId: undefined,
|
||||||
|
managerName: undefined,
|
||||||
|
}
|
||||||
|
formRef.value?.resetFields()
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
@ -0,0 +1,163 @@
|
||||||
|
<template>
|
||||||
|
<el-form
|
||||||
|
ref="formRef"
|
||||||
|
:model="formData"
|
||||||
|
:rules="formRules"
|
||||||
|
v-loading="formLoading"
|
||||||
|
label-width="0px"
|
||||||
|
:inline-message="true"
|
||||||
|
>
|
||||||
|
<el-table :data="formData" class="-mt-10px">
|
||||||
|
<el-table-column label="序号" type="index" width="100" />
|
||||||
|
<el-table-column label="成果类型包含(论文、期刊、专利、软著等)" min-width="150">
|
||||||
|
<template #default="{ row, $index }">
|
||||||
|
<el-form-item :prop="`${$index}.type`" :rules="formRules.type" class="mb-0px!">
|
||||||
|
<el-select v-model="row.type" placeholder="请选择成果类型包含(论文、期刊、专利、软著等)">
|
||||||
|
<el-option
|
||||||
|
v-for="dict in getStrDictOptions(DICT_TYPE.CG_TYPE)"
|
||||||
|
:key="dict.value"
|
||||||
|
:label="dict.label"
|
||||||
|
:value="dict.value"
|
||||||
|
/>
|
||||||
|
</el-select>
|
||||||
|
</el-form-item>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="数量" min-width="150">
|
||||||
|
<template #default="{ row, $index }">
|
||||||
|
<el-form-item :prop="`${$index}.number`" :rules="formRules.number" class="mb-0px!">
|
||||||
|
<el-input v-model="row.number" placeholder="请输入数量" />
|
||||||
|
</el-form-item>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="归属(甲方独有,共有)" min-width="150">
|
||||||
|
<template #default="{ row, $index }">
|
||||||
|
<el-form-item :prop="`${$index}.belong`" :rules="formRules.belong" class="mb-0px!">
|
||||||
|
<el-input v-model="row.belong" placeholder="请输入归属(甲方独有,共有)" />
|
||||||
|
</el-form-item>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="乐观锁" min-width="150">
|
||||||
|
<template #default="{ row, $index }">
|
||||||
|
<el-form-item :prop="`${$index}.revision`" :rules="formRules.revision" class="mb-0px!">
|
||||||
|
<el-input v-model="row.revision" placeholder="请输入乐观锁" />
|
||||||
|
</el-form-item>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="创建人" min-width="150">
|
||||||
|
<template #default="{ row, $index }">
|
||||||
|
<el-form-item :prop="`${$index}.createdBy`" :rules="formRules.createdBy" class="mb-0px!">
|
||||||
|
<el-input v-model="row.createdBy" placeholder="请输入创建人" />
|
||||||
|
</el-form-item>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="创建时间" min-width="150">
|
||||||
|
<template #default="{ row, $index }">
|
||||||
|
<el-form-item :prop="`${$index}.createdTime`" :rules="formRules.createdTime" class="mb-0px!">
|
||||||
|
<el-date-picker
|
||||||
|
v-model="row.createdTime"
|
||||||
|
type="date"
|
||||||
|
value-format="x"
|
||||||
|
placeholder="选择创建时间"
|
||||||
|
/>
|
||||||
|
</el-form-item>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="更新人" min-width="150">
|
||||||
|
<template #default="{ row, $index }">
|
||||||
|
<el-form-item :prop="`${$index}.updatedBy`" :rules="formRules.updatedBy" class="mb-0px!">
|
||||||
|
<el-input v-model="row.updatedBy" placeholder="请输入更新人" />
|
||||||
|
</el-form-item>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="更新时间" min-width="150">
|
||||||
|
<template #default="{ row, $index }">
|
||||||
|
<el-form-item :prop="`${$index}.updatedTime`" :rules="formRules.updatedTime" class="mb-0px!">
|
||||||
|
<el-date-picker
|
||||||
|
v-model="row.updatedTime"
|
||||||
|
type="date"
|
||||||
|
value-format="x"
|
||||||
|
placeholder="选择更新时间"
|
||||||
|
/>
|
||||||
|
</el-form-item>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column align="center" fixed="right" label="操作" width="60">
|
||||||
|
<template #default="{ $index }">
|
||||||
|
<el-button @click="handleDelete($index)" link>—</el-button>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
</el-table>
|
||||||
|
</el-form>
|
||||||
|
<el-row justify="center" class="mt-3">
|
||||||
|
<el-button @click="handleAdd" round>+ 添加合同预期主要成果形式、知识产权归属</el-button>
|
||||||
|
</el-row>
|
||||||
|
</template>
|
||||||
|
<script setup lang="ts">
|
||||||
|
import { getStrDictOptions, DICT_TYPE } from '@/utils/dict'
|
||||||
|
import { MainApi } from '@/api/contract/contract'
|
||||||
|
|
||||||
|
const props = defineProps<{
|
||||||
|
contractId: undefined // 立项主表ID(主表的关联字段)
|
||||||
|
}>()
|
||||||
|
const formLoading = ref(false) // 表单的加载中
|
||||||
|
const formData = ref([])
|
||||||
|
const formRules = reactive({
|
||||||
|
})
|
||||||
|
const formRef = ref() // 表单 Ref
|
||||||
|
|
||||||
|
/** 监听主表的关联字段的变化,加载对应的子表数据 */
|
||||||
|
watch(
|
||||||
|
() => props.contractId,
|
||||||
|
async (val) => {
|
||||||
|
// 1. 重置表单
|
||||||
|
formData.value = []
|
||||||
|
// 2. val 非空,则加载数据
|
||||||
|
if (!val) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
formLoading.value = true
|
||||||
|
formData.value = await MainApi.getAchieListByContractId(val)
|
||||||
|
} finally {
|
||||||
|
formLoading.value = false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{ immediate: true }
|
||||||
|
)
|
||||||
|
|
||||||
|
/** 新增按钮操作 */
|
||||||
|
const handleAdd = () => {
|
||||||
|
const row = {
|
||||||
|
id: undefined,
|
||||||
|
contractId: undefined,
|
||||||
|
type: undefined,
|
||||||
|
number: undefined,
|
||||||
|
belong: undefined,
|
||||||
|
revision: undefined,
|
||||||
|
createdBy: undefined,
|
||||||
|
createdTime: undefined,
|
||||||
|
updatedBy: undefined,
|
||||||
|
updatedTime: undefined,
|
||||||
|
}
|
||||||
|
row.contractId = props.contractId
|
||||||
|
formData.value.push(row)
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 删除按钮操作 */
|
||||||
|
const handleDelete = (index) => {
|
||||||
|
formData.value.splice(index, 1)
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 表单校验 */
|
||||||
|
const validate = () => {
|
||||||
|
return formRef.value.validate()
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 表单值 */
|
||||||
|
const getData = () => {
|
||||||
|
return formData.value
|
||||||
|
}
|
||||||
|
|
||||||
|
defineExpose({ validate, getData })
|
||||||
|
</script>
|
||||||
|
|
@ -0,0 +1,141 @@
|
||||||
|
<template>
|
||||||
|
<!-- 列表 -->
|
||||||
|
<ContentWrap>
|
||||||
|
<el-button
|
||||||
|
type="primary"
|
||||||
|
plain
|
||||||
|
@click="openForm('create')"
|
||||||
|
v-hasPermi="['contract:main:create']"
|
||||||
|
>
|
||||||
|
<Icon icon="ep:plus" class="mr-5px" /> 新增
|
||||||
|
</el-button>
|
||||||
|
<el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true">
|
||||||
|
<el-table-column label="id" align="center" prop="id" />
|
||||||
|
<el-table-column label="成果类型包含(论文、期刊、专利、软著等)" align="center" prop="type">
|
||||||
|
<template #default="scope">
|
||||||
|
<dict-tag :type="DICT_TYPE.CG_TYPE" :value="scope.row.type" />
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="数量" align="center" prop="number" />
|
||||||
|
<el-table-column label="归属(甲方独有,共有)" align="center" prop="belong" />
|
||||||
|
<el-table-column label="乐观锁" align="center" prop="revision" />
|
||||||
|
<el-table-column label="创建人" align="center" prop="createdBy" />
|
||||||
|
<el-table-column
|
||||||
|
label="创建时间"
|
||||||
|
align="center"
|
||||||
|
prop="createdTime"
|
||||||
|
:formatter="dateFormatter"
|
||||||
|
width="180px"
|
||||||
|
/>
|
||||||
|
<el-table-column label="更新人" align="center" prop="updatedBy" />
|
||||||
|
<el-table-column
|
||||||
|
label="更新时间"
|
||||||
|
align="center"
|
||||||
|
prop="updatedTime"
|
||||||
|
:formatter="dateFormatter"
|
||||||
|
width="180px"
|
||||||
|
/>
|
||||||
|
<el-table-column label="操作" align="center">
|
||||||
|
<template #default="scope">
|
||||||
|
<el-button
|
||||||
|
link
|
||||||
|
type="primary"
|
||||||
|
@click="openForm('update', scope.row.id)"
|
||||||
|
v-hasPermi="['contract:main:update']"
|
||||||
|
>
|
||||||
|
编辑
|
||||||
|
</el-button>
|
||||||
|
<el-button
|
||||||
|
link
|
||||||
|
type="danger"
|
||||||
|
@click="handleDelete(scope.row.id)"
|
||||||
|
v-hasPermi="['contract:main:delete']"
|
||||||
|
>
|
||||||
|
删除
|
||||||
|
</el-button>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
</el-table>
|
||||||
|
<!-- 分页 -->
|
||||||
|
<Pagination
|
||||||
|
:total="total"
|
||||||
|
v-model:page="queryParams.pageNo"
|
||||||
|
v-model:limit="queryParams.pageSize"
|
||||||
|
@pagination="getList"
|
||||||
|
/>
|
||||||
|
</ContentWrap>
|
||||||
|
<!-- 表单弹窗:添加/修改 -->
|
||||||
|
<AchieForm ref="formRef" @success="getList" />
|
||||||
|
</template>
|
||||||
|
<script setup lang="ts">
|
||||||
|
import { DICT_TYPE } from '@/utils/dict'
|
||||||
|
import { dateFormatter } from '@/utils/formatTime'
|
||||||
|
import { MainApi } from '@/api/contract/contract'
|
||||||
|
import AchieForm from './AchieForm.vue'
|
||||||
|
|
||||||
|
const { t } = useI18n() // 国际化
|
||||||
|
const message = useMessage() // 消息弹窗
|
||||||
|
|
||||||
|
const props = defineProps<{
|
||||||
|
contractId: undefined // 立项主表ID(主表的关联字段)
|
||||||
|
}>()
|
||||||
|
const loading = ref(false) // 列表的加载中
|
||||||
|
const list = ref([]) // 列表的数据
|
||||||
|
const total = ref(0) // 列表的总页数
|
||||||
|
const queryParams = reactive({
|
||||||
|
pageNo: 1,
|
||||||
|
pageSize: 10,
|
||||||
|
contractId: undefined
|
||||||
|
})
|
||||||
|
|
||||||
|
/** 监听主表的关联字段的变化,加载对应的子表数据 */
|
||||||
|
watch(
|
||||||
|
() => props.contractId,
|
||||||
|
(val) => {
|
||||||
|
queryParams.contractId = val
|
||||||
|
handleQuery()
|
||||||
|
},
|
||||||
|
{ immediate: false }
|
||||||
|
)
|
||||||
|
|
||||||
|
/** 查询列表 */
|
||||||
|
const getList = async () => {
|
||||||
|
loading.value = true
|
||||||
|
try {
|
||||||
|
const data = await MainApi.getAchiePage(queryParams)
|
||||||
|
list.value = data.list
|
||||||
|
total.value = data.total
|
||||||
|
} finally {
|
||||||
|
loading.value = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 搜索按钮操作 */
|
||||||
|
const handleQuery = () => {
|
||||||
|
queryParams.pageNo = 1
|
||||||
|
getList()
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 添加/修改操作 */
|
||||||
|
const formRef = ref()
|
||||||
|
const openForm = (type: string, id?: number) => {
|
||||||
|
if (!props.contractId) {
|
||||||
|
message.error('请选择一个合同(任务书)信息主')
|
||||||
|
return
|
||||||
|
}
|
||||||
|
formRef.value.open(type, id, props.contractId)
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 删除按钮操作 */
|
||||||
|
const handleDelete = async (id: number) => {
|
||||||
|
try {
|
||||||
|
// 删除的二次确认
|
||||||
|
await message.delConfirm()
|
||||||
|
// 发起删除
|
||||||
|
await MainApi.deleteAchie(id)
|
||||||
|
message.success(t('common.delSuccess'))
|
||||||
|
// 刷新列表
|
||||||
|
await getList()
|
||||||
|
} catch {}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
@ -0,0 +1,195 @@
|
||||||
|
<template>
|
||||||
|
<el-form
|
||||||
|
ref="formRef"
|
||||||
|
:model="formData"
|
||||||
|
:rules="formRules"
|
||||||
|
v-loading="formLoading"
|
||||||
|
label-width="0px"
|
||||||
|
:inline-message="true"
|
||||||
|
>
|
||||||
|
<el-table :data="formData" class="-mt-10px">
|
||||||
|
<el-table-column label="序号" type="index" width="100" />
|
||||||
|
<el-table-column label="经费来源ID" min-width="150">
|
||||||
|
<template #default="{ row, $index }">
|
||||||
|
<el-form-item :prop="`${$index}.sourceId`" :rules="formRules.sourceId" class="mb-0px!">
|
||||||
|
<el-input v-model="row.sourceId" placeholder="请输入经费来源ID" />
|
||||||
|
</el-form-item>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="支出类型ID" min-width="150">
|
||||||
|
<template #default="{ row, $index }">
|
||||||
|
<el-form-item :prop="`${$index}.expenseId`" :rules="formRules.expenseId" class="mb-0px!">
|
||||||
|
<el-input v-model="row.expenseId" placeholder="请输入支出类型ID" />
|
||||||
|
</el-form-item>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="经费科目" min-width="150">
|
||||||
|
<template #default="{ row, $index }">
|
||||||
|
<el-form-item :prop="`${$index}.secondaryCategory`" :rules="formRules.secondaryCategory" class="mb-0px!">
|
||||||
|
<el-input v-model="row.secondaryCategory" placeholder="请输入经费科目" />
|
||||||
|
</el-form-item>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="经费金额" min-width="150">
|
||||||
|
<template #default="{ row, $index }">
|
||||||
|
<el-form-item :prop="`${$index}.amount`" :rules="formRules.amount" class="mb-0px!">
|
||||||
|
<el-input v-model="row.amount" placeholder="请输入经费金额" />
|
||||||
|
</el-form-item>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="经费年度" min-width="150">
|
||||||
|
<template #default="{ row, $index }">
|
||||||
|
<el-form-item :prop="`${$index}.fiscalYear`" :rules="formRules.fiscalYear" class="mb-0px!">
|
||||||
|
<el-input v-model="row.fiscalYear" placeholder="请输入经费年度" />
|
||||||
|
</el-form-item>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="总金额" min-width="150">
|
||||||
|
<template #default="{ row, $index }">
|
||||||
|
<el-form-item :prop="`${$index}.totalAmount`" :rules="formRules.totalAmount" class="mb-0px!">
|
||||||
|
<el-input v-model="row.totalAmount" placeholder="请输入总金额" />
|
||||||
|
</el-form-item>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="单位Id" min-width="150">
|
||||||
|
<template #default="{ row, $index }">
|
||||||
|
<el-form-item :prop="`${$index}.unitId`" :rules="formRules.unitId" class="mb-0px!">
|
||||||
|
<el-input v-model="row.unitId" placeholder="请输入单位Id" />
|
||||||
|
</el-form-item>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="单位名称" min-width="150">
|
||||||
|
<template #default="{ row, $index }">
|
||||||
|
<el-form-item :prop="`${$index}.unitName`" :rules="formRules.unitName" class="mb-0px!">
|
||||||
|
<el-input v-model="row.unitName" placeholder="请输入单位名称" />
|
||||||
|
</el-form-item>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="乐观锁" min-width="150">
|
||||||
|
<template #default="{ row, $index }">
|
||||||
|
<el-form-item :prop="`${$index}.revision`" :rules="formRules.revision" class="mb-0px!">
|
||||||
|
<el-input v-model="row.revision" placeholder="请输入乐观锁" />
|
||||||
|
</el-form-item>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="创建人" min-width="150">
|
||||||
|
<template #default="{ row, $index }">
|
||||||
|
<el-form-item :prop="`${$index}.createdBy`" :rules="formRules.createdBy" class="mb-0px!">
|
||||||
|
<el-input v-model="row.createdBy" placeholder="请输入创建人" />
|
||||||
|
</el-form-item>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="创建时间" min-width="150">
|
||||||
|
<template #default="{ row, $index }">
|
||||||
|
<el-form-item :prop="`${$index}.createdTime`" :rules="formRules.createdTime" class="mb-0px!">
|
||||||
|
<el-date-picker
|
||||||
|
v-model="row.createdTime"
|
||||||
|
type="date"
|
||||||
|
value-format="x"
|
||||||
|
placeholder="选择创建时间"
|
||||||
|
/>
|
||||||
|
</el-form-item>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="更新人" min-width="150">
|
||||||
|
<template #default="{ row, $index }">
|
||||||
|
<el-form-item :prop="`${$index}.updatedBy`" :rules="formRules.updatedBy" class="mb-0px!">
|
||||||
|
<el-input v-model="row.updatedBy" placeholder="请输入更新人" />
|
||||||
|
</el-form-item>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="更新时间" min-width="150">
|
||||||
|
<template #default="{ row, $index }">
|
||||||
|
<el-form-item :prop="`${$index}.updatedTime`" :rules="formRules.updatedTime" class="mb-0px!">
|
||||||
|
<el-date-picker
|
||||||
|
v-model="row.updatedTime"
|
||||||
|
type="date"
|
||||||
|
value-format="x"
|
||||||
|
placeholder="选择更新时间"
|
||||||
|
/>
|
||||||
|
</el-form-item>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column align="center" fixed="right" label="操作" width="60">
|
||||||
|
<template #default="{ $index }">
|
||||||
|
<el-button @click="handleDelete($index)" link>—</el-button>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
</el-table>
|
||||||
|
</el-form>
|
||||||
|
<el-row justify="center" class="mt-3">
|
||||||
|
<el-button @click="handleAdd" round>+ 添加合同经费</el-button>
|
||||||
|
</el-row>
|
||||||
|
</template>
|
||||||
|
<script setup lang="ts">
|
||||||
|
import { MainApi } from '@/api/contract/contract'
|
||||||
|
|
||||||
|
const props = defineProps<{
|
||||||
|
contractId: undefined // 合同ID(主表的关联字段)
|
||||||
|
}>()
|
||||||
|
const formLoading = ref(false) // 表单的加载中
|
||||||
|
const formData = ref([])
|
||||||
|
const formRules = reactive({
|
||||||
|
})
|
||||||
|
const formRef = ref() // 表单 Ref
|
||||||
|
|
||||||
|
/** 监听主表的关联字段的变化,加载对应的子表数据 */
|
||||||
|
watch(
|
||||||
|
() => props.contractId,
|
||||||
|
async (val) => {
|
||||||
|
// 1. 重置表单
|
||||||
|
formData.value = []
|
||||||
|
// 2. val 非空,则加载数据
|
||||||
|
if (!val) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
formLoading.value = true
|
||||||
|
formData.value = await MainApi.getFundsListByContractId(val)
|
||||||
|
} finally {
|
||||||
|
formLoading.value = false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{ immediate: true }
|
||||||
|
)
|
||||||
|
|
||||||
|
/** 新增按钮操作 */
|
||||||
|
const handleAdd = () => {
|
||||||
|
const row = {
|
||||||
|
id: undefined,
|
||||||
|
contractId: undefined,
|
||||||
|
sourceId: undefined,
|
||||||
|
expenseId: undefined,
|
||||||
|
secondaryCategory: undefined,
|
||||||
|
amount: undefined,
|
||||||
|
fiscalYear: undefined,
|
||||||
|
totalAmount: undefined,
|
||||||
|
unitId: undefined,
|
||||||
|
unitName: undefined,
|
||||||
|
revision: undefined,
|
||||||
|
createdBy: undefined,
|
||||||
|
createdTime: undefined,
|
||||||
|
updatedBy: undefined,
|
||||||
|
updatedTime: undefined,
|
||||||
|
}
|
||||||
|
row.contractId = props.contractId
|
||||||
|
formData.value.push(row)
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 删除按钮操作 */
|
||||||
|
const handleDelete = (index) => {
|
||||||
|
formData.value.splice(index, 1)
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 表单校验 */
|
||||||
|
const validate = () => {
|
||||||
|
return formRef.value.validate()
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 表单值 */
|
||||||
|
const getData = () => {
|
||||||
|
return formData.value
|
||||||
|
}
|
||||||
|
|
||||||
|
defineExpose({ validate, getData })
|
||||||
|
</script>
|
||||||
|
|
@ -0,0 +1,120 @@
|
||||||
|
<template>
|
||||||
|
<!-- 列表 -->
|
||||||
|
<ContentWrap>
|
||||||
|
<el-button
|
||||||
|
type="primary"
|
||||||
|
plain
|
||||||
|
@click="openForm('create')"
|
||||||
|
v-hasPermi="['contract:main:create']"
|
||||||
|
>
|
||||||
|
<Icon icon="ep:plus" class="mr-5px" /> 新增
|
||||||
|
</el-button>
|
||||||
|
<el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true">
|
||||||
|
<el-table-column label="主键ID" align="center" prop="id" />
|
||||||
|
<el-table-column label="经费科目" align="center" prop="secondaryCategory" />
|
||||||
|
<el-table-column label="经费金额" align="center" prop="amount" />
|
||||||
|
<el-table-column label="经费年度" align="center" prop="fiscalYear" />
|
||||||
|
<el-table-column label="总金额" align="center" prop="totalAmount" />
|
||||||
|
<el-table-column label="单位名称" align="center" prop="unitName" />
|
||||||
|
<el-table-column label="操作" align="center">
|
||||||
|
<template #default="scope">
|
||||||
|
<el-button
|
||||||
|
link
|
||||||
|
type="primary"
|
||||||
|
@click="openForm('update', scope.row.id)"
|
||||||
|
v-hasPermi="['contract:main:update']"
|
||||||
|
>
|
||||||
|
编辑
|
||||||
|
</el-button>
|
||||||
|
<el-button
|
||||||
|
link
|
||||||
|
type="danger"
|
||||||
|
@click="handleDelete(scope.row.id)"
|
||||||
|
v-hasPermi="['contract:main:delete']"
|
||||||
|
>
|
||||||
|
删除
|
||||||
|
</el-button>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
</el-table>
|
||||||
|
<!-- 分页 -->
|
||||||
|
<Pagination
|
||||||
|
:total="total"
|
||||||
|
v-model:page="queryParams.pageNo"
|
||||||
|
v-model:limit="queryParams.pageSize"
|
||||||
|
@pagination="getList"
|
||||||
|
/>
|
||||||
|
</ContentWrap>
|
||||||
|
<!-- 表单弹窗:添加/修改 -->
|
||||||
|
<FundsForm ref="formRef" @success="getList" />
|
||||||
|
</template>
|
||||||
|
<script setup lang="ts">
|
||||||
|
import { MainApi } from '@/api/contract/contract'
|
||||||
|
import FundsForm from './FundsForm.vue'
|
||||||
|
|
||||||
|
const { t } = useI18n() // 国际化
|
||||||
|
const message = useMessage() // 消息弹窗
|
||||||
|
|
||||||
|
const props = defineProps<{
|
||||||
|
contractId: undefined // 合同ID(主表的关联字段)
|
||||||
|
}>()
|
||||||
|
const loading = ref(false) // 列表的加载中
|
||||||
|
const list = ref([]) // 列表的数据
|
||||||
|
const total = ref(0) // 列表的总页数
|
||||||
|
const queryParams = reactive({
|
||||||
|
pageNo: 1,
|
||||||
|
pageSize: 10,
|
||||||
|
contractId: undefined
|
||||||
|
})
|
||||||
|
|
||||||
|
/** 监听主表的关联字段的变化,加载对应的子表数据 */
|
||||||
|
watch(
|
||||||
|
() => props.contractId,
|
||||||
|
(val) => {
|
||||||
|
queryParams.contractId = val
|
||||||
|
handleQuery()
|
||||||
|
},
|
||||||
|
{ immediate: false }
|
||||||
|
)
|
||||||
|
|
||||||
|
/** 查询列表 */
|
||||||
|
const getList = async () => {
|
||||||
|
loading.value = true
|
||||||
|
try {
|
||||||
|
const data = await MainApi.getFundsPage(queryParams)
|
||||||
|
list.value = data.list
|
||||||
|
total.value = data.total
|
||||||
|
} finally {
|
||||||
|
loading.value = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 搜索按钮操作 */
|
||||||
|
const handleQuery = () => {
|
||||||
|
queryParams.pageNo = 1
|
||||||
|
getList()
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 添加/修改操作 */
|
||||||
|
const formRef = ref()
|
||||||
|
const openForm = (type: string, id?: number) => {
|
||||||
|
if (!props.contractId) {
|
||||||
|
message.error('请选择一个合同(任务书)信息主')
|
||||||
|
return
|
||||||
|
}
|
||||||
|
formRef.value.open(type, id, props.contractId)
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 删除按钮操作 */
|
||||||
|
const handleDelete = async (id: number) => {
|
||||||
|
try {
|
||||||
|
// 删除的二次确认
|
||||||
|
await message.delConfirm()
|
||||||
|
// 发起删除
|
||||||
|
await MainApi.deleteFunds(id)
|
||||||
|
message.success(t('common.delSuccess'))
|
||||||
|
// 刷新列表
|
||||||
|
await getList()
|
||||||
|
} catch {}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
@ -0,0 +1,101 @@
|
||||||
|
<template>
|
||||||
|
<el-form
|
||||||
|
ref="formRef"
|
||||||
|
:model="formData"
|
||||||
|
:rules="formRules"
|
||||||
|
label-width="100px"
|
||||||
|
v-loading="formLoading"
|
||||||
|
>
|
||||||
|
<el-form-item label="项目目的与意义" prop="purposeSignificance">
|
||||||
|
<el-input v-model="formData.purposeSignificance" type="textarea" placeholder="请输入项目目的与意义" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="项目所属领域国内外产业、技术的现状和发展趋势" prop="currentSituation">
|
||||||
|
<el-input v-model="formData.currentSituation" type="textarea" placeholder="请输入项目所属领域国内外产业、技术的现状和发展趋势" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="项目现有工作基础" prop="workFoundation">
|
||||||
|
<el-input v-model="formData.workFoundation" type="textarea" placeholder="请输入项目现有工作基础" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="项目实施目标及考核指标-项目目标" prop="objectives">
|
||||||
|
<el-input v-model="formData.objectives" type="textarea" placeholder="请输入项目实施目标及考核指标-项目目标" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="项目实施目标及考核指标-考核指标" prop="evaluation">
|
||||||
|
<el-input v-model="formData.evaluation" type="textarea" placeholder="请输入项目实施目标及考核指标-考核指标" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="项目实施目标及考核指标-考核指标依据" prop="according">
|
||||||
|
<el-input v-model="formData.according" type="textarea" placeholder="请输入项目实施目标及考核指标-考核指标依据" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="主要研究开发内容-主要研究内容" prop="researchContents">
|
||||||
|
<el-input v-model="formData.researchContents" type="textarea" placeholder="请输入主要研究开发内容-主要研究内容" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="主要研究开发内容-技术路线" prop="roadmap">
|
||||||
|
<el-input v-model="formData.roadmap" type="textarea" placeholder="请输入主要研究开发内容-技术路线" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="主要研究开发内容-创新性" prop="innovation">
|
||||||
|
<el-input v-model="formData.innovation" type="textarea" placeholder="请输入主要研究开发内容-创新性" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="课题实施的风险分析" prop="riskAnalysis">
|
||||||
|
<el-input v-model="formData.riskAnalysis" type="textarea" placeholder="请输入课题实施的风险分析" />
|
||||||
|
</el-form-item>
|
||||||
|
</el-form>
|
||||||
|
</template>
|
||||||
|
<script setup lang="ts">
|
||||||
|
import { MainApi } from '@/api/contract/contract'
|
||||||
|
|
||||||
|
const props = defineProps<{
|
||||||
|
contractId: undefined // 合同主键ID(主表的关联字段)
|
||||||
|
}>()
|
||||||
|
const formLoading = ref(false) // 表单的加载中
|
||||||
|
const formData = ref([])
|
||||||
|
const formRules = reactive({
|
||||||
|
})
|
||||||
|
const formRef = ref() // 表单 Ref
|
||||||
|
|
||||||
|
/** 监听主表的关联字段的变化,加载对应的子表数据 */
|
||||||
|
watch(
|
||||||
|
() => props.contractId,
|
||||||
|
async (val) => {
|
||||||
|
// 1. 重置表单
|
||||||
|
formData.value = {
|
||||||
|
id: undefined,
|
||||||
|
contractId: undefined,
|
||||||
|
purposeSignificance: undefined,
|
||||||
|
currentSituation: undefined,
|
||||||
|
workFoundation: undefined,
|
||||||
|
objectives: undefined,
|
||||||
|
evaluation: undefined,
|
||||||
|
according: undefined,
|
||||||
|
researchContents: undefined,
|
||||||
|
roadmap: undefined,
|
||||||
|
innovation: undefined,
|
||||||
|
riskAnalysis: undefined,
|
||||||
|
}
|
||||||
|
// 2. val 非空,则加载数据
|
||||||
|
if (!val) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
formLoading.value = true
|
||||||
|
const data = await MainApi.getInfoByContractId(val)
|
||||||
|
if (!data) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
formData.value = data
|
||||||
|
} finally {
|
||||||
|
formLoading.value = false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{ immediate: true }
|
||||||
|
)
|
||||||
|
|
||||||
|
/** 表单校验 */
|
||||||
|
const validate = () => {
|
||||||
|
return formRef.value.validate()
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 表单值 */
|
||||||
|
const getData = () => {
|
||||||
|
return formData.value
|
||||||
|
}
|
||||||
|
|
||||||
|
defineExpose({ validate, getData })
|
||||||
|
</script>
|
||||||
|
|
@ -0,0 +1,125 @@
|
||||||
|
<template>
|
||||||
|
<!-- 列表 -->
|
||||||
|
<ContentWrap>
|
||||||
|
<el-button
|
||||||
|
type="primary"
|
||||||
|
plain
|
||||||
|
@click="openForm('create')"
|
||||||
|
v-hasPermi="['contract:main:create']"
|
||||||
|
>
|
||||||
|
<Icon icon="ep:plus" class="mr-5px" /> 新增
|
||||||
|
</el-button>
|
||||||
|
<el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true">
|
||||||
|
<el-table-column label="id" align="center" prop="id" />
|
||||||
|
<el-table-column label="项目目的与意义" align="center" prop="purposeSignificance" />
|
||||||
|
<el-table-column label="项目所属领域国内外产业、技术的现状和发展趋势" align="center" prop="currentSituation" />
|
||||||
|
<el-table-column label="项目现有工作基础" align="center" prop="workFoundation" />
|
||||||
|
<el-table-column label="项目实施目标及考核指标-项目目标" align="center" prop="objectives" />
|
||||||
|
<el-table-column label="项目实施目标及考核指标-考核指标" align="center" prop="evaluation" />
|
||||||
|
<el-table-column label="项目实施目标及考核指标-考核指标依据" align="center" prop="according" />
|
||||||
|
<el-table-column label="主要研究开发内容-主要研究内容" align="center" prop="researchContents" />
|
||||||
|
<el-table-column label="主要研究开发内容-技术路线" align="center" prop="roadmap" />
|
||||||
|
<el-table-column label="主要研究开发内容-创新性" align="center" prop="innovation" />
|
||||||
|
<el-table-column label="课题实施的风险分析" align="center" prop="riskAnalysis" />
|
||||||
|
<el-table-column label="操作" align="center">
|
||||||
|
<template #default="scope">
|
||||||
|
<el-button
|
||||||
|
link
|
||||||
|
type="primary"
|
||||||
|
@click="openForm('update', scope.row.id)"
|
||||||
|
v-hasPermi="['contract:main:update']"
|
||||||
|
>
|
||||||
|
编辑
|
||||||
|
</el-button>
|
||||||
|
<el-button
|
||||||
|
link
|
||||||
|
type="danger"
|
||||||
|
@click="handleDelete(scope.row.id)"
|
||||||
|
v-hasPermi="['contract:main:delete']"
|
||||||
|
>
|
||||||
|
删除
|
||||||
|
</el-button>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
</el-table>
|
||||||
|
<!-- 分页 -->
|
||||||
|
<Pagination
|
||||||
|
:total="total"
|
||||||
|
v-model:page="queryParams.pageNo"
|
||||||
|
v-model:limit="queryParams.pageSize"
|
||||||
|
@pagination="getList"
|
||||||
|
/>
|
||||||
|
</ContentWrap>
|
||||||
|
<!-- 表单弹窗:添加/修改 -->
|
||||||
|
<InfoForm ref="formRef" @success="getList" />
|
||||||
|
</template>
|
||||||
|
<script setup lang="ts">
|
||||||
|
import { MainApi } from '@/api/contract/contract'
|
||||||
|
import InfoForm from './InfoForm.vue'
|
||||||
|
|
||||||
|
const { t } = useI18n() // 国际化
|
||||||
|
const message = useMessage() // 消息弹窗
|
||||||
|
|
||||||
|
const props = defineProps<{
|
||||||
|
contractId: undefined // 合同主键ID(主表的关联字段)
|
||||||
|
}>()
|
||||||
|
const loading = ref(false) // 列表的加载中
|
||||||
|
const list = ref([]) // 列表的数据
|
||||||
|
const total = ref(0) // 列表的总页数
|
||||||
|
const queryParams = reactive({
|
||||||
|
pageNo: 1,
|
||||||
|
pageSize: 10,
|
||||||
|
contractId: undefined
|
||||||
|
})
|
||||||
|
|
||||||
|
/** 监听主表的关联字段的变化,加载对应的子表数据 */
|
||||||
|
watch(
|
||||||
|
() => props.contractId,
|
||||||
|
(val) => {
|
||||||
|
queryParams.contractId = val
|
||||||
|
handleQuery()
|
||||||
|
},
|
||||||
|
{ immediate: false }
|
||||||
|
)
|
||||||
|
|
||||||
|
/** 查询列表 */
|
||||||
|
const getList = async () => {
|
||||||
|
loading.value = true
|
||||||
|
try {
|
||||||
|
const data = await MainApi.getInfoPage(queryParams)
|
||||||
|
list.value = data.list
|
||||||
|
total.value = data.total
|
||||||
|
} finally {
|
||||||
|
loading.value = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 搜索按钮操作 */
|
||||||
|
const handleQuery = () => {
|
||||||
|
queryParams.pageNo = 1
|
||||||
|
getList()
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 添加/修改操作 */
|
||||||
|
const formRef = ref()
|
||||||
|
const openForm = (type: string, id?: number) => {
|
||||||
|
if (!props.contractId) {
|
||||||
|
message.error('请选择一个合同(任务书)信息主')
|
||||||
|
return
|
||||||
|
}
|
||||||
|
formRef.value.open(type, id, props.contractId)
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 删除按钮操作 */
|
||||||
|
const handleDelete = async (id: number) => {
|
||||||
|
try {
|
||||||
|
// 删除的二次确认
|
||||||
|
await message.delConfirm()
|
||||||
|
// 发起删除
|
||||||
|
await MainApi.deleteInfo(id)
|
||||||
|
message.success(t('common.delSuccess'))
|
||||||
|
// 刷新列表
|
||||||
|
await getList()
|
||||||
|
} catch {}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
@ -0,0 +1,211 @@
|
||||||
|
<template>
|
||||||
|
<el-form
|
||||||
|
ref="formRef"
|
||||||
|
:model="formData"
|
||||||
|
:rules="formRules"
|
||||||
|
v-loading="formLoading"
|
||||||
|
label-width="0px"
|
||||||
|
:inline-message="true"
|
||||||
|
>
|
||||||
|
<el-table :data="formData" class="-mt-10px">
|
||||||
|
<el-table-column label="序号" type="index" width="100" />
|
||||||
|
<el-table-column label="姓名" min-width="150">
|
||||||
|
<template #default="{ row, $index }">
|
||||||
|
<el-form-item :prop="`${$index}.name`" :rules="formRules.name" class="mb-0px!">
|
||||||
|
<el-input v-model="row.name" placeholder="请输入姓名" />
|
||||||
|
</el-form-item>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="性别" min-width="150">
|
||||||
|
<template #default="{ row, $index }">
|
||||||
|
<el-form-item :prop="`${$index}.gender`" :rules="formRules.gender" class="mb-0px!">
|
||||||
|
<el-input v-model="row.gender" placeholder="请输入性别" />
|
||||||
|
</el-form-item>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="年龄" min-width="150">
|
||||||
|
<template #default="{ row, $index }">
|
||||||
|
<el-form-item :prop="`${$index}.age`" :rules="formRules.age" class="mb-0px!">
|
||||||
|
<el-input v-model="row.age" placeholder="请输入年龄" />
|
||||||
|
</el-form-item>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="学历" min-width="150">
|
||||||
|
<template #default="{ row, $index }">
|
||||||
|
<el-form-item :prop="`${$index}.education`" :rules="formRules.education" class="mb-0px!">
|
||||||
|
<el-input v-model="row.education" placeholder="请输入学历" />
|
||||||
|
</el-form-item>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="职务(职称)" min-width="150">
|
||||||
|
<template #default="{ row, $index }">
|
||||||
|
<el-form-item :prop="`${$index}.position`" :rules="formRules.position" class="mb-0px!">
|
||||||
|
<el-input v-model="row.position" placeholder="请输入职务(职称)" />
|
||||||
|
</el-form-item>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="从事专业" min-width="150">
|
||||||
|
<template #default="{ row, $index }">
|
||||||
|
<el-form-item :prop="`${$index}.engagingProfession`" :rules="formRules.engagingProfession" class="mb-0px!">
|
||||||
|
<el-input v-model="row.engagingProfession" placeholder="请输入从事专业" />
|
||||||
|
</el-form-item>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="课题主要分工" min-width="150">
|
||||||
|
<template #default="{ row, $index }">
|
||||||
|
<el-form-item :prop="`${$index}.divideWork`" :rules="formRules.divideWork" class="mb-0px!">
|
||||||
|
<el-input v-model="row.divideWork" placeholder="请输入课题主要分工" />
|
||||||
|
</el-form-item>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="所在单位id" min-width="150">
|
||||||
|
<template #default="{ row, $index }">
|
||||||
|
<el-form-item :prop="`${$index}.deptId`" :rules="formRules.deptId" class="mb-0px!">
|
||||||
|
<el-input v-model="row.deptId" placeholder="请输入所在单位id" />
|
||||||
|
</el-form-item>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="所在单位名称" min-width="150">
|
||||||
|
<template #default="{ row, $index }">
|
||||||
|
<el-form-item :prop="`${$index}.deptName`" :rules="formRules.deptName" class="mb-0px!">
|
||||||
|
<el-input v-model="row.deptName" placeholder="请输入所在单位名称" />
|
||||||
|
</el-form-item>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="排序号" min-width="150">
|
||||||
|
<template #default="{ row, $index }">
|
||||||
|
<el-form-item :prop="`${$index}.orderNo`" :rules="formRules.orderNo" class="mb-0px!">
|
||||||
|
<el-input v-model="row.orderNo" placeholder="请输入排序号" />
|
||||||
|
</el-form-item>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="乐观锁" min-width="150">
|
||||||
|
<template #default="{ row, $index }">
|
||||||
|
<el-form-item :prop="`${$index}.revision`" :rules="formRules.revision" class="mb-0px!">
|
||||||
|
<el-input v-model="row.revision" placeholder="请输入乐观锁" />
|
||||||
|
</el-form-item>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="创建人" min-width="150">
|
||||||
|
<template #default="{ row, $index }">
|
||||||
|
<el-form-item :prop="`${$index}.createdBy`" :rules="formRules.createdBy" class="mb-0px!">
|
||||||
|
<el-input v-model="row.createdBy" placeholder="请输入创建人" />
|
||||||
|
</el-form-item>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="创建时间" min-width="150">
|
||||||
|
<template #default="{ row, $index }">
|
||||||
|
<el-form-item :prop="`${$index}.createdTime`" :rules="formRules.createdTime" class="mb-0px!">
|
||||||
|
<el-date-picker
|
||||||
|
v-model="row.createdTime"
|
||||||
|
type="date"
|
||||||
|
value-format="x"
|
||||||
|
placeholder="选择创建时间"
|
||||||
|
/>
|
||||||
|
</el-form-item>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="更新人" min-width="150">
|
||||||
|
<template #default="{ row, $index }">
|
||||||
|
<el-form-item :prop="`${$index}.updatedBy`" :rules="formRules.updatedBy" class="mb-0px!">
|
||||||
|
<el-input v-model="row.updatedBy" placeholder="请输入更新人" />
|
||||||
|
</el-form-item>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="更新时间" min-width="150">
|
||||||
|
<template #default="{ row, $index }">
|
||||||
|
<el-form-item :prop="`${$index}.updatedTime`" :rules="formRules.updatedTime" class="mb-0px!">
|
||||||
|
<el-date-picker
|
||||||
|
v-model="row.updatedTime"
|
||||||
|
type="date"
|
||||||
|
value-format="x"
|
||||||
|
placeholder="选择更新时间"
|
||||||
|
/>
|
||||||
|
</el-form-item>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column align="center" fixed="right" label="操作" width="60">
|
||||||
|
<template #default="{ $index }">
|
||||||
|
<el-button @click="handleDelete($index)" link>—</el-button>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
</el-table>
|
||||||
|
</el-form>
|
||||||
|
<el-row justify="center" class="mt-3">
|
||||||
|
<el-button @click="handleAdd" round>+ 添加合同主要参加人员</el-button>
|
||||||
|
</el-row>
|
||||||
|
</template>
|
||||||
|
<script setup lang="ts">
|
||||||
|
import { MainApi } from '@/api/contract/contract'
|
||||||
|
|
||||||
|
const props = defineProps<{
|
||||||
|
contractId: undefined // 合同ID(主表的关联字段)
|
||||||
|
}>()
|
||||||
|
const formLoading = ref(false) // 表单的加载中
|
||||||
|
const formData = ref([])
|
||||||
|
const formRules = reactive({
|
||||||
|
})
|
||||||
|
const formRef = ref() // 表单 Ref
|
||||||
|
|
||||||
|
/** 监听主表的关联字段的变化,加载对应的子表数据 */
|
||||||
|
watch(
|
||||||
|
() => props.contractId,
|
||||||
|
async (val) => {
|
||||||
|
// 1. 重置表单
|
||||||
|
formData.value = []
|
||||||
|
// 2. val 非空,则加载数据
|
||||||
|
if (!val) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
formLoading.value = true
|
||||||
|
formData.value = await MainApi.getParticipantListByContractId(val)
|
||||||
|
} finally {
|
||||||
|
formLoading.value = false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{ immediate: true }
|
||||||
|
)
|
||||||
|
|
||||||
|
/** 新增按钮操作 */
|
||||||
|
const handleAdd = () => {
|
||||||
|
const row = {
|
||||||
|
id: undefined,
|
||||||
|
contractId: undefined,
|
||||||
|
name: undefined,
|
||||||
|
gender: undefined,
|
||||||
|
age: undefined,
|
||||||
|
education: undefined,
|
||||||
|
position: undefined,
|
||||||
|
engagingProfession: undefined,
|
||||||
|
divideWork: undefined,
|
||||||
|
deptId: undefined,
|
||||||
|
deptName: undefined,
|
||||||
|
orderNo: undefined,
|
||||||
|
revision: undefined,
|
||||||
|
createdBy: undefined,
|
||||||
|
createdTime: undefined,
|
||||||
|
updatedBy: undefined,
|
||||||
|
updatedTime: undefined,
|
||||||
|
}
|
||||||
|
row.contractId = props.contractId
|
||||||
|
formData.value.push(row)
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 删除按钮操作 */
|
||||||
|
const handleDelete = (index) => {
|
||||||
|
formData.value.splice(index, 1)
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 表单校验 */
|
||||||
|
const validate = () => {
|
||||||
|
return formRef.value.validate()
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 表单值 */
|
||||||
|
const getData = () => {
|
||||||
|
return formData.value
|
||||||
|
}
|
||||||
|
|
||||||
|
defineExpose({ validate, getData })
|
||||||
|
</script>
|
||||||
|
|
@ -0,0 +1,125 @@
|
||||||
|
<template>
|
||||||
|
<!-- 列表 -->
|
||||||
|
<ContentWrap>
|
||||||
|
<el-button
|
||||||
|
type="primary"
|
||||||
|
plain
|
||||||
|
@click="openForm('create')"
|
||||||
|
v-hasPermi="['contract:main:create']"
|
||||||
|
>
|
||||||
|
<Icon icon="ep:plus" class="mr-5px" /> 新增
|
||||||
|
</el-button>
|
||||||
|
<el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true">
|
||||||
|
<el-table-column label="id" align="center" prop="id" />
|
||||||
|
<el-table-column label="姓名" align="center" prop="name" />
|
||||||
|
<el-table-column label="性别" align="center" prop="gender" />
|
||||||
|
<el-table-column label="年龄" align="center" prop="age" />
|
||||||
|
<el-table-column label="学历" align="center" prop="education" />
|
||||||
|
<el-table-column label="职务(职称)" align="center" prop="position" />
|
||||||
|
<el-table-column label="从事专业" align="center" prop="engagingProfession" />
|
||||||
|
<el-table-column label="课题主要分工" align="center" prop="divideWork" />
|
||||||
|
<el-table-column label="所在单位id" align="center" prop="deptId" />
|
||||||
|
<el-table-column label="所在单位名称" align="center" prop="deptName" />
|
||||||
|
<el-table-column label="排序号" align="center" prop="orderNo" />
|
||||||
|
<el-table-column label="操作" align="center">
|
||||||
|
<template #default="scope">
|
||||||
|
<el-button
|
||||||
|
link
|
||||||
|
type="primary"
|
||||||
|
@click="openForm('update', scope.row.id)"
|
||||||
|
v-hasPermi="['contract:main:update']"
|
||||||
|
>
|
||||||
|
编辑
|
||||||
|
</el-button>
|
||||||
|
<el-button
|
||||||
|
link
|
||||||
|
type="danger"
|
||||||
|
@click="handleDelete(scope.row.id)"
|
||||||
|
v-hasPermi="['contract:main:delete']"
|
||||||
|
>
|
||||||
|
删除
|
||||||
|
</el-button>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
</el-table>
|
||||||
|
<!-- 分页 -->
|
||||||
|
<Pagination
|
||||||
|
:total="total"
|
||||||
|
v-model:page="queryParams.pageNo"
|
||||||
|
v-model:limit="queryParams.pageSize"
|
||||||
|
@pagination="getList"
|
||||||
|
/>
|
||||||
|
</ContentWrap>
|
||||||
|
<!-- 表单弹窗:添加/修改 -->
|
||||||
|
<ParticipantForm ref="formRef" @success="getList" />
|
||||||
|
</template>
|
||||||
|
<script setup lang="ts">
|
||||||
|
import { MainApi } from '@/api/contract/contract'
|
||||||
|
import ParticipantForm from './ParticipantForm.vue'
|
||||||
|
|
||||||
|
const { t } = useI18n() // 国际化
|
||||||
|
const message = useMessage() // 消息弹窗
|
||||||
|
|
||||||
|
const props = defineProps<{
|
||||||
|
contractId: undefined // 合同ID(主表的关联字段)
|
||||||
|
}>()
|
||||||
|
const loading = ref(false) // 列表的加载中
|
||||||
|
const list = ref([]) // 列表的数据
|
||||||
|
const total = ref(0) // 列表的总页数
|
||||||
|
const queryParams = reactive({
|
||||||
|
pageNo: 1,
|
||||||
|
pageSize: 10,
|
||||||
|
contractId: undefined
|
||||||
|
})
|
||||||
|
|
||||||
|
/** 监听主表的关联字段的变化,加载对应的子表数据 */
|
||||||
|
watch(
|
||||||
|
() => props.contractId,
|
||||||
|
(val) => {
|
||||||
|
queryParams.contractId = val
|
||||||
|
handleQuery()
|
||||||
|
},
|
||||||
|
{ immediate: false }
|
||||||
|
)
|
||||||
|
|
||||||
|
/** 查询列表 */
|
||||||
|
const getList = async () => {
|
||||||
|
loading.value = true
|
||||||
|
try {
|
||||||
|
const data = await MainApi.getParticipantPage(queryParams)
|
||||||
|
list.value = data.list
|
||||||
|
total.value = data.total
|
||||||
|
} finally {
|
||||||
|
loading.value = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 搜索按钮操作 */
|
||||||
|
const handleQuery = () => {
|
||||||
|
queryParams.pageNo = 1
|
||||||
|
getList()
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 添加/修改操作 */
|
||||||
|
const formRef = ref()
|
||||||
|
const openForm = (type: string, id?: number) => {
|
||||||
|
if (!props.contractId) {
|
||||||
|
message.error('请选择一个合同(任务书)信息主')
|
||||||
|
return
|
||||||
|
}
|
||||||
|
formRef.value.open(type, id, props.contractId)
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 删除按钮操作 */
|
||||||
|
const handleDelete = async (id: number) => {
|
||||||
|
try {
|
||||||
|
// 删除的二次确认
|
||||||
|
await message.delConfirm()
|
||||||
|
// 发起删除
|
||||||
|
await MainApi.deleteParticipant(id)
|
||||||
|
message.success(t('common.delSuccess'))
|
||||||
|
// 刷新列表
|
||||||
|
await getList()
|
||||||
|
} catch {}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
@ -0,0 +1,152 @@
|
||||||
|
<template>
|
||||||
|
<el-form
|
||||||
|
ref="formRef"
|
||||||
|
:model="formData"
|
||||||
|
:rules="formRules"
|
||||||
|
v-loading="formLoading"
|
||||||
|
label-width="0px"
|
||||||
|
:inline-message="true"
|
||||||
|
>
|
||||||
|
<el-table :data="formData" class="-mt-10px">
|
||||||
|
<el-table-column label="序号" type="index" width="100" />
|
||||||
|
<el-table-column label="时间" min-width="150">
|
||||||
|
<template #default="{ row, $index }">
|
||||||
|
<el-form-item :prop="`${$index}.implDate`" :rules="formRules.implDate" class="mb-0px!">
|
||||||
|
<el-date-picker
|
||||||
|
v-model="row.implDate"
|
||||||
|
type="date"
|
||||||
|
value-format="x"
|
||||||
|
placeholder="选择时间"
|
||||||
|
/>
|
||||||
|
</el-form-item>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="实施内容" min-width="200">
|
||||||
|
<template #default="{ row, $index }">
|
||||||
|
<el-form-item :prop="`${$index}.implContent`" :rules="formRules.implContent" class="mb-0px!">
|
||||||
|
<el-input v-model="row.implContent" type="textarea" placeholder="请输入实施内容" />
|
||||||
|
</el-form-item>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="乐观锁" min-width="150">
|
||||||
|
<template #default="{ row, $index }">
|
||||||
|
<el-form-item :prop="`${$index}.revision`" :rules="formRules.revision" class="mb-0px!">
|
||||||
|
<el-input v-model="row.revision" placeholder="请输入乐观锁" />
|
||||||
|
</el-form-item>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="创建人" min-width="150">
|
||||||
|
<template #default="{ row, $index }">
|
||||||
|
<el-form-item :prop="`${$index}.createdBy`" :rules="formRules.createdBy" class="mb-0px!">
|
||||||
|
<el-input v-model="row.createdBy" placeholder="请输入创建人" />
|
||||||
|
</el-form-item>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="创建时间" min-width="150">
|
||||||
|
<template #default="{ row, $index }">
|
||||||
|
<el-form-item :prop="`${$index}.createdTime`" :rules="formRules.createdTime" class="mb-0px!">
|
||||||
|
<el-date-picker
|
||||||
|
v-model="row.createdTime"
|
||||||
|
type="date"
|
||||||
|
value-format="x"
|
||||||
|
placeholder="选择创建时间"
|
||||||
|
/>
|
||||||
|
</el-form-item>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="更新人" min-width="150">
|
||||||
|
<template #default="{ row, $index }">
|
||||||
|
<el-form-item :prop="`${$index}.updatedBy`" :rules="formRules.updatedBy" class="mb-0px!">
|
||||||
|
<el-input v-model="row.updatedBy" placeholder="请输入更新人" />
|
||||||
|
</el-form-item>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="更新时间" min-width="150">
|
||||||
|
<template #default="{ row, $index }">
|
||||||
|
<el-form-item :prop="`${$index}.updatedTime`" :rules="formRules.updatedTime" class="mb-0px!">
|
||||||
|
<el-date-picker
|
||||||
|
v-model="row.updatedTime"
|
||||||
|
type="date"
|
||||||
|
value-format="x"
|
||||||
|
placeholder="选择更新时间"
|
||||||
|
/>
|
||||||
|
</el-form-item>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column align="center" fixed="right" label="操作" width="60">
|
||||||
|
<template #default="{ $index }">
|
||||||
|
<el-button @click="handleDelete($index)" link>—</el-button>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
</el-table>
|
||||||
|
</el-form>
|
||||||
|
<el-row justify="center" class="mt-3">
|
||||||
|
<el-button @click="handleAdd" round>+ 添加合同实施计划</el-button>
|
||||||
|
</el-row>
|
||||||
|
</template>
|
||||||
|
<script setup lang="ts">
|
||||||
|
import { MainApi } from '@/api/contract/contract'
|
||||||
|
|
||||||
|
const props = defineProps<{
|
||||||
|
contractId: undefined // 合同ID(主表的关联字段)
|
||||||
|
}>()
|
||||||
|
const formLoading = ref(false) // 表单的加载中
|
||||||
|
const formData = ref([])
|
||||||
|
const formRules = reactive({
|
||||||
|
})
|
||||||
|
const formRef = ref() // 表单 Ref
|
||||||
|
|
||||||
|
/** 监听主表的关联字段的变化,加载对应的子表数据 */
|
||||||
|
watch(
|
||||||
|
() => props.contractId,
|
||||||
|
async (val) => {
|
||||||
|
// 1. 重置表单
|
||||||
|
formData.value = []
|
||||||
|
// 2. val 非空,则加载数据
|
||||||
|
if (!val) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
formLoading.value = true
|
||||||
|
formData.value = await MainApi.getPlanListByContractId(val)
|
||||||
|
} finally {
|
||||||
|
formLoading.value = false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{ immediate: true }
|
||||||
|
)
|
||||||
|
|
||||||
|
/** 新增按钮操作 */
|
||||||
|
const handleAdd = () => {
|
||||||
|
const row = {
|
||||||
|
id: undefined,
|
||||||
|
contractId: undefined,
|
||||||
|
implDate: undefined,
|
||||||
|
implContent: undefined,
|
||||||
|
revision: undefined,
|
||||||
|
createdBy: undefined,
|
||||||
|
createdTime: undefined,
|
||||||
|
updatedBy: undefined,
|
||||||
|
updatedTime: undefined,
|
||||||
|
}
|
||||||
|
row.contractId = props.contractId
|
||||||
|
formData.value.push(row)
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 删除按钮操作 */
|
||||||
|
const handleDelete = (index) => {
|
||||||
|
formData.value.splice(index, 1)
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 表单校验 */
|
||||||
|
const validate = () => {
|
||||||
|
return formRef.value.validate()
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 表单值 */
|
||||||
|
const getData = () => {
|
||||||
|
return formData.value
|
||||||
|
}
|
||||||
|
|
||||||
|
defineExpose({ validate, getData })
|
||||||
|
</script>
|
||||||
|
|
@ -0,0 +1,117 @@
|
||||||
|
<template>
|
||||||
|
<!-- 列表 -->
|
||||||
|
<ContentWrap>
|
||||||
|
<el-button
|
||||||
|
type="primary"
|
||||||
|
plain
|
||||||
|
@click="openForm('create')"
|
||||||
|
v-hasPermi="['contract:main:create']"
|
||||||
|
>
|
||||||
|
<Icon icon="ep:plus" class="mr-5px" /> 新增
|
||||||
|
</el-button>
|
||||||
|
<el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true">
|
||||||
|
<el-table-column label="id" align="center" prop="id" />
|
||||||
|
<el-table-column label="时间" align="center" prop="implDate" />
|
||||||
|
<el-table-column label="实施内容" align="center" prop="implContent" />
|
||||||
|
<el-table-column label="操作" align="center">
|
||||||
|
<template #default="scope">
|
||||||
|
<el-button
|
||||||
|
link
|
||||||
|
type="primary"
|
||||||
|
@click="openForm('update', scope.row.id)"
|
||||||
|
v-hasPermi="['contract:main:update']"
|
||||||
|
>
|
||||||
|
编辑
|
||||||
|
</el-button>
|
||||||
|
<el-button
|
||||||
|
link
|
||||||
|
type="danger"
|
||||||
|
@click="handleDelete(scope.row.id)"
|
||||||
|
v-hasPermi="['contract:main:delete']"
|
||||||
|
>
|
||||||
|
删除
|
||||||
|
</el-button>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
</el-table>
|
||||||
|
<!-- 分页 -->
|
||||||
|
<Pagination
|
||||||
|
:total="total"
|
||||||
|
v-model:page="queryParams.pageNo"
|
||||||
|
v-model:limit="queryParams.pageSize"
|
||||||
|
@pagination="getList"
|
||||||
|
/>
|
||||||
|
</ContentWrap>
|
||||||
|
<!-- 表单弹窗:添加/修改 -->
|
||||||
|
<PlanForm ref="formRef" @success="getList" />
|
||||||
|
</template>
|
||||||
|
<script setup lang="ts">
|
||||||
|
import { MainApi } from '@/api/contract/contract'
|
||||||
|
import PlanForm from './PlanForm.vue'
|
||||||
|
|
||||||
|
const { t } = useI18n() // 国际化
|
||||||
|
const message = useMessage() // 消息弹窗
|
||||||
|
|
||||||
|
const props = defineProps<{
|
||||||
|
contractId: undefined // 合同ID(主表的关联字段)
|
||||||
|
}>()
|
||||||
|
const loading = ref(false) // 列表的加载中
|
||||||
|
const list = ref([]) // 列表的数据
|
||||||
|
const total = ref(0) // 列表的总页数
|
||||||
|
const queryParams = reactive({
|
||||||
|
pageNo: 1,
|
||||||
|
pageSize: 10,
|
||||||
|
contractId: undefined
|
||||||
|
})
|
||||||
|
|
||||||
|
/** 监听主表的关联字段的变化,加载对应的子表数据 */
|
||||||
|
watch(
|
||||||
|
() => props.contractId,
|
||||||
|
(val) => {
|
||||||
|
queryParams.contractId = val
|
||||||
|
handleQuery()
|
||||||
|
},
|
||||||
|
{ immediate: false }
|
||||||
|
)
|
||||||
|
|
||||||
|
/** 查询列表 */
|
||||||
|
const getList = async () => {
|
||||||
|
loading.value = true
|
||||||
|
try {
|
||||||
|
const data = await MainApi.getPlanPage(queryParams)
|
||||||
|
list.value = data.list
|
||||||
|
total.value = data.total
|
||||||
|
} finally {
|
||||||
|
loading.value = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 搜索按钮操作 */
|
||||||
|
const handleQuery = () => {
|
||||||
|
queryParams.pageNo = 1
|
||||||
|
getList()
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 添加/修改操作 */
|
||||||
|
const formRef = ref()
|
||||||
|
const openForm = (type: string, id?: number) => {
|
||||||
|
if (!props.contractId) {
|
||||||
|
message.error('请选择一个合同(任务书)信息主')
|
||||||
|
return
|
||||||
|
}
|
||||||
|
formRef.value.open(type, id, props.contractId)
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 删除按钮操作 */
|
||||||
|
const handleDelete = async (id: number) => {
|
||||||
|
try {
|
||||||
|
// 删除的二次确认
|
||||||
|
await message.delConfirm()
|
||||||
|
// 发起删除
|
||||||
|
await MainApi.deletePlan(id)
|
||||||
|
message.success(t('common.delSuccess'))
|
||||||
|
// 刷新列表
|
||||||
|
await getList()
|
||||||
|
} catch {}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
@ -0,0 +1,235 @@
|
||||||
|
<template>
|
||||||
|
<el-form
|
||||||
|
ref="formRef"
|
||||||
|
:model="formData"
|
||||||
|
:rules="formRules"
|
||||||
|
v-loading="formLoading"
|
||||||
|
label-width="0px"
|
||||||
|
:inline-message="true"
|
||||||
|
>
|
||||||
|
<el-table :data="formData" class="-mt-10px">
|
||||||
|
<el-table-column label="序号" type="index" width="100" />
|
||||||
|
<el-table-column label="单位ID" min-width="150">
|
||||||
|
<template #default="{ row, $index }">
|
||||||
|
<el-form-item :prop="`${$index}.deptId`" :rules="formRules.deptId" class="mb-0px!">
|
||||||
|
<el-input v-model="row.deptId" placeholder="请输入单位ID" />
|
||||||
|
</el-form-item>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="单位名称" min-width="150">
|
||||||
|
<template #default="{ row, $index }">
|
||||||
|
<el-form-item :prop="`${$index}.deptName`" :rules="formRules.deptName" class="mb-0px!">
|
||||||
|
<el-input v-model="row.deptName" placeholder="请输入单位名称" />
|
||||||
|
</el-form-item>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="集团经费" min-width="150">
|
||||||
|
<template #default="{ row, $index }">
|
||||||
|
<el-form-item :prop="`${$index}.groupFunds`" :rules="formRules.groupFunds" class="mb-0px!">
|
||||||
|
<el-input v-model="row.groupFunds" placeholder="请输入集团经费" />
|
||||||
|
</el-form-item>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="自筹" min-width="150">
|
||||||
|
<template #default="{ row, $index }">
|
||||||
|
<el-form-item :prop="`${$index}.selfFunds`" :rules="formRules.selfFunds" class="mb-0px!">
|
||||||
|
<el-input v-model="row.selfFunds" placeholder="请输入自筹" />
|
||||||
|
</el-form-item>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="其他" min-width="150">
|
||||||
|
<template #default="{ row, $index }">
|
||||||
|
<el-form-item :prop="`${$index}.otheerFunds`" :rules="formRules.otheerFunds" class="mb-0px!">
|
||||||
|
<el-input v-model="row.otheerFunds" placeholder="请输入其他" />
|
||||||
|
</el-form-item>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="联系人" min-width="150">
|
||||||
|
<template #default="{ row, $index }">
|
||||||
|
<el-form-item :prop="`${$index}.linkPerson`" :rules="formRules.linkPerson" class="mb-0px!">
|
||||||
|
<el-input v-model="row.linkPerson" placeholder="请输入联系人" />
|
||||||
|
</el-form-item>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="联系电话" min-width="150">
|
||||||
|
<template #default="{ row, $index }">
|
||||||
|
<el-form-item :prop="`${$index}.phoneNo`" :rules="formRules.phoneNo" class="mb-0px!">
|
||||||
|
<el-input v-model="row.phoneNo" placeholder="请输入联系电话" />
|
||||||
|
</el-form-item>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="邮箱" min-width="150">
|
||||||
|
<template #default="{ row, $index }">
|
||||||
|
<el-form-item :prop="`${$index}.email`" :rules="formRules.email" class="mb-0px!">
|
||||||
|
<el-input v-model="row.email" placeholder="请输入邮箱" />
|
||||||
|
</el-form-item>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="传真" min-width="150">
|
||||||
|
<template #default="{ row, $index }">
|
||||||
|
<el-form-item :prop="`${$index}.fax`" :rules="formRules.fax" class="mb-0px!">
|
||||||
|
<el-input v-model="row.fax" placeholder="请输入传真" />
|
||||||
|
</el-form-item>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="邮编" min-width="150">
|
||||||
|
<template #default="{ row, $index }">
|
||||||
|
<el-form-item :prop="`${$index}.postalCode`" :rules="formRules.postalCode" class="mb-0px!">
|
||||||
|
<el-input v-model="row.postalCode" placeholder="请输入邮编" />
|
||||||
|
</el-form-item>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="通讯地址" min-width="150">
|
||||||
|
<template #default="{ row, $index }">
|
||||||
|
<el-form-item :prop="`${$index}.address`" :rules="formRules.address" class="mb-0px!">
|
||||||
|
<el-input v-model="row.address" placeholder="请输入通讯地址" />
|
||||||
|
</el-form-item>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="标识(1:承担单位,2:联合承担单位,3:参加单位)" min-width="150">
|
||||||
|
<template #default="{ row, $index }">
|
||||||
|
<el-form-item :prop="`${$index}.sign`" :rules="formRules.sign" class="mb-0px!">
|
||||||
|
<el-input v-model="row.sign" placeholder="请输入标识(1:承担单位,2:联合承担单位,3:参加单位)" />
|
||||||
|
</el-form-item>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="排序号" min-width="150">
|
||||||
|
<template #default="{ row, $index }">
|
||||||
|
<el-form-item :prop="`${$index}.orderNo`" :rules="formRules.orderNo" class="mb-0px!">
|
||||||
|
<el-input v-model="row.orderNo" placeholder="请输入排序号" />
|
||||||
|
</el-form-item>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="乐观锁" min-width="150">
|
||||||
|
<template #default="{ row, $index }">
|
||||||
|
<el-form-item :prop="`${$index}.revision`" :rules="formRules.revision" class="mb-0px!">
|
||||||
|
<el-input v-model="row.revision" placeholder="请输入乐观锁" />
|
||||||
|
</el-form-item>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="创建人" min-width="150">
|
||||||
|
<template #default="{ row, $index }">
|
||||||
|
<el-form-item :prop="`${$index}.createdBy`" :rules="formRules.createdBy" class="mb-0px!">
|
||||||
|
<el-input v-model="row.createdBy" placeholder="请输入创建人" />
|
||||||
|
</el-form-item>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="创建时间" min-width="150">
|
||||||
|
<template #default="{ row, $index }">
|
||||||
|
<el-form-item :prop="`${$index}.createdTime`" :rules="formRules.createdTime" class="mb-0px!">
|
||||||
|
<el-date-picker
|
||||||
|
v-model="row.createdTime"
|
||||||
|
type="date"
|
||||||
|
value-format="x"
|
||||||
|
placeholder="选择创建时间"
|
||||||
|
/>
|
||||||
|
</el-form-item>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="更新人" min-width="150">
|
||||||
|
<template #default="{ row, $index }">
|
||||||
|
<el-form-item :prop="`${$index}.updatedBy`" :rules="formRules.updatedBy" class="mb-0px!">
|
||||||
|
<el-input v-model="row.updatedBy" placeholder="请输入更新人" />
|
||||||
|
</el-form-item>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="更新时间" min-width="150">
|
||||||
|
<template #default="{ row, $index }">
|
||||||
|
<el-form-item :prop="`${$index}.updatedTime`" :rules="formRules.updatedTime" class="mb-0px!">
|
||||||
|
<el-date-picker
|
||||||
|
v-model="row.updatedTime"
|
||||||
|
type="date"
|
||||||
|
value-format="x"
|
||||||
|
placeholder="选择更新时间"
|
||||||
|
/>
|
||||||
|
</el-form-item>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column align="center" fixed="right" label="操作" width="60">
|
||||||
|
<template #default="{ $index }">
|
||||||
|
<el-button @click="handleDelete($index)" link>—</el-button>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
</el-table>
|
||||||
|
</el-form>
|
||||||
|
<el-row justify="center" class="mt-3">
|
||||||
|
<el-button @click="handleAdd" round>+ 添加合同单位信息</el-button>
|
||||||
|
</el-row>
|
||||||
|
</template>
|
||||||
|
<script setup lang="ts">
|
||||||
|
import { MainApi } from '@/api/contract/contract'
|
||||||
|
|
||||||
|
const props = defineProps<{
|
||||||
|
contractId: undefined // 合同表ID(主表的关联字段)
|
||||||
|
}>()
|
||||||
|
const formLoading = ref(false) // 表单的加载中
|
||||||
|
const formData = ref([])
|
||||||
|
const formRules = reactive({
|
||||||
|
})
|
||||||
|
const formRef = ref() // 表单 Ref
|
||||||
|
|
||||||
|
/** 监听主表的关联字段的变化,加载对应的子表数据 */
|
||||||
|
watch(
|
||||||
|
() => props.contractId,
|
||||||
|
async (val) => {
|
||||||
|
// 1. 重置表单
|
||||||
|
formData.value = []
|
||||||
|
// 2. val 非空,则加载数据
|
||||||
|
if (!val) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
formLoading.value = true
|
||||||
|
formData.value = await MainApi.getUnitsListByContractId(val)
|
||||||
|
} finally {
|
||||||
|
formLoading.value = false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{ immediate: true }
|
||||||
|
)
|
||||||
|
|
||||||
|
/** 新增按钮操作 */
|
||||||
|
const handleAdd = () => {
|
||||||
|
const row = {
|
||||||
|
id: undefined,
|
||||||
|
contractId: undefined,
|
||||||
|
deptId: undefined,
|
||||||
|
deptName: undefined,
|
||||||
|
groupFunds: undefined,
|
||||||
|
selfFunds: undefined,
|
||||||
|
otheerFunds: undefined,
|
||||||
|
linkPerson: undefined,
|
||||||
|
phoneNo: undefined,
|
||||||
|
email: undefined,
|
||||||
|
fax: undefined,
|
||||||
|
postalCode: undefined,
|
||||||
|
address: undefined,
|
||||||
|
sign: undefined,
|
||||||
|
orderNo: undefined,
|
||||||
|
revision: undefined,
|
||||||
|
createdBy: undefined,
|
||||||
|
createdTime: undefined,
|
||||||
|
updatedBy: undefined,
|
||||||
|
updatedTime: undefined,
|
||||||
|
}
|
||||||
|
row.contractId = props.contractId
|
||||||
|
formData.value.push(row)
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 删除按钮操作 */
|
||||||
|
const handleDelete = (index) => {
|
||||||
|
formData.value.splice(index, 1)
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 表单校验 */
|
||||||
|
const validate = () => {
|
||||||
|
return formRef.value.validate()
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 表单值 */
|
||||||
|
const getData = () => {
|
||||||
|
return formData.value
|
||||||
|
}
|
||||||
|
|
||||||
|
defineExpose({ validate, getData })
|
||||||
|
</script>
|
||||||
|
|
@ -0,0 +1,126 @@
|
||||||
|
<template>
|
||||||
|
<!-- 列表 -->
|
||||||
|
<ContentWrap>
|
||||||
|
<el-button
|
||||||
|
type="primary"
|
||||||
|
plain
|
||||||
|
@click="openForm('create')"
|
||||||
|
v-hasPermi="['contract:main:create']"
|
||||||
|
>
|
||||||
|
<Icon icon="ep:plus" class="mr-5px" /> 新增
|
||||||
|
</el-button>
|
||||||
|
<el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true">
|
||||||
|
<el-table-column label="id" align="center" prop="id" />
|
||||||
|
<el-table-column label="单位名称" align="center" prop="deptName" />
|
||||||
|
<el-table-column label="集团经费" align="center" prop="groupFunds" />
|
||||||
|
<el-table-column label="自筹" align="center" prop="selfFunds" />
|
||||||
|
<el-table-column label="其他" align="center" prop="otheerFunds" />
|
||||||
|
<el-table-column label="联系人" align="center" prop="linkPerson" />
|
||||||
|
<el-table-column label="联系电话" align="center" prop="phoneNo" />
|
||||||
|
<el-table-column label="邮箱" align="center" prop="email" />
|
||||||
|
<el-table-column label="传真" align="center" prop="fax" />
|
||||||
|
<el-table-column label="邮编" align="center" prop="postalCode" />
|
||||||
|
<el-table-column label="通讯地址" align="center" prop="address" />
|
||||||
|
<el-table-column label="排序号" align="center" prop="orderNo" />
|
||||||
|
<el-table-column label="操作" align="center">
|
||||||
|
<template #default="scope">
|
||||||
|
<el-button
|
||||||
|
link
|
||||||
|
type="primary"
|
||||||
|
@click="openForm('update', scope.row.id)"
|
||||||
|
v-hasPermi="['contract:main:update']"
|
||||||
|
>
|
||||||
|
编辑
|
||||||
|
</el-button>
|
||||||
|
<el-button
|
||||||
|
link
|
||||||
|
type="danger"
|
||||||
|
@click="handleDelete(scope.row.id)"
|
||||||
|
v-hasPermi="['contract:main:delete']"
|
||||||
|
>
|
||||||
|
删除
|
||||||
|
</el-button>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
</el-table>
|
||||||
|
<!-- 分页 -->
|
||||||
|
<Pagination
|
||||||
|
:total="total"
|
||||||
|
v-model:page="queryParams.pageNo"
|
||||||
|
v-model:limit="queryParams.pageSize"
|
||||||
|
@pagination="getList"
|
||||||
|
/>
|
||||||
|
</ContentWrap>
|
||||||
|
<!-- 表单弹窗:添加/修改 -->
|
||||||
|
<UnitsForm ref="formRef" @success="getList" />
|
||||||
|
</template>
|
||||||
|
<script setup lang="ts">
|
||||||
|
import { MainApi } from '@/api/contract/contract'
|
||||||
|
import UnitsForm from './UnitsForm.vue'
|
||||||
|
|
||||||
|
const { t } = useI18n() // 国际化
|
||||||
|
const message = useMessage() // 消息弹窗
|
||||||
|
|
||||||
|
const props = defineProps<{
|
||||||
|
contractId: undefined // 合同表ID(主表的关联字段)
|
||||||
|
}>()
|
||||||
|
const loading = ref(false) // 列表的加载中
|
||||||
|
const list = ref([]) // 列表的数据
|
||||||
|
const total = ref(0) // 列表的总页数
|
||||||
|
const queryParams = reactive({
|
||||||
|
pageNo: 1,
|
||||||
|
pageSize: 10,
|
||||||
|
contractId: undefined
|
||||||
|
})
|
||||||
|
|
||||||
|
/** 监听主表的关联字段的变化,加载对应的子表数据 */
|
||||||
|
watch(
|
||||||
|
() => props.contractId,
|
||||||
|
(val) => {
|
||||||
|
queryParams.contractId = val
|
||||||
|
handleQuery()
|
||||||
|
},
|
||||||
|
{ immediate: false }
|
||||||
|
)
|
||||||
|
|
||||||
|
/** 查询列表 */
|
||||||
|
const getList = async () => {
|
||||||
|
loading.value = true
|
||||||
|
try {
|
||||||
|
const data = await MainApi.getUnitsPage(queryParams)
|
||||||
|
list.value = data.list
|
||||||
|
total.value = data.total
|
||||||
|
} finally {
|
||||||
|
loading.value = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 搜索按钮操作 */
|
||||||
|
const handleQuery = () => {
|
||||||
|
queryParams.pageNo = 1
|
||||||
|
getList()
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 添加/修改操作 */
|
||||||
|
const formRef = ref()
|
||||||
|
const openForm = (type: string, id?: number) => {
|
||||||
|
if (!props.contractId) {
|
||||||
|
message.error('请选择一个合同(任务书)信息主')
|
||||||
|
return
|
||||||
|
}
|
||||||
|
formRef.value.open(type, id, props.contractId)
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 删除按钮操作 */
|
||||||
|
const handleDelete = async (id: number) => {
|
||||||
|
try {
|
||||||
|
// 删除的二次确认
|
||||||
|
await message.delConfirm()
|
||||||
|
// 发起删除
|
||||||
|
await MainApi.deleteUnits(id)
|
||||||
|
message.success(t('common.delSuccess'))
|
||||||
|
// 刷新列表
|
||||||
|
await getList()
|
||||||
|
} catch {}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
@ -0,0 +1,267 @@
|
||||||
|
<template>
|
||||||
|
<ContentWrap>
|
||||||
|
<!-- 搜索工作栏 -->
|
||||||
|
<el-form
|
||||||
|
class="-mb-15px"
|
||||||
|
:model="queryParams"
|
||||||
|
ref="queryFormRef"
|
||||||
|
:inline="true"
|
||||||
|
label-width="68px"
|
||||||
|
>
|
||||||
|
<el-form-item label="合同编号" prop="code">
|
||||||
|
<el-input
|
||||||
|
v-model="queryParams.code"
|
||||||
|
placeholder="请输入合同编号"
|
||||||
|
clearable
|
||||||
|
@keyup.enter="handleQuery"
|
||||||
|
class="!w-240px"
|
||||||
|
/>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="任务名称" prop="name">
|
||||||
|
<el-input
|
||||||
|
v-model="queryParams.name"
|
||||||
|
placeholder="请输入任务名称"
|
||||||
|
clearable
|
||||||
|
@keyup.enter="handleQuery"
|
||||||
|
class="!w-240px"
|
||||||
|
/>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="所属技术领域" prop="technicalField">
|
||||||
|
<el-select
|
||||||
|
v-model="queryParams.technicalField"
|
||||||
|
placeholder="请选择所属技术领域"
|
||||||
|
clearable
|
||||||
|
class="!w-240px"
|
||||||
|
>
|
||||||
|
<el-option
|
||||||
|
v-for="dict in getStrDictOptions(DICT_TYPE.TECHNICAL_FIELD)"
|
||||||
|
:key="dict.value"
|
||||||
|
:label="dict.label"
|
||||||
|
:value="dict.value"
|
||||||
|
/>
|
||||||
|
</el-select>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="计划类型名称" prop="planName">
|
||||||
|
<el-select
|
||||||
|
v-model="queryParams.planName"
|
||||||
|
placeholder="请选择计划类型名称"
|
||||||
|
clearable
|
||||||
|
class="!w-240px"
|
||||||
|
>
|
||||||
|
<el-option
|
||||||
|
v-for="dict in getStrDictOptions(DICT_TYPE.PLAN_ID)"
|
||||||
|
:key="dict.value"
|
||||||
|
:label="dict.label"
|
||||||
|
:value="dict.value"
|
||||||
|
/>
|
||||||
|
</el-select>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="年度" prop="year">
|
||||||
|
<el-input
|
||||||
|
v-model="queryParams.year"
|
||||||
|
placeholder="请输入年度"
|
||||||
|
clearable
|
||||||
|
@keyup.enter="handleQuery"
|
||||||
|
class="!w-240px"
|
||||||
|
/>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="负责人姓名" prop="director">
|
||||||
|
<el-input
|
||||||
|
v-model="queryParams.director"
|
||||||
|
placeholder="请输入负责人姓名"
|
||||||
|
clearable
|
||||||
|
@keyup.enter="handleQuery"
|
||||||
|
class="!w-240px"
|
||||||
|
/>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="主管部门" prop="competentDeptName">
|
||||||
|
<el-input
|
||||||
|
v-model="queryParams.competentDeptName"
|
||||||
|
placeholder="请输入主管部门"
|
||||||
|
clearable
|
||||||
|
@keyup.enter="handleQuery"
|
||||||
|
class="!w-240px"
|
||||||
|
/>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="主管工程师" prop="managerName">
|
||||||
|
<el-input
|
||||||
|
v-model="queryParams.managerName"
|
||||||
|
placeholder="请输入主管工程师"
|
||||||
|
clearable
|
||||||
|
@keyup.enter="handleQuery"
|
||||||
|
class="!w-240px"
|
||||||
|
/>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item>
|
||||||
|
<el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> 搜索</el-button>
|
||||||
|
<el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> 重置</el-button>
|
||||||
|
<el-button
|
||||||
|
type="primary"
|
||||||
|
plain
|
||||||
|
@click="openForm('create')"
|
||||||
|
v-hasPermi="['contract:main:create']"
|
||||||
|
>
|
||||||
|
<Icon icon="ep:plus" class="mr-5px" /> 新增
|
||||||
|
</el-button>
|
||||||
|
<el-button
|
||||||
|
type="success"
|
||||||
|
plain
|
||||||
|
@click="handleExport"
|
||||||
|
:loading="exportLoading"
|
||||||
|
v-hasPermi="['contract:main:export']"
|
||||||
|
>
|
||||||
|
<Icon icon="ep:download" class="mr-5px" /> 导出
|
||||||
|
</el-button>
|
||||||
|
</el-form-item>
|
||||||
|
</el-form>
|
||||||
|
</ContentWrap>
|
||||||
|
|
||||||
|
<!-- 列表 -->
|
||||||
|
<ContentWrap>
|
||||||
|
<el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true">
|
||||||
|
<el-table-column label="合同编号" align="center" prop="code" />
|
||||||
|
<el-table-column label="任务名称" align="center" prop="name" />
|
||||||
|
<el-table-column label="所属技术领域" align="center" prop="technicalField">
|
||||||
|
<template #default="scope">
|
||||||
|
<dict-tag :type="DICT_TYPE.TECHNICAL_FIELD" :value="scope.row.technicalField" />
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="计划类型名称" align="center" prop="planName">
|
||||||
|
<template #default="scope">
|
||||||
|
<dict-tag :type="DICT_TYPE.PLAN_ID" :value="scope.row.planName" />
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="年度" align="center" prop="year" />
|
||||||
|
<el-table-column label="开始时间" align="center" prop="beginDate" />
|
||||||
|
<el-table-column label="结束时间" align="center" prop="endData" />
|
||||||
|
<el-table-column label="负责人姓名" align="center" prop="director" />
|
||||||
|
<el-table-column label="电话" align="center" prop="phoneNo" />
|
||||||
|
<el-table-column label="主管部门" align="center" prop="competentDeptName" />
|
||||||
|
<el-table-column label="主管工程师" align="center" prop="managerName" />
|
||||||
|
<el-table-column label="操作" align="center">
|
||||||
|
<template #default="scope">
|
||||||
|
<el-button
|
||||||
|
link
|
||||||
|
type="primary"
|
||||||
|
@click="openForm('update', scope.row.id)"
|
||||||
|
v-hasPermi="['contract:main:update']"
|
||||||
|
>
|
||||||
|
编辑
|
||||||
|
</el-button>
|
||||||
|
<el-button
|
||||||
|
link
|
||||||
|
type="danger"
|
||||||
|
@click="handleDelete(scope.row.id)"
|
||||||
|
v-hasPermi="['contract:main:delete']"
|
||||||
|
>
|
||||||
|
删除
|
||||||
|
</el-button>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
</el-table>
|
||||||
|
<!-- 分页 -->
|
||||||
|
<Pagination
|
||||||
|
:total="total"
|
||||||
|
v-model:page="queryParams.pageNo"
|
||||||
|
v-model:limit="queryParams.pageSize"
|
||||||
|
@pagination="getList"
|
||||||
|
/>
|
||||||
|
</ContentWrap>
|
||||||
|
|
||||||
|
<!-- 表单弹窗:添加/修改 -->
|
||||||
|
<MainForm ref="formRef" @success="getList" />
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup lang="ts">
|
||||||
|
import { getStrDictOptions, DICT_TYPE } from '@/utils/dict'
|
||||||
|
import download from '@/utils/download'
|
||||||
|
import { MainApi, MainVO } from '@/api/contract/contract'
|
||||||
|
import MainForm from './MainForm.vue'
|
||||||
|
|
||||||
|
/** 合同(任务书)信息主 列表 */
|
||||||
|
defineOptions({ name: 'ContractMain' })
|
||||||
|
|
||||||
|
const message = useMessage() // 消息弹窗
|
||||||
|
const { t } = useI18n() // 国际化
|
||||||
|
|
||||||
|
const loading = ref(true) // 列表的加载中
|
||||||
|
const list = ref<MainVO[]>([]) // 列表的数据
|
||||||
|
const total = ref(0) // 列表的总页数
|
||||||
|
const queryParams = reactive({
|
||||||
|
pageNo: 1,
|
||||||
|
pageSize: 10,
|
||||||
|
code: undefined,
|
||||||
|
name: undefined,
|
||||||
|
technicalField: undefined,
|
||||||
|
planName: undefined,
|
||||||
|
year: undefined,
|
||||||
|
director: undefined,
|
||||||
|
competentDeptName: undefined,
|
||||||
|
managerName: undefined,
|
||||||
|
})
|
||||||
|
const queryFormRef = ref() // 搜索的表单
|
||||||
|
const exportLoading = ref(false) // 导出的加载中
|
||||||
|
|
||||||
|
/** 查询列表 */
|
||||||
|
const getList = async () => {
|
||||||
|
loading.value = true
|
||||||
|
try {
|
||||||
|
const data = await MainApi.getMainPage(queryParams)
|
||||||
|
list.value = data.list
|
||||||
|
total.value = data.total
|
||||||
|
} finally {
|
||||||
|
loading.value = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 搜索按钮操作 */
|
||||||
|
const handleQuery = () => {
|
||||||
|
queryParams.pageNo = 1
|
||||||
|
getList()
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 重置按钮操作 */
|
||||||
|
const resetQuery = () => {
|
||||||
|
queryFormRef.value.resetFields()
|
||||||
|
handleQuery()
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 添加/修改操作 */
|
||||||
|
const formRef = ref()
|
||||||
|
const openForm = (type: string, id?: number) => {
|
||||||
|
formRef.value.open(type, id)
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 删除按钮操作 */
|
||||||
|
const handleDelete = async (id: number) => {
|
||||||
|
try {
|
||||||
|
// 删除的二次确认
|
||||||
|
await message.delConfirm()
|
||||||
|
// 发起删除
|
||||||
|
await MainApi.deleteMain(id)
|
||||||
|
message.success(t('common.delSuccess'))
|
||||||
|
// 刷新列表
|
||||||
|
await getList()
|
||||||
|
} catch {}
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 导出按钮操作 */
|
||||||
|
const handleExport = async () => {
|
||||||
|
try {
|
||||||
|
// 导出的二次确认
|
||||||
|
await message.exportConfirm()
|
||||||
|
// 发起导出
|
||||||
|
exportLoading.value = true
|
||||||
|
const data = await MainApi.exportMain(queryParams)
|
||||||
|
download.excel(data, '合同(任务书)信息主.xls')
|
||||||
|
} catch {
|
||||||
|
} finally {
|
||||||
|
exportLoading.value = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 初始化 **/
|
||||||
|
onMounted(() => {
|
||||||
|
getList()
|
||||||
|
})
|
||||||
|
</script>
|
||||||
|
|
@ -0,0 +1,190 @@
|
||||||
|
<template>
|
||||||
|
<Dialog :title="dialogTitle" v-model="dialogVisible">
|
||||||
|
<el-form
|
||||||
|
ref="formRef"
|
||||||
|
:model="formData"
|
||||||
|
:rules="formRules"
|
||||||
|
label-width="100px"
|
||||||
|
v-loading="formLoading"
|
||||||
|
>
|
||||||
|
<el-form-item label="合同id" prop="contractId">
|
||||||
|
<el-input v-model="formData.contractId" placeholder="请输入合同id" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="合同编号" prop="contractCode">
|
||||||
|
<el-input v-model="formData.contractCode" placeholder="请输入合同编号" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="专利名称" prop="name">
|
||||||
|
<el-input v-model="formData.name" placeholder="请输入专利名称" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="专利号" prop="number">
|
||||||
|
<el-input v-model="formData.number" placeholder="请输入专利号" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="发明人姓名" prop="inventorName">
|
||||||
|
<el-input v-model="formData.inventorName" placeholder="请输入发明人姓名" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="申请日期" prop="filingDate">
|
||||||
|
<el-date-picker
|
||||||
|
v-model="formData.filingDate"
|
||||||
|
type="date"
|
||||||
|
value-format="x"
|
||||||
|
placeholder="选择申请日期"
|
||||||
|
/>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="公开日期" prop="publicationDate">
|
||||||
|
<el-date-picker
|
||||||
|
v-model="formData.publicationDate"
|
||||||
|
type="date"
|
||||||
|
value-format="x"
|
||||||
|
placeholder="选择公开日期"
|
||||||
|
/>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="授权日期" prop="grantDate">
|
||||||
|
<el-date-picker
|
||||||
|
v-model="formData.grantDate"
|
||||||
|
type="date"
|
||||||
|
value-format="x"
|
||||||
|
placeholder="选择授权日期"
|
||||||
|
/>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="专利类型(如发明、实用新型、外观设计等)" prop="patentType">
|
||||||
|
<el-select v-model="formData.patentType" placeholder="请选择专利类型(如发明、实用新型、外观设计等)">
|
||||||
|
<el-option label="请选择字典生成" value="" />
|
||||||
|
</el-select>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="专利权人姓名或公司名称" prop="patenteeName">
|
||||||
|
<el-input v-model="formData.patenteeName" placeholder="请输入专利权人姓名或公司名称" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="相关技术领域" prop="relatedTechArea">
|
||||||
|
<el-input v-model="formData.relatedTechArea" placeholder="请输入相关技术领域" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="技术效果" prop="technicalEffect">
|
||||||
|
<el-input v-model="formData.technicalEffect" placeholder="请输入技术效果" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="法律状态(如审查中、已授权、无效等)" prop="legalStatus">
|
||||||
|
<el-radio-group v-model="formData.legalStatus">
|
||||||
|
<el-radio label="1">请选择字典生成</el-radio>
|
||||||
|
</el-radio-group>
|
||||||
|
</el-form-item>
|
||||||
|
</el-form>
|
||||||
|
<!-- 子表的表单 -->
|
||||||
|
<el-tabs v-model="subTabsName">
|
||||||
|
<el-tab-pane label="专利信息" name="info">
|
||||||
|
<InfoForm ref="infoFormRef" :patents-id="formData.id" />
|
||||||
|
</el-tab-pane>
|
||||||
|
</el-tabs>
|
||||||
|
<template #footer>
|
||||||
|
<el-button @click="submitForm" type="primary" :disabled="formLoading">确 定</el-button>
|
||||||
|
<el-button @click="dialogVisible = false">取 消</el-button>
|
||||||
|
</template>
|
||||||
|
</Dialog>
|
||||||
|
</template>
|
||||||
|
<script setup lang="ts">
|
||||||
|
import { MainApi, MainVO } from '@/api/patents/patents'
|
||||||
|
import InfoForm from './components/InfoForm.vue'
|
||||||
|
|
||||||
|
/** 专利信息 表单 */
|
||||||
|
defineOptions({ name: 'MainForm' })
|
||||||
|
|
||||||
|
const { t } = useI18n() // 国际化
|
||||||
|
const message = useMessage() // 消息弹窗
|
||||||
|
|
||||||
|
const dialogVisible = ref(false) // 弹窗的是否展示
|
||||||
|
const dialogTitle = ref('') // 弹窗的标题
|
||||||
|
const formLoading = ref(false) // 表单的加载中:1)修改时的数据加载;2)提交的按钮禁用
|
||||||
|
const formType = ref('') // 表单的类型:create - 新增;update - 修改
|
||||||
|
const formData = ref({
|
||||||
|
id: undefined,
|
||||||
|
contractId: undefined,
|
||||||
|
contractCode: undefined,
|
||||||
|
name: undefined,
|
||||||
|
number: undefined,
|
||||||
|
inventorName: undefined,
|
||||||
|
filingDate: undefined,
|
||||||
|
publicationDate: undefined,
|
||||||
|
grantDate: undefined,
|
||||||
|
patentType: undefined,
|
||||||
|
patenteeName: undefined,
|
||||||
|
relatedTechArea: undefined,
|
||||||
|
technicalEffect: undefined,
|
||||||
|
legalStatus: undefined,
|
||||||
|
})
|
||||||
|
const formRules = reactive({
|
||||||
|
})
|
||||||
|
const formRef = ref() // 表单 Ref
|
||||||
|
|
||||||
|
/** 子表的表单 */
|
||||||
|
const subTabsName = ref('info')
|
||||||
|
const infoFormRef = ref()
|
||||||
|
|
||||||
|
/** 打开弹窗 */
|
||||||
|
const open = async (type: string, id?: number) => {
|
||||||
|
dialogVisible.value = true
|
||||||
|
dialogTitle.value = t('action.' + type)
|
||||||
|
formType.value = type
|
||||||
|
resetForm()
|
||||||
|
// 修改时,设置数据
|
||||||
|
if (id) {
|
||||||
|
formLoading.value = true
|
||||||
|
try {
|
||||||
|
formData.value = await MainApi.getMain(id)
|
||||||
|
} finally {
|
||||||
|
formLoading.value = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
defineExpose({ open }) // 提供 open 方法,用于打开弹窗
|
||||||
|
|
||||||
|
/** 提交表单 */
|
||||||
|
const emit = defineEmits(['success']) // 定义 success 事件,用于操作成功后的回调
|
||||||
|
const submitForm = async () => {
|
||||||
|
// 校验表单
|
||||||
|
await formRef.value.validate()
|
||||||
|
// 校验子表单
|
||||||
|
try {
|
||||||
|
await infoFormRef.value.validate()
|
||||||
|
} catch (e) {
|
||||||
|
subTabsName.value = 'info'
|
||||||
|
return
|
||||||
|
}
|
||||||
|
// 提交请求
|
||||||
|
formLoading.value = true
|
||||||
|
try {
|
||||||
|
const data = formData.value as unknown as MainVO
|
||||||
|
// 拼接子表的数据
|
||||||
|
data.infos = infoFormRef.value.getData()
|
||||||
|
if (formType.value === 'create') {
|
||||||
|
await MainApi.createMain(data)
|
||||||
|
message.success(t('common.createSuccess'))
|
||||||
|
} else {
|
||||||
|
await MainApi.updateMain(data)
|
||||||
|
message.success(t('common.updateSuccess'))
|
||||||
|
}
|
||||||
|
dialogVisible.value = false
|
||||||
|
// 发送操作成功的事件
|
||||||
|
emit('success')
|
||||||
|
} finally {
|
||||||
|
formLoading.value = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 重置表单 */
|
||||||
|
const resetForm = () => {
|
||||||
|
formData.value = {
|
||||||
|
id: undefined,
|
||||||
|
contractId: undefined,
|
||||||
|
contractCode: undefined,
|
||||||
|
name: undefined,
|
||||||
|
number: undefined,
|
||||||
|
inventorName: undefined,
|
||||||
|
filingDate: undefined,
|
||||||
|
publicationDate: undefined,
|
||||||
|
grantDate: undefined,
|
||||||
|
patentType: undefined,
|
||||||
|
patenteeName: undefined,
|
||||||
|
relatedTechArea: undefined,
|
||||||
|
technicalEffect: undefined,
|
||||||
|
legalStatus: undefined,
|
||||||
|
}
|
||||||
|
formRef.value?.resetFields()
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
@ -0,0 +1,113 @@
|
||||||
|
<template>
|
||||||
|
<el-form
|
||||||
|
ref="formRef"
|
||||||
|
:model="formData"
|
||||||
|
:rules="formRules"
|
||||||
|
v-loading="formLoading"
|
||||||
|
label-width="0px"
|
||||||
|
:inline-message="true"
|
||||||
|
>
|
||||||
|
<el-table :data="formData" class="-mt-10px">
|
||||||
|
<el-table-column label="序号" type="index" width="100" />
|
||||||
|
<el-table-column label="发明人姓名" min-width="150">
|
||||||
|
<template #default="{ row, $index }">
|
||||||
|
<el-form-item :prop="`${$index}.inventorName`" :rules="formRules.inventorName" class="mb-0px!">
|
||||||
|
<el-input v-model="row.inventorName" placeholder="请输入发明人姓名" />
|
||||||
|
</el-form-item>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="发明人身份证号" min-width="150">
|
||||||
|
<template #default="{ row, $index }">
|
||||||
|
<el-form-item :prop="`${$index}.inventorIdno`" :rules="formRules.inventorIdno" class="mb-0px!">
|
||||||
|
<el-input v-model="row.inventorIdno" placeholder="请输入发明人身份证号" />
|
||||||
|
</el-form-item>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="排序号" min-width="150">
|
||||||
|
<template #default="{ row, $index }">
|
||||||
|
<el-form-item :prop="`${$index}.number`" :rules="formRules.number" class="mb-0px!">
|
||||||
|
<el-input v-model="row.number" placeholder="请输入排序号" />
|
||||||
|
</el-form-item>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="所在单位" min-width="150">
|
||||||
|
<template #default="{ row, $index }">
|
||||||
|
<el-form-item :prop="`${$index}.deptName`" :rules="formRules.deptName" class="mb-0px!">
|
||||||
|
<el-input v-model="row.deptName" placeholder="请输入所在单位" />
|
||||||
|
</el-form-item>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column align="center" fixed="right" label="操作" width="60">
|
||||||
|
<template #default="{ $index }">
|
||||||
|
<el-button @click="handleDelete($index)" link>—</el-button>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
</el-table>
|
||||||
|
</el-form>
|
||||||
|
<el-row justify="center" class="mt-3">
|
||||||
|
<el-button @click="handleAdd" round>+ 添加专利信息</el-button>
|
||||||
|
</el-row>
|
||||||
|
</template>
|
||||||
|
<script setup lang="ts">
|
||||||
|
import { MainApi } from '@/api/patents/patents'
|
||||||
|
|
||||||
|
const props = defineProps<{
|
||||||
|
patentsId: undefined // 专利ID(主表的关联字段)
|
||||||
|
}>()
|
||||||
|
const formLoading = ref(false) // 表单的加载中
|
||||||
|
const formData = ref([])
|
||||||
|
const formRules = reactive({
|
||||||
|
})
|
||||||
|
const formRef = ref() // 表单 Ref
|
||||||
|
|
||||||
|
/** 监听主表的关联字段的变化,加载对应的子表数据 */
|
||||||
|
watch(
|
||||||
|
() => props.patentsId,
|
||||||
|
async (val) => {
|
||||||
|
// 1. 重置表单
|
||||||
|
formData.value = []
|
||||||
|
// 2. val 非空,则加载数据
|
||||||
|
if (!val) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
formLoading.value = true
|
||||||
|
formData.value = await MainApi.getInfoListByPatentsId(val)
|
||||||
|
} finally {
|
||||||
|
formLoading.value = false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{ immediate: true }
|
||||||
|
)
|
||||||
|
|
||||||
|
/** 新增按钮操作 */
|
||||||
|
const handleAdd = () => {
|
||||||
|
const row = {
|
||||||
|
id: undefined,
|
||||||
|
patentsId: undefined,
|
||||||
|
inventorName: undefined,
|
||||||
|
inventorIdno: undefined,
|
||||||
|
number: undefined,
|
||||||
|
deptName: undefined,
|
||||||
|
}
|
||||||
|
row.patentsId = props.patentsId
|
||||||
|
formData.value.push(row)
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 删除按钮操作 */
|
||||||
|
const handleDelete = (index) => {
|
||||||
|
formData.value.splice(index, 1)
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 表单校验 */
|
||||||
|
const validate = () => {
|
||||||
|
return formRef.value.validate()
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 表单值 */
|
||||||
|
const getData = () => {
|
||||||
|
return formData.value
|
||||||
|
}
|
||||||
|
|
||||||
|
defineExpose({ validate, getData })
|
||||||
|
</script>
|
||||||
|
|
@ -0,0 +1,119 @@
|
||||||
|
<template>
|
||||||
|
<!-- 列表 -->
|
||||||
|
<ContentWrap>
|
||||||
|
<el-button
|
||||||
|
type="primary"
|
||||||
|
plain
|
||||||
|
@click="openForm('create')"
|
||||||
|
v-hasPermi="['patents:main:create']"
|
||||||
|
>
|
||||||
|
<Icon icon="ep:plus" class="mr-5px" /> 新增
|
||||||
|
</el-button>
|
||||||
|
<el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true">
|
||||||
|
<el-table-column label="id" align="center" prop="id" />
|
||||||
|
<el-table-column label="发明人姓名" align="center" prop="inventorName" />
|
||||||
|
<el-table-column label="发明人身份证号" align="center" prop="inventorIdno" />
|
||||||
|
<el-table-column label="排序号" align="center" prop="number" />
|
||||||
|
<el-table-column label="所在单位" align="center" prop="deptName" />
|
||||||
|
<el-table-column label="操作" align="center">
|
||||||
|
<template #default="scope">
|
||||||
|
<el-button
|
||||||
|
link
|
||||||
|
type="primary"
|
||||||
|
@click="openForm('update', scope.row.id)"
|
||||||
|
v-hasPermi="['patents:main:update']"
|
||||||
|
>
|
||||||
|
编辑
|
||||||
|
</el-button>
|
||||||
|
<el-button
|
||||||
|
link
|
||||||
|
type="danger"
|
||||||
|
@click="handleDelete(scope.row.id)"
|
||||||
|
v-hasPermi="['patents:main:delete']"
|
||||||
|
>
|
||||||
|
删除
|
||||||
|
</el-button>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
</el-table>
|
||||||
|
<!-- 分页 -->
|
||||||
|
<Pagination
|
||||||
|
:total="total"
|
||||||
|
v-model:page="queryParams.pageNo"
|
||||||
|
v-model:limit="queryParams.pageSize"
|
||||||
|
@pagination="getList"
|
||||||
|
/>
|
||||||
|
</ContentWrap>
|
||||||
|
<!-- 表单弹窗:添加/修改 -->
|
||||||
|
<InfoForm ref="formRef" @success="getList" />
|
||||||
|
</template>
|
||||||
|
<script setup lang="ts">
|
||||||
|
import { MainApi } from '@/api/patents/patents'
|
||||||
|
import InfoForm from './InfoForm.vue'
|
||||||
|
|
||||||
|
const { t } = useI18n() // 国际化
|
||||||
|
const message = useMessage() // 消息弹窗
|
||||||
|
|
||||||
|
const props = defineProps<{
|
||||||
|
patentsId: undefined // 专利ID(主表的关联字段)
|
||||||
|
}>()
|
||||||
|
const loading = ref(false) // 列表的加载中
|
||||||
|
const list = ref([]) // 列表的数据
|
||||||
|
const total = ref(0) // 列表的总页数
|
||||||
|
const queryParams = reactive({
|
||||||
|
pageNo: 1,
|
||||||
|
pageSize: 10,
|
||||||
|
patentsId: undefined
|
||||||
|
})
|
||||||
|
|
||||||
|
/** 监听主表的关联字段的变化,加载对应的子表数据 */
|
||||||
|
watch(
|
||||||
|
() => props.patentsId,
|
||||||
|
(val) => {
|
||||||
|
queryParams.patentsId = val
|
||||||
|
handleQuery()
|
||||||
|
},
|
||||||
|
{ immediate: false }
|
||||||
|
)
|
||||||
|
|
||||||
|
/** 查询列表 */
|
||||||
|
const getList = async () => {
|
||||||
|
loading.value = true
|
||||||
|
try {
|
||||||
|
const data = await MainApi.getInfoPage(queryParams)
|
||||||
|
list.value = data.list
|
||||||
|
total.value = data.total
|
||||||
|
} finally {
|
||||||
|
loading.value = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 搜索按钮操作 */
|
||||||
|
const handleQuery = () => {
|
||||||
|
queryParams.pageNo = 1
|
||||||
|
getList()
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 添加/修改操作 */
|
||||||
|
const formRef = ref()
|
||||||
|
const openForm = (type: string, id?: number) => {
|
||||||
|
if (!props.patentsId) {
|
||||||
|
message.error('请选择一个专利信息')
|
||||||
|
return
|
||||||
|
}
|
||||||
|
formRef.value.open(type, id, props.patentsId)
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 删除按钮操作 */
|
||||||
|
const handleDelete = async (id: number) => {
|
||||||
|
try {
|
||||||
|
// 删除的二次确认
|
||||||
|
await message.delConfirm()
|
||||||
|
// 发起删除
|
||||||
|
await MainApi.deleteInfo(id)
|
||||||
|
message.success(t('common.delSuccess'))
|
||||||
|
// 刷新列表
|
||||||
|
await getList()
|
||||||
|
} catch {}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
@ -0,0 +1,219 @@
|
||||||
|
<template>
|
||||||
|
<ContentWrap>
|
||||||
|
<!-- 搜索工作栏 -->
|
||||||
|
<el-form
|
||||||
|
class="-mb-15px"
|
||||||
|
:model="queryParams"
|
||||||
|
ref="queryFormRef"
|
||||||
|
:inline="true"
|
||||||
|
label-width="68px"
|
||||||
|
>
|
||||||
|
<el-form-item label="合同编号" prop="contractCode">
|
||||||
|
<el-input
|
||||||
|
v-model="queryParams.contractCode"
|
||||||
|
placeholder="请输入合同编号"
|
||||||
|
clearable
|
||||||
|
@keyup.enter="handleQuery"
|
||||||
|
class="!w-240px"
|
||||||
|
/>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="专利名称" prop="name">
|
||||||
|
<el-input
|
||||||
|
v-model="queryParams.name"
|
||||||
|
placeholder="请输入专利名称"
|
||||||
|
clearable
|
||||||
|
@keyup.enter="handleQuery"
|
||||||
|
class="!w-240px"
|
||||||
|
/>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="专利号" prop="number">
|
||||||
|
<el-input
|
||||||
|
v-model="queryParams.number"
|
||||||
|
placeholder="请输入专利号"
|
||||||
|
clearable
|
||||||
|
@keyup.enter="handleQuery"
|
||||||
|
class="!w-240px"
|
||||||
|
/>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="发明人姓名" prop="inventorName">
|
||||||
|
<el-input
|
||||||
|
v-model="queryParams.inventorName"
|
||||||
|
placeholder="请输入发明人姓名"
|
||||||
|
clearable
|
||||||
|
@keyup.enter="handleQuery"
|
||||||
|
class="!w-240px"
|
||||||
|
/>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="法律状态(如审查中、已授权、无效等)" prop="legalStatus">
|
||||||
|
<el-select
|
||||||
|
v-model="queryParams.legalStatus"
|
||||||
|
placeholder="请选择法律状态(如审查中、已授权、无效等)"
|
||||||
|
clearable
|
||||||
|
class="!w-240px"
|
||||||
|
>
|
||||||
|
<el-option label="请选择字典生成" value="" />
|
||||||
|
</el-select>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item>
|
||||||
|
<el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> 搜索</el-button>
|
||||||
|
<el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> 重置</el-button>
|
||||||
|
<el-button
|
||||||
|
type="primary"
|
||||||
|
plain
|
||||||
|
@click="openForm('create')"
|
||||||
|
v-hasPermi="['patents:main:create']"
|
||||||
|
>
|
||||||
|
<Icon icon="ep:plus" class="mr-5px" /> 新增
|
||||||
|
</el-button>
|
||||||
|
<el-button
|
||||||
|
type="success"
|
||||||
|
plain
|
||||||
|
@click="handleExport"
|
||||||
|
:loading="exportLoading"
|
||||||
|
v-hasPermi="['patents:main:export']"
|
||||||
|
>
|
||||||
|
<Icon icon="ep:download" class="mr-5px" /> 导出
|
||||||
|
</el-button>
|
||||||
|
</el-form-item>
|
||||||
|
</el-form>
|
||||||
|
</ContentWrap>
|
||||||
|
|
||||||
|
<!-- 列表 -->
|
||||||
|
<ContentWrap>
|
||||||
|
<el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true">
|
||||||
|
<el-table-column label="id" align="center" prop="id" />
|
||||||
|
<el-table-column label="合同编号" align="center" prop="contractCode" />
|
||||||
|
<el-table-column label="专利名称" align="center" prop="name" />
|
||||||
|
<el-table-column label="专利号" align="center" prop="number" />
|
||||||
|
<el-table-column label="发明人姓名" align="center" prop="inventorName" />
|
||||||
|
<el-table-column label="申请日期" align="center" prop="filingDate" />
|
||||||
|
<el-table-column label="公开日期" align="center" prop="publicationDate" />
|
||||||
|
<el-table-column label="授权日期" align="center" prop="grantDate" />
|
||||||
|
<el-table-column label="专利类型(如发明、实用新型、外观设计等)" align="center" prop="patentType" />
|
||||||
|
<el-table-column label="专利权人姓名或公司名称" align="center" prop="patenteeName" />
|
||||||
|
<el-table-column label="相关技术领域" align="center" prop="relatedTechArea" />
|
||||||
|
<el-table-column label="技术效果" align="center" prop="technicalEffect" />
|
||||||
|
<el-table-column label="法律状态(如审查中、已授权、无效等)" align="center" prop="legalStatus" />
|
||||||
|
<el-table-column label="操作" align="center">
|
||||||
|
<template #default="scope">
|
||||||
|
<el-button
|
||||||
|
link
|
||||||
|
type="primary"
|
||||||
|
@click="openForm('update', scope.row.id)"
|
||||||
|
v-hasPermi="['patents:main:update']"
|
||||||
|
>
|
||||||
|
编辑
|
||||||
|
</el-button>
|
||||||
|
<el-button
|
||||||
|
link
|
||||||
|
type="danger"
|
||||||
|
@click="handleDelete(scope.row.id)"
|
||||||
|
v-hasPermi="['patents:main:delete']"
|
||||||
|
>
|
||||||
|
删除
|
||||||
|
</el-button>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
</el-table>
|
||||||
|
<!-- 分页 -->
|
||||||
|
<Pagination
|
||||||
|
:total="total"
|
||||||
|
v-model:page="queryParams.pageNo"
|
||||||
|
v-model:limit="queryParams.pageSize"
|
||||||
|
@pagination="getList"
|
||||||
|
/>
|
||||||
|
</ContentWrap>
|
||||||
|
|
||||||
|
<!-- 表单弹窗:添加/修改 -->
|
||||||
|
<MainForm ref="formRef" @success="getList" />
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup lang="ts">
|
||||||
|
import download from '@/utils/download'
|
||||||
|
import { MainApi, MainVO } from '@/api/patents/patents'
|
||||||
|
import MainForm from './MainForm.vue'
|
||||||
|
|
||||||
|
/** 专利信息 列表 */
|
||||||
|
defineOptions({ name: 'PatentsMain' })
|
||||||
|
|
||||||
|
const message = useMessage() // 消息弹窗
|
||||||
|
const { t } = useI18n() // 国际化
|
||||||
|
|
||||||
|
const loading = ref(true) // 列表的加载中
|
||||||
|
const list = ref<MainVO[]>([]) // 列表的数据
|
||||||
|
const total = ref(0) // 列表的总页数
|
||||||
|
const queryParams = reactive({
|
||||||
|
pageNo: 1,
|
||||||
|
pageSize: 10,
|
||||||
|
contractCode: undefined,
|
||||||
|
name: undefined,
|
||||||
|
number: undefined,
|
||||||
|
inventorName: undefined,
|
||||||
|
legalStatus: undefined,
|
||||||
|
})
|
||||||
|
const queryFormRef = ref() // 搜索的表单
|
||||||
|
const exportLoading = ref(false) // 导出的加载中
|
||||||
|
|
||||||
|
/** 查询列表 */
|
||||||
|
const getList = async () => {
|
||||||
|
loading.value = true
|
||||||
|
try {
|
||||||
|
const data = await MainApi.getMainPage(queryParams)
|
||||||
|
list.value = data.list
|
||||||
|
total.value = data.total
|
||||||
|
} finally {
|
||||||
|
loading.value = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 搜索按钮操作 */
|
||||||
|
const handleQuery = () => {
|
||||||
|
queryParams.pageNo = 1
|
||||||
|
getList()
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 重置按钮操作 */
|
||||||
|
const resetQuery = () => {
|
||||||
|
queryFormRef.value.resetFields()
|
||||||
|
handleQuery()
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 添加/修改操作 */
|
||||||
|
const formRef = ref()
|
||||||
|
const openForm = (type: string, id?: number) => {
|
||||||
|
formRef.value.open(type, id)
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 删除按钮操作 */
|
||||||
|
const handleDelete = async (id: number) => {
|
||||||
|
try {
|
||||||
|
// 删除的二次确认
|
||||||
|
await message.delConfirm()
|
||||||
|
// 发起删除
|
||||||
|
await MainApi.deleteMain(id)
|
||||||
|
message.success(t('common.delSuccess'))
|
||||||
|
// 刷新列表
|
||||||
|
await getList()
|
||||||
|
} catch {}
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 导出按钮操作 */
|
||||||
|
const handleExport = async () => {
|
||||||
|
try {
|
||||||
|
// 导出的二次确认
|
||||||
|
await message.exportConfirm()
|
||||||
|
// 发起导出
|
||||||
|
exportLoading.value = true
|
||||||
|
const data = await MainApi.exportMain(queryParams)
|
||||||
|
download.excel(data, '专利信息.xls')
|
||||||
|
} catch {
|
||||||
|
} finally {
|
||||||
|
exportLoading.value = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 初始化 **/
|
||||||
|
onMounted(() => {
|
||||||
|
getList()
|
||||||
|
})
|
||||||
|
</script>
|
||||||
|
|
@ -0,0 +1,186 @@
|
||||||
|
<template>
|
||||||
|
<Dialog :title="dialogTitle" v-model="dialogVisible">
|
||||||
|
<el-form
|
||||||
|
ref="formRef"
|
||||||
|
:model="formData"
|
||||||
|
:rules="formRules"
|
||||||
|
label-width="100px"
|
||||||
|
v-loading="formLoading"
|
||||||
|
>
|
||||||
|
<el-form-item label="合同主键Id" prop="contractId">
|
||||||
|
<el-input v-model="formData.contractId" placeholder="请输入合同主键Id" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="合同编号" prop="contractCode">
|
||||||
|
<el-input v-model="formData.contractCode" placeholder="请输入合同编号" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="执行区段" prop="section">
|
||||||
|
<el-input v-model="formData.section" placeholder="请输入执行区段" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="进展情况(正常,拖延,停顿)" prop="progress">
|
||||||
|
<el-input v-model="formData.progress" placeholder="请输入进展情况(正常,拖延,停顿)" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="负责人Id" prop="directorId">
|
||||||
|
<el-input v-model="formData.directorId" placeholder="请输入负责人Id" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="负责人姓名" prop="director">
|
||||||
|
<el-input v-model="formData.director" placeholder="请输入负责人姓名" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="主管部门ID" prop="competentDeptId">
|
||||||
|
<el-input v-model="formData.competentDeptId" placeholder="请输入主管部门ID" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="主管部门" prop="competentDeptName">
|
||||||
|
<el-input v-model="formData.competentDeptName" placeholder="请输入主管部门" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="主管工程师ID" prop="managerId">
|
||||||
|
<el-input v-model="formData.managerId" placeholder="请输入主管工程师ID" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="主管工程师" prop="managerName">
|
||||||
|
<el-input v-model="formData.managerName" placeholder="请输入主管工程师" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="创建人" prop="createdBy">
|
||||||
|
<el-input v-model="formData.createdBy" placeholder="请输入创建人" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="创建时间" prop="createdTime">
|
||||||
|
<el-date-picker
|
||||||
|
v-model="formData.createdTime"
|
||||||
|
type="date"
|
||||||
|
value-format="x"
|
||||||
|
placeholder="选择创建时间"
|
||||||
|
/>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="更新人" prop="updatedBy">
|
||||||
|
<el-input v-model="formData.updatedBy" placeholder="请输入更新人" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="更新时间" prop="updatedTime">
|
||||||
|
<el-date-picker
|
||||||
|
v-model="formData.updatedTime"
|
||||||
|
type="date"
|
||||||
|
value-format="x"
|
||||||
|
placeholder="选择更新时间"
|
||||||
|
/>
|
||||||
|
</el-form-item>
|
||||||
|
</el-form>
|
||||||
|
<!-- 子表的表单 -->
|
||||||
|
<el-tabs v-model="subTabsName">
|
||||||
|
<el-tab-pane label="执行详细信息" name="info">
|
||||||
|
<InfoForm ref="infoFormRef" :process-id="formData.id" />
|
||||||
|
</el-tab-pane>
|
||||||
|
</el-tabs>
|
||||||
|
<template #footer>
|
||||||
|
<el-button @click="submitForm" type="primary" :disabled="formLoading">确 定</el-button>
|
||||||
|
<el-button @click="dialogVisible = false">取 消</el-button>
|
||||||
|
</template>
|
||||||
|
</Dialog>
|
||||||
|
</template>
|
||||||
|
<script setup lang="ts">
|
||||||
|
import { MainApi, MainVO } from '@/api/process/process'
|
||||||
|
import InfoForm from './components/InfoForm.vue'
|
||||||
|
|
||||||
|
/** 执行主 表单 */
|
||||||
|
defineOptions({ name: 'MainForm' })
|
||||||
|
|
||||||
|
const { t } = useI18n() // 国际化
|
||||||
|
const message = useMessage() // 消息弹窗
|
||||||
|
|
||||||
|
const dialogVisible = ref(false) // 弹窗的是否展示
|
||||||
|
const dialogTitle = ref('') // 弹窗的标题
|
||||||
|
const formLoading = ref(false) // 表单的加载中:1)修改时的数据加载;2)提交的按钮禁用
|
||||||
|
const formType = ref('') // 表单的类型:create - 新增;update - 修改
|
||||||
|
const formData = ref({
|
||||||
|
id: undefined,
|
||||||
|
contractId: undefined,
|
||||||
|
contractCode: undefined,
|
||||||
|
section: undefined,
|
||||||
|
progress: undefined,
|
||||||
|
directorId: undefined,
|
||||||
|
director: undefined,
|
||||||
|
competentDeptId: undefined,
|
||||||
|
competentDeptName: undefined,
|
||||||
|
managerId: undefined,
|
||||||
|
managerName: undefined,
|
||||||
|
createdBy: undefined,
|
||||||
|
createdTime: undefined,
|
||||||
|
updatedBy: undefined,
|
||||||
|
updatedTime: undefined,
|
||||||
|
})
|
||||||
|
const formRules = reactive({
|
||||||
|
})
|
||||||
|
const formRef = ref() // 表单 Ref
|
||||||
|
|
||||||
|
/** 子表的表单 */
|
||||||
|
const subTabsName = ref('info')
|
||||||
|
const infoFormRef = ref()
|
||||||
|
|
||||||
|
/** 打开弹窗 */
|
||||||
|
const open = async (type: string, id?: number) => {
|
||||||
|
dialogVisible.value = true
|
||||||
|
dialogTitle.value = t('action.' + type)
|
||||||
|
formType.value = type
|
||||||
|
resetForm()
|
||||||
|
// 修改时,设置数据
|
||||||
|
if (id) {
|
||||||
|
formLoading.value = true
|
||||||
|
try {
|
||||||
|
formData.value = await MainApi.getMain(id)
|
||||||
|
} finally {
|
||||||
|
formLoading.value = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
defineExpose({ open }) // 提供 open 方法,用于打开弹窗
|
||||||
|
|
||||||
|
/** 提交表单 */
|
||||||
|
const emit = defineEmits(['success']) // 定义 success 事件,用于操作成功后的回调
|
||||||
|
const submitForm = async () => {
|
||||||
|
// 校验表单
|
||||||
|
await formRef.value.validate()
|
||||||
|
// 校验子表单
|
||||||
|
try {
|
||||||
|
await infoFormRef.value.validate()
|
||||||
|
} catch (e) {
|
||||||
|
subTabsName.value = 'info'
|
||||||
|
return
|
||||||
|
}
|
||||||
|
// 提交请求
|
||||||
|
formLoading.value = true
|
||||||
|
try {
|
||||||
|
const data = formData.value as unknown as MainVO
|
||||||
|
// 拼接子表的数据
|
||||||
|
data.info = infoFormRef.value.getData()
|
||||||
|
if (formType.value === 'create') {
|
||||||
|
await MainApi.createMain(data)
|
||||||
|
message.success(t('common.createSuccess'))
|
||||||
|
} else {
|
||||||
|
await MainApi.updateMain(data)
|
||||||
|
message.success(t('common.updateSuccess'))
|
||||||
|
}
|
||||||
|
dialogVisible.value = false
|
||||||
|
// 发送操作成功的事件
|
||||||
|
emit('success')
|
||||||
|
} finally {
|
||||||
|
formLoading.value = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 重置表单 */
|
||||||
|
const resetForm = () => {
|
||||||
|
formData.value = {
|
||||||
|
id: undefined,
|
||||||
|
contractId: undefined,
|
||||||
|
contractCode: undefined,
|
||||||
|
section: undefined,
|
||||||
|
progress: undefined,
|
||||||
|
directorId: undefined,
|
||||||
|
director: undefined,
|
||||||
|
competentDeptId: undefined,
|
||||||
|
competentDeptName: undefined,
|
||||||
|
managerId: undefined,
|
||||||
|
managerName: undefined,
|
||||||
|
createdBy: undefined,
|
||||||
|
createdTime: undefined,
|
||||||
|
updatedBy: undefined,
|
||||||
|
updatedTime: undefined,
|
||||||
|
}
|
||||||
|
formRef.value?.resetFields()
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
@ -0,0 +1,99 @@
|
||||||
|
<template>
|
||||||
|
<el-form
|
||||||
|
ref="formRef"
|
||||||
|
:model="formData"
|
||||||
|
:rules="formRules"
|
||||||
|
label-width="100px"
|
||||||
|
v-loading="formLoading"
|
||||||
|
>
|
||||||
|
<el-form-item label="课题总体进展及本阶段开展的主要研究工作" prop="mainWork">
|
||||||
|
<el-input v-model="formData.mainWork" type="textarea" placeholder="请输入课题总体进展及本阶段开展的主要研究工作" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="投入研究的工作量" prop="injectWork">
|
||||||
|
<el-input v-model="formData.injectWork" type="textarea" placeholder="请输入投入研究的工作量" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="项目执行情况工作过程的描述、遇到的问题、采取的措施和方法" prop="describe">
|
||||||
|
<el-input v-model="formData.describe" type="textarea" placeholder="请输入项目执行情况工作过程的描述、遇到的问题、采取的措施和方法" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="创建人" prop="createdBy">
|
||||||
|
<el-input v-model="formData.createdBy" placeholder="请输入创建人" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="创建时间" prop="createdTime">
|
||||||
|
<el-date-picker
|
||||||
|
v-model="formData.createdTime"
|
||||||
|
type="date"
|
||||||
|
value-format="x"
|
||||||
|
placeholder="选择创建时间"
|
||||||
|
/>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="更新人" prop="updatedBy">
|
||||||
|
<el-input v-model="formData.updatedBy" placeholder="请输入更新人" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="更新时间" prop="updatedTime">
|
||||||
|
<el-date-picker
|
||||||
|
v-model="formData.updatedTime"
|
||||||
|
type="date"
|
||||||
|
value-format="x"
|
||||||
|
placeholder="选择更新时间"
|
||||||
|
/>
|
||||||
|
</el-form-item>
|
||||||
|
</el-form>
|
||||||
|
</template>
|
||||||
|
<script setup lang="ts">
|
||||||
|
import { MainApi } from '@/api/process/process'
|
||||||
|
|
||||||
|
const props = defineProps<{
|
||||||
|
processId: undefined // 执行ID(主表的关联字段)
|
||||||
|
}>()
|
||||||
|
const formLoading = ref(false) // 表单的加载中
|
||||||
|
const formData = ref([])
|
||||||
|
const formRules = reactive({
|
||||||
|
})
|
||||||
|
const formRef = ref() // 表单 Ref
|
||||||
|
|
||||||
|
/** 监听主表的关联字段的变化,加载对应的子表数据 */
|
||||||
|
watch(
|
||||||
|
() => props.processId,
|
||||||
|
async (val) => {
|
||||||
|
// 1. 重置表单
|
||||||
|
formData.value = {
|
||||||
|
id: undefined,
|
||||||
|
processId: undefined,
|
||||||
|
mainWork: undefined,
|
||||||
|
injectWork: undefined,
|
||||||
|
describe: undefined,
|
||||||
|
createdBy: undefined,
|
||||||
|
createdTime: undefined,
|
||||||
|
updatedBy: undefined,
|
||||||
|
updatedTime: undefined,
|
||||||
|
}
|
||||||
|
// 2. val 非空,则加载数据
|
||||||
|
if (!val) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
formLoading.value = true
|
||||||
|
const data = await MainApi.getInfoByProcessId(val)
|
||||||
|
if (!data) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
formData.value = data
|
||||||
|
} finally {
|
||||||
|
formLoading.value = false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{ immediate: true }
|
||||||
|
)
|
||||||
|
|
||||||
|
/** 表单校验 */
|
||||||
|
const validate = () => {
|
||||||
|
return formRef.value.validate()
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 表单值 */
|
||||||
|
const getData = () => {
|
||||||
|
return formData.value
|
||||||
|
}
|
||||||
|
|
||||||
|
defineExpose({ validate, getData })
|
||||||
|
</script>
|
||||||
|
|
@ -0,0 +1,213 @@
|
||||||
|
<template>
|
||||||
|
<ContentWrap>
|
||||||
|
<!-- 搜索工作栏 -->
|
||||||
|
<el-form
|
||||||
|
class="-mb-15px"
|
||||||
|
:model="queryParams"
|
||||||
|
ref="queryFormRef"
|
||||||
|
:inline="true"
|
||||||
|
label-width="68px"
|
||||||
|
>
|
||||||
|
<el-form-item label="合同编号" prop="contractCode">
|
||||||
|
<el-input
|
||||||
|
v-model="queryParams.contractCode"
|
||||||
|
placeholder="请输入合同编号"
|
||||||
|
clearable
|
||||||
|
@keyup.enter="handleQuery"
|
||||||
|
class="!w-240px"
|
||||||
|
/>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="执行区段" prop="section">
|
||||||
|
<el-input
|
||||||
|
v-model="queryParams.section"
|
||||||
|
placeholder="请输入执行区段"
|
||||||
|
clearable
|
||||||
|
@keyup.enter="handleQuery"
|
||||||
|
class="!w-240px"
|
||||||
|
/>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="负责人姓名" prop="director">
|
||||||
|
<el-input
|
||||||
|
v-model="queryParams.director"
|
||||||
|
placeholder="请输入负责人姓名"
|
||||||
|
clearable
|
||||||
|
@keyup.enter="handleQuery"
|
||||||
|
class="!w-240px"
|
||||||
|
/>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="主管部门" prop="competentDeptName">
|
||||||
|
<el-input
|
||||||
|
v-model="queryParams.competentDeptName"
|
||||||
|
placeholder="请输入主管部门"
|
||||||
|
clearable
|
||||||
|
@keyup.enter="handleQuery"
|
||||||
|
class="!w-240px"
|
||||||
|
/>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="主管工程师" prop="managerName">
|
||||||
|
<el-input
|
||||||
|
v-model="queryParams.managerName"
|
||||||
|
placeholder="请输入主管工程师"
|
||||||
|
clearable
|
||||||
|
@keyup.enter="handleQuery"
|
||||||
|
class="!w-240px"
|
||||||
|
/>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item>
|
||||||
|
<el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> 搜索</el-button>
|
||||||
|
<el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> 重置</el-button>
|
||||||
|
<el-button
|
||||||
|
type="primary"
|
||||||
|
plain
|
||||||
|
@click="openForm('create')"
|
||||||
|
v-hasPermi="['process:main:create']"
|
||||||
|
>
|
||||||
|
<Icon icon="ep:plus" class="mr-5px" /> 新增
|
||||||
|
</el-button>
|
||||||
|
<el-button
|
||||||
|
type="success"
|
||||||
|
plain
|
||||||
|
@click="handleExport"
|
||||||
|
:loading="exportLoading"
|
||||||
|
v-hasPermi="['process:main:export']"
|
||||||
|
>
|
||||||
|
<Icon icon="ep:download" class="mr-5px" /> 导出
|
||||||
|
</el-button>
|
||||||
|
</el-form-item>
|
||||||
|
</el-form>
|
||||||
|
</ContentWrap>
|
||||||
|
|
||||||
|
<!-- 列表 -->
|
||||||
|
<ContentWrap>
|
||||||
|
<el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true">
|
||||||
|
<el-table-column label="id" align="center" prop="id" />
|
||||||
|
<el-table-column label="合同主键Id" align="center" prop="contractId" />
|
||||||
|
<el-table-column label="合同编号" align="center" prop="contractCode" />
|
||||||
|
<el-table-column label="执行区段" align="center" prop="section" />
|
||||||
|
<el-table-column label="进展情况(正常,拖延,停顿)" align="center" prop="progress" />
|
||||||
|
<el-table-column label="负责人姓名" align="center" prop="director" />
|
||||||
|
<el-table-column label="主管部门" align="center" prop="competentDeptName" />
|
||||||
|
<el-table-column label="主管工程师" align="center" prop="managerName" />
|
||||||
|
<el-table-column label="操作" align="center">
|
||||||
|
<template #default="scope">
|
||||||
|
<el-button
|
||||||
|
link
|
||||||
|
type="primary"
|
||||||
|
@click="openForm('update', scope.row.id)"
|
||||||
|
v-hasPermi="['process:main:update']"
|
||||||
|
>
|
||||||
|
编辑
|
||||||
|
</el-button>
|
||||||
|
<el-button
|
||||||
|
link
|
||||||
|
type="danger"
|
||||||
|
@click="handleDelete(scope.row.id)"
|
||||||
|
v-hasPermi="['process:main:delete']"
|
||||||
|
>
|
||||||
|
删除
|
||||||
|
</el-button>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
</el-table>
|
||||||
|
<!-- 分页 -->
|
||||||
|
<Pagination
|
||||||
|
:total="total"
|
||||||
|
v-model:page="queryParams.pageNo"
|
||||||
|
v-model:limit="queryParams.pageSize"
|
||||||
|
@pagination="getList"
|
||||||
|
/>
|
||||||
|
</ContentWrap>
|
||||||
|
|
||||||
|
<!-- 表单弹窗:添加/修改 -->
|
||||||
|
<MainForm ref="formRef" @success="getList" />
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup lang="ts">
|
||||||
|
import download from '@/utils/download'
|
||||||
|
import { MainApi, MainVO } from '@/api/process/process'
|
||||||
|
import MainForm from './MainForm.vue'
|
||||||
|
|
||||||
|
/** 执行主 列表 */
|
||||||
|
defineOptions({ name: 'ProcessMain' })
|
||||||
|
|
||||||
|
const message = useMessage() // 消息弹窗
|
||||||
|
const { t } = useI18n() // 国际化
|
||||||
|
|
||||||
|
const loading = ref(true) // 列表的加载中
|
||||||
|
const list = ref<MainVO[]>([]) // 列表的数据
|
||||||
|
const total = ref(0) // 列表的总页数
|
||||||
|
const queryParams = reactive({
|
||||||
|
pageNo: 1,
|
||||||
|
pageSize: 10,
|
||||||
|
contractCode: undefined,
|
||||||
|
section: undefined,
|
||||||
|
director: undefined,
|
||||||
|
competentDeptName: undefined,
|
||||||
|
managerName: undefined,
|
||||||
|
})
|
||||||
|
const queryFormRef = ref() // 搜索的表单
|
||||||
|
const exportLoading = ref(false) // 导出的加载中
|
||||||
|
|
||||||
|
/** 查询列表 */
|
||||||
|
const getList = async () => {
|
||||||
|
loading.value = true
|
||||||
|
try {
|
||||||
|
const data = await MainApi.getMainPage(queryParams)
|
||||||
|
list.value = data.list
|
||||||
|
total.value = data.total
|
||||||
|
} finally {
|
||||||
|
loading.value = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 搜索按钮操作 */
|
||||||
|
const handleQuery = () => {
|
||||||
|
queryParams.pageNo = 1
|
||||||
|
getList()
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 重置按钮操作 */
|
||||||
|
const resetQuery = () => {
|
||||||
|
queryFormRef.value.resetFields()
|
||||||
|
handleQuery()
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 添加/修改操作 */
|
||||||
|
const formRef = ref()
|
||||||
|
const openForm = (type: string, id?: number) => {
|
||||||
|
formRef.value.open(type, id)
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 删除按钮操作 */
|
||||||
|
const handleDelete = async (id: number) => {
|
||||||
|
try {
|
||||||
|
// 删除的二次确认
|
||||||
|
await message.delConfirm()
|
||||||
|
// 发起删除
|
||||||
|
await MainApi.deleteMain(id)
|
||||||
|
message.success(t('common.delSuccess'))
|
||||||
|
// 刷新列表
|
||||||
|
await getList()
|
||||||
|
} catch {}
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 导出按钮操作 */
|
||||||
|
const handleExport = async () => {
|
||||||
|
try {
|
||||||
|
// 导出的二次确认
|
||||||
|
await message.exportConfirm()
|
||||||
|
// 发起导出
|
||||||
|
exportLoading.value = true
|
||||||
|
const data = await MainApi.exportMain(queryParams)
|
||||||
|
download.excel(data, '执行主.xls')
|
||||||
|
} catch {
|
||||||
|
} finally {
|
||||||
|
exportLoading.value = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 初始化 **/
|
||||||
|
onMounted(() => {
|
||||||
|
getList()
|
||||||
|
})
|
||||||
|
</script>
|
||||||
|
|
@ -0,0 +1,143 @@
|
||||||
|
<template>
|
||||||
|
<Dialog :title="dialogTitle" v-model="dialogVisible">
|
||||||
|
<el-form
|
||||||
|
ref="formRef"
|
||||||
|
:model="formData"
|
||||||
|
:rules="formRules"
|
||||||
|
label-width="100px"
|
||||||
|
v-loading="formLoading"
|
||||||
|
>
|
||||||
|
<el-form-item label="用户姓名" prop="userName">
|
||||||
|
<el-input v-model="formData.userName" placeholder="请输入用户姓名" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="用户联系方式" prop="userContact">
|
||||||
|
<el-input v-model="formData.userContact" placeholder="请输入用户联系方式" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="预约日期" prop="reservationDate">
|
||||||
|
<el-date-picker
|
||||||
|
v-model="formData.reservationDate"
|
||||||
|
type="date"
|
||||||
|
value-format="x"
|
||||||
|
placeholder="选择预约日期"
|
||||||
|
/>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="实验室名称" prop="labName">
|
||||||
|
<el-input v-model="formData.labName" placeholder="请输入实验室名称" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="预约时长(小时)" prop="reservationDuration">
|
||||||
|
<el-input v-model="formData.reservationDuration" placeholder="请输入预约时长(小时)" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="预约状态(如待审核、已确认、已拒绝等)" prop="status">
|
||||||
|
<el-radio-group v-model="formData.status">
|
||||||
|
<el-radio label="1">请选择字典生成</el-radio>
|
||||||
|
</el-radio-group>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="审核人ID" prop="reviewerId">
|
||||||
|
<el-input v-model="formData.reviewerId" placeholder="请输入审核人ID" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="审核人姓名" prop="reviewerName">
|
||||||
|
<el-input v-model="formData.reviewerName" placeholder="请输入审核人姓名" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="审核意见(如有)" prop="reviewComments">
|
||||||
|
<el-input v-model="formData.reviewComments" placeholder="请输入审核意见(如有)" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="预约备注(如有)" prop="reservationNotes">
|
||||||
|
<el-input v-model="formData.reservationNotes" placeholder="请输入预约备注(如有)" />
|
||||||
|
</el-form-item>
|
||||||
|
</el-form>
|
||||||
|
<template #footer>
|
||||||
|
<el-button @click="submitForm" type="primary" :disabled="formLoading">确 定</el-button>
|
||||||
|
<el-button @click="dialogVisible = false">取 消</el-button>
|
||||||
|
</template>
|
||||||
|
</Dialog>
|
||||||
|
</template>
|
||||||
|
<script setup lang="ts">
|
||||||
|
import { LabInfoApi, LabInfoVO } from '@/api/publicLab/publicLab'
|
||||||
|
|
||||||
|
/** 公共实验室信 表单 */
|
||||||
|
defineOptions({ name: 'LabInfoForm' })
|
||||||
|
|
||||||
|
const { t } = useI18n() // 国际化
|
||||||
|
const message = useMessage() // 消息弹窗
|
||||||
|
|
||||||
|
const dialogVisible = ref(false) // 弹窗的是否展示
|
||||||
|
const dialogTitle = ref('') // 弹窗的标题
|
||||||
|
const formLoading = ref(false) // 表单的加载中:1)修改时的数据加载;2)提交的按钮禁用
|
||||||
|
const formType = ref('') // 表单的类型:create - 新增;update - 修改
|
||||||
|
const formData = ref({
|
||||||
|
id: undefined,
|
||||||
|
userName: undefined,
|
||||||
|
userContact: undefined,
|
||||||
|
reservationDate: undefined,
|
||||||
|
labName: undefined,
|
||||||
|
reservationDuration: undefined,
|
||||||
|
status: undefined,
|
||||||
|
reviewerId: undefined,
|
||||||
|
reviewerName: undefined,
|
||||||
|
reviewComments: undefined,
|
||||||
|
reservationNotes: undefined,
|
||||||
|
})
|
||||||
|
const formRules = reactive({
|
||||||
|
})
|
||||||
|
const formRef = ref() // 表单 Ref
|
||||||
|
|
||||||
|
/** 打开弹窗 */
|
||||||
|
const open = async (type: string, id?: number) => {
|
||||||
|
dialogVisible.value = true
|
||||||
|
dialogTitle.value = t('action.' + type)
|
||||||
|
formType.value = type
|
||||||
|
resetForm()
|
||||||
|
// 修改时,设置数据
|
||||||
|
if (id) {
|
||||||
|
formLoading.value = true
|
||||||
|
try {
|
||||||
|
formData.value = await LabInfoApi.getLabInfo(id)
|
||||||
|
} finally {
|
||||||
|
formLoading.value = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
defineExpose({ open }) // 提供 open 方法,用于打开弹窗
|
||||||
|
|
||||||
|
/** 提交表单 */
|
||||||
|
const emit = defineEmits(['success']) // 定义 success 事件,用于操作成功后的回调
|
||||||
|
const submitForm = async () => {
|
||||||
|
// 校验表单
|
||||||
|
await formRef.value.validate()
|
||||||
|
// 提交请求
|
||||||
|
formLoading.value = true
|
||||||
|
try {
|
||||||
|
const data = formData.value as unknown as LabInfoVO
|
||||||
|
if (formType.value === 'create') {
|
||||||
|
await LabInfoApi.createLabInfo(data)
|
||||||
|
message.success(t('common.createSuccess'))
|
||||||
|
} else {
|
||||||
|
await LabInfoApi.updateLabInfo(data)
|
||||||
|
message.success(t('common.updateSuccess'))
|
||||||
|
}
|
||||||
|
dialogVisible.value = false
|
||||||
|
// 发送操作成功的事件
|
||||||
|
emit('success')
|
||||||
|
} finally {
|
||||||
|
formLoading.value = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 重置表单 */
|
||||||
|
const resetForm = () => {
|
||||||
|
formData.value = {
|
||||||
|
id: undefined,
|
||||||
|
userName: undefined,
|
||||||
|
userContact: undefined,
|
||||||
|
reservationDate: undefined,
|
||||||
|
labName: undefined,
|
||||||
|
reservationDuration: undefined,
|
||||||
|
status: undefined,
|
||||||
|
reviewerId: undefined,
|
||||||
|
reviewerName: undefined,
|
||||||
|
reviewComments: undefined,
|
||||||
|
reservationNotes: undefined,
|
||||||
|
}
|
||||||
|
formRef.value?.resetFields()
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
@ -0,0 +1,208 @@
|
||||||
|
<template>
|
||||||
|
<ContentWrap>
|
||||||
|
<!-- 搜索工作栏 -->
|
||||||
|
<el-form
|
||||||
|
class="-mb-15px"
|
||||||
|
:model="queryParams"
|
||||||
|
ref="queryFormRef"
|
||||||
|
:inline="true"
|
||||||
|
label-width="68px"
|
||||||
|
>
|
||||||
|
<el-form-item label="用户姓名" prop="userName">
|
||||||
|
<el-input
|
||||||
|
v-model="queryParams.userName"
|
||||||
|
placeholder="请输入用户姓名"
|
||||||
|
clearable
|
||||||
|
@keyup.enter="handleQuery"
|
||||||
|
class="!w-240px"
|
||||||
|
/>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="预约日期" prop="reservationDate">
|
||||||
|
<el-date-picker
|
||||||
|
v-model="queryParams.reservationDate"
|
||||||
|
value-format="YYYY-MM-DD HH:mm:ss"
|
||||||
|
type="daterange"
|
||||||
|
start-placeholder="开始日期"
|
||||||
|
end-placeholder="结束日期"
|
||||||
|
:default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"
|
||||||
|
class="!w-240px"
|
||||||
|
/>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="实验室名称" prop="labName">
|
||||||
|
<el-input
|
||||||
|
v-model="queryParams.labName"
|
||||||
|
placeholder="请输入实验室名称"
|
||||||
|
clearable
|
||||||
|
@keyup.enter="handleQuery"
|
||||||
|
class="!w-240px"
|
||||||
|
/>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="预约状态(如待审核、已确认、已拒绝等)" prop="status">
|
||||||
|
<el-select
|
||||||
|
v-model="queryParams.status"
|
||||||
|
placeholder="请选择预约状态(如待审核、已确认、已拒绝等)"
|
||||||
|
clearable
|
||||||
|
class="!w-240px"
|
||||||
|
>
|
||||||
|
<el-option label="请选择字典生成" value="" />
|
||||||
|
</el-select>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item>
|
||||||
|
<el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> 搜索</el-button>
|
||||||
|
<el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> 重置</el-button>
|
||||||
|
<el-button
|
||||||
|
type="primary"
|
||||||
|
plain
|
||||||
|
@click="openForm('create')"
|
||||||
|
v-hasPermi="['publicLab:lab-info:create']"
|
||||||
|
>
|
||||||
|
<Icon icon="ep:plus" class="mr-5px" /> 新增
|
||||||
|
</el-button>
|
||||||
|
<el-button
|
||||||
|
type="success"
|
||||||
|
plain
|
||||||
|
@click="handleExport"
|
||||||
|
:loading="exportLoading"
|
||||||
|
v-hasPermi="['publicLab:lab-info:export']"
|
||||||
|
>
|
||||||
|
<Icon icon="ep:download" class="mr-5px" /> 导出
|
||||||
|
</el-button>
|
||||||
|
</el-form-item>
|
||||||
|
</el-form>
|
||||||
|
</ContentWrap>
|
||||||
|
|
||||||
|
<!-- 列表 -->
|
||||||
|
<ContentWrap>
|
||||||
|
<el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true">
|
||||||
|
<el-table-column label="id" align="center" prop="id" />
|
||||||
|
<el-table-column label="用户姓名" align="center" prop="userName" />
|
||||||
|
<el-table-column label="用户联系方式" align="center" prop="userContact" />
|
||||||
|
<el-table-column label="预约日期" align="center" prop="reservationDate" />
|
||||||
|
<el-table-column label="实验室名称" align="center" prop="labName" />
|
||||||
|
<el-table-column label="预约时长(小时)" align="center" prop="reservationDuration" />
|
||||||
|
<el-table-column label="预约状态(如待审核、已确认、已拒绝等)" align="center" prop="status" />
|
||||||
|
<el-table-column label="审核人姓名" align="center" prop="reviewerName" />
|
||||||
|
<el-table-column label="审核意见(如有)" align="center" prop="reviewComments" />
|
||||||
|
<el-table-column label="预约备注(如有)" align="center" prop="reservationNotes" />
|
||||||
|
<el-table-column label="操作" align="center">
|
||||||
|
<template #default="scope">
|
||||||
|
<el-button
|
||||||
|
link
|
||||||
|
type="primary"
|
||||||
|
@click="openForm('update', scope.row.id)"
|
||||||
|
v-hasPermi="['publicLab:lab-info:update']"
|
||||||
|
>
|
||||||
|
编辑
|
||||||
|
</el-button>
|
||||||
|
<el-button
|
||||||
|
link
|
||||||
|
type="danger"
|
||||||
|
@click="handleDelete(scope.row.id)"
|
||||||
|
v-hasPermi="['publicLab:lab-info:delete']"
|
||||||
|
>
|
||||||
|
删除
|
||||||
|
</el-button>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
</el-table>
|
||||||
|
<!-- 分页 -->
|
||||||
|
<Pagination
|
||||||
|
:total="total"
|
||||||
|
v-model:page="queryParams.pageNo"
|
||||||
|
v-model:limit="queryParams.pageSize"
|
||||||
|
@pagination="getList"
|
||||||
|
/>
|
||||||
|
</ContentWrap>
|
||||||
|
|
||||||
|
<!-- 表单弹窗:添加/修改 -->
|
||||||
|
<LabInfoForm ref="formRef" @success="getList" />
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup lang="ts">
|
||||||
|
import download from '@/utils/download'
|
||||||
|
import { LabInfoApi, LabInfoVO } from '@/api/publicLab/publicLab'
|
||||||
|
import LabInfoForm from './LabInfoForm.vue'
|
||||||
|
|
||||||
|
/** 公共实验室信 列表 */
|
||||||
|
defineOptions({ name: 'LabInfo' })
|
||||||
|
|
||||||
|
const message = useMessage() // 消息弹窗
|
||||||
|
const { t } = useI18n() // 国际化
|
||||||
|
|
||||||
|
const loading = ref(true) // 列表的加载中
|
||||||
|
const list = ref<LabInfoVO[]>([]) // 列表的数据
|
||||||
|
const total = ref(0) // 列表的总页数
|
||||||
|
const queryParams = reactive({
|
||||||
|
pageNo: 1,
|
||||||
|
pageSize: 10,
|
||||||
|
userName: undefined,
|
||||||
|
reservationDate: [],
|
||||||
|
labName: undefined,
|
||||||
|
status: undefined,
|
||||||
|
})
|
||||||
|
const queryFormRef = ref() // 搜索的表单
|
||||||
|
const exportLoading = ref(false) // 导出的加载中
|
||||||
|
|
||||||
|
/** 查询列表 */
|
||||||
|
const getList = async () => {
|
||||||
|
loading.value = true
|
||||||
|
try {
|
||||||
|
const data = await LabInfoApi.getLabInfoPage(queryParams)
|
||||||
|
list.value = data.list
|
||||||
|
total.value = data.total
|
||||||
|
} finally {
|
||||||
|
loading.value = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 搜索按钮操作 */
|
||||||
|
const handleQuery = () => {
|
||||||
|
queryParams.pageNo = 1
|
||||||
|
getList()
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 重置按钮操作 */
|
||||||
|
const resetQuery = () => {
|
||||||
|
queryFormRef.value.resetFields()
|
||||||
|
handleQuery()
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 添加/修改操作 */
|
||||||
|
const formRef = ref()
|
||||||
|
const openForm = (type: string, id?: number) => {
|
||||||
|
formRef.value.open(type, id)
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 删除按钮操作 */
|
||||||
|
const handleDelete = async (id: number) => {
|
||||||
|
try {
|
||||||
|
// 删除的二次确认
|
||||||
|
await message.delConfirm()
|
||||||
|
// 发起删除
|
||||||
|
await LabInfoApi.deleteLabInfo(id)
|
||||||
|
message.success(t('common.delSuccess'))
|
||||||
|
// 刷新列表
|
||||||
|
await getList()
|
||||||
|
} catch {}
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 导出按钮操作 */
|
||||||
|
const handleExport = async () => {
|
||||||
|
try {
|
||||||
|
// 导出的二次确认
|
||||||
|
await message.exportConfirm()
|
||||||
|
// 发起导出
|
||||||
|
exportLoading.value = true
|
||||||
|
const data = await LabInfoApi.exportLabInfo(queryParams)
|
||||||
|
download.excel(data, '公共实验室信.xls')
|
||||||
|
} catch {
|
||||||
|
} finally {
|
||||||
|
exportLoading.value = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 初始化 **/
|
||||||
|
onMounted(() => {
|
||||||
|
getList()
|
||||||
|
})
|
||||||
|
</script>
|
||||||
Loading…
Reference in New Issue