feat(mes): 新增来源单据编号和来源单据类型字段

在表单中添加来源单据编号和来源单据类型字段,以支持更详细的出库单信息。同时,更新了相关的状态和类型字段,优化了表单的交互体验。
pull/871/MERGE
YunaiV 2026-03-30 22:50:40 +08:00
parent 45cc9ad129
commit e954777753
5 changed files with 126 additions and 59 deletions

View File

@ -312,7 +312,8 @@ export enum DICT_TYPE {
MES_WM_RETURN_SALES_STATUS = 'mes_wm_return_sales_status', // MES 销售退货单状态
MES_WM_PRODUCT_SALES_STATUS = 'mes_wm_product_sales_status', // MES 销售出库单状态
MES_SALES_NOTICE_STATUS = 'mes_sales_notice_status', // MES 发货通知单状态
MES_WM_MISC_ISSUE_TYPE = 'mes_wm_misc_issue_type', // MES 杂项单类型
MES_WM_MISC_ISSUE_TYPE = 'mes_wm_misc_issue_type', // MES 杂项出库类型
MES_WM_MISC_ISSUE_STATUS = 'mes_wm_misc_issue_status', // MES 杂项出库单状态
MES_WM_MISC_RECEIPT_TYPE = 'mes_wm_misc_receipt_type', // MES 杂项单类型
MES_WM_OUTSOURCE_RECEIPT_STATUS = 'mes_wm_outsource_receipt_status', // MES 外协入库单状态
MES_WM_OUTSOURCE_ISSUE_STATUS = 'mes_wm_outsource_issue_status', // MES 外协出库单状态

View File

@ -438,7 +438,8 @@ export const MesAutoCodeRuleCode = {
WM_WAREHOUSE_CODE: 'WM_WAREHOUSE_CODE', // 仓库编码
WM_LOCATION_CODE: 'WM_LOCATION_CODE', // 库区编码
WM_AREA_CODE: 'WM_AREA_CODE', // 库位编码
WM_PRODUCT_SALES_CODE: 'WM_PRODUCT_SALES_CODE' // 销售出库单编码
WM_PRODUCT_SALES_CODE: 'WM_PRODUCT_SALES_CODE', // 销售出库单编码
WM_MISC_ISSUE_CODE: 'WM_MISC_ISSUE_CODE' // 杂项出库单编码
} as const
/** 获取物料/产品标识的标签 */

View File

@ -6,6 +6,7 @@
:rules="formRules"
label-width="110px"
v-loading="formLoading"
:disabled="isDetail"
>
<el-row>
<el-col :span="8">
@ -16,7 +17,7 @@
:disabled="isHeaderReadonly"
>
<template #append>
<el-button @click="generateCode"> </el-button>
<el-button @click="generateCode" :disabled="isHeaderReadonly"> 生成 </el-button>
</template>
</el-input>
</el-form-item>
@ -99,32 +100,63 @@
<MiscIssueLineList :issue-id="formData.id" :form-type="formType" />
</template>
<template #footer>
<el-button v-if="isUpdate" @click="submitForm" type="primary" :disabled="formLoading">
<el-button v-if="isEditable" @click="submitForm" type="primary" :disabled="formLoading">
</el-button>
<el-button @click="dialogVisible = false"> </el-button>
<el-button
v-if="
(isEditable && formData.id && formData.status === MesWmMiscIssueStatusEnum.PREPARE) ||
isSubmit
"
@click="handleSubmit"
type="warning"
:disabled="formLoading"
>
</el-button>
<el-button v-if="isFinish" @click="handleFinish" type="success" :disabled="formLoading">
执行出库
</el-button>
<el-button @click="dialogVisible = false"> </el-button>
</template>
</Dialog>
</template>
<script setup lang="ts">
import { generateRandomStr } from '@/utils'
import { DICT_TYPE, getStrDictOptions } from '@/utils/dict'
import { WmMiscIssueApi, WmMiscIssueVO } from '@/api/mes/wm/miscissue'
import { AutoCodeRecordApi } from '@/api/mes/md/autocode/record'
import MiscIssueLineList from './MiscIssueLineList.vue'
import { MesAutoCodeRuleCode, MesWmMiscIssueStatusEnum } from '@/views/mes/utils/constants'
defineOptions({ name: 'MiscIssueForm' })
const emit = defineEmits(['success'])
const message = useMessage() //
const dialogVisible = ref(false) //
const formLoading = ref(false) //
const formType = ref<string>('create') // 表单的类型create / update / detail
const formType = ref<string>('create') // 表单的类型create / update / submit / finish / detail
const isEditable = computed(() => ['create', 'update'].includes(formType.value)) //
const isSubmit = computed(() => formType.value === 'submit') //
const isFinish = computed(() => formType.value === 'finish') //
const isDetail = computed(() => ['detail', 'submit', 'finish'].includes(formType.value)) //
const isHeaderReadonly = computed(() => ['submit', 'detail', 'finish'].includes(formType.value)) //
const dialogTitle = computed(() => {
const titles = {
create: '新增杂项出库单',
update: '编辑杂项出库单',
submit: '提交杂项出库单',
finish: '执行出库',
detail: '杂项出库单详情'
}
return titles[formType.value] || formType.value
})
const formData = ref({
id: undefined as number | undefined,
code: undefined,
name: undefined,
type: undefined,
status: undefined as number | undefined,
issueDate: undefined,
sourceDocCode: undefined,
sourceDocType: undefined,
@ -137,22 +169,13 @@ const formRules = reactive({
issueDate: [{ required: true, message: '出库日期不能为空', trigger: 'blur' }]
})
const formRef = ref() // Ref
const isUpdate = computed(() => ['create', 'update'].includes(formType.value)) //
const isHeaderReadonly = computed(() => formType.value === 'detail') //
const dialogTitle = computed(() => {
const titles = {
create: '新增杂项出库单',
update: '编辑杂项出库单',
detail: '杂项出库单详情'
}
return titles[formType.value] || formType.value
})
const originalFormData = ref<string>('') //
/** 生成出库单编号 */
// TODO @AI
const generateCode = () => {
formData.value.code = 'MI' + generateRandomStr(10)
const generateCode = async () => {
formData.value.code = await AutoCodeRecordApi.generateAutoCode(
MesAutoCodeRuleCode.WM_MISC_ISSUE_CODE
)
}
/** 打开弹窗 */
@ -160,7 +183,7 @@ const open = async (type: string, id?: number) => {
dialogVisible.value = true
formType.value = type
resetForm()
// /
// ///
if (id) {
formLoading.value = true
try {
@ -169,15 +192,13 @@ const open = async (type: string, id?: number) => {
formLoading.value = false
}
}
//
originalFormData.value = JSON.stringify(formData.value)
}
defineExpose({ open })
/** 提交表单create/update 模式) */
const emit = defineEmits(['success'])
/** 保存表单create/update 模式) */
const submitForm = async () => {
//
await formRef.value.validate()
//
formLoading.value = true
try {
const data = formData.value as unknown as WmMiscIssueVO
@ -185,18 +206,58 @@ const submitForm = async () => {
const res = await WmMiscIssueApi.createMiscIssue(data)
message.success('新增成功')
formData.value.id = res
formData.value.status = MesWmMiscIssueStatusEnum.PREPARE
formType.value = 'update'
} else {
await WmMiscIssueApi.updateMiscIssue(data)
message.success('修改成功')
}
//
//
originalFormData.value = JSON.stringify(formData.value)
emit('success')
} finally {
formLoading.value = false
}
}
/** 提交操作:编辑模式下表单修改过则先保存,再提交 */
const handleSubmit = async () => {
if (isEditable.value) {
await formRef.value.validate()
}
try {
await message.confirm('确认提交该杂项出库单?【提交后将不能修改】')
formLoading.value = true
//
if (isEditable.value && JSON.stringify(formData.value) !== originalFormData.value) {
const data = formData.value as unknown as WmMiscIssueVO
await WmMiscIssueApi.updateMiscIssue(data)
}
await WmMiscIssueApi.submitMiscIssue(formData.value.id!)
message.success('提交成功')
dialogVisible.value = false
emit('success')
} catch {
} finally {
formLoading.value = false
}
}
/** 执行出库 */
const handleFinish = async () => {
try {
await message.confirm('确认执行出库?执行后将更新库存台账。')
formLoading.value = true
await WmMiscIssueApi.finishMiscIssue(formData.value.id!)
message.success('出库成功')
dialogVisible.value = false
emit('success')
} catch {
} finally {
formLoading.value = false
}
}
/** 重置表单 */
const resetForm = () => {
formData.value = {
@ -204,6 +265,7 @@ const resetForm = () => {
code: undefined,
name: undefined,
type: undefined,
status: undefined,
issueDate: undefined,
sourceDocCode: undefined,
sourceDocType: undefined,
@ -211,4 +273,6 @@ const resetForm = () => {
}
formRef.value?.resetFields()
}
defineExpose({ open })
</script>

View File

@ -48,6 +48,7 @@
v-loading="formLoading"
>
<el-row>
<!-- TODO @AIWmMaterialStockSelect/Users/yunai/Java/yudao-all-in-one/yudao-ui-admin-vue3/src/views/mes/wm/productsales -->
<!-- TODO @AI库存物资选择选择后物料批次号仓库位置就自动选上他们都是 disabled disabled -->
<el-col :span="8">
<el-form-item label="物料" prop="itemId">

View File

@ -40,7 +40,24 @@
/>
</el-select>
</el-form-item>
<!-- TODO @AI来源单据编号来源单据类型手填 -->
<el-form-item label="来源单据编号" prop="sourceDocCode">
<el-input
v-model="queryParams.sourceDocCode"
placeholder="请输入来源单据编号"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="来源单据类型" prop="sourceDocType">
<el-input
v-model="queryParams.sourceDocType"
placeholder="请输入来源单据类型"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="出库日期" prop="issueDate">
<el-date-picker
v-model="queryParams.issueDate"
@ -95,9 +112,9 @@
<el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true">
<el-table-column label="出库单编号" align="center" prop="code" min-width="160">
<template #default="scope">
<el-link type="primary" @click="openForm('detail', scope.row.id)">
<el-button link type="primary" @click="openForm('detail', scope.row.id)">
{{ scope.row.code }}
</el-link>
</el-button>
</template>
</el-table-column>
<el-table-column label="出库单名称" align="center" prop="name" min-width="150" />
@ -106,7 +123,8 @@
<dict-tag :type="DICT_TYPE.MES_WM_MISC_ISSUE_TYPE" :value="scope.row.type" />
</template>
</el-table-column>
<!-- TODO @AI来源单据编号来源单据类型手填-->
<el-table-column label="来源单据编号" align="center" prop="sourceDocCode" min-width="150" />
<el-table-column label="来源单据类型" align="center" prop="sourceDocType" min-width="120" />
<el-table-column
label="出库日期"
align="center"
@ -116,7 +134,6 @@
/>
<el-table-column label="单据状态" align="center" prop="status" min-width="100">
<template #default="scope">
<!-- TODO @AI数据库里缺少状态这里也缺少变量 -->
<dict-tag :type="DICT_TYPE.MES_WM_MISC_ISSUE_STATUS" :value="scope.row.status" />
</template>
</el-table-column>
@ -132,10 +149,11 @@
>
编辑
</el-button>
<!-- TODO @AI提交合并到编辑因为打开后就能看到提交 -->
<el-button
link
type="warning"
@click="handleSubmit(scope.row.id)"
@click="openForm('submit', scope.row.id)"
v-hasPermi="['mes:wm-misc-issue:update']"
v-if="scope.row.status === MesWmMiscIssueStatusEnum.PREPARE"
>
@ -154,7 +172,7 @@
<el-button
link
type="success"
@click="handleFinish(scope.row.id)"
@click="openForm('finish', scope.row.id)"
v-hasPermi="['mes:wm-misc-issue:finish']"
v-if="scope.row.status === MesWmMiscIssueStatusEnum.APPROVED"
>
@ -206,10 +224,13 @@ const queryParams = reactive({
code: undefined,
name: undefined,
type: undefined,
sourceDocCode: undefined,
sourceDocType: undefined,
issueDate: undefined,
status: undefined
})
const queryFormRef = ref() //
const formRef = ref() //
/** 查询列表 */
const getList = async () => {
@ -235,32 +256,11 @@ const resetQuery = () => {
handleQuery()
}
/** 新增/修改/详情 */
const formRef = ref() //
/** 添加/修改/详情/提交/执行出库 */
const openForm = (type: string, id?: number) => {
formRef.value.open(type, id)
}
/** 提交 */
const handleSubmit = async (id: number) => {
try {
await message.confirm('确认提交该杂项出库单?')
await WmMiscIssueApi.submitMiscIssue(id)
message.success('提交成功')
await getList()
} catch {}
}
/** 执行出库 */
const handleFinish = async (id: number) => {
try {
await message.confirm('确认执行出库?执行后将更新库存台账。')
await WmMiscIssueApi.finishMiscIssue(id)
message.success('出库成功')
await getList()
} catch {}
}
/** 取消按钮操作 */
const handleCancel = async (id: number) => {
try {