🎉 Initial commit

This commit is contained in:
2026-07-27 14:26:14 +08:00
commit fd54f07889
6935 changed files with 617410 additions and 0 deletions

View File

@@ -0,0 +1,4 @@
基于 Vue3 + element-plus 实现的管理后台。仓库地址:
* Gitee<https://gitee.com/yudaocode/yudao-ui-admin-vue3>
* GitHub<https://github.com/yudaocode/yudao-ui-admin-vue3>

View File

@@ -0,0 +1,51 @@
import request from '@/config/axios'
// MES 产品收货单明细 VO
export interface WmProductRecptDetailVO {
id: number
lineId: number
recptId: number
itemId: number
itemCode: string
itemName: string
specification: string
unitMeasureName: string
quantity: number
batchId: number
warehouseId: number
warehouseName: string
locationId: number
locationName: string
areaId: number
areaName: string
remark: string
createTime: string
}
// MES 产品收货单明细 API
export const WmProductRecptDetailApi = {
// 查询产品收货单明细详情
getProductRecptDetail: async (id: number) => {
return await request.get({ url: '/mes/wm/product-recpt-detail/get?id=' + id })
},
// 查询产品收货单明细列表(按行编号)
getProductRecptDetailListByLineId: async (lineId: number) => {
return await request.get({ url: '/mes/wm/product-recpt-detail/list-by-line?lineId=' + lineId })
},
// 新增产品收货单明细
createProductRecptDetail: async (data: WmProductRecptDetailVO) => {
return await request.post({ url: '/mes/wm/product-recpt-detail/create', data })
},
// 修改产品收货单明细
updateProductRecptDetail: async (data: WmProductRecptDetailVO) => {
return await request.put({ url: '/mes/wm/product-recpt-detail/update', data })
},
// 删除产品收货单明细
deleteProductRecptDetail: async (id: number) => {
return await request.delete({ url: '/mes/wm/product-recpt-detail/delete?id=' + id })
}
}

View File

@@ -0,0 +1,72 @@
import request from '@/config/axios'
// MES 产品收货单 VO
export interface WmProductRecptVO {
id: number
code: string
name: string
workOrderId: number
workOrderCode: string
itemId: number
itemCode: string
itemName: string
specification: string
unitMeasureName: string
receiptDate: string
status: number
remark: string
createTime: string
}
// MES 产品收货单 API
export const WmProductRecptApi = {
// 查询产品收货单分页
getProductRecptPage: async (params: any) => {
return await request.get({ url: '/mes/wm/product-recpt/page', params })
},
// 查询产品收货单详情
getProductRecpt: async (id: number) => {
return await request.get({ url: '/mes/wm/product-recpt/get?id=' + id })
},
// 新增产品收货单
createProductRecpt: async (data: WmProductRecptVO) => {
return await request.post({ url: '/mes/wm/product-recpt/create', data })
},
// 修改产品收货单
updateProductRecpt: async (data: WmProductRecptVO) => {
return await request.put({ url: '/mes/wm/product-recpt/update', data })
},
// 删除产品收货单
deleteProductRecpt: async (id: number) => {
return await request.delete({ url: '/mes/wm/product-recpt/delete?id=' + id })
},
// 提交产品收货单
submitProductRecpt: async (id: number) => {
return await request.put({ url: '/mes/wm/product-recpt/submit?id=' + id })
},
// 执行上架
stockProductRecpt: async (id: number) => {
return await request.put({ url: '/mes/wm/product-recpt/stock?id=' + id })
},
// 执行入库
executeProductRecpt: async (id: number) => {
return await request.put({ url: '/mes/wm/product-recpt/execute?id=' + id })
},
// 取消产品收货单
cancelProductRecpt: async (id: number) => {
return await request.put({ url: '/mes/wm/product-recpt/cancel?id=' + id })
},
// 导出产品收货单 Excel
exportProductRecpt: async (params: any) => {
return await request.download({ url: '/mes/wm/product-recpt/export-excel', params })
}
}

View File

@@ -0,0 +1,45 @@
import request from '@/config/axios'
// MES 产品收货单行 VO
export interface WmProductRecptLineVO {
id: number
recptId: number
itemId: number
itemCode: string
itemName: string
specification: string
unitMeasureName: string
receivedQuantity: number
batchId: number
batchCode: string
remark: string
createTime: string
}
// MES 产品收货单行 API
export const WmProductRecptLineApi = {
// 查询产品收货单行分页
getProductRecptLinePage: async (params: any) => {
return await request.get({ url: '/mes/wm/product-recpt-line/page', params })
},
// 查询产品收货单行详情
getProductRecptLine: async (id: number) => {
return await request.get({ url: '/mes/wm/product-recpt-line/get?id=' + id })
},
// 新增产品收货单行
createProductRecptLine: async (data: WmProductRecptLineVO) => {
return await request.post({ url: '/mes/wm/product-recpt-line/create', data })
},
// 修改产品收货单行
updateProductRecptLine: async (data: WmProductRecptLineVO) => {
return await request.put({ url: '/mes/wm/product-recpt-line/update', data })
},
// 删除产品收货单行
deleteProductRecptLine: async (id: number) => {
return await request.delete({ url: '/mes/wm/product-recpt-line/delete?id=' + id })
}
}

View File

@@ -0,0 +1,45 @@
import request from '@/config/axios'
// MES SN 码 VO
export interface WmSnVO {
id: number
snCode: string
itemId: number
itemCode: string
itemName: string
specification: string
batchCode: string
workOrderId: number
createTime: string
}
// MES SN 码生成 VO
export interface WmSnGenerateVO {
itemId: number
batchCode?: string
workOrderId?: number
snNum: number
}
// MES SN 码 API
export const WmSnApi = {
// 生成 SN 码
generateSnCodes: async (data: WmSnGenerateVO) => {
return await request.post({ url: '/mes/wm/sn/generate', data })
},
// 查询 SN 码分页
getSnPage: async (params: any) => {
return await request.get({ url: '/mes/wm/sn/page', params })
},
// 批量删除 SN 码
deleteSnBatch: async (ids: string) => {
return await request.delete({ url: '/mes/wm/sn/delete-batch', params: { ids } })
},
// 导出 SN 码 Excel
exportSnExcel: async (params: any) => {
return await request.download({ url: '/mes/wm/sn/export-excel', params })
}
}

View File

@@ -0,0 +1,248 @@
<template>
<ContentWrap>
<!-- 搜索工作栏 -->
<el-form
class="-mb-15px"
:model="queryParams"
ref="queryFormRef"
:inline="true"
label-width="68px"
>
<el-form-item label="SN 码" prop="snCode">
<el-input
v-model="queryParams.snCode"
placeholder="请输入 SN 码"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="物料ID" prop="itemId">
<el-input
v-model="queryParams.itemId"
placeholder="请输入物料ID"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="批次号" prop="batchCode">
<el-input
v-model="queryParams.batchCode"
placeholder="请输入批次号"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="创建时间" prop="createTime">
<el-date-picker
v-model="queryParams.createTime"
value-format="YYYY-MM-DD HH:mm:ss"
type="daterange"
start-placeholder="开始日期"
end-placeholder="结束日期"
:default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"
class="!w-240px"
/>
</el-form-item>
<el-form-item>
<el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> 搜索</el-button>
<el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> 重置</el-button>
<el-button
type="primary"
plain
@click="openForm()"
v-hasPermi="['mes:wm-sn:create']"
>
<Icon icon="ep:plus" class="mr-5px" /> 生成 SN
</el-button>
<el-button
type="success"
plain
@click="handleExport"
:loading="exportLoading"
v-hasPermi="['mes:wm-sn:export']"
>
<Icon icon="ep:download" class="mr-5px" /> 导出
</el-button>
</el-form-item>
</el-form>
</ContentWrap>
<!-- 列表 -->
<ContentWrap>
<el-table v-loading="loading" :data="list" stripe>
<el-table-column label="SN 码" align="center" prop="snCode" min-width="180" />
<el-table-column label="物料编码" align="center" prop="itemCode" min-width="120" />
<el-table-column label="物料名称" align="center" prop="itemName" min-width="150" />
<el-table-column label="规格型号" align="center" prop="specification" min-width="120" />
<el-table-column label="批次号" align="center" prop="batchCode" min-width="120" />
<el-table-column
label="生成时间"
align="center"
prop="createTime"
:formatter="dateFormatter"
width="180px"
/>
<el-table-column label="操作" align="center" width="120" fixed="right">
<template #default="scope">
<el-button
link
type="danger"
@click="handleDelete(scope.row.id)"
v-hasPermi="['mes:wm-sn:delete']"
>
删除
</el-button>
</template>
</el-table-column>
</el-table>
<!-- 分页 -->
<Pagination
:total="total"
v-model:page="queryParams.pageNo"
v-model:limit="queryParams.pageSize"
@pagination="getList"
/>
</ContentWrap>
<!-- 生成对话框 -->
<el-dialog :title="'生成 SN 码'" v-model="dialogVisible" width="600px">
<el-form ref="formRef" :model="formData" :rules="formRules" label-width="100px">
<el-form-item label="物料ID" prop="itemId">
<el-input-number v-model="formData.itemId" :min="1" controls-position="right" class="!w-full" />
</el-form-item>
<el-form-item label="批次号" prop="batchCode">
<el-input v-model="formData.batchCode" placeholder="请输入批次号" maxlength="100" />
</el-form-item>
<el-form-item label="生成数量" prop="snNum">
<el-input-number v-model="formData.snNum" :min="1" :max="1000" />
</el-form-item>
</el-form>
<template #footer>
<el-button @click="dialogVisible = false">取消</el-button>
<el-button type="primary" @click="submitForm" :loading="formLoading">确定</el-button>
</template>
</el-dialog>
</template>
<script setup lang="ts">
import { dateFormatter } from '@/utils/formatTime'
import { WmSnApi, WmSnVO, WmSnGenerateVO } from '@/api/mes/wm/sn'
defineOptions({ name: 'MesWmSn' })
const message = useMessage()
const { t } = useI18n()
const loading = ref(true)
const list = ref<WmSnVO[]>([])
const total = ref(0)
const queryParams = reactive({
pageNo: 1,
pageSize: 10,
snCode: undefined,
itemId: undefined,
batchCode: undefined,
createTime: []
})
const queryFormRef = ref()
const exportLoading = ref(false)
/** 查询列表 */
const getList = async () => {
loading.value = true
try {
const data = await WmSnApi.getSnPage(queryParams)
list.value = data.list
total.value = data.total
} finally {
loading.value = false
}
}
/** 搜索按钮操作 */
const handleQuery = () => {
queryParams.pageNo = 1
getList()
}
/** 重置按钮操作 */
const resetQuery = () => {
queryFormRef.value.resetFields()
handleQuery()
}
/** 生成对话框 */
const dialogVisible = ref(false)
const formLoading = ref(false)
const formData = ref<WmSnGenerateVO>({
itemId: undefined,
batchCode: undefined,
workOrderId: undefined,
snNum: 100
})
const formRules = reactive({
itemId: [{ required: true, message: '物料不能为空', trigger: 'change' }],
snNum: [{ required: true, message: '生成数量不能为空', trigger: 'blur' }]
})
const formRef = ref()
/** 打开生成对话框 */
const openForm = () => {
dialogVisible.value = true
resetForm()
}
/** 重置表单 */
const resetForm = () => {
formData.value = {
itemId: undefined,
batchCode: undefined,
workOrderId: undefined,
snNum: 100
}
formRef.value?.resetFields()
}
/** 提交表单 */
const submitForm = async () => {
await formRef.value.validate()
formLoading.value = true
try {
await WmSnApi.generateSnCodes(formData.value)
message.success('生成成功')
dialogVisible.value = false
await getList()
} finally {
formLoading.value = false
}
}
/** 删除按钮操作 */
const handleDelete = async (id: number) => {
try {
await message.delConfirm()
await WmSnApi.deleteSnBatch(String(id))
message.success('删除成功')
await getList()
} catch {}
}
/** 导出按钮操作 */
const handleExport = async () => {
try {
await message.exportConfirm()
exportLoading.value = true
await WmSnApi.exportSnExcel(queryParams)
} catch {
} finally {
exportLoading.value = false
}
}
onMounted(() => {
getList()
})
</script>