@ -0,0 +1,32 @@ | |||
import request from '@/utils/request' | |||
// 导出产品追溯明细 | |||
export function exportheadexcel (params) { | |||
return request({ | |||
url: '/admin/om/serialorder/exporttrace', | |||
method: 'get', | |||
params | |||
}) | |||
} | |||
// 获取工单工序追溯数据 | |||
export function getPotrace (params) { | |||
return request({ | |||
url: '/admin/om/serialorder/potrace', | |||
method: 'get', | |||
params | |||
}) | |||
} | |||
// 获取工单下的详细操作数据 | |||
export function getDetailtrace (params) { | |||
return request({ | |||
url: '/admin/om/serialorder/detailtrace', | |||
method: 'get', | |||
params | |||
}) | |||
} | |||
// 获取产线数据 | |||
export function getWorkLineList () { | |||
return request({ | |||
url: '/admin/base/workline/query', | |||
method: 'get' | |||
}) | |||
} |
@ -0,0 +1,25 @@ | |||
import request from '@/utils/request' | |||
// 查询所有数据 | |||
export function getProjectList (params) { | |||
return request({ | |||
url: '/admin/me/project/query', | |||
method: 'get', | |||
params | |||
}) | |||
} | |||
// 查询订单管理所有数据 | |||
export function getWorkorderList (params) { | |||
return request({ | |||
url: '/admin/om/workorder/query', | |||
method: 'get', | |||
params | |||
}) | |||
} | |||
// 订单明细 | |||
export function getSerialOrder (params) { | |||
return request({ | |||
url: '/admin/om/serialorder/query', | |||
method: 'get', | |||
params | |||
}) | |||
} |
@ -0,0 +1,301 @@ | |||
<template> | |||
<div class="app-container traceability-details-wrap"> | |||
<el-form ref="queryForm" :model="formData" :inline="true"> | |||
<el-form-item :label="getColumnName('OM_WorkOrder-WorkOrderId')"> | |||
<el-input | |||
v-model.trim="formData.workOrderId" | |||
placeholder="请输入查询内容" | |||
clearable | |||
size="small" | |||
style="width: 150px" | |||
/> | |||
</el-form-item> | |||
<el-form-item :label="getColumnName('OM_SerialOrder-SerialOrderId')"> | |||
<el-input | |||
v-model.trim="formData.serialOrderId" | |||
placeholder="请输入查询内容" | |||
clearable | |||
size="small" | |||
style="width: 150px" | |||
/> | |||
</el-form-item> | |||
<el-form-item label="产线"> | |||
<el-select | |||
v-model="formData.workLineId" | |||
filterable | |||
clearable | |||
placeholder="请选择" | |||
style="width: 150px" | |||
> | |||
<el-option | |||
v-for="item in workLineArray" | |||
:key="item['WorkLine-WorkLineid']" | |||
:label="item['WorkLine-Descr']" | |||
:value="item['WorkLine-WorkLineid']" | |||
/> | |||
</el-select> | |||
</el-form-item> | |||
<el-form-item label="时间"> | |||
<el-date-picker | |||
v-model="formData.date" | |||
type="date" | |||
style="width: 140px" | |||
format="yyyy-MM-dd" | |||
value-format="yyyy-MM-dd" | |||
placeholder="选择日期"> | |||
</el-date-picker> | |||
</el-form-item> | |||
<el-form-item :label="getColumnName('OM_WorkOrderStatus-Status')"> | |||
<el-select | |||
v-model="formData.status" | |||
clearable | |||
style="width: 150px" | |||
filterable | |||
placeholder="请选择" | |||
> | |||
<el-option | |||
v-for="item in orderStatusArray" | |||
:key="item['stdeftab-stdeftyp']" | |||
:label="item['stdeftab-bez']" | |||
:value="item['stdeftab-stdeftyp']" | |||
/> | |||
</el-select> | |||
</el-form-item> | |||
<el-form-item label="NG条码"> | |||
<el-input | |||
v-model.trim="formData.NGCode" | |||
placeholder="请输入查询内容" | |||
clearable | |||
size="small" | |||
style="width: 150px" | |||
/> | |||
</el-form-item> | |||
<el-form-item label="是否返修"> | |||
<el-select | |||
v-model="formData.repair" | |||
clearable | |||
style="width: 100px" | |||
filterable | |||
placeholder="请选择" | |||
> | |||
<el-option label="是" value="true" /> | |||
<el-option label="否" value="false" /> | |||
</el-select> | |||
</el-form-item> | |||
<el-form-item> | |||
<el-button | |||
type="primary" | |||
icon="el-icon-search" | |||
size="mini" | |||
@click="handleQuery" | |||
>搜索</el-button | |||
> | |||
<el-button | |||
class="export-btn" | |||
type="primary" | |||
size="mini" | |||
@click="exportExcel" | |||
icon="el-icon-upload2" | |||
>导出</el-button> | |||
</el-form-item> | |||
</el-form> | |||
<div class="table-wrap"> | |||
<el-table | |||
v-loading="loading" | |||
:data="tableData" | |||
@cell-click="cellClick" | |||
border | |||
> | |||
<el-table-column | |||
:label="getColumnName('OM_SerialOrder-SerialOrderId')" | |||
prop="serialOrderId" | |||
:show-overflow-tooltip="true" | |||
width="200px" | |||
/> | |||
<el-table-column | |||
v-for="(item, index) in headers" | |||
:key="item" | |||
:label="getColumnName(item)" | |||
:show-overflow-tooltip="true" | |||
width="200px" | |||
> | |||
<template slot-scope="scope"> | |||
<span | |||
v-if="scope.row.poLi[index]" | |||
:class="[classData[scope.row.poLi[index].status]]" | |||
>{{ scope.row.poLi[index].startTime }}</span | |||
> | |||
<span v-else></span> | |||
</template> | |||
</el-table-column> | |||
</el-table> | |||
</div> | |||
<div class="details-wrap"> | |||
<p class="details-title">明细过程数据</p> | |||
<div class="details-table-wrap"> | |||
<el-table v-loading="loading" :data="tableDetailsData" border> | |||
<el-table-column | |||
v-for="item in detailsHeaders" | |||
:key="item" | |||
:label="getColumnName(item)" | |||
:show-overflow-tooltip="true" | |||
align="center" | |||
width="200px" | |||
> | |||
<template slot-scope="scope"> | |||
<span>{{ scope.row[item] }}</span> | |||
</template> | |||
</el-table-column> | |||
</el-table> | |||
</div> | |||
</div> | |||
</div> | |||
</template> | |||
<script> | |||
import {getPotrace, getDetailtrace, getWorkLineList, exportheadexcel } from '@/api/retrospect/product' | |||
export default { | |||
props:{ | |||
item:{ | |||
default:{} | |||
} | |||
}, | |||
data(){ | |||
return{ | |||
classData:{ | |||
39:'status-39', | |||
40:'status-40' | |||
}, | |||
formData:{ | |||
workOrderId:undefined | |||
}, | |||
workLineArray:[], // 产线数据 | |||
orderStatusArray:[], // 订单状态 | |||
headers:[], | |||
tableData:[], | |||
detailsHeaders:[ | |||
'SerialOrderOPTrace-PO', | |||
'SerialOrderOPTrace-WorkOrderId', | |||
'SerialOrderOPTrace-ArtId', | |||
'SerialOrderOPTrace-RecvData', | |||
'SerialOrderOPTrace-SerialOrderId', | |||
'SerialOrderOPTrace-Status', | |||
'SerialOrderOPTrace-StepDesc', | |||
'SerialOrderOPTrace-WorkPlaceId', | |||
'SerialOrderOPTrace-ExecuteTime', | |||
'SerialOrderOPTrace-Remark1', | |||
], | |||
tableDetailsData:[], | |||
loading:false, | |||
cellItem:{} | |||
} | |||
}, | |||
created(){ | |||
this.getWorkOrderStatus(); | |||
this.getWorkLineList(); | |||
if(this.$route.query['OM_WorkOrder-WorkOrderId']){ | |||
this.formData.workOrderId=this.$route.query['OM_WorkOrder-WorkOrderId']; | |||
} | |||
this.getPotrace(); | |||
}, | |||
methods:{ | |||
// 导出文件 | |||
exportExcel() { | |||
exportheadexcel(this.formData).then((res) => { | |||
window.location.href = `${process.env.VUE_APP_BASE_API}/${res.data}` | |||
}) | |||
}, | |||
// 单击单元格回调 | |||
cellClick(row, column, cell, event){ | |||
this.getDetailtrace(row); | |||
}, | |||
// 获取工单下的详细操作数据 | |||
getDetailtrace(row){ | |||
getDetailtrace({serialOrderId: row.serialOrderId}).then(({data})=>{ | |||
this.tableDetailsData=data||[]; | |||
}) | |||
}, | |||
// 搜索 | |||
handleQuery(){ | |||
this.getPotrace(); | |||
}, | |||
// table数据 | |||
getPotrace(){ | |||
getPotrace({ | |||
...this.formData | |||
}).then(({code, data})=>{ | |||
if(code==200){ | |||
this.headers=data.titleLi; | |||
this.tableData=data.data; | |||
} | |||
}) | |||
}, | |||
// 订单生产状态 | |||
getWorkOrderStatus(){ | |||
this.getStanderOne({ statid: 'WorkOrderStatus' }).then(({data}) => { | |||
this.orderStatusArray = (data || []).map(e=>{ | |||
e['stdeftab-stdeftyp'] = parseInt(e['stdeftab-stdeftyp']); | |||
return e; | |||
}) | |||
}) | |||
}, | |||
// 产线列表 | |||
getWorkLineList(){ | |||
getWorkLineList().then(({data=[]})=>{ | |||
this.workLineArray=data; | |||
}) | |||
} | |||
} | |||
} | |||
</script> | |||
<style lang="scss" scoped> | |||
.traceability-details-wrap { | |||
position: relative; | |||
width: 100%; | |||
height: calc(100vh - 50px); | |||
box-sizing: border-box; | |||
.export-btn { | |||
// width: 160px; | |||
// height: 48px; | |||
background: #0a708f; | |||
box-shadow: 0px 6px 8px 0px rgba(24, 59, 70, 0.16); | |||
border-radius: 2px; | |||
} | |||
.table-wrap { | |||
width: 100%; | |||
height: calc(50% - 34px); | |||
border-bottom: 1px solid #dcdfe6; | |||
margin-bottom: 10px; | |||
overflow-y: auto; | |||
} | |||
.details-wrap { | |||
width: 100%; | |||
height: calc(50% - 34px); | |||
.details-title { | |||
width: 100%; | |||
line-height: 40px; | |||
padding: 0; | |||
margin: 0; | |||
background: #dfdfdf; | |||
box-sizing: border-box; | |||
padding-left: 20px; | |||
} | |||
.details-table-wrap { | |||
width: 100%; | |||
height: calc(100% - 40px); | |||
overflow-y: auto; | |||
} | |||
} | |||
.status-39 { | |||
box-sizing: border-box; | |||
padding-left: 23px; | |||
background: url('../../../assets/imgs/status-39.png') no-repeat 0px -2px; | |||
background-size: 23px 23px; | |||
} | |||
.status-40 { | |||
box-sizing: border-box; | |||
padding-left: 23px; | |||
background: url('../../../assets/imgs/status-40.png') no-repeat 0px -2px; | |||
background-size: 23px 23px; | |||
} | |||
} | |||
</style> |
@ -0,0 +1,301 @@ | |||
<template> | |||
<div class="app-container"> | |||
<el-form ref="queryForm" :model="formData" :inline="true"> | |||
<el-form-item :label="getColumnName('OM_WorkOrder-WorkOrderId')"> | |||
<el-input | |||
v-model.trim="formData.WorkOrderId" | |||
placeholder="请输入查询内容" | |||
clearable | |||
size="small" | |||
style="width: 200px" | |||
/> | |||
</el-form-item> | |||
<el-form-item label="项目"> | |||
<el-select | |||
v-model="formData.ProjectId" | |||
clearable | |||
filterable | |||
placeholder="请选择" | |||
style="width: 100%" | |||
> | |||
<el-option | |||
v-for="item in projectArray" | |||
:key="item['ME_Project-ProjectId']" | |||
:label="item['ME_Project-Descr']" | |||
:value="item['ME_Project-ProjectId']" | |||
/> | |||
</el-select> | |||
</el-form-item> | |||
<el-form-item :label="getColumnName('OM_WorkOrder-ArtId')"> | |||
<el-input | |||
v-model.trim="formData.ArtId" | |||
placeholder="请输入查询内容" | |||
clearable | |||
size="small" | |||
style="width: 200px" | |||
/> | |||
</el-form-item> | |||
<el-form-item :label="getColumnName('OM_WorkOrderStatus-Status')"> | |||
<el-select | |||
v-model="formData.status" | |||
clearable | |||
style="width: 100%" | |||
filterable | |||
placeholder="请选择" | |||
> | |||
<el-option | |||
v-for="item in orderStatusArray" | |||
:key="item['stdeftab-stdeftyp']" | |||
:label="item['stdeftab-bez']" | |||
:value="item['stdeftab-stdeftyp']" | |||
/> | |||
</el-select> | |||
</el-form-item> | |||
<el-form-item> | |||
<el-button | |||
type="primary" | |||
icon="el-icon-search" | |||
size="mini" | |||
@click="handleQuery" | |||
>搜索</el-button | |||
> | |||
</el-form-item> | |||
</el-form> | |||
<el-table | |||
v-loading="loading" | |||
:data="tableData" | |||
@expand-change="loadOrderData" | |||
@row-click="setItem" | |||
border | |||
> | |||
<el-table-column type="expand"> | |||
<template slot-scope="scope"> | |||
<el-table :data="scope.row.tableDetailsList" border> | |||
<el-table-column | |||
v-for="(item, index) in detailsHeaders" | |||
:key="index" | |||
:label="getColumnName(item)" | |||
:show-overflow-tooltip="true" | |||
align="center" | |||
> | |||
<template slot-scope="props"> | |||
<div | |||
v-if="item === 'OM_SerialOrder-SerialOrderStatus'" | |||
:class="[ colorClass[scope.row[item]], 'bg-div']" | |||
> | |||
{{ | |||
fieldTrans(props.row[item]['OM_SerialOrderStatus-Status']) | |||
}} | |||
</div> | |||
<span v-else-if="props.row[item] === '19000101000000'" /> | |||
<span v-else-if="item == 'OM_SerialOrder-PlanStartTime'" >{{parseTime(props.row[item])}}</span> | |||
<span v-else-if="item == 'OM_SerialOrder-PlanEndTime'" >{{parseTime(props.row[item])}}</span> | |||
<span v-else-if="item == 'OM_SerialOrder-ActEndTime'" >{{parseTime(props.row[item])}}</span> | |||
<span v-else>{{ props.row[item] }}</span> | |||
</template> | |||
</el-table-column> | |||
</el-table> | |||
</template> | |||
</el-table-column> | |||
<el-table-column | |||
v-for="item in headers" | |||
:key="item" | |||
:label="getColumnName(item)" | |||
:show-overflow-tooltip="true" | |||
align="center" | |||
width="156px" | |||
> | |||
<template slot-scope="scope"> | |||
<span v-if="item === 'OM_WorkOrder-PlantNr'">{{ | |||
getValue(scope.row['OM_WorkOrder-PlantNr']) | |||
}}</span> | |||
<span v-else-if="scope.row[item] === '19000101000000'" /> | |||
<div v-else-if="item === 'OM_WorkOrder-LastModify'"> | |||
{{ parseTime(scope.row[item]) }} | |||
</div> | |||
<div v-else-if="item === 'OM_WorkOrder-CreateTime'"> | |||
{{ parseTime(scope.row[item]) }} | |||
</div> | |||
<div v-else-if="item === 'OM_WorkOrder-PlanStartTime'"> | |||
{{ parseTime(scope.row[item]) }} | |||
</div> | |||
<div v-else-if="item === 'OM_WorkOrder-PlanEndTime'"> | |||
{{ parseTime(scope.row[item]) }} | |||
</div> | |||
<div v-else-if="item === 'OM_WorkOrder-ActStartTime'"> | |||
{{ parseTime(scope.row[item]) }} | |||
</div> | |||
<div v-else-if="item === 'OM_WorkOrder-ActEndTime'"> | |||
{{ parseTime(scope.row[item]) }} | |||
</div> | |||
<div | |||
v-else-if="item === 'OM_WorkOrderStatus-Status'" | |||
:class="[colorClass[scope.row[item]], 'bg-div'] " | |||
> | |||
{{ fieldTrans(scope.row[item]) }} | |||
</div> | |||
<div v-else-if="item === 'OM_WorkOrder-OrderType'"> | |||
{{ orderTypeTrans(scope.row[item]) }} | |||
</div> | |||
<span v-else>{{ scope.row[item] }}</span> | |||
</template> | |||
</el-table-column> | |||
</el-table> | |||
<pagination | |||
v-show="pagination.total > 0" | |||
:total="pagination.total" | |||
:page.sync="pagination.pageNumber" | |||
:limit.sync="pagination.pageSize" | |||
@pagination="getTableData" | |||
/> | |||
</div> | |||
</template> | |||
<script> | |||
import {getWorkorderList, getSerialOrder, getProjectList} from '@/api/retrospect/workOrderTraceability' | |||
export default { | |||
data(){ | |||
return{ | |||
loading:false, | |||
formData:{}, | |||
pagination:{ | |||
pageNumber: 1, | |||
pageSize: 10, | |||
total:0 | |||
}, | |||
colorClass:{ | |||
10:'not-plan-bg', | |||
20:'has-plan-bg', | |||
24:'has-lock-bg', | |||
26:'has-issued-bg', | |||
39:'interrupt-bg', | |||
40:'in-production-bg', | |||
80:'has-complete-bg', | |||
90:'has-shipment-bg', | |||
95:'freeze-bg', | |||
98:'has-cancel-bg', | |||
}, | |||
headers:[ | |||
'OM_WorkOrder-PlantNr', | |||
'OM_WorkOrder-WorkOrderId', | |||
'OM_WorkOrderStatus-Status', | |||
'OM_WorkOrder-ArtId', | |||
'OM_WorkOrder-CustArtId', | |||
'OM_WorkOrder-ProjectId', | |||
'OM_WorkOrder-OrderType', | |||
'OM_WorkOrder-ErpOrderId', | |||
'OM_WorkOrder-ParentOrderId', | |||
'OM_WorkOrder-UsedResourceId', | |||
'OM_WorkOrder-PlanQty', | |||
'OM_WorkOrder-PlanStartTime', | |||
'OM_WorkOrder-PlanEndTime', | |||
'OM_WorkOrder-ActStartTime', | |||
'OM_WorkOrder-ActEndTime' | |||
], // 外层表格表头 | |||
detailsHeaders:[ | |||
'OM_SerialOrder-WorkOrderId', | |||
'OM_SerialOrder-SerialOrderId', | |||
'OM_SerialOrder-PlanResourceId', | |||
'OM_SerialOrder-UsedResourceId', | |||
'OM_SerialOrder-PlanQty', | |||
'OM_SerialOrder-ProjectId', | |||
'OM_SerialOrder-SerialOrderStatus', | |||
'OM_SerialOrder-PlanStartTime', | |||
'OM_SerialOrder-PlanEndTime', | |||
'OM_SerialOrder-ActEndTime', | |||
], // 明细表头 | |||
tableData:[], // table数据 | |||
projectArray:[],// 项目定义数据 | |||
orderStatusArray:[], // 订单状态 | |||
orderTypeArray:[], // 订单类型 | |||
} | |||
}, | |||
methods:{ | |||
setItem(row){ | |||
this.$router.push({ | |||
path: '/retrospect/product', | |||
query: row | |||
}) | |||
}, | |||
// 获取明细 | |||
loadOrderData(row) { | |||
if(row.tableDetailsList.length>0){ | |||
return; | |||
} | |||
getSerialOrder({workOrderId: row['OM_WorkOrder-WorkOrderId']}).then(({code, data=[]})=>{ | |||
if(code==200 && data){ | |||
this.tableData.forEach(e=>{ | |||
if(e['OM_WorkOrder-WorkOrderId'] == row['OM_WorkOrder-WorkOrderId']){ | |||
e.tableDetailsList=data||[] | |||
} | |||
}) | |||
} | |||
}) | |||
}, | |||
// 搜索 | |||
handleQuery(){ | |||
this.pagination.pageNumber=1; | |||
this.getTableData(); | |||
}, | |||
// 获取列表数据 | |||
getTableData(){ | |||
this.loading=true; | |||
getWorkorderList({...this.formData, ...this.pagination}).then(({code, data:{records=[], count=0}})=>{ | |||
this.loading=false; | |||
if(code==200){ | |||
this.tableData=(records || []).map(e=>{ | |||
e.tableDetailsList=[]; | |||
return e; | |||
}); | |||
this.pagination.count=count; | |||
}else{ | |||
this.tableData=[]; | |||
this.pagination.count=0; | |||
} | |||
}).catch(()=>{ | |||
this.loading=false; | |||
}) | |||
}, | |||
// 获取项目定义数据 | |||
getProject(){ | |||
getProjectList().then(({data}) => { | |||
this.projectArray = data || [] | |||
}) | |||
}, | |||
// 订单生产状态 | |||
getWorkOrderStatus(){ | |||
this.getStanderOne({ statid: 'WorkOrderStatus' }).then(({data}) => { | |||
this.orderStatusArray = (data || []).map(e=>{ | |||
e['stdeftab-stdeftyp'] = parseInt(e['stdeftab-stdeftyp']); | |||
return e; | |||
}) | |||
}) | |||
}, | |||
// 订单状态字段转换 | |||
fieldTrans(value) { | |||
const item = this.orderStatusArray.find(e=>e['stdeftab-stdeftyp'] === value); | |||
return item&&item['stdeftab-bez'] || value; | |||
}, | |||
// 订单类型字段转换 | |||
orderTypeTrans(value) { | |||
const item = this.orderTypeArray.find(e=>e['stdeftab-stdeftyp'] === value); | |||
return item&&item['stdeftab-bez'] || value; | |||
}, | |||
// 订单类型 | |||
getOrderType(){ | |||
this.getStanderOne({ statid: 'OM_OrderType' }).then(res => { | |||
this.orderTypeArray = res.data | |||
}) | |||
}, | |||
}, | |||
created(){ | |||
this.getProject(); | |||
this.getOrderType(); | |||
this.getWorkOrderStatus(); | |||
}, | |||
mounted(){ | |||
this.getTableData(); | |||
} | |||
} | |||
</script> |