Browse Source

产品追溯

langfang-develop
liwei 3 years ago
parent
commit
5a2371a7ef
5 changed files with 557 additions and 0 deletions
  1. +33
    -0
      src/api/retrospect/product.js
  2. BIN
      src/assets/imgs/status-39.png
  3. BIN
      src/assets/imgs/status-40.png
  4. +303
    -0
      src/views/retrospect/product/index.vue
  5. +221
    -0
      src/views/retrospect/product/traceabilityDetails.vue

+ 33
- 0
src/api/retrospect/product.js View File

@ -0,0 +1,33 @@
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
})
}
// 获取工单工序追溯数据
export function getPotrace (params) {
return request({
url: '/admin/om/serialorder/potrace',
method: 'get',
params
})
}

BIN
src/assets/imgs/status-39.png View File

Before After
Width: 52  |  Height: 52  |  Size: 1.7 KiB

BIN
src/assets/imgs/status-40.png View File

Before After
Width: 56  |  Height: 56  |  Size: 2.2 KiB

+ 303
- 0
src/views/retrospect/product/index.vue View File

@ -0,0 +1,303 @@
<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"
border
>
<el-table-column type="expand">
<template slot-scope="scope">
<el-table :data="scope.row.tableDetailsList" border @row-click="setItem">
<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"
/>
<TraceabilityDetails v-if="item['OM_SerialOrder-WorkOrderId']" :item="item" @callback="setItem" />
</div>
</template>
<script>
import TraceabilityDetails from './traceabilityDetails.vue';
import {getWorkorderList, getSerialOrder, getProjectList} from '@/api/retrospect/product'
export default {
components:{
TraceabilityDetails
},
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:[], //
item:{}, //
}
},
methods:{
setItem(row){
this.item=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>

+ 221
- 0
src/views/retrospect/product/traceabilityDetails.vue View File

@ -0,0 +1,221 @@
<template>
<el-dialog
style="minwidth: 1560px"
title="产品追溯明细"
visible
width="95%"
:before-close="handleClose"
:close-on-click-modal="false"
>
<div class="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: 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>
<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="180px"
/>
<el-table-column
v-for="(item, index) in headers"
:key="item"
:label="getColumnName(item)"
:show-overflow-tooltip="true"
width="180px"
>
<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 headers"
:key="item"
:label="getColumnName(item)"
:show-overflow-tooltip="true"
align="center"
width="156px"
>
<template slot-scope="scope">
<span>{{ scope.row[item] }}</span>
</template>
</el-table-column>
</el-table>
</div>
</div>
</div>
</el-dialog>
</template>
<script>
import {getPotrace} from '@/api/retrospect/product'
export default {
props:{
item:{
default:{}
}
},
data(){
return{
classData:{
39:'status-39',
40:'status-40'
},
formData:{},
projectArray:[],
orderStatusArray:[],
headers:[],
tableData:[],
tableDetailsData:[],
loading:false,
cellItem:{}
}
},
created(){
this.getPotrace();
},
methods:{
//
cellClick(row){
console.log(row);
this.cellItem=row;
},
//
handleClose(){
this.$emit('callback', {});
},
//
handleQuery(){
},
getPotrace(){
getPotrace({workOrderId:this.item['OM_SerialOrder-WorkOrderId']}).then(({code, data})=>{
if(code==200){
this.headers=data.titleLi;
this.tableData=data.data;
}
})
}
}
}
</script>
<style lang="scss" scoped>
.traceability-details-wrap {
position: relative;
width: 100%;
height: calc( 100vh - 200px );
box-sizing: border-box;
.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>

Loading…
Cancel
Save