Commit 5185ca3a authored by 旭艳's avatar 旭艳

任务接收页面开发

parent ef1d7fbf
......@@ -97,7 +97,7 @@ const mutations = {
const actions = {
activeModel({ commit, state }, model) {
// if (!state.activeModel || model.appId !== state.activeModel.id || (model.appId === 'todoTask' && state.activeModel.id !== 'todoTask')) {
if (model.appId === 'todoTask' || model.appId === 'myMessage') { // 待办任务页特殊处理
if (model.appId === 'todoTask' || model.appId === 'myMessage' || model.appId === 'myTaskReceive' || model.appId === 'myCheckTaskReceive' || model.appId === 'myAirTaskReceive') { // 待办任务页特殊处理
commit('SET_ACTIVE_MODEL', {
id: model.appId,
path: { ...model.pageInfo }
......
......@@ -7,6 +7,7 @@
>
<component
:is="componentName"
:module="module"
/>
<div :class="['delete-box', showDelete && 'show']">
<img src="/images/navagations/delete-icon.png" alt="" @click.stop="remove">
......
<template>
<dee-dialog
id="dee-dialog"
title="设备使用登记"
:dialog-visible.sync="visible"
width="90%"
custom-class="mobile-dialog"
:before-close="handleClose"
>
<dee-form
ref="form"
:form="form"
:form-data="formFileds"
:rules="rules"
form-btn-position="center"
label-width="110px"
/>
<section class="btn">
<el-button
:disabled="disabled"
type="primary"
size="medium"
@click="save"
>确定</el-button>
<el-button
:disabled="disabled"
size="medium"
@click="handleClose"
>取消</el-button>
</section>
</dee-dialog>
</template>
<script>
export default {
components: {
},
props: {
rowId: {
type: Number,
default: () => {}
}
},
data() {
var validateAssemblyStartTime = (rule, value, callback) => {
// 开始年份验证
if (value === undefined) {
callback(new Error('请选择开始时间'))
} else {
if (this.form.assemblyEndTime !== undefined) {
if (value > this.form.assemblyEndTime) {
callback(new Error('开始时间不能大于结束时间'))
}
callback()
}
}
}
var validateassemblyEndTime = (rule, value, callback) => {
// 结束年份验证
if (value === undefined) {
callback(new Error('请选择结束时间'))
} else {
callback()
}
}
return {
visible: false,
disabled: false,
rowData: null,
form: {},
rules: {
jobNo: [{ required: true, message: '请输入作业令号', trigger: 'change' }],
assemblyStartTime: [{ validator: validateAssemblyStartTime, required: true, trigger: 'change' }],
assemblyEndTime: [{ validator: validateassemblyEndTime, required: true, trigger: 'change' }]
},
formFileds: [
{
split: 1,
data: [
{
title: '设备型号',
key: 'facilityNum',
component: {
name: 'el-select',
clearable: true,
placeholder: '请选择设备型号',
options: [
{ label: '未下达', value: 'N' },
{ label: '己下达', value: 'Y' },
{ label: '执行中', value: 'Running' },
{ label: '已完工', value: 'Finish' }
]
}
},
{
title: '设备名称',
key: 'facilityName',
component: {
name: 'el-input',
clearable: true,
placeholder: '请输入设备名称'
}
},
{
title: '设备编码',
key: 'facilityEncipher',
component: {
name: 'el-input',
clearable: true,
placeholder: '请输入设备名称'
}
},
{
title: '设备使用开始时间',
key: 'assemblyStartTime',
component: {
disabled: false,
clearable: true,
name: 'el-date-picker',
placeholder: '请选择开始时间',
type: 'date',
format: 'yyyy 年 MM 月 dd 日',
'value-format': 'yyyy-MM-dd'
}
},
{
title: '设备使用结束时间',
key: 'assemblyEndTime',
component: {
clearable: true,
name: 'el-date-picker',
placeholder: '请选择完成时间',
type: 'date',
format: 'yyyy 年 MM 月 dd 日',
'value-format': 'yyyy-MM-dd'
}
}
]
}
]
}
},
created() {
},
methods: {
// 打开弹出框
open(row = {}) {
this.visible = true
this.form = { ...row }
if (row.id) {
this.form.supplier =
this.form.supplier && this.form.supplier.id
? this.form.supplier.id
: ''
}
this.$refs.form && this.$refs.form.reset()
},
/**
* 保存功能
* 根据是否有id处理创建和编辑逻辑
*/
save() {
this.$refs.form.validate((valid) => {
if (!valid) {
// this.$utils.showMessageWarning('请完整填写表单')
return false
}
console.log(this.rowData)
if (this.form.id === undefined) {
if (this.rowData === null) {
this.$message({
message: '请选择表格里的数据',
type: 'warning'
})
return
}
this.form.airModelId = this.rowData.dxProcessMaterialId
this.form.sortiesId = this.rowData.id
const params =
{
operator: 'ADD',
dxClassname: 'com.tf.mes.vo.schedule.ORProductionVo',
id: '',
subTypeName: 'OrProduction',
jobNo: this.form.jobNo,
statusCode: 'N',
assemblyStartTime: this.form.assemblyStartTime,
assemblyEndTime: this.form.assemblyEndTime,
airModelId: this.form.airModelId,
isValid: 'Y',
airModelIdType: this.rowData.dxProcessMaterialIdType,
sortiesId: this.form.sortiesId,
sortiesIdType: this.rowData.subTypeName
}
this.disabled = true
this.HttpRequest('/ORProduction/recursion', params, 'post').then(res => {
this.reset('创建')
this.rowData = null
}).catch(err => {
console.log(err)
this.$set(this.form, 'airModelId', this.rowData.dxProcessMaterial.resName)
this.$set(this.form, 'sortiesId', this.rowData.serialNo)
}).finally(() => {
this.disabled = false
})
} else {
const params = {
'operator': 'MODIFY',
'id': this.form.id,
'jobNo': this.form.jobNo,
'assemblyStartTime': this.form.assemblyStartTime,
'assemblyEndTime': this.form.assemblyEndTime
}
this.disabled = true
this.HttpRequest('/ORProduction/recursion', params, 'post').then(res => {
this.reset('编辑')
}).catch(err => {
console.log(err)
}).finally(() => {
this.disabled = false
})
}
})
},
// 删除接口
remove(row) {
const params = {
operator: 'REMOVE',
id: row.id
}
this.$confirm('确定删除此条数据?', '删除确认', {
type: 'error'
})
.then(() => {
this.HttpRequest(`/ORProduction/recursion`, params, 'POST')
.then((res) => {
console.log(res)
this.reset('删除')
})
.catch((err) => console.log(err))
.finally(() => {})
})
.catch(() => {})
},
// 重置弹出框
reset(message) {
this.visible = false
this.$message({
message: `${message}成功`,
type: 'success'
})
this.$emit('reload')
},
// 取消
handleClose() {
this.$refs.form.reset()
this.visible = false
this.rowData = null
},
// 弹框里的表格行点击
rowClick(row) {
this.$set(this.form, 'airModelId', row.dxProcessMaterial.resName)
this.$set(this.form, 'sortiesId', row.serialNo)
this.rowData = row
},
/**
* 下达
*/
transmit() {
if (this.rowId === null) {
this.$message({
message: '请选择表格里的数据',
type: 'warning'
})
return
}
this.HttpRequest(`/ORProduction/production/release?id=${this.rowId}`, {}, 'post').then(res => {
this.reset('下达')
}).catch(err => {
console.log(err)
}).finally(() => {
})
}
}
}
</script>
<style lang="scss">
#dee-dialog {
.el-form-item__label {
width: 140px !important;
// background: red;
}
.el-form-item__content {
margin-left: 150px !important;
}
.dialogTable {
height: 168px;
overflow: auto;
margin-bottom: 29px;
.el-table{
height: 100%;
}
}
.btn{
text-align: center;
margin-bottom: 20px;
}
}
</style>
<template>
<div class="process-page">
<div v-loading="processLoading" class="ipad-body">
<el-row v-if="processData.length" :gutter="10">
<el-col v-for="item in processData" :key="item.id" :lg="8" :md="12">
<div class="p-item" @click="routerAssemblyExecution(item)">
<a :name="item.code" />
<div class="process-header">
<div class="status-box" :class="item.status">
{{ item.status | statusFilters(joExecutePlanStateData) }}
</div>
<div class="h-title">
<div class="t-text" :title="item.code">
{{ item.code }}{{ item.gaceVersion | gaceVersionFilters }}
</div>
<div class="sub-t-text">
{{ item.task }}
</div>
</div>
<div class="h-percent">{{ item.percent | proporFilters }}</div>
</div>
<div class="process-body">
<div class="top-content">
<div>
<div>架次:{{ item.sortie }}</div>
<div>
<!-- <div :title="item.operator | userFilters"> -->
操作工:<span
v-show="item.masterOprName"
style="color:red"
>{{ item.masterOprName }}</span>
<!-- {{ item.operator | userFiltersName(item.masterOprName) }} -->
{{ item.operator }}
</div>
<div
:class="[item.priorCompletion === '是' ? 'blue' : 'red']"
>
前置完成情况:{{ item.priorCompletion }}
</div>
<div>开始计划时间: {{ item.start }}</div>
<div>结束计划时间: {{ item.end }}</div>
<!-- <div :title="item.inspector | userFilters">
检验员:{{ item.inspector | userFilters }}
</div> -->
<div :title="item.inspector">
检验员:{{ item.inspector }}
</div>
<!-- <div>配套率:{{ item.ready | proporFilters }}</div> -->
<div>配套状态:{{ item.outStatus | outStatusFilters }}</div>
<div v-show="!item.isOK" class="upgrade">
升版中
</div>
</div>
<div>
<div v-show="item.firstCheckFlag === '是'">
<span>首件检验</span>
</div>
<div v-show="item.isQualified">
<span>不合格品</span>
</div>
<div v-show="item.isExit === '是'">
<span>AAD CONF INSP REQ' D</span>
</div>
<div v-show="item.isException">
<span>例外放行</span>
</div>
</div>
</div>
<div class="bottom-content">
当前第<span style="color: rgb(203, 144, 127)">{{
item.step
}}</span>步 共{{ item.countStep }}
</div>
</div>
</div>
</el-col>
</el-row>
<div v-else class="process-page-not">暂无数据</div>
</div>
</div>
</template>
<script>
// import Dialog from './dialog'
// import TimeToSee from '@/views/mes/programExecutionManagement/assemblyPerform/components/TimeToSee/index'
// import $ from 'jquery'
import { post } from '@/utils/http'
export default {
name: 'TaskReceiveCard',
// components: { Dialog },
filters: {
gaceVersionFilters(version) {
if (version) {
return '/' + version
}
return ''
},
statusFilters: function(status, joExecutePlanStateData) {
var row = joExecutePlanStateData.filter((p) => p.value === status)
if (row && row.length) {
return row[0].label
}
return ''
},
outStatusFilters: function(str) {
var text = ''
switch (str) {
case 'NotMatch':
text = '未配套'
break
case 'PartMatch':
text = '部分配套'
break
case 'AllMatch':
text = '已配套'
break
default:
text = ''
}
return text
},
proporFilters: function(number) {
if (!number) return 0 + '%'
return Math.round(number * 1000) / 10 + '%'
},
userFilters: function(arr) {
if (!arr || !arr.length) return ''
return arr.map((p) => p.userName).join('、')
},
userFiltersName: function(arr, name) {
if (!arr || !arr.length) return ''
var vice =
arr
.filter((t) => t.userName !== name)
.map((p) => p.userName)
.join('、') || ''
return name && vice ? ', ' + vice : vice
}
},
data() {
return {
joExecutePlanStateData: [],
colorObj: {
1: '#6BA8E6',
2: '#65B46D'
},
processData: [],
processLoading: true,
timer: null,
transverse: false,
openShow: true,
isDrag: false,
aoName: '',
searchElement: []
}
},
computed: {},
watch: {
$route: {
handler(to, from) {
if (
to &&
to.name === 'taskReceive' &&
from &&
from.name === 'assemblyPerform'
) {
this.getTaskAcceptance()
}
},
// deep: true,
immediate: true
}
},
created() {
this.getJoExecutePlanState()
},
// mounted() {
// this.getTaskAcceptance()
// },
methods: {
routerAssemblyExecution(item) {
// if (!item.isOK) {
// this.$message({
// message: '版本不一致,等待计划更新!',
// type: 'warning'
// })
// return
// }
this.$router.push({
name: 'assemblyPerform',
query: {
id: item.id,
materNo: item.materNo,
airModelId: item.airModelId,
sortiesId: item.sortiesId,
isOK: item.isOK
}
})
},
getTaskAcceptance() {
const that = this
var param = {
'searchQueryCondition': {
'searchItems': {
'children': [
{
'items': [
{
'fieldName': 'planState',
'operator': 'IN',
'value': [
'Delivery',
'Run'
]
},
{
'fieldName': 'prodTask.extProcessSkillUser.dxUserInfoId',
'operator': 'EQ',
'value': 1626781927440
}
],
'operator': 'AND'
},
{
'items': [
{
'fieldName': 'extProcessPlan.serialNumber',
'operator': 'LIKE',
'value': ''
},
{
'fieldName': 'extProcessPlan.name',
'operator': 'LIKE',
'value': ''
}
],
'operator': 'OR'
}
],
'items': [],
'operator': 'AND'
},
'openProps': [
{
'name': 'extProcessPlan'
},
{
'name': 'prodTask',
'openProps': [
{
'name': 'extProcessSkillUser'
}
]
}
],
'sortItem': [
{
'fieldName': 'modifyTime',
'sortOrder': 'desc'
}
],
'toValidateKeys': ''
},
'searchItem': {
'fieldName': 'joExecuteOpPlan.status',
'operator': 'IN',
'value': [
'Yes',
'UnderTest'
]
},
'operator': 'NEQ'
}
that.processLoading = true
post('/JoExecutePlan/getTaskAcceptance', param)
.then((res) => {
if (res && res.items) {
const operator = []
const inspector = []
console.log(res.items)
if (res.items) {
res.items.forEach(item => {
if (item.prodTask) {
item.prodTask.forEach(element => {
if (element.subTypeName === 'CheckOut') {
inspector.push(element.extProcessSkillUser.dxUserInfo.name)
} else if (element.subTypeName === 'FitOut') {
operator.push(element.extProcessSkillUser.dxUserInfo.name)
}
})
}
})
}
console.log(operator, inspector)
that.processData = res.items.map((p) => {
return {
id: p.id,
status: p.planState,
code: p.extProcessPlan.serialNumber,
sortie: p.extProcessPlan.sorties,
// percent:
// p.isOkOpPlan && p.allOpPlan ? p.isOkOpPlan / p.allOpPlan : 0,
operator: operator.join(' '),
priorCompletion: p.preIsAccomplish,
start: p.scheduledStart,
end: p.scheduledEnd,
inspector: inspector.join(' '),
task: p.extProcessPlan.materName,
gaceVersion: p.extProcessPlan.gaceVersion,
ready: p.extProcessPlan.fitRates,
// outStatus: p.outStatus,
// step: p.isOkOpPlan,
// countStep: p.allOpPlan,
firstCheckFlag: p.extProcessPlan.firstCheckFlag,
// // 不合格产品
// isQualified: p.isQualified,
isExit: p.isExit
// isOK: p.isOK,
// // 例外放行
// isException: p.isException
}
})
} else {
this.$message({
showClose: true,
message: res.message,
type: 'error'
})
}
})
.catch((err) => console.error(err))
.finally(() => {
that.processLoading = false
})
},
/**
* 获取作业计划状态
*/
getJoExecutePlanState() {
const that = this
that.processData = []
this.$utils.getDicListByCode('PlanState').then(res => {
that.joExecutePlanStateData = res
that.getTaskAcceptance()
})
}
}
}
</script>
<style lang="scss">
// @import "../../../../../../icons/app/iconfont.css";
@keyframes glow {
0% {
box-shadow: 2px 3px 16px 0px rgba(208, 208, 208, 0.5);
border: 1px solid rgba(213, 217, 220, 1);
}
100% {
// border: 1px solid #73b9ec;
// box-shadow: 2px 3px 16px 0px rgb(177, 220, 241);
border: 1px solid red;
box-shadow: 2px 3px 16px 0px red;
}
}
.process-page {
height: 20px;
flex-grow: 1;
width: 100%;
box-sizing: border-box;
display: flex;
flex-direction: column;
background-color: #f2f1f1;
.process-page-not {
display: flex;
align-items: center;
justify-content: center;
height: 100%;
}
.ipad-body {
height: 20px;
margin: 20px 20px 0 20px;
flex-grow: 1;
overflow: hidden;
.el-row {
height: 100%;
margin-right: 0px !important;
overflow: auto;
.p-item {
width: 100%;
height: 300px;
background: rgba(244, 247, 248, 1);
box-shadow: 2px 3px 16px 0px rgba(208, 208, 208, 0.5);
border-radius: 6px;
overflow: hidden;
border: 1px solid rgba(213, 217, 220, 1);
margin-bottom: 10px;
display: flex;
flex-direction: column;
cursor: pointer;
&:hover {
border: 1px solid #73b9ec;
box-shadow: 2px 3px 16px 0px rgb(177, 220, 241);
}
.process-header {
height: 70px;
background: #fff;
position: relative;
display: flex;
justify-content: space-between;
align-items: center;
.status-box {
position: absolute;
left: 0px;
top: 12px;
height: 30px;
line-height: 30px;
padding-left: 10px;
width: 74px;
background: rgba(90, 195, 140, 1);
box-shadow: 1px 1px 5px 0px rgba(184, 193, 186, 0.99);
border-radius: 2px;
color: #fff;
&.Finish {
background-color: #97b552;
border: 1px solid #97b552;
}
&.Not {
background-color: #cccccc;
border: 1px solid #cccccc;
}
&.levelNew {
background-color: #59c4e6;
border: 1px solid #59c4e6;
}
&.Reserved {
background-color: #c1232b;
border: 1px solid #c1232b;
}
&.Delivery {
background-color: #65b46d;
border: 1px solid #65b46d;
}
&.Run {
background-color: #37a2da;
border: 1px solid #37a2da;
}
&.Paused {
background-color: #8a7ca8;
border: 1px solid #8a7ca8;
}
&.Issued {
background-color: #f160c1;
border: 1px solid #f160c1;
}
}
.h-title {
padding-left: 92px;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
.t-text {
font-size: 20px;
color: #5c5c5c;
overflow: hidden; /* 超出部分隐藏 */
white-space: nowrap; /* 文本不换行 */
text-overflow: ellipsis; /* 省略的文本用省略号表示 */
}
.sub-t-text {
color: #8a8a8a;
font-size: 16px;
overflow: hidden; /* 超出部分隐藏 */
white-space: nowrap; /* 文本不换行 */
text-overflow: ellipsis; /* 省略的文本用省略号表示 */
}
}
.h-percent {
color: #e68c5c;
padding-right: 10px;
font-size: 30px;
font-weight: normal;
}
}
.process-body {
flex: 1;
position: relative;
background-image: url(/images/plane-bac.png);
background-repeat: no-repeat;
background-position: bottom left;
display: flex;
flex-direction: column;
&::after {
content: "";
position: absolute;
left: 20px;
right: 20px;
bottom: 51px;
border-top: 1px dotted #c8d1db;
}
.top-content {
padding-left: 20px;
display: flex;
justify-content: space-between;
position: relative;
> div:first-child {
display: flex;
justify-content: center;
flex-direction: column;
line-height: 28px;
font-size: 12px;
overflow: hidden; /* 超出部分隐藏 */
white-space: nowrap; /* 文本不换行 */
text-overflow: ellipsis; /* 省略的文本用省略号表示 */
.blue {
color: blue;
}
.red {
color: red;
}
.upgrade {
position: absolute;
border: 4px solid red;
width: 150px;
height: 150px;
border-radius: 50%;
text-align: center;
line-height: 150px;
z-index: 55;
color: red;
margin-left: 25px;
font-size: 24px;
font-weight: bold;
background: linear-gradient(
135deg,
transparent 49.5%,
transparent 49.5%,
red 52%,
transparent 50.5%
);
}
}
> div:last-child {
display: flex;
flex-direction: column;
justify-content: space-evenly;
font-size: 12px;
position: absolute;
height: 100%;
right: 0;
> div {
&:not(:nth-child(3)) {
margin-right: 30px;
}
> span {
white-space: nowrap;
background-color: #fff;
border: 3px solid red;
color: red;
font-weight: bold;
padding: 3px 6px;
}
&:nth-child(3) {
span {
border-bottom-right-radius: 50%;
border-top-right-radius: 50%;
}
}
}
}
}
.bottom-content {
height: 50px;
display: flex;
justify-content: flex-end;
align-items: center;
padding-right: 50px;
}
}
}
.p-item.arrow_box {
animation: glow 800ms ease-out infinite alternate;
}
}
}
.ipad-footer {
height: 58px;
background: #fff;
border-top: 1px solid #dadada;
display: flex;
justify-content: center;
z-index: 2001;
.btn-box {
position: relative;
.btn-box-content {
background-image: url(/images/footline.png);
background-repeat: no-repeat;
position: absolute;
height: 92px;
background-size: contain;
width: 140px;
display: flex;
justify-content: center;
align-items: center;
z-index: 10;
left: -70px;
bottom: 0;
.scan-btn {
width: 70px;
height: 70px;
background: linear-gradient(
192deg,
rgba(52, 159, 49, 1) 0%,
rgba(79, 108, 187, 1) 100%
);
border-radius: 35px;
display: flex;
justify-content: center;
align-items: center;
img {
width: 40px;
height: 40px;
}
}
}
}
}
.right-side {
position: fixed;
right: 0px;
bottom: 0px;
background-color: #fff;
text-align: center;
line-height: 29px;
z-index: 10;
overflow: auto;
// &:hover {
// overflow: auto;
// right: 6px;
// }
dd.el-popover__reference {
padding: 10px;
font-size: 14px;
color: #666;
cursor: pointer;
i {
font-size: 30px;
color: #409eff;
}
p {
white-space: nowrap;
display: flow-root;
text-align: center;
}
&:hover i {
color: #fff;
}
&:hover {
color: #fff;
background-color: #409eff;
}
}
> dd {
padding: 10px;
display: inherit;
cursor: pointer;
color: #666;
font-size: 14px;
p {
white-space: nowrap;
display: flow-root;
text-align: center;
}
.icon {
width: 1em;
height: 1em;
vertical-align: -0.15em;
fill: currentColor;
overflow: hidden;
font-size: 30px;
color: #409eff;
}
.icon,
.iconfont {
font-size: 30px;
color: #409eff;
}
&:hover {
color: #fff;
background-color: #409eff;
}
&:hover .iconfont {
color: #fff;
}
}
}
}
.fuzzy-search-popper > .body > footer {
margin-top: 15px;
text-align: right;
>a{
margin-left:15px;
&:hover{
color:#409eff;
}
}
}
</style>
<!--
* @Author: ljm
* @Date: 2021-04-15
* @LastEditTime:
* @Description: 任务接收
* @FilePath: applications/dee-mes/src/viewsapplications/dee-mes/src/views/mes/programExecutionManagement/taskReceive/components/taskReceiveTable/index
-->
<template>
<section class="taskReceiveTable">
<div class="header">
<div>
<div>
机型:
<el-select
v-model="model"
size="small"
placeholder="请选择"
:loading="modelLoading"
clearable
@change="getAddRecursion"
>
<el-option
v-for="item in modelData"
:key="item.id"
:label="item.resName"
:value="item.id"
/>
</el-select>
</div>
<div>
架次:
<el-select
v-model="sorties"
size="small"
clearable
placeholder="请选择"
:loading="sortiesLoading"
>
<el-option
v-for="item in sortiesData"
:key="item.id"
:label="item.serialNo"
:value="item.id"
/>
</el-select>
</div>
<div>
关键字:
<el-input
v-model="aoName"
clearable
size="small"
placeholder="请输入内容"
/>
</div>
<div>
<el-button size="small" type="primary" @click="getTableData">查询</el-button>
<el-button size="small" @click="resetForm">重置</el-button>
</div>
</div>
<span>
<el-button
size="small"
@click="$parent.isShow = true"
>视图切换</el-button>
</span>
</div>
<Table ref="table" />
</section>
</template>
<script>
import Table from './table'
export default {
name: 'TaskReceiveTable',
components: {
Table
},
data() {
return {
model: null,
modelLoading: false,
modelData: [],
sorties: null,
sortiesLoading: false,
sortiesData: [],
aoName: null
}
},
created() {},
mounted() {
this.getAddModel(true)
},
methods: {
/**
* 获取新增机型
*/
getAddModel(status) {
const param = {
indices: ['DxProcessProduct'],
sortItem: [
{
fieldName: 'modifyTime',
sortOrder: 'desc'
}
]
}
this.HttpRequest('/DxProcessProduct/find/recursion', param, 'post')
.then((res) => {
this.modelData = []
if (res.items && res.items.content) {
this.modelData = res.items.content
this.$nextTick(() => {
if (this.modelData.length) {
this.model = this.modelData[0].id
this.getAddRecursion(status)
}
})
} else {
this.$message({
showClose: true,
message: res.message,
type: 'error'
})
}
})
.catch((err) => console.error(err))
.finally(() => {
this.$nextTick(() => {
this.modelLoading = false
})
})
},
/**
* 获取架次数据
*/
getAddRecursion(status) {
this.sortiesLoading = true
if (!this.model) {
this.sortiesData = []
this.sorties = null
}
const param = {
indices: ['DxProcessMaterialLot'],
openProps: [
{
name: 'dxProcessMaterial',
searchItems: {
items: [
{
fieldName: 'id',
operator: 'EQ',
value: this.model
}
],
operator: 'AND'
},
parentFilter: true
}
],
searchItems: {
items: [
{
fieldName: 'dxProcessPlanIdType',
operator: 'EQ',
value: 'DxProcessPlan'
}
],
operator: 'AND'
},
sortItem: [
{
fieldName: 'modifyTime',
sortOrder: 'desc'
}
]
}
this.HttpRequest('/DxProcessMaterialLot/find/recursion', param, 'post')
.then((res) => {
this.sortiesData = []
if (res) {
this.sortiesData = res && res.items && res.items.content
this.$nextTick(() => {
if (this.sortiesData.length) {
this.sorties = this.sortiesData[0].id
if (status) {
this.getTableData()
}
}
})
} else {
this.$message({
showClose: true,
message: res.message,
type: 'error'
})
}
})
.catch((err) => console.error(err))
.finally(() => {
this.$nextTick(() => {
this.sortiesLoading = false
})
})
},
resetForm() {
this.model = this.modelData[0].id
this.aoName = null
this.getAddRecursion(true)
},
getTableData() {
this.$nextTick(() => {
this.$refs.table.getTableData()
})
}
}
}
</script>
<style lang="scss">
.taskReceiveTable {
width: 100%;
box-sizing: border-box;
padding: 20px;
height: 20px;
flex-grow: 1;
.header {
display: flex;
justify-content: space-between;
white-space: nowrap;
margin-bottom: 15px;
> div:first-child {
display: flex;
> div {
margin-right: 40px;
align-items: center;
display: flex;
> .el-select {
width: 150px;
}
> .el-input {
width: 260px;
}
}
}
}
> section {
height: calc(100% - 45px);
.el-table td .el-button {
padding: 0;
}
.el-table thead th {
color: #2e2e2e;
font-weight: 700;
font-size: 14px;
padding: 0;
background-color: #f3f6f7;
line-height: 46px !important;
}
.el-pagination {
margin: 10px;
padding: 0;
text-align: right;
}
}
}
</style>
<template>
<section>
<!-- 表格 -->
<el-table
v-loading="loading"
:data="tableData"
border
height="100%"
size="mini"
>
<el-table-column type="index" width="60" align="center" label="序号" />
<el-table-column
prop="dxProcessPlanAssemblyUnitNo"
label="装配单元"
min-width="120"
align="center"
show-overflow-tooltip
/>
<el-table-column
prop="serialNumber"
label="AO号"
min-width="220"
align="center"
show-overflow-tooltip
>
<template slot-scope="scope">
<el-button type="text" @click="routerAssemblyExecution(scope.row)">{{
scope.row.serialNumber
}}</el-button>
</template>
</el-table-column>
<el-table-column
v-for="item in tableColums1"
:key="item.key"
:prop="item.key"
:label="item.title"
:min-width="item.width"
:sortable="item.sortable"
align="center"
show-overflow-tooltip
/>
<el-table-column
prop="operating"
label="操作者"
:min-width="100"
sortable
align="center"
show-overflow-tooltip
>
<template slot-scope="scope">
<span style="color:red">{{ scope.row.operating.main }}</span>
<span>{{ scope.row.operating.vice }}</span>
</template>
</el-table-column>
<el-table-column
v-for="item in tableColums2"
:key="item.key"
:prop="item.key"
:label="item.title"
:min-width="item.width"
:sortable="item.sortable"
align="center"
show-overflow-tooltip
/>
</el-table>
<!-- <el-pagination
:current-page="tablePagination.currentPage"
:page-sizes="tablePagination.pageSizes"
:page-size="tablePagination.pageSize"
layout="total, sizes, prev, pager, next, jumper"
:total="tablePagination.total"
@size-change="setPage"
@current-change="setPage($event, true)"
/> -->
</section>
</template>
<script>
export default {
components: {},
data() {
return {
// 加载中
loading: false,
// 分页
tablePagination: {
currentPage: 1,
pageSize: 20,
total: 0,
pageSizes: [10, 20, 50, 100]
},
// 所有可动态配置的表格列
tableColums1: [
// {
// title: 'AO号',
// show: true,
// key: 'serialNumber',
// sortable: true,
// width: '120'
// },
{
title: 'AO名称',
show: true,
key: 'materName',
sortable: true,
width: '180'
},
{
title: '版本',
show: true,
key: 'gaceVersion',
sortable: true,
width: '80'
},
{
title: '计划开始时间',
show: true,
key: 'scheduledStart',
sortable: true,
width: '180'
},
{
title: '计划结束时间',
show: true,
key: 'scheduledEnd',
sortable: true,
width: '180'
},
{
title: '定额工时',
show: true,
key: 'allWorkHour',
sortable: true,
width: '120'
}],
tableColums2: [
{
title: '检验员',
show: true,
key: 'operatorUser',
sortable: true,
width: '120'
},
{
title: '任务状态',
show: true,
key: 'planStateCode',
sortable: true,
width: '120'
},
{
title: '完成百分比',
show: true,
key: 'percentage',
sortable: true,
width: '120'
}
],
// 表格数据
tableData: [],
joExecutePlanStateData: []
}
},
created() {
Promise.all([this.getJoExecutePlanState(), this.getTableData()])
// this.getJoExecutePlanState()
},
mounted() {
// this.getTableData()
},
methods: {
/**
* 获取作业计划状态
*/
getJoExecutePlanState() {
const that = this
var param = {
pageFrom: 1,
pageSize: 100000,
searchItems: {
items: [
{ fieldName: 'dictState', operator: 'EQ', value: 'ENABLE' },
{
fieldName: 'dictCode',
operator: 'EQ',
value: 'JoExecutePlanState'
}
]
},
sortItem: [{ fieldName: 'dictSeq', sortOrder: 'asc' }]
}
this.HttpRequest('DictData/search', param, 'post')
.then((res) => {
if (res) {
if (res.items && res.items.content.length) {
that.joExecutePlanStateData = res.items.content
} else {
that.joExecutePlanStateData = []
}
} else {
this.$message({
showClose: true,
message: res.message,
type: 'error'
})
}
})
.catch((err) => console.error(err))
.finally(() => {})
},
/**
* 页码触发
*/
setPage($event, state) {
if (state) {
this.tablePagination.currentPage = $event
} else {
this.tablePagination.currentPage = 1
this.tablePagination.pageSize = $event
}
this.getTableData()
},
getTableData() {
const that = this
var param = {
indices: ['DxProcessPlan'],
pageFrom: that.tablePagination.currentPage,
pageSize: that.tablePagination.pageSize,
searchItems: {
items: [
{
fieldName: 'id',
operator: 'EQ',
value: localStorage.getItem('userId')
},
{
fieldName: 'serialId',
operator: 'LIKE',
value: this.$parent.sorties
},
{
fieldName: 'aoName',
operator: 'LIKE',
value: this.$parent.aoName
},
{
fieldName: 'isView',
operator: 'LIKE',
value: 'Y'
}
],
operator: 'AND'
},
sortItem: [
{
fieldName: 'modifyTime',
sortOrder: 'desc'
}
]
}
that.processLoading = true
this.HttpRequest('/JoExecutePlan/getTaskAcceptance', param, 'post')
.then((res) => {
if (res && res.items) {
that.tableData = res.items.map((p) => {
var vice = (p.operating &&
p.operating.filter(t => t.userName !== p.masterOprName)
.map((q) => {
return q.userName
})
.join(',')) ||
''
return {
id: p.id,
dxProcessPlanAssemblyUnitNo: p.dxProcessPlanAssemblyUnitNo,
serialNumber: p.ao.serialNumber,
materName: p.ao.materName,
isOK: p.isOK,
gaceVersion: p.ao.gaceVersion,
scheduledStart: p.scheduledStart,
scheduledEnd: p.scheduledEnd,
allWorkHour: p.ao.countWorkHour,
operating: {
main: p.masterOprName || '',
vice: p.masterOprName && vice ? ', ' + vice : vice
},
operatorUser:
(p.examines &&
p.examines
.map((q) => {
return q.userName
})
.join(',')) ||
'',
planStateCode:
(p.planStateCode &&
that.joExecutePlanStateData.filter(
(q) => q.dictKey === p.planStateCode
)[0].dictValue) ||
'',
percentage: (p.isOkOpPlan && p.allOpPlan
? Math.round((p.isOkOpPlan / p.allOpPlan) * 1000) / 10 : 0) +
'%'
}
})
that.tablePagination.total = res.items.total
} else {
this.$message({
showClose: true,
message: res.message,
type: 'error'
})
}
})
.catch((err) => console.error(err))
.finally(() => {
that.processLoading = false
})
},
routerAssemblyExecution(item) {
if (!item.isOK) return
this.$router.push({
name: 'assemblyPerform',
query: {
id: item.id,
materNo: item.materNo,
airModelId: item.airModelId,
sortiesId: item.sortiesId,
isOK: item.isOK
}
})
}
}
}
</script>
<template>
<section class="taskReceive">
<!-- <IpadHeader /> -->
<TaskReceiveCard v-if="isShow" />
<TaskReceiveTable v-else />
</section>
</template>
<script>
// import IpadHeader from '../ipadHeader'
import TaskReceiveCard from './components/taskReceiveCard/index'
import TaskReceiveTable from './components/taskReceiveTable/index'
export default {
name: 'TaskReceive',
components: {
// IpadHeader,
TaskReceiveCard,
TaskReceiveTable
},
data() {
return {
isShow: true
}
}
}
</script>
<style lang="scss">
// @import "/icons/app/iconfont.css";
.taskReceive {
// position: fixed;
// left: 0;
// top: 0px;
// z-index: 1111;
background-color: #fff;
height: 100%; //calc(100vh);
width: 100%; //calc(100vw);
box-sizing: border-box;
display: flex;
flex-direction: column;
}
</style>
......@@ -7,3 +7,8 @@ export function countOfType(params) {
export function getMessageNum(params) {
return get(`/Notify/findIsReadNum`, params)
}
export function getTaskCount(params) {
return get(`/indexTask/task/fitOut`, params)
}
<template>
<div v-if="show&&module.total>0" class="my-custom-module" @click="goModule(module)">
<div class="custom-module-title">{{ module.name }}</div>
<div class="custom-module-content">
<div class="custom-module-content-item">
<img :src="module.icon" alt="">
</div>
<div class="custom-module-content-item custom-module-content-item-total">
{{ module.total }}
</div>
</div>
<div v-if="module.list" class="custom-module-bottom">
<div
v-for="item in module.list"
:key="item.name"
class="custom-module-bottom-item"
style="justify-content: flex-end;"
>
<span class="custom-module-bottom-item-name">{{ item.name }}</span><span>{{ item.value }}</span>
</div>
</div>
</div>
</template>
<script>
import { getTaskCount } from '@/api/workspace.js'
export default {
props: {
module: {
type: Object,
default: null
}
},
data() {
return {
show: false
}
},
watch: {
'module.name': {
immediate: true,
handler: function(val) {
if (val) {
this.getCustomModules(val)
}
}
}
},
// mounted() {
// this.getCustomModules()
// },
methods: {
getCustomModules(data) {
const params = {}
if (data === '装配任务') {
params.type = 'FitOut'
this.module.appId = 'myTaskReceive'
} else if (data === '检验任务') {
params.type = 'CheckOut'
this.module.appId = 'myCheckTaskReceive'
} else {
params.type = 'DMIR'
this.module.appId = 'myAirTaskReceive'
}
getTaskCount(params).then(res => {
this.module.icon = '/images/navagations/task-icon.png'
this.module.total = res.items.count
this.module.list = [{
name: '待办',
value: res.items.count
}]
this.module.serverOriginName = 'dee-mes'
this.module.originRoute = 'dee-mes/taskReception'
this.module.showMenu = false
this.show = true
})
},
async goModule(module) {
this.$router.push({
path: module.originRoute,
// meta: { disnav: false },
query: {
title: module.name,
showMenu: module.showMenu
}
})
this.$store.dispatch('menu/activeModel', {
appId: this.module.appId,
pageInfo: {
title: this.module.name,
path: '/dee-mes/taskReception'
}
})
this.$store.dispatch('app/toggleSideBar')
}
}
}
</script>
<style lang="scss">
.my-custom-module {
height: 173px;
min-width: 179px;
background-color: #fff;
padding: 20px;
box-sizing: border-box;
display: flex;
flex-direction: column;
justify-content: space-between;
position: relative;
overflow: hidden;
border-radius: 4px;
.custom-module-title {
color: #6f6f6f;
font-size: 24px;
font-weight: 500;
text-align: left;
}
.custom-module-content {
display: flex;
align-items: center;
.custom-module-content-item {
flex: 1;
text-align: right;
img {
height: 28px;
}
}
.custom-module-content-item-total {
color: #329d25;
font-size: 38px;
font-weight: 500;
}
}
}
</style>
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment