feat(mes): 添加物料产品状态更新功能,优化物料分类选择器

pull/871/MERGE
YunaiV 2026-03-28 09:47:38 +08:00
parent 3860970490
commit db6a9aeabe
4 changed files with 109 additions and 39 deletions

View File

@ -47,6 +47,11 @@ export const MdItemApi = {
return await request.put({ url: `/mes/md/item/update`, data })
},
// 修改物料产品状态
updateItemStatus: async (id: number, status: number) => {
return await request.put({ url: `/mes/md/item/update-status`, params: { id, status } })
},
// 删除物料产品
deleteItem: async (id: number) => {
return await request.delete({ url: `/mes/md/item/delete?id=` + id })

View File

@ -37,22 +37,12 @@
</el-col>
<el-col :span="8">
<el-form-item label="物料分类" prop="itemTypeId">
<!-- TODO @AI /Users/yunai/Java/yudao-all-in-one/yudao-ui-admin-vue3/src/views/mes/md/item/type 增加一个物料的 select注意只允许选择子节点 -->
<el-tree-select
v-model="formData.itemTypeId"
:data="itemTypeTree"
:props="defaultProps"
check-strictly
default-expand-all
placeholder="请选择物料分类"
class="w-1/1"
/>
<MdItemTypeSelect v-model="formData.itemTypeId" />
</el-form-item>
</el-col>
<!-- TODO @AI1新建时默认为禁用后端设置2这里只负责展示后端的 save vo 不要接收该参数 -->
<el-col :span="8">
<el-form-item label="状态" prop="status">
<el-radio-group v-model="formData.status">
<el-radio-group v-model="formData.status" disabled>
<el-radio
v-for="dict in getIntDictOptions(DICT_TYPE.COMMON_STATUS)"
:key="dict.value"
@ -135,15 +125,14 @@
<script setup lang="ts">
import { getIntDictOptions, DICT_TYPE } from '@/utils/dict'
import { MdItemApi, MdItemVO } from '@/api/mes/md/item'
import { MdItemTypeApi, MdItemTypeVO } from '@/api/mes/md/item/type'
import { AutoCodeRecordApi } from '@/api/mes/md/autocode/record'
import MdItemBatchConfigForm from './MdItemBatchConfigForm.vue'
import MdProductBomForm from './MdProductBomForm.vue'
import MdProductSopForm from './MdProductSopForm.vue'
import MdProductSipForm from './MdProductSipForm.vue'
import MdUnitMeasureSelect from '@/views/mes/md/unitmeasure/components/MdUnitMeasureSelect.vue'
import MdItemTypeSelect from '@/views/mes/md/item/type/components/MdItemTypeSelect.vue'
import { CommonStatusEnum } from '@/utils/constants'
import { defaultProps, handleTree } from '@/utils/tree'
import { MesAutoCodeRuleCode } from '@/views/mes/utils/constants'
/** MES 物料产品 表单 */
@ -153,8 +142,11 @@ const { t } = useI18n() // 国际化
const message = useMessage() //
const dialogVisible = ref(false) //
// TODO @AI使 compute ///
const dialogTitle = ref('') //
const dialogTitle = computed(() => {
if (formType.value === 'create') return '新增物料/产品'
if (formType.value === 'update') return '修改物料/产品'
return '查看物料/产品'
}) //
const formLoading = ref(false) // 12
const formType = ref('') // create - update -
const activeTab = ref('bom') // Tab
@ -171,7 +163,8 @@ const formData = ref({
maxStock: 0,
highValue: false,
batchFlag: true,
remark: undefined
remark: undefined,
itemOrProduct: undefined
})
const formRules = reactive({
code: [{ required: true, message: '物料编码不能为空', trigger: 'blur' }],
@ -181,17 +174,7 @@ const formRules = reactive({
status: [{ required: true, message: '状态不能为空', trigger: 'blur' }]
})
const formRef = ref() // Ref
const itemTypeTree = ref<MdItemTypeVO[]>([]) //
const itemTypeList = ref<MdItemTypeVO[]>([]) //
/** 当前物料的「物料/产品」标识 */
const currentItemOrProduct = computed(() => {
if (!formData.value.itemTypeId) {
return ''
}
const itemType = itemTypeList.value.find((t) => t.id === formData.value.itemTypeId)
return itemType?.itemOrProduct || ''
})
const currentItemOrProduct = computed(() => formData.value.itemOrProduct || '') // /
/** 生成物料编码 */
const generateCode = async () => {
@ -201,7 +184,6 @@ const generateCode = async () => {
/** 打开弹窗 */
const open = async (type: string, id?: number) => {
dialogVisible.value = true
dialogTitle.value = t('action.' + type)
formType.value = type
activeTab.value = 'bom'
resetForm()
@ -214,9 +196,6 @@ const open = async (type: string, id?: number) => {
formLoading.value = false
}
}
//
itemTypeList.value = await MdItemTypeApi.getItemTypeSimpleList()
itemTypeTree.value = handleTree(itemTypeList.value)
}
defineExpose({ open }) // open
@ -236,7 +215,6 @@ const submitForm = async () => {
await MdItemApi.updateItem(data)
message.success(t('common.updateSuccess'))
}
// TODO @AI
dialogVisible.value = false
//
emit('success')
@ -260,7 +238,8 @@ const resetForm = () => {
maxStock: 0,
highValue: false,
batchFlag: true,
remark: undefined
remark: undefined,
itemOrProduct: undefined
}
formRef.value?.resetFields()
}

View File

@ -89,8 +89,13 @@
<!-- 列表 -->
<ContentWrap>
<el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true">
<!-- TODO @AI增加点击进入详情formType = detail 这种 -->
<el-table-column label="物料编码" align="center" prop="code" />
<el-table-column label="物料编码" align="center" prop="code">
<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" />
<el-table-column label="规格型号" align="center" prop="specification" />
<el-table-column label="单位" align="center" prop="unitMeasureName" />
@ -105,10 +110,15 @@
<dict-tag :type="DICT_TYPE.INFRA_BOOLEAN_STRING" :value="scope.row.safeStockFlag" />
</template>
</el-table-column>
<!-- TODO @AIstatus 改成 switch 单独一个开关 -->
<el-table-column label="状态" align="center" prop="status">
<el-table-column label="状态" align="center" prop="status" width="80">
<template #default="scope">
<dict-tag :type="DICT_TYPE.COMMON_STATUS" :value="scope.row.status" />
<el-switch
v-model="scope.row.status"
:active-value="0"
:inactive-value="1"
@change="handleStatusChange(scope.row)"
:disabled="!checkPermi(['mes:md-item:update'])"
/>
</template>
</el-table-column>
<el-table-column
@ -169,8 +179,10 @@
<script setup lang="ts">
import { getIntDictOptions, DICT_TYPE } from '@/utils/dict'
import { checkPermi } from '@/utils/permission'
import { dateFormatter } from '@/utils/formatTime'
import download from '@/utils/download'
import { CommonStatusEnum } from '@/utils/constants'
import { MdItemApi, MdItemVO } from '@/api/mes/md/item'
import MdItemForm from './MdItemForm.vue'
import MdItemImportForm from './MdItemImportForm.vue'
@ -234,6 +246,23 @@ const openForm = (type: string, id?: number) => {
formRef.value.open(type, id)
}
/** 切换物料状态 */
const handleStatusChange = async (row: MdItemVO) => {
try {
//
const text = row.status === CommonStatusEnum.ENABLE ? '启用' : '停用'
await message.confirm('确认要"' + text + '""' + row.name + '"物料吗?')
//
await MdItemApi.updateItemStatus(row.id, row.status)
//
await getList()
} catch {
//
row.status =
row.status === CommonStatusEnum.ENABLE ? CommonStatusEnum.DISABLE : CommonStatusEnum.ENABLE
}
}
/** 删除按钮操作 */
const handleDelete = async (id: number) => {
try {

View File

@ -0,0 +1,57 @@
<!-- MES 物料分类选择器树形下拉只允许选择叶节点 -->
<template>
<el-tree-select
v-model="selectValue"
:data="treeData"
:props="defaultProps"
:placeholder="placeholder"
:disabled="disabled"
check-strictly
default-expand-all
filterable
class="!w-1/1"
@change="handleChange"
/>
</template>
<script setup lang="ts">
import { MdItemTypeApi, MdItemTypeVO } from '@/api/mes/md/item/type'
import { defaultProps, handleTree } from '@/utils/tree'
defineOptions({ name: 'MdItemTypeSelect' })
const props = withDefaults(
defineProps<{
modelValue?: number
disabled?: boolean
placeholder?: string
}>(),
{
disabled: false,
placeholder: '请选择物料分类'
}
)
const emit = defineEmits<{
'update:modelValue': [value: number | undefined]
change: [item: MdItemTypeVO | undefined]
}>()
const allList = ref<MdItemTypeVO[]>([])
const treeData = ref<any[]>([])
const selectValue = computed({
get: () => props.modelValue,
set: (val) => emit('update:modelValue', val)
})
const handleChange = (val: number | undefined) => {
const item = allList.value.find((o) => o.id === val)
emit('change', item)
}
onMounted(async () => {
allList.value = await MdItemTypeApi.getItemTypeSimpleList()
treeData.value = handleTree(allList.value)
})
</script>