派工管理添加查询汇报详情功能
This commit is contained in:
parent
3a7ffef12f
commit
8f2faf04b0
@ -71,5 +71,11 @@ export const submitLogApi = {
|
|||||||
//汇报统计
|
//汇报统计
|
||||||
statistics(params?: {time?:string; type?:string}){
|
statistics(params?: {time?:string; type?:string}){
|
||||||
return request({url:'/mes/report/statistics',method:'get',params})
|
return request({url:'/mes/report/statistics',method:'get',params})
|
||||||
|
},
|
||||||
|
|
||||||
|
|
||||||
|
//按派工单id查询汇报
|
||||||
|
getByDispatch(dispatchId:number){
|
||||||
|
return request({url:`/mes/report/bydispatch/${dispatchId}`,method:"get"})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -243,6 +243,21 @@ const formRules = {
|
|||||||
// 表格列
|
// 表格列
|
||||||
const columns: DataTableColumns<SubmitLog> = [
|
const columns: DataTableColumns<SubmitLog> = [
|
||||||
{ type: 'selection' },
|
{ type: 'selection' },
|
||||||
|
{ title: '物料名称', key: 'materialName',align: 'center',
|
||||||
|
render(rowData, rowIndex) {
|
||||||
|
return rowData.materialName? rowData.materialName: '-'
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{ title: '物料编码', key: 'materialCode',align: 'center',
|
||||||
|
render(rowData, rowIndex) {
|
||||||
|
return rowData.materialCode? rowData.materialCode: '-'
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{ title: '物料数量', key: 'materialQty',align: 'center',
|
||||||
|
render(rowData, rowIndex) {
|
||||||
|
return rowData.materialQty? rowData.materialQty: '-'
|
||||||
|
},
|
||||||
|
},
|
||||||
{ title: '工序名称', key: 'processName',align: 'center' },
|
{ title: '工序名称', key: 'processName',align: 'center' },
|
||||||
{ title: '工序编号', key: 'processCode',align: 'center' },
|
{ title: '工序编号', key: 'processCode',align: 'center' },
|
||||||
{ title: '派工编号', key: 'assingCode',align: 'center' },
|
{ title: '派工编号', key: 'assingCode',align: 'center' },
|
||||||
|
|||||||
@ -259,6 +259,76 @@
|
|||||||
</template>
|
</template>
|
||||||
</n-modal>
|
</n-modal>
|
||||||
|
|
||||||
|
|
||||||
|
<!--查询汇报详情-->
|
||||||
|
|
||||||
|
<n-modal v-model:show="reportDetailVisible" preset="card" :title="reportDetailTitle" style="width: 800px">
|
||||||
|
<n-card hoverable style="margin-bottom: 12px" >
|
||||||
|
<template #header>
|
||||||
|
<div style="display:flex;justify-content:space-between;align-items:center;width:100%">
|
||||||
|
<span>主表信息</span>
|
||||||
|
<n-button text @click="infoIsCollapse = !infoIsCollapse">
|
||||||
|
<n-icon :component="infoIsCollapse ? ArrowDownOutline : ArrowUpOutline" />
|
||||||
|
</n-button>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
<n-descriptions :column="3" bordered v-show="!infoIsCollapse">
|
||||||
|
<n-descriptions-item
|
||||||
|
v-for="item in mappedInfoList"
|
||||||
|
:key="item.key"
|
||||||
|
:label="item.label"
|
||||||
|
>
|
||||||
|
{{ formatDisplayValue(item.key, item.value) }}
|
||||||
|
</n-descriptions-item>
|
||||||
|
</n-descriptions>
|
||||||
|
</n-card>
|
||||||
|
<n-card title="汇报信息" hoverable style="margin-bottom: 12px" >
|
||||||
|
<div v-if="qualityTestings.length === 0" style="height:520px;display:flex;align-items:center;justify-content:center;color:#999">
|
||||||
|
暂无质检单据数据
|
||||||
|
</div>
|
||||||
|
<n-tabs
|
||||||
|
type="line"
|
||||||
|
animated
|
||||||
|
placement="left"
|
||||||
|
style="height: 520px"
|
||||||
|
v-else>
|
||||||
|
<n-tab-pane
|
||||||
|
v-for="item in qualityTestings"
|
||||||
|
:name="item.qcNo"
|
||||||
|
:tab="item.qcNo">
|
||||||
|
<n-card title="质检基础信息" style="margin-bottom:12px">
|
||||||
|
<n-descriptions :column="3">
|
||||||
|
<n-descriptions-item label="资源类型">{{formatDisplayValue("resourceType",item.resourceType) }}</n-descriptions-item>
|
||||||
|
<n-descriptions-item label="质检状态">{{formatDisplayValue("status",item.qcStatus) }}</n-descriptions-item>
|
||||||
|
<n-descriptions-item label="总数量">{{ item.totalQty }}</n-descriptions-item>
|
||||||
|
</n-descriptions>
|
||||||
|
</n-card>
|
||||||
|
|
||||||
|
<!--汇报表格-->
|
||||||
|
<n-card title="汇报列表">
|
||||||
|
<n-data-table
|
||||||
|
:columns="submitColumns"
|
||||||
|
:data="item.submitLogs"
|
||||||
|
:scroll-x="700"
|
||||||
|
max-height="320"
|
||||||
|
:pagination="{ pageSize:3 }"
|
||||||
|
>
|
||||||
|
<!--空数据提示插槽-->
|
||||||
|
<template #empty>
|
||||||
|
<div style="padding:40px;text-align:center;color:#999">
|
||||||
|
当前没有数据
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
</n-data-table>
|
||||||
|
|
||||||
|
</n-card>
|
||||||
|
|
||||||
|
</n-tab-pane>
|
||||||
|
|
||||||
|
</n-tabs>
|
||||||
|
</n-card>
|
||||||
|
</n-modal>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
@ -273,6 +343,7 @@ import {
|
|||||||
|
|
||||||
import {
|
import {
|
||||||
NButton,
|
NButton,
|
||||||
|
NDropdown,
|
||||||
NIcon,
|
NIcon,
|
||||||
NSpace,
|
NSpace,
|
||||||
NPagination,
|
NPagination,
|
||||||
@ -283,14 +354,12 @@ import {
|
|||||||
//useDialog,
|
//useDialog,
|
||||||
type FormInst,
|
type FormInst,
|
||||||
} from 'naive-ui'
|
} from 'naive-ui'
|
||||||
|
import {
|
||||||
import {
|
SearchOutline, RefreshOutline, AddOutline, TrashOutline, CreateOutline, CloudUploadOutline, DownloadOutline,
|
||||||
SearchOutline,
|
EllipsisHorizontalOutline, ArrowDownOutline, ArrowUpOutline
|
||||||
RefreshOutline
|
|
||||||
} from '@vicons/ionicons5'
|
} from '@vicons/ionicons5'
|
||||||
|
|
||||||
import { useUserStore } from '@/stores/user'
|
import { useUserStore } from '@/stores/user'
|
||||||
|
import { dictDataApi } from '@/api/org'
|
||||||
import {
|
import {
|
||||||
disworlist,
|
disworlist,
|
||||||
editdiswor,
|
editdiswor,
|
||||||
@ -299,6 +368,9 @@ import {
|
|||||||
//workload
|
//workload
|
||||||
} from '@/api/production'
|
} from '@/api/production'
|
||||||
|
|
||||||
|
import { submitLogApi } from '@/api/submitLog'
|
||||||
|
import { an } from 'vue-router/dist/router-CWoNjPRp.mjs'
|
||||||
|
|
||||||
//const dialog = useDialog()
|
//const dialog = useDialog()
|
||||||
|
|
||||||
const message = useMessage()
|
const message = useMessage()
|
||||||
@ -308,6 +380,40 @@ const userStore = useUserStore()
|
|||||||
// 权限检查
|
// 权限检查
|
||||||
const hasPermission = (permission: string) => userStore.hasPermission(permission)
|
const hasPermission = (permission: string) => userStore.hasPermission(permission)
|
||||||
|
|
||||||
|
//判定状态字典
|
||||||
|
const qcResultTypeOptions = ref<{ label: string; value: any }[]>([])
|
||||||
|
//业务来源字典
|
||||||
|
const qcSourceTypeOptions = ref<{ label: string; value: any }[]>([])
|
||||||
|
//质检状态字典
|
||||||
|
const qcStatusOptions = ref<{ label: string; value: any }[]>([])
|
||||||
|
//派工状态字典
|
||||||
|
const qcAssingStatusOptions = ref<{ label: string; value: any }[]>([])
|
||||||
|
|
||||||
|
//汇报详情
|
||||||
|
|
||||||
|
const infoIsCollapse = ref(false)
|
||||||
|
|
||||||
|
const reportDetailVisible = ref(false)
|
||||||
|
const reportDetailTitle = ref<string>('')
|
||||||
|
|
||||||
|
const mappedInfoList = ref<Array<{ label: string; key: string; value: any }>>([])
|
||||||
|
const qualityTestings = ref<any[]>([])
|
||||||
|
|
||||||
|
const submitColumns = ref([
|
||||||
|
{ title: "提交人", key: "sumbitUser" },
|
||||||
|
{ title: "提交时间", key: "submitCreateTime" },
|
||||||
|
{ title: "提交数量", key: "quantity" },
|
||||||
|
{ title: "单据状态", key: "submitStatus",
|
||||||
|
render: (row) => {
|
||||||
|
const val = row.submitStatus
|
||||||
|
const opt = qcResultTypeOptions.value.find(o => o.value === val || String(o.value) === String(val))
|
||||||
|
if (!opt) return val ?? '-'
|
||||||
|
|
||||||
|
return h(NTag, { type: opt.class, size: 'small' }, { default: () => opt.label })
|
||||||
|
}
|
||||||
|
}
|
||||||
|
])
|
||||||
|
|
||||||
|
|
||||||
// ==================== 搜索表单 ====================
|
// ==================== 搜索表单 ====================
|
||||||
const searchForm = reactive({
|
const searchForm = reactive({
|
||||||
@ -491,52 +597,79 @@ const columns = [
|
|||||||
width: 200,
|
width: 200,
|
||||||
fixed: 'right',
|
fixed: 'right',
|
||||||
render(row:any) {
|
render(row:any) {
|
||||||
const buttons:any = [
|
return h('div',{ style: { display: 'flex', alignItems: 'center', gap: '8px', flexWrap: 'nowrap' } },[
|
||||||
|
h(NButton, { size: 'small', quaternary: true, onClick: () => handleEdit(row) }, {
|
||||||
// h(NButton, {
|
default: () => [h(NIcon, null, { default: () => h(CreateOutline) }), ' 编辑']
|
||||||
// size: 'small',
|
}),
|
||||||
// type:'warning',
|
h(NDropdown, {
|
||||||
// ghost:true,
|
trigger:'click',
|
||||||
// onClick: () => handleEdit(row) },
|
options:[
|
||||||
// //{ default: () => [h(NIcon, null, { default: () => h(CreateOutline) }), ' 暂停' ]}
|
{label:"改派",key:'transfer'},
|
||||||
// { default: () => '暂停'}
|
{type: 'divider' }, // 分割线
|
||||||
// )
|
{label:'暂停',key:'pauseResume'},
|
||||||
]
|
{type: 'divider' }, // 分割线
|
||||||
|
{label:'查看汇报',key:'view'},
|
||||||
|
],
|
||||||
|
onSelect:(key:string)=>{
|
||||||
|
switch(key) {
|
||||||
|
case "transfer":
|
||||||
|
handlreass(row)
|
||||||
|
break
|
||||||
|
case "pauseResume":
|
||||||
|
handlpause(row)
|
||||||
|
break
|
||||||
|
case "view":
|
||||||
|
handleViewReport(row.id)
|
||||||
|
break
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},{
|
||||||
|
// 下拉触发按钮:三点图标 / 更多文字
|
||||||
|
default: () => h(NButton, { size: 'small', quaternary: true }, {
|
||||||
|
default: () => [h(NIcon, null, { default: () => h(EllipsisHorizontalOutline) })]
|
||||||
|
})
|
||||||
|
})
|
||||||
|
])
|
||||||
|
|
||||||
|
|
||||||
|
// const buttons:any = [
|
||||||
|
// ]
|
||||||
|
|
||||||
if(hasPermission('biz:assingWork:edit')){
|
// if(hasPermission('biz:assingWork:edit')){
|
||||||
buttons.push(h(NButton, {
|
// buttons.push(h(NButton, {
|
||||||
size: 'small',
|
// size: 'small',
|
||||||
type:'primary',
|
// type:'primary',
|
||||||
ghost:true,
|
// ghost:true,
|
||||||
onClick: () => { handleEdit(row) } },
|
// onClick: () => { handleEdit(row) } },
|
||||||
//{ default: () => [h(NIcon, null, { default: () => h(CreateOutline) }), ' 编辑' ]}
|
// //{ default: () => [h(NIcon, null, { default: () => h(CreateOutline) }), ' 编辑' ]}
|
||||||
{ default: () => '编辑'}
|
// { default: () => '编辑'}
|
||||||
))
|
// ))
|
||||||
}
|
// }
|
||||||
if(hasPermission('biz:assingWork:transfer')){
|
// if(hasPermission('biz:assingWork:transfer')){
|
||||||
buttons.push(h(NButton, {
|
// buttons.push(h(NButton, {
|
||||||
size: 'small',
|
// size: 'small',
|
||||||
type:'success',
|
// type:'success',
|
||||||
ghost:true,
|
// ghost:true,
|
||||||
onClick: () => { handlreass(row) } },
|
// onClick: () => { handlreass(row) } },
|
||||||
{ default: () => '改派'}
|
// { default: () => '改派'}
|
||||||
))
|
// ))
|
||||||
}
|
// }
|
||||||
if(hasPermission('biz:assingWork:pauseResume')){
|
// if(hasPermission('biz:assingWork:pauseResume')){
|
||||||
buttons.push(h(NButton, {
|
// buttons.push(h(NButton, {
|
||||||
size: 'small',
|
// size: 'small',
|
||||||
type:'warning',
|
// type:'warning',
|
||||||
ghost:true,
|
// ghost:true,
|
||||||
onClick:()=>{ handlpause(row) }
|
// onClick:()=>{ handlpause(row) }
|
||||||
},
|
// },
|
||||||
{ default: () => '暂停'}
|
// { default: () => '暂停'}
|
||||||
))
|
// ))
|
||||||
}
|
// }
|
||||||
// buttons.push(
|
// buttons.push(
|
||||||
|
|
||||||
// )
|
// )
|
||||||
|
|
||||||
return buttons.length > 0 ? h(NSpace, {justify:'center'}, { default: () => buttons }) : '-'
|
// return buttons.length > 0 ? h(NSpace, {justify:'center'}, { default: () => buttons }) : '-'
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
@ -747,23 +880,80 @@ function pauseSubmit() {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
// function zantqy(row:any) {
|
async function handleViewReport(id:number) {
|
||||||
// dialog.warning({
|
reportDetailTitle.value='汇报详情'
|
||||||
// title: '温馨提示',
|
reportDetailVisible.value = true
|
||||||
// content: `确定要暂停"${row.processName}"吗?`,
|
|
||||||
// positiveText: '确定',
|
const res = await submitLogApi.getByDispatch(id);
|
||||||
// negativeText: '取消',
|
|
||||||
// onPositiveClick: () => {
|
mappedInfoList.value = [
|
||||||
// pauseresume({}).then(() => {
|
{key:"materialCode",label:"物料编码",value:res.materialCode},
|
||||||
// message.success('操作成功!')
|
{key:"materialName",label:"物料名称",value:res.materialName},
|
||||||
// getlist()
|
{key:"materialQty",label:"物料数量",value:res.materialQty},
|
||||||
// })
|
{key:"processCode",label:"工序编号",value:res.processCode},
|
||||||
// }
|
{key:"processName",label:"工序名称",value:res.processName},
|
||||||
// })
|
{key:"processQty",label:"生产总数",value:res.processQty},
|
||||||
// }
|
{key:"assingCode",label:"派工编号",value:res.assingCode},
|
||||||
|
{key:"workerName",label:"派工人",value:res.workerName},
|
||||||
|
{key:"assingQty",label:"派工数量",value:res.assingQty}
|
||||||
|
]
|
||||||
|
qualityTestings.value = res.qualityTestings
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function formatDisplayValue(key: string, value: any): string {
|
||||||
|
if (value === null || value === undefined) return '-'
|
||||||
|
|
||||||
|
// 根据字段类型格式化
|
||||||
|
switch (key) {
|
||||||
|
case 'resourceType': {
|
||||||
|
const sourceOpt = qcSourceTypeOptions.value.find(o => o.value === value || String(o.value) === String(value))
|
||||||
|
return sourceOpt ? sourceOpt.label : String(value)
|
||||||
|
}
|
||||||
|
case 'status': {
|
||||||
|
const statusOpt = qcStatusOptions.value.find(o => o.value === value || String(o.value) === String(value))
|
||||||
|
return statusOpt ? statusOpt.label : String(value)
|
||||||
|
}
|
||||||
|
|
||||||
|
case 'qcNo':
|
||||||
|
return value ? new Date(value).toLocaleString('zh-CN') : '-'
|
||||||
|
case 'inspectTime':
|
||||||
|
case 'createTime':
|
||||||
|
case 'updateTime':
|
||||||
|
return value ? new Date(value).toLocaleString('zh-CN') : '-'
|
||||||
|
default:
|
||||||
|
return String(value)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// 加载字典选项
|
||||||
|
async function loadDictOptions() {
|
||||||
|
try {
|
||||||
|
const data = await dictDataApi.listByType('qc_result_type')
|
||||||
|
qcResultTypeOptions.value = data.map(d => ({ label: d.dictLabel, value: (Number(d.dictValue) || d.dictValue),class:d.listClass }))
|
||||||
|
}catch {}
|
||||||
|
try {
|
||||||
|
const data = await dictDataApi.listByType('source_type')
|
||||||
|
qcSourceTypeOptions.value = data.map(d => ({ label: d.dictLabel, value: (Number(d.dictValue) || d.dictValue),class:d.listClass }))
|
||||||
|
}catch {}
|
||||||
|
try {
|
||||||
|
const data = await dictDataApi.listByType('qc_status')
|
||||||
|
qcStatusOptions.value = data.map(d => ({ label: d.dictLabel, value: (Number(d.dictValue) || d.dictValue),class:d.listClass }))
|
||||||
|
}catch {}
|
||||||
|
try {
|
||||||
|
const data = await dictDataApi.listByType('assing_status')
|
||||||
|
qcAssingStatusOptions.value = data.map(d => ({ label: d.dictLabel, value: (Number(d.dictValue) || d.dictValue),class:d.listClass }))
|
||||||
|
}catch {}
|
||||||
|
}
|
||||||
|
|
||||||
onMounted(() => {
|
onMounted(() => {
|
||||||
|
|
||||||
getlist()
|
getlist()
|
||||||
|
loadDictOptions()
|
||||||
//workload()
|
//workload()
|
||||||
|
|
||||||
})
|
})
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user