refactor(mes-ui): 修正工作站模块中文标签命名 & 拆分 API 文件

- 表单标签/占位符/校验提示:工位 → 工作站
- API 注释:工位设备 → 设备资源、工位工具 → 工装夹具资源、工位人员 → 人力资源
- 拆分 workstation API 到 machine/tool/worker/workshop 子目录
pull/871/MERGE
YunaiV 2026-02-16 12:12:03 +08:00
parent 59bd23b3e0
commit 95c478d739
13 changed files with 220 additions and 161 deletions

View File

@ -13,7 +13,7 @@ export interface MdItemBatchConfigVO {
purchaseOrderCodeFlag: boolean // 批次属性-采购订单编号
workorderFlag: boolean // 批次属性-生产工单
taskFlag: boolean // 批次属性-生产任务
workstationFlag: boolean // 批次属性-工
workstationFlag: boolean // 批次属性-工作站
toolFlag: boolean // 批次属性-工具
moldFlag: boolean // 批次属性-模具
lotNumberFlag: boolean // 批次属性-生产批号

View File

@ -1,13 +1,13 @@
import request from '@/config/axios'
// TODO @AI【遵守我说的】是不是每个 VO 独立文件;例如说 tool/ 、worker/、machine/ 等等
// DONE @AI【遵守我说的】是不是每个 VO 独立文件;例如说 tool/ 、worker/、machine/ 等等
// MES 工 VO
// MES 工作站 VO
export interface MdWorkstationVO {
id: number // 工编号
code: string // 工编码
name: string // 工名称
address: string // 工地点
id: number // 工作站编号
code: string // 工作站编码
name: string // 工作站名称
address: string // 工作站地点
workshopId: number // 所在车间 ID
workshopName: string // 所在车间名称
processId: number // 工序 ID
@ -22,135 +22,40 @@ export interface MdWorkstationVO {
attribute4: number
}
// MES 工位设备 VO
export interface MdWorkstationMachineVO {
id: number
workstationId: number // 工位 ID
machineryId: number // 设备 ID
machineryName: string // 设备名称
machineryCode: string // 设备编码
quantity: number // 数量
remark: string // 备注
}
// MES 工位工具 VO
export interface MdWorkstationToolVO {
id: number
workstationId: number // 工位 ID
toolTypeId: number // 工具类型 ID
toolTypeName: string // 工具类型名称
quantity: number // 数量
remark: string // 备注
}
// MES 工位人员 VO
export interface MdWorkstationWorkerVO {
id: number
workstationId: number // 工位 ID
postId: number // 岗位 ID
postName: string // 岗位名称
quantity: number // 数量
remark: string // 备注
}
// MES 工位 API
// MES 工作站 API
export const MdWorkstationApi = {
// 查询工分页
// 查询工作站分页
getWorkstationPage: async (params: any) => {
return await request.get({ url: `/mes/md-workstation/page`, params })
},
// 查询工精简列表
// 查询工作站精简列表
getWorkstationSimpleList: async () => {
return await request.get({ url: `/mes/md-workstation/simple-list` })
},
// 查询工详情
// 查询工作站详情
getWorkstation: async (id: number) => {
return await request.get({ url: `/mes/md-workstation/get?id=` + id })
},
// 新增工
// 新增工作站
createWorkstation: async (data: MdWorkstationVO) => {
return await request.post({ url: `/mes/md-workstation/create`, data })
},
// 修改工
// 修改工作站
updateWorkstation: async (data: MdWorkstationVO) => {
return await request.put({ url: `/mes/md-workstation/update`, data })
},
// 删除工
// 删除工作站
deleteWorkstation: async (id: number) => {
return await request.delete({ url: `/mes/md-workstation/delete?id=` + id })
},
// 导出工 Excel
// 导出工作站 Excel
exportWorkstation: async (params: any) => {
return await request.download({ url: `/mes/md-workstation/export-excel`, params })
}
}
// MES 工位设备 API
export const MdWorkstationMachineApi = {
// 查询工位设备列表
getWorkstationMachineList: async (workstationId: number) => {
return await request.get({ url: `/mes/md-workstation-machine/list-by-workstation?workstationId=` + workstationId })
},
// 新增工位设备
createWorkstationMachine: async (data: MdWorkstationMachineVO) => {
return await request.post({ url: `/mes/md-workstation-machine/create`, data })
},
// 删除工位设备
deleteWorkstationMachine: async (id: number) => {
return await request.delete({ url: `/mes/md-workstation-machine/delete?id=` + id })
}
}
// MES 工位工具 API
export const MdWorkstationToolApi = {
// 查询工位工具列表
getWorkstationToolList: async (workstationId: number) => {
return await request.get({ url: `/mes/md-workstation-tool/list-by-workstation?workstationId=` + workstationId })
},
// 新增工位工具
createWorkstationTool: async (data: MdWorkstationToolVO) => {
return await request.post({ url: `/mes/md-workstation-tool/create`, data })
},
// 修改工位工具
updateWorkstationTool: async (data: MdWorkstationToolVO) => {
return await request.put({ url: `/mes/md-workstation-tool/update`, data })
},
// 删除工位工具
deleteWorkstationTool: async (id: number) => {
return await request.delete({ url: `/mes/md-workstation-tool/delete?id=` + id })
}
}
// MES 工位人员 API
export const MdWorkstationWorkerApi = {
// 查询工位人员列表
getWorkstationWorkerList: async (workstationId: number) => {
return await request.get({ url: `/mes/md-workstation-worker/list-by-workstation?workstationId=` + workstationId })
},
// 新增工位人员
createWorkstationWorker: async (data: MdWorkstationWorkerVO) => {
return await request.post({ url: `/mes/md-workstation-worker/create`, data })
},
// 修改工位人员
updateWorkstationWorker: async (data: MdWorkstationWorkerVO) => {
return await request.put({ url: `/mes/md-workstation-worker/update`, data })
},
// 删除工位人员
deleteWorkstationWorker: async (id: number) => {
return await request.delete({ url: `/mes/md-workstation-worker/delete?id=` + id })
}
}

View File

@ -0,0 +1,30 @@
import request from '@/config/axios'
// MES 设备资源 VO
export interface MdWorkstationMachineVO {
id: number
workstationId: number // 工作站 ID
machineryId: number // 设备 ID
machineryName: string // 设备名称
machineryCode: string // 设备编码
quantity: number // 数量
remark: string // 备注
}
// MES 设备资源 API
export const MdWorkstationMachineApi = {
// 查询设备资源列表
getWorkstationMachineList: async (workstationId: number) => {
return await request.get({ url: `/mes/md-workstation-machine/list-by-workstation?workstationId=` + workstationId })
},
// 新增设备资源
createWorkstationMachine: async (data: MdWorkstationMachineVO) => {
return await request.post({ url: `/mes/md-workstation-machine/create`, data })
},
// 删除设备资源
deleteWorkstationMachine: async (id: number) => {
return await request.delete({ url: `/mes/md-workstation-machine/delete?id=` + id })
}
}

View File

@ -0,0 +1,34 @@
import request from '@/config/axios'
// MES 工装夹具资源 VO
export interface MdWorkstationToolVO {
id: number
workstationId: number // 工作站 ID
toolTypeId: number // 工具类型 ID
toolTypeName: string // 工具类型名称
quantity: number // 数量
remark: string // 备注
}
// MES 工装夹具资源 API
export const MdWorkstationToolApi = {
// 查询工装夹具资源列表
getWorkstationToolList: async (workstationId: number) => {
return await request.get({ url: `/mes/md-workstation-tool/list-by-workstation?workstationId=` + workstationId })
},
// 新增工装夹具资源
createWorkstationTool: async (data: MdWorkstationToolVO) => {
return await request.post({ url: `/mes/md-workstation-tool/create`, data })
},
// 修改工装夹具资源
updateWorkstationTool: async (data: MdWorkstationToolVO) => {
return await request.put({ url: `/mes/md-workstation-tool/update`, data })
},
// 删除工装夹具资源
deleteWorkstationTool: async (id: number) => {
return await request.delete({ url: `/mes/md-workstation-tool/delete?id=` + id })
}
}

View File

@ -0,0 +1,34 @@
import request from '@/config/axios'
// MES 人力资源 VO
export interface MdWorkstationWorkerVO {
id: number
workstationId: number // 工作站 ID
postId: number // 岗位 ID
postName: string // 岗位名称
quantity: number // 数量
remark: string // 备注
}
// MES 人力资源 API
export const MdWorkstationWorkerApi = {
// 查询人力资源列表
getWorkstationWorkerList: async (workstationId: number) => {
return await request.get({ url: `/mes/md-workstation-worker/list-by-workstation?workstationId=` + workstationId })
},
// 新增人力资源
createWorkstationWorker: async (data: MdWorkstationWorkerVO) => {
return await request.post({ url: `/mes/md-workstation-worker/create`, data })
},
// 修改人力资源
updateWorkstationWorker: async (data: MdWorkstationWorkerVO) => {
return await request.put({ url: `/mes/md-workstation-worker/update`, data })
},
// 删除人力资源
deleteWorkstationWorker: async (id: number) => {
return await request.delete({ url: `/mes/md-workstation-worker/delete?id=` + id })
}
}

View File

@ -24,7 +24,7 @@
<el-checkbox v-model="formData.salesOrderCodeFlag"></el-checkbox>
<el-checkbox v-model="formData.workorderFlag"></el-checkbox>
<el-checkbox v-model="formData.taskFlag"></el-checkbox>
<el-checkbox v-model="formData.workstationFlag"></el-checkbox>
<el-checkbox v-model="formData.workstationFlag"></el-checkbox>
<el-checkbox v-model="formData.toolFlag"></el-checkbox>
<el-checkbox v-model="formData.moldFlag"></el-checkbox>
</template>

View File

@ -89,7 +89,6 @@
</template>
<script setup lang="ts">
// TODO @AI
import { MdProductBomApi, MdProductBomVO } from '@/api/mes/md/item/productBom'
import { MdItemApi } from '@/api/mes/md/item'
import { getItemOrProductLabel } from '@/views/mes/utils/constants'
@ -97,14 +96,14 @@ import { getItemOrProductLabel } from '@/views/mes/utils/constants'
defineOptions({ name: 'MdProductBomForm' })
const props = defineProps<{
itemId: number
itemId: number //
}>()
const message = useMessage()
const loading = ref(false)
const list = ref<MdProductBomVO[]>([])
const loading = ref(false) //
const list = ref<MdProductBomVO[]>([]) // BOM
/** 加载列表 */
/** 加载 BOM 列表 */
const getList = async () => {
loading.value = true
try {
@ -115,9 +114,10 @@ const getList = async () => {
}
// ==================== ====================
const itemSearchLoading = ref(false)
const itemOptions = ref<any[]>([])
const itemSearchLoading = ref(false) //
const itemOptions = ref<any[]>([]) //
/** 远程搜索物料 */
const searchItems = async (query: string) => {
if (!query) {
itemOptions.value = []
@ -133,8 +133,9 @@ const searchItems = async (query: string) => {
}
// ==================== BOM ====================
const addDialogVisible = ref(false)
const addFormRef = ref()
const addDialogVisible = ref(false) //
const addFormRef = ref() // Ref
/** 添加表单数据 */
const addFormData = ref({
itemId: undefined as number | undefined,
bomItemId: undefined as number | undefined,
@ -146,6 +147,7 @@ const addFormRules = reactive({
quantity: [{ required: true, message: '用量比例不能为空', trigger: 'blur' }]
})
/** 打开添加弹窗 */
const openAddForm = () => {
addDialogVisible.value = true
addFormData.value = {
@ -158,6 +160,7 @@ const openAddForm = () => {
addFormRef.value?.resetFields()
}
/** 提交添加表单 */
const submitAddForm = async () => {
await addFormRef.value.validate()
await MdProductBomApi.createProductBom(addFormData.value as unknown as MdProductBomVO)
@ -167,8 +170,9 @@ const submitAddForm = async () => {
}
// ==================== BOM ====================
const editDialogVisible = ref(false)
const editFormRef = ref()
const editDialogVisible = ref(false) //
const editFormRef = ref() // Ref
/** 编辑表单数据 */
const editFormData = ref({
id: undefined as number | undefined,
itemId: undefined as number | undefined,
@ -180,6 +184,7 @@ const editFormRules = reactive({
quantity: [{ required: true, message: '用量比例不能为空', trigger: 'blur' }]
})
/** 打开编辑弹窗 */
const openEditForm = (row: MdProductBomVO) => {
editDialogVisible.value = true
editFormData.value = {
@ -192,6 +197,7 @@ const openEditForm = (row: MdProductBomVO) => {
editFormRef.value?.resetFields()
}
/** 提交编辑表单 */
const submitEditForm = async () => {
await editFormRef.value.validate()
await MdProductBomApi.updateProductBom(editFormData.value as unknown as MdProductBomVO)
@ -201,6 +207,8 @@ const submitEditForm = async () => {
}
// ==================== ====================
/** 删除 BOM */
const handleDelete = async (id: number) => {
try {
await message.delConfirm()

View File

@ -9,8 +9,8 @@
>
<el-row>
<el-col :span="8">
<el-form-item label="工编码" prop="code">
<el-input v-model="formData.code" placeholder="请输入工编码">
<el-form-item label="工作站编码" prop="code">
<el-input v-model="formData.code" placeholder="请输入工作站编码">
<template #append>
<el-button @click="generateCode" :disabled="formType === 'update'">
生成
@ -20,8 +20,8 @@
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="工名称" prop="name">
<el-input v-model="formData.name" placeholder="请输入工名称" />
<el-form-item label="工作站名称" prop="name">
<el-input v-model="formData.name" placeholder="请输入工作站名称" />
</el-form-item>
</el-col>
<el-col :span="8">
@ -39,10 +39,11 @@
</el-row>
<el-row>
<el-col :span="8">
<el-form-item label="工地点" prop="address">
<el-input v-model="formData.address" placeholder="请输入工地点" />
<el-form-item label="工作站地点" prop="address">
<el-input v-model="formData.address" placeholder="请输入工作站地点" />
</el-form-item>
</el-col>
<!-- TODO @AI所属工序 -->
<el-col :span="8">
<el-form-item label="状态" prop="status">
<el-radio-group v-model="formData.status">
@ -70,12 +71,10 @@
<el-tab-pane label="设备资源" name="machine">
<WorkstationMachinePanel :workstation-id="formData.id!" />
</el-tab-pane>
<!-- TODO @AI工装夹具 -->
<el-tab-pane label="工具资源" name="tool">
<el-tab-pane label="工装夹具" name="tool">
<WorkstationToolPanel :workstation-id="formData.id!" />
</el-tab-pane>
<!-- TODO @AI人力资源 -->
<el-tab-pane label="人员资源" name="worker">
<el-tab-pane label="人力资源" name="worker">
<WorkstationWorkerPanel :workstation-id="formData.id!" />
</el-tab-pane>
</el-tabs>
@ -95,6 +94,9 @@ import WorkstationMachinePanel from './components/WorkstationMachinePanel.vue'
import WorkstationToolPanel from './components/WorkstationToolPanel.vue'
import WorkstationWorkerPanel from './components/WorkstationWorkerPanel.vue'
// TODO @AI
// TODO @AI
defineOptions({ name: 'WorkstationForm' })
const { t } = useI18n() //
@ -120,14 +122,14 @@ const formData = ref({
remark: undefined
})
const formRules = reactive({
code: [{ required: true, message: '工编码不能为空', trigger: 'blur' }],
name: [{ required: true, message: '工名称不能为空', trigger: 'blur' }],
code: [{ required: true, message: '工作站编码不能为空', trigger: 'blur' }],
name: [{ required: true, message: '工作站名称不能为空', trigger: 'blur' }],
workshopId: [{ required: true, message: '所在车间不能为空', trigger: 'change' }],
status: [{ required: true, message: '状态不能为空', trigger: 'blur' }]
})
const formRef = ref()
/** 生成工编码 */
/** 生成工作站编码 */
const generateCode = () => {
formData.value.code = 'WS' + generateRandomStr(12)
}

View File

@ -38,7 +38,10 @@
</template>
<script setup lang="ts">
import { MdWorkstationMachineApi, MdWorkstationMachineVO } from '@/api/mes/md/workstation'
import { MdWorkstationMachineApi, MdWorkstationMachineVO } from '@/api/mes/md/workstation/machine'
// TODO @AI
// TODO @AI
const props = defineProps<{
workstationId: number
@ -59,6 +62,7 @@ const getList = async () => {
}
/** 添加弹窗 */
// TODO @AI使 form add
const addDialogVisible = ref(false)
const addFormRef = ref()
const addFormData = ref({

View File

@ -21,10 +21,20 @@
<el-form ref="formRef" :model="formData" :rules="formRules" label-width="80px">
<el-form-item label="工具类型" prop="toolTypeId">
<!-- TODO @芋艿对接工具类型下拉列表 TM 工具模块完成后对接 -->
<el-input-number v-model="formData.toolTypeId" placeholder="请输入工具类型编号" class="!w-1/1" :disabled="isEdit" />
<el-input-number
v-model="formData.toolTypeId"
placeholder="请输入工具类型编号"
class="!w-1/1"
:disabled="isEdit"
/>
</el-form-item>
<el-form-item label="数量" prop="quantity">
<el-input-number v-model="formData.quantity" :min="1" controls-position="right" class="!w-1/1" />
<el-input-number
v-model="formData.quantity"
:min="1"
controls-position="right"
class="!w-1/1"
/>
</el-form-item>
<el-form-item label="备注" prop="remark">
<el-input v-model="formData.remark" type="textarea" placeholder="请输入备注" />
@ -39,7 +49,10 @@
</template>
<script setup lang="ts">
import { MdWorkstationToolApi, MdWorkstationToolVO } from '@/api/mes/md/workstation'
import { MdWorkstationToolApi, MdWorkstationToolVO } from '@/api/mes/md/workstation/tool'
// TODO @AI
// TODO @AI
const props = defineProps<{
workstationId: number
@ -62,7 +75,7 @@ const getList = async () => {
/** 弹窗 */
const dialogVisible = ref(false)
const dialogTitle = ref('')
const isEdit = ref(false)
const isEdit = ref(false) // TODO @AIformType
const formRef = ref()
const formData = ref({
id: undefined as number | undefined,
@ -100,10 +113,14 @@ const openEditForm = (row: MdWorkstationToolVO) => {
const submitForm = async () => {
await formRef.value.validate()
if (isEdit.value) {
await MdWorkstationToolApi.updateWorkstationTool(formData.value as unknown as MdWorkstationToolVO)
await MdWorkstationToolApi.updateWorkstationTool(
formData.value as unknown as MdWorkstationToolVO
)
message.success('编辑成功')
} else {
await MdWorkstationToolApi.createWorkstationTool(formData.value as unknown as MdWorkstationToolVO)
await MdWorkstationToolApi.createWorkstationTool(
formData.value as unknown as MdWorkstationToolVO
)
message.success('添加成功')
}
dialogVisible.value = false

View File

@ -20,7 +20,12 @@
<Dialog :title="dialogTitle" v-model="dialogVisible" width="500px">
<el-form ref="formRef" :model="formData" :rules="formRules" label-width="80px">
<el-form-item label="岗位" prop="postId">
<el-select v-model="formData.postId" placeholder="请选择岗位" class="!w-1/1" :disabled="isEdit">
<el-select
v-model="formData.postId"
placeholder="请选择岗位"
class="!w-1/1"
:disabled="isEdit"
>
<el-option
v-for="post in postList"
:key="post.id"
@ -30,7 +35,12 @@
</el-select>
</el-form-item>
<el-form-item label="数量" prop="quantity">
<el-input-number v-model="formData.quantity" :min="1" controls-position="right" class="!w-1/1" />
<el-input-number
v-model="formData.quantity"
:min="1"
controls-position="right"
class="!w-1/1"
/>
</el-form-item>
<el-form-item label="备注" prop="remark">
<el-input v-model="formData.remark" type="textarea" placeholder="请输入备注" />
@ -45,9 +55,12 @@
</template>
<script setup lang="ts">
import { MdWorkstationWorkerApi, MdWorkstationWorkerVO } from '@/api/mes/md/workstation'
import { MdWorkstationWorkerApi, MdWorkstationWorkerVO } from '@/api/mes/md/workstation/worker'
import * as PostApi from '@/api/system/post'
// TODO @AI
// TODO @AI
const props = defineProps<{
workstationId: number
}>()
@ -70,7 +83,7 @@ const getList = async () => {
/** 弹窗 */
const dialogVisible = ref(false)
const dialogTitle = ref('')
const isEdit = ref(false)
const isEdit = ref(false) // TODO @AIformType
const formRef = ref()
const formData = ref({
id: undefined as number | undefined,
@ -112,10 +125,14 @@ const openEditForm = async (row: MdWorkstationWorkerVO) => {
const submitForm = async () => {
await formRef.value.validate()
if (isEdit.value) {
await MdWorkstationWorkerApi.updateWorkstationWorker(formData.value as unknown as MdWorkstationWorkerVO)
await MdWorkstationWorkerApi.updateWorkstationWorker(
formData.value as unknown as MdWorkstationWorkerVO
)
message.success('编辑成功')
} else {
await MdWorkstationWorkerApi.createWorkstationWorker(formData.value as unknown as MdWorkstationWorkerVO)
await MdWorkstationWorkerApi.createWorkstationWorker(
formData.value as unknown as MdWorkstationWorkerVO
)
message.success('添加成功')
}
dialogVisible.value = false

View File

@ -6,28 +6,33 @@
:model="queryParams"
ref="queryFormRef"
:inline="true"
label-width="68px"
label-width="85px"
>
<el-form-item label="工编码" prop="code">
<el-form-item label="工作站编码" prop="code">
<el-input
v-model="queryParams.code"
placeholder="请输入工编码"
placeholder="请输入工作站编码"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="工名称" prop="name">
<el-form-item label="工作站名称" prop="name">
<el-input
v-model="queryParams.name"
placeholder="请输入工名称"
placeholder="请输入工作站名称"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="所在车间" prop="workshopId">
<el-select v-model="queryParams.workshopId" placeholder="请选择车间" clearable class="!w-240px">
<el-select
v-model="queryParams.workshopId"
placeholder="请选择车间"
clearable
class="!w-240px"
>
<el-option
v-for="workshop in workshopList"
:key="workshop.id"
@ -72,13 +77,15 @@
<!-- 列表 -->
<ContentWrap>
<!-- @AI宽度的设置有问题参考下别的模块已对齐列宽 -->
<!-- @AI我指的是你这么写宽度占不满屏幕 -->
<el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true">
<!-- TODO @AI应该是应该是工作站然后字段在对齐下 -->
<el-table-column label="工位编码" align="center" prop="code" />
<el-table-column label="工位名称" align="center" prop="name" width="150" />
<el-table-column label="工位地点" align="center" prop="address" />
<el-table-column label="所在车间" align="center" prop="workshopName" />
<el-table-column label="状态" align="center" prop="status">
<el-table-column label="工作站编码" align="center" prop="code" width="120" />
<el-table-column label="工作站名称" align="center" prop="name" width="150" />
<el-table-column label="工作站地点" align="center" prop="address" width="150" />
<el-table-column label="所在车间" align="center" prop="workshopName" width="120" />
<!-- TODO @AI所属工序 -->
<el-table-column label="状态" align="center" prop="status" width="100">
<template #default="scope">
<dict-tag :type="DICT_TYPE.COMMON_STATUS" :value="scope.row.status" />
</template>
@ -92,6 +99,7 @@
/>
<el-table-column label="操作" align="center" width="150">
<template #default="scope">
<!-- TODO @芋艿标签打印 -->
<el-button
link
type="primary"
@ -198,7 +206,7 @@ const handleExport = async () => {
await message.exportConfirm()
exportLoading.value = true
const data = await MdWorkstationApi.exportWorkstation(queryParams)
download.excel(data, '工.xls')
download.excel(data, '工作站.xls')
} catch {
} finally {
exportLoading.value = false