From 56466edfce52b1e0a7c1984bcba89ae69fc04247 Mon Sep 17 00:00:00 2001 From: wangxl <123456> Date: Wed, 27 Nov 2024 16:59:17 +0800 Subject: [PATCH] 22222 --- src/views/components/common/documentView.vue | 9 +- src/views/components/common/fileLoad.vue | 151 ++++++++++++++ .../project/components/managementRuleEdit.vue | 161 +++++++++++++++ .../report/project/components/projectEdit.vue | 22 +- .../project/components/projectSubEdit.vue | 191 ++++++++++++++++++ 5 files changed, 529 insertions(+), 5 deletions(-) create mode 100644 src/views/components/common/fileLoad.vue create mode 100644 src/views/report/project/components/managementRuleEdit.vue create mode 100644 src/views/report/project/components/projectSubEdit.vue diff --git a/src/views/components/common/documentView.vue b/src/views/components/common/documentView.vue index bae20c7..1410342 100644 --- a/src/views/components/common/documentView.vue +++ b/src/views/components/common/documentView.vue @@ -5,6 +5,9 @@ <a-modal v-model="visibleFileView" :title="'[' + fileName + '] 文件查看'" width="1000px" :dialog-style="{ top: '10%' }" :footer="null" destroyOnClose> <preview-file v-model="fileUrl" :fileName="fileName"></preview-file> </a-modal> + <a class="ant-dropdown-link" style="margin-left:6px" :href="fileUrl" :download="fileName"> + <a-icon type="download" /> + </a> </div> </template> @@ -17,7 +20,7 @@ export default { components: { previewFile }, - data() { + data () { return { visibleFileView: false, enums: enums, @@ -26,13 +29,13 @@ export default { props: { fileUrl: { type: String, - default() { + default () { return null; }, }, fileName: { type: String, - default() { + default () { return null; }, }, diff --git a/src/views/components/common/fileLoad.vue b/src/views/components/common/fileLoad.vue new file mode 100644 index 0000000..3789f45 --- /dev/null +++ b/src/views/components/common/fileLoad.vue @@ -0,0 +1,151 @@ +<template> + <div v-if="file.downloadUrl" class="file-box"> + <div> + <document-view :fileUrl="file.downloadUrl" :fileName="file.fileName" :imageArray="[file.downloadUrl]"></document-view> + </div> + <a-icon type="delete" class="hover-pointer d-icon" @click="deletefile(file)" /> + </div> + <div v-else> + <a-form-model-item :prop="name +'.'+ index + '.downloadUrl'" :rules="{required: true, message: '请上传附件',trigger: 'blur',}"> + <input type="file" :ref="name +'fileElem' + index" class="visually-hidden" @change="handleFiles(file, index)" /> + <a-button @click="fileSelect(index)"><a-icon type="upload" />选择文件</a-button> + </a-form-model-item> + </div> +</template> +<script> +import documentView from '@/views/components/common/documentView' +export default { + name: "FileLoad", + components: { + documentView + }, + data () { + return { + }; + }, + props: { + value: { + type: Object, + default: () => { + return null + } + }, + file: { + type: Object, + default: () => { + return null + } + }, + name: { + type: String, + default: () => { + return 'fileList' + } + }, + index: { + type: Number, + default () { + return 0 + }, + }, + }, + created () { + + }, + methods: { + deletefile (item) { + this.$api.base.deletefile({ id: item.downloadId }).then(({ data = {} }) => { + if (data) { + item.fileName = '' + item.downloadUrl = '' + item.downloadId = '' + } + }).catch(() => { + this.$message.error('删除失败') + }) + }, + handleFiles (item, index) { + let fileElem = this.$refs[this.name + 'fileElem' + index] + let files = fileElem.files + if (files.length <= 0) { + this.$message.error('未选中文件,请尝试重新选择') + return + } + if (!this.fileCheck(files[0])) + return + this.$api.base.asyncUpload(this.uploadHandle(files[0], files[0].name)).then(({ data = {} }) => { + if (data) { + item.fileName = files[0].name + item.downloadUrl = data.downloadUrl + item.downloadId = data.id + console.log(item, data) + } else + this.$message.error('上传失败') + }).catch(() => { + this.$message.error('上传失败') + }) + }, + fileCheck (file) { + //判断是否小于1M + let isLtSize = file.size < 1024 * 1024 * 15; + if (!isLtSize) { + this.$message.error('文件大小不能超过15M!'); + return false + } + // var fileNames = file.name.split('.') + // var fileType = fileNames[fileNames.length - 1].toLocaleLowerCase() + // var extList = ['doc', 'docx', 'pdf'] + // if (!extList.find((item) => item == fileType)) { + // this.$message.error('文件格式错误!') + // return false + // } + return true + }, + uploadHandle (file, fileName) { + let formData = new FormData() + formData.append('file', file) + formData.append('fileName', fileName) + return formData + }, + fileSelect (index) { + let fileElem = this.$refs[this.name + 'fileElem' + index] + if (fileElem) { + fileElem.click() + } + }, + }, + watch: { + value: { + handler (value) { + + }, + } + } +}; +</script> +<style scoped lang="less"> +.upload-layout { + display: inline-block; + margin: 0 10px; + height: 30px; + line-height: 30px; + + .file-box { + display: flex; + justify-content: space-between; + align-items: center; + margin: 0 8px; + + > div:nth-child(1) { + max-width: 90%; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + } + } + .visually-hidden { + display: none !important; + } +} +</style> + diff --git a/src/views/report/project/components/managementRuleEdit.vue b/src/views/report/project/components/managementRuleEdit.vue new file mode 100644 index 0000000..96d382c --- /dev/null +++ b/src/views/report/project/components/managementRuleEdit.vue @@ -0,0 +1,161 @@ +<template> + <div> + <a-row> + <a-col :span="24"> + <div class="tb-title"> + <span>单位科研项目及资金管理制度</span> + </div> + </a-col> + </a-row> + <a-row type="flex" class="item_inner"> + <a-col :span="4" class="bg-gray"> + <div class="special-middle"> + <div class="required">单位政策名称</div> + </div> + </a-col> + <a-col :span="2" class="bg-gray"> + <div class="special-middle"> + <div class="required">出台日期</div> + </div> + </a-col> + <a-col :span="2" class="bg-gray"> + <div class="special-middle"> + <div class="required">文号</div> + </div> + </a-col> + <a-col :span="2" class="bg-gray"> + <div class="special-middle"> + <div class="required">有效期</div> + </div> + </a-col> + <a-col :span="4" class="bg-gray"> + <div class="special-middle"> + <div class="required">主要内容</div> + </div> + </a-col> + <a-col :span="6" class="bg-gray"> + <div class="special-middle"> + <div>附件</div> + </div> + </a-col> + <a-col :span="2" class="bg-gray"> + <div class="special-middle"> + <div>操作</div> + </div> + </a-col> + </a-row> + <a-row v-for="(item, index) in managementRuleList" :key="'managementRuleList'+index" type="flex" class="item_inner"> + <a-col :span="4"> + <a-form-model-item :prop="'managementRuleList.' + index + '.policyName'" :rules="{ required: true, message: '*', trigger: 'blur',}"> + <a-input v-model="item.policyName" :maxLength="100" placeholder="单位政策名称" style="width:85%" /> + </a-form-model-item> + </a-col> + <a-col :span="2"> + <a-form-model-item :prop="'managementRuleList.' + index + '.releaseDate'" :rules="{ required: true, message: '*', trigger: 'change',}"> + <a-date-picker format="YYYY-MM-DD" valueFormat="YYYY-MM-DD HH:mm:ss" placeholder="出台日期" v-model="item.releaseDate" style="width:85%" /> + </a-form-model-item> + </a-col> + <a-col :span="2"> + <a-form-model-item :prop="'managementRuleList.' + index + '.documentNumber'" :rules="{ required: true, message: '*', trigger: 'blur',}"> + <a-input v-model="item.documentNumber" :maxLength="100" placeholder="文号" style="width:85%" /> + </a-form-model-item> + </a-col> + <a-col :span="2"> + <a-form-model-item :prop="'managementRuleList.' + index + '.validityPeriod'" :rules="{ required: true, message: '*', trigger: 'change',}"> + <a-date-picker format="YYYY-MM-DD" valueFormat="YYYY-MM-DD HH:mm:ss" placeholder="有效期" v-model="item.validityPeriod" style="width:85%" /> + </a-form-model-item> + </a-col> + <a-col :span="4"> + <a-form-model-item :prop="'managementRuleList.' + index + '.mainContent'" :rules="{ required: true, message: '*', trigger: 'blur',}"> + <a-input-number v-model="item.mainContent" placeholder="主要内容" :min="0" :step="0.01" style="width:85%" /> + </a-form-model-item> + </a-col> + <a-col :span="6"> + <div class="special-middle"> + <file-load :file.sync="managementRuleList[index]" :index="index" :name="'managementRuleList'" /> + </div> + </a-col> + <a-col :span="2"> + <div class="special-middle"> + <a-popconfirm title="确定要删除吗?" ok-text="确定" cancel-text="取消" @confirm="deleteListItem(item,1)"> + <a-button type="link" size="small">删除</a-button> + </a-popconfirm> + </div> + </a-col> + </a-row> + <a-row type="flex"> + <a-col :span="24" style="text-align: center"> + <div class="special-middle"> + <a-button type="dashed" style="width: 20%" @click="addListItem(1)"> + <a-icon type="plus" /> 添加 <span style="color:red;margin-left:10px"></span> + </a-button> + </div> + </a-col> + </a-row> + </div> +</template> + +<script> +const ManagementRule = { policyName: null, releaseDate: null, documentNumber: null, validityPeriod: null, mainContent: null, fileId: null, downloadId: null, fileName: null, downloadUrl: null } + +import { isEmptyParams } from "@/views/utils/common" +import fileLoad from '@/views/components/common/fileLoad' + + +export default { + name: "managementRuleEdit", + components: { + fileLoad + }, + props: { + managementRuleList: { + type: Array, + default: () => { + return [{ ...ManagementRule }] + } + }, + }, + data () { + return { + + }; + }, + created () { + + }, + computed: { + + }, + methods: { + + }, +}; +</script> +<style scoped lang="less"> +.file-description { + display: block; + width: 100%; + line-height: 22px; + padding: 3px 3px 3px 3px; + color: red; + white-space: normal; + word-wrap: break-word; + // text-indent: 1em; +} +.inner_from { + .ant-row-flex:last-child .ant-col { + border-bottom: 0; + } + .ant-row-flex .ant-col:first-child { + border-left: 0; + } + .ant-row-flex { + border-right: 0; + } +} +.special-middle { + .font_s { + margin: 0 6px; + } +} +</style> diff --git a/src/views/report/project/components/projectEdit.vue b/src/views/report/project/components/projectEdit.vue index cf95ddd..304e55f 100644 --- a/src/views/report/project/components/projectEdit.vue +++ b/src/views/report/project/components/projectEdit.vue @@ -597,6 +597,12 @@ <!-- 经费预算 --> <budget-edit :budget.sync="formData.budget" /> + <!-- 项目课题设置 --> + <project-sub-edit :projectSubList.sync="formData.projectSubList" /> + + <!-- 单位科研项目及资金管理制度表 --> + <management-rule-edit :managementRuleList.sync="formData.managementRuleList" /> + <!-- 附件 --> <file-edit :fileList.sync="formData.fileList" /> </a-form-model> @@ -611,10 +617,14 @@ import baseSelect from '@/views/components/common/baseSelect' import ProjGroupMember from '@/views/report/project/components/projGroupMember' import cooperativeUnits from '@/views/report/project/components/cooperativeUnits' import budgetEdit from '@/views/report/project/components/budgetEdit' +import projectSubEdit from '@/views/report/project/components/projectSubEdit' +import managementRuleEdit from '@/views/report/project/components/managementRuleEdit' import fileEdit from '@/views/report/project/components/fileEdit' import { isEmptyParams } from "@/views/utils/common" import moment from 'moment' +const ManagementRule = { policyName: null, releaseDate: null, documentNumber: null, validityPeriod: null, mainContent: null, fileId: null, downloadId: null, fileName: null, downloadUrl: null } +const ProjectSub = { projName: null, undertakingUnit: null, address: null, director: null, totalBudget: null, govBudget: null, selfBudget: null, cooperativeUnits: null, fileId: null, downloadId: null, fileName: null, downloadUrl: null } const Cooperative = { id: null, unitName: null, unitCountry: null, unitAddress: null, organizationCode: null, projectWork: null } const Members = { showIndex: 1, name: null, certId: null, sex: null, birthday: null, age: null, degree: null, title: null, duty: null, spec: null, workUnit: null, projWork: null } const Equipments = { name: null, specificationType: null, quantity: null, totalBudget: null, useFrom: null } @@ -623,7 +633,7 @@ const File = { fileName: '', downloadUrl: '', fileExplain: '', downloadId: '' } export default { name: 'projectEdit', components: { - paraMultiSelect, paraSelect, baseSelect, ProjGroupMember, cooperativeUnits,budgetEdit,fileEdit + paraMultiSelect, paraSelect, baseSelect, ProjGroupMember, cooperativeUnits, budgetEdit, projectSubEdit, managementRuleEdit, fileEdit }, props: { value: { @@ -695,8 +705,12 @@ export default { mobile: '', // 邮箱 email: '', - // 成员 + // 合作单位 cooperativeUnits: [], + // 项目课题设置 + projectSubList: [], + // 单位科研项目及资金管理制度表 + managementRuleList: [], // 成员 members: [], // 投资总额 @@ -834,6 +848,10 @@ export default { } }, loadList () { + if (!!!this.formData.managementRuleList || this.formData.managementRuleList.length == 0) + this.formData.managementRuleList = [{ ...ManagementRule }] + if (!!!this.formData.projectSubList || this.formData.projectSubList.length == 0) + this.formData.projectSubList = [{ ...ProjectSub }] if (!!!this.formData.cooperativeUnits || this.formData.cooperativeUnits.length == 0) this.formData.cooperativeUnits = [{ ...Cooperative }] if (!!!this.formData.members || this.formData.members.length == 0) diff --git a/src/views/report/project/components/projectSubEdit.vue b/src/views/report/project/components/projectSubEdit.vue new file mode 100644 index 0000000..7e6e9f2 --- /dev/null +++ b/src/views/report/project/components/projectSubEdit.vue @@ -0,0 +1,191 @@ +<template> + <div> + <a-row> + <a-col :span="24"> + <div class="tb-title"> + <span>项目课颖设置</span> + </div> + </a-col> + </a-row> + <a-row type="flex" class="item_inner"> + <a-col :span="2" class="bg-gray"> + <div class="special-middle"> + <div class="required">课题名称</div> + </div> + </a-col> + <a-col :span="2" class="bg-gray"> + <div class="special-middle"> + <div class="required">课题承担单位</div> + </div> + </a-col> + <a-col :span="2" class="bg-gray"> + <div class="special-middle"> + <div class="required">所在地</div> + </div> + </a-col> + <a-col :span="2" class="bg-gray"> + <div class="special-middle"> + <div class="required">课颖负责人</div> + </div> + </a-col> + <a-col :span="2" class="bg-gray"> + <div class="special-middle"> + <div class="required">课题预算总经费</div> + </div> + </a-col> + <a-col :span="2" class="bg-gray"> + <div class="special-middle"> + <div class="required">其中:省科技经费</div> + </div> + </a-col> + <a-col :span="2" class="bg-gray"> + <div class="special-middle"> + <div>自筹经费</div> + </div> + </a-col> + <a-col :span="2" class="bg-gray"> + <div class="special-middle"> + <div>合作单位</div> + </div> + </a-col> + <a-col :span="6" class="bg-gray"> + <div class="special-middle"> + <div>附件</div> + </div> + </a-col> + <a-col :span="2" class="bg-gray"> + <div class="special-middle"> + <div>操作</div> + </div> + </a-col> + </a-row> + <a-row v-for="(item, index) in projectSubList" :key="'projectSubList'+index" type="flex" class="item_inner"> + <a-col :span="2"> + <a-form-model-item :prop="'projectSubList.' + index + '.projName'" :rules="{ required: true, message: '*', trigger: 'blur',}"> + <a-input v-model="item.projName" :maxLength="100" placeholder="课题名称" style="width:85%" /> + </a-form-model-item> + </a-col> + <a-col :span="2"> + <a-form-model-item :prop="'projectSubList.' + index + '.undertakingUnit'" :rules="{ required: true, message: '*', trigger: 'blur',}"> + <a-input v-model="item.undertakingUnit" :maxLength="100" placeholder="课题承担单位" style="width:85%" /> + </a-form-model-item> + </a-col> + <a-col :span="2"> + <a-form-model-item :prop="'projectSubList.' + index + '.address'" :rules="{ required: true, message: '*', trigger: 'blur',}"> + <a-input v-model="item.address" :maxLength="100" placeholder="所在地" style="width:85%" /> + </a-form-model-item> + </a-col> + <a-col :span="2"> + <a-form-model-item :prop="'projectSubList.' + index + '.director'" :rules="{ required: true, message: '*', trigger: 'blur',}"> + <a-input v-model="item.director" :maxLength="50" placeholder="课颖负责人" style="width:85%" /> + </a-form-model-item> + </a-col> + <a-col :span="2"> + <a-form-model-item :prop="'projectSubList.' + index + '.totalBudget'" :rules="{ required: true, message: '*', trigger: 'blur',}"> + <a-input-number v-model="item.totalBudget" placeholder="课题预算总经费" :min="0" :step="0.01" style="width:85%" /> + </a-form-model-item> + </a-col> + <a-col :span="2"> + <a-form-model-item :prop="'projectSubList.' + index + '.govBudget'" :rules="{ required: true, message: '*', trigger: 'blur',}"> + <a-input-number v-model="item.govBudget" placeholder="其中:省科技经费" :min="0" :step="0.01" style="width:85%" /> + </a-form-model-item> + </a-col> + <a-col :span="2"> + <a-form-model-item :prop="'projectSubList.' + index + '.selfBudget'" :rules="{ required: true, message: '*', trigger: 'blur',}"> + <a-input-number v-model="item.selfBudget" placeholder="自筹经费" :min="0" :step="0.01" style="width:85%" /> + </a-form-model-item> + </a-col> + <a-col :span="2"> + <a-form-model-item :prop="'projectSubList.' + index + '.cooperativeUnits'" :rules="{ required: true, message: '*', trigger: 'blur',}"> + <a-input v-model="item.cooperativeUnits" :maxLength="100" placeholder="合作单位" style="width:85%" /> + </a-form-model-item> + </a-col> + <a-col :span="6"> + <div class="special-middle"> + <file-load :file.sync="projectSubList[index]" :index="index" :name="'projectSubList'" /> + </div> + </a-col> + <a-col :span="2"> + <div class="special-middle"> + <a-popconfirm title="确定要删除吗?" ok-text="确定" cancel-text="取消" @confirm="deleteListItem(item,1)"> + <a-button type="link" size="small">删除</a-button> + </a-popconfirm> + </div> + </a-col> + </a-row> + <a-row type="flex"> + <a-col :span="24" style="text-align: center"> + <div class="special-middle"> + <a-button type="dashed" style="width: 20%" @click="addListItem(1)"> + <a-icon type="plus" /> 添加 <span style="color:red;margin-left:10px"></span> + </a-button> + </div> + </a-col> + </a-row> + </div> +</template> + +<script> +const ProjectSub = { projName: null, undertakingUnit: null, address: null, director: null, totalBudget: null, govBudget: null, selfBudget: null, cooperativeUnits: null, fileId: null, downloadId: null, fileName: null, downloadUrl: null } + +import { isEmptyParams } from "@/views/utils/common" +import fileLoad from '@/views/components/common/fileLoad' + + +export default { + name: "projectSubEdit", + components: { + fileLoad + }, + props: { + projectSubList: { + type: Array, + default: () => { + return [{ ...ProjectSub }] + } + }, + }, + data () { + return { + + }; + }, + created () { + + }, + computed: { + + }, + methods: { + + }, +}; +</script> +<style scoped lang="less"> +.file-description { + display: block; + width: 100%; + line-height: 22px; + padding: 3px 3px 3px 3px; + color: red; + white-space: normal; + word-wrap: break-word; + // text-indent: 1em; +} +.inner_from { + .ant-row-flex:last-child .ant-col { + border-bottom: 0; + } + .ant-row-flex .ant-col:first-child { + border-left: 0; + } + .ant-row-flex { + border-right: 0; + } +} +.special-middle { + .font_s { + margin: 0 6px; + } +} +</style> -- 2.18.0