Browse Source

Merge branch 'langfang-develop' of http://101.201.121.115:3000/leo/LAPP_GAAS_GFrame_WEBFRONT into langfang-test

langfang-test
liwei 3 years ago
parent
commit
4570afd38b
7 changed files with 660 additions and 0 deletions
  1. +32
    -0
      src/api/retrospect/product.js
  2. +25
    -0
      src/api/retrospect/workOrderTraceability.js
  3. BIN
      src/assets/imgs/status-39.png
  4. BIN
      src/assets/imgs/status-40.png
  5. +1
    -0
      src/main.js
  6. +301
    -0
      src/views/retrospect/product/index.vue
  7. +301
    -0
      src/views/retrospect/workOrderTraceability/index.vue

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

@ -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'
})
}

+ 25
- 0
src/api/retrospect/workOrderTraceability.js View File

@ -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
})
}

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

+ 1
- 0
src/main.js View File

@ -73,3 +73,4 @@ new Vue({
store,
render: h => h(App)
})
console.log('语言');

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

@ -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>

+ 301
- 0
src/views/retrospect/workOrderTraceability/index.vue View File

@ -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>

Loading…
Cancel
Save