fix work report

main
chenshuichuan 2 years ago
parent 1a7cefbad9
commit 14afad7cd4

@ -57,10 +57,7 @@ export const OrgWorkerApi = {
getOrgWorkerList2: async (params: any) => {
return await request.get({ url: `/mes/org-worker/getOtherOrgWorkerRespVO` , params })
},
// 获得当前用户列表
getPersonalUser: async () => {
return await request.get({ url: `/mes/org-worker/getPersonalUser` })
},
// 获得当前用户管理的用户列表
getOtherPersonalUser: async (params: any) => {
return await request.get({ url: `/mes/org-worker/getOtherPersonalUser`, params })

@ -77,6 +77,6 @@ export const WorkReportPlanApi = {
},
// 查询计划进度
getReportPlanProgress: async (id: number) => {
return await request.get({ url: `/mes/work-report-plan-view/getPlanProgress?id=`, id })
return await request.get({ url: `/mes/work-report-plan-view/getPlanProgress?id=`+id })
},
}

@ -9,7 +9,7 @@
label-width="68px"
>
<el-row>
<el-col :span="6">
<el-col :span="5">
<el-form-item label="组织名称" prop="name">
<el-input
v-model="queryParams.name"
@ -20,7 +20,7 @@
/>
</el-form-item>
</el-col>
<el-col :span="6">
<el-col :span="5">
<el-form-item label="关联机台" prop="machineId">
<el-input
v-model="queryParams.machineId"
@ -31,7 +31,7 @@
/>
</el-form-item>
</el-col>
<el-col :span="6">
<el-col :span="5">
<el-form-item label="组织状态" prop="status">
<el-select
v-model="queryParams.status"
@ -48,36 +48,25 @@
</el-select>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="工作日期" prop="workDate">
<el-date-picker
v-model="queryParams.workDate"
@change="handleQuery"
type="date"
value-format="YYYY-MM-DD HH:mm:ss"
placeholder="选择工作日期"
class="!w-200px"
/>
</el-form-item>
<el-col :span="9">
<el-form-item>
<el-button @click="handleQuery"><Icon class="mr-5px" icon="ep:search" /> 搜索</el-button>
<el-button @click="resetQuery"><Icon class="mr-5px" icon="ep:refresh" /> 重置</el-button>
<el-button
v-hasPermi="['mes:organization:export']"
:loading="exportLoading"
plain
type="success"
@click="handleExport"
>
<Icon class="mr-5px" icon="ep:download" /> 导出
</el-button>
<el-button plain type="danger" @click="toggleExpandAll">
<Icon class="mr-5px" icon="ep:sort" /> 展开/折叠
</el-button>
</el-form-item>
</el-col>
</el-row>
<el-form-item>
<el-button @click="handleQuery"><Icon class="mr-5px" icon="ep:search" /> 搜索</el-button>
<el-button @click="resetQuery"><Icon class="mr-5px" icon="ep:refresh" /> 重置</el-button>
<el-button
v-hasPermi="['mes:organization:export']"
:loading="exportLoading"
plain
type="success"
@click="handleExport"
>
<Icon class="mr-5px" icon="ep:download" /> 导出
</el-button>
<el-button plain type="danger" @click="toggleExpandAll">
<Icon class="mr-5px" icon="ep:sort" /> 展开/折叠
</el-button>
</el-form-item>
</el-form>
</ContentWrap>
@ -123,13 +112,11 @@
<dict-tag v-if="notEmpty(scope.row.orgType)" :type="DICT_TYPE.MES_ORG_TYPE" :value="scope.row.orgType" />
</template>
</el-table-column>
<el-table-column align="center" label="组织状态" >
<template #default="scope">
<dict-tag v-if="notEmpty(scope.row.status) && scope.row.orgClass=='workplace'" :type="DICT_TYPE.MES_ORG_STATUS" :value="scope.row.status" />
</template>
</el-table-column>
<!-- <el-table-column align="center" label="组织状态" >-->
<!-- <template #default="scope">-->
<!-- <dict-tag v-if="notEmpty(scope.row.status) && scope.row.orgClass=='workplace'" :type="DICT_TYPE.MES_ORG_STATUS" :value="scope.row.status" />-->
<!-- </template>-->
<!-- </el-table-column>-->
<el-table-column align="center" fixed="right" label="操作" width="80">
<template #default="scope">
<el-button
@ -149,7 +136,7 @@
</el-col>
<el-col :span="12">
<!-- 列表 -->
<WorkerRight :org-id="orgId" :work-date="queryParams.workDate" :org-type="queryParams.orgType"/>
<WorkerRight :org-id="orgId" :org-type="queryParams.orgType"/>
</el-col>
</el-row>
@ -242,26 +229,10 @@ const toggleExpandAll = async () => {
await nextTick()
refreshTable.value = true
}
const organizationTree = ref() //
const getCurrentDate = () =>{
let now = new Date();
let year = now.getFullYear();
let month = now.getMonth() + 1;
if(month<10){month = '0'+month}
let day = now.getDate();
if(day<10)day = '0'+day;
return year + "-" + month + "-" + day +" 00:00:00";
}
/** 初始化 **/
onMounted(async () => {
queryParams.workDate = getCurrentDate()
await getList()
/** 获得产线工位树 */
organizationTree.value = []
const data = await OrganizationApi.getOrganizationList()
const root: Tree = { id: 0, name: '顶级产线工位', children: [] }
root.children = handleTree(data, 'id', 'parentId')
organizationTree.value.push(root)
})
/** tab 切换 */
let activeName = ''

@ -1,6 +1,36 @@
<template>
<!-- 列表 -->
<ContentWrap>
<el-row>
<el-col :span="16">
<el-form-item label="工作日期" prop="workDate">
<el-date-picker
v-model="queryParams.workDate"
value-format="YYYY-MM-DD HH:mm:ss"
type="daterange"
@change="handleQuery"
start-placeholder="开始日期"
end-placeholder="结束日期"
:default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"
class="!w-160px"
/>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item>
<el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> 搜索</el-button>
<el-button
type="success"
plain
@click="handleExport"
:loading="exportLoading"
v-hasPermi="['mes:org-worker:export']"
>
<Icon icon="ep:download" class="mr-5px" /> 导出
</el-button>
</el-form-item>
</el-col>
</el-row>
<el-tabs v-model="activeName" @tab-click="handleTabClick">
<el-tab-pane label="所有" name="" />
@ -59,7 +89,6 @@ const { t } = useI18n() // 国际化
const props = defineProps<{
orgId?: number // org ID
orgType?: string
workDate?:undefined
}>()
const loading = ref(true) //
@ -69,7 +98,7 @@ const queryParams = reactive({
pageNo: 1,
pageSize: 10,
orgId: undefined,
workDate: undefined,
workDate: [],
groupType: undefined,
orgType: undefined,
workerId: undefined,
@ -123,9 +152,18 @@ const handleExport = async () => {
exportLoading.value = false
}
}
const getCurrentDate = () =>{
let now = new Date();
let year = now.getFullYear();
let month = now.getMonth() + 1;
if(month<10){month = '0'+month}
let day = now.getDate();
if(day<10)day = '0'+day;
return year + "-" + month + "-" + day +" 00:00:00";
}
/** 初始化 **/
onMounted(() => {
queryParams.workDate = [getCurrentDate(), getCurrentDate()]
getList()
})
/** tab 切换 */
@ -153,16 +191,16 @@ watch(
},
{ immediate: true, deep: true }
)
watch(
() => props.workDate,
(val: string) => {
console.log("workDate:"+val)
if (!val) {
return
}
queryParams.workDate = [val,val]
handleQuery()
},
{ immediate: true, deep: true }
)
// watch(
// () => props.workDate,
// (val: string) => {
// console.log("workDate:"+val)
// if (!val) {
// return
// }
//
// handleQuery()
// },
// { immediate: true, deep: true }
// )
</script>

@ -8,117 +8,121 @@
:inline="true"
label-width="68px"
>
<el-form-item label="任务单" prop="taskId">
<el-select
v-model="queryParams.taskId"
@change="handleQuery"
clearable
filterable
placeholder="请选择"
class="!w-240px"
>
<el-option
v-for="item in taskList"
:key="item.id"
:label="item.code"
:value="item.id"
/>
</el-select>
</el-form-item>
<el-form-item label="计划编码" prop="code">
<el-input
v-model="queryParams.code"
placeholder="请输入计划编码"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="产品" prop="productId">
<el-select
v-model="queryParams.productId"
@change="handleQuery"
clearable
filterable
placeholder="请选择产品"
class="!w-240px"
>
<el-option
v-for="item in productList"
:key="item.id"
:label="item.name"
:value="item.id"
/>
</el-select>
</el-form-item>
<el-form-item label="计划开始" prop="planStartTime">
<el-date-picker
v-model="queryParams.planStartTime"
value-format="YYYY-MM-DD HH:mm:ss"
type="daterange"
@change="handleQuery"
start-placeholder="开始日期"
end-placeholder="结束日期"
:default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="计划结束" prop="planEndTime">
<el-date-picker
v-model="queryParams.planEndTime"
value-format="YYYY-MM-DD HH:mm:ss"
type="daterange"
@change="handleQuery"
start-placeholder="开始日期"
end-placeholder="结束日期"
:default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="领料人" prop="productionManagerId">
<el-input
v-model="queryParams.productionManagerId"
placeholder="请输入领料人"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="备注" prop="remark">
<el-input
v-model="queryParams.remark"
placeholder="请输入备注"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item>
<el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> 搜索</el-button>
<el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> 重置</el-button>
<el-button
type="primary"
plain
@click="openForm('create')"
v-hasPermi="['mes:plan:create']"
>
<Icon icon="ep:plus" class="mr-5px" /> 新增
</el-button>
<el-button
type="success"
plain
@click="handleExport"
:loading="exportLoading"
v-hasPermi="['mes:plan:export']"
>
<Icon icon="ep:download" class="mr-5px" /> 导出
</el-button>
</el-form-item>
<el-row>
<el-col :span="6">
<el-form-item label="任务单" prop="taskId">
<el-select
v-model="queryParams.taskId"
@change="handleQuery"
clearable
filterable
placeholder="请选择"
class="!w-180px"
>
<el-option
v-for="item in taskList"
:key="item.id"
:label="item.code"
:value="item.id"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="计划编码" prop="code">
<el-input
v-model="queryParams.code"
placeholder="请输入计划编码"
clearable
@keyup.enter="handleQuery"
class="!w-180px"
/>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="产品" prop="productId">
<el-select
v-model="queryParams.productId"
@change="handleQuery"
clearable
filterable
placeholder="请选择产品"
class="!w-180px"
>
<el-option
v-for="item in productList"
:key="item.id"
:label="item.name"
:value="item.id"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="备注" prop="remark">
<el-input
v-model="queryParams.remark"
placeholder="请输入备注"
clearable
@keyup.enter="handleQuery"
class="!w-180px"
/>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="6">
<el-form-item label="计划开始" prop="planStartTime">
<el-date-picker
v-model="queryParams.planStartTime"
value-format="YYYY-MM-DD HH:mm:ss"
type="daterange"
@change="handleQuery"
start-placeholder="开始日期"
end-placeholder="结束日期"
:default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"
class="!w-160px"
/>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="计划结束" prop="planEndTime">
<el-date-picker
v-model="queryParams.planEndTime"
value-format="YYYY-MM-DD HH:mm:ss"
type="daterange"
@change="handleQuery"
start-placeholder="开始日期"
end-placeholder="结束日期"
:default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"
class="!w-160px"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item>
<el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> 搜索</el-button>
<el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> 重置</el-button>
<el-button
type="primary"
plain
@click="openForm('create')"
v-hasPermi="['mes:plan:create']"
>
<Icon icon="ep:plus" class="mr-5px" /> 新增
</el-button>
<el-button
type="success"
plain
@click="handleExport"
:loading="exportLoading"
v-hasPermi="['mes:plan:export']"
>
<Icon icon="ep:download" class="mr-5px" /> 导出
</el-button>
</el-form-item>
</el-col>
</el-row>
</el-form>
</ContentWrap>

@ -2,36 +2,61 @@
<!-- 列表 -->
<ContentWrap>
<el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true">
<el-table-column label="工序" align="center" prop="productName" width="120px" />
<el-table-column label="成品数量" align="center" prop="number" width="80px"/>
<el-table-column label="完成进度" align="center" >
<el-table-column label="工序" align="center" prop="orgType" >
<template #default="scope">
<el-progress :percentage="scope.row.finishNumber/scope.row.number" :stroke-width="15" :color="finishColors" striped striped-flow />
<dict-tag :type="DICT_TYPE.MES_ORG_TYPE" :value="scope.row.orgType" />
</template>
</el-table-column>
<el-table-column label="废品数量" align="center" prop="finishNumber" width="120px"/>
<el-table-column label="完成数量" align="center" prop="totalQualityNumber" width="80px"/>
<el-table-column label="完成进度" align="center">
<template #default="scope">
<el-progress
:percentage="erpNumberFormatter((scope.row.totalQualityNumber/props.planNumber)*100,2)"
:stroke-width="15"
:color="finishColors"
:striped="true"
:striped-flow="true"
/>
</template>
</el-table-column>
<el-table-column label="废品数量" align="center" prop="totalWasteNumber" width="80px"/>
<el-table-column label="废品率" align="center" >
<el-progress type="circle" :percentage="5" :color="wasteColors" :width="40">
<template #default="{ percentage }">
<span class="percentage-value">{{ percentage }}%</span>
</template>
</el-progress>
<template #default="scope">
<el-progress :percentage="5" :stroke-width="15" :color="wasteColors" type="circle" :width="50" striped striped-flow>
<span class="percentage-value">{{erpNumberFormatter((scope.row.totalWasteNumber/(scope.row.totalQualityNumber+scope.row.totalWasteNumber))*100 ,2) }}%</span>
</el-progress>
</template>
</el-table-column>
<el-table-column label="时长/h" align="center" prop="totalTimeSummary" width="100px"/>
<el-table-column label="计件时长/h" align="center" prop="reportTimeSummary" width="100px"/>
<el-table-column label="操作" align="center"/>
</el-table>
</ContentWrap>
</template>
<script setup lang="ts">
import { PlanApi } from '@/api/mes/plan'
import {WorkReportPlanApi} from "@/api/mes/workreportplan";
import {DICT_TYPE} from "@/utils/dict";
import {erpNumberFormatter} from "@/utils";
const { t } = useI18n() //
const message = useMessage() //
const props = defineProps<{
planId?: number // ID
planNumber?: number // ID
}>()
const loading = ref(false) //
// {
// "planId": 123,
// "planCode": "JH-20240705017",
// "productId": 38,
// "productName": "",
// "totalQualityNumber": 201,
// "totalWasteNumber": 2,
// "reportTimeSummary": 1,
// "totalTimeSummary": 5,
// "orgType": "zhijiang"
// }
const list = ref([]) //
const finishColors = [
{ color: '#ce1f09', percentage: 20 },
@ -67,6 +92,7 @@ const handleQuery = () => {
onMounted(() => {
getList()
})
</script>
<style scoped>

@ -8,99 +8,113 @@
:inline="true"
label-width="68px"
>
<el-form-item label="任务单" prop="taskId">
<el-select
v-model="queryParams.taskId"
@change="handleQuery"
clearable
filterable
placeholder="请选择"
class="!w-240px"
>
<el-option
v-for="item in taskList"
:key="item.id"
:label="item.code"
:value="item.id"
/>
</el-select>
</el-form-item>
<el-form-item label="计划编码" prop="code">
<el-input
v-model="queryParams.code"
placeholder="请输入计划编码"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="产品" prop="productId">
<el-select
v-model="queryParams.productId"
@change="handleQuery"
clearable
filterable
placeholder="请选择产品"
class="!w-240px"
>
<el-option
v-for="item in productList"
:key="item.id"
:label="item.name"
:value="item.id"
/>
</el-select>
</el-form-item>
<el-form-item label="计划开始" prop="planStartTime">
<el-date-picker
v-model="queryParams.planStartTime"
value-format="YYYY-MM-DD HH:mm:ss"
type="daterange"
@change="handleQuery"
start-placeholder="开始日期"
end-placeholder="结束日期"
:default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="计划结束" prop="planEndTime">
<el-date-picker
v-model="queryParams.planEndTime"
value-format="YYYY-MM-DD HH:mm:ss"
type="daterange"
@change="handleQuery"
start-placeholder="开始日期"
end-placeholder="结束日期"
:default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="备注" prop="remark">
<el-input
v-model="queryParams.remark"
placeholder="请输入备注"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item>
<el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> 搜索</el-button>
<el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> 重置</el-button>
<el-button
type="success"
plain
@click="handleExport"
:loading="exportLoading"
>
<Icon icon="ep:download" class="mr-5px" /> 导出
</el-button>
</el-form-item>
<el-row>
<el-col :span="6">
<el-form-item label="任务单" prop="taskId">
<el-select
v-model="queryParams.taskId"
@change="handleQuery"
clearable
filterable
placeholder="请选择"
class="!w-180px"
>
<el-option
v-for="item in taskList"
:key="item.id"
:label="item.code"
:value="item.id"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="计划编码" prop="code">
<el-input
v-model="queryParams.code"
placeholder="请输入计划编码"
clearable
@keyup.enter="handleQuery"
class="!w-180px"
/>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="产品" prop="productId">
<el-select
v-model="queryParams.productId"
@change="handleQuery"
clearable
filterable
placeholder="请选择产品"
class="!w-180px"
>
<el-option
v-for="item in productList"
:key="item.id"
:label="item.name"
:value="item.id"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="备注" prop="remark">
<el-input
v-model="queryParams.remark"
placeholder="请输入备注"
clearable
@keyup.enter="handleQuery"
class="!w-180px"
/>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="6">
<el-form-item label="计划开始" prop="planStartTime">
<el-date-picker
v-model="queryParams.planStartTime"
value-format="YYYY-MM-DD HH:mm:ss"
type="daterange"
@change="handleQuery"
start-placeholder="开始日期"
end-placeholder="结束日期"
:default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"
class="!w-160px"
/>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="计划结束" prop="planEndTime">
<el-date-picker
v-model="queryParams.planEndTime"
value-format="YYYY-MM-DD HH:mm:ss"
type="daterange"
@change="handleQuery"
start-placeholder="开始日期"
end-placeholder="结束日期"
:default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"
class="!w-160px"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item>
<el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> 搜索</el-button>
<el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> 重置</el-button>
<el-button
type="success"
plain
@click="handleExport"
:loading="exportLoading"
v-hasPermi="['mes:plan:export']"
>
<Icon icon="ep:download" class="mr-5px" /> 导出
</el-button>
</el-form-item>
</el-col>
</el-row>
</el-form>
</ContentWrap>
@ -118,11 +132,11 @@
<el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true">
<!-- 进度子表的列表 -->
<el-table-column type="expand">
<el-table-column type="expand" >
<template #default="scope">
<el-tabs model-value="progressList">
<el-tab-pane label="工序进度" name="progressList">
<ProgressList :plan-id="scope.row.id" />
<ProgressList :plan-id="scope.row.id" :plan-number="scope.row.planNumber"/>
</el-tab-pane>
<el-tab-pane v-if="scope.row.status > 0" label="投料明细" name="itemRequisitionDetail">
<ItemRequisitionDetailList :item-requisition-id="scope.row.requisitionId" />
@ -130,8 +144,8 @@
</el-tabs>
</template>
</el-table-column>
<el-table-column label="计划编码" align="center" prop="code" min-width="150px" />
<el-table-column label="产品" align="center" prop="productName" min-width="150px"/>
<el-table-column label="计划编码" align="center" prop="code" min-width="140px" />
<el-table-column label="产品" align="center" prop="productName" min-width="150px" />
<el-table-column label="任务单" align="center" prop="taskCode" min-width="150px" />
<el-table-column label="数量" align="center" prop="planNumber" />
<el-table-column label="状态" align="center" prop="status" sortable>
@ -178,12 +192,12 @@ import { getIntDictOptions, getBoolDictOptions, DICT_TYPE } from '@/utils/dict'
import {dateFormatter, dateFormatter2} from '@/utils/formatTime'
import download from '@/utils/download'
import { PlanApi, PlanVO } from '@/api/mes/plan'
import PlanForm from './PlanForm.vue'
import {ProductApi, ProductVO} from "@/api/erp/product/product";
import {TaskApi, TaskVO} from "@/api/mes/task";
import ItemNeedIndex from "@/views/mes/bom/ItemNeedIndex.vue";
import Paigong from "./components/Paigong.vue";
import BomDetailList from "@/views/mes/bom/components/BomDetailList.vue";
import ProgressList from "./ProgressList.vue";
import ItemRequisitionDetailList
from "@/views/mes/itemrequisition/components/ItemRequisitionDetailList.vue";

@ -7,6 +7,9 @@
label-width="100px"
v-loading="formLoading"
>
<el-form-item label="工人">
{{userStore.getUser.nickname}}
</el-form-item>
<el-row>
<el-col :span="12">
<el-form-item label="日期" prop="reportDate">
@ -37,43 +40,29 @@
</el-form-item>
</el-col>
</el-row>
<el-form-item label="类型" prop="orgType">
<el-radio-group v-model="formData.orgType">
<el-radio
:disabled="isDisableUpdate"
v-for="dict in getStrDictOptions(DICT_TYPE.MES_ORG_TYPE)"
:key="dict.value"
:label="dict.value"
@change="changeDate"
>
{{ dict.label }}
</el-radio>
</el-radio-group>
</el-form-item>
<el-row v-if="formData.orgType && formData.groupType && formData.reportDate">
<el-row>
<el-col :span="12">
<el-form-item label="工人" prop="userId">
<el-form-item label="工序" prop="orgType">
<el-select
:disabled="isDisable"
v-model="formData.userId"
disabled
v-model="formData.orgType"
placeholder="请选择工序"
clearable
filterable
@change="changeDate"
placeholder="请选择工人"
class="!w-180px"
>
<el-option
v-for="item in userList"
:key="item.id"
:label="item.nickname"
:value="item.id"
v-for="dict in getStrDictOptions(DICT_TYPE.MES_ORG_TYPE)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-col v-if="formData.groupType && formData.reportDate" :span="12">
<el-form-item label="工位" prop="orgId">
<el-select
:disabled="isDisable"
:disabled="isDisableUpdate"
v-model="formData.orgId"
clearable
filterable
@ -164,6 +153,7 @@ import {ProductApi, ProductVO} from "@/api/erp/product/product";
import {OrgWorkerApi, OrgWorkerVO} from "@/api/mes/orgworker";
import {PlanApi} from "@/api/mes/plan";
import {formatToDate, formatToDateTime} from "@/utils/dateUtil";
import {useUserStore} from "@/store/modules/user";
/** 生产报工明细 表单 */
defineOptions({ name: 'ProduceReportDetailForm' })
@ -171,10 +161,10 @@ defineOptions({ name: 'ProduceReportDetailForm' })
const { t } = useI18n() //
const message = useMessage() //
const userList = ref<UserApi.UserVO[]>([]) //
const organizationTree = ref() //
const productList = ref<ProductVO[]>([]) //
const productList = ref<ProductVO[]>([]) //
const userStore = useUserStore()
const dialogVisible = ref(false) //
const dialogTitle = ref('') //
const formLoading = ref(false) // 12
@ -212,19 +202,17 @@ const formRules = reactive({
orgType: [{ required: true, message: '工序不能为空', trigger: 'blur' }],
})
const formRef = ref() // Ref
const isDisable = ref(false)
const isDisableUpdate = ref(false)
/** 打开弹窗 */
const open = async (type: string, id?: number) => {
dialogVisible.value = true
dialogTitle.value = t('action.' + type)
dialogTitle.value = t('action.' + type) + '报工'
formType.value = type
resetForm()
formData.value.reportDate = getCurrentDate()
formData.value.groupType = 1
formData.value.orgType = 'zhijiang'
warningInfo.value = ''
isDisable.value = false
isDisableUpdate.value = false
//
if (id) {
@ -236,27 +224,15 @@ const open = async (type: string, id?: number) => {
formLoading.value = false
}
isDisableUpdate.value=true;
isDisable.value = true;
}
await getOrganizationTree()
productList.value = await PlanApi.getStartAndFinishPlanProduct()
if(productList.value.length ==1)
formData.value.productId = productList.value[0].id
if(type === 'replace'){
dialogTitle.value = "代报工"
formData.value.reportType = '代报工'
userList.value = await OrgWorkerApi.getOtherPersonalUser()
}
else if(type === 'create'){
formData.value.reportType = '个人'
userList.value = await OrgWorkerApi.getPersonalUser()
if(userList.value && userList.value.length>0){
formData.value.userId = userList.value[0].id
}
}
else if(type === 'update'){
isDisable.value = true
userList.value = await UserApi.getSimpleUserList()
formData.value.userId = userStore.getUser.id
}
await changeDate()
}
@ -272,7 +248,7 @@ const submitForm = async (reportType?:string) => {
try {
formData.value.reportDateString = formData.value.reportDate
const data = formData.value as unknown as ProduceReportDetailVO
if (formType.value === 'create' || formType.value === 'replace') {
if (formType.value === 'create') {
await ProduceReportDetailApi.createProduceReportDetail(data)
message.success(t('common.createSuccess'))
} else {
@ -320,32 +296,21 @@ const getCurrentDate = () =>{
if(day<10)day = '0'+day;
return year + "-" + month + "-" + day +" 00:00:00";
}
/** 获得产线工位树 */
const getOrganizationTree = async () => {
organizationTree.value = []
const data = await OrganizationApi.getOrganizationList()
const root: Tree = { id: 0, name: 'ALL', children: [] }
root.children = handleTree(data, 'id', 'parentId')
organizationTree.value.push(root)
}
const warningInfo = ref()
const orgWorkerList = ref<OrgWorkerVO[]>([]) //
//
const changeDate = async () =>{
if(formData.value.reportDate && formData.value.groupType && formData.value.orgType){
if(formType.value=='replace'){
orgWorkerList.value = await OrgWorkerApi.getOrgWorkerList2(formData.value)
userList.value = await OrgWorkerApi.getOtherPersonalUser(formData.value)
}else{
orgWorkerList.value = await OrgWorkerApi.getOrgWorkerList1(formData.value)
}
if(formData.value.reportDate && formData.value.groupType ){
orgWorkerList.value = await OrgWorkerApi.getOrgWorkerList1(formData.value)
if(orgWorkerList.value && orgWorkerList.value.length>0){
formData.value.orgId = orgWorkerList.value[0].orgId
formData.value.orgType = orgWorkerList.value[0].orgType
warningInfo.value=''
}
else{
formData.value.orgId = undefined
warningInfo.value = '未查询到用户的工位安排信息!请联系组长或主管安排工位'
warningInfo.value = '该条件下未查询到工位安排信息!'
message.error(warningInfo.value)
}
}

@ -75,7 +75,7 @@
<el-button
type="warning"
plain
@click="openForm('replace')"
@click="openReplaceForm('replace')"
v-hasPermi="['mes:produce-report-detail:replace']"
>
<Icon icon="ep:plus" class="mr-5px" /> 代报工
@ -96,8 +96,8 @@
<!-- 列表 -->
<ContentWrap>
<el-tabs v-model="activeName" @tab-click="handleTabClick">
<el-tab-pane label="所有" name="" />
<el-tab-pane label="通过" name="2" />
<el-tab-pane label="个人" name="个人" />
<el-tab-pane label="代报工" name="代报工" v-if="checkPermi(['mes:produce-report-detail:replace'])"/>
</el-tabs>
<el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true">
@ -111,7 +111,7 @@
/>
<el-table-column label="产品" align="center" width="120px" prop="productName" />
<el-table-column label="工人" align="center" width="80px" prop="userName" />
<el-table-column label="工位" align="center" width="80px" prop="orgName" />
<el-table-column label="工位" align="center" width="90px" prop="orgName" />
<el-table-column label="成品数量" align="center" prop="qualityNumber" />
<el-table-column label="废品数量" align="center" prop="wasteNumber" />
<el-table-column label="总数量" align="center" prop="totalNumber" />
@ -122,7 +122,7 @@
<el-table-column label="计件时长" align="center" prop="reportTime" />
<el-table-column label="废品原因" align="center" prop="wasteReason" />
<el-table-column label="备注" align="center" prop="remark" />
<el-table-column label="类型" align="center" fixed="right" prop="reportType">
<el-table-column label="类型" align="center" fixed="right" prop="reportType" width="90px">
<template #default="scope">
<dict-tag :type="DICT_TYPE.MES_PRODUCE_REPORT_TYPE" :value="scope.row.reportType" />
</template>
@ -139,7 +139,7 @@
:formatter="dateFormatter"
width="120px"
/>
<el-table-column label="操作" align="center" fixed="right" width="220px">
<el-table-column label="操作" align="center" fixed="right" width="200px">
<template #default="scope">
<el-button
link
@ -164,11 +164,12 @@
v-if="scope.row.reportStatus === 1"
type="warning"
@click="updateStatus(scope.row.id,3,'驳回')"
v-hasPermi="['mes:produce-report-detail:update']"
v-hasPermi="['mes:produce-report-detail:replace']"
>
驳回
</el-button>
<el-button
v-if="scope.row.reportStatus < 2 && scope.row.userId === userStore.getUser.id"
link
type="primary"
@click="openForm('update', scope.row.id)"
@ -176,6 +177,15 @@
>
编辑
</el-button>
<el-button
v-else-if="scope.row.reportStatus < 2 && scope.row.userId !== userStore.getUser.id"
link
type="primary"
@click="openReplaceForm('update', scope.row.id)"
v-hasPermi="['mes:produce-report-detail:update']"
>
编辑
</el-button>
<el-button
link
type="danger"
@ -198,6 +208,9 @@
<!-- 表单弹窗添加/修改 -->
<ProduceReportDetailForm ref="formRef" @success="getList" />
<!-- 代报工弹窗添加/修改 -->
<ReplaceForm ref="replaceFormRef" @success="getList" />
</template>
<script setup lang="ts">
@ -206,14 +219,18 @@ import {dateFormatter, dateFormatter2} from '@/utils/formatTime'
import download from '@/utils/download'
import { ProduceReportDetailApi, ProduceReportDetailVO } from '@/api/mes/producereport'
import ProduceReportDetailForm from './ProduceReportDetailForm.vue'
import ReplaceForm from './components/ReplaceForm.vue'
import {defaultProps, handleTree} from "@/utils/tree";
import * as UserApi from "@/api/system/user";
import {OrganizationApi} from "@/api/mes/organization";
import {ProductApi, ProductVO} from "@/api/erp/product/product";
import {erpCountTableColumnFormatter} from "@/utils";
import {useUserStore} from "@/store/modules/user";
import {checkPermi} from "@/utils/permission";
/** 生产报工明细 列表 */
defineOptions({ name: 'ProduceReportDetail' })
const userStore = useUserStore()
const message = useMessage() //
const { t } = useI18n() //
@ -232,18 +249,13 @@ const queryParams = reactive({
productId: undefined,
userId: undefined,
orgId: undefined,
qualityRate: undefined,
wasteReason: undefined,
totalTime: undefined,
packageNumber: undefined,
remark: undefined,
isEnable: undefined,
createTime: [],
qualityNumber: undefined,
wasteNumber: undefined,
totalNumber: undefined,
reportDate: [],
reportStatus: undefined,
reportType: undefined
})
const queryFormRef = ref() //
const exportLoading = ref(false) //
@ -272,12 +284,16 @@ const resetQuery = () => {
handleQuery()
}
/** 添加/修改操作 */
/** 个人添加/修改操作 */
const formRef = ref()
const openForm = (type: string, id?: number) => {
formRef.value.open(type, id)
}
/** 代报工添加/修改操作 */
const replaceFormRef = ref()
const openReplaceForm = (type: string, id?: number) => {
replaceFormRef.value.open(type, id)
}
/** 删除按钮操作 */
const handleDelete = async (id: number) => {
try {
@ -324,9 +340,9 @@ onMounted(async () => {
productList.value = await ProductApi.getMesProductSimpleList()
})
/** tab 切换 */
let activeName = ''
let activeName = '个人'
const handleTabClick = (tab: TabsPaneContext) => {
queryParams.reportStatus = tab.paneName
queryParams.reportType = tab.paneName
handleQuery()
}

@ -1,180 +0,0 @@
<template>
<Dialog :title="dialogTitle" v-model="dialogVisible">
<el-form
ref="formRef"
:model="formData"
:rules="formRules"
label-width="100px"
v-loading="formLoading"
>
<el-form-item label="生产计划ID" prop="planId">
<el-input v-model="formData.planId" placeholder="请输入生产计划ID" />
</el-form-item>
<el-form-item label="产品ID" prop="productId">
<el-input v-model="formData.productId" placeholder="请输入产品ID" />
</el-form-item>
<el-form-item label="用户ID" prop="userId">
<el-input v-model="formData.userId" placeholder="请输入用户ID" />
</el-form-item>
<el-form-item label="组织ID" prop="orgId">
<el-input v-model="formData.orgId" placeholder="请输入组织ID" />
</el-form-item>
<el-form-item label="成品率" prop="qualityRate">
<el-input v-model="formData.qualityRate" placeholder="请输入成品率" />
</el-form-item>
<el-form-item label="备注" prop="wasteReason">
<el-input v-model="formData.wasteReason" placeholder="请输入备注" />
</el-form-item>
<el-form-item label="总时长" prop="totalTime">
<el-input v-model="formData.totalTime" placeholder="请输入总时长" />
</el-form-item>
<el-form-item label="打包数量" prop="packageNumber">
<el-input v-model="formData.packageNumber" placeholder="请输入打包数量" />
</el-form-item>
<el-form-item label="备注" prop="remark">
<el-input v-model="formData.remark" placeholder="请输入备注" />
</el-form-item>
<el-form-item label="是否启用" prop="isEnable">
<el-radio-group v-model="formData.isEnable">
<el-radio
v-for="dict in getBoolDictOptions(DICT_TYPE.INFRA_BOOLEAN_STRING)"
:key="dict.value"
:label="dict.value"
>
{{ dict.label }}
</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="成品数量" prop="qualityNumber">
<el-input v-model="formData.qualityNumber" placeholder="请输入成品数量" />
</el-form-item>
<el-form-item label="废品数量" prop="wasteNumber">
<el-input v-model="formData.wasteNumber" placeholder="请输入废品数量" />
</el-form-item>
<el-form-item label="总数量" prop="totalNumber">
<el-input v-model="formData.totalNumber" placeholder="请输入总数量" />
</el-form-item>
<el-form-item label="报工日期" prop="reportDate">
<el-date-picker
v-model="formData.reportDate"
type="date"
value-format="x"
placeholder="选择报工日期"
/>
</el-form-item>
<el-form-item label="计件时间" prop="reportTime">
<el-input v-model="formData.reportTime" placeholder="请输入计件时间" />
</el-form-item>
</el-form>
<template #footer>
<el-button @click="submitForm" type="primary" :disabled="formLoading"> </el-button>
<el-button @click="dialogVisible = false"> </el-button>
</template>
</Dialog>
</template>
<script setup lang="ts">
import { ProduceReportApi } from '@/api/mes/producereport'
import {getBoolDictOptions} from "@/utils/dict";
const { t } = useI18n() //
const message = useMessage() //
const dialogVisible = ref(false) //
const dialogTitle = ref('') //
const formLoading = ref(false) // 12
const formType = ref('') // create - update -
const formData = ref({
id: undefined,
reportId: undefined,
planId: undefined,
productId: undefined,
userId: undefined,
orgId: undefined,
qualityRate: undefined,
wasteReason: undefined,
totalTime: undefined,
packageNumber: undefined,
remark: undefined,
isEnable: undefined,
qualityNumber: undefined,
wasteNumber: undefined,
totalNumber: undefined,
reportDate: undefined,
reportTime: undefined,
})
const formRules = reactive({
planId: [{ required: true, message: '生产计划ID不能为空', trigger: 'blur' }],
productId: [{ required: true, message: '产品ID不能为空', trigger: 'blur' }],
userId: [{ required: true, message: '用户ID不能为空', trigger: 'blur' }],
orgId: [{ required: true, message: '组织ID不能为空', trigger: 'blur' }],
isEnable: [{ required: true, message: '是否启用不能为空', trigger: 'blur' }],
})
const formRef = ref() // Ref
/** 打开弹窗 */
const open = async (type: string, id?: number, reportId: number) => {
dialogVisible.value = true
dialogTitle.value = t('action.' + type)
formType.value = type
resetForm()
formData.value.reportId = reportId
//
if (id) {
formLoading.value = true
try {
formData.value = await ProduceReportApi.getProduceReportDetail(id)
} finally {
formLoading.value = false
}
}
}
defineExpose({ open }) // open
/** 提交表单 */
const emit = defineEmits(['success']) // success
const submitForm = async () => {
//
await formRef.value.validate()
//
formLoading.value = true
try {
const data = formData.value
if (formType.value === 'create') {
await ProduceReportApi.createProduceReportDetail(data)
message.success(t('common.createSuccess'))
} else {
await ProduceReportApi.updateProduceReportDetail(data)
message.success(t('common.updateSuccess'))
}
dialogVisible.value = false
//
emit('success')
} finally {
formLoading.value = false
}
}
/** 重置表单 */
const resetForm = () => {
formData.value = {
id: undefined,
reportId: undefined,
planId: undefined,
productId: undefined,
userId: undefined,
orgId: undefined,
qualityRate: undefined,
wasteReason: undefined,
totalTime: undefined,
packageNumber: undefined,
remark: undefined,
isEnable: undefined,
qualityNumber: undefined,
wasteNumber: undefined,
totalNumber: undefined,
reportDate: undefined,
reportTime: undefined,
}
formRef.value?.resetFields()
}
</script>

@ -1,147 +0,0 @@
<template>
<!-- 列表 -->
<ContentWrap>
<el-button
type="primary"
plain
@click="openForm('create')"
v-hasPermi="['mes:produce-report:create']"
>
<Icon icon="ep:plus" class="mr-5px" /> 新增
</el-button>
<el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true">
<el-table-column label="ID" align="center" prop="id" />
<el-table-column label="生产计划ID" align="center" prop="planId" />
<el-table-column label="产品ID" align="center" prop="productId" />
<el-table-column label="用户ID" align="center" prop="userId" />
<el-table-column label="组织ID" align="center" prop="orgId" />
<el-table-column label="成品率" align="center" prop="qualityRate" />
<el-table-column label="备注" align="center" prop="wasteReason" />
<el-table-column label="总时长" align="center" prop="totalTime" />
<el-table-column label="打包数量" align="center" prop="packageNumber" />
<el-table-column label="备注" align="center" prop="remark" />
<el-table-column label="是否启用" align="center" prop="isEnable" />
<el-table-column
label="创建时间"
align="center"
prop="createTime"
:formatter="dateFormatter"
width="180px"
/>
<el-table-column label="成品数量" align="center" prop="qualityNumber" />
<el-table-column label="废品数量" align="center" prop="wasteNumber" />
<el-table-column label="总数量" align="center" prop="totalNumber" />
<el-table-column
label="报工日期"
align="center"
prop="reportDate"
:formatter="dateFormatter"
width="180px"
/>
<el-table-column label="计件时间" align="center" prop="reportTime" />
<el-table-column label="操作" align="center" fixed="right" width="150">
<template #default="scope">
<el-button
link
type="primary"
@click="openForm('update', scope.row.id)"
v-hasPermi="['mes:produce-report:update']"
>
编辑
</el-button>
<el-button
link
type="danger"
@click="handleDelete(scope.row.id)"
v-hasPermi="['mes:produce-report:delete']"
>
删除
</el-button>
</template>
</el-table-column>
</el-table>
<!-- 分页 -->
<Pagination
:total="total"
v-model:page="queryParams.pageNo"
v-model:limit="queryParams.pageSize"
@pagination="getList"
/>
</ContentWrap>
<!-- 表单弹窗添加/修改 -->
<ProduceReportDetailForm ref="formRef" @success="getList" />
</template>
<script setup lang="ts">
import { dateFormatter } from '@/utils/formatTime'
import { ProduceReportApi } from '@/api/mes/producereport'
import ProduceReportDetailForm from './ProduceReportDetailForm.vue'
const { t } = useI18n() //
const message = useMessage() //
const props = defineProps<{
reportId?: number // id
}>()
const loading = ref(false) //
const list = ref([]) //
const total = ref(0) //
const queryParams = reactive({
pageNo: 1,
pageSize: 10,
reportId: undefined as unknown
})
/** 监听主表的关联字段的变化,加载对应的子表数据 */
watch(
() => props.reportId,
(val: number) => {
if (!val) {
return
}
queryParams.reportId = val
handleQuery()
},
{ immediate: true, deep: true }
)
/** 查询列表 */
const getList = async () => {
loading.value = true
try {
const data = await ProduceReportApi.getProduceReportDetailPage(queryParams)
list.value = data.list
total.value = data.total
} finally {
loading.value = false
}
}
/** 搜索按钮操作 */
const handleQuery = () => {
queryParams.pageNo = 1
getList()
}
/** 添加/修改操作 */
const formRef = ref()
const openForm = (type: string, id?: number) => {
if (!props.reportId) {
message.error('请选择一个生产报工单')
return
}
formRef.value.open(type, id, props.reportId)
}
/** 删除按钮操作 */
const handleDelete = async (id: number) => {
try {
//
await message.delConfirm()
//
await ProduceReportApi.deleteProduceReportDetail(id)
message.success(t('common.delSuccess'))
//
await getList()
} catch {}
}
</script>

@ -14,8 +14,9 @@
:disabled="isDisableUpdate"
v-model="formData.reportDate"
type="date"
value-format="x"
value-format="YYYY-MM-DD HH:mm:ss"
placeholder="选择日期"
:default-value="new Date()"
@change="changeDate"
/>
</el-form-item>
@ -37,24 +38,27 @@
</el-col>
</el-row>
<el-form-item label="类型" prop="orgType">
<el-select v-model="formData.orgType" @change="changeDate" placeholder="请选择类型">
<el-option
<el-radio-group v-model="formData.orgType">
<el-radio
:disabled="isDisableUpdate"
v-for="dict in getStrDictOptions(DICT_TYPE.MES_ORG_TYPE)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
:label="dict.value"
@change="changeDate"
>
{{ dict.label }}
</el-radio>
</el-radio-group>
</el-form-item>
<el-row>
<el-row v-if="formData.orgType && formData.groupType && formData.reportDate">
<el-col :span="12">
<el-form-item label="工人" prop="userId">
<el-select
:disabled="isDisable"
:disabled="isDisableUpdate"
v-model="formData.userId"
clearable
filterable
@change="changeDateUser"
placeholder="请选择工人"
>
<el-option
@ -68,19 +72,25 @@
</el-col>
<el-col :span="12">
<el-form-item label="工位" prop="orgId">
<el-tree-select
<el-select
:disabled="isDisableUpdate"
v-model="formData.orgId"
:data="organizationTree"
:props="defaultProps"
check-strictly
default-expand-all
clearable
filterable
placeholder="请选择工位"
/>
>
<el-option
v-for="item in orgWorkerList"
:key="item.orgId"
:label="item.orgName"
:value="item.orgId"
/>
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-text v-if="warningInfo" class="mx-1" type="warning">{{warningInfo}}</el-text>
<el-divider />
<el-form-item label="产品" prop="productId">
<el-select v-model="formData.productId" clearable filterable placeholder="请选择" >
<el-option
@ -95,12 +105,12 @@
<el-row>
<el-col :span="12">
<el-form-item label="成品数量" prop="qualityNumber">
<el-input-number v-model="formData.qualityNumber" :min="0" placeholder="请输入数量"/>
<el-input-number v-model="formData.qualityNumber" :min="0" @change="numberChange" placeholder="请输入数量"/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="废品数量" prop="wasteNumber">
<el-input-number v-model="formData.wasteNumber" :min="0" placeholder="请输入"/>
<el-input-number v-model="formData.wasteNumber" :min="0" @change="numberChange" placeholder="请输入"/>
</el-form-item>
</el-col>
</el-row>
@ -111,7 +121,7 @@
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="成品率" prop="qualityRate">
<el-form-item label="成品率%" prop="qualityRate">
<el-input-number disabled v-model="formData.qualityRate" :min="0" :precision="2" placeholder="请输入数量"/>
</el-form-item>
</el-col>
@ -151,7 +161,10 @@ import {defaultProps, handleTree} from "@/utils/tree";
import {OrganizationApi, OrganizationVO} from "@/api/mes/organization";
import * as UserApi from "@/api/system/user";
import {ProductApi, ProductVO} from "@/api/erp/product/product";
import {OrgWorkerApi} from "@/api/mes/orgworker";
import {OrgWorkerApi, OrgWorkerVO} from "@/api/mes/orgworker";
import {PlanApi} from "@/api/mes/plan";
import {formatToDate, formatToDateTime} from "@/utils/dateUtil";
import {WorkTeamApi} from "@/api/mes/workteam";
/** 生产报工明细 表单 */
defineOptions({ name: 'ProduceReportDetailForm' })
@ -159,9 +172,9 @@ defineOptions({ name: 'ProduceReportDetailForm' })
const { t } = useI18n() //
const message = useMessage() //
const userList = ref<UserApi.UserVO[]>([]) //
const organizationTree = ref() //
const productList = ref<ProductVO[]>([]) //
const dialogVisible = ref(false) //
const dialogTitle = ref('') //
const formLoading = ref(false) // 12
@ -187,6 +200,8 @@ const formData = ref({
reportDate: undefined,
reportTime: undefined,
reportStatus: undefined,
reportDateString: undefined,
reportType: undefined
})
const formRules = reactive({
reportDate: [{ required: true, message: '日期不能为空', trigger: 'blur' }],
@ -197,7 +212,7 @@ const formRules = reactive({
orgType: [{ required: true, message: '工序不能为空', trigger: 'blur' }],
})
const formRef = ref() // Ref
const isDisable = ref(false)
const isDisableUpdate = ref(false)
/** 打开弹窗 */
const open = async (type: string, id?: number) => {
@ -207,43 +222,46 @@ const open = async (type: string, id?: number) => {
resetForm()
formData.value.reportDate = getCurrentDate()
formData.value.groupType = 1
formData.value.orgType = 'zhijiang'
warningInfo.value = ''
isDisableUpdate.value = false
//
if (id) {
formLoading.value = true
try {
formData.value = await ProduceReportDetailApi.getProduceReportDetail(id)
formData.value.reportDate = formatToDateTime(new Date(formData.value.reportDate))
} finally {
formLoading.value = false
}
isDisableUpdate.value=true;
isDisable.value = true;
}
await getOrganizationTree()
productList.value = await ProductApi.getItemSimpleList()
if(type == 'replace'){
isDisable.value = false
userList.value = await OrgWorkerApi.getPersonalUser()
await changeDate()
productList.value = await PlanApi.getStartAndFinishPlanProduct()
if(productList.value.length ==1)
formData.value.productId = productList.value[0].id
if(type === 'replace'){
dialogTitle.value = "代报工"
formData.value.reportType = '代报工'
}
if(type == 'create'){
userList.value = await OrgWorkerApi.getOtherPersonalUser()
else if(type === 'update'){
dialogTitle.value = "编辑代报工"
}
//
console.log(userList.value)
}
defineExpose({ open }) // open
/** 提交表单 */
const emit = defineEmits(['success']) // success
const submitForm = async () => {
const submitForm = async (reportType?:string) => {
//
await formRef.value.validate()
//
formLoading.value = true
try {
formData.value.reportDateString = formData.value.reportDate
const data = formData.value as unknown as ProduceReportDetailVO
if (formType.value === 'create') {
if (formType.value === 'replace') {
await ProduceReportDetailApi.createProduceReportDetail(data)
message.success(t('common.createSuccess'))
} else {
@ -282,15 +300,6 @@ const resetForm = () => {
}
formRef.value?.resetFields()
}
/** 获得产线工位树 */
const getOrganizationTree = async () => {
organizationTree.value = []
const data = await OrganizationApi.getOrganizationList()
const root: Tree = { id: 0, name: 'ALL', children: [] }
root.children = handleTree(data, 'id', 'parentId')
organizationTree.value.push(root)
}
const getCurrentDate = () =>{
let now = new Date();
let year = now.getFullYear();
@ -300,22 +309,46 @@ const getCurrentDate = () =>{
if(day<10)day = '0'+day;
return year + "-" + month + "-" + day +" 00:00:00";
}
const workOrgList = ref<OrganizationVO[]>([]) //
const warningInfo = ref()
const orgWorkerList = ref<OrgWorkerVO[]>([]) //
//
const changeDate = async () =>{
if(formData.value.reportDate && formData.value.groupType && formData.value.orgType){
if(formType.value=='replace'){
workOrgList.value = await OrgWorkerApi.getOrgWorkerList2(formData.value)
if(workOrgList.value && workOrgList.value.length>0){
formData.value.orgType = workOrgList.value[0].orgType
formData.value.orgId = workOrgList.value[0].id
}
else{
message.error('未查询到用户的工位安排信息!请联系组长或主管安排工位!')
}
}else{
}
formData.value.userId = null
formData.value.orgId = null
userList.value = await WorkTeamApi.getUserList(formData.value.orgType, formData.value.groupType)
if(userList.value && userList.value.length>0){
formData.value.userId = userList.value[0].id
orgWorkerList.value = await OrgWorkerApi.getOrgWorkerList2(formData.value)
if(orgWorkerList.value && orgWorkerList.value.length>0){
formData.value.orgId = orgWorkerList.value[0].orgId
warningInfo.value=''
}
}
if(!formData.value.userId || !formData.value.orgId){
warningInfo.value = '该条件下未查询到工位安排信息!'
message.error(warningInfo.value)
}
}
}
//
const changeDateUser = async () =>{
if(formData.value.reportDate && formData.value.groupType
&& formData.value.orgType &&formData.value.userId){
orgWorkerList.value = await OrgWorkerApi.getOrgWorkerList2(formData.value)
if(orgWorkerList.value && orgWorkerList.value.length>0){
formData.value.orgId = orgWorkerList.value[0].orgId
warningInfo.value=''
}
else {
warningInfo.value = '该条件下未查询到工位安排信息!'
message.error(warningInfo.value)
}
}
}
const numberChange = async () =>{
formData.value.totalNumber = formData.value.qualityNumber+formData.value.wasteNumber
formData.value.qualityRate = formData.value.qualityNumber/formData.value.totalNumber * 100
}
</script>

@ -1,184 +0,0 @@
<template>
<Dialog :title="dialogTitle" v-model="dialogVisible">
<el-form
ref="formRef"
:model="formData"
:rules="formRules"
label-width="100px"
v-loading="formLoading"
>
<el-form-item label="报工日期" prop="reportDate">
<el-date-picker
v-model="formData.reportDate"
type="date"
value-format="x"
placeholder="选择报工日期"
/>
</el-form-item>
<el-form-item label="生产计划ID" prop="planId">
<el-input v-model="formData.planId" placeholder="请输入生产计划ID" />
</el-form-item>
<el-form-item label="产品ID" prop="productId">
<el-input v-model="formData.productId" placeholder="请输入产品ID" />
</el-form-item>
<el-form-item label="用户ID" prop="userId">
<el-input v-model="formData.userId" placeholder="请输入用户ID" />
</el-form-item>
<el-form-item label="组织ID" prop="orgId">
<el-input v-model="formData.orgId" placeholder="请输入组织ID" />
</el-form-item>
<el-form-item label="备注" prop="remark">
<el-input v-model="formData.remark" placeholder="请输入备注" />
</el-form-item>
<el-form-item label="成品数量" prop="qualityNumber">
<el-input v-model="formData.qualityNumber" placeholder="请输入成品数量" />
</el-form-item>
<el-form-item label="废品数量" prop="wasteNumber">
<el-input v-model="formData.wasteNumber" placeholder="请输入废品数量" />
</el-form-item>
<el-form-item label="总数量" prop="totalNumber">
<el-input v-model="formData.totalNumber" placeholder="请输入总数量" />
</el-form-item>
<el-form-item label="成品率" prop="qualityRate">
<el-input v-model="formData.qualityRate" placeholder="请输入成品率" />
</el-form-item>
<el-form-item label="废品原因" prop="wasteReason">
<el-input v-model="formData.wasteReason" placeholder="请输入废品原因" />
</el-form-item>
<el-form-item label="打包数量" prop="packageNumber">
<el-input v-model="formData.packageNumber" placeholder="请输入打包数量" />
</el-form-item>
<el-form-item label="总时长" prop="totalTime">
<el-input v-model="formData.totalTime" placeholder="请输入总时长" />
</el-form-item>
<el-form-item label="计件时间" prop="reportTime">
<el-input v-model="formData.reportTime" placeholder="请输入计件时间" />
</el-form-item>
<el-form-item label="报工状态" prop="reportStatus">
<el-radio-group v-model="formData.reportStatus">
<el-radio
v-for="dict in getIntDictOptions(DICT_TYPE.MES_RECORD_STATUS)"
:key="dict.value"
:label="dict.value"
>
{{ dict.label }}
</el-radio>
</el-radio-group>
</el-form-item>
</el-form>
<template #footer>
<el-button @click="submitForm" type="primary" :disabled="formLoading"> </el-button>
<el-button @click="dialogVisible = false"> </el-button>
</template>
</Dialog>
</template>
<script setup lang="ts">
import {getIntDictOptions, DICT_TYPE, getBoolDictOptions} from '@/utils/dict'
import { ProduceReportDetailApi, ProduceReportDetailVO } from '@/api/mes/producereport'
/** 生产报工明细 表单 */
defineOptions({ name: 'ProduceReportDetailForm' })
const { t } = useI18n() //
const message = useMessage() //
const dialogVisible = ref(false) //
const dialogTitle = ref('') //
const formLoading = ref(false) // 12
const formType = ref('') // create - update -
const formData = ref({
id: undefined,
reportId: undefined,
planId: undefined,
productId: undefined,
userId: undefined,
orgId: undefined,
qualityRate: undefined,
wasteReason: undefined,
totalTime: undefined,
packageNumber: undefined,
remark: undefined,
isEnable: undefined,
qualityNumber: undefined,
wasteNumber: undefined,
totalNumber: undefined,
reportDate: undefined,
reportTime: undefined,
reportStatus: undefined,
})
const formRules = reactive({
planId: [{ required: true, message: '生产计划ID不能为空', trigger: 'blur' }],
productId: [{ required: true, message: '产品ID不能为空', trigger: 'blur' }],
userId: [{ required: true, message: '用户ID不能为空', trigger: 'blur' }],
orgId: [{ required: true, message: '组织ID不能为空', trigger: 'blur' }],
})
const formRef = ref() // Ref
/** 打开弹窗 */
const open = async (type: string, id?: number) => {
dialogVisible.value = true
dialogTitle.value = t('action.' + type)
formType.value = type
resetForm()
//
if (id) {
formLoading.value = true
try {
formData.value = await ProduceReportDetailApi.getProduceReportDetail(id)
} finally {
formLoading.value = false
}
}
}
defineExpose({ open }) // open
/** 提交表单 */
const emit = defineEmits(['success']) // success
const submitForm = async () => {
//
await formRef.value.validate()
//
formLoading.value = true
try {
const data = formData.value as unknown as ProduceReportDetailVO
if (formType.value === 'create') {
await ProduceReportDetailApi.createProduceReportDetail(data)
message.success(t('common.createSuccess'))
} else {
await ProduceReportDetailApi.updateProduceReportDetail(data)
message.success(t('common.updateSuccess'))
}
dialogVisible.value = false
//
emit('success')
} finally {
formLoading.value = false
}
}
/** 重置表单 */
const resetForm = () => {
formData.value = {
id: undefined,
reportId: undefined,
planId: undefined,
productId: undefined,
userId: undefined,
orgId: undefined,
qualityRate: undefined,
wasteReason: undefined,
totalTime: undefined,
packageNumber: undefined,
remark: undefined,
isEnable: undefined,
qualityNumber: undefined,
wasteNumber: undefined,
totalNumber: undefined,
reportDate: undefined,
reportTime: undefined,
reportStatus: undefined,
}
formRef.value?.resetFields()
}
</script>
Loading…
Cancel
Save