fix work report

liutao_branch
chenshuichuan 2 years ago
parent 1a7cefbad9
commit 14afad7cd4

@ -57,10 +57,7 @@ export const OrgWorkerApi = {
getOrgWorkerList2: async (params: any) => { getOrgWorkerList2: async (params: any) => {
return await request.get({ url: `/mes/org-worker/getOtherOrgWorkerRespVO` , params }) 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) => { getOtherPersonalUser: async (params: any) => {
return await request.get({ url: `/mes/org-worker/getOtherPersonalUser`, params }) return await request.get({ url: `/mes/org-worker/getOtherPersonalUser`, params })

@ -77,6 +77,6 @@ export const WorkReportPlanApi = {
}, },
// 查询计划进度 // 查询计划进度
getReportPlanProgress: async (id: number) => { 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" label-width="68px"
> >
<el-row> <el-row>
<el-col :span="6"> <el-col :span="5">
<el-form-item label="组织名称" prop="name"> <el-form-item label="组织名称" prop="name">
<el-input <el-input
v-model="queryParams.name" v-model="queryParams.name"
@ -20,7 +20,7 @@
/> />
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="6"> <el-col :span="5">
<el-form-item label="关联机台" prop="machineId"> <el-form-item label="关联机台" prop="machineId">
<el-input <el-input
v-model="queryParams.machineId" v-model="queryParams.machineId"
@ -31,7 +31,7 @@
/> />
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="6"> <el-col :span="5">
<el-form-item label="组织状态" prop="status"> <el-form-item label="组织状态" prop="status">
<el-select <el-select
v-model="queryParams.status" v-model="queryParams.status"
@ -48,36 +48,25 @@
</el-select> </el-select>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="6"> <el-col :span="9">
<el-form-item label="工作日期" prop="workDate"> <el-form-item>
<el-date-picker <el-button @click="handleQuery"><Icon class="mr-5px" icon="ep:search" /> 搜索</el-button>
v-model="queryParams.workDate" <el-button @click="resetQuery"><Icon class="mr-5px" icon="ep:refresh" /> 重置</el-button>
@change="handleQuery" <el-button
type="date" v-hasPermi="['mes:organization:export']"
value-format="YYYY-MM-DD HH:mm:ss" :loading="exportLoading"
placeholder="选择工作日期" plain
class="!w-200px" type="success"
/> @click="handleExport"
</el-form-item> >
<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-col>
</el-row> </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> </el-form>
</ContentWrap> </ContentWrap>
@ -123,13 +112,11 @@
<dict-tag v-if="notEmpty(scope.row.orgType)" :type="DICT_TYPE.MES_ORG_TYPE" :value="scope.row.orgType" /> <dict-tag v-if="notEmpty(scope.row.orgType)" :type="DICT_TYPE.MES_ORG_TYPE" :value="scope.row.orgType" />
</template> </template>
</el-table-column> </el-table-column>
<el-table-column align="center" label="组织状态" > <!-- <el-table-column align="center" label="组织状态" >-->
<template #default="scope"> <!-- <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" /> <!-- <dict-tag v-if="notEmpty(scope.row.status) && scope.row.orgClass=='workplace'" :type="DICT_TYPE.MES_ORG_STATUS" :value="scope.row.status" />-->
</template> <!-- </template>-->
</el-table-column> <!-- </el-table-column>-->
<el-table-column align="center" fixed="right" label="操作" width="80"> <el-table-column align="center" fixed="right" label="操作" width="80">
<template #default="scope"> <template #default="scope">
<el-button <el-button
@ -149,7 +136,7 @@
</el-col> </el-col>
<el-col :span="12"> <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-col>
</el-row> </el-row>
@ -242,26 +229,10 @@ const toggleExpandAll = async () => {
await nextTick() await nextTick()
refreshTable.value = true 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 () => { onMounted(async () => {
queryParams.workDate = getCurrentDate()
await getList() 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 切换 */ /** tab 切换 */
let activeName = '' let activeName = ''

@ -1,6 +1,36 @@
<template> <template>
<!-- 列表 --> <!-- 列表 -->
<ContentWrap> <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-tabs v-model="activeName" @tab-click="handleTabClick">
<el-tab-pane label="所有" name="" /> <el-tab-pane label="所有" name="" />
@ -59,7 +89,6 @@ const { t } = useI18n() // 国际化
const props = defineProps<{ const props = defineProps<{
orgId?: number // org ID orgId?: number // org ID
orgType?: string orgType?: string
workDate?:undefined
}>() }>()
const loading = ref(true) // const loading = ref(true) //
@ -69,7 +98,7 @@ const queryParams = reactive({
pageNo: 1, pageNo: 1,
pageSize: 10, pageSize: 10,
orgId: undefined, orgId: undefined,
workDate: undefined, workDate: [],
groupType: undefined, groupType: undefined,
orgType: undefined, orgType: undefined,
workerId: undefined, workerId: undefined,
@ -123,9 +152,18 @@ const handleExport = async () => {
exportLoading.value = false 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(() => { onMounted(() => {
queryParams.workDate = [getCurrentDate(), getCurrentDate()]
getList() getList()
}) })
/** tab 切换 */ /** tab 切换 */
@ -153,16 +191,16 @@ watch(
}, },
{ immediate: true, deep: true } { immediate: true, deep: true }
) )
watch( // watch(
() => props.workDate, // () => props.workDate,
(val: string) => { // (val: string) => {
console.log("workDate:"+val) // console.log("workDate:"+val)
if (!val) { // if (!val) {
return // return
} // }
queryParams.workDate = [val,val] //
handleQuery() // handleQuery()
}, // },
{ immediate: true, deep: true } // { immediate: true, deep: true }
) // )
</script> </script>

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

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

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

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

@ -75,7 +75,7 @@
<el-button <el-button
type="warning" type="warning"
plain plain
@click="openForm('replace')" @click="openReplaceForm('replace')"
v-hasPermi="['mes:produce-report-detail:replace']" v-hasPermi="['mes:produce-report-detail:replace']"
> >
<Icon icon="ep:plus" class="mr-5px" /> 代报工 <Icon icon="ep:plus" class="mr-5px" /> 代报工
@ -96,8 +96,8 @@
<!-- 列表 --> <!-- 列表 -->
<ContentWrap> <ContentWrap>
<el-tabs v-model="activeName" @tab-click="handleTabClick"> <el-tabs v-model="activeName" @tab-click="handleTabClick">
<el-tab-pane label="所有" name="" /> <el-tab-pane label="个人" name="个人" />
<el-tab-pane label="通过" name="2" /> <el-tab-pane label="代报工" name="代报工" v-if="checkPermi(['mes:produce-report-detail:replace'])"/>
</el-tabs> </el-tabs>
<el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true"> <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="120px" prop="productName" />
<el-table-column label="工人" align="center" width="80px" prop="userName" /> <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="qualityNumber" />
<el-table-column label="废品数量" align="center" prop="wasteNumber" /> <el-table-column label="废品数量" align="center" prop="wasteNumber" />
<el-table-column label="总数量" align="center" prop="totalNumber" /> <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="reportTime" />
<el-table-column label="废品原因" align="center" prop="wasteReason" /> <el-table-column label="废品原因" align="center" prop="wasteReason" />
<el-table-column label="备注" align="center" prop="remark" /> <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"> <template #default="scope">
<dict-tag :type="DICT_TYPE.MES_PRODUCE_REPORT_TYPE" :value="scope.row.reportType" /> <dict-tag :type="DICT_TYPE.MES_PRODUCE_REPORT_TYPE" :value="scope.row.reportType" />
</template> </template>
@ -139,7 +139,7 @@
:formatter="dateFormatter" :formatter="dateFormatter"
width="120px" 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"> <template #default="scope">
<el-button <el-button
link link
@ -164,11 +164,12 @@
v-if="scope.row.reportStatus === 1" v-if="scope.row.reportStatus === 1"
type="warning" type="warning"
@click="updateStatus(scope.row.id,3,'驳回')" @click="updateStatus(scope.row.id,3,'驳回')"
v-hasPermi="['mes:produce-report-detail:update']" v-hasPermi="['mes:produce-report-detail:replace']"
> >
驳回 驳回
</el-button> </el-button>
<el-button <el-button
v-if="scope.row.reportStatus < 2 && scope.row.userId === userStore.getUser.id"
link link
type="primary" type="primary"
@click="openForm('update', scope.row.id)" @click="openForm('update', scope.row.id)"
@ -176,6 +177,15 @@
> >
编辑 编辑
</el-button> </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 <el-button
link link
type="danger" type="danger"
@ -198,6 +208,9 @@
<!-- 表单弹窗添加/修改 --> <!-- 表单弹窗添加/修改 -->
<ProduceReportDetailForm ref="formRef" @success="getList" /> <ProduceReportDetailForm ref="formRef" @success="getList" />
<!-- 代报工弹窗添加/修改 -->
<ReplaceForm ref="replaceFormRef" @success="getList" />
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
@ -206,14 +219,18 @@ import {dateFormatter, dateFormatter2} from '@/utils/formatTime'
import download from '@/utils/download' import download from '@/utils/download'
import { ProduceReportDetailApi, ProduceReportDetailVO } from '@/api/mes/producereport' import { ProduceReportDetailApi, ProduceReportDetailVO } from '@/api/mes/producereport'
import ProduceReportDetailForm from './ProduceReportDetailForm.vue' import ProduceReportDetailForm from './ProduceReportDetailForm.vue'
import ReplaceForm from './components/ReplaceForm.vue'
import {defaultProps, handleTree} from "@/utils/tree"; import {defaultProps, handleTree} from "@/utils/tree";
import * as UserApi from "@/api/system/user"; import * as UserApi from "@/api/system/user";
import {OrganizationApi} from "@/api/mes/organization"; import {OrganizationApi} from "@/api/mes/organization";
import {ProductApi, ProductVO} from "@/api/erp/product/product"; import {ProductApi, ProductVO} from "@/api/erp/product/product";
import {erpCountTableColumnFormatter} from "@/utils"; import {erpCountTableColumnFormatter} from "@/utils";
import {useUserStore} from "@/store/modules/user";
import {checkPermi} from "@/utils/permission";
/** 生产报工明细 列表 */ /** 生产报工明细 列表 */
defineOptions({ name: 'ProduceReportDetail' }) defineOptions({ name: 'ProduceReportDetail' })
const userStore = useUserStore()
const message = useMessage() // const message = useMessage() //
const { t } = useI18n() // const { t } = useI18n() //
@ -232,18 +249,13 @@ const queryParams = reactive({
productId: undefined, productId: undefined,
userId: undefined, userId: undefined,
orgId: undefined, orgId: undefined,
qualityRate: undefined,
wasteReason: undefined, wasteReason: undefined,
totalTime: undefined,
packageNumber: undefined,
remark: undefined, remark: undefined,
isEnable: undefined, isEnable: undefined,
createTime: [], createTime: [],
qualityNumber: undefined,
wasteNumber: undefined,
totalNumber: undefined,
reportDate: [], reportDate: [],
reportStatus: undefined, reportStatus: undefined,
reportType: undefined
}) })
const queryFormRef = ref() // const queryFormRef = ref() //
const exportLoading = ref(false) // const exportLoading = ref(false) //
@ -272,12 +284,16 @@ const resetQuery = () => {
handleQuery() handleQuery()
} }
/** 添加/修改操作 */ /** 个人添加/修改操作 */
const formRef = ref() const formRef = ref()
const openForm = (type: string, id?: number) => { const openForm = (type: string, id?: number) => {
formRef.value.open(type, id) formRef.value.open(type, id)
} }
/** 代报工添加/修改操作 */
const replaceFormRef = ref()
const openReplaceForm = (type: string, id?: number) => {
replaceFormRef.value.open(type, id)
}
/** 删除按钮操作 */ /** 删除按钮操作 */
const handleDelete = async (id: number) => { const handleDelete = async (id: number) => {
try { try {
@ -324,9 +340,9 @@ onMounted(async () => {
productList.value = await ProductApi.getMesProductSimpleList() productList.value = await ProductApi.getMesProductSimpleList()
}) })
/** tab 切换 */ /** tab 切换 */
let activeName = '' let activeName = '个人'
const handleTabClick = (tab: TabsPaneContext) => { const handleTabClick = (tab: TabsPaneContext) => {
queryParams.reportStatus = tab.paneName queryParams.reportType = tab.paneName
handleQuery() 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" :disabled="isDisableUpdate"
v-model="formData.reportDate" v-model="formData.reportDate"
type="date" type="date"
value-format="x" value-format="YYYY-MM-DD HH:mm:ss"
placeholder="选择日期" placeholder="选择日期"
:default-value="new Date()"
@change="changeDate" @change="changeDate"
/> />
</el-form-item> </el-form-item>
@ -37,24 +38,27 @@
</el-col> </el-col>
</el-row> </el-row>
<el-form-item label="类型" prop="orgType"> <el-form-item label="类型" prop="orgType">
<el-select v-model="formData.orgType" @change="changeDate" placeholder="请选择类型"> <el-radio-group v-model="formData.orgType">
<el-option <el-radio
:disabled="isDisableUpdate" :disabled="isDisableUpdate"
v-for="dict in getStrDictOptions(DICT_TYPE.MES_ORG_TYPE)" v-for="dict in getStrDictOptions(DICT_TYPE.MES_ORG_TYPE)"
:key="dict.value" :key="dict.value"
:label="dict.label" :label="dict.value"
:value="dict.value" @change="changeDate"
/> >
</el-select> {{ dict.label }}
</el-radio>
</el-radio-group>
</el-form-item> </el-form-item>
<el-row> <el-row v-if="formData.orgType && formData.groupType && formData.reportDate">
<el-col :span="12"> <el-col :span="12">
<el-form-item label="工人" prop="userId"> <el-form-item label="工人" prop="userId">
<el-select <el-select
:disabled="isDisable" :disabled="isDisableUpdate"
v-model="formData.userId" v-model="formData.userId"
clearable clearable
filterable filterable
@change="changeDateUser"
placeholder="请选择工人" placeholder="请选择工人"
> >
<el-option <el-option
@ -68,19 +72,25 @@
</el-col> </el-col>
<el-col :span="12"> <el-col :span="12">
<el-form-item label="工位" prop="orgId"> <el-form-item label="工位" prop="orgId">
<el-tree-select <el-select
:disabled="isDisableUpdate" :disabled="isDisableUpdate"
v-model="formData.orgId" v-model="formData.orgId"
:data="organizationTree" clearable
:props="defaultProps" filterable
check-strictly
default-expand-all
placeholder="请选择工位" placeholder="请选择工位"
/> >
<el-option
v-for="item in orgWorkerList"
:key="item.orgId"
:label="item.orgName"
:value="item.orgId"
/>
</el-select>
</el-form-item> </el-form-item>
</el-col> </el-col>
</el-row> </el-row>
<el-text v-if="warningInfo" class="mx-1" type="warning">{{warningInfo}}</el-text>
<el-divider />
<el-form-item label="产品" prop="productId"> <el-form-item label="产品" prop="productId">
<el-select v-model="formData.productId" clearable filterable placeholder="请选择" > <el-select v-model="formData.productId" clearable filterable placeholder="请选择" >
<el-option <el-option
@ -95,12 +105,12 @@
<el-row> <el-row>
<el-col :span="12"> <el-col :span="12">
<el-form-item label="成品数量" prop="qualityNumber"> <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-form-item>
</el-col> </el-col>
<el-col :span="12"> <el-col :span="12">
<el-form-item label="废品数量" prop="wasteNumber"> <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-form-item>
</el-col> </el-col>
</el-row> </el-row>
@ -111,7 +121,7 @@
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="12"> <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-input-number disabled v-model="formData.qualityRate" :min="0" :precision="2" placeholder="请输入数量"/>
</el-form-item> </el-form-item>
</el-col> </el-col>
@ -151,7 +161,10 @@ import {defaultProps, handleTree} from "@/utils/tree";
import {OrganizationApi, OrganizationVO} from "@/api/mes/organization"; import {OrganizationApi, OrganizationVO} from "@/api/mes/organization";
import * as UserApi from "@/api/system/user"; import * as UserApi from "@/api/system/user";
import {ProductApi, ProductVO} from "@/api/erp/product/product"; 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' }) defineOptions({ name: 'ProduceReportDetailForm' })
@ -159,9 +172,9 @@ defineOptions({ name: 'ProduceReportDetailForm' })
const { t } = useI18n() // const { t } = useI18n() //
const message = useMessage() // const message = useMessage() //
const userList = ref<UserApi.UserVO[]>([]) // const userList = ref<UserApi.UserVO[]>([]) //
const organizationTree = ref() //
const productList = ref<ProductVO[]>([]) // const productList = ref<ProductVO[]>([]) //
const dialogVisible = ref(false) // const dialogVisible = ref(false) //
const dialogTitle = ref('') // const dialogTitle = ref('') //
const formLoading = ref(false) // 12 const formLoading = ref(false) // 12
@ -187,6 +200,8 @@ const formData = ref({
reportDate: undefined, reportDate: undefined,
reportTime: undefined, reportTime: undefined,
reportStatus: undefined, reportStatus: undefined,
reportDateString: undefined,
reportType: undefined
}) })
const formRules = reactive({ const formRules = reactive({
reportDate: [{ required: true, message: '日期不能为空', trigger: 'blur' }], reportDate: [{ required: true, message: '日期不能为空', trigger: 'blur' }],
@ -197,7 +212,7 @@ const formRules = reactive({
orgType: [{ required: true, message: '工序不能为空', trigger: 'blur' }], orgType: [{ required: true, message: '工序不能为空', trigger: 'blur' }],
}) })
const formRef = ref() // Ref const formRef = ref() // Ref
const isDisable = ref(false)
const isDisableUpdate = ref(false) const isDisableUpdate = ref(false)
/** 打开弹窗 */ /** 打开弹窗 */
const open = async (type: string, id?: number) => { const open = async (type: string, id?: number) => {
@ -207,43 +222,46 @@ const open = async (type: string, id?: number) => {
resetForm() resetForm()
formData.value.reportDate = getCurrentDate() formData.value.reportDate = getCurrentDate()
formData.value.groupType = 1 formData.value.groupType = 1
formData.value.orgType = 'zhijiang'
warningInfo.value = ''
isDisableUpdate.value = false
// //
if (id) { if (id) {
formLoading.value = true formLoading.value = true
try { try {
formData.value = await ProduceReportDetailApi.getProduceReportDetail(id) formData.value = await ProduceReportDetailApi.getProduceReportDetail(id)
formData.value.reportDate = formatToDateTime(new Date(formData.value.reportDate))
} finally { } finally {
formLoading.value = false formLoading.value = false
} }
isDisableUpdate.value=true; isDisableUpdate.value=true;
isDisable.value = true;
} }
await getOrganizationTree() await changeDate()
productList.value = await ProductApi.getItemSimpleList()
if(type == 'replace'){ productList.value = await PlanApi.getStartAndFinishPlanProduct()
isDisable.value = false if(productList.value.length ==1)
userList.value = await OrgWorkerApi.getPersonalUser() formData.value.productId = productList.value[0].id
if(type === 'replace'){
dialogTitle.value = "代报工"
formData.value.reportType = '代报工'
} }
if(type == 'create'){ else if(type === 'update'){
userList.value = await OrgWorkerApi.getOtherPersonalUser() dialogTitle.value = "编辑代报工"
} }
//
console.log(userList.value)
} }
defineExpose({ open }) // open defineExpose({ open }) // open
/** 提交表单 */ /** 提交表单 */
const emit = defineEmits(['success']) // success const emit = defineEmits(['success']) // success
const submitForm = async () => { const submitForm = async (reportType?:string) => {
// //
await formRef.value.validate() await formRef.value.validate()
// //
formLoading.value = true formLoading.value = true
try { try {
formData.value.reportDateString = formData.value.reportDate
const data = formData.value as unknown as ProduceReportDetailVO const data = formData.value as unknown as ProduceReportDetailVO
if (formType.value === 'create') { if (formType.value === 'replace') {
await ProduceReportDetailApi.createProduceReportDetail(data) await ProduceReportDetailApi.createProduceReportDetail(data)
message.success(t('common.createSuccess')) message.success(t('common.createSuccess'))
} else { } else {
@ -282,15 +300,6 @@ const resetForm = () => {
} }
formRef.value?.resetFields() 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 = () =>{ const getCurrentDate = () =>{
let now = new Date(); let now = new Date();
let year = now.getFullYear(); let year = now.getFullYear();
@ -300,22 +309,46 @@ const getCurrentDate = () =>{
if(day<10)day = '0'+day; if(day<10)day = '0'+day;
return year + "-" + month + "-" + day +" 00:00:00"; return year + "-" + month + "-" + day +" 00:00:00";
} }
const workOrgList = ref<OrganizationVO[]>([]) //
const warningInfo = ref()
const orgWorkerList = ref<OrgWorkerVO[]>([]) //
// //
const changeDate = async () =>{ const changeDate = async () =>{
if(formData.value.reportDate && formData.value.groupType && formData.value.orgType){ if(formData.value.reportDate && formData.value.groupType && formData.value.orgType){
if(formType.value=='replace'){ formData.value.userId = null
workOrgList.value = await OrgWorkerApi.getOrgWorkerList2(formData.value) formData.value.orgId = null
if(workOrgList.value && workOrgList.value.length>0){ userList.value = await WorkTeamApi.getUserList(formData.value.orgType, formData.value.groupType)
formData.value.orgType = workOrgList.value[0].orgType if(userList.value && userList.value.length>0){
formData.value.orgId = workOrgList.value[0].id formData.value.userId = userList.value[0].id
} orgWorkerList.value = await OrgWorkerApi.getOrgWorkerList2(formData.value)
else{ if(orgWorkerList.value && orgWorkerList.value.length>0){
message.error('未查询到用户的工位安排信息!请联系组长或主管安排工位!') formData.value.orgId = orgWorkerList.value[0].orgId
} warningInfo.value=''
}else{ }
}
} 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> </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