黄伟杰 1 month ago
commit 511c77f4d4

@ -0,0 +1,51 @@
import request from '@/config/axios'
// 计划派工记录 VO
export interface PaigongRecordVO {
id: number // id
planId: number // 关联计划id
pipeline: number // 生产线
paigongNum: number // 派工数量
isPreProduction: number // 是否试生产
paigongTime: Date // 派工时间
}
// 计划派工记录 API
export const PaigongRecordApi = {
// 查询计划派工记录分页
getPaigongRecordPage: async (params: any) => {
return await request.get({ url: `/mes/paigong-record/page`, params })
},
// 查询计划派工记录详情
getPaigongRecord: async (id: number) => {
return await request.get({ url: `/mes/paigong-record/get?id=` + id })
},
// 新增计划派工记录
createPaigongRecord: async (data: PaigongRecordVO) => {
return await request.post({ url: `/mes/paigong-record/create`, data })
},
// 修改计划派工记录
updatePaigongRecord: async (data: PaigongRecordVO) => {
return await request.put({ url: `/mes/paigong-record/update`, data })
},
// 删除计划派工记录
deletePaigongRecord: async (id: number) => {
return await request.delete({ url: `/mes/paigong-record/delete?id=` + id })
},
// 导出计划派工记录 Excel
exportPaigongRecord: async (params) => {
return await request.download({ url: `/mes/paigong-record/export-excel`, params })
},
// ==================== 子表(领料明细) ====================
// 获得领料明细列表
getPaigongRecordListByPlanId: async (planId) => {
return await request.get({ url: `/mes/paigong-record/list-by-item-plan-id?planId=` + planId })
}
}

@ -64,6 +64,10 @@ export const PlanApi = {
arrangePlan: async (data: ItemRequisitionVO) => {
return await request.put({ url: `/mes/plan/paigong`, data })
},
// 派工生产计划
arrangePlanNum: async (data: ItemRequisitionVO) => {
return await request.put({ url: `/mes/plan/typePaigong`, data })
},
// 更新状态生产计划
updatePlanStatus: async (data: PlanVO) => {
return await request.put({ url: `/mes/plan/updateStatus`, data })

@ -20,7 +20,7 @@ const title = computed(() => appStore.getTitle)
:class="prefixCls"
class="h-[var(--app-footer-height)] bg-[var(--app-content-bg-color)] text-center leading-[var(--app-footer-height)] text-[var(--el-text-color-placeholder)] dark:bg-[var(--el-bg-color)] overflow-hidden"
>
<span class="text-14px">Copyright ©2024-BESURE-{{ title }}&nbsp;&nbsp;</span>
<span class="text-14px">Copyright ©2026-BESURE-{{ title }}&nbsp;&nbsp;</span>
<el-link type="success" :href="docsUrl" target="_blank">操作手册</el-link>
</div>
</template>

@ -253,6 +253,8 @@ export enum DICT_TYPE {
MES_MOLD_RECORD_TYPE = "mes_mold_record_type",
MES_PASS_OR_NOPASS = "mes_pass_or_nopass",
MES_MANTAIN_LEVEL = "mes_mantain_level",
MOLD_GET_STATUS = "mold_get_status",
MES_PRE_PRODUCTION = "mes_pre_production",
//====iot
IOT_SIEMENS_TYPE = "iot_siemens_type",
IOT_MODBUS_TYPE = "iot_modbus_type",

@ -35,16 +35,15 @@
</el-select>
</el-form-item>
<el-form-item label="模数" prop="moldSize">
<el-input v-model="formData.moldSize" placeholder="请输入模数" />
<el-form-item label="数" prop="moldSize">
<el-input v-model="formData.moldSize" placeholder="请输入数" />
</el-form-item>
<el-form-item label="预期寿命" prop="useTime">
<el-input-number
v-model="formData.useTime"
:min="0"
:precision="2"
class="!w-1/1"
placeholder="输入预期寿命(小时)"
placeholder="输入预期寿命()"
/>
</el-form-item>
<!-- <el-form-item label="维保模式" prop="maintainType">

@ -176,7 +176,7 @@ const resetForm = () => {
machineId: undefined,
useTime: 0,
inTime: undefined,
status: undefined,
status: 1,
images: undefined,
remark: undefined,
isEnable: undefined,

@ -125,7 +125,7 @@
</template>
</el-table-column>
<el-table-column label="维保周期" align="center" prop="maintainTime" /> -->
<el-table-column label="模数" align="center" prop="moldSize" />
<el-table-column label="数" align="center" prop="moldSize" />
<el-table-column label="备注" align="center" prop="remark" />
<el-table-column

@ -11,17 +11,24 @@
<el-input disabled v-model="formData.feedingRecordCode" placeholder="保存自动生成单号" />
</el-form-item>
<el-form-item label="制浆线:" prop="feedingPipeline">
<el-radio-group v-model="formData.feedingPipeline">
<el-radio
v-for="dict in getStrDictOptions(DICT_TYPE.MES_FEEDING_PIPELINE)"
:key="dict.value"
:label="dict.value"
>
{{ dict.label }}
</el-radio>
</el-radio-group>
<el-tree-select
v-model="formData.feedingPipeline"
:data="organizationTree"
:props="defaultProps"
check-strictly
default-expand-all
placeholder="请选择制浆线"
/>
</el-form-item>
<el-form-item label="投料类型:" prop="feedingType">
<el-form-item prop="feedingType">
<template #label>
<span>
投料类型
<el-tooltip content="来源:数据字典-生产投料类型" placement="top">
<Icon icon="ep:question-filled" />
</el-tooltip>
</span>
</template>
<el-radio-group v-model="formData.feedingType">
<el-radio
v-for="dict in getStrDictOptions(DICT_TYPE.MES_FEEDING_TYPE)"
@ -82,10 +89,14 @@ import { getStrDictOptions, DICT_TYPE } from '@/utils/dict'
import { FeedingRecordApi, FeedingRecordVO } from '@/api/mes/feedingrecord'
import FeedingRecordDetailForm from './components/FeedingRecordDetailForm.vue'
import {ProductApi, ProductVO} from "@/api/erp/product/product";
import { OrganizationApi, OrganizationVO } from '@/api/mes/organization'
import { defaultProps, handleTree } from '@/utils/tree'
/** 投料记录 表单 */
defineOptions({ name: 'FeedingRecordForm' })
const organizationTree = ref() //
const { t } = useI18n() //
const message = useMessage() //
const productList = ref<ProductVO[]>([]) //
@ -98,7 +109,6 @@ const formData = ref({
feedingRecordCode: undefined,
productId: undefined,
planId: undefined,
productId: undefined,
itemId: undefined,
feedingPipeline: undefined,
feedingType: undefined,
@ -109,7 +119,8 @@ const formData = ref({
recordStatus: undefined,
})
const formRules = reactive({
feedingType: [{ required: true, message: '投料类型不能为空', trigger: 'blur' }]
feedingType: [{ required: true, message: '投料类型不能为空', trigger: 'blur' }],
feedingPipeline: [{ required: true, message: '制浆线不能为空', trigger: 'blur' }]
})
const formRef = ref() // Ref
@ -122,10 +133,8 @@ const open = async (type: string, id?: number) => {
dialogVisible.value = true
dialogTitle.value = t('action.' + type)
formType.value = type
resetForm()
formData.value.feedingType = 'org'
formData.value.feedingPipeline = 'zhijiang2'
//
if (id) {
formLoading.value = true
@ -137,6 +146,8 @@ const open = async (type: string, id?: number) => {
}
//
productList.value = await ProductApi.getMesProductSimpleList()
//
await getOrganizationTree()
}
defineExpose({ open }) // open
@ -195,4 +206,14 @@ const resetForm = () => {
}
formRef.value?.resetFields()
}
/** 获得产线工位树 */
const getOrganizationTree = async () => {
organizationTree.value = []
const req = {orgClass:'pipeline'}
const data = await OrganizationApi.getOrganizationList(req)
const root: Tree = { id: 0, name: '顶级产线工位', children: [] }
root.children = handleTree(data, 'id', 'parentId')
organizationTree.value.push(root)
}
</script>

@ -6,7 +6,7 @@
<el-table-column label="原料" align="center" prop="itemName" />
<el-table-column label="数量" align="center" prop="weight" />
<el-table-column label="单位" align="center" prop="unitName" />
<el-table-column label="投料时间" align="center" prop="feedingTime" :formatter="dateFormatter"/>
</el-table>
</ContentWrap>
</template>

@ -17,24 +17,17 @@
class="!w-240px"
/>
</el-form-item>
<el-form-item label="制浆线" prop="feedingPipeline">
<el-select
v-model="queryParams.feedingPipeline"
placeholder="请选择制浆线"
clearable
@change="handleQuery"
class="!w-240px"
>
<el-option
v-for="dict in getStrDictOptions(DICT_TYPE.MES_FEEDING_PIPELINE)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
<el-tree-select
v-model="queryParams.feedingPipeline"
:data="organizationTree"
:props="defaultProps"
check-strictly
default-expand-all
placeholder="请选择制浆线"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="投料时间" prop="feedingTime">
<el-date-picker
v-model="queryParams.feedingTime"
@ -109,17 +102,13 @@
</template>
</el-table-column>
<el-table-column label="单号" align="center" prop="feedingRecordCode" width="150px"/>
<el-table-column label="制浆线" align="center" prop="feedingPipeline" sortable>
<template #default="scope">
<dict-tag :type="DICT_TYPE.MES_FEEDING_PIPELINE" :value="scope.row.feedingPipeline" />
</template>
</el-table-column>
<el-table-column label="制浆线" align="center" prop="feedingPipelineName" sortable/>
<el-table-column label="投料类型" align="center" prop="feedingType" sortable>
<template #default="scope">
<dict-tag :type="DICT_TYPE.MES_FEEDING_TYPE" :value="scope.row.feedingType" />
</template>
</el-table-column>
<el-table-column label="重量(kg)" align="center" prop="weight" />
<el-table-column label="数量" align="center" prop="weight" />
<el-table-column label="记录人" align="center" prop="userName" />
<el-table-column label="备注" align="center" prop="remark" />
<el-table-column label="状态" align="center" prop="recordStatus">
@ -135,7 +124,7 @@
width="180px"
/>
<el-table-column label="操作" align="center" width="150px">
<el-table-column label="操作" align="center" width="200px">
<template #default="scope">
<el-button
link
@ -162,7 +151,7 @@
v-hasPermi="['mes:feeding-record:update']"
v-if="scope.row.recordStatus=='1'"
>
提交
投料
</el-button>
</template>
</el-table-column>
@ -187,13 +176,14 @@ import download from '@/utils/download'
import { FeedingRecordApi, FeedingRecordVO } from '@/api/mes/feedingrecord'
import FeedingRecordForm from './FeedingRecordForm.vue'
import FeedingRecordDetailList from './components/FeedingRecordDetailList.vue'
import { OrganizationApi, OrganizationVO } from '@/api/mes/organization'
import { defaultProps, handleTree } from '@/utils/tree'
/** 投料记录 列表 */
defineOptions({ name: 'FeedingRecord' })
const message = useMessage() //
const { t } = useI18n() //
const organizationTree = ref() //
const loading = ref(true) //
const list = ref<FeedingRecordVO[]>([]) //
const total = ref(0) //
@ -276,6 +266,8 @@ const handleExport = async () => {
/** 初始化 **/
onMounted(() => {
//
getOrganizationTree()
getList()
})
/** 提交记录操作 */
@ -283,7 +275,6 @@ const handleUpdateStatus = async (id: number, status:string) => {
try {
//
await message.confirm("确认提交投料记录?", "一旦提交成功无法撤回!")
//
await FeedingRecordApi.updateFeedingRecordStatus(id,status)
message.success("提交成功!")
//
@ -297,4 +288,14 @@ const handleTabClick = (tab: TabsPaneContext) => {
queryParams.feedingType = tab.paneName
handleQuery()
}
/** 获得产线工位树 */
const getOrganizationTree = async () => {
organizationTree.value = []
const req = {orgClass:'pipeline'}
const data = await OrganizationApi.getOrganizationList(req)
const root: Tree = { id: 0, name: '顶级产线工位', children: [] }
root.children = handleTree(data, 'id', 'parentId')
organizationTree.value.push(root)
}
</script>

@ -2,7 +2,7 @@
<!-- 列表 -->
<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="productName" width="160px" />
<el-table-column label="单位" align="center" prop="unitName" width="80px"/>
<el-table-column label="需求数量" align="center" prop="number" width="120px" />
<el-table-column label="已下料" align="center" prop="finishNumber" width="120px"/>
@ -11,7 +11,7 @@
<el-progress :percentage="erpPriceInputFormatter((scope.row.finishNumber/scope.row.number)*100)" :stroke-width="15" striped striped-flow />
</template>
</el-table-column>
<el-table-column label="操作" align="center"/>
<!-- <el-table-column label="操作" align="center"/> -->
</el-table>
</ContentWrap>
</template>
@ -39,11 +39,6 @@ const getList = async () => {
}
}
/** 搜索按钮操作 */
const handleQuery = () => {
queryParams.pageNo = 1
getList()
}
/** 初始化 **/
onMounted(() => {

@ -96,11 +96,7 @@
<dict-tag :type="DICT_TYPE.MES_PRODUCE_ITEM_REQUISITION" :value="scope.row.status" />
</template>
</el-table-column>
<el-table-column label="制浆线" align="center" prop="feedingPipeline">
<template #default="scope">
<dict-tag :type="DICT_TYPE.MES_FEEDING_PIPELINE" :value="scope.row.feedingPipeline" />
</template>
</el-table-column>
<el-table-column label="制浆线" align="center" prop="feedingPipelineName"/>
<el-table-column label="备注" align="center" prop="remark" />
<el-table-column
@ -111,14 +107,14 @@
width="180px"
sortable
/>
<el-table-column
<!-- <el-table-column
label="实际下料"
align="center"
prop="deliveryDate"
:formatter="dateFormatter"
width="180px"
sortable
/>
/> -->
<el-table-column
label="创建时间"
align="center"

@ -7,7 +7,7 @@
label-width="100px"
v-loading="formLoading"
>
<el-collapse v-model="activeNames" @change="handleChange">
<el-collapse>
<el-collapse-item title="基本信息" name="1">
<el-row>
<el-col :span="8">

@ -36,13 +36,19 @@
/>
</el-form-item>
<el-form-item label="状态" prop="state">
<el-input
<el-select
v-model="queryParams.state"
placeholder="请输入状态"
placeholder="请选择状态"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
>
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.MOLD_GET_STATUS)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="领模人" prop="person">
<el-input
@ -53,15 +59,6 @@
class="!w-240px"
/>
</el-form-item>
<el-form-item label="设备id" prop="deviceId">
<el-input
v-model="queryParams.deviceId"
placeholder="请输入设备id"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="设备名称" prop="deviceName">
<el-input
v-model="queryParams.deviceName"
@ -82,24 +79,6 @@
class="!w-220px"
/>
</el-form-item>
<el-form-item label="库管员" prop="principal">
<el-input
v-model="queryParams.principal"
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 label="创建时间" prop="createTime">
<el-date-picker
v-model="queryParams.createTime"
@ -138,13 +117,11 @@
<!-- 列表 -->
<ContentWrap>
<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="领模单号" align="center" prop="orderId" />
<el-table-column label="模具编码" align="center" prop="code" />
<el-table-column label="模具名称" align="center" prop="name" />
<el-table-column label="状态" align="center" prop="state" />
<el-table-column label="领模人" align="center" prop="person" />
<el-table-column label="设备id" align="center" prop="deviceId" />
<el-table-column label="设备名称" align="center" prop="deviceName" />
<el-table-column
label="领取时间"
@ -201,6 +178,7 @@ import { dateFormatter } from '@/utils/formatTime'
import download from '@/utils/download'
import { MoldGetApi, MoldGetVO } from '@/api/mes/moldget'
import MoldGetForm from './MoldGetForm.vue'
import { getIntDictOptions, DICT_TYPE } from '@/utils/dict'
/** 模具管理-领模申请 列表 */
defineOptions({ name: 'MoldGet' })

@ -99,7 +99,7 @@
<!-- 列表 -->
<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="zhijiang" />
<el-tab-pane label="成型" name="chengxing" />
@ -113,7 +113,7 @@
<el-tab-pane label="贴标" name="tiebiao" />
<el-tab-pane label="品印" name="pinyin" />
<el-tab-pane label="塑封" name="sufeng" />
</el-tabs>
</el-tabs> -->
<el-table
v-loading="loading"
:data="list"

@ -0,0 +1,116 @@
<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="生产线" prop="pipeline">
<el-input v-model="formData.pipeline" placeholder="请输入生产线" />
</el-form-item>
<el-form-item label="派工数量" prop="paigongNum">
<el-input v-model="formData.paigongNum" placeholder="请输入派工数量" />
</el-form-item>
<el-form-item label="是否试生产" prop="isPreProduction">
<el-input v-model="formData.isPreProduction" placeholder="请输入是否试生产" />
</el-form-item>
<el-form-item label="派工时间" prop="paigongTime">
<el-date-picker
v-model="formData.paigongTime"
type="date"
value-format="x"
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 { PaigongRecordApi, PaigongRecordVO } from '@/api/mes/paigongrecord'
/** 计划派工记录 表单 */
defineOptions({ name: 'PaigongRecordForm' })
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,
planId: undefined,
pipeline: undefined,
paigongNum: undefined,
isPreProduction: undefined,
paigongTime: undefined,
})
const formRules = reactive({
})
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 PaigongRecordApi.getPaigongRecord(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 PaigongRecordVO
if (formType.value === 'create') {
await PaigongRecordApi.createPaigongRecord(data)
message.success(t('common.createSuccess'))
} else {
await PaigongRecordApi.updatePaigongRecord(data)
message.success(t('common.updateSuccess'))
}
dialogVisible.value = false
//
emit('success')
} finally {
formLoading.value = false
}
}
/** 重置表单 */
const resetForm = () => {
formData.value = {
id: undefined,
planId: undefined,
pipeline: undefined,
paigongNum: undefined,
isPreProduction: undefined,
paigongTime: undefined,
}
formRef.value?.resetFields()
}
</script>

@ -0,0 +1,81 @@
<template>
<!-- 列表 -->
<ContentWrap>
<el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true">
<el-table-column label="生产线" align="center" prop="pipelineName" />
<el-table-column label="派工数量" align="center" prop="paigongNum" />
<el-table-column label="是否试生产" align="center" prop="isPreProduction" >
<template #default="scope">
<dict-tag :type="DICT_TYPE.MES_PRE_PRODUCTION" :value="scope.row.isPreProduction" />
</template>
</el-table-column>
<el-table-column
label="派工时间"
align="center"
prop="paigongTime"
:formatter="dateFormatter"
width="180px"
/>
<el-table-column
label="创建时间"
align="center"
prop="createTime"
:formatter="dateFormatter"
width="180px"
/>
</el-table>
<!-- 分页 -->
<Pagination
:total="total"
v-model:page="queryParams.pageNo"
v-model:limit="queryParams.pageSize"
@pagination="getList"
/>
</ContentWrap>
</template>
<script setup lang="ts">
import { dateFormatter } from '@/utils/formatTime'
import { PaigongRecordApi, PaigongRecordVO } from '@/api/mes/paigongrecord'
import { DICT_TYPE } from '@/utils/dict'
/** 计划派工记录 列表 */
const props = defineProps<{
planId?: number // ID
}>()
const message = useMessage() //
const { t } = useI18n() //
const loading = ref(true) //
const list = ref<PaigongRecordVO[]>([]) //
const total = ref(0) //
const queryParams = reactive({
pageNo: 1,
pageSize: 10,
planId: undefined,
pipeline: undefined,
paigongNum: undefined,
isPreProduction: undefined,
paigongTime: [],
createTime: [],
})
/** 查询列表 */
const getList = async () => {
loading.value = true
try {
list.value = await PaigongRecordApi.getPaigongRecordListByPlanId(props.planId)
} finally {
loading.value = false
}
}
/** 初始化 **/
onMounted(() => {
getList()
})
</script>

@ -0,0 +1,239 @@
<template>
<ContentWrap>
<!-- 搜索工作栏 -->
<el-form
class="-mb-15px"
:model="queryParams"
ref="queryFormRef"
:inline="true"
label-width="68px"
>
<el-form-item label="关联计划id" prop="planId">
<el-input
v-model="queryParams.planId"
placeholder="请输入关联计划id"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="生产线" prop="pipeline">
<el-input
v-model="queryParams.pipeline"
placeholder="请输入生产线"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="派工数量" prop="paigongNum">
<el-input
v-model="queryParams.paigongNum"
placeholder="请输入派工数量"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="是否试生产" prop="isPreProduction">
<el-input
v-model="queryParams.isPreProduction"
placeholder="请输入是否试生产"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="派工时间" prop="paigongTime">
<el-date-picker
v-model="queryParams.paigongTime"
value-format="YYYY-MM-DD HH:mm:ss"
type="daterange"
start-placeholder="开始日期"
end-placeholder="结束日期"
:default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"
class="!w-220px"
/>
</el-form-item>
<el-form-item label="创建时间" prop="createTime">
<el-date-picker
v-model="queryParams.createTime"
value-format="YYYY-MM-DD HH:mm:ss"
type="daterange"
start-placeholder="开始日期"
end-placeholder="结束日期"
:default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"
class="!w-220px"
/>
</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:paigong-record:create']"
>
<Icon icon="ep:plus" class="mr-5px" /> 新增
</el-button>
<el-button
type="success"
plain
@click="handleExport"
:loading="exportLoading"
v-hasPermi="['mes:paigong-record:export']"
>
<Icon icon="ep:download" class="mr-5px" /> 导出
</el-button>
</el-form-item>
</el-form>
</ContentWrap>
<!-- 列表 -->
<ContentWrap>
<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="生产线" align="center" prop="pipeline" />
<el-table-column label="派工数量" align="center" prop="paigongNum" />
<el-table-column label="是否试生产" align="center" prop="isPreProduction" />
<el-table-column
label="派工时间"
align="center"
prop="paigongTime"
:formatter="dateFormatter"
width="180px"
/>
<el-table-column
label="创建时间"
align="center"
prop="createTime"
:formatter="dateFormatter"
width="180px"
/>
<el-table-column label="操作" align="center" min-width="120px">
<template #default="scope">
<el-button
link
type="primary"
@click="openForm('update', scope.row.id)"
v-hasPermi="['mes:paigong-record:update']"
>
编辑
</el-button>
<el-button
link
type="danger"
@click="handleDelete(scope.row.id)"
v-hasPermi="['mes:paigong-record: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>
<!-- 表单弹窗添加/修改 -->
<PaigongRecordForm ref="formRef" @success="getList" />
</template>
<script setup lang="ts">
import { dateFormatter } from '@/utils/formatTime'
import download from '@/utils/download'
import { PaigongRecordApi, PaigongRecordVO } from '@/api/mes/paigongrecord'
import PaigongRecordForm from './PaigongRecordForm.vue'
/** 计划派工记录 列表 */
defineOptions({ name: 'PaigongRecord' })
const message = useMessage() //
const { t } = useI18n() //
const loading = ref(true) //
const list = ref<PaigongRecordVO[]>([]) //
const total = ref(0) //
const queryParams = reactive({
pageNo: 1,
pageSize: 10,
planId: undefined,
pipeline: undefined,
paigongNum: undefined,
isPreProduction: undefined,
paigongTime: [],
createTime: [],
})
const queryFormRef = ref() //
const exportLoading = ref(false) //
/** 查询列表 */
const getList = async () => {
loading.value = true
try {
const data = await PaigongRecordApi.getPaigongRecordPage(queryParams)
list.value = data.list
total.value = data.total
} finally {
loading.value = false
}
}
/** 搜索按钮操作 */
const handleQuery = () => {
queryParams.pageNo = 1
getList()
}
/** 重置按钮操作 */
const resetQuery = () => {
queryFormRef.value.resetFields()
handleQuery()
}
/** 添加/修改操作 */
const formRef = ref()
const openForm = (type: string, id?: number) => {
formRef.value.open(type, id)
}
/** 删除按钮操作 */
const handleDelete = async (id: number) => {
try {
//
await message.delConfirm()
//
await PaigongRecordApi.deletePaigongRecord(id)
message.success(t('common.delSuccess'))
//
await getList()
} catch {}
}
/** 导出按钮操作 */
const handleExport = async () => {
try {
//
await message.exportConfirm()
//
exportLoading.value = true
const data = await PaigongRecordApi.exportPaigongRecord(queryParams)
download.excel(data, '计划派工记录.xls')
} catch {
} finally {
exportLoading.value = false
}
}
/** 初始化 **/
onMounted(() => {
getList()
})
</script>

@ -7,9 +7,7 @@
label-width="100px"
v-loading="formLoading"
>
<el-collapse v-model="activeNames">
<el-collapse-item title="下料派工" name="1">
<el-form-item v-show="false" label="计划" prop="planId">
<el-form-item v-show="false" label="计划" prop="planId">
<el-input v-model="formData.planId" placeholder="请输入计划ID" />
</el-form-item>
<el-form-item label="制浆线" prop="feedingPipeline">
@ -48,34 +46,6 @@
<el-form-item label="备注" prop="remark">
<el-input v-model="formData.remark" placeholder="请输入备注" />
</el-form-item>
</el-collapse-item>
<el-collapse-item title="工序派工" name="2">
<el-form-item label="生产线" prop="pipeline">
<el-tree-select
v-model="formData.pipeline"
:data="organizationTree"
:props="defaultProps"
check-strictly
default-expand-all
placeholder="请选择生产线"
/>
</el-form-item>
<el-form-item label="派工数量" prop="paigongNum">
<el-input v-model="formData.paigongNum" placeholder="请输入数量" />
</el-form-item>
<el-form-item label="是否启用" prop="isPreProduction">
<el-radio-group >
<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-collapse-item>
</el-collapse>
</el-form>
<template #footer>
@ -85,12 +55,11 @@
</Dialog>
</template>
<script setup lang="ts">
import { ItemRequisitionApi, ItemRequisitionVO } from '@/api/mes/itemrequisition'
import { ItemRequisitionVO } from '@/api/mes/itemrequisition'
import {PlanApi} from "@/api/mes/plan";
import {DICT_TYPE, getBoolDictOptions} from "@/utils/dict";
import * as UserApi from "@/api/system/user";
import {WorkTeamApi} from "@/api/mes/workteam";
import { OrganizationApi, OrganizationVO } from '@/api/mes/organization'
import { OrganizationApi } from '@/api/mes/organization'
import { defaultProps, handleTree } from '@/utils/tree'
@ -100,8 +69,7 @@ defineOptions({ name: 'Paigong' })
const { t } = useI18n() //
const message = useMessage() //
const organizationTree = ref() //
// name="1" name="2"
const activeNames = ref(['1', '2'])
const dialogVisible = ref(false) //
const dialogTitle = ref('') //
@ -121,7 +89,7 @@ const formData = ref({
const formRules = reactive({
planId: [{ required: true, message: '计划不能为空', trigger: 'blur' }],
feedingPipeline: [{ required: true, message: '制浆线不能为空', trigger: 'blur' }],
workerId: [{ required: true, message: '下料工人不能为空', trigger: 'blur' }]
workerId: [{ required: true, message: '下料工人不能为空', trigger: 'blur' }],
})
const formRef = ref() // Ref

@ -0,0 +1,145 @@
<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="pipeline">
<el-tree-select
v-model="formData.pipeline"
:data="organizationTree"
:props="defaultProps"
check-strictly
default-expand-all
placeholder="请选择生产线"
/>
</el-form-item>
<el-form-item label="派工数量" prop="paigongNum">
<el-input v-model="formData.paigongNum" placeholder="请输入数量" />
</el-form-item>
<el-form-item label="是否试生产" prop="isPreProduction">
<el-radio-group v-model="formData.isPreProduction">
<el-radio
v-for="dict in getIntDictOptions(DICT_TYPE.MES_PRE_PRODUCTION)"
: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 { ItemRequisitionVO } from '@/api/mes/itemrequisition'
import {PlanApi} from "@/api/mes/plan";
import {DICT_TYPE, getIntDictOptions} from "@/utils/dict";
import * as UserApi from "@/api/system/user";
import {WorkTeamApi} from "@/api/mes/workteam";
import { OrganizationApi } from '@/api/mes/organization'
import { defaultProps, handleTree } from '@/utils/tree'
/** 生产领料 表单 */
defineOptions({ name: 'TypePaigong' })
const { t } = useI18n() //
const message = useMessage() //
const organizationTree = ref() //
const dialogVisible = ref(false) //
const dialogTitle = ref('') //
const formLoading = ref(false) // 12
const userList = ref<UserApi.UserVO[]>([]) //
const formData = ref({
requisitionDate: undefined,
deliveryDate: undefined,
planId: undefined,
workerId: undefined,
remark: undefined,
feedingPipeline: undefined,
pipeline: undefined,
paigongNum: undefined,
isPreProduction: undefined
})
const formRules = reactive({
pipeline: [{ required: true, message: '生产线不能为空', trigger: 'blur' }],
isPreProduction: [{ required: true, message: '试生产不能为空', trigger: 'blur' }],
paigongNum: [{ required: true, message: '派工数量不能为空', trigger: 'blur' }],
})
const formRef = ref() // Ref
/** 打开弹窗 */
const open = async (planCode: string, planId: number) => {
dialogVisible.value = true
dialogTitle.value = "计划派工:"+planCode
resetForm()
formLoading.value = true
try {
formData.value.planId = planId
} finally {
formLoading.value = false
}
//
userList.value = await WorkTeamApi.getUserList("zhijiang", '')
await getOrganizationTree()
}
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 ItemRequisitionVO
await PlanApi.arrangePlanNum(data)
message.success("派工成功!")
dialogVisible.value = false
//
emit('success')
} finally {
formLoading.value = false
}
}
/** 重置表单 */
const resetForm = () => {
formData.value = {
requisitionDate: undefined,
deliveryDate: undefined,
workerId: undefined,
feedingPipeline: undefined,
planId: undefined,
remark: undefined,
pipeline: undefined,
paigongNum: undefined,
isPreProduction: 0,
}
formRef.value?.resetFields()
}
/** 获得产线工位树 */
const getOrganizationTree = async () => {
organizationTree.value = []
const req = {orgClass:'pipeline'}
const data = await OrganizationApi.getOrganizationList(req)
const root: Tree = { id: 0, name: '顶级产线工位', children: [] }
root.children = handleTree(data, 'id', 'parentId')
organizationTree.value.push(root)
}
</script>

@ -120,14 +120,21 @@
<el-tab-pane label="入库" name="5" />
</el-tabs>
<el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true">
<!-- 投料进度子表的列表 -->
<el-table-column type="expand">
<template #default="scope">
<el-tabs v-if="scope.row.status > 0" model-value="itemRequisitionDetail">
<el-tab-pane label="投料明细" name="itemRequisitionDetail">
<el-tab-pane label="投料明细" name="itemRequisitionDetail" >
<ItemRequisitionDetailList :item-requisition-id="scope.row.requisitionId" />
</el-tab-pane>
<el-tab-pane label="派工记录" name="paigongRecord">
<PaigongRecordList :plan-id="scope.row.id"/>
</el-tab-pane>
</el-tabs>
<el-tabs v-if="scope.row.status == 0" model-value="paigongRecord">
<el-tab-pane label="派工记录" name="paigongRecord">
<PaigongRecordList :plan-id="scope.row.id"/>
</el-tab-pane>
</el-tabs>
</template>
</el-table-column>
@ -155,7 +162,7 @@
<dict-tag :type="DICT_TYPE.MES_FEEDING_PIPELINE" :value="scope.row.feedingPipeline" />
</template>
</el-table-column>
<el-table-column label="操作" align="center" fixed="right" width="250">
<el-table-column label="操作" align="center" fixed="right" width="350">
<template #default="scope">
<el-button
link
@ -181,7 +188,16 @@
v-hasPermi="['mes:plan:update']"
v-if="scope.row.status === 0"
>
派工
下料派工
</el-button>
<el-button
link
type="primary"
@click="openTypePaiForm(scope.row.code, scope.row.id)"
v-hasPermi="['mes:plan:update']"
v-if="scope.row.status === 0"
>
工序派工
</el-button>
<el-button
link
@ -238,11 +254,14 @@
<!-- 派工弹出 -->
<Paigong ref="paiFormRef" @success="getList" />
<!-- 工序派工弹出 -->
<TypePaigong ref="typePaiFormRef" @success="getList" />
</template>
<script setup lang="ts">
import { getIntDictOptions, getBoolDictOptions, DICT_TYPE } from '@/utils/dict'
import {dateFormatter, dateFormatter2} from '@/utils/formatTime'
import {dateFormatter2} from '@/utils/formatTime'
import download from '@/utils/download'
import { PlanApi, PlanVO } from '@/api/mes/plan'
import PlanForm from './PlanForm.vue'
@ -250,8 +269,9 @@ 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 TypePaigong from "./components/TypePaigong.vue";
import ItemRequisitionDetailList from "@/views/mes/itemrequisition/components/ItemRequisitionDetailList.vue";
import router from '@/router'
import PaigongRecordList from "@/views/mes/paigongrecord/components/PaigongRecordList.vue";
const productList = ref<ProductVO[]>([]) //
@ -375,6 +395,11 @@ const paiFormRef = ref()
const openPaiForm = (planCode: string, planId: number) => {
paiFormRef.value.open(planCode, planId)
}
/** 工序派工 */
const typePaiFormRef = ref()
const openTypePaiForm = (planCode: string, planId: number) => {
typePaiFormRef.value.open(planCode, planId)
}
/** 开工 */
const handleStatus = async (planCode:string, id: number,

@ -1,5 +1,5 @@
<template>
<Dialog :title="dialogTitle" v-model="dialogVisible" width="1080">
<Dialog :title="dialogTitle" v-model="dialogVisible" width="1200">
<el-form
ref="formRef"
:model="formData"

@ -54,7 +54,7 @@
</el-form-item>
</template>
</el-table-column>
<el-table-column label="库存" min-width="100">
<el-table-column label="库存" min-width="120">
<template #default="{ row }">
<el-form-item class="mb-0px!">
<el-input disabled v-model="row.stockCount" :formatter="erpCountInputFormatter" />

@ -131,9 +131,9 @@
width="120px"
sortable
/>
<el-table-column label="领料人" align="center" prop="responseName" sortable/>
<el-table-column label="领料人" align="center" prop="responserName" sortable/>
<el-table-column label="创建人" align="center" prop="creatorName" sortable/>
<el-table-column label="操作" align="center" fixed="right" width="220">
<el-table-column label="操作" align="center" fixed="right" width="250px">
<template #default="scope">
<el-button
link

Loading…
Cancel
Save