| | |
| | | "version": "0.1.0", |
| | | "private": true, |
| | | "scripts": { |
| | | "serve:dev": "cross-env VUE_APP_ENV=development vue-cli-service serve --port 8090", |
| | | "serve:dev": "cross-env VUE_APP_ENV=development vue-cli-service serve --port 11223", |
| | | "serve:prod": "cross-env VUE_APP_ENV=production vue-cli-service serve", |
| | | "build:dev": "cross-env VUE_APP_ENV=development vue-cli-service build", |
| | | "build:prod": "cross-env VUE_APP_ENV=production vue-cli-service build", |
| | |
| | | class="upload-demo" |
| | | :action="uploadUrl" |
| | | :headers="uploadHeaders" |
| | | :file-list="imageList" |
| | | :file-list="imageListMap[header.name] || []" |
| | | :auto-upload="true" |
| | | list-type="picture-card" |
| | | :beforeUpload="beforeImageUpload" |
| | | :on-change="handleImageChange" |
| | | :on-remove="handleImageRemove" |
| | | :on-success="handleImageSuccess" |
| | | :before-upload="beforeImageUpload" |
| | | :on-change="(file, fileList) => handleImageChange(file, fileList, header.name)" |
| | | :on-remove="(file, fileList) => handleImageRemove(file, fileList, header.name)" |
| | | :on-success="(res, file, fileList) => handleImageSuccess(res, file, fileList, header.name)" |
| | | :on-preview="handlePreview" |
| | | :disabled="!checkEditPermission(header)" |
| | | multiple |
| | | > |
| | | <div |
| | | style=" |
| | |
| | | uploadHeaders: { |
| | | Authorization: sessionStorage.getItem("token") || "", |
| | | }, |
| | | imageListMap: {}, |
| | | }; |
| | | }, |
| | | computed: { |
| | |
| | | this.headerList.forEach((header) => { |
| | | if (header.type === "user") { |
| | | formData[header.name] = []; |
| | | } else if (header.type === "image") { |
| | | formData[header.name] = []; |
| | | this.$set(this.imageListMap, header.name, []); |
| | | } else { |
| | | formData[header.name] = ""; |
| | | } |
| | |
| | | this.headerList.forEach((header) => { |
| | | if (header.type === "user") { |
| | | formData[header.name] = data[header.name] || []; |
| | | } else if (header.type === "image") { |
| | | formData[header.name] = Array.isArray(data[header.name]) ? data[header.name] : (data[header.name] ? [data[header.name]] : []); |
| | | this.$set(this.imageListMap, header.name, (formData[header.name] || []).map(url => ({ name: "image", url: getFullUrl(url), status: "success" }))); |
| | | } else { |
| | | formData[header.name] = data[header.name] || ""; |
| | | } |
| | |
| | | } |
| | | return true; |
| | | }, |
| | | handleImageChange(file, fileList) { |
| | | this.imageList = fileList; |
| | | const imageHeader = this.headerList.find((h) => h.type === "image"); |
| | | if (imageHeader) { |
| | | this.$refs.form.validateField(imageHeader.name); |
| | | } |
| | | handleImageChange(file, fileList, fieldName) { |
| | | this.$set(this.imageListMap, fieldName, fileList); |
| | | // 校验 |
| | | this.$refs.form && this.$refs.form.validateField(fieldName); |
| | | }, |
| | | handleImageSuccess(res, file, fileList) { |
| | | handleImageSuccess(res, file, fileList, fieldName) { |
| | | const url = res.msg; |
| | | file.url = getFullUrl(url); |
| | | const imageHeader = this.headerList.find((h) => h.type === "image"); |
| | | if (imageHeader) { |
| | | this.$set(this.form, imageHeader.name, url); |
| | | this.$refs.form.validateField(imageHeader.name); |
| | | if (!Array.isArray(this.form[fieldName])) { |
| | | this.$set(this.form, fieldName, []); |
| | | } |
| | | this.imageList = fileList.map((f) => { |
| | | if (f.uid === file.uid) { |
| | | return file; |
| | | } |
| | | return f; |
| | | }); |
| | | // 只保留 fileList 中的 url |
| | | this.$set(this.form, fieldName, fileList.map(f => f.url ? (f.url.startsWith('http') ? f.url : getFullUrl(f.url)) : '')); |
| | | this.$set(this.imageListMap, fieldName, fileList); |
| | | this.$refs.form && this.$refs.form.validateField(fieldName); |
| | | }, |
| | | handleImageRemove(file, fileList) { |
| | | const imageHeader = this.headerList.find((h) => h.type === "image"); |
| | | if (imageHeader) { |
| | | this.$set(this.form, imageHeader.name, ""); |
| | | } |
| | | this.imageList = fileList; |
| | | handleImageRemove(file, fileList, fieldName) { |
| | | this.$set(this.form, fieldName, fileList.map(f => f.url ? (f.url.startsWith('http') ? f.url : getFullUrl(f.url)) : '')); |
| | | this.$set(this.imageListMap, fieldName, fileList); |
| | | }, |
| | | handlePreview(file) { |
| | | this.imagePreviewUrl = file.url; |
| | |
| | | <template v-if="header.type === 'user'"> |
| | | {{ getUserDisplayText(header.name, scope.row) }} |
| | | </template> |
| | | <!-- 图片类型显示 --> |
| | | <!-- 图片类型显示,兼容数组和字符串 --> |
| | | <template v-else-if="header.type === 'image'"> |
| | | <el-image v-if="scope.row[header.name]" :preview-src-list="[getFullUrl(scope.row[header.name])]" :src="getFullUrl(scope.row[header.name])" alt="头像" |
| | | class="table-image" /> |
| | | <template v-if="Array.isArray(scope.row[header.name])"> |
| | | <el-image |
| | | v-for="(img, i) in scope.row[header.name]" |
| | | :key="i" |
| | | :src="getFullUrl(img)" |
| | | :preview-src-list="scope.row[header.name].map(getFullUrl)" |
| | | class="table-image" |
| | | /> |
| | | </template> |
| | | <template v-else> |
| | | <el-image |
| | | v-if="scope.row[header.name]" |
| | | :src="getFullUrl(scope.row[header.name])" |
| | | :preview-src-list="[getFullUrl(scope.row[header.name])]" |
| | | class="table-image" |
| | | /> |
| | | </template> |
| | | </template> |
| | | <!-- 其他类型 --> |
| | | <template v-else> |
| | |
| | | title: "样品管理", |
| | | keepAlive: true, |
| | | privilege:'sampleManage', |
| | | hide:JSON.parse(sessionStorage.getItem('userInfo'))&&JSON.parse(sessionStorage.getItem('userInfo')).roleType=='5'?true:false, |
| | | // privilege:'sampleManage_manage' |
| | | // hide:JSON.parse(sessionStorage.getItem('userInfo'))&&JSON.parse(sessionStorage.getItem('userInfo')).roleType=='5'?true:false, |
| | | privilege:'sampleManage_manage' |
| | | }, |
| | | component: () => import("../views/dataManagement/sampleManage/list.vue"), |
| | | }, |
| | |
| | | } |
| | | if (to.meta && to.meta.privilege) { |
| | | if (!flatMenus.includes(to.meta.privilege)) { |
| | | next('/403') // 无权限跳转403 |
| | | next('/login') // 无权限跳转403 |
| | | return |
| | | } |
| | | } |
| | |
| | | const apiConfig = { |
| | | // 开发环境 |
| | | development: { |
| | | baseURL: "http://192.168.110.34:8081", |
| | | imgUrl: "http://192.168.110.34:8081/open/file/upload", |
| | | showImgUrl:'http://192.168.110.34:11222/' |
| | | baseURL: "/", |
| | | imgUrl: "/open/file/upload", |
| | | showImgUrl: '/', |
| | | }, |
| | | // 生产环境 |
| | | production: { |
| | |
| | | import { encryptBySM4, decryptBySM4 } from './sm4' // 添加decryptBySM4 |
| | | |
| | | const service = axios.create({ |
| | | // baseURL: apiConfig.baseURL, |
| | | baseURL: apiConfig.baseURL, |
| | | withCredentials: false, // 当跨域请求时发送cookie |
| | | timeout: 30000, // request timeout |
| | | }) |
| | |
| | | type: 'warning', |
| | | duration: 2000 |
| | | }) |
| | | sessionStorage.clear(); |
| | | window.location.replace('/'); |
| | | // sessionStorage.clear(); |
| | | // window.location.replace('/'); |
| | | return Promise.reject(res.data.data.data) |
| | | } |
| | | Message({ |
| | |
| | | type: 'warning', |
| | | duration: 2000 |
| | | }) |
| | | sessionStorage.clear(); |
| | | window.location.replace('/'); |
| | | // sessionStorage.clear(); |
| | | // window.location.replace('/'); |
| | | return Promise.reject(res.data.data) |
| | | } |
| | | Message({ |
| | |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column prop="developPerson" label="制订人" /> |
| | | <el-table-column prop="developDate" label="制订日期" /> |
| | | <el-table-column prop="auditPersonId" label="审批人" /> |
| | | <el-table-column prop="createTime" label="制订日期" /> |
| | | <el-table-column prop="auditPersonName" label="审批人" /> |
| | | <el-table-column prop="auditTime" label="审批时间" /> |
| | | <el-table-column prop="status" label="状态"> |
| | | <template #default="{ row }"> |
| | |
| | | </div> |
| | | </div> |
| | | </div> |
| | | <div class="approval-dialog-approve" v-if="type === 'approve'"> |
| | | <div class="approval-dialog-approve" v-if="type == 'approve'"> |
| | | <el-row :span="24"> |
| | | <el-col :span="12"> |
| | | <div class="status"> |
| | |
| | | </div> |
| | | <div slot="footer" class="dialog-footer"> |
| | | <el-button @click="handleClose">取 消</el-button> |
| | | <el-button type="primary" @click="handleApprove" v-if="type === 'approve'">确认</el-button> |
| | | <el-button type="primary" @click="handleApprove" v-if="type == 'approve'">确认</el-button> |
| | | </div> |
| | | </el-dialog> |
| | | </template> |
| | |
| | | }, |
| | | computed: { |
| | | dialogTitle() { |
| | | return this.type === "approve" ? "审核项目检测项、检验包" : "项目检测项、检验包详情"; |
| | | return this.type == "approve" ? "审核项目检测项、检验包" : "项目检测项、检验包详情"; |
| | | }, |
| | | }, |
| | | watch: { |
| | |
| | | if (res.status == 2 || res.status == 3) { |
| | | processData.push({ |
| | | type: |
| | | res.status === 2 |
| | | res.status == 2 |
| | | ? "primary" |
| | | : res.status === 3 |
| | | : res.status == 3 |
| | | ? "danger" |
| | | : "warning", |
| | | mode: "list", |
| | |
| | | { |
| | | label: "审核结果:", |
| | | value: |
| | | res.status === 2 |
| | | res.status == 2 |
| | | ? "通过" |
| | | : res.status === 3 |
| | | : res.status == 3 |
| | | ? "驳回" |
| | | : "待审批", |
| | | }, |
| | |
| | | const params = { |
| | | id: this.data.id, |
| | | auditRemark: this.remark, |
| | | auditStatus: this.status === '1' ? 2 : 3 |
| | | auditStatus: this.status == '1' ? 2 : 3 |
| | | }; |
| | | detailAuditReport(params).then(res => { |
| | | if (res) { |
| | |
| | | label="实验名称" |
| | | ></el-table-column> |
| | | <el-table-column |
| | | prop="experimentDate" |
| | | prop="createTime" |
| | | label="通知时间" |
| | | ></el-table-column> |
| | | <el-table-column |
| | |
| | | <el-table-column prop="projectName" label="所属项目课题方案"></el-table-column> |
| | | <el-table-column prop="experimentCode" label="实验编号"></el-table-column> |
| | | <el-table-column prop="experimentName" label="实验名称"></el-table-column> |
| | | <el-table-column prop="experimentDate" label="通知时间"></el-table-column> |
| | | <el-table-column prop="createTime" label="通知时间"></el-table-column> |
| | | <el-table-column prop="experimentStartTime" label="实验开始时间"></el-table-column> |
| | | <el-table-column prop="experimentEndTime" label="实验结束时间"></el-table-column> |
| | | <el-table-column prop="participantsName" label="参加人员"></el-table-column> |
| | |
| | | this.$message.error("请选择实验调度"); |
| | | return false; |
| | | } |
| | | |
| | | // 校验实验日期 |
| | | if (!this.form.experimentDate) { |
| | | this.$message.error("请填写实验日期"); |
| | | return false; |
| | | } |
| | | |
| | | // 校验参与人员 |
| | | if ( |
| | | !this.selectedParticipants || |
| | |
| | | this.$message.error("请选择参与人员"); |
| | | return false; |
| | | } |
| | | |
| | | // 校验实验目的 |
| | | const purpose = this.$refs.purposeEditor.getContent(); |
| | | if (!purpose || purpose === "<p></p>" || purpose.trim() === "<p></p>") { |
| | | this.$message.error("请填写实验目的"); |
| | | return false; |
| | | } |
| | | |
| | | // 校验工艺参数及路线 |
| | | const process = this.$refs.processEditor.getContent(); |
| | | if (!process || process === "<p></p>" || process.trim() === "<p></p>") { |
| | | this.$message.error("请填写工艺参数及路线"); |
| | | return false; |
| | | } |
| | | |
| | | // 校验 DynamicComponent 里的表格 |
| | | function checkDynamicComponentTables(list, label) { |
| | | if (!Array.isArray(list)) return true; |
| | | for (const comp of list) { |
| | | if (comp.type === 'customTable') { |
| | | if (!comp.data || !Array.isArray(comp.data.headers) || comp.data.headers.length === 0) { |
| | | this.$message.error(`${label}中有表格未添加表头`); |
| | | return false; |
| | | } |
| | | if (!Array.isArray(comp.data.rows) || comp.data.rows.length === 0) { |
| | | this.$message.error(`${label}中有表格未添加数据`); |
| | | return false; |
| | | } |
| | | } |
| | | } |
| | | return true; |
| | | } |
| | | // 校验实验材料 |
| | | if (!this.form.experimentMaterial) { |
| | | this.$message.error("请添加实验材料"); |
| | | return false; |
| | | } |
| | | |
| | | if (!checkDynamicComponentTables.call(this, this.form.experimentMaterial, '实验材料')) { |
| | | return false; |
| | | } |
| | | // 校验实验设备 |
| | | if (!this.form.experimentDevice) { |
| | | this.$message.error("请添加实验设备"); |
| | | return false; |
| | | } |
| | | |
| | | if (!checkDynamicComponentTables.call(this, this.form.experimentDevice, '实验设备')) { |
| | | return false; |
| | | } |
| | | // 校验实验步骤记录 |
| | | if (!this.stepList || this.stepList.length === 0) { |
| | | this.$message.error("请添加实验操作步骤"); |
| | | return false; |
| | | } |
| | | |
| | | // 校验每个步骤是否都有内容 |
| | | const invalidStep = this.stepList.findIndex((step) => !step.content); |
| | | if (invalidStep !== -1) { |
| | | this.$message.error(`请完善第${invalidStep + 1}个步骤的内容`); |
| | | return false; |
| | | // 校验每个步骤是否都有内容及表格 |
| | | for (let i = 0; i < this.stepList.length; i++) { |
| | | const step = this.stepList[i]; |
| | | if (!step.content) { |
| | | this.$message.error(`请完善第${i + 1}个步骤的内容`); |
| | | return false; |
| | | } |
| | | if (!checkDynamicComponentTables.call(this, step.content, `第${i + 1}个步骤`)) { |
| | | return false; |
| | | } |
| | | } |
| | | |
| | | return true; |
| | | }, |
| | | handleStopExperiment() { |
| | |
| | | <el-table-column prop="reportTitle" label="报告名称" /> |
| | | <el-table-column prop="reportCode" label="报告编号" /> |
| | | <el-table-column prop="developPerson" label="制定人" /> |
| | | <el-table-column prop="developDate" label="制定日期" /> |
| | | <el-table-column prop="createTime" label="制定日期" /> |
| | | <el-table-column prop="evaluatePersonName" label="评定人" /> |
| | | <el-table-column prop="evaluateTime" label="评定时间" /> |
| | | <el-table-column prop="status" label="状态"> |
| | |
| | | if (res) { |
| | | this.evaluateInfo = { ...res }; |
| | | this.form.reportNo = res.reportCode || ""; |
| | | this.form.reportName = res.reportName || ""; |
| | | this.form.reportName = res.reportTitle || ""; |
| | | // 详情回显分数 |
| | | if (res.evaluateScore) { |
| | | if ( |
| | |
| | | </template> |
| | | |
| | | <script> |
| | | import {getDetailById} from '../service' |
| | | export default { |
| | | name: 'CraftDialog', |
| | | props: { |
| | |
| | | reportData: { |
| | | type: Object, |
| | | default: () => { } |
| | | } |
| | | },id: { |
| | | type: [String, Number], |
| | | default: "", |
| | | // required: true, |
| | | }, |
| | | }, |
| | | data() { |
| | | return { |
| | |
| | | modelValue: { |
| | | handler(val) { |
| | | this.dialogVisible = val; |
| | | if (val && this.id) { |
| | | this.fetchDetail(); |
| | | } |
| | | }, |
| | | immediate: true |
| | | }, |
| | | reportData: { |
| | | handler(val) { |
| | | if (val) { |
| | | this.form.reportNo = val.reportNo || ''; |
| | | this.form.reportName = val.reportName || ''; |
| | | } |
| | | }, |
| | | immediate: true |
| | | } |
| | | id(val) { |
| | | if (this.modelValue && val) { |
| | | this.fetchDetail(); |
| | | } |
| | | }, |
| | | }, |
| | | methods: { |
| | | async fetchDetail() { |
| | | try { |
| | | const res = await getDetailById({ id: this.id }); |
| | | if (res) { |
| | | this.evaluateInfo = { ...res }; |
| | | this.form.reportNo = res.reportCode || ""; |
| | | this.form.reportName = res.reportTitle || ""; |
| | | // 详情回显分数 |
| | | if (res.evaluateScore) { |
| | | if ( |
| | | this.type === "detail" && |
| | | typeof res.evaluateScore === "string" |
| | | ) { |
| | | const scoreArr = res.evaluateScore |
| | | .split(",") |
| | | .map((s) => Number(s)); |
| | | this.criteriaList.forEach((item, idx) => { |
| | | item.score = scoreArr[idx] || 0; |
| | | }); |
| | | } |
| | | } |
| | | } |
| | | } catch (e) { |
| | | this.$message && this.$message.error("获取详情失败"); |
| | | } |
| | | }, |
| | | handleClose() { |
| | | this.$emit('update:modelValue', false); |
| | | }, |
| | |
| | | const activeIndex = evaluateTable.activeIndex; |
| | | |
| | | const evaluateData = { |
| | | evaluateOne: this.getEvaluateValue(activeIndex[0].score), |
| | | evaluateTwo: this.getEvaluateValue(activeIndex[1].score), |
| | | evaluateThree: this.getEvaluateValue(activeIndex[2].score), |
| | | evaluateFour: this.getEvaluateValue(activeIndex[3].score), |
| | | evaluateFive: this.getEvaluateValue(activeIndex[4].score), |
| | | evaluateSix: this.getEvaluateValue(activeIndex[5].score), |
| | | evaluateOne: activeIndex[0].score ?this.getEvaluateValue(activeIndex[0].score):0, |
| | | evaluateTwo: activeIndex[1].score ?this.getEvaluateValue(activeIndex[1].score):0, |
| | | evaluateThree: activeIndex[2].score ?this.getEvaluateValue(activeIndex[2].score):0, |
| | | evaluateFour: activeIndex[3].score ?this.getEvaluateValue(activeIndex[3].score):0, |
| | | evaluateFive: activeIndex[4].score ?this.getEvaluateValue(activeIndex[4].score):0, |
| | | evaluateSix: activeIndex[5].score ?this.getEvaluateValue(activeIndex[5].score):0, |
| | | evaluateTime: moment().format("YYYY-MM-DD HH:mm:ss"), |
| | | resultEvaluateJson: JSON.stringify(activeIndex), |
| | | dispatchId: this.tableData[0]?.id, |
| | |
| | | }, |
| | | methods: { |
| | | open() { |
| | | const teamRes = getDetailByUserId(); |
| | | this.projectTeamList = [{ ...teamRes }]; |
| | | getDetailByUserId().then(res=>{ |
| | | this.projectTeamList = [{ ...res }]; |
| | | }); |
| | | |
| | | }, |
| | | async initForm() { |
| | | this.isDetail = this.type === "detail"; |
| | |
| | | <template #default="{ row }"> |
| | | <el-button type="text" @click="handleDetail(row)">详情</el-button> |
| | | <el-button |
| | | v-if="row.status === 2" |
| | | v-if="row.status === 2 && roleType!=3" |
| | | type="text" |
| | | @click="handleEvaluate(row)" |
| | | >评定</el-button |
| | |
| | | <script> |
| | | import EvaluationDialog from "./components/evaluation-dialog.vue"; |
| | | import { evaluatePageList,evaluateProcess } from './service.js'; |
| | | import moment from "moment"; |
| | | |
| | | export default { |
| | | name: "ProcessEngineerEvaluate", |
| | |
| | | pageSize: 10, |
| | | pageNum: 1, |
| | | }, |
| | | roleType:'', |
| | | total: 0, |
| | | evaluationDialogVisible: false, |
| | | currentEvaluationData: null, |
| | |
| | | }, |
| | | created() { |
| | | this.getList(); |
| | | const userInfo= JSON.parse(sessionStorage.getItem('userInfo')); |
| | | this.roleType=userInfo?.roleType; |
| | | }, |
| | | methods: { |
| | | handleCurrentChange(page) { |
| | |
| | | this.evaluationDialogVisible = val; |
| | | if (!val) this.currentEvaluationData = null; |
| | | }, |
| | | getEvaluateValue(score) { |
| | | // 2分 = 良好(1), 1分 = 正确(2), 0分 = 失误(3) |
| | | const scoreMap = { |
| | | 2: 2, // 良好 |
| | | 1: 1, // 正确 |
| | | 0: 0, // 失误 |
| | | '-3':'-3' |
| | | }; |
| | | return scoreMap[score] || 0; // 默认返回失误 |
| | | }, |
| | | // 处理评价提交 |
| | | handleEvaluationSubmit(evaluationData) { |
| | | const { activeIndex } = evaluationData; |
| | | // 将评分数据转换为后端需要的格式 |
| | | const evaluateData = { |
| | | evaluateType: 1, // 1=工艺工程师 |
| | | evaluateOne: this.getEvaluateValue(activeIndex[0].score), |
| | | evaluateTwo: this.getEvaluateValue(activeIndex[1].score), |
| | | evaluateThree: this.getEvaluateValue(activeIndex[2].score), |
| | | evaluateFour: this.getEvaluateValue(activeIndex[3].score), |
| | | evaluateFive: this.getEvaluateValue(activeIndex[4].score), |
| | | evaluateSix: this.getEvaluateValue(activeIndex[5].score), |
| | | evaluateOne:activeIndex[0].score? this.getEvaluateValue(activeIndex[0].score):0, |
| | | evaluateTwo:activeIndex[1].score? this.getEvaluateValue(activeIndex[1].score):0, |
| | | evaluateThree:activeIndex[2].score? this.getEvaluateValue(activeIndex[2].score):0, |
| | | evaluateFour:activeIndex[3].score? this.getEvaluateValue(activeIndex[3].score):0, |
| | | evaluateFive:activeIndex[4].score? this.getEvaluateValue(activeIndex[4].score):0, |
| | | evaluateSix:activeIndex[5].score? this.getEvaluateValue(activeIndex[5].score):0, |
| | | evaluateTime: moment().format('YYYY-MM-DD HH:mm:ss'), |
| | | resultEvaluateJson: JSON.stringify(activeIndex), |
| | | resultReportId: this.currentOperationRow.id, |
| | | dispatchId: this.currentOperationRow.dispatchId, |
| | | resultReportId: this.currentEvaluationData.id, |
| | | dispatchId: this.currentEvaluationData.dispatchId, |
| | | status: 1 |
| | | }; |
| | | evaluateProcess(evaluateData).then(res => { |
| | |
| | | </div> |
| | | <div v-if="item.startTime">{{item.startTime}}</div> |
| | | <div v-if="item.endTime">{{item.endTime}}</div> |
| | | <div > |
| | | <el-button type="text" v-if="roleType == 1 || roleType == 2" @click.stop='toChange(item.url)'>{{item.url? '修改':''}}</el-button> |
| | | <div v-if="roleType == 1 || roleType == 2"> |
| | | <el-button type="text" @click.stop='toChange(item.url)'>{{item.url? '修改':''}}</el-button> |
| | | </div> |
| | | </div> |
| | | </div> |
| | |
| | | <el-button |
| | | type="text" |
| | | @click="handleAssessment(row)" |
| | | v-if="row.status == 2" |
| | | v-if="row.status == 2 && roleType != 3" |
| | | >评定</el-button |
| | | > |
| | | </template> |
| | |
| | | assessmentVisible: false, |
| | | currentId: null, |
| | | dialogType: '', |
| | | roleType:'', |
| | | statistics: { |
| | | totalCount: 0, |
| | | toEvaluatedCount: 0, |
| | |
| | | mounted() { |
| | | this.getList(); |
| | | this.getStatistics(); |
| | | const userInfo=JSON.parse(sessionStorage.getItem('userInfo')); |
| | | this.roleType=userInfo?.roleType; |
| | | }, |
| | | }; |
| | | </script> |
| | |
| | | } |
| | | const activeIndex = evaluateTable.activeIndex; |
| | | const evaluateData = { |
| | | evaluateOne: this.getEvaluateValue(activeIndex[0].score), |
| | | evaluateTwo: this.getEvaluateValue(activeIndex[1].score), |
| | | evaluateThree: this.getEvaluateValue(activeIndex[2].score), |
| | | evaluateFour: this.getEvaluateValue(activeIndex[3].score), |
| | | evaluateFive: this.getEvaluateValue(activeIndex[4].score), |
| | | evaluateSix: this.getEvaluateValue(activeIndex[5].score), |
| | | evaluateOne:activeIndex[0].score? this.getEvaluateValue(activeIndex[0].score):0, |
| | | evaluateTwo: activeIndex[1].score?this.getEvaluateValue(activeIndex[1].score):0, |
| | | evaluateThree: activeIndex[2].score?this.getEvaluateValue(activeIndex[2].score):0, |
| | | evaluateFour: activeIndex[3].score?this.getEvaluateValue(activeIndex[3].score):0, |
| | | evaluateFive: activeIndex[4].score?this.getEvaluateValue(activeIndex[4].score):0, |
| | | evaluateSix: activeIndex[5].score?this.getEvaluateValue(activeIndex[5].score):0, |
| | | evaluateTime: moment().format("YYYY-MM-DD HH:mm:ss"), |
| | | resultEvaluateJson: JSON.stringify(activeIndex), |
| | | dispatchId: this.tableData[0]?.id, |
| | |
| | | |
| | | // 登录 |
| | | export const loginReq = (data) => { |
| | | return axios.post('/login', { ...data }) |
| | | return axios.post('/api/login', { ...data }) |
| | | } |
| | |
| | | <HeaderNav class="header-main" :logo="'true'" /> |
| | | </div> |
| | | |
| | | <div class="middleground" :class="{ |
| | | column: windowWidth < 1440, |
| | | mobile: windowWidth < 800, |
| | | }"> |
| | | <div |
| | | class="middleground" |
| | | :class="{ |
| | | column: windowWidth < 1440, |
| | | mobile: windowWidth < 800, |
| | | }" |
| | | > |
| | | <!-- 左侧模块区域 --> |
| | | <div class="left-modules" :class="[ |
| | | currentModuleLayout, |
| | | { |
| | | 'mobile-layout': windowWidth < 800, |
| | | }, |
| | | ]"> |
| | | <div class="module-item" v-for="(item, index) in filteredModuleList" :key="index" |
| | | @click="handleModuleClick(item)"> |
| | | <div |
| | | class="left-modules" |
| | | :class="[ |
| | | currentModuleLayout, |
| | | { |
| | | 'mobile-layout': windowWidth < 800, |
| | | }, |
| | | ]" |
| | | > |
| | | <div |
| | | class="module-item" |
| | | v-for="(item, index) in filteredModuleList" |
| | | :key="index" |
| | | @click="handleModuleClick(item)" |
| | | > |
| | | <div class="module-bg"></div> |
| | | <div class="module-content"> |
| | | <div class="icon-wrapper"> |
| | | <div class="module-icon" :style="{ backgroundImage: `url(${item.icon})` }"></div> |
| | | <div |
| | | class="module-icon" |
| | | :style="{ backgroundImage: `url(${item.icon})` }" |
| | | ></div> |
| | | </div> |
| | | <div class="module-text">{{ item.text }}</div> |
| | | </div> |
| | |
| | | <div class="title">待办事项</div> |
| | | <!-- 待办事项列表将放置在这里 --> |
| | | <div class="todo-list"> |
| | | <div class="todo-item" v-for="(item,index) in list" :key="index" @click.stop="toDetail(item)"> |
| | | <div |
| | | class="todo-item" |
| | | v-for="(item, index) in list" |
| | | :key="index" |
| | | @click.stop="toDetail(item)" |
| | | > |
| | | <div class="todo-details"> |
| | | <div class="notice-card"> |
| | | <div class="todo-icon"></div> |
| | | <div class="red-notice" v-if="item.isRead==0"></div> |
| | | <div class="red-notice" v-if="item.isRead == 0"></div> |
| | | </div> |
| | | |
| | | <span class="todo-title" :title="item.content || ''">{{item.content||''}}</span> |
| | | <span class="todo-title" :title="item.content || ''">{{ |
| | | item.content || "" |
| | | }}</span> |
| | | </div> |
| | | <div class="todo-meta"> |
| | | <div class="me"></div> |
| | | <span class="todo-submitter">提交人: {{item.commitName||''}}</span> |
| | | <span class="todo-submitter" |
| | | >提交人: {{ item.commitName || "" }}</span |
| | | > |
| | | <div class="time"></div> |
| | | <span class="todo-submitter">{{item.commitTime||''}}</span> |
| | | <span class="todo-submitter">{{ item.commitTime || "" }}</span> |
| | | </div> |
| | | </div> |
| | | </div> |
| | |
| | | </template> |
| | | <script> |
| | | import { Calendar } from "ant-design-vue"; |
| | | import { getList,read } from "./service"; |
| | | import { getList, read } from "./service"; |
| | | import HeaderNav from "../../layouts/components/HeaderNav.vue"; |
| | | import zhCN from "ant-design-vue/lib/locale-provider/zh_CN"; |
| | | // 引入 Element UI 的日历组件 |
| | |
| | | date: new Date(), |
| | | viewWidth: "", |
| | | scale: 1, |
| | | list:[], |
| | | list: [], |
| | | // 审批人 |
| | | moduleList2: [ |
| | | { |
| | |
| | | path: "/reportLibrary/feasibilityStudy", |
| | | }, |
| | | { |
| | | text: "化验师提交", |
| | | text: "化验师QA专题报告", |
| | | icon: require("../../assets/login/img7.png"), |
| | | path: "/chemistQa/projectTesting", |
| | | }, |
| | |
| | | // path: "/reportLibrary/feasibilityStudy", |
| | | // }, |
| | | { |
| | | text: "化验师提交", |
| | | text: "化验师QA专题报告", |
| | | icon: require("../../assets/login/img7.png"), |
| | | path: "/chemistQa/projectTesting", |
| | | }, |
| | |
| | | // path: "/projectList/list", |
| | | // }, |
| | | { |
| | | text: '评定模块', |
| | | icon: require('../../assets/login/img4.png'), |
| | | path: '/deliveryAssessment/projectTeamIntegral' |
| | | text: "评定模块", |
| | | icon: require("../../assets/login/img4.png"), |
| | | path: "/deliveryAssessment/projectTeamIntegral", |
| | | }, |
| | | // { |
| | | // text: "专业报告库", |
| | |
| | | // icon: require("../../assets/login/img3.png"), |
| | | // path: "/chemistQa/projectTesting", |
| | | // }, |
| | | |
| | | ], |
| | | // 超级管理员 |
| | | moduleList6: [ |
| | |
| | | created() { |
| | | // 初始化时检查窗口大小 |
| | | this.handleResize(); |
| | | getList().then(res=>{ |
| | | this.list = res |
| | | |
| | | }) |
| | | getList().then((res) => { |
| | | this.list = res; |
| | | }); |
| | | }, |
| | | mounted() { |
| | | // 监听窗口大小变化 |
| | |
| | | window.removeEventListener("resize", this.handleResize); |
| | | }, |
| | | methods: { |
| | | onPanelChange(e) { |
| | | }, |
| | | onPanelChange(e) {}, |
| | | // 添加处理窗口大小变化的方法 |
| | | handleResize() { |
| | | this.windowWidth = window.innerWidth; |
| | |
| | | }); |
| | | } |
| | | }, |
| | | toDetail(item){ |
| | | read({id:item.id}).then(res=>{ |
| | | let urlList=['/dataManagement/approvalPlan','/dataManagement/suspendExperiment','/dataManagement/testResultReport' |
| | | ,'/reportLibrary/feasibilityStudy','/deliveryAssessment/reportEvaluation','/dataManagement/confirmation-sheet', |
| | | '/dataManagement/inspectionReport','/dataManagement/scheme-management','/chemistQa/projectTesting', |
| | | '/deliveryAssessment/reportEvaluation','/dataManagement/dispatching','/dataManagement/confirmation-sheet', |
| | | '/sampleManage/manage','/dataManagement/dispatching' |
| | | ] |
| | | let url=urlList[(item.noticeType *1) -1] |
| | | toDetail(item) { |
| | | read({ id: item.id }).then((res) => { |
| | | if (item.noticeType == 4) { |
| | | if (item.content.includes("可研")) { |
| | | this.$router.push({ |
| | | path: "/reportLibrary/feasibilityStudy", |
| | | }); |
| | | } else if (item.content.includes("可行")) { |
| | | this.$router.push({ |
| | | path: "/reportLibrary/feasibilityReport", |
| | | }); |
| | | } else if (item.content.includes("工艺开发")) { |
| | | this.$router.push({ |
| | | path: "/reportLibrary/processDevelopment", |
| | | }); |
| | | } else if (item.content.includes("验证与发布")) { |
| | | this.$router.push({ |
| | | path: "/reportLibrary/verificationRelease", |
| | | }); |
| | | } else if (item.content.includes("立项报告库")) { |
| | | this.$router.push({ |
| | | path: "/reportLibrary/projectProposalLibrary", |
| | | }); |
| | | } |
| | | return; |
| | | } |
| | | if (item.noticeType == 9) { |
| | | if (item.content.includes("项目检测项")) { |
| | | this.$router.push({ |
| | | path: "/chemistQa/projectTesting", |
| | | }); |
| | | } else if (item.content.includes("中试")) { |
| | | this.$router.push({ |
| | | path: "/chemistQa/pilotAndProduction", |
| | | }); |
| | | } else if (item.content.includes("辅料")) { |
| | | this.$router.push({ |
| | | path: "/chemistQa/rawMaterials", |
| | | }); |
| | | } else if (item.content.includes("产品报批")) { |
| | | this.$router.push({ |
| | | path: "/chemistQa/productApproval", |
| | | }); |
| | | } |
| | | return; |
| | | } |
| | | if (item.noticeType == 10) { |
| | | if (item.content.includes("项目检测项")) { |
| | | this.$router.push({ |
| | | path: "/deliveryAssessment/testingAndEvaluation", |
| | | }); |
| | | } else{ |
| | | this.$router.push({ |
| | | path: "/deliveryAssessment/assayTaskList", |
| | | }); |
| | | } |
| | | return; |
| | | } |
| | | let urlList = [ |
| | | "/dataManagement/approvalPlan", |
| | | "/dataManagement/suspendExperiment", |
| | | "/dataManagement/testResultReport", |
| | | "/reportLibrary/feasibilityStudy", |
| | | "/deliveryAssessment/reportEvaluation", |
| | | "/dataManagement/confirmation-sheet", |
| | | "/dataManagement/testResultReport", |
| | | "/dataManagement/scheme-management", |
| | | "/chemistQa/projectTesting", |
| | | "/deliveryAssessment/reportEvaluation", |
| | | "/dataManagement/dispatching", |
| | | "/dataManagement/confirmation-sheet", |
| | | "/sampleManage/manage", |
| | | "/dataManagement/dispatching", |
| | | ]; |
| | | let url = urlList[item.noticeType - 1]; |
| | | console.log("url url", url, "item.noticeType-1", item.noticeType - 1); |
| | | this.$router.push({ |
| | | path: url, |
| | | }); |
| | | }) |
| | | |
| | | } |
| | | }); |
| | | }, |
| | | }, |
| | | computed: { |
| | | currentModuleList() { |
| | |
| | | top: 0; |
| | | width: 100%; |
| | | height: 40px; |
| | | background: linear-gradient(to bottom, |
| | | rgba(255, 255, 255, 0.3) 0%, |
| | | rgba(255, 255, 255, 0) 100%); |
| | | background: linear-gradient( |
| | | to bottom, |
| | | rgba(255, 255, 255, 0.3) 0%, |
| | | rgba(255, 255, 255, 0) 100% |
| | | ); |
| | | backdrop-filter: blur(4px); |
| | | -webkit-backdrop-filter: blur(4px); |
| | | pointer-events: none; |
| | |
| | | bottom: 0; |
| | | width: 100%; |
| | | height: 40px; |
| | | background: linear-gradient(to bottom, |
| | | rgba(255, 255, 255, 0) 0%, |
| | | rgba(255, 255, 255, 0.8) 100%); |
| | | background: linear-gradient( |
| | | to bottom, |
| | | rgba(255, 255, 255, 0) 0%, |
| | | rgba(255, 255, 255, 0.8) 100% |
| | | ); |
| | | backdrop-filter: blur(4px); |
| | | -webkit-backdrop-filter: blur(4px); |
| | | pointer-events: none; |
| | |
| | | } |
| | | |
| | | &.ant-fullcalendar-next-month-btn-day { |
| | | .ant-fullcalendar-date {} |
| | | .ant-fullcalendar-date { |
| | | } |
| | | |
| | | .ant-fullcalendar-value { |
| | | color: #ffffff !important; |
| | |
| | | display: flex; |
| | | align-items: center; |
| | | justify-content: space-between; |
| | | min-width:260px; |
| | | min-width: 260px; |
| | | } |
| | | |
| | | .time { |
| | |
| | | disableHostCheck: true, //禁用主机检查 |
| | | proxy: { |
| | | "/api": { // 设置以什么前缀开头的请求用来代理 |
| | | target: "http://192.168.110.34:8081", //要访问的跨域的域名 |
| | | target: "http://221.182.45.100:11221", //要访问的跨域的域名 |
| | | secure: false, // 使用的是http协议则设置为false,https协议则设置为true |
| | | changOrigin: true, //开启代理 |
| | | changeOrigin: true, //开启代理 |
| | | pathRewrite: { |
| | | "^/api": "/api", |
| | | }, |
| | | }, |
| | | "/": { // 设置以什么前缀开头的请求用来代理 |
| | | target: "http://192.168.110.34:8081", //要访问的跨域的域名 |
| | | target: "http://221.182.45.100:11221", //要访问的跨域的域名 |
| | | secure: false, // 使用的是http协议则设置为false,https协议则设置为true |
| | | changOrigin: true, //开启代理 |
| | | changeOrigin: true, //开启代理 |
| | | pathRewrite: { |
| | | "^/": "/", |
| | | }, |