|
|
|
@ -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) // 表单的加载中:1)修改时的数据加载;2)提交的按钮禁用
|
|
|
|
|
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>
|
|
|
|
|