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

任务接收页面开发

parent ef1d7fbf
...@@ -97,7 +97,7 @@ const mutations = { ...@@ -97,7 +97,7 @@ const mutations = {
const actions = { const actions = {
activeModel({ commit, state }, model) { activeModel({ commit, state }, model) {
// if (!state.activeModel || model.appId !== state.activeModel.id || (model.appId === 'todoTask' && state.activeModel.id !== 'todoTask')) { // 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', { commit('SET_ACTIVE_MODEL', {
id: model.appId, id: model.appId,
path: { ...model.pageInfo } path: { ...model.pageInfo }
......
...@@ -7,6 +7,7 @@ ...@@ -7,6 +7,7 @@
> >
<component <component
:is="componentName" :is="componentName"
:module="module"
/> />
<div :class="['delete-box', showDelete && 'show']"> <div :class="['delete-box', showDelete && 'show']">
<img src="/images/navagations/delete-icon.png" alt="" @click.stop="remove"> <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>
<!--
* @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) { ...@@ -7,3 +7,8 @@ export function countOfType(params) {
export function getMessageNum(params) { export function getMessageNum(params) {
return get(`/Notify/findIsReadNum`, 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