main
kkk-ops 1 month ago
parent 4d3ae61aec
commit 9acf8624e7

@ -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"

@ -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

@ -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