✨ feat(mes): 新增来源单据编号和来源单据类型字段
在表单中添加来源单据编号和来源单据类型字段,以支持更详细的出库单信息。同时,更新了相关的状态和类型字段,优化了表单的交互体验。pull/871/MERGE
parent
45cc9ad129
commit
e954777753
|
|
@ -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 外协出库单状态
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
/** 获取物料/产品标识的标签 */
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -48,6 +48,7 @@
|
|||
v-loading="formLoading"
|
||||
>
|
||||
<el-row>
|
||||
<!-- TODO @AI:WmMaterialStockSelect,/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">
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
Loading…
Reference in New Issue