槽液信息管理

master
jinna 6 months ago
parent 5dba6c85d5
commit dcaa6d4e77
  1. 26
      src/api/productionTesting/InspectionTemplate.js
  2. 37
      src/api/tankSolutionSystem/reportBasic.js
  3. 56
      src/api/tankSolutionSystem/resultsCon.js
  4. 54
      src/utils/exportPdf.js
  5. 35
      src/views/periodicTesting/components/addProjectCycleDialog.vue
  6. 2
      src/views/periodicTesting/components/addTestProjectDialog.vue
  7. 16
      src/views/periodicTesting/projectCycle.vue
  8. 4
      src/views/periodicTesting/testProject.vue
  9. 104
      src/views/productionTesting/InspectionTemplate.vue
  10. 213
      src/views/qualityManagement/tankSolutionSystem/components/reportBasic.vue
  11. 160
      src/views/qualityManagement/tankSolutionSystem/inspectionReport.vue
  12. 18
      src/views/qualityManagement/tankSolutionSystem/resultsCon.vue
  13. 402
      src/views/qualityManagement/tankSolutionSystem/workTankLine.vue

@ -0,0 +1,26 @@
import request from '@/axios';
// 查询槽液信息列表接口
export const getList = params =>{
return request({
url:'/api/blade-desk/QA/InspectionTemplate/list',
method:'get',
params
})
}
// 新增
export const addTemplate = (data) =>{
return request({
url:'/api/blade-desk/QA/InspectionTemplate/save',
method:'post',
data
})
}
// 标准下拉
export const getStandard = (params) =>{
return request({
})
}

@ -0,0 +1,37 @@
import request from '@/axios';
// 列表接口
export const getList = params =>{
return request({
url:'/api/blade-desk/QA/LiquidTankReportConfig/list',
method:'get',
params
})
}
// 新增
export const addBasic = (data) =>{
return request({
url:"/api/blade-desk/QA/LiquidTankReportConfig/save",
method:'post',
data
})
}
// 修改
export const editBasic = (data) =>{
return request({
url:'/api/blade-desk/QA/LiquidTankReportConfig/update',
method:"post",
data
})
}
// 删除
export const deleteBasic = (params) =>{
return request({
url:'/api/blade-desk/QA/LiquidTankReportConfig/remove',
method:'post',
params
})
}

@ -19,10 +19,64 @@ export const generateReport = (params) =>{
}
// 生成报告接口
export const createReport = (params) =>{
export const createReport = (data) =>{
return request({
url:'/api/blade-desk/QA/LiquidTankTaskCopy/generateReport',
method:'post',
data
})
}
// 报告详情接口
export const getReportDetail = (params) =>{
return request({
url:'/api/blade-desk/QA/LiquidTankReport/detail',
method:"get",
params
})
}
// 删除报告
export const deleteReport = (params) =>{
return request({
url:'/api/blade-desk/QA/LiquidTankReport/remove',
method:'post',
params
})
}
// 生成曲线
export const generateLine = (data) =>{
return request({
url:'/api/blade-desk/QA/LiquidTankTaskCopy/generateWave',
method:'post',
data
})
}
// 曲线删除
export const deleteLine = (params) =>{
return request({
url:"/api/blade-desk/QA/LiquidTankWave/remove",
method:'post',
params
})
}
// 弹窗查询曲线列表接口
export const createLineList = (params) =>{
return request({
url:'/api/blade-desk/QA/LiquidTankTaskCopy/listWave',
method:"get",
params
})
}
// 曲线列表
export const getLineList = (params) =>{
return request({
url:'/api/blade-desk/QA/LiquidTankWave/list',
method:'get',
params
})
}

@ -0,0 +1,54 @@
import html2canvas from 'html2canvas';
import jsPDF from 'jspdf';
// 引入ECharts(关键:和组件中引入的方式保持一致)
import * as echarts from 'echarts';
/**
* 导出ECharts图表为PDF
* @param {String} domId - 包含ECharts图表的容器DOM ID
* @param {String} pdfName - 导出的PDF文件名
*/
export function exportEchartsToPdf(domId, pdfName = 'echarts_chart.pdf') {
const container = document.getElementById(domId);
if (!container) {
console.error('未找到图表容器');
return;
}
// 先让ECharts图表重绘(避免canvas模糊)
const charts = container.querySelectorAll('.echarts');
charts.forEach(chartDom => {
// 关键修复:使用引入的echarts而非window.echarts
const chartInstance = echarts.getInstanceByDom(chartDom);
if (chartInstance) {
chartInstance.resize(); // 重绘图表
}
});
// 使用html2canvas将DOM转为canvas
html2canvas(container, {
useCORS: true, // 解决跨域图片问题(若图表有图片)
scale: 2, // 放大2倍,避免PDF模糊
dpi: 300 // 提高清晰度
}).then(canvas => {
// 获取canvas宽高
const contentWidth = canvas.width;
const contentHeight = canvas.height;
// PDF一页的尺寸(A4比例:595×842)
const pageWidth = 595;
const pageHeight = (contentHeight * pageWidth) / contentWidth; // 按宽度等比缩放高度
// 将canvas转为图片数据
const imgData = canvas.toDataURL('image/jpeg', 1.0);
// 创建PDF实例
const pdf = new jsPDF('portrait', 'pt', 'a4');
// 添加图片到PDF
pdf.addImage(imgData, 'JPEG', 0, 0, pageWidth, pageHeight);
// 保存PDF
pdf.save(pdfName);
}).catch(err => {
console.error('导出PDF失败:', err);
});
}

@ -10,7 +10,7 @@
ref="form"
:model="projectForm"
:rules="projectRules"
label-width="100px"
label-width="120px"
v-show="title == '新增' || title == '编辑'"
>
<el-row>
@ -55,6 +55,21 @@
</el-select>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="试验件材料:" prop="testMat">
<el-input v-model="projectForm.testMat" placeholder="请输入试验件材料"></el-input>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="最小试验数量:" prop="minDoTestCount">
<el-input-number
v-model="projectForm.minDoTestCount"
controls-position="right"
:min="1"
>
</el-input-number>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="工艺员:" prop="processUserId">
@ -207,13 +222,13 @@
</el-row>
<el-row :gutter="20" style="padding: 5px 0">
<el-col :span="6">试验条件{{ projectForm.cycleTestItemCondition }}</el-col>
<el-col :span="6"
>工艺员{{ projectForm.processUserName }}</el-col
>
<el-col :span="6">提前下发天数{{ projectForm.genBefore }}</el-col>
<el-col :span="6">试验时长{{ projectForm.testDuration }}</el-col>
<el-col :span="6">试验件材料{{ projectForm.testMat }}</el-col>
<el-col :span="6">最小试验数量{{ projectForm.minDoTestCount }}</el-col>
<el-col :span="6">工艺员{{ projectForm.processUserName }}</el-col>
</el-row>
<el-row :gutter="20" style="padding: 5px 0">
<el-col :span="6">提前下发天数{{ projectForm.genBefore }}</el-col>
<el-col :span="6">试验时长{{ projectForm.testDuration }}</el-col>
<el-col :span="6">临期提醒天数{{ projectForm.remind }}</el-col>
<el-col :span="6">试验周期
<span v-if="projectForm.jobType == 1">每周 {{ projectForm.weekList && projectForm.weekList.length }}</span>
@ -256,6 +271,8 @@
</el-tag>
</div>
</el-col>
</el-row>
<el-row>
<el-col :span="6">维护人{{ projectForm.updateUserName }}</el-col>
<el-col :span="6">更新完成时间{{ projectForm.updateTime }}</el-col>
</el-row>
@ -298,6 +315,8 @@ export default {
processUserId: [{ required: true, message: '请选择工艺员', trigger: 'blur' }],
remind: [{ required: true, message: '请选择超期提醒', trigger: 'blur' }],
jobType: [{ required: true, message: '请选择试验周期', trigger: 'blur' }],
testMat:[{required:true,message:'请输入试验件材料',trigger:'blur'}],
minDoTestCount:[{required:true,message:'请输入最小试验数量',trigger:'blur'}],
},
userData:[],
monthTags:[],
@ -489,7 +508,9 @@ export default {
jobTypeWeekValue:this.projectForm.jobType == 1 ? this.projectForm.weekList.join(',') : '',
jobTypeMonthValue:this.projectForm.jobType == 2 ? monthArr.join(',') : '',
jobTypeYearValue:this.projectForm.jobType == 3 ? yearArr.join(',') : '',
isPutOff:this.projectForm.isPutOff ? 1 : 0
isPutOff:this.projectForm.isPutOff ? 1 : 0,
minDoTestCount:this.projectForm.minDoTestCount,
testMat:this.projectForm.testMat,
}
console.log('params==============',params)

@ -13,7 +13,7 @@
<el-form-item label="试验条件:" prop="condition">
<el-input v-model="ruleForm.condition" :disabled="disabled"></el-input>
</el-form-item>
<el-form-item label="试验标准:" prop="standardValue">
<el-form-item label="执行标准:" prop="standardValue">
<el-radio-group v-model="ruleForm.standardValue" :disabled="disabled" @change="changeStand">
<el-radio :label="3">已有标准</el-radio>
<el-radio :label="6">上传新标准</el-radio>

@ -181,6 +181,22 @@ export default {
filter: true,
width: 200,
},
{
label: '试验件材料',
prop: 'testMat',
search: false,
sortable: true,
filter: true,
width: 200,
},
{
label: '最小试验数量',
prop: 'minDoTestCount',
search: false,
sortable: true,
filter: true,
width: 200,
},
{
label: '试验项目',
prop: 'cycleTestItemId',

@ -71,7 +71,7 @@ export default {
projectRules: {
tpProject: [{ required: true, message: '请输入项目名称', trigger: 'blur' }],
testPieceTitle: [{ required: true, message: '请选择试验件', trigger: 'blur' }],
tpStandard: [{ required: true, message: '请输入试验标准', trigger: 'blur' }],
tpStandard: [{ required: true, message: '请输入执行标准', trigger: 'blur' }],
craftMan: [{ required: true, message: '请选择主管工艺', trigger: 'blur' }],
mecMan: [{ required: true, message: '请选择试验员', trigger: 'blur' }],
remDays: [{ required: true, message: '请选择超期提醒', trigger: 'blur' }],
@ -139,7 +139,7 @@ export default {
sortable: true,
},
{
label: '试验标准',
label: '执行标准',
prop: 'cycleTestStandardName',
search: false,
sortable: true,

@ -35,13 +35,13 @@
<el-form ref="addForm" :rules="formRules" :model="formData" label-width="100px">
<el-row>
<el-col :span="12">
<el-form-item label="模板编码" prop="timCode" >
<el-input v-model="formData.timCode" placeholder="请输入模板编码"></el-input>
<el-form-item label="模板编码" prop="inspectionTemplateCode" >
<el-input v-model="formData.inspectionTemplateCode" placeholder="请输入模板编码"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="模板名称" prop="timName" >
<el-input v-model="formData.timName" placeholder="请输入模板名称"></el-input>
<el-form-item label="模板名称" prop="name" >
<el-input v-model="formData.name" placeholder="请输入模板名称"></el-input>
</el-form-item>
</el-col>
</el-row>
@ -54,16 +54,16 @@
</el-row>
</el-form>
<div>
<el-button type="primary" icon="el-icon-plus" @click="insertEvent()">插入一行</el-button>
<el-button type="primary" @click="insertEvent()">插入一行</el-button>
<el-button plain type="danger" @click="remove">删除选择行</el-button>
<el-button type="primary" @click="handleSave">保存</el-button>
<!-- <el-button type="primary" @click="handleSave">保存</el-button> -->
</div>
<div>
<div style="margin-top:20px;">
<el-table :data="tidList" @selection-change="selectionChangeProject" @select="selectChange">
<el-table-column type="selection" width="55px"></el-table-column>
<el-table-column label="项目编号" prop="tidCode">
<el-table-column label="项目编号" prop="inspectionTemplateCode">
<template #default="scope">
<el-input v-model="scope.row.tidCode"></el-input>
<el-input v-model="scope.row.inspectionTemplateCode"></el-input>
</template>
</el-table-column>
<el-table-column label="项目" prop="nameAmId">
@ -84,6 +84,12 @@
</el-table-column>
</el-table>
</div>
<template #footer>
<span class="dialog-footer">
<el-button @click="showDialog = false"> </el-button>
<el-button type="primary" @click="handleSave"> </el-button>
</span>
</template>
</el-dialog>
<el-dialog title="修改" append-to-body v-model="setDialog" width="500px">
<el-form ref="addForm" :rules="setRules" :model="setData" >
@ -104,7 +110,7 @@
</template>
<script>
import {getList,addTemplate} from '@/api/productionTesting/InspectionTemplate'
export default {
data(){
return{
@ -183,13 +189,13 @@ export default {
index: false,
showOverflowTooltip: true,
searchLabelPosition:'left',
searchLabelPosition:'left',
searchGutter:24,
searchSpan:6,
menuAlign: 'left',
gridBtn:false,
searchMenuPosition:'right',
addBtnIcon: ' ',
searchLabelPosition:'left',
searchGutter:24,
searchSpan:6,
menuAlign: 'left',
gridBtn:false,
searchMenuPosition:'right',
addBtnIcon: ' ',
viewBtnIcon: ' ',
delBtnIcon: ' ',
editBtnIcon: ' ',
@ -523,34 +529,42 @@ addBtnIcon: ' ',
},
onLoad(){
this.loading = true
this.data = [
{
id:1,timId: 1,timCode:'001',timName:'化学镍不涂色标试验项目',proQuantity:7,priority:1,
timType:'A',updateMan:{
userName:'崔殿龙',
},
updateTime:'2024-01-22 12:35:40'
},
{
id:2,timId: 2,timCode:'002',timName:'化学镍不涂色标试验项目',proQuantity:7,priority:1,
timType:'A',updateMan:{
userName:'崔殿龙',
},
updateTime:'2024-01-22 12:35:40'
},
{
id:3,timId: 3,timCode:'003',timName:'化学镍不涂色标试验项目',proQuantity:7,priority:1,
timType:'A',updateMan:{
userName:'崔殿龙',
},
updateTime:'2024-01-22 12:35:40'
},
]
this.page.total = this.data.length
this.loading = false
setTimeout(() =>{
this.selectionClear();
},300)
getList({
current:this.page.currentPage,
size:this.page.pageSize
}).then(res =>{
this.data = res.data.data.records
this.page.total = res.data.data.total
this.loading = false
})
// this.data = [
// {
// id:1,timId: 1,timCode:'001',timName:'',proQuantity:7,priority:1,
// timType:'A',updateMan:{
// userName:'殿',
// },
// updateTime:'2024-01-22 12:35:40'
// },
// {
// id:2,timId: 2,timCode:'002',timName:'',proQuantity:7,priority:1,
// timType:'A',updateMan:{
// userName:'殿',
// },
// updateTime:'2024-01-22 12:35:40'
// },
// {
// id:3,timId: 3,timCode:'003',timName:'',proQuantity:7,priority:1,
// timType:'A',updateMan:{
// userName:'殿',
// },
// updateTime:'2024-01-22 12:35:40'
// },
// ]
// this.page.total = this.data.length
// this.loading = false
// setTimeout(() =>{
// this.selectionClear();
// },300)
}
}
}

@ -0,0 +1,213 @@
<template>
<el-dialog
title="信息维护"
append-to-body
:modelValue="showBasic"
width="100%"
fullscreen
@close="closeDialog"
>
<avue-crud
:option="option"
:table-loading="loading"
:data="data"
v-model:search="search"
v-model:page="page"
v-model="form"
ref="crud"
@row-update="rowUpdate"
@row-save="rowSave"
@row-del="rowDel"
@search-change="searchChange"
@search-reset="searchReset"
@selection-change="selectionChange"
@current-change="currentChange"
@size-change="sizeChange"
@refresh-change="refreshChange"
@on-load="onLoad"
></avue-crud>
</el-dialog>
</template>
<script>
import {getList,addBasic,editBasic,deleteBasic} from '@/api/tankSolutionSystem/reportBasic'
export default {
props:{
showBasic:{
type:Boolean,
default:false
}
},
data(){
return {
loading:false,
data:[],
page:{
pageSize: 10,
currentPage: 1,
total: 0,
},
search:{},
form:{},
option:{
tip: false,
height: 'auto',
calcHeight: 32,
columnSort: true,
searchShow: true,
searchMenuSpan: 18,
searchIcon: true,
searchIndex: 3,
tree: false,
border: true,
index: false,
selection: true,
viewBtn: true,
delBtn: true,
addBtn: true,
editBtn: true,
editBtnText: '修改',
viewBtnText: '详情',
addBtnIcon: ' ',
viewBtnIcon: ' ',
delBtnIcon: ' ',
editBtnIcon: ' ',
labelWidth: 120,
dialogWidth: 600,
dialogClickModal: false,
searchEnter: true,
filterBtn: true,
searchShowBtn: false,
excelBtn: true,
showOverflowTooltip: true,
align: 'center',
searchLabelPosition: 'left',
searchGutter: 24,
searchSpan: 6,
menuAlign: 'left',
gridBtn: false,
searchMenuPosition: 'right',
column: [
{
label: '作业中心',
prop: 'wcId',
type:'select',
sortable: true,
filter: true,
search: true,
dicUrl:'/blade-desk/BA/WorkCenter/listForSelect',
span: 24,
props: {
label: 'wcName',
value: 'id',
},
},
{
label: '报告名称',
prop: 'namePrefix',
type: 'input',
search: false,
sortable: true,
filter: true,
span: 24,
},
{
label: '表号',
prop: 'reportCode',
type: 'input',
search: false,
sortable: true,
filter: true,
span: 24,
},
{
label: '规范',
prop: 'norm',
type: 'input',
search: false,
sortable: true,
filter: true,
span: 24,
},
]
}
}
},
mounted(){
},
methods:{
closeDialog(){
this.$emit('closeDialog');
},
//
rowDel(row) {
this.$confirm('确定删除此条数据?', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
}).then(() => {
deleteBasic({ids:row.id}).then(res =>{
if(res.data.code == 200){
this.$message.success('删除成功')
this.onLoad()
}
})
});
},
rowSave(row, done, loading) {
addBasic(row).then(res =>{
if(res.data.code == 200){
this.$message.success('新增成功')
this.onLoad()
done()
}
})
},
rowUpdate(row, index, done, loading) {
editBasic(row).then(res =>{
this.$message.success('修改成功')
this.onLoad()
done()
})
},
searchReset() {
this.search = {};
this.onLoad();
},
searchChange(params, done) {
this.search = params;
this.page.currentPage = 1;
this.onLoad();
done();
},
currentChange(currentPage) {
this.page.currentPage = currentPage;
},
sizeChange(pageSize) {
this.page.pageSize = pageSize;
},
refreshChange() {
this.onLoad();
},
onLoad(){
this.loading = true
getList({
current:this.page.currentPage,
size:this.page.pageSize,
...this.search
}).then(res =>{
this.data = res.data.data.records
this.page.total = res.data.data.total
this.loading = false
})
},
}
}
</script>
<style>
</style>

@ -66,7 +66,7 @@
</el-form>
<div style="height: 600px;">
<avue-crud :option="addoption" :table-loading="loading" :data="reportData" v-model="form" v-model:page="page"
ref="crud" @row-del="rowDel" @search-change="searchChange" @search-reset="searchReset"
ref="crud"
@selection-change="selectionChange" @current-change="currentChange" @size-change="sizeChange"
@refresh-change="refreshChange" @on-load="onLoad" :before-open="beforeOpen">
</avue-crud>
@ -76,7 +76,7 @@
<template #footer>
<span class="dialog-footer">
<el-button @click="closeDialog"> </el-button>
<el-button @click="lineBox = false"> </el-button>
<el-button type="primary" @click="submit"> </el-button>
</span>
</template>
@ -103,8 +103,9 @@
<script>
import { detail } from '@/api/flow/flow'
import {getReportList,generateReport} from '@/api/tankSolutionSystem/resultsCon'
import {getReportList,generateReport,createReport,getReportDetail,deleteReport} from '@/api/tankSolutionSystem/resultsCon'
import {getWorkCenter,getTank,getPerson,getManager,getTeam,addInfo,getDetail,editInfo} from '@/api/tankSolutionSystem/info'
import { format } from 'echarts'
export default {
data() {
return {
@ -183,15 +184,28 @@ export default {
{
label: '生成时间',
prop: 'createTime',
type:'date',
sortable: true,
filter: true,
span: 8,
search: false,
},
{
label: '生成时间',
prop: 'createTime',
type:'date',
searchRange:true,
sortable: true,
filter: true,
span: 8,
search: true,
hide:true,
format:'YYYY-MM-DD',
valueFormat:"YYYY-MM-DD"
},
{
label: '维护人',
prop: 'lineTime',
prop: 'updateUserRealName',
sortable: true,
filter: true,
span: 8,
@ -273,14 +287,16 @@ export default {
column: [
{
label: '取样时间',
prop: 'lineName',
prop: 'sampleDate',
type:'date',
sortable: true,
filter: true,
span: 8,
search: false,
width: 120,
width: 160,
cell: true,
format:"YYYY-MM-DD",
valueFormat:"YYYY-MM-DD"
},
{
label: '温度(℃)',
@ -305,7 +321,8 @@ export default {
viewDisplay: false,
span: 24,
width: 180,
cell: true,
// disbled:true,
// cell: true,
dicUrl:'/api/blade-desk/BA/WorkTank/listForSelect',
props:{
label:'name',
@ -401,7 +418,7 @@ export default {
},
{
label: '化验频率',
prop: 'createUser',
prop: 'testFrequency',
sortable: true,
filter: true,
span: 8,
@ -423,7 +440,7 @@ export default {
},
{
label: '药品计算公式',
prop: 'createUser',
prop: 'reportFormulaContent',
sortable: true,
filter: true,
span: 8,
@ -456,7 +473,7 @@ export default {
},
{
label: '药品监督员签名',
prop: 'createUser',
prop: 'drugSuUserSign',
sortable: true,
filter: true,
span: 8,
@ -466,7 +483,7 @@ export default {
},
{
label: '药品添加人签名',
prop: 'createUser',
prop: 'drugAddUserSign',
sortable: true,
filter: true,
span: 8,
@ -484,18 +501,6 @@ export default {
search: false,
width: 170,
cell: true,
type:'select',
dictData:[
{
label:'合格',
value:1,
},
{
label:"不合格",
value:2
}
]
},
{
label: '是否合格',
@ -506,11 +511,22 @@ export default {
search: false,
width: 140,
cell: true,
type:'select',
dicData:[
{
label:'合格',
value:1,
},
{
label:"不合格",
value:2
}
]
},
{
label: '有效期',
prop: 'createUser',
prop: 'validDate',
sortable: true,
filter: true,
span: 8,
@ -521,7 +537,7 @@ export default {
},
{
label: '超出规范极限调整后的结果',
prop: 'createUser',
prop: 'outRangeResult',
sortable: true,
filter: true,
span: 8,
@ -532,7 +548,7 @@ export default {
},
{
label: '槽液清理记录',
prop: 'createUser',
prop: 'clearRecord',
sortable: true,
filter: true,
span: 8,
@ -542,7 +558,7 @@ export default {
},
{
label: '控制规范',
prop: 'createUser',
prop: 'norm',
sortable: true,
filter: true,
span: 8,
@ -561,8 +577,20 @@ export default {
methods: {
handleLine() {
this.reportData = []
this.lineForm = {}
this.lineBox = true
},
//
submit(){
console.log('repo-----------',this.reportData)
createReport(this.reportData).then(res =>{
if(res.data.code == 200){
this.$message.success('生成报告成功')
this.lineBox = false
this.onLoad()
}
})
},
createLine() {
// workCenterId workTankId liquidTankId testElement createTimeStart createTimeEnd
console.log('lineForm--------',this.lineForm)
@ -570,8 +598,8 @@ export default {
workCenterId:this.lineForm.workCenterId,
workTankId:this.lineForm.workTankId,
testElement:this.lineForm.testElement,
createTimeStart:this.lineForm.timeRange.length != 0 ? this.lineForm.timeRange[0] : '',
createTimeEnd:this.lineForm.timeRange.length != 0 ? this.lineForm.timeRange[1] : '',
createTimeStart:this.lineForm.timeRange && this.lineForm.timeRange.length != 0 ? this.lineForm.timeRange[0] : '',
createTimeEnd:this.lineForm.timeRange && this.lineForm.timeRange.length != 0 ? this.lineForm.timeRange[1] : '',
}
generateReport(params).then(res =>{
@ -653,31 +681,35 @@ export default {
done();
},
handleView(row) {
console.log('row-------------------', row)
this.detailForm = row
let data = row.lineTime.split(' ~ ')
console.log('data------------------', data)
this.lineTitle = '槽号:' + row.slotNo + ' 检测成分:氰化铜'
//
let days = this.getDateCount(data[0], data[1]);
console.log(days);
this.xData = days.dates
this.testData = []
this.maxData = []
this.minData = []
for (let i = 0; i < days.totalDays; i++) {
// 099099
let randomInteger = Math.floor(Math.random() * 30);
//
this.testData.push(randomInteger);
this.minData.push(5);
this.maxData.push(30);
}
this.$nextTick(() => {
this.createBarChart()
this.detailBox = true
// this.lineBox = true
getReportDetail({id:row.id}).then(res =>{
console.log('res--------------',res)
})
// console.log('row-------------------', row)
// this.detailForm = row
// let data = row.lineTime.split(' ~ ')
// console.log('data------------------', data)
// this.lineTitle = '' + row.slotNo + ' '
// //
// let days = this.getDateCount(data[0], data[1]);
// console.log(days);
// this.xData = days.dates
// this.testData = []
// this.maxData = []
// this.minData = []
// for (let i = 0; i < days.totalDays; i++) {
// // 099099
// let randomInteger = Math.floor(Math.random() * 30);
// //
// this.testData.push(randomInteger);
// this.minData.push(5);
// this.maxData.push(30);
// }
// this.$nextTick(() => {
// this.createBarChart()
// this.detailBox = true
// })
},
createBarChart() {
@ -818,7 +850,12 @@ export default {
cancelButtonText: '取消',
type: 'warning',
}).then(() => {
deleteReport({ids:row.id}).then(res =>{
if(res.data.code == 200){
this.$message.success('删除成功')
this.onLoad()
}
})
})
},
handleDelete() {
@ -831,7 +868,12 @@ export default {
cancelButtonText: '取消',
type: 'warning',
}).then(() => {
deleteReport({ids:this.selectionList.map(item => item.id).join(',')}).then(res =>{
if(res.data.code == 200){
this.$message.success('删除成功')
this.onLoad()
}
})
})
},
currentChange(currentPage) {
@ -844,10 +886,14 @@ export default {
this.onLoad(this.page, this.query);
},
onLoad() {
this.loading = true
getReportList({
current:this.page.currentPage,
size:this.page.pageSize
size:this.page.pageSize,
name:this.query.name,
createTimeStart:this.query.createTime && this.query.createTime.length != 0 ? this.query.createTime[0] : '',
createTimeEnd:this.query.createTime && this.query.createTime.length != 0 ? this.query.createTime[1] : '',
}).then(res =>{
this.data = res.data.data.records
this.page.total = res.data.data.total

@ -1,22 +1,36 @@
<template>
<basic-container>
<el-button type="primary" style="float:right;margin-bottom:5px;" @click="addBasic">报告基本信息维护</el-button>
<el-tabs v-model="activeName" @tab-click="handleClick">
<el-tab-pane label="检验报告" name="1"></el-tab-pane>
<el-tab-pane label="曲线" name="2"></el-tab-pane>
</el-tabs>
<workTankLine v-if="activeName=='2'"></workTankLine>
<inspectionReport v-if="activeName=='1'"></inspectionReport>
<reportBasic v-if="showBasic" :show-basic="showBasic" @closeDialog="closeDialog" ></reportBasic>
</basic-container>
</template>
<script>
import workTankLine from './workTankLine.vue'
import inspectionReport from './inspectionReport.vue'
import reportBasic from './components/reportBasic.vue'
export default {
components:{workTankLine,inspectionReport},
components:{workTankLine,inspectionReport,reportBasic},
data() {
return {
activeName: '1'
activeName: '1',
showBasic:false,
}
},
methods:{
addBasic(){
this.showBasic = true
console.log('addBasic------------',this.showBasic)
},
//
closeDialog(val) {
this.showBasic = false
},
}
}
</script>

@ -19,10 +19,10 @@
<el-form :inline="true" v-model="lineForm" label-width="80px">
<el-row :gutter="24">
<el-col :span="6">
<el-form-item label="作业中心" prop="slotNo">
<el-select v-model="lineForm.slotNo" placeholder="请选择" style="width: 200px;">
<el-option v-for="item in slotData" :key="item.value" :label="item.label"
:value="item.value"></el-option>
<el-form-item label="作业中心" prop="workCenterId">
<el-select v-model="lineForm.workCenterId" placeholder="请选择" style="width: 200px;">
<el-option v-for="item in workCenterData" :key="item.id" :label="item.wcName"
:value="item.id"></el-option>
</el-select>
</el-form-item>
</el-col>
@ -42,13 +42,13 @@
</el-col>
</el-row>
</el-form>
<div style="height: 600px;">
<div style="height: 670px;overflow-y:auto;overflow-x:hidden;">
<div v-if="isShowBox">
<el-row :gutter="24">
<el-col :span="12">
<div style="width: 100%;height: 240px;" ref="lineChart1"></div>
<el-row :gutter="24" id="chartsContainer1">
<el-col :span="12" v-for="(item,index) in lineData" :key="item.id">
<div style="width: 100%;height: 240px;" :id="`chart-${index}`"></div>
</el-col>
<el-col :span="12">
<!-- <el-col :span="12">
<div style="width: 100%;height: 240px;" ref="lineChart2"></div>
</el-col>
<el-col :span="12">
@ -56,15 +56,16 @@
</el-col>
<el-col :span="12">
<div style="width: 100%;height: 240px;" ref="lineChart4"></div>
</el-col>
</el-col> -->
</el-row>
</div>
</div>
<template #footer>
<span class="dialog-footer">
<el-button @click="closeDialog"> </el-button>
<el-button @click="lineBox = false"> </el-button>
<el-button type="primary" @click="submit"> </el-button>
<el-button type="primary" @click="print"> </el-button>
</span>
</template>
</el-dialog>
@ -72,29 +73,35 @@
<div style="padding: 10px 0 30px;border-bottom:1px solid #eee;">
<div style="margin: 20px 0;">曲线信息</div>
<div style="display: flex;flex-wrap: wrap;">
<div style="width: 33%;margin-bottom: 15px;">作业中心{{ detailForm.wcName }}</div>
<div style="width: 33%;margin-bottom: 15px;">槽号{{ detailForm.slotNo }}</div>
<div style="width: 33%;margin-bottom: 15px;">检测成分{{ detailForm.testName }}</div>
<div style="width: 33%;margin-bottom: 15px;">作业中心{{ detailForm.workCenterName }}</div>
<!-- <div style="width: 33%;margin-bottom: 15px;">槽号{{ detailForm.slotNo }}</div>
<div style="width: 33%;margin-bottom: 15px;">检测成分{{ detailForm.testName }}</div> -->
<div style="width: 33%;">曲线时间范围{{ detailForm.lineTime }}</div>
<div style="width: 33%;">操作人{{ detailForm.createTime }}</div>
<div style="width: 33%;">曲线生时间{{ detailForm.createUser }}</div>
<div style="width: 33%;">曲线生时间{{ detailForm.createUser }}</div>
</div>
</div>
<div style="margin: 20px 0;">
检测曲线
</div>
<div style="width: 100%;height: 520px;" ref="lineChart"></div>
<div id="chartsContainer1">
<div style="width: 100%;height: 240px;" v-for="(item,index) in lineData" :key="item.id" :id="`chart-${index}`"></div>
</div>
</el-dialog>
</div>
</template>
<script>
import {createLineList,generateLine,getLineList,deleteLine} from '@/api/tankSolutionSystem/resultsCon'
import {getWorkCenter} from '@/api/tankSolutionSystem/info'
import { detail } from '@/api/flow/flow'
import { exportEchartsToPdf } from '@/utils/exportPdf'; //
export default {
data() {
return {
showPrint:false,
data: [],
form: {},
query: {},
@ -102,12 +109,7 @@ export default {
nameForm: {},
detailBox: false,
detailForm: {},
slotData: [
{ value: '#21', label: '作业中心1' },
{ value: '#22', label: '作业中心2' },
{ value: '#23', label: '作业中心3' },
{ value: '#24', label: '作业中心4' },
],
workCenterData: [ ],
tankData: [
{ value: '20250821001', value: '20250821001' },
{ value: '20250821002', value: '20250821002' },
@ -166,7 +168,7 @@ export default {
column: [
{
label: '曲线名称',
prop: 'lineName',
prop: 'name',
sortable: true,
filter: true,
span: 8,
@ -176,16 +178,29 @@ export default {
{
label: '生成时间',
prop: 'testName',
prop: 'createTime',
sortable: true,
filter: true,
span: 8,
search: true,
search: false,
},
{
label: '生成时间',
prop: 'createTime',
sortable: true,
filter: true,
type:'date',
span: 8,
search: true,
searchRange:true,
hide:true,
format:'YYYY-MM-DD',
valueFormat:'YYYY-MM-DD'
},
{
label: '维护人',
prop: 'lineTime',
prop: 'updateUserRealName',
sortable: true,
filter: true,
span: 8,
@ -195,7 +210,7 @@ export default {
},
{
label: '维护时间',
prop: 'createTime',
prop: 'updateTime',
sortable: true,
filter: true,
span: 8,
@ -210,16 +225,203 @@ export default {
xData: [],
lineTitle: '',
isShowBox: false,
selectionList: []
selectionList: [],
lineData:[],
wareData:[],
}
},
mounted() {
this.getWorkCenterList()
},
methods: {
//
getWorkCenterList(){
getWorkCenter().then(res =>{
this.workCenterData = res.data.data
})
},
handleLine() {
this.lineForm = {}
this.lineData = []
this.wareData = []
this.lineBox = true
},
createLine() {
createLine(){
createLineList({
workCenterId:this.lineForm.workCenterId,
createTimeStart:this.lineForm.timeRange && this.lineForm.timeRange.length != 0 ? this.lineForm.timeRange[0] : '',
createTimeEnd:this.lineForm.timeRange && this.lineForm.timeRange.length != 0 ? this.lineForm.timeRange[1] : '',
}).then(res =>{
console.log('res--------------',res)
this.isShowBox = true
this.lineData = res.data.data.waveData
// this.wareData = res.data.data.records
// this.lineData = [
// {
// workCenterId:"001",
// workCenterName:"A",
// workTankId:"002",
// workTankName:"A",
// testElement:"A",
// date:['2025-12-05','2025-12-06','2025-12-07','2025-12-08','2025-12-09','2025-12-10',],
// max:['10','10','10','10','10','10',],//10
// min: ['5','5','5','5','5','5',],
// targrt:['6','3','2','1','10','15',]
// },
// {
// workCenterId:"001",
// workCenterName:"A",
// workTankId:"002",
// workTankName:"A",
// testElement:"B",
// date:['2025-12-05','2025-12-06','2025-12-07','2025-12-08','2025-12-09','2025-12-10',],
// max:['10','10','10','10','10','10',],//10
// min: ['5','5','5','5','5','5',],
// targrt:['6','3','2','1','10','15',]
// },
// {
// workCenterId:"001",
// workCenterName:"A",
// workTankId:"003",
// workTankName:"B",
// testElement:"C",
// date:['2025-12-05','2025-12-06','2025-12-07','2025-12-08','2025-12-09','2025-12-10',],
// max:['10','10','10','10','10','10',],//10
// min: ['5','5','5','5','5','5',],
// targrt:['6','3','2','1','10','15',]
// }
// ]
this.$nextTick(() =>{
this.createChart()
})
})
},
createChart(){
this.lineData.forEach((item, index) => {
const chartId = `chart-${item.id || index}`;
const chartDom = document.getElementById(chartId);
if (!chartDom) return;
// ECharts
const chart = this.$echarts.init(chartDom);
const option = {
title: {
text: item.workTankName + item.testElement,
left: "center",
},
legend: {
show: true,
orient: "vertical",
right: 'right'
},
grid: {
containLabel: true,
left: 20,
right: 20,
bottom: '1%',
top: '15%'
},
tooltip: {
//
trigger: 'axis', //
axisPointer: { type: 'shadow' } //
},
xAxis: {
axisLabel: {
color: '#000',
fontSize: 14,
interval: 0
},
axisTick: {
show: false
},
splitLine: {
show: false
},
axisLine: {
show: true
},
data: item.testDateList,
type: 'category'
},
yAxis: {
axisLabel: {
color: '#000',
fontSize: 14
},
max: parseInt(item.maxList[0]) + 10,
axisTick: {
show: false
},
splitLine: {
show: true
},
axisLine: {
show: true
},
name: ''
},
series: [
{
name: '上限', //
data: item.maxList,
type: 'line',
itemStyle: {
color: '#6480e1'
},
label: {
show: false,
position: 'top',
color: '#000'
}
},
{
name: '下限', //
data: item.minList,
type: 'line',
smooth: true,
itemStyle: {
color: '#c0db50'
},
label: {
show: false,
color: '#fff'
}
},
{
name: '检测值', //
data: item.targetList,
type: 'line',
itemStyle: {
color: '#6a6d87'
},
label: {
show: false,
color: '#fff'
}
}
]
};
chart.setOption(option);
})
},
print(){
exportEchartsToPdf('chartsContainer1', 'echarts分析报告.pdf');
},
submit(){
generateLine(this.lineData).then(res =>{
if(res.data.code == 200){
this.$message.success('生成曲线成功')
this.lineBox = false
this.onLoad()
}
})
},
createLine1() {
// if (!this.lineForm.slotNo && !this.lineForm.tank && !this.lineForm.timeRange) {
// this.$message.error('')
// } else {
@ -290,30 +492,75 @@ export default {
done();
},
handleView(row) {
console.log('row-------------------', row)
this.detailForm = row
let data = row.lineTime.split(' ~ ')
console.log('data------------------', data)
this.detailBox = true
this.lineTitle = '槽号:' + row.slotNo + ' 检测成分:氰化铜'
//
let days = this.getDateCount(data[0], data[1]);
console.log(days);
this.xData = days.dates
this.testData = []
this.maxData = []
this.minData = []
for (let i = 0; i < days.totalDays; i++) {
// 099099
let randomInteger = Math.floor(Math.random() * 30);
//
this.testData.push(randomInteger);
this.minData.push(5);
this.maxData.push(30);
this.detailForm = {
workCenterName:'作业中心B',
lineTime:'2025-12-01~2025-12-19',
createTime:"111",
createUser:"2025-12-19"
}
this.$nextTick(() => {
this.createBarChart()
})
this.lineData = [
{
workCenterId:"001",
workCenterName:"作业中心A",
workTankId:"002",
workTankName:"作业槽A",
testElement:"分析项目A",
date:['2025-12-05','2025-12-06','2025-12-07','2025-12-08','2025-12-09','2025-12-10',],
max:['10','10','10','10','10','10',],//10
min: ['5','5','5','5','5','5',],
targrt:['6','3','2','1','10','15',]
},
{
workCenterId:"001",
workCenterName:"作业中心A",
workTankId:"002",
workTankName:"作业槽A",
testElement:"分析项目B",
date:['2025-12-05','2025-12-06','2025-12-07','2025-12-08','2025-12-09','2025-12-10',],
max:['10','10','10','10','10','10',],//10
min: ['5','5','5','5','5','5',],
targrt:['6','3','2','1','10','15',]
},
{
workCenterId:"001",
workCenterName:"作业中心A",
workTankId:"003",
workTankName:"作业槽B",
testElement:"分析项目C",
date:['2025-12-05','2025-12-06','2025-12-07','2025-12-08','2025-12-09','2025-12-10',],
max:['10','10','10','10','10','10',],//10
min: ['5','5','5','5','5','5',],
targrt:['6','3','2','1','10','15',]
}
]
this.detailBox = true
this.$nextTick(() =>{
this.createChart()
})
// console.log('row-------------------', row)
// this.detailForm = row
// let data = row.lineTime.split(' ~ ')
// console.log('data------------------', data)
// this.detailBox = true
// this.lineTitle = '' + row.slotNo + ' '
// //
// let days = this.getDateCount(data[0], data[1]);
// console.log(days);
// this.xData = days.dates
// this.testData = []
// this.maxData = []
// this.minData = []
// for (let i = 0; i < days.totalDays; i++) {
// // 099099
// let randomInteger = Math.floor(Math.random() * 30);
// //
// this.testData.push(randomInteger);
// this.minData.push(5);
// this.maxData.push(30);
// }
// this.$nextTick(() => {
// this.createBarChart()
// })
},
createBarChart() {
@ -461,7 +708,14 @@ export default {
cancelButtonText: '取消',
type: 'warning',
}).then(() => {
deleteLine({
ids:row.id
}).then(res =>{
if(res.data.code == 200){
this.$message.success('删除成功')
this.onLoad()
}
})
})
},
handleDelete() {
@ -474,7 +728,14 @@ export default {
cancelButtonText: '取消',
type: 'warning',
}).then(() => {
deleteLine({
ids:this.selectionList.map(item => item.id).join(',')
}).then(res =>{
if(res.data.code == 200){
this.$message.success('删除成功')
this.onLoad()
}
})
})
},
currentChange(currentPage) {
@ -488,17 +749,28 @@ export default {
},
onLoad() {
this.loading = true
this.data = [
{ id: '1', lineName: '氰化钠', wcName: '化学镀镍作业中心', slotNo: '#21', testName: '氰化钠', lineTime: '2016-10-15 ~ 2016-10-21', createTime: '2016-09-21 08:50:08', createUser: '张三' },
{ id: '2', lineName: '氰化钠', wcName: '化学镀镍作业中心', slotNo: '#21', testName: '氰化钠', lineTime: '2016-10-15 ~ 2016-10-21', createTime: '2016-09-21 08:50:08', createUser: '张三' },
{ id: '3', lineName: '氰化钠', wcName: '化学镀镍作业中心', slotNo: '#21', testName: '氰化钠', lineTime: '2016-10-10 ~ 2016-10-21', createTime: '2016-09-21 08:50:08', createUser: '张三' },
{ id: '4', lineName: '氰化钠', wcName: '化学镀镍作业中心', slotNo: '#21', testName: '氰化钠', lineTime: '2016-10-18 ~ 2016-10-21', createTime: '2016-09-21 08:50:08', createUser: '张三' },
]
this.page.total = this.data.length
this.loading = false
setTimeout(() => {
this.selectionClear()
}, 500)
getLineList({
current:this.page.currentPage,
size:this.page.pageSize,
name:this.query.name,
createTimeStart:this.query.createTime && this.query.createTime.length != 0 ? this.query.createTime[0] : '',
createTimeEnd:this.query.createTime && this.query.createTime.length != 0 ? this.query.createTime[1] : '',
}).then(res =>{
this.data = res.data.data.records
this.page.total = res.data.data.total
this.loading = false
})
// this.data = [
// { id: '1', lineName: '', wcName: '', slotNo: '#21', testName: '', lineTime: '2016-10-15 ~ 2016-10-21', createTime: '2016-09-21 08:50:08', createUser: '' },
// { id: '2', lineName: '', wcName: '', slotNo: '#21', testName: '', lineTime: '2016-10-15 ~ 2016-10-21', createTime: '2016-09-21 08:50:08', createUser: '' },
// { id: '3', lineName: '', wcName: '', slotNo: '#21', testName: '', lineTime: '2016-10-10 ~ 2016-10-21', createTime: '2016-09-21 08:50:08', createUser: '' },
// { id: '4', lineName: '', wcName: '', slotNo: '#21', testName: '', lineTime: '2016-10-18 ~ 2016-10-21', createTime: '2016-09-21 08:50:08', createUser: '' },
// ]
// this.page.total = this.data.length
// this.loading = false
// setTimeout(() => {
// this.selectionClear()
// }, 500)
}
}
}

Loading…
Cancel
Save