| | |
| | | |
| | | } |
| | | |
| | | ::v-deep .el-table__expanded-cell { |
| | | padding: 0; |
| | | } |
| | | |
| | | ::v-deep .el-table .el-table__expand-icon { |
| | | display: none; |
| | | } |
| | | |
| | | .pagination { |
| | | display: flex; |
| | | justify-content: flex-end; |
| | |
| | | </div> |
| | | </template> |
| | | <template v-if="$slots.table"> |
| | | <Table :data="tableData" :total="total" :height="height" :queryForm="queryForm" @currentChange="handleCurrentChange" |
| | | @sizeChange="handleSizeChange"> |
| | | <Table :data="tableData" :total="total" :height="height" :queryForm="queryForm" |
| | | @currentChange="handleCurrentChange" @sizeChange="handleSizeChange"> |
| | | <slot name="table"></slot> |
| | | </Table> |
| | | </template> |
| | | <template v-if="$slots.tableCustom"> |
| | | <slot name="tableCustom"></slot> |
| | | </template> |
| | | </div> |
| | | </div> |
| | | </template> |
| | |
| | | component: () => import("../views/deliveryAssessment/projectTeamIntegral/detail.vue"), |
| | | }, |
| | | { |
| | | // 超级管理员 |
| | | path: "taskList", |
| | | meta: { |
| | | title: "课题列表", |
| | |
| | | component: () => import("../views/deliveryAssessment/taskList"), |
| | | }, |
| | | { |
| | | // 工艺工程师 审批人 实验员 超级管理员 |
| | | path: "restsTask", |
| | | meta: { |
| | | title: "实验员其他任务", |
| | |
| | | component: () => import("../views/deliveryAssessment/restsTask"), |
| | | }, |
| | | { |
| | | // 超级管理员 工艺工程师 |
| | | path: "clinicalTrial", |
| | | meta: { |
| | | title: "临床试验积分列表", |
| | |
| | | component: () => import("../views/deliveryAssessment/clinicalTrial"), |
| | | }, |
| | | { |
| | | // 化验师 审批人 |
| | | path: "testingAndEvaluation", |
| | | meta: { |
| | | title: "检测项评定列表", |
| | | }, |
| | | component: () => import("../views/deliveryAssessment/testingAndEvaluation"), |
| | | }, |
| | | { |
| | | // 化验师 实验员 |
| | | path: "experimentResults", |
| | | meta: { |
| | | title: "实验结果评定", |
| | | }, |
| | | component: () => import("../views/deliveryAssessment/experimentResults"), |
| | | }, |
| | | { |
| | | // 化验师 工艺工程师 审批人 |
| | | path: "assayTaskList", |
| | | meta: { |
| | | title: "课题评定列表", |
| | | }, |
| | | component: () => import("../views/deliveryAssessment/assayTaskList"), |
| | | }, |
| | | { |
| | | // 工艺工程师 |
| | | path: "processEngineerEvaluate", |
| | | meta: { |
| | | title: "工艺工程师工作评定详情", |
| | | }, |
| | | component: () => import("../views/deliveryAssessment/processEngineerEvaluate"), |
| | | }, |
| | | { |
| | | // 工艺工程师 |
| | | path: "testerWorkerEvaluate", |
| | | meta: { |
| | | title: "实验员工作评定", |
| | | }, |
| | | component: () => import("../views/deliveryAssessment/testerWorkerEvaluate"), |
| | | }, |
| | | { |
| | | // 工艺工程师 |
| | | path: "addTesterWorkerEvaluate", |
| | | name: 'AddTesterWorkerEvaluate', |
| | | meta: { |
| | | title: "新增实验员工作评定", |
| | | hide: true, |
| | | keepAlive: true, |
| | | }, |
| | | component: () => import("../views/deliveryAssessment/testerWorkerEvaluate/add"), |
| | | }, |
| | | ] |
| | | } |
| | | ]; |
New file |
| | |
| | | <template> |
| | | <el-dialog :visible.sync="dialogVisible" title="课题评定详情" width="70%" @close="handleClose"> |
| | | <el-form :model="form" inline label-position="top" :rules="rules" ref="formRef"> |
| | | <el-row :gutter="20"> |
| | | <el-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12"> |
| | | <el-form-item label="报告编号" prop="reportNo" required> |
| | | <el-input v-model="form.reportNo" disabled placeholder="自动生成" /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12"> |
| | | <el-form-item label="报告名称" prop="reportName"> |
| | | <el-input v-model="form.reportName" placeholder="请输入" /> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | </el-form> |
| | | <div class="content-box"> |
| | | <el-row :gutter="16"> |
| | | <el-col style="margin-top: 5px;" :xs="24" :sm="24" :md="24" :lg="24" :xl="24"> |
| | | <Table :total="0" :height="null" :data="criteriaList" show-summary :summary-method="getSummaries" |
| | | :span-method="arraySpanMethod"> |
| | | <el-table-column type="index" label="序号" width="80" /> |
| | | <el-table-column prop="criteria" label="规程型课题评定标准" /> |
| | | <el-table-column prop="fullScore" label="满分值" width="100" /> |
| | | <el-table-column label="评定分值" prop="score" width="200"> |
| | | <template #default="{ row }"> |
| | | <el-input-number v-model="row.score" :min="0" :max="row.fullScore" :step="1" /> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column prop="rule" label="创新型课题报告评分规则"> |
| | | <template> |
| | | <div> |
| | | <div>1、规程型课题评定总分的满分为5分。</div> |
| | | <div>2、某分项工作完成,但出现以下三种错误中的1种,则减1分:</div> |
| | | <div>①有缺项、漏项;</div> |
| | | <div>②或不完整清晰;</div> |
| | | <div>③或工作效率人为拖延。</div> |
| | | <div>3、不能完成某分项的全部工作,或课题不涉及该分项内容,则该分项评0分。</div> |
| | | </div> |
| | | </template> |
| | | </el-table-column> |
| | | </Table> |
| | | </el-col> |
| | | </el-row> |
| | | </div> |
| | | <div class="assessed"> |
| | | <div>评定时间:2025-2-20 11:08:00</div> |
| | | <div>评定人:张三</div> |
| | | </div> |
| | | </el-dialog> |
| | | </template> |
| | | |
| | | <script> |
| | | export default { |
| | | name: 'AssessmentDialog', |
| | | props: { |
| | | modelValue: { |
| | | type: Boolean, |
| | | default: false |
| | | }, |
| | | reportData: { |
| | | type: Object, |
| | | default: () => { } |
| | | } |
| | | }, |
| | | data() { |
| | | return { |
| | | dialogVisible: false, |
| | | form: { |
| | | reportNo: '', |
| | | reportName: '', |
| | | }, |
| | | rules: { |
| | | reportName: [ |
| | | { required: true, message: '请输入报告名称', trigger: 'blur' } |
| | | ], |
| | | }, |
| | | criteriaList: [ |
| | | { |
| | | criteria: '文献资料调查:全面性,系统性 编辑逻辑清晰,表达规范', |
| | | fullScore: 1, |
| | | score: 0, |
| | | }, |
| | | { |
| | | criteria: '专业/技术路线与方法:合理性、可行性;实验设计科学、能实现研究目标,方法先进、完整、可靠;', |
| | | fullScore: 2, |
| | | score: 0, |
| | | }, |
| | | { |
| | | criteria: '课题报告完成度高,预期研究结果果是否具有技术价值和应用价值。风险识别:识别了潜在的技术风险、市场风险和管理风险。', |
| | | fullScore: 3, |
| | | score: 0, |
| | | }, |
| | | ] |
| | | } |
| | | }, |
| | | watch: { |
| | | modelValue: { |
| | | handler(val) { |
| | | this.dialogVisible = val; |
| | | }, |
| | | immediate: true |
| | | }, |
| | | reportData: { |
| | | handler(val) { |
| | | if (val) { |
| | | this.form.reportNo = val.reportNo || ''; |
| | | this.form.reportName = val.reportName || ''; |
| | | } |
| | | }, |
| | | immediate: true |
| | | } |
| | | }, |
| | | methods: { |
| | | handleClose() { |
| | | this.$emit('update:modelValue', false); |
| | | }, |
| | | async handleSubmit() { |
| | | try { |
| | | await this.$refs.formRef.validate(); |
| | | const totalScore = this.criteriaList.reduce((sum, item) => sum + (item.score || 0), 0); |
| | | const assessmentData = { |
| | | ...this.form, |
| | | totalScore, |
| | | criteriaScores: this.criteriaList.map(item => ({ |
| | | criteria: item.criteria, |
| | | score: item.score || 0 |
| | | })) |
| | | }; |
| | | this.$emit('submit', assessmentData); |
| | | this.handleClose(); |
| | | } catch (error) { |
| | | // 表单验证失败 |
| | | } |
| | | }, |
| | | getSummaries(param) { |
| | | const { columns, data } = param; |
| | | const sums = []; |
| | | columns.forEach((column, index) => { |
| | | if (index === 0) { |
| | | sums[index] = '合计'; |
| | | return; |
| | | } |
| | | const values = data.map(item => Number(item[column.property])); |
| | | if (!values.every(value => isNaN(value))) { |
| | | sums[index] = values.reduce((prev, curr) => { |
| | | const value = Number(curr); |
| | | if (!isNaN(value)) { |
| | | return prev + curr; |
| | | } else { |
| | | return prev; |
| | | } |
| | | }, 0); |
| | | sums[index] += ' 分'; |
| | | } else { |
| | | sums[index] = ''; |
| | | } |
| | | }); |
| | | return sums; |
| | | }, |
| | | arraySpanMethod({ row, column, rowIndex, columnIndex }) { |
| | | if (columnIndex === 4 && rowIndex == 0) { |
| | | return { |
| | | rowspan: 6, |
| | | colspan: 1 |
| | | } |
| | | } else if (rowIndex !== 0 && columnIndex === 4) { |
| | | return [0, 0] |
| | | } |
| | | } |
| | | } |
| | | } |
| | | </script> |
| | | |
| | | <style lang="less" scoped> |
| | | .content-box { |
| | | |
| | | &-left { |
| | | margin-top: 5px; |
| | | display: flex; |
| | | flex-direction: column; |
| | | border: 1px solid #EBEEF5; |
| | | border-radius: 8px 8px 0px 0px; |
| | | font-size: 12px; |
| | | |
| | | &-th { |
| | | line-height: 40px; |
| | | background: #FAFAFA !important; |
| | | color: #909399; |
| | | padding: 0 10px; |
| | | font-weight: bold; |
| | | } |
| | | |
| | | &-body { |
| | | padding: 0 10px; |
| | | line-height: 23px; |
| | | } |
| | | } |
| | | } |
| | | |
| | | .assessed { |
| | | display: flex; |
| | | flex-wrap: wrap; |
| | | align-items: center; |
| | | gap: 25px; |
| | | margin-top: 20px; |
| | | } |
| | | </style> |
New file |
| | |
| | | <template> |
| | | <el-dialog :visible.sync="dialogVisible" title="课题评定详情" width="70%" @close="handleClose"> |
| | | <el-form :model="form" inline label-position="top" :rules="rules" ref="formRef"> |
| | | <el-row :gutter="20"> |
| | | <el-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12"> |
| | | <el-form-item label="报告编号" prop="reportNo" required> |
| | | <el-input v-model="form.reportNo" disabled placeholder="自动生成" /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12"> |
| | | <el-form-item label="报告名称" prop="reportName"> |
| | | <el-input v-model="form.reportName" placeholder="请输入" /> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | </el-form> |
| | | <div class="content-box"> |
| | | <el-row :gutter="16"> |
| | | <el-col style="margin-top: 5px;" :xs="24" :sm="24" :md="24" :lg="24" :xl="24"> |
| | | <Table :total="0" :height="null" :data="criteriaList" show-summary :summary-method="getSummaries" |
| | | :span-method="arraySpanMethod"> |
| | | <el-table-column type="index" label="序号" width="80" /> |
| | | <el-table-column prop="criteria" label="创新型课题标准" /> |
| | | <el-table-column prop="fullScore" label="满分值" width="100" /> |
| | | <el-table-column label="评定分值" prop="score" width="200"> |
| | | <template #default="{ row }"> |
| | | <el-input-number v-model="row.score" :min="0" :max="row.fullScore" :step="1" /> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column prop="rule" label="创新型课题报告评分规则"> |
| | | <template> |
| | | <div> |
| | | <div>1、各分项评满分,应满足以下四项要求:</div> |
| | | <div>①分项内容:清晰、系统、完整,结构逻辑清晰,无缺项;</div> |
| | | <div>②团队工作运行顺畅、计划时间高效。</div> |
| | | <div>③工作结果完成度高。</div> |
| | | <div>④课题文档报告完成度高。</div> |
| | | <div>2、某分项工作完成,但出现以下三种错误中的1种,则减1分:</div> |
| | | <div>①有缺项、漏项;</div> |
| | | <div>②或不完整清晰;</div> |
| | | <div>③或工作效率人为拖延。</div> |
| | | <div>3、某分项工作基本完成,但出现三种错误中的2-3种,则减2分:</div> |
| | | <div> ①有缺项、漏项;</div> |
| | | <div>②或不完整清晰;</div> |
| | | <div>③或工作效率人为拖延。</div> |
| | | <div>4、不能完成某分项的全部工作,或课题不涉及该分项内容,则该分项评0分。</div> |
| | | </div> |
| | | </template> |
| | | </el-table-column> |
| | | </Table> |
| | | </el-col> |
| | | </el-row> |
| | | </div> |
| | | <div class="assessed"> |
| | | <div>评定时间:2025-2-20 11:08:00</div> |
| | | <div>评定人:张三</div> |
| | | </div> |
| | | </el-dialog> |
| | | </template> |
| | | |
| | | <script> |
| | | export default { |
| | | name: 'CraftDialog', |
| | | props: { |
| | | modelValue: { |
| | | type: Boolean, |
| | | default: false |
| | | }, |
| | | reportData: { |
| | | type: Object, |
| | | default: () => { } |
| | | } |
| | | }, |
| | | data() { |
| | | return { |
| | | dialogVisible: false, |
| | | form: { |
| | | reportNo: '', |
| | | reportName: '', |
| | | }, |
| | | rules: { |
| | | reportName: [ |
| | | { required: true, message: '请输入报告名称', trigger: 'blur' } |
| | | ], |
| | | }, |
| | | criteriaList: [ |
| | | { |
| | | criteria: '课题名称依准确性、报告内容完整性:研究目标是否完整、是否研究工作内容合理性、是否围绕目标展开开、是否具有逻辑性和条理性', |
| | | fullScore: 3, |
| | | score: 0, |
| | | }, |
| | | { |
| | | criteria: '文献资料调查:全面性、系统性编辑逻辑顺畅,表达规范', |
| | | fullScore: 2, |
| | | score: 0, |
| | | }, |
| | | { |
| | | criteria: '专业/技术路线与方法:合理性、可行性;实验设计科学、能完成研究目标、方法完整、完整、可靠;', |
| | | fullScore: 3, |
| | | score: 0, |
| | | }, |
| | | { |
| | | criteria: '实验验证工作可行性强,团队工作调度支持实验设备、材料等条件的准备良好,时间计划合理,能效按时完成', |
| | | fullScore: 2, |
| | | score: 0, |
| | | }, |
| | | { |
| | | criteria: '实验设计合理性:①对照设置,重复次数,样本量足够。②变量控制:自变量控制,因变量测量,干扰因素分析识别;确保结果的准确性③验证结果解释分析:符合科学原理、逻辑严密、不存在漏洞。具有实际应用价值,解决了实际问题或实现了研究目的。', |
| | | fullScore: 3, |
| | | score: 0, |
| | | }, |
| | | { |
| | | criteria: '课题报告完成度高,预期研究结果果是否具有技术价值和应用价值。风险识别:识别了潜在的技术风险、市场风险和管理风险。', |
| | | fullScore: 2, |
| | | score: 0, |
| | | } |
| | | ] |
| | | } |
| | | }, |
| | | watch: { |
| | | modelValue: { |
| | | handler(val) { |
| | | this.dialogVisible = val; |
| | | }, |
| | | immediate: true |
| | | }, |
| | | reportData: { |
| | | handler(val) { |
| | | if (val) { |
| | | this.form.reportNo = val.reportNo || ''; |
| | | this.form.reportName = val.reportName || ''; |
| | | } |
| | | }, |
| | | immediate: true |
| | | } |
| | | }, |
| | | methods: { |
| | | handleClose() { |
| | | this.$emit('update:modelValue', false); |
| | | }, |
| | | async handleSubmit() { |
| | | try { |
| | | await this.$refs.formRef.validate(); |
| | | const totalScore = this.criteriaList.reduce((sum, item) => sum + (item.score || 0), 0); |
| | | const assessmentData = { |
| | | ...this.form, |
| | | totalScore, |
| | | criteriaScores: this.criteriaList.map(item => ({ |
| | | criteria: item.criteria, |
| | | score: item.score || 0 |
| | | })) |
| | | }; |
| | | this.$emit('submit', assessmentData); |
| | | this.handleClose(); |
| | | } catch (error) { |
| | | // 表单验证失败 |
| | | } |
| | | }, |
| | | getSummaries(param) { |
| | | const { columns, data } = param; |
| | | const sums = []; |
| | | columns.forEach((column, index) => { |
| | | if (index === 0) { |
| | | sums[index] = '合计'; |
| | | return; |
| | | } |
| | | const values = data.map(item => Number(item[column.property])); |
| | | if (!values.every(value => isNaN(value))) { |
| | | sums[index] = values.reduce((prev, curr) => { |
| | | const value = Number(curr); |
| | | if (!isNaN(value)) { |
| | | return prev + curr; |
| | | } else { |
| | | return prev; |
| | | } |
| | | }, 0); |
| | | sums[index] += ' 分'; |
| | | } else { |
| | | sums[index] = ''; |
| | | } |
| | | }); |
| | | return sums; |
| | | }, |
| | | arraySpanMethod({ row, column, rowIndex, columnIndex }) { |
| | | if (columnIndex === 4 && rowIndex == 0) { |
| | | return { |
| | | rowspan: 6, |
| | | colspan: 1 |
| | | } |
| | | } else if (rowIndex !== 0 && columnIndex === 4) { |
| | | return [0, 0] |
| | | } |
| | | } |
| | | } |
| | | } |
| | | </script> |
| | | |
| | | <style lang="less" scoped> |
| | | .content-box { |
| | | |
| | | &-left { |
| | | margin-top: 5px; |
| | | display: flex; |
| | | flex-direction: column; |
| | | border: 1px solid #EBEEF5; |
| | | border-radius: 8px 8px 0px 0px; |
| | | font-size: 12px; |
| | | |
| | | &-th { |
| | | line-height: 40px; |
| | | background: #FAFAFA !important; |
| | | color: #909399; |
| | | padding: 0 10px; |
| | | font-weight: bold; |
| | | } |
| | | |
| | | &-body { |
| | | padding: 0 10px; |
| | | line-height: 23px; |
| | | } |
| | | } |
| | | } |
| | | |
| | | .assessed { |
| | | display: flex; |
| | | flex-wrap: wrap; |
| | | align-items: center; |
| | | gap: 25px; |
| | | margin-top: 20px; |
| | | } |
| | | </style> |
New file |
| | |
| | | <template> |
| | | <div class="list"> |
| | | <TableCustom :queryForm="queryForm" :tableData="tableData" :total="total" @currentChange="handleCurrentChange" |
| | | @sizeChange="handleSizeChange"> |
| | | <template #search> |
| | | <el-form :model="form" label-width="140px" inline> |
| | | <el-form-item label="项目组名称:"> |
| | | <el-input v-model="form.name" placeholder="请输入" /> |
| | | </el-form-item> |
| | | <el-form-item label="课题类型:"> |
| | | <el-input v-model="form.name" placeholder="请输入" /> |
| | | </el-form-item> |
| | | <el-form-item label="课题名称:"> |
| | | <el-input v-model="form.name" placeholder="请输入" /> |
| | | </el-form-item> |
| | | <el-form-item label="提交人:"> |
| | | <el-input v-model="form.name" placeholder="请输入" /> |
| | | </el-form-item> |
| | | <el-form-item label="状态:"> |
| | | <el-select v-model="form.name" placeholder="请选择" /> |
| | | </el-form-item> |
| | | <el-form-item class="search-btn-box"> |
| | | <el-button>重置</el-button> |
| | | <el-button type="primary">查询</el-button> |
| | | </el-form-item> |
| | | </el-form> |
| | | </template> |
| | | <template #setting> |
| | | <div class="top-box-integral"> |
| | | <div style="background-color:rgba(232, 250, 246, 1)" v-for="item in 3" :key="item" |
| | | class="top-box-integral-card"> |
| | | <div class="top-box-integral-card-title">{{ ['课题合计数量', '待评定', '已评定'][item - 1] }}</div> |
| | | <div style="color:rgba(4, 156, 154, 1)" class="top-box-integral-card-num">99.9</div> |
| | | </div> |
| | | </div> |
| | | </template> |
| | | <template #table> |
| | | <el-table-column prop="name" label="所属项目组" /> |
| | | <el-table-column prop="age" label="课题类型" /> |
| | | <el-table-column prop="age" label="报告编号" /> |
| | | <el-table-column prop="age" label="报告名称" /> |
| | | <el-table-column prop="age" label="提交人" /> |
| | | <el-table-column prop="age" label="评定结果" /> |
| | | <el-table-column prop="age" label="累积分值" /> |
| | | <el-table-column prop="age" label="评定时间" /> |
| | | <el-table-column prop="age" label="状态"> |
| | | <template #default="{ row }"> |
| | | <el-tag v-if="row.status == 1" type="info" color="#fff">已评定</el-tag> |
| | | <el-tag v-else type="success">待评定</el-tag> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column prop="age" label="操作"> |
| | | <template #default="{ row }"> |
| | | <el-button type="text">详情</el-button> |
| | | </template> |
| | | </el-table-column> |
| | | </template> |
| | | </TableCustom> |
| | | |
| | | <!-- 化验师 审批人 --> |
| | | <AssessmentDialog :modelValue="assessmentVisible" :reportData="currentReport" /> |
| | | |
| | | <!-- 工艺工程师 --> |
| | | <CraftDialog :modelValue="craftVisible" :reportData="currentReport" /> |
| | | </div> |
| | | </template> |
| | | |
| | | <script> |
| | | import AssessmentDialog from './components/AssessmentDialog.vue' |
| | | import CraftDialog from './components/CraftDialog.vue' |
| | | |
| | | export default { |
| | | name: 'AssayTaskList', |
| | | components: { |
| | | AssessmentDialog, |
| | | CraftDialog |
| | | }, |
| | | data() { |
| | | return { |
| | | form: { |
| | | }, |
| | | tableData: [], |
| | | queryForm: { |
| | | pageSize: 10, |
| | | pageNum: 1 |
| | | }, |
| | | total: 0, |
| | | assessmentVisible: false, |
| | | currentReport: {}, |
| | | craftVisible: false, |
| | | } |
| | | }, |
| | | methods: { |
| | | handleCurrentChange(page) { |
| | | this.queryForm.pageNum = page |
| | | this.getList() |
| | | }, |
| | | handleSizeChange(size) { |
| | | this.queryForm.pageSize = size |
| | | this.getList() |
| | | }, |
| | | getList() { |
| | | |
| | | }, |
| | | handleDetail(row) { |
| | | // 处理详情 |
| | | }, |
| | | handleAssessment(row) { |
| | | this.currentReport = row; |
| | | this.assessmentVisible = true; |
| | | }, |
| | | handleAssessmentSubmit(data) { |
| | | console.log('评定提交数据:', data); |
| | | // 处理评定提交 |
| | | } |
| | | } |
| | | } |
| | | </script> |
| | | |
| | | <style scoped lang="less"> |
| | | .list { |
| | | height: 100%; |
| | | } |
| | | |
| | | .top-box-integral { |
| | | display: flex; |
| | | justify-content: space-between; |
| | | flex-wrap: wrap; |
| | | gap: 28px; |
| | | |
| | | &-card { |
| | | flex: 1; |
| | | background: #E8FAF6; |
| | | box-shadow: 0px 10px 10px 0px rgba(0, 0, 0, 0.06); |
| | | border-radius: 10px; |
| | | padding: 21px 20px; |
| | | |
| | | &-title { |
| | | font-family: 'SourceHanSansCN-Medium'; |
| | | font-size: 14px; |
| | | color: rgba(0, 0, 0, 0.8); |
| | | } |
| | | |
| | | &-num { |
| | | font-family: 'SF Compact Display Black'; |
| | | text-align: center; |
| | | font-weight: 900; |
| | | font-size: 50px; |
| | | color: #049C9A; |
| | | line-height: 60px; |
| | | } |
| | | } |
| | | } |
| | | </style> |
| | |
| | | <template> |
| | | <el-dialog :visible.sync="dialogVisible" title="化验师工作评定" width="79.17%" @close="handleClose"> |
| | | <EvaluateTable ref="evaluateTable" /> |
| | | <div class="assessed"> |
| | | <div>评定时间:2025-2-20 11:08:00</div> |
| | | <div>评定人:张三</div> |
| | | </div> |
| | | </el-dialog> |
| | | </template> |
| | | |
| | |
| | | } |
| | | </script> |
| | | |
| | | <style lang="less" scoped></style> |
| | | <style lang="less" scoped> |
| | | .assessed { |
| | | display: flex; |
| | | flex-wrap: wrap; |
| | | align-items: center; |
| | | gap: 25px; |
| | | margin-top: 20px; |
| | | } |
| | | </style> |
| | |
| | | pageNum: 1 |
| | | }, |
| | | total: 0, |
| | | assessmentVisible: true, |
| | | assessmentVisible: false, |
| | | currentReport: {} |
| | | } |
| | | }, |
New file |
| | |
| | | <template> |
| | | <div class="list"> |
| | | <TableCustom :queryForm="queryForm" :tableData="tableData" :total="total" @currentChange="handleCurrentChange" |
| | | @sizeChange="handleSizeChange"> |
| | | <template #search> |
| | | <el-form :model="form" label-width="140px" inline> |
| | | <el-form-item label="所属项目课题方案:"> |
| | | <el-input v-model="form.name" placeholder="请输入" /> |
| | | </el-form-item> |
| | | <el-form-item label="实验编号:"> |
| | | <el-input v-model="form.name" placeholder="请输入" /> |
| | | </el-form-item> |
| | | <el-form-item label="创建日期:"> |
| | | <el-input v-model="form.name" placeholder="请输入" /> |
| | | </el-form-item> |
| | | <el-form-item label="状态:"> |
| | | <el-select v-model="form.name" placeholder="请选择" /> |
| | | </el-form-item> |
| | | <el-form-item class="search-btn-box"> |
| | | <el-button>重置</el-button> |
| | | <el-button type="primary">查询</el-button> |
| | | </el-form-item> |
| | | </el-form> |
| | | </template> |
| | | <template #setting> |
| | | <div class="table-title"> |
| | | 实验结果汇报列表 |
| | | </div> |
| | | </template> |
| | | <template #table> |
| | | <el-table-column prop="name" label="所属项目课题方案" /> |
| | | <el-table-column prop="age" label="实验编号" /> |
| | | <el-table-column prop="age" label="工艺工程师" /> |
| | | <el-table-column prop="age" label="化验师" /> |
| | | <el-table-column prop="age" label="实验员" /> |
| | | <el-table-column prop="age" label="创建日期" /> |
| | | <el-table-column prop="age" label="状态"> |
| | | <template #default="{ row }"> |
| | | <el-tag v-if="row.status == 1" type="info" color="#fff">已评定</el-tag> |
| | | <el-tag v-else type="success">待评定</el-tag> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column prop="age" label="操作"> |
| | | <template #default="{ row }"> |
| | | <el-button type="text" @click="assessmentVisible = true">详情</el-button> |
| | | </template> |
| | | </el-table-column> |
| | | </template> |
| | | </TableCustom> |
| | | </div> |
| | | </template> |
| | | |
| | | <script> |
| | | |
| | | export default { |
| | | name: 'ProcessEngineerEvaluate', |
| | | data() { |
| | | return { |
| | | form: { |
| | | }, |
| | | tableData: [], |
| | | queryForm: { |
| | | pageSize: 10, |
| | | pageNum: 1 |
| | | }, |
| | | total: 0, |
| | | } |
| | | }, |
| | | methods: { |
| | | handleCurrentChange(page) { |
| | | this.queryForm.pageNum = page |
| | | this.getList() |
| | | }, |
| | | handleSizeChange(size) { |
| | | this.queryForm.pageSize = size |
| | | this.getList() |
| | | }, |
| | | getList() { |
| | | |
| | | }, |
| | | handleDetail(row) { |
| | | // 处理详情 |
| | | }, |
| | | } |
| | | } |
| | | </script> |
| | | |
| | | <style scoped lang="less"> |
| | | .list { |
| | | height: 100%; |
| | | } |
| | | |
| | | .top-box-integral { |
| | | display: flex; |
| | | justify-content: space-between; |
| | | flex-wrap: wrap; |
| | | gap: 28px; |
| | | |
| | | &-card { |
| | | flex: 1; |
| | | background: #E8FAF6; |
| | | box-shadow: 0px 10px 10px 0px rgba(0, 0, 0, 0.06); |
| | | border-radius: 10px; |
| | | padding: 21px 20px; |
| | | |
| | | &-title { |
| | | font-family: 'SourceHanSansCN-Medium'; |
| | | font-size: 14px; |
| | | color: rgba(0, 0, 0, 0.8); |
| | | } |
| | | |
| | | &-num { |
| | | font-family: 'SF Compact Display Black'; |
| | | text-align: center; |
| | | font-weight: 900; |
| | | font-size: 50px; |
| | | color: #049C9A; |
| | | line-height: 60px; |
| | | } |
| | | } |
| | | } |
| | | |
| | | .tip-warring { |
| | | margin-top: 20px; |
| | | color: rgba(255, 73, 85, 1); |
| | | } |
| | | |
| | | .table-title { |
| | | width: 220px; |
| | | height: 50px; |
| | | background: #FFFFFF; |
| | | border-radius: 8px 8px 0px 0px; |
| | | border: 1px solid #049C9A; |
| | | display: flex; |
| | | align-items: center; |
| | | justify-content: center; |
| | | font-family: SourceHanSansCN, SourceHanSansCN; |
| | | font-weight: bold; |
| | | font-size: 18px; |
| | | color: #049C9A; |
| | | line-height: 27px; |
| | | } |
| | | |
| | | .expand-box { |
| | | padding: 20px; |
| | | background: linear-gradient(180deg, #049C9A 0%, #0ACBCA 100%); |
| | | border-radius: 20px; |
| | | |
| | | &-title { |
| | | font-weight: 500; |
| | | font-size: 16px; |
| | | color: #FFFFFF; |
| | | line-height: 24px; |
| | | margin-bottom: 20px; |
| | | } |
| | | } |
| | | </style> |
| | |
| | | </el-form-item> |
| | | </el-form> |
| | | </template> |
| | | <!-- 工艺工程师 --> |
| | | <template #setting> |
| | | <el-button @click="assessmentVisible = true, currentReport = {}" class="el-icon-plus" type="primary"> |
| | | 新增其他任务</el-button> |
| | | </template> |
| | | <template #table> |
| | | <el-table-column prop="name" label="所属项目组" /> |
| | | <el-table-column prop="age" label="任务内容" /> |
| | |
| | | <template> |
| | | <el-dialog :visible.sync="dialogVisible" title="课题评定" width="70%" @close="handleClose"> |
| | | <el-dialog :visible.sync="dialogVisible" title="课题评定详情" width="70%" @close="handleClose"> |
| | | <el-form :model="form" inline label-position="top" :rules="rules" ref="formRef"> |
| | | <el-row :gutter="20"> |
| | | <el-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12"> |
| | |
| | | <el-col :xs="24" :sm="24" :md="4" :lg="4" :xl="4"> |
| | | <div class="content-box-left"> |
| | | <div class="content-box-left-th">设立课题规则</div> |
| | | <div class="content-box-left-body" :style="{ height: `calc(${$baseTableHeight()}px - 40px)`}"> |
| | | <div class="content-box-left-body" :style="{ height: `calc(${$baseTableHeight()}px - 40px)` }"> |
| | | 1、根据可研报告、产品构思设计的工艺研究路线,一条工艺路线设立一个课题。如果一个课题中有多个化合物需要开发研究,则每个化合物作为一个分题;分题归集到该课题中,最终形成课题报告。不同课题报告中的分题不能重复使用。 |
| | | 2、在可行研究阶段,工艺开发升级,重新规划工艺研究路线,则以新规划的工艺路线方案来设定课题</div> |
| | | </div> |
| | | </el-col> |
| | | <el-col style="margin-top: 5px;" :xs="24" :sm="24" :md="20" :lg="20" :xl="20"> |
| | | <Table :total="0" :data="criteriaList" show-summary :summary-method="getSummaries" |
| | | <Table :total="0" :height="null" :data="criteriaList" show-summary :summary-method="getSummaries" |
| | | :span-method="arraySpanMethod"> |
| | | <el-table-column type="index" label="序号" width="80" /> |
| | | <el-table-column prop="criteria" label="创新型课题标准" /> |
| | | <el-table-column prop="fullScore" label="满分值" width="100" /> |
| | | <el-table-column label="评定分值" prop="score" width="200"> |
| | | <template #default="{ row }"> |
| | | <el-input-number v-model="row.score" :min="0" :max="row.fullScore" :precision="1" |
| | | :step="1" /> |
| | | <el-input-number v-model="row.score" :min="0" :max="row.fullScore" :step="1" /> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column prop="rule" label="创新型课题报告评分规则"> |
| | |
| | | <el-table-column prop="age" label="评定时间" /> |
| | | <el-table-column prop="age" label="状态"> |
| | | <template #default="{ row }"> |
| | | <el-tag v-if="row.status == 1" type="success">已评定</el-tag> |
| | | <el-tag v-else type="danger">待评定</el-tag> |
| | | <el-tag v-if="row.status == 1" type="info" color="#fff">已评定</el-tag> |
| | | <el-tag v-else type="success">待评定</el-tag> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column prop="age" label="操作"> |
New file |
| | |
| | | <template> |
| | | <Card> |
| | | <template> |
| | | <div class="header-title" style="margin-bottom: 18px;"> |
| | | <div class="header-title-left"> |
| | | <img src="@/assets/public/headercard.png" /> |
| | | <div>所属实验调度</div> |
| | | </div> |
| | | <el-button class="el-icon-plus" type="primary" @click="showScheduling = true"> 选择实验调度</el-button> |
| | | </div> |
| | | <Table :tableData="tableData" :total="total" :height="null"> |
| | | <template> |
| | | <el-table-column prop="planCode" label="所属项目课题方案"></el-table-column> |
| | | <el-table-column prop="planName" label="实验编号"></el-table-column> |
| | | <el-table-column prop="planName" label="实验名称"></el-table-column> |
| | | <el-table-column prop="stage" label=" 通知时间"></el-table-column> |
| | | <el-table-column prop="stage" label=" 实验开始时间"></el-table-column> |
| | | <el-table-column prop="stage" label=" 实验结束时间"></el-table-column> |
| | | <el-table-column prop="stage" label=" 参加人员"></el-table-column> |
| | | <el-table-column prop="creator" label="状态"></el-table-column> |
| | | </template> |
| | | </Table> |
| | | <div class="header-title" style="margin-top: 60px;"> |
| | | <div class="header-title-left"> |
| | | <img src="@/assets/public/headercard.png" /> |
| | | <div>被评定实验员</div> |
| | | </div> |
| | | <el-button class="el-icon-plus" type="primary" @click="addMember"> 选择实验员</el-button> |
| | | </div> |
| | | <div class="member-list"> |
| | | <div class="member-list-card"> |
| | | <div class="member-item"> |
| | | <div class="member-title">实验员</div> |
| | | <div class="member-name-box-2"> |
| | | <div v-for="i in [1, 2, 3, 4, 5, 6, 7, 8]" :key="i" class="member-name">张三</div> |
| | | </div> |
| | | <div class="member-edit" @click="addMember">修改</div> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | <div class="header-title" style="margin-bottom: 18px;margin-top: 60px;"> |
| | | <div class="header-title-left"> |
| | | <img src="@/assets/public/headercard.png" /> |
| | | <div>工作标准评定</div> |
| | | </div> |
| | | </div> |
| | | <EvaluateTable :type="2" /> |
| | | <div class="add-project-footer"> |
| | | <el-button type="primary">保存</el-button> |
| | | <el-button>存草稿</el-button> |
| | | </div> |
| | | </template> |
| | | <SelectMember ref="selectMember" /> |
| | | <ExperimentalScheduling :show="showScheduling" /> |
| | | </Card> |
| | | </template> |
| | | |
| | | <script> |
| | | import ExperimentalScheduling from "@/views/dataManagement/confirmation-sheet/components/experimental-scheduling"; |
| | | export default { |
| | | name: 'AddTesterWorkerEvaluate', |
| | | components: { |
| | | ExperimentalScheduling, |
| | | }, |
| | | data() { |
| | | return { |
| | | showScheduling: false, |
| | | } |
| | | }, |
| | | methods: { |
| | | submitForm() { |
| | | }, |
| | | addMember() { |
| | | this.$refs.selectMember.open() |
| | | }, |
| | | } |
| | | } |
| | | </script> |
| | | |
| | | <style scoped lang="less"> |
| | | .el-form--inline .el-form-item { |
| | | margin-right: 83px; |
| | | } |
| | | |
| | | .header-title { |
| | | display: flex; |
| | | align-items: center; |
| | | flex-wrap: wrap; |
| | | gap: 13px; |
| | | |
| | | .header-title-left { |
| | | display: flex; |
| | | align-items: center; |
| | | gap: 13px; |
| | | |
| | | img { |
| | | width: 12px; |
| | | height: 19px; |
| | | } |
| | | |
| | | div { |
| | | flex-shrink: 0; |
| | | font-weight: bold; |
| | | font-size: 18px; |
| | | color: #222222; |
| | | line-height: 27px; |
| | | font-family: 'Source Han Sans CN Bold Bold'; |
| | | |
| | | &:before { |
| | | content: '*'; |
| | | color: #F56C6C; |
| | | margin-right: 4px; |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | .member-list { |
| | | margin-top: 18px; |
| | | display: flex; |
| | | flex-wrap: wrap; |
| | | gap: 28px; |
| | | |
| | | .member-list-card { |
| | | position: relative; |
| | | width: 340px; |
| | | height: 400px; |
| | | border-radius: 8px; |
| | | border: 1px solid #DCDFE6; |
| | | background: linear-gradient(to bottom, rgba(255, 77, 79, 0.20) 0%, rgba(255, 242, 194, 0) 70%); |
| | | |
| | | .member-item { |
| | | height: 100%; |
| | | display: flex; |
| | | flex-direction: column; |
| | | |
| | | .member-title { |
| | | margin-top: 20px; |
| | | width: 100%; |
| | | font-family: 'Source Han Sans CN Bold Bold'; |
| | | font-weight: bold; |
| | | font-size: 16px; |
| | | color: rgba(0, 0, 0, 0.8); |
| | | line-height: 16px; |
| | | text-align: center; |
| | | } |
| | | |
| | | .member-name-box-2 { |
| | | padding: 0 20px; |
| | | padding-top: 40px; |
| | | display: grid; |
| | | grid-template-columns: repeat(4, 1fr); |
| | | align-items: flex-start; |
| | | flex-wrap: wrap; |
| | | gap: 20px; |
| | | justify-content: center; |
| | | } |
| | | |
| | | .member-name { |
| | | width: 60px; |
| | | height: 60px; |
| | | background: #7D8B79; |
| | | border-radius: 50%; |
| | | text-align: center; |
| | | line-height: 60px; |
| | | font-weight: 500; |
| | | font-size: 16px; |
| | | color: #FFFFFF; |
| | | } |
| | | |
| | | .member-edit { |
| | | cursor: pointer; |
| | | position: absolute; |
| | | bottom: 10px; |
| | | left: 50%; |
| | | transform: translateX(-50%); |
| | | font-weight: 400; |
| | | font-size: 12px; |
| | | color: #FF4D4F; |
| | | line-height: 22px; |
| | | width: 40px; |
| | | background: #FFF1F0; |
| | | border-radius: 4px; |
| | | border: 1px solid #FFCCC7; |
| | | text-align: center; |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | .add-project-footer { |
| | | display: flex; |
| | | gap: 20px; |
| | | margin-top: 43px; |
| | | |
| | | button { |
| | | width: 220px; |
| | | } |
| | | } |
| | | </style> |
New file |
| | |
| | | <template> |
| | | <div class="list"> |
| | | <TableCustom :queryForm="queryForm" :tableData="tableData" :total="total" @currentChange="handleCurrentChange" |
| | | @sizeChange="handleSizeChange"> |
| | | <template #search> |
| | | <el-form :model="form" label-width="140px" inline> |
| | | <el-form-item label="所属项目课题方案:"> |
| | | <el-input v-model="form.name" placeholder="请输入" /> |
| | | </el-form-item> |
| | | <el-form-item label="实验编号:"> |
| | | <el-input v-model="form.name" placeholder="请输入" /> |
| | | </el-form-item> |
| | | <el-form-item label="实验名称:"> |
| | | <el-input v-model="form.name" placeholder="请输入" /> |
| | | </el-form-item> |
| | | <el-form-item label="评定时间:"> |
| | | <el-date-picker v-model="value1" type="daterange" range-separator="至" start-placeholder="开始日期" |
| | | end-placeholder="结束日期"> |
| | | </el-date-picker> |
| | | </el-form-item> |
| | | <el-form-item class="search-btn-box"> |
| | | <el-button>重置</el-button> |
| | | <el-button type="primary">查询</el-button> |
| | | </el-form-item> |
| | | </el-form> |
| | | </template> |
| | | <template #setting> |
| | | <div class="tableTitle"> |
| | | <div class="flex a-center"> |
| | | <div class="title" :class="{ active: currentType === 'list' }" |
| | | @click="handleTypeChange('list')"> |
| | | 实验员工作评定列表</div> |
| | | <div class="drafts" :class="{ active: currentType === 'draft' }" |
| | | @click="handleTypeChange('draft')">草稿箱</div> |
| | | </div> |
| | | <el-button @click="handleAdd" class="el-icon-plus" type="primary"> |
| | | 新增实验员工作评定</el-button> |
| | | </div> |
| | | </template> |
| | | <template #table> |
| | | <el-table-column prop="name" label="所属项目组" /> |
| | | <el-table-column prop="age" label="检测项名称" /> |
| | | <el-table-column prop="age" label="检测项编号" /> |
| | | <el-table-column prop="age" label="备注" /> |
| | | <el-table-column prop="age" label="创建人" /> |
| | | <el-table-column prop="age" label="创建时间" /> |
| | | <el-table-column prop="age" label="状态"> |
| | | <template #default="{ row }"> |
| | | <el-tag v-if="row.status == 1" type="info" color="#fff">已评定</el-tag> |
| | | <el-tag v-else type="success">待评定</el-tag> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column prop="age" label="操作"> |
| | | <template #default="{ row }"> |
| | | <el-button type="text" @click="assessmentVisible = true">详情</el-button> |
| | | </template> |
| | | </el-table-column> |
| | | </template> |
| | | </TableCustom> |
| | | </div> |
| | | </template> |
| | | |
| | | <script> |
| | | |
| | | export default { |
| | | name: 'TesterWorkerEvaluate', |
| | | data() { |
| | | return { |
| | | currentType: 'list', // 当前显示类型:list-列表,draft-草稿箱 |
| | | form: { |
| | | }, |
| | | tableData: [], |
| | | queryForm: { |
| | | pageSize: 10, |
| | | pageNum: 1 |
| | | }, |
| | | total: 0, |
| | | } |
| | | }, |
| | | methods: { |
| | | handleAdd() { |
| | | this.$router.push({ |
| | | path: '/deliveryAssessment/addTesterWorkerEvaluate' |
| | | }) |
| | | }, |
| | | handleCurrentChange(page) { |
| | | this.queryForm.pageNum = page |
| | | this.getList() |
| | | }, |
| | | handleSizeChange(size) { |
| | | this.queryForm.pageSize = size |
| | | this.getList() |
| | | }, |
| | | getList() { |
| | | |
| | | }, |
| | | handleTypeChange(type) { |
| | | this.currentType = type; |
| | | this.getList(); |
| | | }, |
| | | } |
| | | } |
| | | </script> |
| | | |
| | | <style scoped lang="less"> |
| | | .list { |
| | | height: 100%; |
| | | } |
| | | |
| | | .top-box-integral { |
| | | display: flex; |
| | | justify-content: space-between; |
| | | flex-wrap: wrap; |
| | | gap: 28px; |
| | | |
| | | &-card { |
| | | flex: 1; |
| | | background: #E8FAF6; |
| | | box-shadow: 0px 10px 10px 0px rgba(0, 0, 0, 0.06); |
| | | border-radius: 10px; |
| | | padding: 21px 20px; |
| | | |
| | | &-title { |
| | | font-family: 'SourceHanSansCN-Medium'; |
| | | font-size: 14px; |
| | | color: rgba(0, 0, 0, 0.8); |
| | | } |
| | | |
| | | &-num { |
| | | font-family: 'SF Compact Display Black'; |
| | | text-align: center; |
| | | font-weight: 900; |
| | | font-size: 50px; |
| | | color: #049C9A; |
| | | line-height: 60px; |
| | | } |
| | | } |
| | | } |
| | | |
| | | .tip-warring { |
| | | margin-top: 20px; |
| | | color: rgba(255, 73, 85, 1); |
| | | } |
| | | |
| | | .table-title { |
| | | width: 220px; |
| | | height: 50px; |
| | | background: #FFFFFF; |
| | | border-radius: 8px 8px 0px 0px; |
| | | border: 1px solid #049C9A; |
| | | display: flex; |
| | | align-items: center; |
| | | justify-content: center; |
| | | font-family: SourceHanSansCN, SourceHanSansCN; |
| | | font-weight: bold; |
| | | font-size: 18px; |
| | | color: #049C9A; |
| | | line-height: 27px; |
| | | } |
| | | |
| | | .expand-box { |
| | | padding: 20px; |
| | | background: linear-gradient(180deg, #049C9A 0%, #0ACBCA 100%); |
| | | border-radius: 20px; |
| | | |
| | | &-title { |
| | | font-weight: 500; |
| | | font-size: 16px; |
| | | color: #FFFFFF; |
| | | line-height: 24px; |
| | | margin-bottom: 20px; |
| | | } |
| | | } |
| | | |
| | | .flex { |
| | | display: flex; |
| | | align-items: center; |
| | | } |
| | | |
| | | .tableTitle { |
| | | display: flex; |
| | | padding-bottom: 20px; |
| | | justify-content: space-between; |
| | | align-items: center; |
| | | |
| | | .title { |
| | | background: #fafafc; |
| | | border-radius: 8px 8px 0px 0px; |
| | | border: 1px solid #dcdfe6; |
| | | padding: 16px 29px; |
| | | font-weight: bold; |
| | | font-size: 18px; |
| | | color: #606266; |
| | | width: unset; |
| | | cursor: pointer; |
| | | } |
| | | |
| | | .drafts { |
| | | padding: 16px 65px; |
| | | background: #fafafc; |
| | | border-radius: 8px 8px 0px 0px; |
| | | border: 1px solid #dcdfe6; |
| | | font-weight: 400; |
| | | font-size: 18px; |
| | | color: #606266; |
| | | margin-left: 16px; |
| | | cursor: pointer; |
| | | } |
| | | |
| | | .active { |
| | | color: #049c9a; |
| | | background: #ffffff; |
| | | border-radius: 8px 8px 0px 0px; |
| | | border: 1px solid #049c9a; |
| | | } |
| | | } |
| | | </style> |
New file |
| | |
| | | <template> |
| | | <el-dialog :visible.sync="dialogVisible" title="检测项评定详情" width="70%" @close="handleClose"> |
| | | <el-form :model="form" inline label-position="top" :rules="rules" ref="formRef"> |
| | | <el-row :gutter="20"> |
| | | <el-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12"> |
| | | <el-form-item label="检测项编号" prop="reportNo" required> |
| | | <el-input v-model="form.reportNo" disabled placeholder="自动生成" /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12"> |
| | | <el-form-item label="检测项名称" prop="reportName"> |
| | | <el-input v-model="form.reportName" placeholder="请输入" /> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | </el-form> |
| | | <div class="content-box"> |
| | | <el-row :gutter="16"> |
| | | <el-col style="margin-top: 5px;" :xs="24" :sm="24" :md="24" :lg="24" :xl="24"> |
| | | <Table :total="0" :height="null" :data="criteriaList" show-summary :summary-method="getSummaries" |
| | | :span-method="arraySpanMethod"> |
| | | <el-table-column type="index" label="序号" width="80" /> |
| | | <el-table-column prop="criteria" label="规程型课题评定标准" /> |
| | | <el-table-column prop="fullScore" label="满分值" width="100" /> |
| | | <el-table-column label="评定分值" prop="score" width="200"> |
| | | <template #default="{ row }"> |
| | | <el-input-number v-model="row.score" :min="0" :max="row.fullScore" :step="1" /> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column prop="rule" label="创新型课题报告评分规则"> |
| | | <template> |
| | | <div> |
| | | <div>1、规程型课题评定总分的满分为5分。</div> |
| | | <div>2、某分项工作完成,但出现以下三种错误中的1种,则减1分:</div> |
| | | <div>①有缺项、漏项;</div> |
| | | <div>②或不完整清晰;</div> |
| | | <div>③或工作效率人为拖延。</div> |
| | | <div>3、不能完成某分项的全部工作,或课题不涉及该分项内容,则该分项评0分。</div> |
| | | </div> |
| | | </template> |
| | | </el-table-column> |
| | | </Table> |
| | | </el-col> |
| | | </el-row> |
| | | </div> |
| | | <div class="assessed"> |
| | | <div>评定时间:2025-2-20 11:08:00</div> |
| | | <div>评定人:张三</div> |
| | | </div> |
| | | </el-dialog> |
| | | </template> |
| | | |
| | | <script> |
| | | export default { |
| | | name: 'AssessmentDialog', |
| | | props: { |
| | | modelValue: { |
| | | type: Boolean, |
| | | default: false |
| | | }, |
| | | reportData: { |
| | | type: Object, |
| | | default: () => { } |
| | | } |
| | | }, |
| | | data() { |
| | | return { |
| | | dialogVisible: false, |
| | | form: { |
| | | reportNo: '', |
| | | reportName: '', |
| | | }, |
| | | rules: { |
| | | reportName: [ |
| | | { required: true, message: '请输入报告名称', trigger: 'blur' } |
| | | ], |
| | | }, |
| | | criteriaList: [ |
| | | { |
| | | criteria: '文献资料调查:全面性,系统性 编辑逻辑清晰,表达规范', |
| | | fullScore: 1, |
| | | score: 0, |
| | | }, |
| | | { |
| | | criteria: '专业/技术路线与方法:合理性、可行性;实验设计科学、能实现研究目标,方法先进、完整、可靠;', |
| | | fullScore: 2, |
| | | score: 0, |
| | | }, |
| | | { |
| | | criteria: '课题报告完成度高,预期研究结果果是否具有技术价值和应用价值。风险识别:识别了潜在的技术风险、市场风险和管理风险。', |
| | | fullScore: 3, |
| | | score: 0, |
| | | }, |
| | | ] |
| | | } |
| | | }, |
| | | watch: { |
| | | modelValue: { |
| | | handler(val) { |
| | | this.dialogVisible = val; |
| | | }, |
| | | immediate: true |
| | | }, |
| | | reportData: { |
| | | handler(val) { |
| | | if (val) { |
| | | this.form.reportNo = val.reportNo || ''; |
| | | this.form.reportName = val.reportName || ''; |
| | | } |
| | | }, |
| | | immediate: true |
| | | } |
| | | }, |
| | | methods: { |
| | | handleClose() { |
| | | this.$emit('update:modelValue', false); |
| | | }, |
| | | async handleSubmit() { |
| | | try { |
| | | await this.$refs.formRef.validate(); |
| | | const totalScore = this.criteriaList.reduce((sum, item) => sum + (item.score || 0), 0); |
| | | const assessmentData = { |
| | | ...this.form, |
| | | totalScore, |
| | | criteriaScores: this.criteriaList.map(item => ({ |
| | | criteria: item.criteria, |
| | | score: item.score || 0 |
| | | })) |
| | | }; |
| | | this.$emit('submit', assessmentData); |
| | | this.handleClose(); |
| | | } catch (error) { |
| | | // 表单验证失败 |
| | | } |
| | | }, |
| | | getSummaries(param) { |
| | | const { columns, data } = param; |
| | | const sums = []; |
| | | columns.forEach((column, index) => { |
| | | if (index === 0) { |
| | | sums[index] = '合计'; |
| | | return; |
| | | } |
| | | const values = data.map(item => Number(item[column.property])); |
| | | if (!values.every(value => isNaN(value))) { |
| | | sums[index] = values.reduce((prev, curr) => { |
| | | const value = Number(curr); |
| | | if (!isNaN(value)) { |
| | | return prev + curr; |
| | | } else { |
| | | return prev; |
| | | } |
| | | }, 0); |
| | | sums[index] += ' 分'; |
| | | } else { |
| | | sums[index] = ''; |
| | | } |
| | | }); |
| | | return sums; |
| | | }, |
| | | arraySpanMethod({ row, column, rowIndex, columnIndex }) { |
| | | if (columnIndex === 4 && rowIndex == 0) { |
| | | return { |
| | | rowspan: 6, |
| | | colspan: 1 |
| | | } |
| | | } else if (rowIndex !== 0 && columnIndex === 4) { |
| | | return [0, 0] |
| | | } |
| | | } |
| | | } |
| | | } |
| | | </script> |
| | | |
| | | <style lang="less" scoped> |
| | | .content-box { |
| | | |
| | | &-left { |
| | | margin-top: 5px; |
| | | display: flex; |
| | | flex-direction: column; |
| | | border: 1px solid #EBEEF5; |
| | | border-radius: 8px 8px 0px 0px; |
| | | font-size: 12px; |
| | | |
| | | &-th { |
| | | line-height: 40px; |
| | | background: #FAFAFA !important; |
| | | color: #909399; |
| | | padding: 0 10px; |
| | | font-weight: bold; |
| | | } |
| | | |
| | | &-body { |
| | | padding: 0 10px; |
| | | line-height: 23px; |
| | | } |
| | | } |
| | | } |
| | | |
| | | .assessed { |
| | | display: flex; |
| | | flex-wrap: wrap; |
| | | align-items: center; |
| | | gap: 25px; |
| | | margin-top: 20px; |
| | | } |
| | | </style> |
New file |
| | |
| | | <template> |
| | | <div class="list"> |
| | | <TableCustom :queryForm="queryForm" :tableData="tableData" :total="total" @currentChange="handleCurrentChange" |
| | | @sizeChange="handleSizeChange"> |
| | | <template #search> |
| | | <el-form :model="form" label-width="140px" inline> |
| | | <el-form-item label="所属项目组:"> |
| | | <el-input v-model="form.name" placeholder="请输入" /> |
| | | </el-form-item> |
| | | <el-form-item label="检测项名称:"> |
| | | <el-input v-model="form.name" placeholder="请输入" /> |
| | | </el-form-item> |
| | | <el-form-item label="检测项编号:"> |
| | | <el-input v-model="form.name" placeholder="请输入" /> |
| | | </el-form-item> |
| | | <el-form-item label="状态:"> |
| | | <el-select v-model="form.name" placeholder="请选择" /> |
| | | </el-form-item> |
| | | <el-form-item class="search-btn-box"> |
| | | <el-button>重置</el-button> |
| | | <el-button type="primary">查询</el-button> |
| | | </el-form-item> |
| | | </el-form> |
| | | </template> |
| | | <template #setting> |
| | | <div class="table-title"> |
| | | 项目检查项、检验包 |
| | | </div> |
| | | </template> |
| | | <template #tableCustom> |
| | | <Table :data="tableData" :total="0" @row-click="handleRowClick" row-key="id" |
| | | :expand-row-keys="expandRowKeys"> |
| | | <el-table-column type="expand" width="1"> |
| | | <template #default="{ row }"> |
| | | <div class="expand-box"> |
| | | <div class="expand-box-title">报告列表</div> |
| | | <Table :total="0" :height="null"> |
| | | <el-table-column prop="name" label="报告内容" /> |
| | | <el-table-column prop="name" label="制订人" /> |
| | | <el-table-column prop="name" label="制订日期" /> |
| | | <el-table-column prop="name" label="检测项编号" /> |
| | | <el-table-column prop="name" label="审批人" /> |
| | | <el-table-column prop="name" label="审批时间" /> |
| | | <el-table-column prop="age" label="状态"> |
| | | <template #default="{ row }"> |
| | | <el-tag v-if="row.status == 1" type="info" color="#fff">已通过</el-tag> |
| | | <el-tag v-else type="success">未通过</el-tag> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column prop="age" label="操作"> |
| | | <template #default="{ row }"> |
| | | <el-button type="text">详情</el-button> |
| | | </template> |
| | | </el-table-column> |
| | | </Table> |
| | | </div> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column prop="name" label="所属项目组" /> |
| | | <el-table-column prop="age" label="检测项名称" /> |
| | | <el-table-column prop="age" label="检测项编号" /> |
| | | <el-table-column prop="age" label="备注" /> |
| | | <el-table-column prop="age" label="创建人" /> |
| | | <el-table-column prop="age" label="创建时间" /> |
| | | <el-table-column prop="age" label="状态"> |
| | | <template #default="{ row }"> |
| | | <el-tag v-if="row.status == 1" type="info" color="#fff">已评定</el-tag> |
| | | <el-tag v-else type="success">待评定</el-tag> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column prop="age" label="操作"> |
| | | <template #default="{ row }"> |
| | | <el-button type="text" @click="assessmentVisible = true">详情</el-button> |
| | | </template> |
| | | </el-table-column> |
| | | </Table> |
| | | </template> |
| | | </TableCustom> |
| | | |
| | | <AssessmentDialog :modelValue="assessmentVisible" :reportData="currentReport" |
| | | @submit="handleAssessmentSubmit" /> |
| | | </div> |
| | | </template> |
| | | |
| | | <script> |
| | | import AssessmentDialog from './components/AssessmentDialog.vue' |
| | | |
| | | export default { |
| | | name: 'TestingAndEvaluation', |
| | | components: { |
| | | AssessmentDialog |
| | | }, |
| | | data() { |
| | | return { |
| | | form: { |
| | | }, |
| | | tableData: [{ id: 1 }, { id: 2 }], |
| | | queryForm: { |
| | | pageSize: 10, |
| | | pageNum: 1 |
| | | }, |
| | | total: 0, |
| | | assessmentVisible: false, |
| | | currentReport: {}, |
| | | expandRowKeys: [] |
| | | } |
| | | }, |
| | | methods: { |
| | | handleRowClick(row, column, event) { |
| | | if (column.label === '操作') return |
| | | if (this.expandRowKeys.includes(row.id)) { |
| | | this.expandRowKeys = this.expandRowKeys.filter(key => key !== row.id); |
| | | } else { |
| | | this.expandRowKeys.push(row.id); |
| | | } |
| | | }, |
| | | handleCurrentChange(page) { |
| | | this.queryForm.pageNum = page |
| | | this.getList() |
| | | }, |
| | | handleSizeChange(size) { |
| | | this.queryForm.pageSize = size |
| | | this.getList() |
| | | }, |
| | | getList() { |
| | | |
| | | }, |
| | | handleDetail(row) { |
| | | // 处理详情 |
| | | }, |
| | | handleAssessment(row) { |
| | | this.currentReport = row; |
| | | this.assessmentVisible = true; |
| | | }, |
| | | handleAssessmentSubmit(data) { |
| | | console.log('评定提交数据:', data); |
| | | // 处理评定提交 |
| | | } |
| | | } |
| | | } |
| | | </script> |
| | | |
| | | <style scoped lang="less"> |
| | | .list { |
| | | height: 100%; |
| | | } |
| | | |
| | | .top-box-integral { |
| | | display: flex; |
| | | justify-content: space-between; |
| | | flex-wrap: wrap; |
| | | gap: 28px; |
| | | |
| | | &-card { |
| | | flex: 1; |
| | | background: #E8FAF6; |
| | | box-shadow: 0px 10px 10px 0px rgba(0, 0, 0, 0.06); |
| | | border-radius: 10px; |
| | | padding: 21px 20px; |
| | | |
| | | &-title { |
| | | font-family: 'SourceHanSansCN-Medium'; |
| | | font-size: 14px; |
| | | color: rgba(0, 0, 0, 0.8); |
| | | } |
| | | |
| | | &-num { |
| | | font-family: 'SF Compact Display Black'; |
| | | text-align: center; |
| | | font-weight: 900; |
| | | font-size: 50px; |
| | | color: #049C9A; |
| | | line-height: 60px; |
| | | } |
| | | } |
| | | } |
| | | |
| | | .tip-warring { |
| | | margin-top: 20px; |
| | | color: rgba(255, 73, 85, 1); |
| | | } |
| | | |
| | | .table-title { |
| | | width: 220px; |
| | | height: 50px; |
| | | background: #FFFFFF; |
| | | border-radius: 8px 8px 0px 0px; |
| | | border: 1px solid #049C9A; |
| | | display: flex; |
| | | align-items: center; |
| | | justify-content: center; |
| | | font-family: SourceHanSansCN, SourceHanSansCN; |
| | | font-weight: bold; |
| | | font-size: 18px; |
| | | color: #049C9A; |
| | | line-height: 27px; |
| | | } |
| | | |
| | | .expand-box { |
| | | padding: 20px; |
| | | background: linear-gradient(180deg, #049C9A 0%, #0ACBCA 100%); |
| | | border-radius: 20px; |
| | | |
| | | &-title { |
| | | font-weight: 500; |
| | | font-size: 16px; |
| | | color: #FFFFFF; |
| | | line-height: 24px; |
| | | margin-bottom: 20px; |
| | | } |
| | | } |
| | | </style> |