feat(mes): 添加工序编号及名称,优化工作站相关功能

新增工序编号和名称字段,更新工作站相关逻辑以支持工序信息的处理。优化工作站的创建、更新和查询功能,确保工序信息的有效性和完整性。
pull/871/MERGE
YunaiV 2026-03-28 17:54:07 +08:00
parent 78e8ec1772
commit 1ad04812e1
7 changed files with 117 additions and 38 deletions

View File

@ -6,13 +6,14 @@
:rules="formRules"
label-width="100px"
v-loading="formLoading"
:disabled="isDetail"
>
<el-row>
<el-col :span="8">
<el-form-item label="工作站编码" prop="code">
<el-input v-model="formData.code" placeholder="请输入工作站编码">
<template #append>
<el-button @click="generateCode" :disabled="formType === 'update'">
<el-button @click="generateCode" :disabled="formType !== 'create'">
生成
</el-button>
</template>
@ -98,6 +99,16 @@
</el-radio-group>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="所属工序" prop="processId">
<ProProcessSelect
v-model="formData.processId"
placeholder="请选择所属工序"
clearable
class="!w-1/1"
/>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
@ -108,19 +119,21 @@
</el-row>
</el-form>
<!-- 编辑时显示子资源 Tab -->
<el-tabs v-if="formType === 'update'" v-model="activeTab" class="mt-10px">
<el-tabs v-if="formType !== 'create'" v-model="activeTab" class="mt-10px">
<el-tab-pane label="设备资源" name="machine">
<WorkstationMachineList :workstation-id="formData.id!" />
<WorkstationMachineList :workstation-id="formData.id!" :formType="formType" />
</el-tab-pane>
<el-tab-pane label="工装夹具" name="tool">
<WorkstationToolList :workstation-id="formData.id!" />
<WorkstationToolList :workstation-id="formData.id!" :formType="formType" />
</el-tab-pane>
<el-tab-pane label="人力资源" name="worker">
<WorkstationWorkerList :workstation-id="formData.id!" />
<WorkstationWorkerList :workstation-id="formData.id!" :formType="formType" />
</el-tab-pane>
</el-tabs>
<template #footer>
<el-button @click="submitForm" type="primary" :disabled="formLoading"> </el-button>
<el-button @click="submitForm" type="primary" :disabled="formLoading" v-if="!isDetail">
</el-button>
<el-button @click="dialogVisible = false"> </el-button>
</template>
</Dialog>
@ -129,12 +142,14 @@
import { getIntDictOptions, DICT_TYPE } from '@/utils/dict'
import { MdWorkstationApi, MdWorkstationVO } from '@/api/mes/md/workstation'
import MdWorkshopSelect from '@/views/mes/md/workstation/components/MdWorkshopSelect.vue'
import ProProcessSelect from '@/views/mes/pro/process/components/ProProcessSelect.vue'
import WmWarehouseSelect from '@/views/mes/wm/warehouse/components/WmWarehouseSelect.vue'
import { WmWarehouseVO } from '@/api/mes/wm/warehouse'
import { WmWarehouseLocationApi, WmWarehouseLocationVO } from '@/api/mes/wm/warehouse/location'
import { WmWarehouseAreaApi, WmWarehouseAreaVO } from '@/api/mes/wm/warehouse/area'
import { CommonStatusEnum } from '@/utils/constants'
import { generateRandomStr } from '@/utils'
import { MesAutoCodeRuleCode } from '@/views/mes/utils/constants'
import { AutoCodeRecordApi } from '@/api/mes/md/autocode/record'
import WorkstationMachineList from './WorkstationMachineList.vue'
import WorkstationToolList from './WorkstationToolList.vue'
import WorkstationWorkerList from './WorkstationWorkerList.vue'
@ -147,7 +162,8 @@ const message = useMessage() // 消息弹窗
const dialogVisible = ref(false) //
const dialogTitle = ref('') //
const formLoading = ref(false) // 12
const formType = ref('') // create - update -
const formType = ref('') // create - update - detail -
const isDetail = computed(() => formType.value === 'detail')
const activeTab = ref('machine') // Tab
const locationList = ref<WmWarehouseLocationVO[]>([]) //
const areaList = ref<WmWarehouseAreaVO[]>([]) //
@ -168,13 +184,16 @@ const formRules = reactive({
code: [{ required: true, message: '工作站编码不能为空', trigger: 'blur' }],
name: [{ required: true, message: '工作站名称不能为空', trigger: 'blur' }],
workshopId: [{ required: true, message: '所在车间不能为空', trigger: 'change' }],
processId: [{ required: true, message: '所属工序不能为空', trigger: 'change' }],
status: [{ required: true, message: '状态不能为空', trigger: 'blur' }]
}) //
const formRef = ref() // Ref
/** 生成工作站编码 */
const generateCode = () => {
formData.value.code = 'WS' + generateRandomStr(12)
const generateCode = async () => {
formData.value.code = await AutoCodeRecordApi.generateAutoCode(
MesAutoCodeRuleCode.MD_WORKSTATION_CODE
)
}
/** 加载库区列表 */

View File

@ -2,7 +2,14 @@
<template>
<div>
<!-- 操作栏 -->
<el-button type="primary" plain size="small" @click="openForm('create')" class="mb-10px">
<el-button
type="primary"
plain
size="small"
@click="openForm('create')"
class="mb-10px"
v-if="!isDetail"
>
<Icon icon="ep:plus" class="mr-5px" /> 添加设备
</el-button>
<!-- 列表 -->
@ -11,7 +18,7 @@
<el-table-column label="设备名称" align="center" prop="machineryName" />
<el-table-column label="数量" align="center" prop="quantity" width="100" />
<el-table-column label="备注" align="center" prop="remark" />
<el-table-column label="操作" align="center" width="80">
<el-table-column label="操作" align="center" width="80" v-if="!isDetail">
<template #default="scope">
<el-button link type="danger" @click="handleDelete(scope.row.id)"></el-button>
</template>
@ -20,7 +27,13 @@
<!-- 表单弹窗添加/修改 -->
<Dialog :title="dialogTitle" v-model="dialogVisible" width="500px">
<el-form ref="formRef" :model="formData" :rules="formRules" label-width="80px" v-loading="formLoading">
<el-form
ref="formRef"
:model="formData"
:rules="formRules"
label-width="80px"
v-loading="formLoading"
>
<el-form-item label="设备" prop="machineryId">
<!-- TODO @芋艿对接设备下拉列表 DV 设备模块完成后对接 -->
<el-input-number
@ -56,10 +69,12 @@ defineOptions({ name: 'WorkstationMachineList' })
const props = defineProps<{
workstationId: number //
formType: string //
}>()
const { t } = useI18n() //
const message = useMessage() //
const isDetail = computed(() => props.formType === 'detail') //
const loading = ref(false) //
const list = ref<MdWorkstationMachineVO[]>([]) //
@ -77,7 +92,7 @@ const getList = async () => {
// ==================== / ====================
const dialogVisible = ref(false) //
const dialogTitle = ref('') //
const formType = ref('') // create - update -
const dialogFormType = ref('') // create - update -
const formLoading = ref(false) //
const formRef = ref() // Ref
const formData = ref({
@ -96,7 +111,7 @@ const formRules = reactive({
const openForm = (type: string) => {
dialogVisible.value = true
dialogTitle.value = t('action.' + type)
formType.value = type
dialogFormType.value = type
resetForm()
}

View File

@ -2,7 +2,14 @@
<template>
<div>
<!-- 操作栏 -->
<el-button type="primary" plain size="small" @click="openForm('create')" class="mb-10px">
<el-button
type="primary"
plain
size="small"
@click="openForm('create')"
class="mb-10px"
v-if="!isDetail"
>
<Icon icon="ep:plus" class="mr-5px" /> 添加工具
</el-button>
<!-- 列表 -->
@ -11,7 +18,7 @@
<el-table-column label="工具类型名称" align="center" prop="toolTypeName" />
<el-table-column label="数量" align="center" prop="quantity" width="100" />
<el-table-column label="备注" align="center" prop="remark" />
<el-table-column label="操作" align="center" width="120">
<el-table-column label="操作" align="center" width="120" v-if="!isDetail">
<template #default="scope">
<el-button link type="primary" @click="openForm('update', scope.row)">编辑</el-button>
<el-button link type="danger" @click="handleDelete(scope.row.id)"></el-button>
@ -34,7 +41,7 @@
v-model="formData.toolTypeId"
placeholder="请输入工具类型编号"
class="!w-1/1"
:disabled="formType === 'update'"
:disabled="dialogFormType === 'update'"
/>
</el-form-item>
<el-form-item label="数量" prop="quantity">
@ -64,10 +71,12 @@ defineOptions({ name: 'WorkstationToolList' })
const props = defineProps<{
workstationId: number //
formType: string //
}>()
const { t } = useI18n() //
const message = useMessage() //
const isDetail = computed(() => props.formType === 'detail') //
const loading = ref(false) //
const list = ref<MdWorkstationToolVO[]>([]) //
@ -85,7 +94,7 @@ const getList = async () => {
// ==================== / ====================
const dialogVisible = ref(false) //
const dialogTitle = ref('') //
const formType = ref('') // create - update -
const dialogFormType = ref('') // create - update -
const formLoading = ref(false) //
const formRef = ref() // Ref
const formData = ref({
@ -104,7 +113,7 @@ const formRules = reactive({
const openForm = (type: string, row?: MdWorkstationToolVO) => {
dialogVisible.value = true
dialogTitle.value = t('action.' + type)
formType.value = type
dialogFormType.value = type
resetForm()
//
if (type === 'update' && row) {
@ -122,7 +131,7 @@ const submitForm = async () => {
formLoading.value = true
try {
const data = formData.value as unknown as MdWorkstationToolVO
if (formType.value === 'create') {
if (dialogFormType.value === 'create') {
await MdWorkstationToolApi.createWorkstationTool(data)
message.success(t('common.createSuccess'))
} else {

View File

@ -2,7 +2,14 @@
<template>
<div>
<!-- 操作栏 -->
<el-button type="primary" plain size="small" @click="openForm('create')" class="mb-10px">
<el-button
type="primary"
plain
size="small"
@click="openForm('create')"
class="mb-10px"
v-if="!isDetail"
>
<Icon icon="ep:plus" class="mr-5px" /> 添加人员
</el-button>
<!-- 列表 -->
@ -11,7 +18,7 @@
<el-table-column label="岗位名称" align="center" prop="postName" />
<el-table-column label="数量" align="center" prop="quantity" width="100" />
<el-table-column label="备注" align="center" prop="remark" />
<el-table-column label="操作" align="center" width="120">
<el-table-column label="操作" align="center" width="120" v-if="!isDetail">
<template #default="scope">
<el-button link type="primary" @click="openForm('update', scope.row)">编辑</el-button>
<el-button link type="danger" @click="handleDelete(scope.row.id)"></el-button>
@ -21,13 +28,15 @@
<!-- 表单弹窗添加/修改 -->
<Dialog :title="dialogTitle" v-model="dialogVisible" width="500px">
<el-form ref="formRef" :model="formData" :rules="formRules" label-width="80px" v-loading="formLoading">
<el-form
ref="formRef"
:model="formData"
:rules="formRules"
label-width="80px"
v-loading="formLoading"
>
<el-form-item label="岗位" prop="postId">
<el-select
v-model="formData.postId"
placeholder="请选择岗位"
class="!w-1/1"
>
<el-select v-model="formData.postId" placeholder="请选择岗位" class="!w-1/1">
<el-option
v-for="post in postList"
:key="post.id"
@ -64,10 +73,12 @@ defineOptions({ name: 'WorkstationWorkerList' })
const props = defineProps<{
workstationId: number //
formType: string //
}>()
const { t } = useI18n() //
const message = useMessage() //
const isDetail = computed(() => props.formType === 'detail') //
const loading = ref(false) //
const list = ref<MdWorkstationWorkerVO[]>([]) //
@ -86,7 +97,7 @@ const getList = async () => {
// ==================== / ====================
const dialogVisible = ref(false) //
const dialogTitle = ref('') //
const formType = ref('') // create - update -
const dialogFormType = ref('') // create - update -
const formLoading = ref(false) //
const formRef = ref() // Ref
const formData = ref({
@ -105,7 +116,7 @@ const formRules = reactive({
const openForm = async (type: string, row?: MdWorkstationWorkerVO) => {
dialogVisible.value = true
dialogTitle.value = t('action.' + type)
formType.value = type
dialogFormType.value = type
resetForm()
//
postList.value = await PostApi.getSimplePostList()
@ -125,7 +136,7 @@ const submitForm = async () => {
formLoading.value = true
try {
const data = formData.value as unknown as MdWorkstationWorkerVO
if (formType.value === 'create') {
if (dialogFormType.value === 'create') {
await MdWorkstationWorkerApi.createWorkstationWorker(data)
message.success(t('common.createSuccess'))
} else {

View File

@ -29,6 +29,9 @@
<el-form-item label="所在车间" prop="workshopId">
<MdWorkshopSelect v-model="queryParams.workshopId" placeholder="请选择车间" clearable class="!w-240px" />
</el-form-item>
<el-form-item label="所属工序" prop="processId">
<ProProcessSelect v-model="queryParams.processId" placeholder="请选择工序" clearable class="!w-240px" />
</el-form-item>
<el-form-item label="状态" prop="status">
<el-select v-model="queryParams.status" placeholder="请选择状态" clearable class="!w-240px">
<el-option
@ -66,11 +69,17 @@
<!-- 列表 -->
<ContentWrap>
<el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true">
<el-table-column label="工作站编码" align="center" prop="code" min-width="120" />
<el-table-column label="工作站编码" align="center" prop="code" min-width="120">
<template #default="scope">
<el-link type="primary" @click="openForm('detail', scope.row.id)">
{{ scope.row.code }}
</el-link>
</template>
</el-table-column>
<el-table-column label="工作站名称" align="center" prop="name" min-width="150" />
<el-table-column label="工作站地点" align="center" prop="address" min-width="150" />
<el-table-column label="所在车间" align="center" prop="workshopName" min-width="120" />
<!-- TODO @芋艿所属工序等工序模块完成后对接 -->
<el-table-column label="所属工序" align="center" prop="processName" min-width="120" />
<el-table-column label="状态" align="center" prop="status" min-width="100">
<template #default="scope">
<dict-tag :type="DICT_TYPE.COMMON_STATUS" :value="scope.row.status" />
@ -101,6 +110,7 @@
>
删除
</el-button>
<!-- TODO @芋艿对齐后续搞标签打印 -->
<el-button
link
type="primary"
@ -132,6 +142,7 @@ import { dateFormatter } from '@/utils/formatTime'
import download from '@/utils/download'
import { MdWorkstationApi, MdWorkstationVO } from '@/api/mes/md/workstation'
import MdWorkshopSelect from './components/MdWorkshopSelect.vue'
import ProProcessSelect from '@/views/mes/pro/process/components/ProProcessSelect.vue'
import WorkstationForm from './WorkstationForm.vue'
import { DICT_TYPE, getIntDictOptions } from '@/utils/dict'
import { BarcodeDetail } from '@/views/mes/wm/barcode/components'
@ -151,6 +162,7 @@ const queryParams = reactive({
code: undefined,
name: undefined,
workshopId: undefined,
processId: undefined,
status: undefined
})
const queryFormRef = ref() //

View File

@ -416,6 +416,7 @@ export const MesAutoCodeRuleCode = {
MD_ITEM_CODE: 'MD_ITEM_CODE', // 物料编码
MD_VENDOR_CODE: 'MD_VENDOR_CODE', // 供应商编码
MD_CLIENT_CODE: 'MD_CLIENT_CODE', // 客户编码
MD_WORKSTATION_CODE: 'MD_WORKSTATION_CODE', // 工作站编码
WM_SN_CODE: 'WM_SN_CODE', // SN 码
WM_PACKAGE_CODE: 'WM_PACKAGE_CODE', // 装箱单编码
WM_BATCH_CODE: 'WM_BATCH_CODE', // 批次编码

View File

@ -118,7 +118,12 @@
<el-row>
<el-col :span="8">
<el-form-item label="状态" prop="status">
<el-select v-model="formData.status" placeholder="请选择" class="!w-1/1" :disabled="isDetail">
<el-select
v-model="formData.status"
placeholder="请选择"
class="!w-1/1"
:disabled="isDetail"
>
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.COMMON_STATUS)"
:key="dict.value"
@ -149,15 +154,22 @@
<el-row>
<el-col :span="24">
<el-form-item label="备注" prop="remark">
<el-input v-model="formData.remark" type="textarea" placeholder="请输入备注" :disabled="isDetail" />
<el-input
v-model="formData.remark"
type="textarea"
placeholder="请输入备注"
:disabled="isDetail"
/>
</el-form-item>
</el-col>
</el-row>
</el-form>
<template #footer>
<!-- TODO @芋艿barcodeimg -->
<el-button v-if="!isDetail" @click="submitForm" type="primary" :disabled="formLoading"> </el-button>
<el-button @click="dialogVisible = false">{{ isDetail ? '关 闭' : '取 消' }}</el-button>
<el-button v-if="!isDetail" @click="submitForm" type="primary" :disabled="formLoading">
</el-button>
<el-button @click="dialogVisible = false"> </el-button>
</template>
</Dialog>
</template>