Browse Source

2024-04-30 工艺路线配置优化,增加分页,联动,提示

master_hella_20240701
zhousq 7 months ago
parent
commit
3198cf8d08
  1. 146
      src/views/mes/processroute/components/configDialog.vue
  2. 6
      src/views/mes/processroute/components/graphbase.data.ts
  3. 131
      src/views/mes/workScheduling/components/Detail.vue
  4. 6
      src/views/mes/workScheduling/index.vue
  5. 18
      src/views/mes/workScheduling/workScheduling.data.ts

146
src/views/mes/processroute/components/configDialog.vue

@ -12,8 +12,8 @@
<div class="font-size-18px">
<el-row :gutter="10">
<el-col :span="22">
{{ titleValueRef }}
<el-tag type="info">[{{ titleNameRef }}]</el-tag>
{{ titleNameRef }}
<el-tag type="primary">[{{ titleValueRef }}]</el-tag>
</el-col>
<el-col :span="2">
<el-button size="primary" @click="saveResult()" style="width: 100%">
@ -37,7 +37,7 @@
>添加工序</el-button>
</div>
</template>
<el-table :data="processData" ref="tableProcess" style="width: 100%; height: 80%;border: 1px;" @cell-dblclick="userAddNode">
<el-table :data="showProcessNodeData" ref="tableProcess" style="width: 100%; height: 80%;border: 1px;" @cell-dblclick="userAddNode">
<el-table-column prop="code" label="工序编码" />
<el-table-column prop="name" label="工序名称" />
<el-table-column prop="oper" label="操作" width="60">
@ -48,6 +48,17 @@
</template>
</el-table-column>
</el-table>
<el-pagination
small
hide-on-single-page="true"
layout="prev, pager, next"
:total="page.total"
:page-size="page.size"
:current-page="page.current"
@current-change="handleCurrentChange"
@prev-click="handlePrevClick"
@next-click="handleNextClick"
/>
</el-card>
</el-col>
<el-col :span="12"><div ref="graphContainer" style="width: 90%; height: 90%"></div>
@ -81,8 +92,9 @@
<span>工艺路线基本信息</span>
</div>
</template>
<p >工艺路线名称<span v-if="productData!=null">{{ productData.name }}</span></p>
<p >工艺路线编码<span v-if="productData!=null">{{ productData.name }}</span></p>
<p >工艺路线名称<span >{{titleNameRef}}</span></p>
<p >工艺路线编码<span >{{titleValueRef}}</span></p>
<p >产品名称<span v-if="productData!=null">{{ productData.name }}</span></p>
<p>产品编码<span v-if="productData!=null">{{ productData.code }}</span></p>
<p>产品描述<span v-if="productData!=null">{{ productData.desc1 }}</span></p>
@ -92,23 +104,34 @@
><el-card class="footer-card">
<template #header>
<div class="card-header">
<span>物料信息</span>
<span>物料信息</span><el-tag type="primary">[{{ currentNode.name }}]</el-tag>
</div>
</template>
<el-table :data="materialData" ref="tableMaterial" style="width: 100%; height: 80%;overflow-y: auto;">
<el-table :data="showMaterialsData" ref="tableMaterial" style="width: 100%; height: 80%;overflow-y: auto;">
<!-- <el-table-column prop="name" label="物料名称"/> -->
<el-table-column prop="componentItemCode" label="物料编码"/>
<el-table-column prop="version" label="版本号"/>
<el-table-column prop="componentQty" label="物料数量"/>
</el-table>
<el-pagination
small
hide-on-single-page="true"
layout="prev, pager, next"
:total="pageM.total"
:page-size="pageM.size"
:current-page="pageM.current"
@current-change="handleCurrentChangeM"
@prev-click="handlePrevClickM"
@next-click="handleNextClickM"
/>
</el-card></el-col
>
<el-col :span="6"
><el-card class="footer-card">
<template #header>
<div class="card-header">
<span>模具信息</span>
<span>模具信息</span><el-tag type="primary">[{{ currentNode.name }}]</el-tag>
</div>
</template>
<el-table :data="mouldData" ref="tableMould" style="width: 100%; height: 80%;overflow-y: auto;">
@ -121,7 +144,7 @@
><el-card class="footer-card">
<template #header>
<div class="card-header">
<span>工位信息</span>
<span>工位信息</span><el-tag type="primary">[{{ currentNode.name }}]</el-tag>
</div>
</template>
<el-table :data="workStationList" ref="tableWorkstation" style="width: 100%; height: 80%;overflow-y: auto;">
@ -154,6 +177,7 @@ const message = useMessage() // 消息弹窗
//const { t } = useI18n() //
const route = useRoute() //
const routeName = ref()
const currentNode=ref({code:'',name:''})
routeName.value = route.name
routeName.value = routeName.value.substring(0, routeName.value.length - 4) + 'ProcessRouteConfig'
//const updateKey = ref(0)
@ -165,6 +189,22 @@ const tableProcess = ref()
const productData = ref({ name: '', code: '', desc1: '--' }) //
const materialData=ref()
const mouldData = ref()
const page=ref({
total:0,
current:1,
size:5
})
const pageM=ref({
total:0,
current:1,
size:5
})
const showProcessNodeData=ref() //
const showMaterialsData=ref() //
const productCode=ref()
//
const graph = ref<Graph>()
const rowData = ref()
const workStationList = ref() //
//
const annexData = reactive({
@ -203,23 +243,25 @@ const searchTableSuccess = (formField, searchField, val, type, row) => {
if(val.length>0){
val.forEach(item=>{
if(processData.value.find(obj=>obj.code==item.code)==undefined){
processData.value.push({code:item.code,name:item.name})}
processData.value.push({code:item.code,name:item.name})
page.value.total=processData.value.length
showProcessNodeData.value=processData.value.slice((page.value.current-1)*page.value.size,page.value.size)
}
})
}
}
const deleteNode=(row)=>{
processData.value.splice(processData.value.indexOf(row),1)
page.value.total=processData.value.length
page.value.current=1
graph.value.removeNode(row.code)
}
const productCode=ref()
//
const graph = ref<Graph>()
const rowData = ref()
const openDetail = (row: any) => {
rowData.value = row
console.log('rowData',rowData.value)
titleNameRef.value = rowData.value.processrouteCode
titleValueRef.value = rowData.value.processName
titleNameRef.value = rowData.value.processName
titleValueRef.value =rowData.value.processrouteCode
processRouteId.value = rowData.value.id
productCode.value=rowData.value.productCode
routeVersion.value=rowData.value.routeVersion
@ -264,7 +306,7 @@ const getProcessInfo = async (id: any) => {
/** 获取产品信息 */
const getItembasicInfo = async (code: String) => {
const res = await ProcessrouteApi.getProductInfo(code)
console.log('productData',res)
//console.log('productData',res)
productData.value = res
}
/** 获取物料列表 */
@ -302,28 +344,37 @@ const getProcessList = async (code) => {
//console.log('code',code)
const res = await ProcessrouteApi.getProcessrouteNodeList(code)
processData.value = res
showProcessNodeData.value=processData.value.slice((page.value.current-1)*page.value.size,page.value.size)
//return res
}
//
const nodeClick = (e, x, y, node, view) => {
currentNode.value.code=node.id
currentNode.value.name=node.attrs.title.text
Promise.all([
getProcessInfo(node.id),
getProcessBomList(productCode.value,node.id),
getPatternPage(node.id),
getWorkstationPage(node.id)
]).then(([processIndoList,basicBom, patternPage,workstationInfoList]) => {
]).then(([processInfoList,basicBom, patternPage,workstationInfoList]) => {
//
//message.info(JSON.stringify(processIndoList))
console.log('basicBom',basicBom)
//console.log('basicBom',basicBom)
//
materialData.value = basicBom
pageM.value.total=materialData.value.length
pageM.value.current=1
showMaterialsData.value=materialData.value.slice((pageM.value.current-1)*pageM.value.size,pageM.value.size)
//
mouldData.value = patternPage.list
//
workStationList.value = workstationInfoList.list
}).catch(error => {
console.error("Error:", error);
//console.error("Error:", error);
materialData.value = []
showMaterialsData.value=[]
pageM.value.total=materialData.value.length
pageM.value.current=1
mouldData.value = []
workStationList.value = []
});
@ -362,6 +413,7 @@ const userAddNode = (row) => {
// ]
})
}
nodeClick(undefined,undefined, undefined, node_template, graph.value)
}
}
//-------
@ -382,7 +434,7 @@ const saveResult = async () => {
return
}
let gdata = {
processrouteCode: titleNameRef.value,
processrouteCode: titleValueRef.value,
routeVersion:routeVersion.value,
graphJson: graph.value.toJSON(),
processrouteId: processRouteId.value
@ -442,6 +494,58 @@ const deleteAnnexSuccess = async () => {
getFileList()
getChangeRecordList()
}
const handleCurrentChange=(value: number)=>{
let index=(value-1)*page.value.size
page.value.current=value
//console.log('index',index)
showProcessNodeData.value=processData.value.slice(index,index+page.value.size)
//console.log('processData.value-472',processData.value)
//console.log('showProcessNodeData.value-472',showProcessNodeData.value)
}
const handlePrevClick=(value: number)=>{
page.value.current=value-1
if(page.value.current==0) {
page.value.current=1
}
// let index=(value-1)*page.value.size
// showProcessNodeData.value=processData.value.slice(index,page.value.size)
// console.log('showProcessNodeData.value-472',showProcessNodeData.value)
}
const handleNextClick=(value: number)=>{
page.value.current=value+1
if(page.value.current>page.value.total/page.value.size) {
page.value.current=page.value.total/page.value.size -1
}
// let index=(value+1)*page.value.size
// showProcessNodeData.value=processData.value.slice(index,page.value.size)
// console.log('showProcessNodeData.value-472',showProcessNodeData.value)
}
const handleCurrentChangeM=(value: number)=>{
let index=(value-1)*pageM.value.size
pageM.value.current=value
//console.log('index',index)
showMaterialsData.value=materialData.value.slice(index,index+pageM.value.size)
}
const handlePrevClickM=(value: number)=>{
pageM.value.current=value-1
if(pageM.value.current==0) {
pageM.value.current=1
}
// let index=(value-1)*page.value.size
// showProcessNodeData.value=processData.value.slice(index,page.value.size)
// console.log('showProcessNodeData.value-472',showProcessNodeData.value)
}
const handleNextClickM=(value: number)=>{
pageM.value.current=value+1
if(pageM.value.current>pageM.value.total/page.value.size) {
pageM.value.current=page.value.total/pageM.value.size -1
}
// let index=(value+1)*page.value.size
// showProcessNodeData.value=processData.value.slice(index,page.value.size)
// console.log('showProcessNodeData.value-472',showProcessNodeData.value)
}
//
onUnmounted?.(() => {})
const emit = defineEmits(['close'])

6
src/views/mes/processroute/components/graphbase.data.ts

@ -138,7 +138,7 @@ export const start_node = ref({
id: 'startNode',
label: '开始',
x: 50,
y: 200,
y: 100,
attrs: {
body: {
rx: 20,
@ -151,8 +151,8 @@ export const start_node = ref({
//结束节点的定义
export const end_node = ref({
id: 'endNode',
x: 200,
y: 200,
x: 400,
y: 100,
label: '结束',
attrs: {
body: {

131
src/views/mes/workScheduling/components/Detail.vue

@ -28,7 +28,16 @@
<Tabs ref="tabRef" :tabsList="tabsList" :current="current" @change="change" />
<div class="flex">
<!-- 详情 -->
<ContentWrap class="w-[100%]" v-show="tabsList[current].label!=annexAliasLabel&&tabsList[current].label!='备注'&&tabsList[current].label!='变更记录'&&!annexTableData.some(item=>item.label==tabsList[current].label)"> <!-- 列表头部 -->
<ContentWrap
class="w-[100%]"
v-show="
tabsList[current].label != annexAliasLabel &&
tabsList[current].label != '备注' &&
tabsList[current].label != '变更记录' &&
!annexTableData.some((item) => item.label == tabsList[current].label)
"
>
<!-- 列表头部 -->
<TableHead
v-if="!isBasic"
:HeadButttondata="HeadButttondata"
@ -72,7 +81,14 @@
v-model:currentPage="tableObjectRef.currentPage"
>
<template #photos="{ row }">
<div v-for="(item,index) in row.photos.split(',')" :key="index" style="color:#409eff ; cursor: pointer;" @click="openImage(item)">{{ item }}</div> </template>
<div
v-for="(item, index) in row.photos.split(',')"
:key="index"
style="color: #409eff; cursor: pointer"
@click="openImage(item)"
>{{ item }}</div
>
</template>
<template #action="{ row }">
<ButtonBase
:Butttondata="buttondata"
@ -97,10 +113,20 @@
</DetailTable>
</ContentWrap>
<!-- other附件组件:如质检明细 -->
<div v-for="(annexItem ,index) in annexTableData" :key="index" v-show="annexItem.label==tabsList[current].label" class="w-[100%]" :style="{height:annexItem.hasSubDetail?'100%':remarkHeight+'px'}">
<div
v-for="(annexItem, index) in annexTableData"
:key="index"
v-show="annexItem.label == tabsList[current].label"
class="w-[100%]"
:style="{ height: annexItem.hasSubDetail ? '100%' : remarkHeight + 'px' }"
>
<ContentWrap class="w-[100%]">
<ElScrollbar ref="scrollbar" :style="{height:annexItem.hasSubDetail?'100%':(remarkHeight-40)+'px'}">
<Annex v-show="tabsList[current].label==annexItem.label"
<ElScrollbar
ref="scrollbar"
:style="{ height: annexItem.hasSubDetail ? '100%' : remarkHeight - 40 + 'px' }"
>
<Annex
v-show="tabsList[current].label == annexItem.label"
:annexData="annexItem"
@handleAnnexSuccess="updateAnnexTableHandle"
@deleteAnnexSuccess="updateAnnexTableHandle"
@ -120,13 +146,21 @@
v-model:currentPage="tableObjectRef.currentPage"
/>
</ContentWrap>
</div>
<!-- 附件/备注/变更记录 -->
<ContentWrap class="w-[100%]" v-show="tabsList[current].label==annexAliasLabel||tabsList[current].label=='备注'||tabsList[current].label=='变更记录'" :style="{height:remarkHeight+'px'}">
<ContentWrap
class="w-[100%]"
v-show="
tabsList[current].label == annexAliasLabel ||
tabsList[current].label == '备注' ||
tabsList[current].label == '变更记录'
"
:style="{ height: remarkHeight + 'px' }"
>
<!-- 附件组件 -->
<ElScrollbar ref="scrollbar" :style="{height:(remarkHeight-40)+'px'}">
<Annex v-show="tabsList[current].label==annexAliasLabel"
<ElScrollbar ref="scrollbar" :style="{ height: remarkHeight - 40 + 'px' }">
<Annex
v-show="tabsList[current].label == annexAliasLabel"
:annexData="annexData"
@handleAnnexSuccess="handleAnnexSuccess"
@deleteAnnexSuccess="deleteAnnexSuccess"
@ -134,14 +168,20 @@
:key="count"
/>
<!-- 备注组件 -->
<Remarks v-show="tabsList[current].label=='备注'"
<Remarks
v-show="tabsList[current].label == '备注'"
:remarksData="remarksData"
class="mt-20px"
@remarksSubmitScuess="remarksSubmitScuess"
:key="count"
/>
<!-- 变更记录组件 -->
<ChangeRecord v-show="tabsList[current].label=='变更记录'" :changeRecordData="changeRecordData" class="mt-20px" :key="count"/>
<ChangeRecord
v-show="tabsList[current].label == '变更记录'"
:changeRecordData="changeRecordData"
class="mt-20px"
:key="count"
/>
</ElScrollbar>
</ContentWrap>
</div>
@ -173,7 +213,6 @@
</template>
<script lang="ts" setup>
import Annex from '@/components/Annex/src/Annex.vue'
import Remarks from '@/components/Remarks/src/Remarks.vue'
import ChangeRecord from '@/components/ChangeRecord/src/ChangeRecord.vue'
@ -185,7 +224,7 @@ import BasicForm from '@/components/BasicForm/src/BasicForm.vue'
import TableHead from '@/components/TableHead/src/TableHead.vue'
import DetailTable from '@/components/DetailTable/src/DetailTable.vue'
import { SearchTable } from '@/components/SearchTable'
import {defaultFreshBtn} from "@/utils/disposition/defaultButtons";
import { defaultFreshBtn } from '@/utils/disposition/defaultButtons'
defineOptions({ name: 'Detail' })
@ -331,19 +370,19 @@ const props = defineProps({
detailButtonIsShowAdd: {
type: Boolean,
required: false,
default: true
default: false
},
//
detailButtonIsShowEdit: {
type: Boolean,
required: false,
default: true
default: false
},
//
detailButtonIsShowDelete: {
type: Boolean,
required: false,
default: true
default: false
},
//
isOpenSearchTable: {
@ -381,19 +420,24 @@ if (props.isBasic == true) {
}
}
const otherList = [...props.annexTable,{
const otherList = [
...props.annexTable,
{
label: props.annexAliasLabel,
prop: 'Annex'
},{
},
{
label: '备注',
prop: 'Remarks'
},{
},
{
label: '变更记录',
prop: 'ChangeRecord'
}]
}
]
tabsList.value = [...tabsList?.value, ...otherList]
if (!tabsList.value || tabsList.value && tabsList.value.length == otherList.length) {
if (!tabsList.value || (tabsList.value && tabsList.value.length == otherList.length)) {
tabsList.value.unshift({
label: '明细',
prop: 'Detail'
@ -409,11 +453,10 @@ const remarkHeight = computed(() => {
const tab = unref(tabRef)
const tabTop = tab?.$el.getBoundingClientRect().top
const tabHeight = tab?.$el.getBoundingClientRect().height
const height = window.innerHeight - (tabTop) - (tabHeight) - 60
const height = window.innerHeight - tabTop - tabHeight - 60
return height
})
//
const annexData = reactive({
annexList: []
@ -446,7 +489,7 @@ const getAnnexFileList = async (row:id) => {
props.annexTable?.forEach(async (item) => {
let requstData = { ...remarksData.data, tableName: item?.tableName }
const annexList = await FileApi.getFileList(requstData)
const annexData = annexTableData.value.find(annex=>annex.label === item.label)
const annexData = annexTableData.value.find((annex) => annex.label === item.label)
if (annexData) {
annexData.annexList = annexList
} else {
@ -464,9 +507,9 @@ const getAnnexFileList = async (row:id) => {
})
const { getList: getSubList } = subTableMethods
subTableObject.params = {}
item.subDetailTableData.queryParams.forEach(queryItem => {
item.subDetailTableData.queryParams.forEach((queryItem) => {
subTableObject.params[queryItem.queryField] = row[queryItem.rowField]
});
})
await getSubList()
item.subDetailTableData.tableList = subTableObject.tableList
annexItem.subDetailTableData.tableList
@ -495,11 +538,10 @@ const current = ref(0)
const change = (item, index) => {
current.value = index
emit('changeTabs', item)
if(otherList.find(other=>other.label==item.label)){
if (otherList.find((other) => other.label == item.label)) {
// // --
scrollbar.value.scrollTo({ top: 0});
scrollbar.value.scrollTo({ top: 0 })
}
}
//
@ -533,7 +575,10 @@ const searchTableRef = ref()
//
const searchTableFormModel = ref<Recordable>({})
if (props.isOpenSearchTable) {
searchTableFormModel.value = initModel(props.detailAllSchemas.formSchema, unref(searchTableFormModel))
searchTableFormModel.value = initModel(
props.detailAllSchemas.formSchema,
unref(searchTableFormModel)
)
}
const searchTableFormType = ref('') // create - update -
@ -576,9 +621,7 @@ const openDetail = async (row: any, titleName: any, titleValue: any, tableName:
let detailButtonAdd: any = []
if (props.detailButtonIsShowFilter) {
//
detailButtonFilter = [
defaultButtons.defaultFilterBtn(null)
]
detailButtonFilter = [defaultButtons.defaultFilterBtn(null)]
}
if (props.detailButtonIsShowAdd) {
//
@ -588,9 +631,7 @@ const openDetail = async (row: any, titleName: any, titleValue: any, tableName:
})
]
}
let detailButtonRefresh = [
defaultButtons.defaultFreshBtn(null)
]
let detailButtonRefresh = [defaultButtons.defaultFreshBtn(null)]
HeadButttondata.value = [...detailButtonFilter, ...detailButtonAdd, ...detailButtonRefresh]
//
@ -619,7 +660,6 @@ const openDetail = async (row: any, titleName: any, titleValue: any, tableName:
]
}
buttondata.value = [...detailButtonEdit, ...detailButtonDelete, ...props.buttondataTable]
} finally {
detailLoading.value = false
}
@ -684,13 +724,15 @@ const buttonBaseClick = (val, item) => {
})
const item = props.detailAllSchemas.formSchema[0]
opensearchTable(
item.field, item?.componentProps?.searchField,
item.field,
item?.componentProps?.searchField,
item?.componentProps?.searchTitle,
item?.componentProps?.searchAllSchemas,
item?.componentProps?.searchPage,
item?.componentProps?.searchCondition,
item?.componentProps?.multiple,
undefined,undefined
undefined,
undefined
)
} else {
openForm('create')
@ -769,13 +811,15 @@ const buttonTableClick = async (val, row) => {
}
const item = props.detailAllSchemas.formSchema[0]
opensearchTable(
item.field, item?.componentProps?.searchField,
item.field,
item?.componentProps?.searchField,
item?.componentProps?.searchTitle,
item?.componentProps?.searchAllSchemas,
item?.componentProps?.searchPage,
item?.componentProps?.searchCondition,
item?.componentProps?.multiple,
undefined,undefined
undefined,
undefined
)
} else {
openForm('update', row)
@ -815,9 +859,8 @@ const submitForm = async (formType, data) => {
}
}
const searchTableSuccess1 = (formField, searchField, val, formRef) => {
searchTableFormModel.value[formField] = val.map(item=>item[searchField]).join(',')
searchTableFormModel.value[formField] = val.map((item) => item[searchField]).join(',')
submitForm(searchTableFormType.value, searchTableFormModel.value)
emit('searchTableSuccessDetail', formField, searchField, val, formRef)
}
@ -920,7 +963,7 @@ watch(
tableObject.params.schedulingCode = masterParmas.value.schedulingCode
detailAllSchemasRef.value = props.detailAllSchemas
if (props.tableObjectExtend) {
props.tableObjectExtend.forEach(item => {
props.tableObjectExtend.forEach((item) => {
tableObject.params[item.key] = item.value
})
}

6
src/views/mes/workScheduling/index.vue

@ -60,9 +60,9 @@
:apiCreate="WorkSchedulingDetailApi.createWorkSchedulingDetail"
:apiUpdate="WorkSchedulingDetailApi.updateWorkSchedulingDetail"
:apiDelete="WorkSchedulingDetailApi.deleteWorkSchedulingDetail"
:detailButtonIsShowAdd="true"
:detailButtonIsShowEdit="true"
:detailButtonIsShowDelete="true"
:detailButtonIsShowAdd="false"
:detailButtonIsShowEdit="false"
:detailButtonIsShowDelete="false"
@handleMainFefresh="handleMainFefresh"
@searchTableSuccessDetail="searchTableSuccessDetail"
:key="count"

18
src/views/mes/workScheduling/workScheduling.data.ts

@ -380,13 +380,13 @@ export const WorkSchedulingDetail = useCrudSchemas(reactive<CrudSchema[]>([
isForm:false,
isDetail:false,
},
{
label: '操作',
field: 'action',
isForm: false,
table: {
width: 150,
fixed: 'right'
}
}
// {
// label: '操作',
// field: 'action',
// isForm: false,
// table: {
// width: 150,
// fixed: 'right'
// }
// }
]))

Loading…
Cancel
Save