派工报工完善

dev
qiuhongwu 4 months ago
parent 75d43621b8
commit 83e989fcee

@ -10,6 +10,7 @@ export interface TaskReportVO {
reportTime: Date
hasReport: number
status: number
}
// 查询任务报工分页
@ -41,3 +42,20 @@ export const deleteTaskReport = async (id: number) => {
export const exportTaskReport = async (params) => {
return await request.download({ url: `/biz/task-report/export-excel`, params })
}
//派工报工
// 获得派工工序明细分页接口
export const getTaskDispatchProcedureDetailPages = async (params) => {
return await request.get({ url: `/biz/task-dispatch/task-dispatch-procedure-detail/page`, params })
}
// 获得派工工序报工分页接口
export const gettaskreport = async (params) => {
return await request.get({ url: `/biz/task-report/page`, params })
}
// 获得派工工序报工分页接口
export const createtaskreport = async (data) => {
return await request.post({ url: `/biz/task-report/create-batch`, data })
}

@ -1,5 +1,5 @@
<template>
<Dialog :title="dialogTitle" v-model="dialogVisible">
<Dialog :title="dialogTitle" v-model="dialogVisible" width="1000px">
<el-form
ref="formRef"
:model="formData"
@ -7,180 +7,237 @@
label-width="108px"
v-loading="formLoading"
>
<el-form-item label="班组编码" prop="code">
<el-input v-model="formData.code" disabled placeholder="系统自动生成" class="!w-250px" />
</el-form-item>
<el-form-item label="班组名称" prop="name">
<el-input v-model="formData.name" placeholder="请输入班组名称" class="!w-250px" />
</el-form-item>
<el-form-item label="所属车间" prop="workshopId">
<el-select v-model="formData.workshopId"
placeholder="请输入所属车间"
:remote-method="remoteWorkshopSearch"
remote-show-suffix
remote
clearable
reserve-keyword
filterable
@change="workshopChange"
:loading="workshopSelectLoading"
>
<el-option
v-for="item in workshopSelectList"
:key="item.id"
:label="item.name"
:value="item.id"
/>
</el-select>
</el-form-item>
<el-form-item label="负责人" prop="leaderUserId">
<UserSelect v-model="formData.leaderUserId" @update:newValue="handleSelectedUser" />
</el-form-item>
<el-form-item label="班组描述" prop="description">
<el-input type="textarea" v-model="formData.description" height="150px" show-word-limit maxlength="200" />
</el-form-item>
<el-form-item label="启用状态" prop="status">
<el-radio-group v-model="formData.status">
<el-radio
v-for="dict in getIntDictOptions(DICT_TYPE.BIZ_COMMON_STATUS)"
:key="dict.value"
:label="dict.value"
>
{{ dict.label }}
</el-radio>
</el-radio-group>
</el-form-item>
<el-row>
<el-col :span="6">
<el-form-item label="派工数量">
<span>{{ formData.amount }}</span>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="预计工时">
<span>{{ formData.workTime }}</span>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="总报工数量">
<span>{{ formData.totalReportAmount }}</span>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="总报工工时">
<span>{{ formData.totalWorkTime }}</span>
</el-form-item>
</el-col>
</el-row>
</el-form>
<el-card class="hl-card-info">
<el-row>
<el-col>
<el-button type="primary" size="large" @click="onAddItem"></el-button>
</el-col>
<el-col>
<el-card class="hl-incard">
<el-form
ref="subFormRef"
:model="list"
:rules="subFormRules"
v-loading="subFormLoading"
label-width="0"
>
<el-table :data="list" class="hl-table">
<el-table-column fixed label="序号" align="center" type="index" width="70" />
<el-table-column label="开始生产时间" align="center" min-width="170">
<template #header> <span style="color: red">*</span>开始生产时间 </template>
<template #default="{ row }">
<el-form-item class="mb-0px!">
<!-- <el-date-picker
:disabled="detailDisabled"
v-model="row.startTimeStr"
type="datetime"
value-format="yyyy-MM-dd HH:mm:ss"
placeholder="开始生产时间"
/> -->
{{ formatDate(row.startTime, 'YYYY-MM-DD HH:mm') }}
</el-form-item>
</template>
</el-table-column>
<el-table-column label="结束生产时间" align="center" min-width="165">
<template #header> <span style="color: red">*</span>结束生产时间 </template>
<template #default="{ row }">
<el-form-item class="mb-0px!">
<!-- <el-date-picker
:disabled="detailDisabled"
v-model="row.endTimeStr"
type="date"
value-format="x"
placeholder="结束生产时间"
/> -->
{{ formatDate(row.endTime, 'YYYY-MM-DD HH:mm') }}
</el-form-item>
</template>
</el-table-column>
<el-table-column label="本次报工工时" align="center" prop="workTime" width="160">
<template #header> <span style="color: red">*</span>本次报工工时 </template>
<template #default="{ row, $index }">
<el-form-item
:prop="`${$index}.workTime`"
:rules="subFormRules.workTime"
class="mb-0px!"
>
<el-input-number
min="0"
:precision="2"
class="!w-240px"
:disabled="detailDisabled"
v-model="row.workTime"
placeholder="本次报工工时"
/>
</el-form-item>
</template>
</el-table-column>
<el-table-column label="本次报工数量" align="center" prop="amount" width="180">
<template #header> <span style="color: red">*</span>本次报工数量 </template>
<template #default="{ row, $index }">
<el-form-item
:prop="`${$index}.amount`"
:rules="subFormRules.amount"
class="mb-0px!"
>
<el-input-number
min="0"
:max="formData.amount"
:precision="0"
class="!w-240px"
:disabled="detailDisabled"
v-model="row.amount"
placeholder="本次报工数量"
/>
</el-form-item>
</template>
</el-table-column>
<el-table-column fixed="right" label="操作" align="center" min-width="220">
<template #default="scope">
<el-button
:disabled="scope.row.startTime !== undefined"
type="primary"
size="small"
@click="setStartTime(scope.$index)"
>
开始生产
</el-button>
<el-button
:disabled="
scope.row.startTime == undefined || scope.row.endTime !== undefined
"
type="warning"
size="small"
@click.prevent="setEndTime(scope.$index)"
>
结束生产
</el-button>
</template>
</el-table-column>
</el-table>
</el-form>
</el-card>
</el-col>
</el-row>
</el-card>
<template #footer>
<el-button @click="submitForm" type="primary" :disabled="formLoading"> </el-button>
<el-button @click="dialogVisible = false"> </el-button>
<el-button @click="submitForm(1)" type="primary" :disabled="formLoading"
> </el-button
>
<el-button @click="submitForm(2)" type="primary" :disabled="formLoading"
>生产完成</el-button
>
</template>
</Dialog>
</template>
<script setup lang="ts">
import * as ClassesApi from '@/api/biz/classes'
import * as UserApi from "@/api/system/user";
import * as WorkshopApi from "@/api/biz/workshop";
import {DICT_TYPE, getIntDictOptions} from "@/utils/dict";
import {getWorkshopPage} from "@/api/biz/workshop";
import UserSelect from '../hlvuestyle/userSelect.vue'
import { formatDate } from '@/utils/formatTime'
import * as TaskReportApi from '@/api/biz/taskreport'
import { DICT_TYPE, getIntDictOptions } from '@/utils/dict'
import { getWorkshopPage } from '@/api/biz/workshop'
import { any } from 'vue-types'
const { t } = useI18n() //
const message = useMessage() //
const list = ref([{}]) //
const total = ref(0) //
const dialogVisible = ref(false) //
const dialogTitle = ref('') //
const formLoading = ref(false) // 12
const formType = ref('') // create - update -
const formData = ref({
id: undefined,
code: undefined,
name: undefined,
workshopId: undefined,
deptId: undefined,
leaderUserId: undefined,
description: undefined,
status: 1,
totalReportAmount: undefined,
totalWorkTime: undefined,
amount: undefined,
workTime: undefined
})
const formRules = reactive({
name: [{ required: true, message: '班组名称不能为空', trigger: 'blur' }],
workshopId: [{ required: true, message: '所属车间不能为空', trigger: 'blur' }],
status: [{ required: true, message: '启用状态不能为空', trigger: 'blur' }],
const subFormRules = reactive({
startTime: [{ required: true, message: '开始生产时间不能为空', trigger: 'blur' }],
endTime: [{ required: true, message: '结束生产时间不能为空', trigger: 'blur' }],
workTime: [{ required: true, message: '报工工时不能为空', trigger: 'blur' }],
amount: [{ required: true, message: '报工数量不能为空', trigger: 'blur' }]
})
const formRef = ref() // Ref
const userList = ref<UserApi.UserVO[]>([]) //
const userSelectList = ref<UserApi.UserVO[]>([])
const userSelectLoading = ref(false);
const remoteUserSearch = (query: string) => {
if (query) {
userSelectLoading.value = true
setTimeout(() => {
userSelectLoading.value = false
userSelectList.value = userList.value.filter((item) => {
return item.nickname.toLowerCase().includes(query.toLowerCase()) || item.username.toLowerCase().includes(query.toLowerCase())
})
}, 200)
} else {
userSelectList.value = userList.value
}
}
const workshopList = ref<WorkshopApi.WorkshopVO[]>([]) //
const workshopSelectList = ref<WorkshopApi.WorkshopVO[]>([])
const workshopSelectLoading = ref(false);
const remoteWorkshopSearch = (query: string) => {
if (query) {
workshopSelectLoading.value = true
setTimeout(() => {
workshopSelectLoading.value = false
workshopSelectList.value = workshopList.value.filter((item) => {
return item.name.toLowerCase().includes(query.toLowerCase())
})
}, 200)
} else {
workshopSelectList.value = workshopList.value
}
}
const workshopChange = (id: number) => {
formData.value.deptId = workshopSelectList.value.find((ws) => ws.id === id)?.deptId;
}
const subFormRef = ref() // Ref
const queryParams = reactive({
pageNo: 1,
pageSize: 99,
dispatchDetailId: undefined
})
/** 打开弹窗 */
const open = async (type: string, id?: number) => {
const open = async (id?: number, val?: any) => {
resetForm()
queryParams.dispatchDetailId = id
// console.log(id, val)
formData.value = val
dialogVisible.value = true
dialogTitle.value = '新增报工'
formType.value = type
resetForm()
//
formLoading.value = true
try {
if (id) {
formData.value = await ClassesApi.getClasses(id)
const data = await TaskReportApi.gettaskreport(queryParams)
// console.log(data);
list.value = data.list
total.value = data.total
}
//
let userParams = {
pageNo: 1,
pageSize: 10,
status: "0"
}
const data = await UserApi.getUserPage(userParams);
userList.value = data.list;
userSelectList.value = data.list;
//
let params = {
pageNo: 1,
pageSize: 10,
status: "1"
}
const dataWorkshop = await WorkshopApi.getWorkshopPage(params)
workshopList.value = dataWorkshop.list;
workshopSelectList.value = dataWorkshop.list;
} finally {
formLoading.value = false
}
}
defineExpose({ open }) // open
/** 提交表单 */
const emit = defineEmits(['success']) // success
const submitForm = async () => {
const submitForm = async (val) => {
//
await formRef.value.validate()
await subFormRef.value.validate()
//
if(list.value.length==0){
message.warning(t('至少有一条报工'))
return
}
formLoading.value = true
try {
const data = formData.value as unknown as ClassesApi.ClassesVO
if (formType.value === 'create') {
await ClassesApi.createClasses(data)
message.success(t('common.createSuccess'))
} else {
await ClassesApi.updateClasses(data)
message.success(t('common.updateSuccess'))
}
list.value.forEach(item => {
item.procedureStatus=val
item.reportTime=Date.now()
})
// console.log(list.value);
const data = list.value
await TaskReportApi.createtaskreport(data)
message.success(t('操作成功'))
dialogVisible.value = false
//
emit('success')
@ -189,22 +246,66 @@ const submitForm = async () => {
}
}
const onAddItem = ref(() => {
const row = {
id:0,
dispatchDetailId: undefined,
procedureStatus: undefined,
startTime: undefined,
endTime: undefined,
amount: undefined,
workTime: undefined,
owner:undefined,
hasReport:1,
status:1,
reportTime:undefined,
type:'PRODUCTION',
}
row.dispatchDetailId = formData.value.id
row.owner = formData.value.owner
list.value.push(row)
})
const setStartTime = (index: number) => {
if (index >= 0 && index < list.value.length) {
// yyyy-MM-dd HH:mm
const currentTime = Date.now() // "YYYY-MM-DD HH:mm"
//
list.value[index].startTime = currentTime
}
}
const setEndTime = (index: number) => {
if (index >= 0 && index < list.value.length) {
// yyyy-MM-dd HH:mm
const currentTime = Date.now() // "YYYY-MM-DD HH:mm"
//
list.value[index].endTime = currentTime
}
//
if (list.value[index].startTime) {
//
const timeDiff = list.value[index].endTime - list.value[index].startTime
//
const workHours = timeDiff / (1000 * 60 * 60) //
//
list.value[index].workTime = workHours.toFixed(2) //
} else {
console.warn('startTimeStr 未定义,请确保开始生产时间已设置')
}
}
/** 重置表单 */
const resetForm = () => {
formData.value = {
id: undefined,
code: undefined,
name: undefined,
workshopId: undefined,
deptId: undefined,
leaderUserId: undefined,
description: undefined,
status: 1,
totalReportAmount: undefined,
totalWorkTime: undefined,
amount: undefined,
workTime: undefined
}
formRef.value?.resetFields()
}
const handleSelectedUser = (newValue: any) => {
formData.value.leaderUserId = newValue?.id
subFormRef.value?.resetFields()
}
</script>

Loading…
Cancel
Save