点检保养-点检保养记录-模具工单列表新增查询条件,优化取消逻辑和详情页按钮位置

main
zhongwenkai 3 weeks ago
parent ba0cfccff9
commit 26b59f9ad2

@ -54,6 +54,10 @@ export const TicketManagementApi = {
return await request.put({ url: `/mes/mold-ticket-results/batchUpdate`, data }) return await request.put({ url: `/mes/mold-ticket-results/batchUpdate`, data })
}, },
exportTicketManagement: async (params: any) => {
return await request.download({ url: `/mes/mold-ticket-management/export-excel`, params })
},
getInspectionByMoldId: async (params: { moldId: number; startTime?: string; endTime?: string }) => { getInspectionByMoldId: async (params: { moldId: number; startTime?: string; endTime?: string }) => {
return await request.get({ url: `/mes/mold-ticket-management/getInspectionByMoldId`, params }) return await request.get({ url: `/mes/mold-ticket-management/getInspectionByMoldId`, params })
}, },

@ -3828,6 +3828,7 @@ export default {
operatorName: 'Operator', operatorName: 'Operator',
taskTime: 'Job Time', taskTime: 'Job Time',
taskEndTime: 'Planned End Time', taskEndTime: 'Planned End Time',
taskTimeRange: 'Job Time',
createTime: 'Create Time', createTime: 'Create Time',
index: 'Index', index: 'Index',
remark: 'Remark', remark: 'Remark',
@ -3837,10 +3838,16 @@ export default {
placeholderPlanType: 'Please select type', placeholderPlanType: 'Please select type',
placeholderJobStatus: 'Please select job status', placeholderJobStatus: 'Please select job status',
placeholderJobResult: 'Please select result', placeholderJobResult: 'Please select result',
placeholderOperatorName: 'Please select operator',
placeholderTaskTime: 'Please select job start time',
placeholderTaskEndTime: 'Please select job end time',
query: 'Query', query: 'Query',
reset: 'Reset', reset: 'Reset',
cancelConfirm: 'Confirm cancel selected tasks?', cancelConfirm: 'Confirm cancel selected tasks?',
cancelSuccess: 'Cancel task successful', cancelSuccess: 'Cancel task successful',
cancelOnlyUnworkedTip: 'Only unworked tickets can be canceled',
export: 'Export',
exportFilename: 'Mold Work Order Inquiry.xls',
inspectResultTitlePrefix: 'Inspection Result-', inspectResultTitlePrefix: 'Inspection Result-',
inspectResultTitle: 'Inspection Result' inspectResultTitle: 'Inspection Result'
}, },

@ -2198,6 +2198,7 @@ export default {
cancelReason: '取消原因', cancelReason: '取消原因',
cancelConfirm: '确认取消选中的任务吗?', cancelConfirm: '确认取消选中的任务吗?',
cancelSuccess: '取消任务成功', cancelSuccess: '取消任务成功',
cancelOnlyUnworkedTip: '只有未作业状态的工单才能取消任务',
cancelFail: '取消任务失败', cancelFail: '取消任务失败',
cancelOnlyUnworkedTip: '只有未作业状态的工单才能取消任务', cancelOnlyUnworkedTip: '只有未作业状态的工单才能取消任务',
selectAllDecisionError: '请先为所有待检测记录选择通过或不通过', selectAllDecisionError: '请先为所有待检测记录选择通过或不通过',
@ -3298,6 +3299,7 @@ export default {
operatorName: '作业人', operatorName: '作业人',
taskTime: '作业时间', taskTime: '作业时间',
taskEndTime: '计划结束作业时间', taskEndTime: '计划结束作业时间',
taskTimeRange: '作业时间',
createTime: '创建时间', createTime: '创建时间',
index: '序号', index: '序号',
remark: '备注', remark: '备注',
@ -3307,10 +3309,16 @@ export default {
placeholderPlanType: '请选择类型', placeholderPlanType: '请选择类型',
placeholderJobStatus: '请选择作业状态', placeholderJobStatus: '请选择作业状态',
placeholderJobResult: '请选择结果', placeholderJobResult: '请选择结果',
placeholderOperatorName: '请选择作业人',
placeholderTaskTime: '请选择作业开始时间',
placeholderTaskEndTime: '请选择作业结束时间',
query: '查询', query: '查询',
reset: '重置', reset: '重置',
cancelConfirm: '确认取消选中的任务吗?', cancelConfirm: '确认取消选中的任务吗?',
cancelSuccess: '取消任务成功', cancelSuccess: '取消任务成功',
cancelOnlyUnworkedTip: '只有未作业状态的工单才能取消任务',
export: '导出',
exportFilename: '模具工单查询.xls',
inspectResultTitlePrefix: '检验结果-', inspectResultTitlePrefix: '检验结果-',
inspectResultTitle: '检验结果' inspectResultTitle: '检验结果'
}, },

@ -4,6 +4,17 @@
<div class="ticket-result-header"> <div class="ticket-result-header">
<el-button @click="handleClose">{{ t('common.back') }}</el-button> <el-button @click="handleClose">{{ t('common.back') }}</el-button>
<span class="ticket-result-title">{{ pageTitle }}</span> <span class="ticket-result-title">{{ pageTitle }}</span>
<div class="ticket-result-actions">
<el-button
v-if="String(jobStatus) === '0'"
type="primary"
@click="handleSave"
:loading="submitLoading"
:disabled="hasImageUploading"
>
{{ t('MoldManagement.TicketResultDialog.save') }}
</el-button>
</div>
</div> </div>
<el-descriptions :title="t('MoldManagement.MoldWorkOrderInquiry.basicInfo')" :column="4" border> <el-descriptions :title="t('MoldManagement.MoldWorkOrderInquiry.basicInfo')" :column="4" border>
@ -141,14 +152,8 @@
v-model:page-size="queryParams.pageSize" :background="true" :page-sizes="[10, 20, 30, 50, 100]" :pager-count="7" v-model:page-size="queryParams.pageSize" :background="true" :page-sizes="[10, 20, 30, 50, 100]" :pager-count="7"
:total="total" class="mt-15px mb-15px flex justify-end" layout="total, sizes, prev, pager, next, jumper" :total="total" class="mt-15px mb-15px flex justify-end" layout="total, sizes, prev, pager, next, jumper"
@size-change="handleSizeChange" @current-change="handleCurrentChange" /> @size-change="handleSizeChange" @current-change="handleCurrentChange" />
<div class="ticket-result-footer">
<el-button v-if="String(jobStatus) === '0'" type="primary" @click="handleSave" :loading="submitLoading"
:disabled="hasImageUploading">
{{ t('MoldManagement.TicketResultDialog.save') }}
</el-button>
</div>
</ContentWrap> </ContentWrap>
</div> </div>
</template> </template>
@ -386,9 +391,9 @@ const parseImages = (value: any): string[] => {
color: var(--el-text-color-primary); color: var(--el-text-color-primary);
} }
.ticket-result-footer { .ticket-result-actions {
margin-left: auto;
display: flex; display: flex;
justify-content: flex-end;
gap: 12px; gap: 12px;
} }
</style> </style>

@ -41,6 +41,27 @@
<el-option v-for="opt in jobResultOptions" :key="opt.value" :label="opt.label" :value="opt.value" /> <el-option v-for="opt in jobResultOptions" :key="opt.value" :label="opt.label" :value="opt.value" />
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item :label="t('MoldManagement.MoldWorkOrderInquiry.operatorName')" prop="operator" v-show="showAllFilters">
<el-select
v-model="queryParams.operator"
filterable
:placeholder="t('MoldManagement.MoldWorkOrderInquiry.placeholderOperatorName')"
clearable
class="!w-240px"
>
<el-option v-for="item in users" :key="String(item.id)" :label="item.nickname" :value="String(item.id)" />
</el-select>
</el-form-item>
<el-form-item :label="t('MoldManagement.MoldWorkOrderInquiry.taskTimeRange')" prop="taskTimeRange" v-show="showAllFilters">
<el-date-picker
v-model="queryParams.taskTimeRange"
value-format="YYYY-MM-DD HH:mm:ss"
type="datetimerange"
:start-placeholder="t('MoldManagement.MoldWorkOrderInquiry.placeholderTaskTime')"
:end-placeholder="t('MoldManagement.MoldWorkOrderInquiry.placeholderTaskEndTime')"
:default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"
class="!w-240px" />
</el-form-item>
<el-form-item v-if="filterCount > 3"> <el-form-item v-if="filterCount > 3">
<el-button type="text" class="text-primary" @click="toggleFilters"> <el-button type="text" class="text-primary" @click="toggleFilters">
<Icon :icon="showAllFilters ? 'ep:arrow-up' : 'ep:arrow-down'" class="mr-5px" /> <Icon :icon="showAllFilters ? 'ep:arrow-up' : 'ep:arrow-down'" class="mr-5px" />
@ -54,13 +75,16 @@
<el-button type="primary" @click="handleQuery"> <el-button type="primary" @click="handleQuery">
<Icon icon="ep:search" class="mr-5px" /> {{ t('MoldManagement.MoldWorkOrderInquiry.query') }} <Icon icon="ep:search" class="mr-5px" /> {{ t('MoldManagement.MoldWorkOrderInquiry.query') }}
</el-button> </el-button>
<el-button type="success" plain @click="handleExport" :loading="exportLoading">
<Icon icon="ep:download" class="mr-5px" /> {{ t('MoldManagement.MoldWorkOrderInquiry.export') }}
</el-button>
</el-form-item> </el-form-item>
</el-form> </el-form>
</ContentWrap> </ContentWrap>
<ContentWrap> <ContentWrap>
<div class="mb-10px"> <div class="mb-10px">
<el-button type="warning" plain @click="handleBatchCancel" :disabled="!selectedIds.length" :loading="cancelLoading"> <el-button type="warning" plain @click="handleBatchCancel" :disabled="isCancelDisabled" :loading="cancelLoading">
{{ t('MoldManagement.MoldWorkOrderInquiry.cancelTask') }} {{ t('MoldManagement.MoldWorkOrderInquiry.cancelTask') }}
</el-button> </el-button>
</div> </div>
@ -125,6 +149,7 @@ import { dateFormatter } from '@/utils/formatTime'
import { getStrDictOptions } from '@/utils/dict' import { getStrDictOptions } from '@/utils/dict'
import { useDictStoreWithOut } from '@/store/modules/dict' import { useDictStoreWithOut } from '@/store/modules/dict'
import { TicketManagementApi, TicketManagementVO } from '@/api/mold/ticketManagement' import { TicketManagementApi, TicketManagementVO } from '@/api/mold/ticketManagement'
import { getSimpleUserList, UserVO } from '@/api/system/user'
import TicketResultDialog from '@/views/mold/workOrderInquiry/components/TicketResultDialog.vue' import TicketResultDialog from '@/views/mold/workOrderInquiry/components/TicketResultDialog.vue'
const { t } = useI18n() const { t } = useI18n()
@ -139,8 +164,8 @@ const planTypeOptions = [
{ label: t('MoldManagement.MoldWorkOrderInquiry.planTypeMaintain'), value: '2' } { label: t('MoldManagement.MoldWorkOrderInquiry.planTypeMaintain'), value: '2' }
] ]
const jobResultOptions = [ const jobResultOptions = [
{ label: t('MoldManagement.MoldWorkOrderInquiry.jobResultOk'), value: 'OK' }, { label: t('MoldManagement.MoldWorkOrderInquiry.jobResultOk'), value: '1' },
{ label: t('MoldManagement.MoldWorkOrderInquiry.jobResultNg'), value: 'NG' } { label: t('MoldManagement.MoldWorkOrderInquiry.jobResultNg'), value: '2' }
] ]
const loading = ref(true) const loading = ref(true)
@ -159,7 +184,10 @@ const updatePlanTableMaxHeight = async () => {
planTableMaxHeight.value = Math.min(window.innerHeight, Math.max(240, Math.floor(availableHeight))) planTableMaxHeight.value = Math.min(window.innerHeight, Math.max(240, Math.floor(availableHeight)))
} }
const selectedIds = ref<number[]>([]) const selectedIds = ref<number[]>([])
const selectedRows = ref<TicketManagementVO[]>([])
const cancelLoading = ref(false) const cancelLoading = ref(false)
const exportLoading = ref(false)
const users = ref<UserVO[]>([])
const resultVisible = ref(false) const resultVisible = ref(false)
const selectedResultRow = ref<TicketManagementVO>() const selectedResultRow = ref<TicketManagementVO>()
const resultTitle = computed(() => { const resultTitle = computed(() => {
@ -175,22 +203,36 @@ const queryParams = reactive({
pageSize: 10, pageSize: 10,
planNo: undefined as string | undefined, planNo: undefined as string | undefined,
planType: undefined as string | undefined, planType: undefined as string | undefined,
jobStatus: undefined as string | undefined, jobStatus: '0' as string | undefined,
jobResult: undefined as string | undefined jobResult: undefined as string | undefined,
operator: undefined as string | undefined,
taskTimeRange: [] as string[]
}) })
const queryFormRef = ref() const queryFormRef = ref()
const showAllFilters = ref(false) const showAllFilters = ref(false)
const filterCount = 4 const filterCount = 6
const UNWORKED_JOB_STATUS = '0'
const CANCELED_JOB_STATUS = '4'
const toggleFilters = () => { const toggleFilters = () => {
showAllFilters.value = !showAllFilters.value showAllFilters.value = !showAllFilters.value
updatePlanTableMaxHeight() updatePlanTableMaxHeight()
} }
const buildQueryParams = () => {
const { taskTimeRange, ...params } = queryParams
return {
...params,
taskTime: taskTimeRange?.[0],
taskEndTime: taskTimeRange?.[1]
}
}
const getList = async () => { const getList = async () => {
loading.value = true loading.value = true
try { try {
const data = await TicketManagementApi.getTicketManagementPage(queryParams) const data = await TicketManagementApi.getTicketManagementPage(buildQueryParams())
list.value = data.list list.value = data.list
total.value = data.total total.value = data.total
} finally { } finally {
@ -210,13 +252,22 @@ const resetQuery = () => {
} }
const handleSelectionChange = (rows: TicketManagementVO[]) => { const handleSelectionChange = (rows: TicketManagementVO[]) => {
selectedRows.value = rows
selectedIds.value = rows selectedIds.value = rows
.map((r) => r.id) .map((r) => r.id)
.filter((id): id is number => typeof id === 'number') .filter((id): id is number => typeof id === 'number')
} }
const isUnworkedTicket = (row?: TicketManagementVO) => String(row?.jobStatus ?? '') === UNWORKED_JOB_STATUS
const hasUncancelableSelection = computed(() => selectedRows.value.some((row) => !isUnworkedTicket(row)))
const isCancelDisabled = computed(() => !selectedIds.value.length || hasUncancelableSelection.value)
const handleBatchCancel = async () => { const handleBatchCancel = async () => {
if (!selectedIds.value.length) return if (!selectedIds.value.length) return
if (hasUncancelableSelection.value) {
message.warning(t('MoldManagement.MoldWorkOrderInquiry.cancelOnlyUnworkedTip'))
return
}
try { try {
const { value } = await ElMessageBox.prompt('请输入取消原因', t('MoldManagement.MoldWorkOrderInquiry.cancelTask'), { const { value } = await ElMessageBox.prompt('请输入取消原因', t('MoldManagement.MoldWorkOrderInquiry.cancelTask'), {
confirmButtonText: t('common.ok'), confirmButtonText: t('common.ok'),
@ -227,11 +278,12 @@ const handleBatchCancel = async () => {
cancelLoading.value = true cancelLoading.value = true
await TicketManagementApi.batchUpdateTicketStatus({ await TicketManagementApi.batchUpdateTicketStatus({
ids: selectedIds.value.join(','), ids: selectedIds.value.join(','),
jobStatus: '4', jobStatus: CANCELED_JOB_STATUS,
cancelReason: value cancelReason: value
}) })
message.success(t('MoldManagement.MoldWorkOrderInquiry.cancelSuccess')) message.success(t('MoldManagement.MoldWorkOrderInquiry.cancelSuccess'))
selectedIds.value = [] selectedIds.value = []
selectedRows.value = []
await getList() await getList()
} catch { } catch {
} finally { } finally {
@ -239,6 +291,23 @@ const handleBatchCancel = async () => {
} }
} }
const handleExport = async () => {
try {
await message.exportConfirm()
exportLoading.value = true
const params: any = {
...buildQueryParams(),
ids: selectedIds.value.length ? selectedIds.value.join(',') : undefined
}
const data = await TicketManagementApi.exportTicketManagement(params)
const download = (await import('@/utils/download')).default
download.excel(data, t('MoldManagement.MoldWorkOrderInquiry.exportFilename'))
} catch {
} finally {
exportLoading.value = false
}
}
const handleRowClick = (row: TicketManagementVO, column: any) => { const handleRowClick = (row: TicketManagementVO, column: any) => {
if (column?.type === 'selection') return if (column?.type === 'selection') return
if (!row?.id) return if (!row?.id) return
@ -259,6 +328,7 @@ const handleResultSuccess = async () => {
onMounted(async () => { onMounted(async () => {
await dictStore.setDictMap() await dictStore.setDictMap()
users.value = await getSimpleUserList()
await getList() await getList()
updatePlanTableMaxHeight() updatePlanTableMaxHeight()
window.addEventListener("resize", updatePlanTableMaxHeight) window.addEventListener("resize", updatePlanTableMaxHeight)
@ -268,3 +338,4 @@ onBeforeUnmount(() => {
window.removeEventListener("resize", updatePlanTableMaxHeight) window.removeEventListener("resize", updatePlanTableMaxHeight)
}) })
</script> </script>

Loading…
Cancel
Save