初始化立项、任务书、执行、变更、验收、知识产权、公共实验室模块

pull/480/head
admin 2024-04-13 15:07:58 +08:00
parent ecf9f26547
commit f742e12dd4
50 changed files with 7029 additions and 15 deletions

2
.env
View File

@ -1,5 +1,5 @@
# 标题
VITE_APP_TITLE=芋道管理系统
VITE_APP_TITLE=科研管理系统
# 项目本地运行端口号
VITE_PORT=80

View File

@ -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 })
},
}

View File

@ -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 })
},
}

View File

@ -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 })
},
}

View File

@ -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 })
},
}

View File

@ -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 })
},
}

View File

@ -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 })
},
}

View File

@ -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

View File

@ -114,7 +114,7 @@ export default {
},
login: {
welcome: '欢迎使用本系统',
message: '开箱即用的中后台管理系统',
message: '北京金隅集团科研管理系统',
tenantname: '租户名称',
username: '用户名',
password: '密码',
@ -368,7 +368,7 @@ export default {
qrSignInFormTitle: '二维码登录',
signUpFormTitle: '注册',
forgetFormTitle: '重置密码',
signInTitle: '开箱即用的中后台管理系统',
signInTitle: '北京金隅集团科研管理系统',
signInDesc: '输入您的个人详细信息开始使用!',
policy: '我同意xxx隐私政策',
scanSign: `扫码后点击"确认",即可完成登录`,

View File

@ -48,14 +48,14 @@
>
<!-- 账号登录 -->
<LoginForm class="m-auto h-auto p-20px lt-xl:(rounded-3xl light:bg-white)" />
<!-- 手机登录 -->
<!-- &lt;!&ndash; 手机登录 &ndash;&gt;
<MobileForm class="m-auto h-auto p-20px lt-xl:(rounded-3xl light:bg-white)" />
<!-- 二维码登录 -->
&lt;!&ndash; 二维码登录 &ndash;&gt;
<QrCodeForm class="m-auto h-auto p-20px lt-xl:(rounded-3xl light:bg-white)" />
<!-- 注册 -->
&lt;!&ndash; 注册 &ndash;&gt;
<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)" />
&lt;!&ndash; 三方登录 &ndash;&gt;
<SSOLoginVue class="m-auto h-auto p-20px lt-xl:(rounded-3xl light:bg-white)" />-->
</div>
</Transition>
</div>

View File

@ -82,7 +82,7 @@
mode="pop"
@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-row :gutter="5" justify="space-between" style="width: 100%">
<el-col :span="8">
@ -108,8 +108,8 @@
</el-col>
</el-row>
</el-form-item>
</el-col>
<el-divider content-position="center">{{ t('login.otherLogin') }}</el-divider>
</el-col>-->
<!-- <el-divider content-position="center">{{ t('login.otherLogin') }}</el-divider>
<el-col :span="24" style="padding-right: 10px; padding-left: 10px">
<el-form-item>
<div class="w-[100%] flex justify-between">
@ -124,8 +124,8 @@
/>
</div>
</el-form-item>
</el-col>
<el-divider content-position="center">萌新必读</el-divider>
</el-col>-->
<!-- <el-divider content-position="center">萌新必读</el-divider>
<el-col :span="24" style="padding-right: 10px; padding-left: 10px">
<el-form-item>
<div class="w-[100%] flex justify-between">
@ -139,7 +139,7 @@
</el-link>
</div>
</el-form-item>
</el-col>
</el-col>-->
</el-row>
</el-form>
</template>
@ -184,7 +184,7 @@ const loginData = reactive({
captchaEnable: import.meta.env.VITE_APP_CAPTCHA_ENABLE,
tenantEnable: import.meta.env.VITE_APP_TENANT_ENABLE,
loginForm: {
tenantName: '芋道源码',
tenantName: '金隅集团',
username: 'admin',
password: 'admin123',
captchaVerification: '',

View File

@ -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) // 12
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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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) // 12
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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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) // 12
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>

View File

@ -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>

View File

@ -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) // 12
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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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) // 12
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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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) // 12
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>

View File

@ -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>

View File

@ -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>

View File

@ -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) // 12
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>

View File

@ -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>