mes-vue/src/views/production/dispatchwork/index.vue
2026-06-02 17:05:51 +08:00

775 lines
20 KiB
Vue

<template>
<div class="page-container">
<!-- 用户列表 -->
<n-card class="user-list-card" size="small">
<!-- 搜索表单 -->
<div class="search-form">
<n-form
:model="searchForm"
label-placement="left"
>
<n-grid :cols="24" :x-gap="24">
<n-form-item-gi :span="6" label="工序编码">
<n-input v-model:value="searchForm.processId" placeholder="请输入工序编号" clearable />
</n-form-item-gi>
<n-form-item-gi :span="6" label="工序名称">
<n-input v-model:value="searchForm.processName" placeholder="请输入工序名称" clearable />
</n-form-item-gi>
<n-form-item-gi :span="6" label="工人名称">
<n-input v-model:value="searchForm.stringUserName" placeholder="请输入工人名称" clearable />
</n-form-item-gi>
<!-- <n-form-item-gi :span="6" label="数里">
<n-input v-model:value="searchForm.processId" placeholder="请输入数里" clearable />
</n-form-item-gi> -->
<!-- <n-form-item-gi :span="6" label="是否返工">
<n-input v-model:value="searchForm.processId" placeholder="请选择" clearable />
</n-form-item-gi>
<n-form-item-gi :span="6" label="返工次数">
<n-input v-model:value="searchForm.processId" placeholder="请输入返工次数" clearable />
</n-form-item-gi>
<n-form-item-gi :span="6" label="完成数里">
<n-input v-model:value="searchForm.processId" placeholder="请输入完成数里" clearable />
</n-form-item-gi>
<n-form-item-gi :span="6" label="完成时间">
<n-input v-model:value="searchForm.processId" placeholder="请选择完成时间" clearable />
</n-form-item-gi>
<n-form-item-gi :span="6" label="创建时间">
<n-input v-model:value="searchForm.processId" placeholder="请选择创建时间" clearable />
</n-form-item-gi>
<n-form-item-gi :span="6" label="创建人">
<n-input v-model:value="searchForm.processId" placeholder="请输入创建人" clearable />
</n-form-item-gi> -->
<n-form-item-gi :span="6">
<n-space>
<n-button type="primary" @click="search">
<template #icon><n-icon><SearchOutline /></n-icon></template>
搜索
</n-button>
<!-- <n-button type="primary" @click="search">
<template #icon><n-icon><SearchOutline /></n-icon></template>
我的派工
</n-button> -->
<n-button @click="reset">
<template #icon><n-icon><RefreshOutline /></n-icon></template>
重置
</n-button>
</n-space>
</n-form-item-gi>
</n-grid>
<!-- <n-form-item label="用户类型">
<n-select
v-model:value="searchForm.userType"
placeholder="请选择用户类型"
:options="userTypeOptions"
clearable
style="width: 140px"
/>
</n-form-item> -->
<!-- <n-form-item label="状态">
<n-select
v-model:value="searchForm.status"
placeholder="请选择状态"
:options="statusOptions"
clearable
style="width: 120px"
/>
</n-form-item> -->
</n-form>
</div>
<!-- 表格 -->
<n-data-table
:columns="columns"
size="small"
striped
:data="datalist"
:bordere="false"
:single-line="false"
:loading="loading"
remote
/>
<div class="pagination-container" style="display: flex; justify-content: flex-end; margin-top: 12px">
<n-pagination
v-model:page="pagination.page"
v-model:page-size="pagination.pageSize"
:item-count="pagination.itemCount"
:page-sizes="[10, 20, 50, 100]"
show-size-picker
show-quick-jumper
@update:page="handlePageChange"
@update:page-size="handlePageSizeChange"
>
<template #prefix>
{{ pagination.itemCount }}
</template>
</n-pagination>
</div>
</n-card>
<!-- 新增/编辑弹窗 -->
<n-modal
v-model:show="editmodal"
title="编辑派工单"
preset="card"
style="width: 800px"
:mask-closable="false"
>
<n-form
ref="formRef"
:model="formData"
:rules="rules"
label-placement="left"
label-width="80"
class="modal-form"
>
<n-grid :cols="2">
<!-- <n-gi>
<n-form-item label="工序编号" path="processName">
<n-input v-model:value="formData.processName" placeholder="请输入用户名" :disabled="!!formData.id" />
</n-form-item>
</n-gi> -->
<n-gi>
<n-form-item label="工序名称" path="processName">
<n-input v-model:value="formData.processName" placeholder="请输入工序名称" />
</n-form-item>
</n-gi>
<n-gi>
<n-form-item label="工人名称" path="stringUserName">
<n-input v-model:value="formData.stringUserName" placeholder="请选择工人" />
</n-form-item>
</n-gi>
<n-gi>
<n-form-item label="数量" path="quantity">
<n-input v-model:value="formData.quantity" placeholder="请输入数量" />
</n-form-item>
</n-gi>
<n-gi>
<n-form-item label="是否返工" path="rework">
<n-input v-model:value="formData.rework" placeholder="请输入" />
</n-form-item>
</n-gi>
<!-- <n-gi>
<n-form-item label="返工次数" path="username">
<n-input v-model:value="formData.username" placeholder="请输入用户名" :disabled="!!formData.id" />
</n-form-item>
</n-gi> -->
<n-gi>
<n-form-item label="完成数量" path="completedQuantity">
<n-input v-model:value="formData.completedQuantity" placeholder="请输入用户名" :disabled="!!formData.id" />
</n-form-item>
</n-gi>
</n-grid>
</n-form>
<template #footer>
<n-space justify="end">
<n-button @click="editmodal = false">取消</n-button>
<n-button
type="primary"
:loading="submitLoading"
@click="handleSubmit"
:disabled="disedbtn"
>保存</n-button>
</n-space>
</template>
</n-modal>
<!--改派弹框-->
<n-modal
v-model:show="reassignmodal"
title="改派"
preset="card"
style="width: 400px"
:mask-closable="false"
>
<n-form
ref="reassformRef"
:model="reassform"
:rules="reassrules"
label-placement="top"
label-width="80"
>
<n-form-item label="工序编号">
<n-input v-model:value="gxobg.id" disabled />
</n-form-item>
<n-form-item label="工序名称">
<n-input v-model:value="gxobg.name" disabled />
</n-form-item>
<n-form-item label="工人名称" path="">
<n-input v-model:value="reassform.userid" placeholder="请选择员工" />
</n-form-item>
<n-form-item label="改派原因" path="reason">
<n-input type="textarea" v-model:value="reassform.reason" placeholder="请输入改派原因" />
</n-form-item>
</n-form>
<template #footer>
<n-space justify="end">
<n-button @click="reassignmodal = false">取消</n-button>
<n-button
type="primary"
:loading="reassLoading"
@click="reassSubmit"
:disabled="reassdisedbtn"
>确定</n-button>
</n-space>
</template>
</n-modal>
<!--暂停恢复弹框-->
<n-modal
v-model:show="pausemodal"
title="暂停/恢复"
preset="card"
style="width: 400px"
:mask-closable="false"
>
<n-form
ref="pauseformRef"
:model="pauseform"
label-placement="top"
label-width="80"
>
<n-form-item label="工序编号">
<n-input v-model:value="gxobg.id" disabled />
</n-form-item>
<n-form-item label="工序名称">
<n-input v-model:value="gxobg.name" disabled />
</n-form-item>
<n-form-item label="暂停原因" path="reason">
<n-input type="textarea" v-model:value="pauseform.reason" placeholder="请输入暂停原因" />
</n-form-item>
</n-form>
<template #footer>
<n-space justify="end">
<n-button @click="pausemodal = false">取消</n-button>
<n-button
type="primary"
:loading="submitLoading"
@click="pauseSubmit"
:disabled="disedbtn"
>确定</n-button>
</n-space>
</template>
</n-modal>
</div>
</template>
<script setup lang="ts">
import {
ref,
reactive,
h,
onMounted,
} from 'vue'
import {
NButton,
NIcon,
NSpace,
NPagination,
NGrid,
NGi,
NTag,
useMessage,
//useDialog,
type FormInst,
} from 'naive-ui'
import {
SearchOutline,
RefreshOutline
} from '@vicons/ionicons5'
import { useUserStore } from '@/stores/user'
import {
disworlist,
editdiswor,
transfer,
pauseresume,
//workload
} from '@/api/production'
//const dialog = useDialog()
const message = useMessage()
const userStore = useUserStore()
// 权限检查
const hasPermission = (permission: string) => userStore.hasPermission(permission)
// ==================== 搜索表单 ====================
const searchForm = reactive({
page: 1,
pageSize: 20,
processId:'',
processName:'',
stringUserName:''
})
// ==================== 表格 ====================
const datalist = ref<any>([])
const loading = ref(false)
//分页
const pagination = reactive({
page: 1,
pageSize: 10,
itemCount: 0
})
const columns = [
// {
// type: 'selection',
// minWidth:60
// },
{
align:'center',
title: '工序编号',
key: 'processId',
minWidth: 150
},
{
align:'center',
title: '工序名称',
key: 'processName',
minWidth: 200
},
{
align:'center',
title: '派工状态',
key: 'assingStatus',
minWidth: 150,
render(row:any) {
let text = ''
if(row.assingStatus == 0){
text = '待执行'
}else if(row.assingStatus == 1){
text = '执行中'
}else if(row.assingStatus == 2){
text = '质检中'
}else if(row.assingStatus == 3){
text = '已汇报'
}else if(row.assingStatus == 4){
text = '已关闭'
}
return text
}
//派工状态0待执行 1执行中 2质检中+3已汇报一4已关闭
},
{
align:'center',
title: '工人名称',
key: 'stringUserName',
minWidth: 200
},
{
align:'center',
title: '数量',
minWidth: 100,
key: 'quantity'
},
{
align:'center',
title: '是否返工',
key: 'rework',
minWidth: 100,
render(row:any) {
const quit = row.rework === 3
return h(NTag, {type: quit ? 'error' : 'success', size: 'small'}, {default: () => (quit ? '是' : '否')})
}
},
{
align:'center',
title: '返工次数',
key: 'reworkNum',
minWidth: 150
},
{
align:'center',
title: '完成数量',
key: 'completedQuantity',
minWidth: 150
},
{
align:'center',
title: '完成时间',
key: 'completedTime',
minWidth: 180
},
{
align:'center',
title: '创建人',
key: 'createBy',
minWidth: 150
},
{
align:'center',
title: '是否质检打回',
key: 'qualityReturn',
minWidth: 120,
render(row:any) {
const quit = row.qualityReturn === 1
return h(NTag, {type: quit ? 'error' : 'success', size: 'small'}, {default: () => (quit ? '是' : '否')})
}
},
{
align:'center',
title: '质检打回数里',
key: 'qualityReturnNum',
minWidth: 150
},
{
align:'center',
title: '工序状态',
key: 'status',
minWidth: 100,
render(row:any) {
if(row.status == 0){
return h(NTag, {
type:'success',
size: 'small'
},
{
default: () => '启用'
}
)
}
if(row.status == 1){
return h(NTag, {
type:'warning',
size: 'small'
},
{
default: () => '已暂停'
}
)
}
if(row.status == 2){
return h(NTag, {
type:'warning',
size: 'small'
},
{
default: () => '已改派'
}
)
}
return '-'
}
},
{
align:'center',
title: '暂停/改派时间',
key: 'pauseTime',
minWidth: 180
},
{
align:'center',
title: '暂停/改派原因',
key: 'reason',
minWidth: 150
},
{
align:'center',
title: '操作',
key: 'actions',
width: 200,
fixed: 'right',
render(row:any) {
const buttons:any = [
// h(NButton, {
// size: 'small',
// type:'warning',
// ghost:true,
// onClick: () => handleEdit(row) },
// //{ default: () => [h(NIcon, null, { default: () => h(CreateOutline) }), ' 暂停' ]}
// { default: () => '暂停'}
// )
]
if(hasPermission('biz:assingWork:edit')){
buttons.push(h(NButton, {
size: 'small',
type:'primary',
ghost:true,
onClick: () => { handleEdit(row) } },
//{ default: () => [h(NIcon, null, { default: () => h(CreateOutline) }), ' 编辑' ]}
{ default: () => '编辑'}
))
}
if(hasPermission('biz:assingWork:transfer')){
buttons.push(h(NButton, {
size: 'small',
type:'success',
ghost:true,
onClick: () => { handlreass(row) } },
{ default: () => '改派'}
))
}
if(hasPermission('biz:assingWork:pauseResume')){
buttons.push(h(NButton, {
size: 'small',
type:'warning',
ghost:true,
onClick:()=>{ handlpause(row) }
},
{ default: () => '暂停'}
))
}
// buttons.push(
// )
return buttons.length > 0 ? h(NSpace, {justify:'center'}, { default: () => buttons }) : '-'
}
}
]
// 编辑
const editmodal = ref(false)
const formRef = ref<FormInst | null>(null)
const submitLoading = ref(false)
const formData = reactive<any>({
id:'',
processName:'', //工序名称
userId:'', //工人id
stringUserName:'', //工人名称
quantity:'', //数里
rework:'', //是否返工
reworkNum:'', //返工次数
completedQuantity:'', //完成数里
})
const rules = {
processName: [{ required: true, message: '请输工序名称', trigger: 'blur' }],
quantity: [{ required: true, message: '请输入数量', trigger: 'blur' }]
}
//搜索数据
function search() {
pagination.page = 1
searchForm.page = 1
searchForm.pageSize = 20
getlist()
}
//重置
function reset() {
searchForm.processId =''
searchForm.processName = ''
searchForm.stringUserName = ''
}
//获取列表数据
function getlist() {
disworlist(searchForm).then((rps:any) => {
datalist.value = rps.list
pagination.itemCount = rps.total
})
}
function handlePageChange(page: number) {
pagination.page = page
searchForm.page = page
getlist()
}
function handlePageSizeChange(pageSize: number) {
pagination.pageSize = pageSize
pagination.page = 1
searchForm.page = 1
searchForm.pageSize = pageSize
getlist()
}
//编辑工单
let disedbtn = ref(false)
function handleEdit(n:any) {
editmodal.value = true
submitLoading.value = false
disedbtn.value = false
formRef.value?.restoreValidation()
formData.id = n.id
formData.processName = n.processName
// formData.userId = '' //工人id
// formData.stringUserName = '' //工人名称
// formData.quantity = '' //数里
// formData.rework = '' //是否返工
// formData.reworkNum = '' //返工次数
// formData.completedQuantity = '' //完成数里
}
function handleSubmit() {
formRef.value?.validate(v => {
if(!v){
submitLoading.value = true
disedbtn.value = true
editdiswor(formData).then(() => {
message.success('保存成功!')
setTimeout(()=> {
editmodal.value = false
submitLoading.value = false
disedbtn.value = false
getlist()
},1000)
}).catch(() => {
disedbtn.value = false
submitLoading.value = false
})
}
})
}
let gxobg = reactive<any>({})
//改派
let reassignmodal = ref(false)
const reassformRef = ref()
let reassform = reactive<any>({
// userId:'', //工人id
// stringUserName:'', //工人名称
id:'', //派工id
reason:'', //改派原因
userid:456 //改派人Id
})
const reassrules = {
userid: [{ required: true, message: '请选择员工', trigger: 'blur' }]
}
let reassLoading = ref(false)
let reassdisedbtn = ref(false)
function handlreass(n:any) {
gxobg.name = n.processName
gxobg.id = n.processId
reassignmodal.value = true
reassLoading.value = false
reassdisedbtn.value = false
reassformRef.value?.restoreValidation()
reassform.id = n.id
reassform.reason = ''
reassform.userid = 456
}
function reassSubmit() {
reassformRef.value?.validate((v:any) => {
if(!v){
reassLoading.value = true
reassdisedbtn.value = true
transfer(reassform).then(() => {
message.success('操作成功!')
setTimeout(()=> {
reassignmodal.value = false
reassLoading.value = false
reassdisedbtn.value = false
getlist()
},1000)
}).catch(() => {
reassdisedbtn.value = false
reassLoading.value = false
})
}
})
}
//暂停/启用
let pausemodal = ref(false)
let pauseform = reactive<any>({
id:'',
status:'', //0启用1暂停2改派
reason:'' //原因
})
const pauseformRef = ref()
let pauseLoading = ref(false)
let pauseisedbtn = ref(false)
function handlpause(n:any) {
gxobg.name = n.processName
gxobg.id = n.processId
pausemodal.value = true
pauseLoading.value = false
pauseisedbtn.value = false
pauseformRef.value?.restoreValidation()
pauseform.id = n.id
pauseform.reason = ''
pauseform.status = n.staus
}
function pauseSubmit() {
pauseformRef.value?.validate((v:any) => {
if(!v){
pauseLoading.value = true
pauseisedbtn.value = true
pauseresume(pauseform).then(() => {
message.success('操作成功!')
setTimeout(()=> {
pausemodal.value = false
pauseLoading.value = false
pauseisedbtn.value = false
getlist()
},1000)
}).catch(() => {
pauseLoading.value = false
pauseisedbtn.value = false
})
}
})
}
// function zantqy(row:any) {
// dialog.warning({
// title: '温馨提示',
// content: `确定要暂停"${row.processName}"吗?`,
// positiveText: '确定',
// negativeText: '取消',
// onPositiveClick: () => {
// pauseresume({}).then(() => {
// message.success('操作成功!')
// getlist()
// })
// }
// })
// }
onMounted(() => {
getlist()
//workload()
})
</script>
<style scoped>
</style>