add iot and stock workshop

main
chenshuichuan 2 years ago
parent bd7c44ffbf
commit 15512e8203

@ -0,0 +1,50 @@
import request from '@/config/axios'
// 代理服务 VO
export interface FrpcProxyServerVO {
id: number // id
frpcName: string // 代理名称
localIp: string // 内网IP
localPort: number // 内网端口
suffixPath: string // 访问后缀
localStatus: string // 内网状态
frpsId: number // 代理服务器
proxyPort: number // 代理端口
proxyAddress: string // 代理地址
proxyStatus: string // 代理状态
remark: string // 备注
isEnable: boolean // 是否启用
}
// 代理服务 API
export const FrpcProxyServerApi = {
// 查询代理服务分页
getFrpcProxyServerPage: async (params: any) => {
return await request.get({ url: `/iot/frpc-proxy-server/page`, params })
},
// 查询代理服务详情
getFrpcProxyServer: async (id: number) => {
return await request.get({ url: `/iot/frpc-proxy-server/get?id=` + id })
},
// 新增代理服务
createFrpcProxyServer: async (data: FrpcProxyServerVO) => {
return await request.post({ url: `/iot/frpc-proxy-server/create`, data })
},
// 修改代理服务
updateFrpcProxyServer: async (data: FrpcProxyServerVO) => {
return await request.put({ url: `/iot/frpc-proxy-server/update`, data })
},
// 删除代理服务
deleteFrpcProxyServer: async (id: number) => {
return await request.delete({ url: `/iot/frpc-proxy-server/delete?id=` + id })
},
// 导出代理服务 Excel
exportFrpcProxyServer: async (params) => {
return await request.download({ url: `/iot/frpc-proxy-server/export-excel`, params })
},
}

@ -0,0 +1,50 @@
import request from '@/config/axios'
// 投料记录 VO
export interface FeedingRecordVO {
id: number // id
feedingRecordCode: string // 单号
productId: number // 产品id
planId: number // 计划id
itemId: number // 原料id
feedingPipeline: string // 制浆线
feedingType: string // 投料类型
weight: number // 重量
feedingTime: Date // 投料时间
userId: number // 记录人
remark: string // 备注
recordStatus: string // 状态
}
// 投料记录 API
export const FeedingRecordApi = {
// 查询投料记录分页
getFeedingRecordPage: async (params: any) => {
return await request.get({ url: `/mes/feeding-record/page`, params })
},
// 查询投料记录详情
getFeedingRecord: async (id: number) => {
return await request.get({ url: `/mes/feeding-record/get?id=` + id })
},
// 新增投料记录
createFeedingRecord: async (data: FeedingRecordVO) => {
return await request.post({ url: `/mes/feeding-record/create`, data })
},
// 修改投料记录
updateFeedingRecord: async (data: FeedingRecordVO) => {
return await request.put({ url: `/mes/feeding-record/update`, data })
},
// 删除投料记录
deleteFeedingRecord: async (id: number) => {
return await request.delete({ url: `/mes/feeding-record/delete?id=` + id })
},
// 导出投料记录 Excel
exportFeedingRecord: async (params) => {
return await request.download({ url: `/mes/feeding-record/export-excel`, params })
},
}

@ -0,0 +1,89 @@
import request from '@/config/axios'
// 车间仓库存 VO
export interface StockWorkshopVO {
id: number // id
itemId: number // 原料编号
count: number // 库存数量
categoryId: number // 分类
}
// 车间仓库存 API
export const StockWorkshopApi = {
// 查询车间仓库存分页
getStockWorkshopPage: async (params: any) => {
return await request.get({ url: `/mes/stock-workshop/page`, params })
},
// 查询车间仓库存详情
getStockWorkshop: async (id: number) => {
return await request.get({ url: `/mes/stock-workshop/get?id=` + id })
},
// 新增车间仓库存
createStockWorkshop: async (data: StockWorkshopVO) => {
return await request.post({ url: `/mes/stock-workshop/create`, data })
},
// 修改车间仓库存
updateStockWorkshop: async (data: StockWorkshopVO) => {
return await request.put({ url: `/mes/stock-workshop/update`, data })
},
// 删除车间仓库存
deleteStockWorkshop: async (id: number) => {
return await request.delete({ url: `/mes/stock-workshop/delete?id=` + id })
},
// 导出车间仓库存 Excel
exportStockWorkshop: async (params) => {
return await request.download({ url: `/mes/stock-workshop/export-excel`, params })
},
}
// 车间仓明细 VO
export interface StockWorkshopDetailVO {
id: number // id
itemId: number // 原料id
count: number // 数量
detailType: string // 明细类别
itemRequisitionCode: string // 领料单
itemRequisitionDetailId: number // 领料明细id
feedingRecordCode: string // 投料单
feedingRecordId: number // 投料id
userId: number // 操作人员
operateTime: Date // 单据时间
}
// 车间仓明细 API
export const StockWorkshopDetailApi = {
// 查询车间仓明细分页
getStockWorkshopDetailPage: async (params: any) => {
return await request.get({ url: `/mes/stock-workshop-detail/page`, params })
},
// 查询车间仓明细详情
getStockWorkshopDetail: async (id: number) => {
return await request.get({ url: `/mes/stock-workshop-detail/get?id=` + id })
},
// 新增车间仓明细
createStockWorkshopDetail: async (data: StockWorkshopDetailVO) => {
return await request.post({ url: `/mes/stock-workshop-detail/create`, data })
},
// 修改车间仓明细
updateStockWorkshopDetail: async (data: StockWorkshopDetailVO) => {
return await request.put({ url: `/mes/stock-workshop-detail/update`, data })
},
// 删除车间仓明细
deleteStockWorkshopDetail: async (id: number) => {
return await request.delete({ url: `/mes/stock-workshop-detail/delete?id=` + id })
},
// 导出车间仓明细 Excel
exportStockWorkshopDetail: async (params) => {
return await request.download({ url: `/mes/stock-workshop-detail/export-excel`, params })
},
}

@ -241,6 +241,11 @@ export enum DICT_TYPE {
MES_DATA_TYPE = "mes_data_type",
MES_MACHINE_STATUS = "mes_machine_status",
MES_MACHINE_TYPE = "mes_machine_type",
MES_FEEDING_TYPE = "mes_feeding_type",
MES_FEEDING_RECORD_STATUS = "mes_feeding_record_status",
MES_FEEDING_PIPELINE = "mes_feeding_pipeline",
MES_STOCK_WORKSHOP_DETAIL_TYPE = "mes_stock_workshop_detail_type",
//====iot
IOT_SIEMENS_TYPE = "iot_siemens_type",
IOT_MODBUS_TYPE = "iot_modbus_type",
@ -256,4 +261,5 @@ export enum DICT_TYPE {
IOT_GATEWAY_STATUS = "iot_gateway_status",
IOT_DEVICE_DATA_TRANSFER_TYPE = "iot_device_data_transfer_type",
IOT_DEVICE_DATA_TYPE = "iot_device_data_type",
IOT_PROXY_SERVER_STATUS = "iot_proxy_server_status",
}

@ -261,25 +261,25 @@ let notice = reactive<Notice[]>([])
const getNotice = async () => {
const data = [
{
title: '系统支持 JDK 8/17/21Vue 2/3',
title: '厂区进行防火演练通知',
type: '通知',
keys: ['通知', '8', '17', '21', '2', '3'],
date: new Date()
},
{
title: '后端提供 Spring Boot 2.7/3.2 + Cloud 双架构',
title: '职位调整公告',
type: '公告',
keys: ['公告', 'Boot', 'Cloud'],
date: new Date()
},
{
title: '全部开源,个人与企业可 100% 直接使用,无需授权',
title: '端午放假通知',
type: '通知',
keys: ['通知', '无需授权'],
date: new Date()
},
{
title: '国内使用最广泛的快速开发平台,超 300+ 人贡献',
title: '失物招领公告',
type: '公告',
keys: ['公告', '最广泛'],
date: new Date()
@ -294,32 +294,32 @@ let shortcut = reactive<Shortcut[]>([])
const getShortcut = async () => {
const data = [
{
name: 'Github',
name: '生产任务',
icon: 'akar-icons:github-fill',
url: 'github.io'
},
{
name: 'Vue',
name: '用户管理',
icon: 'logos:vue',
url: 'vuejs.org'
},
{
name: 'Vite',
name: '采购订单',
icon: 'vscode-icons:file-type-vite',
url: 'https://vitejs.dev/'
},
{
name: 'Angular',
name: '报表看板',
icon: 'logos:angular-icon',
url: 'github.io'
},
{
name: 'React',
name: '物联数据',
icon: 'logos:react',
url: 'github.io'
},
{
name: 'Webpack',
name: '仓库管理',
icon: 'logos:webpack',
url: 'github.io'
}

@ -85,15 +85,15 @@
<!-- 列表 -->
<ContentWrap>
<el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true">
<el-table-column label="产品名称" align="center" prop="productName" />
<el-table-column label="产品单位" align="center" prop="unitName" />
<el-table-column label="产品分类" align="center" prop="categoryName" />
<el-table-column label="产品" align="center" prop="productName" />
<el-table-column label="分类" align="center" prop="categoryName" />
<el-table-column
label="库存量"
align="center"
prop="count"
:formatter="erpCountTableColumnFormatter"
/>
<el-table-column label="单位" align="center" prop="unitName" />
<el-table-column label="仓库" align="center" prop="warehouseName" />
</el-table>
<!-- 分页 -->

@ -0,0 +1,147 @@
<template>
<Dialog :title="dialogTitle" v-model="dialogVisible">
<el-form
ref="formRef"
:model="formData"
:rules="formRules"
label-width="100px"
v-loading="formLoading"
>
<el-form-item label="代理名称" prop="frpcName">
<el-input v-model="formData.frpcName" placeholder="请输入代理名称" />
</el-form-item>
<el-form-item label="内网IP" prop="localIp">
<el-input v-model="formData.localIp" placeholder="请输入内网IP" />
</el-form-item>
<el-form-item label="内网端口" prop="localPort">
<el-input v-model="formData.localPort" placeholder="请输入内网端口" />
</el-form-item>
<el-form-item label="访问后缀" prop="suffixPath">
<el-input v-model="formData.suffixPath" placeholder="请输入访问后缀" />
</el-form-item>
<el-form-item label="代理服务器" prop="frpsId">
<el-input v-model="formData.frpsId" placeholder="请输入代理服务器" />
</el-form-item>
<el-form-item label="代理端口" prop="proxyPort">
<el-input v-model="formData.proxyPort" placeholder="请输入代理端口" />
</el-form-item>
<el-form-item label="代理地址" prop="proxyAddress">
<el-input v-model="formData.proxyAddress" placeholder="请输入代理地址" />
</el-form-item>
<el-form-item label="备注" prop="remark">
<el-input v-model="formData.remark" placeholder="请输入备注" />
</el-form-item>
<el-form-item label="是否启用" prop="isEnable">
<el-radio-group v-model="formData.isEnable">
<el-radio
v-for="dict in getBoolDictOptions(DICT_TYPE.INFRA_BOOLEAN_STRING)"
:key="dict.value"
:label="dict.value"
>
{{ dict.label }}
</el-radio>
</el-radio-group>
</el-form-item>
</el-form>
<template #footer>
<el-button @click="submitForm" type="primary" :disabled="formLoading"> </el-button>
<el-button @click="dialogVisible = false"> </el-button>
</template>
</Dialog>
</template>
<script setup lang="ts">
import { getStrDictOptions, getBoolDictOptions, DICT_TYPE } from '@/utils/dict'
import { FrpcProxyServerApi, FrpcProxyServerVO } from '@/api/iot/frpc'
/** 代理服务 表单 */
defineOptions({ name: 'FrpcProxyServerForm' })
const { t } = useI18n() //
const message = useMessage() //
const dialogVisible = ref(false) //
const dialogTitle = ref('') //
const formLoading = ref(false) // 12
const formType = ref('') // create - update -
const formData = ref({
id: undefined,
frpcName: undefined,
localIp: undefined,
localPort: undefined,
suffixPath: undefined,
localStatus: undefined,
frpsId: undefined,
proxyPort: undefined,
proxyAddress: undefined,
proxyStatus: undefined,
remark: undefined,
isEnable: undefined,
})
const formRules = reactive({
isEnable: [{ required: true, message: '是否启用不能为空', trigger: 'blur' }],
})
const formRef = ref() // Ref
/** 打开弹窗 */
const open = async (type: string, id?: number) => {
dialogVisible.value = true
dialogTitle.value = t('action.' + type)
formType.value = type
resetForm()
//
if (id) {
formLoading.value = true
try {
formData.value = await FrpcProxyServerApi.getFrpcProxyServer(id)
} finally {
formLoading.value = false
}
}
}
defineExpose({ open }) // open
/** 提交表单 */
const emit = defineEmits(['success']) // success
const submitForm = async () => {
//
await formRef.value.validate()
//
formLoading.value = true
try {
const data = formData.value as unknown as FrpcProxyServerVO
if (formType.value === 'create') {
await FrpcProxyServerApi.createFrpcProxyServer(data)
message.success(t('common.createSuccess'))
} else {
await FrpcProxyServerApi.updateFrpcProxyServer(data)
message.success(t('common.updateSuccess'))
}
dialogVisible.value = false
//
emit('success')
} finally {
formLoading.value = false
}
}
/** 重置表单 */
const resetForm = () => {
formData.value = {
id: undefined,
frpcName: undefined,
localIp: undefined,
localPort: undefined,
suffixPath: undefined,
localStatus: undefined,
frpsId: undefined,
proxyPort: undefined,
proxyAddress: undefined,
proxyStatus: undefined,
remark: undefined,
isEnable: undefined,
}
formRef.value?.resetFields()
}
</script>

@ -0,0 +1,295 @@
<template>
<ContentWrap>
<!-- 搜索工作栏 -->
<el-form
class="-mb-15px"
:model="queryParams"
ref="queryFormRef"
:inline="true"
label-width="68px"
>
<el-form-item label="代理名称" prop="frpcName">
<el-input
v-model="queryParams.frpcName"
placeholder="请输入代理名称"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="内网IP" prop="localIp">
<el-input
v-model="queryParams.localIp"
placeholder="请输入内网IP"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="内网端口" prop="localPort">
<el-input
v-model="queryParams.localPort"
placeholder="请输入内网端口"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="代理服务器" prop="frpsId">
<el-input
v-model="queryParams.frpsId"
placeholder="请输入代理服务器"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="代理端口" prop="proxyPort">
<el-input
v-model="queryParams.proxyPort"
placeholder="请输入代理端口"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="代理地址" prop="proxyAddress">
<el-input
v-model="queryParams.proxyAddress"
placeholder="请输入代理地址"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="代理状态" prop="proxyStatus">
<el-select
v-model="queryParams.proxyStatus"
placeholder="请选择代理状态"
clearable
class="!w-240px"
>
<el-option
v-for="dict in getStrDictOptions(DICT_TYPE.IOT_PROXY_SERVER_STATUS)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="备注" prop="remark">
<el-input
v-model="queryParams.remark"
placeholder="请输入备注"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="是否启用" prop="isEnable">
<el-select
v-model="queryParams.isEnable"
placeholder="请选择是否启用"
clearable
class="!w-240px"
>
<el-option
v-for="dict in getBoolDictOptions(DICT_TYPE.INFRA_BOOLEAN_STRING)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</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('create')"
v-hasPermi="['iot:frpc-proxy-server:create']"
>
<Icon icon="ep:plus" class="mr-5px" /> 新增
</el-button>
<el-button
type="success"
plain
@click="handleExport"
:loading="exportLoading"
v-hasPermi="['iot:frpc-proxy-server: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="true" :show-overflow-tooltip="true">
<el-table-column label="id" align="center" prop="id" />
<el-table-column label="代理名称" align="center" prop="frpcName" />
<el-table-column label="内网IP" align="center" prop="localIp" />
<el-table-column label="内网端口" align="center" prop="localPort" />
<el-table-column label="访问后缀" align="center" prop="suffixPath" />
<el-table-column label="内网状态" align="center" prop="localStatus">
<template #default="scope">
<dict-tag :type="DICT_TYPE.IOT_PROXY_SERVER_STATUS" :value="scope.row.localStatus" />
</template>
</el-table-column>
<el-table-column label="代理服务器" align="center" prop="frpsId" />
<el-table-column label="代理端口" align="center" prop="proxyPort" />
<el-table-column label="代理地址" align="center" prop="proxyAddress" />
<el-table-column label="代理状态" align="center" prop="proxyStatus">
<template #default="scope">
<dict-tag :type="DICT_TYPE.IOT_PROXY_SERVER_STATUS" :value="scope.row.proxyStatus" />
</template>
</el-table-column>
<el-table-column label="备注" align="center" prop="remark" />
<el-table-column label="是否启用" align="center" prop="isEnable">
<template #default="scope">
<dict-tag :type="DICT_TYPE.INFRA_BOOLEAN_STRING" :value="scope.row.isEnable" />
</template>
</el-table-column>
<el-table-column
label="创建时间"
align="center"
prop="createTime"
:formatter="dateFormatter"
width="180px"
/>
<el-table-column label="操作" align="center">
<template #default="scope">
<el-button
link
type="primary"
@click="openForm('update', scope.row.id)"
v-hasPermi="['iot:frpc-proxy-server:update']"
>
编辑
</el-button>
<el-button
link
type="danger"
@click="handleDelete(scope.row.id)"
v-hasPermi="['iot:frpc-proxy-server: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>
<!-- 表单弹窗添加/修改 -->
<FrpcProxyServerForm ref="formRef" @success="getList" />
</template>
<script setup lang="ts">
import { getStrDictOptions, getBoolDictOptions, DICT_TYPE } from '@/utils/dict'
import { dateFormatter } from '@/utils/formatTime'
import download from '@/utils/download'
import { FrpcProxyServerApi, FrpcProxyServerVO } from '@/api/iot/frpc'
import FrpcProxyServerForm from './FrpcProxyServerForm.vue'
/** 代理服务 列表 */
defineOptions({ name: 'FrpcProxyServer' })
const message = useMessage() //
const { t } = useI18n() //
const loading = ref(true) //
const list = ref<FrpcProxyServerVO[]>([]) //
const total = ref(0) //
const queryParams = reactive({
pageNo: 1,
pageSize: 10,
frpcName: undefined,
localIp: undefined,
localPort: undefined,
suffixPath: undefined,
localStatus: undefined,
frpsId: undefined,
proxyPort: undefined,
proxyAddress: undefined,
proxyStatus: undefined,
remark: undefined,
isEnable: undefined,
createTime: [],
})
const queryFormRef = ref() //
const exportLoading = ref(false) //
/** 查询列表 */
const getList = async () => {
loading.value = true
try {
const data = await FrpcProxyServerApi.getFrpcProxyServerPage(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 formRef = ref()
const openForm = (type: string, id?: number) => {
formRef.value.open(type, id)
}
/** 删除按钮操作 */
const handleDelete = async (id: number) => {
try {
//
await message.delConfirm()
//
await FrpcProxyServerApi.deleteFrpcProxyServer(id)
message.success(t('common.delSuccess'))
//
await getList()
} catch {}
}
/** 导出按钮操作 */
const handleExport = async () => {
try {
//
await message.exportConfirm()
//
exportLoading.value = true
const data = await FrpcProxyServerApi.exportFrpcProxyServer(queryParams)
download.excel(data, '代理服务.xls')
} catch {
} finally {
exportLoading.value = false
}
}
/** 初始化 **/
onMounted(() => {
getList()
})
</script>

@ -0,0 +1,160 @@
<template>
<Dialog :title="dialogTitle" v-model="dialogVisible">
<el-form
ref="formRef"
:model="formData"
:rules="formRules"
label-width="100px"
v-loading="formLoading"
>
<el-form-item label="单号" prop="feedingRecordCode">
<el-input v-model="formData.feedingRecordCode" placeholder="请输入单号" />
</el-form-item>
<el-form-item label="产品id" prop="productId">
<el-input v-model="formData.productId" placeholder="请输入产品id" />
</el-form-item>
<el-form-item label="计划id" prop="planId">
<el-input v-model="formData.planId" placeholder="请输入计划id" />
</el-form-item>
<el-form-item label="原料id" prop="itemId">
<el-input v-model="formData.itemId" placeholder="请输入原料id" />
</el-form-item>
<el-form-item label="制浆线" prop="feedingPipeline">
<el-radio-group v-model="formData.feedingPipeline">
<el-radio
v-for="dict in getStrDictOptions(DICT_TYPE.MES_FEEDING_PIPELINE)"
:key="dict.value"
:label="dict.value"
>
{{ dict.label }}
</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="投料类型" prop="feedingType">
<el-radio-group v-model="formData.feedingType">
<el-radio
v-for="dict in getStrDictOptions(DICT_TYPE.MES_FEEDING_TYPE)"
:key="dict.value"
:label="dict.value"
>
{{ dict.label }}
</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="重量" prop="weight">
<el-input v-model="formData.weight" placeholder="请输入重量" />
</el-form-item>
<el-form-item label="投料时间" prop="feedingTime">
<el-date-picker
v-model="formData.feedingTime"
type="date"
value-format="x"
placeholder="选择投料时间"
/>
</el-form-item>
<el-form-item label="记录人" prop="userId">
<el-input v-model="formData.userId" placeholder="请输入记录人" />
</el-form-item>
<el-form-item label="备注" prop="remark">
<el-input v-model="formData.remark" placeholder="请输入备注" />
</el-form-item>
</el-form>
<template #footer>
<el-button @click="submitForm" type="primary" :disabled="formLoading"> </el-button>
<el-button @click="dialogVisible = false"> </el-button>
</template>
</Dialog>
</template>
<script setup lang="ts">
import { getStrDictOptions, DICT_TYPE } from '@/utils/dict'
import { FeedingRecordApi, FeedingRecordVO } from '@/api/mes/feedingrecord'
/** 投料记录 表单 */
defineOptions({ name: 'FeedingRecordForm' })
const { t } = useI18n() //
const message = useMessage() //
const dialogVisible = ref(false) //
const dialogTitle = ref('') //
const formLoading = ref(false) // 12
const formType = ref('') // create - update -
const formData = ref({
id: undefined,
feedingRecordCode: undefined,
productId: undefined,
planId: undefined,
itemId: undefined,
feedingPipeline: undefined,
feedingType: undefined,
weight: undefined,
feedingTime: undefined,
userId: undefined,
remark: undefined,
recordStatus: undefined,
})
const formRules = reactive({
})
const formRef = ref() // Ref
/** 打开弹窗 */
const open = async (type: string, id?: number) => {
dialogVisible.value = true
dialogTitle.value = t('action.' + type)
formType.value = type
resetForm()
//
if (id) {
formLoading.value = true
try {
formData.value = await FeedingRecordApi.getFeedingRecord(id)
} finally {
formLoading.value = false
}
}
}
defineExpose({ open }) // open
/** 提交表单 */
const emit = defineEmits(['success']) // success
const submitForm = async () => {
//
await formRef.value.validate()
//
formLoading.value = true
try {
const data = formData.value as unknown as FeedingRecordVO
if (formType.value === 'create') {
await FeedingRecordApi.createFeedingRecord(data)
message.success(t('common.createSuccess'))
} else {
await FeedingRecordApi.updateFeedingRecord(data)
message.success(t('common.updateSuccess'))
}
dialogVisible.value = false
//
emit('success')
} finally {
formLoading.value = false
}
}
/** 重置表单 */
const resetForm = () => {
formData.value = {
id: undefined,
feedingRecordCode: undefined,
productId: undefined,
planId: undefined,
itemId: undefined,
feedingPipeline: undefined,
feedingType: undefined,
weight: undefined,
feedingTime: undefined,
userId: undefined,
remark: undefined,
recordStatus: undefined,
}
formRef.value?.resetFields()
}
</script>

@ -0,0 +1,310 @@
<template>
<ContentWrap>
<!-- 搜索工作栏 -->
<el-form
class="-mb-15px"
:model="queryParams"
ref="queryFormRef"
:inline="true"
label-width="68px"
>
<el-form-item label="单号" prop="feedingRecordCode">
<el-input
v-model="queryParams.feedingRecordCode"
placeholder="请输入单号"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="产品id" prop="productId">
<el-input
v-model="queryParams.productId"
placeholder="请输入产品"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="计划" prop="planId">
<el-input
v-model="queryParams.planId"
placeholder="请输入计划id"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="原料" 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="feedingPipeline">
<el-select
v-model="queryParams.feedingPipeline"
placeholder="请选择制浆线"
clearable
class="!w-240px"
>
<el-option
v-for="dict in getStrDictOptions(DICT_TYPE.MES_FEEDING_PIPELINE)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="投料类型" prop="feedingType">
<el-select
v-model="queryParams.feedingType"
placeholder="请选择投料类型"
clearable
class="!w-240px"
>
<el-option
v-for="dict in getStrDictOptions(DICT_TYPE.MES_FEEDING_TYPE)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="记录人" prop="userId">
<el-input
v-model="queryParams.userId"
placeholder="请输入记录人"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="备注" prop="remark">
<el-input
v-model="queryParams.remark"
placeholder="请输入备注"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="状态" prop="recordStatus">
<el-select
v-model="queryParams.recordStatus"
placeholder="请选择状态"
clearable
class="!w-240px"
>
<el-option
v-for="dict in getStrDictOptions(DICT_TYPE.MES_FEEDING_RECORD_STATUS)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</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('create')"
v-hasPermi="['mes:feeding-record:create']"
>
<Icon icon="ep:plus" class="mr-5px" /> 新增
</el-button>
<el-button
type="success"
plain
@click="handleExport"
:loading="exportLoading"
v-hasPermi="['mes:feeding-record: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="true" :show-overflow-tooltip="true">
<el-table-column label="单号" align="center" prop="feedingRecordCode" />
<el-table-column label="产品" align="center" prop="productId" />
<el-table-column label="计划" align="center" prop="planId" />
<el-table-column label="原料" align="center" prop="itemId" />
<el-table-column label="制浆线" align="center" prop="feedingPipeline">
<template #default="scope">
<dict-tag :type="DICT_TYPE.MES_FEEDING_PIPELINE" :value="scope.row.feedingPipeline" />
</template>
</el-table-column>
<el-table-column label="投料类型" align="center" prop="feedingType">
<template #default="scope">
<dict-tag :type="DICT_TYPE.MES_FEEDING_TYPE" :value="scope.row.feedingType" />
</template>
</el-table-column>
<el-table-column label="重量" align="center" prop="weight" />
<el-table-column label="记录人" align="center" prop="userId" />
<el-table-column label="备注" align="center" prop="remark" />
<el-table-column label="状态" align="center" prop="recordStatus">
<template #default="scope">
<dict-tag :type="DICT_TYPE.MES_FEEDING_RECORD_STATUS" :value="scope.row.recordStatus" />
</template>
</el-table-column>
<el-table-column
label="创建时间"
align="center"
prop="createTime"
:formatter="dateFormatter"
width="180px"
/>
<el-table-column label="操作" align="center">
<template #default="scope">
<el-button
link
type="primary"
@click="openForm('update', scope.row.id)"
v-hasPermi="['mes:feeding-record:update']"
>
编辑
</el-button>
<el-button
link
type="danger"
@click="handleDelete(scope.row.id)"
v-hasPermi="['mes:feeding-record: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>
<!-- 表单弹窗添加/修改 -->
<FeedingRecordForm ref="formRef" @success="getList" />
</template>
<script setup lang="ts">
import { getStrDictOptions, DICT_TYPE } from '@/utils/dict'
import { dateFormatter } from '@/utils/formatTime'
import download from '@/utils/download'
import { FeedingRecordApi, FeedingRecordVO } from '@/api/mes/feedingrecord'
import FeedingRecordForm from './FeedingRecordForm.vue'
/** 投料记录 列表 */
defineOptions({ name: 'FeedingRecord' })
const message = useMessage() //
const { t } = useI18n() //
const loading = ref(true) //
const list = ref<FeedingRecordVO[]>([]) //
const total = ref(0) //
const queryParams = reactive({
pageNo: 1,
pageSize: 10,
feedingRecordCode: undefined,
productId: undefined,
planId: undefined,
itemId: undefined,
feedingPipeline: undefined,
feedingType: undefined,
weight: undefined,
feedingTime: [],
userId: undefined,
remark: undefined,
recordStatus: undefined,
createTime: [],
})
const queryFormRef = ref() //
const exportLoading = ref(false) //
/** 查询列表 */
const getList = async () => {
loading.value = true
try {
const data = await FeedingRecordApi.getFeedingRecordPage(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 formRef = ref()
const openForm = (type: string, id?: number) => {
formRef.value.open(type, id)
}
/** 删除按钮操作 */
const handleDelete = async (id: number) => {
try {
//
await message.delConfirm()
//
await FeedingRecordApi.deleteFeedingRecord(id)
message.success(t('common.delSuccess'))
//
await getList()
} catch {}
}
/** 导出按钮操作 */
const handleExport = async () => {
try {
//
await message.exportConfirm()
//
exportLoading.value = true
const data = await FeedingRecordApi.exportFeedingRecord(queryParams)
download.excel(data, '投料记录.xls')
} catch {
} finally {
exportLoading.value = false
}
}
/** 初始化 **/
onMounted(() => {
getList()
})
</script>

@ -0,0 +1,148 @@
<template>
<Dialog :title="dialogTitle" v-model="dialogVisible">
<el-form
ref="formRef"
:model="formData"
:rules="formRules"
label-width="100px"
v-loading="formLoading"
>
<el-form-item label="原料" prop="itemId">
<el-input v-model="formData.itemId" placeholder="请输入原料" />
</el-form-item>
<el-form-item label="数量" prop="count">
<el-input v-model="formData.count" placeholder="请输入数量" />
</el-form-item>
<el-form-item label="明细类别" prop="detailType">
<el-radio-group v-model="formData.detailType">
<el-radio
v-for="dict in getStrDictOptions(DICT_TYPE.MES_STOCK_WORKSHOP_DETAIL_TYPE)"
:key="dict.value"
:label="dict.value"
>
{{ dict.label }}
</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="领料单" prop="itemRequisitionCode">
<el-input v-model="formData.itemRequisitionCode" placeholder="请输入领料单" />
</el-form-item>
<el-form-item label="领料明细id" prop="itemRequisitionDetailId">
<el-input v-model="formData.itemRequisitionDetailId" placeholder="请输入领料明细id" />
</el-form-item>
<el-form-item label="投料单" prop="feedingRecordCode">
<el-input v-model="formData.feedingRecordCode" placeholder="请输入投料单" />
</el-form-item>
<el-form-item label="投料id" prop="feedingRecordId">
<el-input v-model="formData.feedingRecordId" placeholder="请输入投料id" />
</el-form-item>
<el-form-item label="操作人员" prop="userId">
<el-input v-model="formData.userId" placeholder="请输入操作人员" />
</el-form-item>
<el-form-item label="单据时间" prop="operateTime">
<el-date-picker
v-model="formData.operateTime"
type="date"
value-format="x"
placeholder="选择单据时间"
/>
</el-form-item>
</el-form>
<template #footer>
<el-button @click="submitForm" type="primary" :disabled="formLoading"> </el-button>
<el-button @click="dialogVisible = false"> </el-button>
</template>
</Dialog>
</template>
<script setup lang="ts">
import { getStrDictOptions, DICT_TYPE } from '@/utils/dict'
import { StockWorkshopDetailApi, StockWorkshopDetailVO } from '@/api/mes/stockworkshop'
/** 车间仓明细 表单 */
defineOptions({ name: 'StockWorkshopDetailForm' })
const { t } = useI18n() //
const message = useMessage() //
const dialogVisible = ref(false) //
const dialogTitle = ref('') //
const formLoading = ref(false) // 12
const formType = ref('') // create - update -
const formData = ref({
id: undefined,
itemId: undefined,
count: undefined,
detailType: undefined,
itemRequisitionCode: undefined,
itemRequisitionDetailId: undefined,
feedingRecordCode: undefined,
feedingRecordId: undefined,
userId: undefined,
operateTime: undefined,
})
const formRules = reactive({
itemId: [{ required: true, message: '原料id不能为空', trigger: 'blur' }],
count: [{ required: true, message: '数量不能为空', trigger: 'blur' }],
userId: [{ required: true, message: '操作人员不能为空', trigger: 'blur' }],
})
const formRef = ref() // Ref
/** 打开弹窗 */
const open = async (type: string, id?: number) => {
dialogVisible.value = true
dialogTitle.value = t('action.' + type)
formType.value = type
resetForm()
//
if (id) {
formLoading.value = true
try {
formData.value = await StockWorkshopDetailApi.getStockWorkshopDetail(id)
} finally {
formLoading.value = false
}
}
}
defineExpose({ open }) // open
/** 提交表单 */
const emit = defineEmits(['success']) // success
const submitForm = async () => {
//
await formRef.value.validate()
//
formLoading.value = true
try {
const data = formData.value as unknown as StockWorkshopDetailVO
if (formType.value === 'create') {
await StockWorkshopDetailApi.createStockWorkshopDetail(data)
message.success(t('common.createSuccess'))
} else {
await StockWorkshopDetailApi.updateStockWorkshopDetail(data)
message.success(t('common.updateSuccess'))
}
dialogVisible.value = false
//
emit('success')
} finally {
formLoading.value = false
}
}
/** 重置表单 */
const resetForm = () => {
formData.value = {
id: undefined,
itemId: undefined,
count: undefined,
detailType: undefined,
itemRequisitionCode: undefined,
itemRequisitionDetailId: undefined,
feedingRecordCode: undefined,
feedingRecordId: undefined,
userId: undefined,
operateTime: undefined,
}
formRef.value?.resetFields()
}
</script>

@ -0,0 +1,248 @@
<template>
<ContentWrap>
<!-- 搜索工作栏 -->
<el-form
class="-mb-15px"
:model="queryParams"
ref="queryFormRef"
:inline="true"
label-width="68px"
>
<el-form-item label="原料" prop="itemId">
<el-input
v-model="queryParams.itemId"
placeholder="请输入原料"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="明细类别" prop="detailType">
<el-select
v-model="queryParams.detailType"
placeholder="请选择明细类别"
clearable
class="!w-240px"
>
<el-option
v-for="dict in getStrDictOptions(DICT_TYPE.MES_STOCK_WORKSHOP_DETAIL_TYPE)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="操作人员" prop="userId">
<el-input
v-model="queryParams.userId"
placeholder="请输入操作人员"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="单据时间" prop="operateTime">
<el-date-picker
v-model="queryParams.operateTime"
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 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('create')"
v-hasPermi="['mes:stock-workshop-detail:create']"
>
<Icon icon="ep:plus" class="mr-5px" /> 新增
</el-button>
<el-button
type="success"
plain
@click="handleExport"
:loading="exportLoading"
v-hasPermi="['mes:stock-workshop-detail: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="true" :show-overflow-tooltip="true">
<el-table-column label="原料id" align="center" prop="itemId" />
<el-table-column label="数量" align="center" prop="count" />
<el-table-column label="明细类别" align="center" prop="detailType">
<template #default="scope">
<dict-tag :type="DICT_TYPE.MES_STOCK_WORKSHOP_DETAIL_TYPE" :value="scope.row.detailType" />
</template>
</el-table-column>
<el-table-column label="领料单" align="center" prop="itemRequisitionCode" />
<el-table-column label="投料单" align="center" prop="feedingRecordCode" />
<el-table-column label="操作人员" align="center" prop="userId" />
<el-table-column
label="单据时间"
align="center"
prop="operateTime"
:formatter="dateFormatter"
width="180px"
/>
<el-table-column
label="创建时间"
align="center"
prop="createTime"
:formatter="dateFormatter"
width="180px"
/>
<el-table-column label="操作" align="center">
<template #default="scope">
<el-button
link
type="primary"
@click="openForm('update', scope.row.id)"
v-hasPermi="['mes:stock-workshop-detail:update']"
>
编辑
</el-button>
<el-button
link
type="danger"
@click="handleDelete(scope.row.id)"
v-hasPermi="['mes:stock-workshop-detail: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>
<!-- 表单弹窗添加/修改 -->
<StockWorkshopDetailForm ref="formRef" @success="getList" />
</template>
<script setup lang="ts">
import { getStrDictOptions, DICT_TYPE } from '@/utils/dict'
import { dateFormatter } from '@/utils/formatTime'
import download from '@/utils/download'
import { StockWorkshopDetailApi, StockWorkshopDetailVO } from '@/api/mes/stockworkshop'
import StockWorkshopDetailForm from './StockWorkshopDetailForm.vue'
/** 车间仓明细 列表 */
defineOptions({ name: 'StockWorkshopDetail' })
const message = useMessage() //
const { t } = useI18n() //
const loading = ref(true) //
const list = ref<StockWorkshopDetailVO[]>([]) //
const total = ref(0) //
const queryParams = reactive({
pageNo: 1,
pageSize: 10,
itemId: undefined,
count: undefined,
detailType: undefined,
itemRequisitionCode: undefined,
itemRequisitionDetailId: undefined,
feedingRecordCode: undefined,
feedingRecordId: undefined,
userId: undefined,
operateTime: [],
createTime: [],
})
const queryFormRef = ref() //
const exportLoading = ref(false) //
/** 查询列表 */
const getList = async () => {
loading.value = true
try {
const data = await StockWorkshopDetailApi.getStockWorkshopDetailPage(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 formRef = ref()
const openForm = (type: string, id?: number) => {
formRef.value.open(type, id)
}
/** 删除按钮操作 */
const handleDelete = async (id: number) => {
try {
//
await message.delConfirm()
//
await StockWorkshopDetailApi.deleteStockWorkshopDetail(id)
message.success(t('common.delSuccess'))
//
await getList()
} catch {}
}
/** 导出按钮操作 */
const handleExport = async () => {
try {
//
await message.exportConfirm()
//
exportLoading.value = true
const data = await StockWorkshopDetailApi.exportStockWorkshopDetail(queryParams)
download.excel(data, '车间仓明细.xls')
} catch {
} finally {
exportLoading.value = false
}
}
/** 初始化 **/
onMounted(() => {
getList()
})
</script>

@ -0,0 +1,106 @@
<template>
<Dialog :title="dialogTitle" v-model="dialogVisible">
<el-form
ref="formRef"
:model="formData"
:rules="formRules"
label-width="100px"
v-loading="formLoading"
>
<el-form-item label="原料" prop="itemId">
<el-input v-model="formData.itemId" placeholder="请输入原料" />
</el-form-item>
<el-form-item label="库存数量" prop="count">
<el-input v-model="formData.count" placeholder="请输入库存数量" />
</el-form-item>
<el-form-item label="单位" prop="count">
<el-input v-model="formData.count" placeholder="请输入库存数量" />
</el-form-item>
<el-form-item label="分类" prop="categoryId">
<el-input v-model="formData.categoryId" placeholder="请输入分类" />
</el-form-item>
</el-form>
<template #footer>
<el-button @click="submitForm" type="primary" :disabled="formLoading"> </el-button>
<el-button @click="dialogVisible = false"> </el-button>
</template>
</Dialog>
</template>
<script setup lang="ts">
import { StockWorkshopApi, StockWorkshopVO } from '@/api/mes/stockworkshop'
/** 车间仓库存 表单 */
defineOptions({ name: 'StockWorkshopForm' })
const { t } = useI18n() //
const message = useMessage() //
const dialogVisible = ref(false) //
const dialogTitle = ref('') //
const formLoading = ref(false) // 12
const formType = ref('') // create - update -
const formData = ref({
id: undefined,
itemId: undefined,
count: undefined,
categoryId: undefined,
})
const formRules = reactive({
itemId: [{ required: true, message: '原料编号不能为空', trigger: 'blur' }],
count: [{ required: true, message: '库存数量不能为空', trigger: 'blur' }],
})
const formRef = ref() // Ref
/** 打开弹窗 */
const open = async (type: string, id?: number) => {
dialogVisible.value = true
dialogTitle.value = t('action.' + type)
formType.value = type
resetForm()
//
if (id) {
formLoading.value = true
try {
formData.value = await StockWorkshopApi.getStockWorkshop(id)
} finally {
formLoading.value = false
}
}
}
defineExpose({ open }) // open
/** 提交表单 */
const emit = defineEmits(['success']) // success
const submitForm = async () => {
//
await formRef.value.validate()
//
formLoading.value = true
try {
const data = formData.value as unknown as StockWorkshopVO
if (formType.value === 'create') {
await StockWorkshopApi.createStockWorkshop(data)
message.success(t('common.createSuccess'))
} else {
await StockWorkshopApi.updateStockWorkshop(data)
message.success(t('common.updateSuccess'))
}
dialogVisible.value = false
//
emit('success')
} finally {
formLoading.value = false
}
}
/** 重置表单 */
const resetForm = () => {
formData.value = {
id: undefined,
itemId: undefined,
count: undefined,
categoryId: undefined,
}
formRef.value?.resetFields()
}
</script>

@ -0,0 +1,191 @@
<template>
<ContentWrap>
<!-- 搜索工作栏 -->
<el-form
class="-mb-15px"
:model="queryParams"
ref="queryFormRef"
:inline="true"
label-width="68px"
>
<el-form-item label="原料" prop="itemId">
<el-input
v-model="queryParams.itemId"
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('create')"
v-hasPermi="['mes:stock-workshop:create']"
>
<Icon icon="ep:plus" class="mr-5px" /> 新增
</el-button>
<el-button
type="success"
plain
@click="handleExport"
:loading="exportLoading"
v-hasPermi="['mes:stock-workshop: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="true" :show-overflow-tooltip="true">
<el-table-column label="原料" align="center" prop="itemId" />
<el-table-column label="数量" align="center" prop="count" />
<el-table-column label="单位" align="center" prop="count" />
<el-table-column label="分类" align="center" prop="categoryId" />
<el-table-column
label="更新时间"
align="center"
prop="createTime"
:formatter="dateFormatter"
width="180px"
/>
<el-table-column label="操作" align="center">
<template #default="scope">
<el-button
link
type="primary"
@click="openForm('update', scope.row.id)"
v-hasPermi="['mes:stock-workshop:update']"
>
编辑
</el-button>
<el-button
link
type="danger"
@click="handleDelete(scope.row.id)"
v-hasPermi="['mes:stock-workshop: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>
<!-- 表单弹窗添加/修改 -->
<StockWorkshopForm ref="formRef" @success="getList" />
</template>
<script setup lang="ts">
import { dateFormatter } from '@/utils/formatTime'
import download from '@/utils/download'
import { StockWorkshopApi, StockWorkshopVO } from '@/api/mes/stockworkshop'
import StockWorkshopForm from './StockWorkshopForm.vue'
/** 车间仓库存 列表 */
defineOptions({ name: 'StockWorkshop' })
const message = useMessage() //
const { t } = useI18n() //
const loading = ref(true) //
const list = ref<StockWorkshopVO[]>([]) //
const total = ref(0) //
const queryParams = reactive({
pageNo: 1,
pageSize: 10,
itemId: undefined,
count: undefined,
categoryId: undefined,
createTime: [],
})
const queryFormRef = ref() //
const exportLoading = ref(false) //
/** 查询列表 */
const getList = async () => {
loading.value = true
try {
const data = await StockWorkshopApi.getStockWorkshopPage(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 formRef = ref()
const openForm = (type: string, id?: number) => {
formRef.value.open(type, id)
}
/** 删除按钮操作 */
const handleDelete = async (id: number) => {
try {
//
await message.delConfirm()
//
await StockWorkshopApi.deleteStockWorkshop(id)
message.success(t('common.delSuccess'))
//
await getList()
} catch {}
}
/** 导出按钮操作 */
const handleExport = async () => {
try {
//
await message.exportConfirm()
//
exportLoading.value = true
const data = await StockWorkshopApi.exportStockWorkshop(queryParams)
download.excel(data, '车间仓库存.xls')
} catch {
} finally {
exportLoading.value = false
}
}
/** 初始化 **/
onMounted(() => {
getList()
})
</script>
Loading…
Cancel
Save