add task plan

main
chenyuan 2 years ago
parent a2b463794e
commit 28e9815f11

@ -0,0 +1,54 @@
import request from '@/config/axios'
// 生产领料 VO
export interface ItemRequisitionVO {
id: number // ID
code: string // 编码
requisitionDate: Date // 下料时间
deliveryDate: Date // 创建时间
status: number // 状态
processInstanceId: string // 流程实例的编号
planId: number // 计划ID
remark: string // 备注
isEnable: boolean // 是否启用
}
// 生产领料 API
export const ItemRequisitionApi = {
// 查询生产领料分页
getItemRequisitionPage: async (params: any) => {
return await request.get({ url: `/mes/item-requisition/page`, params })
},
// 查询生产领料详情
getItemRequisition: async (id: number) => {
return await request.get({ url: `/mes/item-requisition/get?id=` + id })
},
// 新增生产领料
createItemRequisition: async (data: ItemRequisitionVO) => {
return await request.post({ url: `/mes/item-requisition/create`, data })
},
// 修改生产领料
updateItemRequisition: async (data: ItemRequisitionVO) => {
return await request.put({ url: `/mes/item-requisition/update`, data })
},
// 删除生产领料
deleteItemRequisition: async (id: number) => {
return await request.delete({ url: `/mes/item-requisition/delete?id=` + id })
},
// 导出生产领料 Excel
exportItemRequisition: async (params) => {
return await request.download({ url: `/mes/item-requisition/export-excel`, params })
},
// ==================== 子表(领料明细) ====================
// 获得领料明细列表
getItemRequisitionDetailListByItemRequisitionId: async (itemRequisitionId) => {
return await request.get({ url: `/mes/item-requisition/item-requisition-detail/list-by-item-requisition-id?itemRequisitionId=` + itemRequisitionId })
}
}

@ -0,0 +1,50 @@
import request from '@/config/axios'
// 产线工位 VO
export interface OrganizationVO {
id: number // 组织id
name: string // 组织名称
parentId: number // 父组织id
sort: number // 显示顺序
workerUserId: number // 负责人
machineId: number // 对应机台id
phone: string // 联系电话
email: string // 邮箱
isEnable: boolean // 是否启用
status: number // 组织状态
orgClass: number // 组织等级
orgType: number // 组织类型
}
// 产线工位 API
export const OrganizationApi = {
// 查询产线工位列表
getOrganizationList: async (params) => {
return await request.get({ url: `/mes/organization/list`, params })
},
// 查询产线工位详情
getOrganization: async (id: number) => {
return await request.get({ url: `/mes/organization/get?id=` + id })
},
// 新增产线工位
createOrganization: async (data: OrganizationVO) => {
return await request.post({ url: `/mes/organization/create`, data })
},
// 修改产线工位
updateOrganization: async (data: OrganizationVO) => {
return await request.put({ url: `/mes/organization/update`, data })
},
// 删除产线工位
deleteOrganization: async (id: number) => {
return await request.delete({ url: `/mes/organization/delete?id=` + id })
},
// 导出产线工位 Excel
exportOrganization: async (params) => {
return await request.download({ url: `/mes/organization/export-excel`, params })
}
}

@ -0,0 +1,53 @@
import request from '@/config/axios'
// 生产计划 VO
export interface PlanVO {
id: number // ID
code: string // 计划编码
productId: number // 产品ID
taskDetailId: number // 任务单明细ID
taskId: number // 任务单ID
planNumber: number // 数量
finishNumber: number // 成品数量
status: number // 状态
planStartTime: Date // 计划开始时间
planEndTime: Date // 计划结束时间
startTime: Date // 实际开始时间
endTime: Date // 实际结束时间
productionManagerId: number // 生产主管ID
remark: string // 备注
isEnable: boolean // 是否启用
}
// 生产计划 API
export const PlanApi = {
// 查询生产计划分页
getPlanPage: async (params: any) => {
return await request.get({ url: `/mes/plan/page`, params })
},
// 查询生产计划详情
getPlan: async (id: number) => {
return await request.get({ url: `/mes/plan/get?id=` + id })
},
// 新增生产计划
createPlan: async (data: PlanVO) => {
return await request.post({ url: `/mes/plan/create`, data })
},
// 修改生产计划
updatePlan: async (data: PlanVO) => {
return await request.put({ url: `/mes/plan/update`, data })
},
// 删除生产计划
deletePlan: async (id: number) => {
return await request.delete({ url: `/mes/plan/delete?id=` + id })
},
// 导出生产计划 Excel
exportPlan: async (params) => {
return await request.download({ url: `/mes/plan/export-excel`, params })
}
}

@ -0,0 +1,72 @@
import request from '@/config/axios'
// 生产任务单 VO
export interface TaskVO {
id: number // ID
code: string // 编码
orderDate: Date // 下达日期
deliveryDate: Date // 交货日期
status: number // 状态
processInstanceId: string // 流程实例的编号
remark: string // 备注
isEnable: boolean // 是否启用
}
// 生产任务单 API
export const TaskApi = {
// 查询生产任务单分页
getTaskPage: async (params: any) => {
return await request.get({ url: `/mes/task/page`, params })
},
// 查询生产任务单详情
getTask: async (id: number) => {
return await request.get({ url: `/mes/task/get?id=` + id })
},
// 新增生产任务单
createTask: async (data: TaskVO) => {
return await request.post({ url: `/mes/task/create`, data })
},
// 修改生产任务单
updateTask: async (data: TaskVO) => {
return await request.put({ url: `/mes/task/update`, data })
},
// 删除生产任务单
deleteTask: async (id: number) => {
return await request.delete({ url: `/mes/task/delete?id=` + id })
},
// 导出生产任务单 Excel
exportTask: async (params) => {
return await request.download({ url: `/mes/task/export-excel`, params })
},
// ==================== 子表(生产任务单明细) ====================
// 获得生产任务单明细分页
getTaskDetailPage: async (params) => {
return await request.get({ url: `/mes/task/task-detail/page`, params })
},
// 新增生产任务单明细
createTaskDetail: async (data) => {
return await request.post({ url: `/mes/task/task-detail/create`, data })
},
// 修改生产任务单明细
updateTaskDetail: async (data) => {
return await request.put({ url: `/mes/task/task-detail/update`, data })
},
// 删除生产任务单明细
deleteTaskDetail: async (id: number) => {
return await request.delete({ url: `/mes/task/task-detail/delete?id=` + id })
},
// 获得生产任务单明细
getTaskDetail: async (id: number) => {
return await request.get({ url: `/mes/task/task-detail/get?id=` + id })
}
}

@ -235,6 +235,14 @@ ERP_MAINTAIN_TYPE = 'maintain_type',// ERP 保养类型
ERP_AUTOCODE_IS_PADDING = "erp_autocode_is_padding",
ERP_AUTOCODE_PADDING_TYPE = "erp_autocode_padding_type",
ERP_AUTOCODE_CYCLEMETHOD = "erp_autocode_cyclemethod",
ERP_AUTOCODE_PARTTYPE = "erp_autocode_parttype"
ERP_AUTOCODE_PARTTYPE = "erp_autocode_parttype",
// ========== MES - 生产管理模块 ==========
MES_ORG_TYPE = "mes_org_type",
MES_ORG_CLASS = "mes_org_class",
MES_ORG_STATUS = "mes_org_status",
MES_TASK_STATUS = "mes_task_status",
MES_PLAN_STATUS = "mes_plan_status",
}

@ -109,7 +109,7 @@
</el-row>
</el-form-item>
</el-col>
<el-divider content-position="center">{{ t('login.otherLogin') }}</el-divider>
<!-- <el-divider content-position="center">{{ t('login.otherLogin') }}</el-divider>
<el-col :span="24" style="padding-right: 10px; padding-left: 10px">
<el-form-item>
<div class="w-[100%] flex justify-between">
@ -124,22 +124,8 @@
/>
</div>
</el-form-item>
</el-col>
<el-divider content-position="center">萌新必读</el-divider>
<el-col :span="24" style="padding-right: 10px; padding-left: 10px">
<el-form-item>
<div class="w-[100%] flex justify-between">
<el-link href="https://doc.iocoder.cn/" target="_blank">📚开发指南</el-link>
<el-link href="https://doc.iocoder.cn/video/" target="_blank">🔥视频教程</el-link>
<el-link href="https://www.iocoder.cn/Interview/good-collection/" target="_blank">
面试手册
</el-link>
<el-link href="http://static.yudao.iocoder.cn/mp/Aix9975.jpeg" target="_blank">
🤝外包咨询
</el-link>
</div>
</el-form-item>
</el-col>
</el-col> -->
</el-row>
</el-form>
</template>

@ -0,0 +1,163 @@
<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="code">
<el-input v-model="formData.code" placeholder="请输入编码" />
</el-form-item>
<el-form-item label="下料时间" prop="requisitionDate">
<el-date-picker
v-model="formData.requisitionDate"
type="date"
value-format="x"
placeholder="选择下料时间"
/>
</el-form-item>
<el-form-item label="创建时间" prop="deliveryDate">
<el-date-picker
v-model="formData.deliveryDate"
type="date"
value-format="x"
placeholder="选择创建时间"
/>
</el-form-item>
<el-form-item label="状态" prop="status">
<el-radio-group v-model="formData.status">
<el-radio label="1">请选择字典生成</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="流程实例的编号" prop="processInstanceId">
<el-input v-model="formData.processInstanceId" placeholder="请输入流程实例的编号" />
</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="备注" 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 label="1">请选择字典生成</el-radio>
</el-radio-group>
</el-form-item>
</el-form>
<!-- 子表的表单 -->
<el-tabs v-model="subTabsName">
<el-tab-pane label="领料明细" name="itemRequisitionDetail">
<ItemRequisitionDetailForm ref="itemRequisitionDetailFormRef" :item-requisition-id="formData.id" />
</el-tab-pane>
</el-tabs>
<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 { ItemRequisitionApi, ItemRequisitionVO } from '@/api/mes/itemrequisition'
import ItemRequisitionDetailForm from './components/ItemRequisitionDetailForm.vue'
/** 生产领料 表单 */
defineOptions({ name: 'ItemRequisitionForm' })
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,
code: undefined,
requisitionDate: undefined,
deliveryDate: undefined,
status: undefined,
processInstanceId: undefined,
planId: undefined,
remark: undefined,
isEnable: undefined
})
const formRules = reactive({
code: [{ required: true, message: '编码不能为空', trigger: 'blur' }],
planId: [{ required: true, message: '计划ID不能为空', trigger: 'blur' }],
isEnable: [{ required: true, message: '是否启用不能为空', trigger: 'blur' }]
})
const formRef = ref() // Ref
/** 子表的表单 */
const subTabsName = ref('itemRequisitionDetail')
const itemRequisitionDetailFormRef = 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 ItemRequisitionApi.getItemRequisition(id)
} finally {
formLoading.value = false
}
}
}
defineExpose({ open }) // open
/** 提交表单 */
const emit = defineEmits(['success']) // success
const submitForm = async () => {
//
await formRef.value.validate()
//
try {
await itemRequisitionDetailFormRef.value.validate()
} catch (e) {
subTabsName.value = 'itemRequisitionDetail'
return
}
//
formLoading.value = true
try {
const data = formData.value as unknown as ItemRequisitionVO
//
data.itemRequisitionDetails = itemRequisitionDetailFormRef.value.getData()
if (formType.value === 'create') {
await ItemRequisitionApi.createItemRequisition(data)
message.success(t('common.createSuccess'))
} else {
await ItemRequisitionApi.updateItemRequisition(data)
message.success(t('common.updateSuccess'))
}
dialogVisible.value = false
//
emit('success')
} finally {
formLoading.value = false
}
}
/** 重置表单 */
const resetForm = () => {
formData.value = {
id: undefined,
code: undefined,
requisitionDate: undefined,
deliveryDate: undefined,
status: undefined,
processInstanceId: undefined,
planId: undefined,
remark: undefined,
isEnable: undefined
}
formRef.value?.resetFields()
}
</script>

@ -0,0 +1,116 @@
<template>
<el-form
ref="formRef"
:model="formData"
:rules="formRules"
v-loading="formLoading"
label-width="0px"
:inline-message="true"
>
<el-table :data="formData" class="-mt-10px">
<el-table-column label="序号" type="index" width="100" />
<el-table-column label="产品ID" min-width="150">
<template #default="{ row, $index }">
<el-form-item :prop="`${$index}.productId`" :rules="formRules.productId" class="mb-0px!">
<el-input v-model="row.productId" placeholder="请输入产品ID" />
</el-form-item>
</template>
</el-table-column>
<el-table-column label="单位ID" min-width="150">
<template #default="{ row, $index }">
<el-form-item :prop="`${$index}.unitId`" :rules="formRules.unitId" class="mb-0px!">
<el-input v-model="row.unitId" placeholder="请输入单位ID" />
</el-form-item>
</template>
</el-table-column>
<el-table-column label="数量" min-width="150">
<template #default="{ row, $index }">
<el-form-item :prop="`${$index}.number`" :rules="formRules.number" class="mb-0px!">
<el-input v-model="row.number" placeholder="请输入数量" />
</el-form-item>
</template>
</el-table-column>
<el-table-column label="备注" min-width="150">
<template #default="{ row, $index }">
<el-form-item :prop="`${$index}.remark`" :rules="formRules.remark" class="mb-0px!">
<el-input v-model="row.remark" placeholder="请输入备注" />
</el-form-item>
</template>
</el-table-column>
<el-table-column align="center" fixed="right" label="操作" width="60">
<template #default="{ $index }">
<el-button @click="handleDelete($index)" link></el-button>
</template>
</el-table-column>
</el-table>
</el-form>
<el-row justify="center" class="mt-3">
<el-button @click="handleAdd" round>+ 添加领料明细</el-button>
</el-row>
</template>
<script setup lang="ts">
import { ItemRequisitionApi } from '@/api/mes/itemrequisition'
const props = defineProps<{
itemRequisitionId: undefined // ID
}>()
const formLoading = ref(false) //
const formData = ref([])
const formRules = reactive({
productId: [{ required: true, message: '产品ID不能为空', trigger: 'blur' }],
unitId: [{ required: true, message: '单位ID不能为空', trigger: 'blur' }],
itemRequisitionId: [{ required: true, message: '领料单ID不能为空', trigger: 'blur' }]
})
const formRef = ref() // Ref
/** 监听主表的关联字段的变化,加载对应的子表数据 */
watch(
() => props.itemRequisitionId,
async (val) => {
// 1.
formData.value = []
// 2. val
if (!val) {
return;
}
try {
formLoading.value = true
formData.value = await ItemRequisitionApi.getItemRequisitionDetailListByItemRequisitionId(val)
} finally {
formLoading.value = false
}
},
{ immediate: true }
)
/** 新增按钮操作 */
const handleAdd = () => {
const row = {
id: undefined,
productId: undefined,
unitId: undefined,
itemRequisitionId: undefined,
number: undefined,
remark: undefined
}
row.itemRequisitionId = props.itemRequisitionId
formData.value.push(row)
}
/** 删除按钮操作 */
const handleDelete = (index) => {
formData.value.splice(index, 1)
}
/** 表单校验 */
const validate = () => {
return formRef.value.validate()
}
/** 表单值 */
const getData = () => {
return formData.value
}
defineExpose({ validate, getData })
</script>

@ -0,0 +1,45 @@
<template>
<!-- 列表 -->
<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="产品ID" align="center" prop="productId" />
<el-table-column label="单位ID" align="center" prop="unitId" />
<el-table-column label="数量" align="center" prop="number" />
<el-table-column label="备注" align="center" prop="remark" />
</el-table>
</ContentWrap>
</template>
<script setup lang="ts">
import { ItemRequisitionApi } from '@/api/mes/itemrequisition'
const { t } = useI18n() //
const message = useMessage() //
const props = defineProps<{
itemRequisitionId?: number // ID
}>()
const loading = ref(false) //
const list = ref([]) //
/** 查询列表 */
const getList = async () => {
loading.value = true
try {
list.value = await ItemRequisitionApi.getItemRequisitionDetailListByItemRequisitionId(props.itemRequisitionId)
} finally {
loading.value = false
}
}
/** 搜索按钮操作 */
const handleQuery = () => {
queryParams.pageNo = 1
getList()
}
/** 初始化 **/
onMounted(() => {
getList()
})
</script>

@ -0,0 +1,281 @@
<template>
<ContentWrap>
<!-- 搜索工作栏 -->
<el-form
class="-mb-15px"
:model="queryParams"
ref="queryFormRef"
:inline="true"
label-width="68px"
>
<el-form-item label="编码" prop="code">
<el-input
v-model="queryParams.code"
placeholder="请输入编码"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="下料时间" prop="requisitionDate">
<el-date-picker
v-model="queryParams.requisitionDate"
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="deliveryDate">
<el-date-picker
v-model="queryParams.deliveryDate"
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="status">
<el-select
v-model="queryParams.status"
placeholder="请选择状态"
clearable
class="!w-240px"
>
<el-option label="请选择字典生成" value="" />
</el-select>
</el-form-item>
<el-form-item label="流程实例的编号" prop="processInstanceId">
<el-input
v-model="queryParams.processInstanceId"
placeholder="请输入流程实例的编号"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="计划ID" 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="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 label="请选择字典生成" 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:item-requisition:create']"
>
<Icon icon="ep:plus" class="mr-5px" /> 新增
</el-button>
<el-button
type="success"
plain
@click="handleExport"
:loading="exportLoading"
v-hasPermi="['mes:item-requisition: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 type="expand">
<template #default="scope">
<el-tabs model-value="itemRequisitionDetail">
<el-tab-pane label="领料明细" name="itemRequisitionDetail">
<ItemRequisitionDetailList :item-requisition-id="scope.row.id" />
</el-tab-pane>
</el-tabs>
</template>
</el-table-column>
<el-table-column label="ID" align="center" prop="id" />
<el-table-column label="编码" align="center" prop="code" />
<el-table-column label="下料时间" align="center" prop="requisitionDate" />
<el-table-column label="创建时间" align="center" prop="deliveryDate" />
<el-table-column label="状态" align="center" prop="status" />
<el-table-column label="流程实例的编号" align="center" prop="processInstanceId" />
<el-table-column label="计划ID" align="center" prop="planId" />
<el-table-column label="备注" align="center" prop="remark" />
<el-table-column label="是否启用" align="center" prop="isEnable" />
<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:item-requisition:update']"
>
编辑
</el-button>
<el-button
link
type="danger"
@click="handleDelete(scope.row.id)"
v-hasPermi="['mes:item-requisition: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>
<!-- 表单弹窗添加/修改 -->
<ItemRequisitionForm ref="formRef" @success="getList" />
</template>
<script setup lang="ts">
import { dateFormatter } from '@/utils/formatTime'
import download from '@/utils/download'
import { ItemRequisitionApi, ItemRequisitionVO } from '@/api/mes/itemrequisition'
import ItemRequisitionForm from './ItemRequisitionForm.vue'
import ItemRequisitionDetailList from './components/ItemRequisitionDetailList.vue'
/** 生产领料 列表 */
defineOptions({ name: 'ItemRequisition' })
const message = useMessage() //
const { t } = useI18n() //
const loading = ref(true) //
const list = ref<ItemRequisitionVO[]>([]) //
const total = ref(0) //
const queryParams = reactive({
pageNo: 1,
pageSize: 10,
code: undefined,
requisitionDate: [],
deliveryDate: [],
status: undefined,
processInstanceId: undefined,
planId: undefined,
remark: undefined,
isEnable: undefined,
createTime: []
})
const queryFormRef = ref() //
const exportLoading = ref(false) //
/** 查询列表 */
const getList = async () => {
loading.value = true
try {
const data = await ItemRequisitionApi.getItemRequisitionPage(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 ItemRequisitionApi.deleteItemRequisition(id)
message.success(t('common.delSuccess'))
//
await getList()
} catch {}
}
/** 导出按钮操作 */
const handleExport = async () => {
try {
//
await message.exportConfirm()
//
exportLoading.value = true
const data = await ItemRequisitionApi.exportItemRequisition(queryParams)
download.excel(data, '生产领料.xls')
} catch {
} finally {
exportLoading.value = false
}
}
/** 初始化 **/
onMounted(() => {
getList()
})
</script>

@ -0,0 +1,197 @@
<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="name">
<el-input v-model="formData.name" placeholder="请输入组织名称" />
</el-form-item>
<el-form-item label="父组织id" prop="parentId">
<el-tree-select
v-model="formData.parentId"
:data="organizationTree"
:props="defaultProps"
check-strictly
default-expand-all
placeholder="请选择父组织id"
/>
</el-form-item>
<el-form-item label="显示顺序" prop="sort">
<el-input v-model="formData.sort" placeholder="请输入显示顺序" />
</el-form-item>
<el-form-item label="负责人" prop="workerUserId">
<el-input v-model="formData.workerUserId" placeholder="请输入负责人" />
</el-form-item>
<el-form-item label="对应机台id" prop="machineId">
<el-input v-model="formData.machineId" placeholder="请输入对应机台id" />
</el-form-item>
<el-form-item label="联系电话" prop="phone">
<el-input v-model="formData.phone" placeholder="请输入联系电话" />
</el-form-item>
<el-form-item label="邮箱" prop="email">
<el-input v-model="formData.email" 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-item label="组织状态" prop="status">
<el-radio-group v-model="formData.status">
<el-radio
v-for="dict in getStrDictOptions(DICT_TYPE.MES_ORG_STATUS)"
:key="dict.value"
:label="dict.value"
>
{{ dict.label }}
</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="组织等级" prop="orgClass">
<el-radio-group v-model="formData.orgClass">
<el-radio
v-for="dict in getStrDictOptions(DICT_TYPE.MES_ORG_CLASS)"
:key="dict.value"
:label="dict.value"
>
{{ dict.label }}
</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="组织类型" prop="orgType">
<el-select v-model="formData.orgType" placeholder="请选择组织类型">
<el-option
v-for="dict in getStrDictOptions(DICT_TYPE.MES_ORG_TYPE)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</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 { getIntDictOptions, getBoolDictOptions, DICT_TYPE, getStrDictOptions } from '@/utils/dict'
import { OrganizationApi, OrganizationVO } from '@/api/mes/organization'
import { defaultProps, handleTree } from '@/utils/tree'
/** 产线工位 表单 */
defineOptions({ name: 'OrganizationForm' })
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,
name: undefined,
parentId: undefined,
sort: undefined,
workerUserId: undefined,
machineId: undefined,
phone: undefined,
email: undefined,
isEnable: undefined,
status: undefined,
orgClass: undefined,
orgType: undefined
})
const formRules = reactive({
name: [{ required: true, message: '组织名称不能为空', trigger: 'blur' }],
parentId: [{ required: true, message: '父组织id不能为空', trigger: 'blur' }],
sort: [{ required: true, message: '显示顺序不能为空', trigger: 'blur' }],
isEnable: [{ required: true, message: '是否启用不能为空', trigger: 'blur' }]
})
const formRef = ref() // Ref
const organizationTree = 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 OrganizationApi.getOrganization(id)
} finally {
formLoading.value = false
}
}
await getOrganizationTree()
}
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 OrganizationVO
if (formType.value === 'create') {
await OrganizationApi.createOrganization(data)
message.success(t('common.createSuccess'))
} else {
await OrganizationApi.updateOrganization(data)
message.success(t('common.updateSuccess'))
}
dialogVisible.value = false
//
emit('success')
} finally {
formLoading.value = false
}
}
/** 重置表单 */
const resetForm = () => {
formData.value = {
id: undefined,
name: undefined,
parentId: undefined,
sort: undefined,
workerUserId: undefined,
machineId: undefined,
phone: undefined,
email: undefined,
isEnable: undefined,
status: undefined,
orgClass: undefined,
orgType: undefined
}
formRef.value?.resetFields()
}
/** 获得产线工位树 */
const getOrganizationTree = async () => {
organizationTree.value = []
const data = await OrganizationApi.getOrganizationList()
const root: Tree = { id: 0, name: '顶级产线工位', children: [] }
root.children = handleTree(data, 'id', 'parentId')
organizationTree.value.push(root)
}
</script>

@ -0,0 +1,355 @@
<template>
<ContentWrap>
<!-- 搜索工作栏 -->
<el-form
class="-mb-15px"
:model="queryParams"
ref="queryFormRef"
:inline="true"
label-width="68px"
>
<el-form-item label="组织名称" prop="name">
<el-input
v-model="queryParams.name"
placeholder="请输入组织名称"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="父组织id" prop="parentId">
<el-input
v-model="queryParams.parentId"
placeholder="请输入父组织id"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="显示顺序" prop="sort">
<el-input
v-model="queryParams.sort"
placeholder="请输入显示顺序"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="负责人" prop="workerUserId">
<el-input
v-model="queryParams.workerUserId"
placeholder="请输入负责人"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="对应机台id" prop="machineId">
<el-input
v-model="queryParams.machineId"
placeholder="请输入对应机台id"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="联系电话" prop="phone">
<el-input
v-model="queryParams.phone"
placeholder="请输入联系电话"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="邮箱" prop="email">
<el-input
v-model="queryParams.email"
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 label="组织状态" prop="status">
<el-select
v-model="queryParams.status"
placeholder="请选择组织状态"
clearable
class="!w-240px"
>
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.MES_ORG_STATUS)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="组织等级" prop="orgClass">
<el-select
v-model="queryParams.orgClass"
placeholder="请选择组织等级"
clearable
class="!w-240px"
>
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.MES_ORG_CLASS)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="组织类型" prop="orgType">
<el-select
v-model="queryParams.orgType"
placeholder="请选择组织类型"
clearable
class="!w-240px"
>
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.MES_ORG_TYPE)"
: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:organization:create']"
>
<Icon icon="ep:plus" class="mr-5px" /> 新增
</el-button>
<el-button
type="success"
plain
@click="handleExport"
:loading="exportLoading"
v-hasPermi="['mes:organization:export']"
>
<Icon icon="ep:download" class="mr-5px" /> 导出
</el-button>
<el-button type="danger" plain @click="toggleExpandAll">
<Icon icon="ep:sort" 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"
row-key="id"
:default-expand-all="isExpandAll"
v-if="refreshTable"
>
<el-table-column label="组织id" align="center" prop="id" />
<el-table-column label="组织名称" align="center" prop="name" />
<el-table-column label="显示顺序" align="center" prop="sort" />
<el-table-column label="负责人" align="center" prop="workerUserId" />
<el-table-column label="对应机台" align="center" prop="machineId" />
<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="status">
<template #default="scope">
<dict-tag :type="DICT_TYPE.MES_ORG_STATUS" :value="scope.row.status" />
</template>
</el-table-column>
<el-table-column label="组织等级" align="center" prop="orgClass">
<template #default="scope">
<dict-tag :type="DICT_TYPE.MES_ORG_CLASS" :value="scope.row.orgClass" />
</template>
</el-table-column>
<el-table-column label="组织类型" align="center" prop="orgType">
<template #default="scope">
<dict-tag :type="DICT_TYPE.MES_ORG_TYPE" :value="scope.row.orgType" />
</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:organization:update']"
>
编辑
</el-button>
<el-button
link
type="danger"
@click="handleDelete(scope.row.id)"
v-hasPermi="['mes:organization: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>
<!-- 表单弹窗添加/修改 -->
<OrganizationForm ref="formRef" @success="getList" />
</template>
<script setup lang="ts">
import { getIntDictOptions, getBoolDictOptions, DICT_TYPE } from '@/utils/dict'
import { dateFormatter } from '@/utils/formatTime'
import { handleTree } from '@/utils/tree'
import download from '@/utils/download'
import { OrganizationApi, OrganizationVO } from '@/api/mes/organization'
import OrganizationForm from './OrganizationForm.vue'
/** 产线工位 列表 */
defineOptions({ name: 'Organization' })
const message = useMessage() //
const { t } = useI18n() //
const loading = ref(true) //
const list = ref<OrganizationVO[]>([]) //
const queryParams = reactive({
name: undefined,
parentId: undefined,
sort: undefined,
workerUserId: undefined,
machineId: undefined,
phone: undefined,
email: undefined,
isEnable: undefined,
status: undefined,
orgClass: undefined,
orgType: undefined,
createTime: []
})
const queryFormRef = ref() //
const exportLoading = ref(false) //
/** 查询列表 */
const getList = async () => {
loading.value = true
try {
const data = await OrganizationApi.getOrganizationList(queryParams)
list.value = handleTree(data, 'id', 'parentId')
} 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 OrganizationApi.deleteOrganization(id)
message.success(t('common.delSuccess'))
//
await getList()
} catch {}
}
/** 导出按钮操作 */
const handleExport = async () => {
try {
//
await message.exportConfirm()
//
exportLoading.value = true
const data = await OrganizationApi.exportOrganization(queryParams)
download.excel(data, '产线工位.xls')
} catch {
} finally {
exportLoading.value = false
}
}
/** 展开/折叠操作 */
const isExpandAll = ref(true) //
const refreshTable = ref(true) //
const toggleExpandAll = async () => {
refreshTable.value = false
isExpandAll.value = !isExpandAll.value
await nextTick()
refreshTable.value = true
}
/** 初始化 **/
onMounted(() => {
getList()
})
</script>

@ -0,0 +1,202 @@
<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="code">
<el-input v-model="formData.code" 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="taskDetailId">
<el-input v-model="formData.taskDetailId" placeholder="请输入任务单明细ID" />
</el-form-item>
<el-form-item label="任务单ID" prop="taskId">
<el-input v-model="formData.taskId" placeholder="请输入任务单ID" />
</el-form-item>
<el-form-item label="数量" prop="planNumber">
<el-input v-model="formData.planNumber" placeholder="请输入数量" />
</el-form-item>
<el-form-item label="成品数量" prop="finishNumber">
<el-input v-model="formData.finishNumber" placeholder="请输入成品数量" />
</el-form-item>
<el-form-item label="状态" prop="status">
<el-radio-group v-model="formData.status">
<el-radio
v-for="dict in getIntDictOptions(DICT_TYPE.MES_PLAN_STATUS)"
:key="dict.value"
:label="dict.value"
>
{{ dict.label }}
</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="计划开始时间" prop="planStartTime">
<el-date-picker
v-model="formData.planStartTime"
type="date"
value-format="x"
placeholder="选择计划开始时间"
/>
</el-form-item>
<el-form-item label="计划结束时间" prop="planEndTime">
<el-date-picker
v-model="formData.planEndTime"
type="date"
value-format="x"
placeholder="选择计划结束时间"
/>
</el-form-item>
<el-form-item label="实际开始时间" prop="startTime">
<el-date-picker
v-model="formData.startTime"
type="date"
value-format="x"
placeholder="选择实际开始时间"
/>
</el-form-item>
<el-form-item label="实际结束时间" prop="endTime">
<el-date-picker
v-model="formData.endTime"
type="date"
value-format="x"
placeholder="选择实际结束时间"
/>
</el-form-item>
<el-form-item label="生产主管ID" prop="productionManagerId">
<el-input v-model="formData.productionManagerId" placeholder="请输入生产主管ID" />
</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 { getIntDictOptions, getBoolDictOptions, DICT_TYPE } from '@/utils/dict'
import { PlanApi, PlanVO } from '@/api/mes/plan'
/** 生产计划 表单 */
defineOptions({ name: 'PlanForm' })
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,
code: undefined,
productId: undefined,
taskDetailId: undefined,
taskId: undefined,
planNumber: undefined,
finishNumber: undefined,
status: undefined,
planStartTime: undefined,
planEndTime: undefined,
startTime: undefined,
endTime: undefined,
productionManagerId: undefined,
remark: undefined,
isEnable: undefined
})
const formRules = reactive({
productId: [{ required: true, message: '产品ID不能为空', trigger: 'blur' }],
taskDetailId: [{ required: true, message: '任务单明细ID不能为空', trigger: 'blur' }],
taskId: [{ required: true, message: '任务单ID不能为空', trigger: 'blur' }],
planNumber: [{ required: true, message: '数量不能为空', trigger: 'blur' }],
status: [{ required: true, message: '状态不能为空', trigger: 'blur' }],
planStartTime: [{ required: true, message: '计划开始时间不能为空', trigger: 'blur' }],
planEndTime: [{ required: true, message: '计划结束时间不能为空', trigger: 'blur' }],
startTime: [{ required: true, message: '实际开始时间不能为空', trigger: 'blur' }],
endTime: [{ 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 PlanApi.getPlan(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 PlanVO
if (formType.value === 'create') {
await PlanApi.createPlan(data)
message.success(t('common.createSuccess'))
} else {
await PlanApi.updatePlan(data)
message.success(t('common.updateSuccess'))
}
dialogVisible.value = false
//
emit('success')
} finally {
formLoading.value = false
}
}
/** 重置表单 */
const resetForm = () => {
formData.value = {
id: undefined,
code: undefined,
productId: undefined,
taskDetailId: undefined,
taskId: undefined,
planNumber: undefined,
finishNumber: undefined,
status: undefined,
planStartTime: undefined,
planEndTime: undefined,
startTime: undefined,
endTime: undefined,
productionManagerId: undefined,
remark: undefined,
isEnable: undefined
}
formRef.value?.resetFields()
}
</script>

@ -0,0 +1,383 @@
<template>
<ContentWrap>
<!-- 搜索工作栏 -->
<el-form
class="-mb-15px"
:model="queryParams"
ref="queryFormRef"
:inline="true"
label-width="68px"
>
<el-form-item label="计划编码" prop="code">
<el-input
v-model="queryParams.code"
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="请输入产品ID"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="任务单明细ID" prop="taskDetailId">
<el-input
v-model="queryParams.taskDetailId"
placeholder="请输入任务单明细ID"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="任务单ID" prop="taskId">
<el-input
v-model="queryParams.taskId"
placeholder="请输入任务单ID"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="数量" prop="planNumber">
<el-input
v-model="queryParams.planNumber"
placeholder="请输入数量"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="成品数量" prop="finishNumber">
<el-input
v-model="queryParams.finishNumber"
placeholder="请输入成品数量"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="状态" prop="status">
<el-select
v-model="queryParams.status"
placeholder="请选择状态"
clearable
class="!w-240px"
>
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.MES_PLAN_STATUS)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="计划开始时间" prop="planStartTime">
<el-date-picker
v-model="queryParams.planStartTime"
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="planEndTime">
<el-date-picker
v-model="queryParams.planEndTime"
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="startTime">
<el-date-picker
v-model="queryParams.startTime"
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="endTime">
<el-date-picker
v-model="queryParams.endTime"
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="生产主管ID" prop="productionManagerId">
<el-input
v-model="queryParams.productionManagerId"
placeholder="请输入生产主管ID"
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="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 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:plan:create']"
>
<Icon icon="ep:plus" class="mr-5px" /> 新增
</el-button>
<el-button
type="success"
plain
@click="handleExport"
:loading="exportLoading"
v-hasPermi="['mes:plan: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="code" />
<el-table-column label="产品ID" align="center" prop="productId" />
<el-table-column label="任务单明细ID" align="center" prop="taskDetailId" />
<el-table-column label="任务单ID" align="center" prop="taskId" />
<el-table-column label="数量" align="center" prop="planNumber" />
<el-table-column label="成品数量" align="center" prop="finishNumber" />
<el-table-column label="状态" align="center" prop="status">
<template #default="scope">
<dict-tag :type="DICT_TYPE.MES_PLAN_STATUS" :value="scope.row.status" />
</template>
</el-table-column>
<el-table-column
label="计划开始时间"
align="center"
prop="planStartTime"
:formatter="dateFormatter"
width="180px"
/>
<el-table-column
label="计划结束时间"
align="center"
prop="planEndTime"
:formatter="dateFormatter"
width="180px"
/>
<el-table-column
label="实际开始时间"
align="center"
prop="startTime"
:formatter="dateFormatter"
width="180px"
/>
<el-table-column
label="实际结束时间"
align="center"
prop="endTime"
:formatter="dateFormatter"
width="180px"
/>
<el-table-column label="生产主管ID" align="center" prop="productionManagerId" />
<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="['mes:plan:update']"
>
编辑
</el-button>
<el-button
link
type="danger"
@click="handleDelete(scope.row.id)"
v-hasPermi="['mes:plan: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>
<!-- 表单弹窗添加/修改 -->
<PlanForm ref="formRef" @success="getList" />
</template>
<script setup lang="ts">
import { getIntDictOptions, getBoolDictOptions, DICT_TYPE } from '@/utils/dict'
import { dateFormatter } from '@/utils/formatTime'
import download from '@/utils/download'
import { PlanApi, PlanVO } from '@/api/mes/plan'
import PlanForm from './PlanForm.vue'
/** 生产计划 列表 */
defineOptions({ name: 'Plan' })
const message = useMessage() //
const { t } = useI18n() //
const loading = ref(true) //
const list = ref<PlanVO[]>([]) //
const total = ref(0) //
const queryParams = reactive({
pageNo: 1,
pageSize: 10,
code: undefined,
productId: undefined,
taskDetailId: undefined,
taskId: undefined,
planNumber: undefined,
finishNumber: undefined,
status: undefined,
planStartTime: [],
planEndTime: [],
startTime: [],
endTime: [],
productionManagerId: undefined,
remark: undefined,
isEnable: undefined,
createTime: []
})
const queryFormRef = ref() //
const exportLoading = ref(false) //
/** 查询列表 */
const getList = async () => {
loading.value = true
try {
const data = await PlanApi.getPlanPage(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 PlanApi.deletePlan(id)
message.success(t('common.delSuccess'))
//
await getList()
} catch {}
}
/** 导出按钮操作 */
const handleExport = async () => {
try {
//
await message.exportConfirm()
//
exportLoading.value = true
const data = await PlanApi.exportPlan(queryParams)
download.excel(data, '生产计划.xls')
} catch {
} finally {
exportLoading.value = false
}
}
/** 初始化 **/
onMounted(() => {
getList()
})
</script>

@ -0,0 +1,152 @@
<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="code">
<el-input v-model="formData.code" placeholder="请输入编码" />
</el-form-item>
<el-form-item label="下达日期" prop="orderDate">
<el-date-picker
v-model="formData.orderDate"
type="date"
value-format="x"
placeholder="选择下达日期"
/>
</el-form-item>
<el-form-item label="交货日期" prop="deliveryDate">
<el-date-picker
v-model="formData.deliveryDate"
type="date"
value-format="x"
placeholder="选择交货日期"
/>
</el-form-item>
<el-form-item label="状态" prop="status">
<el-radio-group v-model="formData.status">
<el-radio
v-for="dict in getIntDictOptions(DICT_TYPE.MES_TASK_STATUS)"
:key="dict.value"
:label="dict.value"
>
{{ dict.label }}
</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="流程实例的编号" prop="processInstanceId">
<el-input v-model="formData.processInstanceId" 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 { getIntDictOptions, getBoolDictOptions, DICT_TYPE } from '@/utils/dict'
import { TaskApi, TaskVO } from '@/api/mes/task'
/** 生产任务单 表单 */
defineOptions({ name: 'TaskForm' })
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,
code: undefined,
orderDate: undefined,
deliveryDate: undefined,
status: undefined,
processInstanceId: undefined,
remark: undefined,
isEnable: undefined
})
const formRules = reactive({
code: [{ required: true, message: '编码不能为空', trigger: 'blur' }],
deliveryDate: [{ required: true, message: '交货日期不能为空', trigger: 'blur' }],
status: [{ required: true, message: '状态不能为空', trigger: 'blur' }],
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 TaskApi.getTask(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 TaskVO
if (formType.value === 'create') {
await TaskApi.createTask(data)
message.success(t('common.createSuccess'))
} else {
await TaskApi.updateTask(data)
message.success(t('common.updateSuccess'))
}
dialogVisible.value = false
//
emit('success')
} finally {
formLoading.value = false
}
}
/** 重置表单 */
const resetForm = () => {
formData.value = {
id: undefined,
code: undefined,
orderDate: undefined,
deliveryDate: undefined,
status: undefined,
processInstanceId: undefined,
remark: undefined,
isEnable: undefined
}
formRef.value?.resetFields()
}
</script>

@ -0,0 +1,126 @@
<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="产品ID" prop="productId">
<el-input v-model="formData.productId" placeholder="请输入产品ID" />
</el-form-item>
<el-form-item label="单位ID" prop="unitId">
<el-input v-model="formData.unitId" placeholder="请输入单位ID" />
</el-form-item>
<el-form-item label="数量" prop="number">
<el-input v-model="formData.number" placeholder="请输入数量" />
</el-form-item>
<el-form-item label="打包要求(每包/个)" prop="packageSize">
<el-input v-model="formData.packageSize" placeholder="请输入打包要求(每包/个)" />
</el-form-item>
<el-form-item label="项目名称" prop="projectName">
<el-input v-model="formData.projectName" placeholder="请输入项目名称" />
</el-form-item>
<el-form-item label="技术要求" prop="techRequirements">
<el-input v-model="formData.techRequirements" 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 { TaskApi } from '@/api/mes/task'
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,
productId: undefined,
unitId: undefined,
taskId: undefined,
number: undefined,
packageSize: undefined,
projectName: undefined,
techRequirements: undefined,
remark: undefined
})
const formRules = reactive({
productId: [{ required: true, message: '产品ID不能为空', trigger: 'blur' }],
unitId: [{ required: true, message: '单位ID不能为空', trigger: 'blur' }],
taskId: [{ required: true, message: 'task ID不能为空', trigger: 'blur' }],
number: [{ required: true, message: '数量不能为空', trigger: 'blur' }],
packageSize: [{ required: true, message: '打包要求(每包/个)不能为空', trigger: 'blur' }]
})
const formRef = ref() // Ref
/** 打开弹窗 */
const open = async (type: string, id?: number, taskId: number) => {
dialogVisible.value = true
dialogTitle.value = t('action.' + type)
formType.value = type
resetForm()
formData.value.taskId = taskId
//
if (id) {
formLoading.value = true
try {
formData.value = await TaskApi.getTaskDetail(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
if (formType.value === 'create') {
await TaskApi.createTaskDetail(data)
message.success(t('common.createSuccess'))
} else {
await TaskApi.updateTaskDetail(data)
message.success(t('common.updateSuccess'))
}
dialogVisible.value = false
//
emit('success')
} finally {
formLoading.value = false
}
}
/** 重置表单 */
const resetForm = () => {
formData.value = {
id: undefined,
productId: undefined,
unitId: undefined,
taskId: undefined,
number: undefined,
packageSize: undefined,
projectName: undefined,
techRequirements: undefined,
remark: undefined
}
formRef.value?.resetFields()
}
</script>

@ -0,0 +1,133 @@
<template>
<!-- 列表 -->
<ContentWrap>
<el-button
type="primary"
plain
@click="openForm('create')"
v-hasPermi="['mes:task:create']"
>
<Icon icon="ep:plus" class="mr-5px" /> 新增
</el-button>
<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="产品ID" align="center" prop="productId" />
<el-table-column label="单位ID" align="center" prop="unitId" />
<el-table-column label="数量" align="center" prop="number" />
<el-table-column label="打包要求(每包/个)" align="center" prop="packageSize" />
<el-table-column label="项目名称" align="center" prop="projectName" />
<el-table-column label="技术要求" align="center" prop="techRequirements" />
<el-table-column label="备注" align="center" prop="remark" />
<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:task:update']"
>
编辑
</el-button>
<el-button
link
type="danger"
@click="handleDelete(scope.row.id)"
v-hasPermi="['mes:task: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>
<!-- 表单弹窗添加/修改 -->
<TaskDetailForm ref="formRef" @success="getList" />
</template>
<script setup lang="ts">
import { dateFormatter } from '@/utils/formatTime'
import { TaskApi } from '@/api/mes/task'
import TaskDetailForm from './TaskDetailForm.vue'
const { t } = useI18n() //
const message = useMessage() //
const props = defineProps<{
taskId?: number // task ID
}>()
const loading = ref(false) //
const list = ref([]) //
const total = ref(0) //
const queryParams = reactive({
pageNo: 1,
pageSize: 10,
taskId: undefined as unknown
})
/** 监听主表的关联字段的变化,加载对应的子表数据 */
watch(
() => props.taskId,
(val: number) => {
if (!val) {
return
}
queryParams.taskId = val
handleQuery()
},
{ immediate: true, deep: true }
)
/** 查询列表 */
const getList = async () => {
loading.value = true
try {
const data = await TaskApi.getTaskDetailPage(queryParams)
list.value = data.list
total.value = data.total
} finally {
loading.value = false
}
}
/** 搜索按钮操作 */
const handleQuery = () => {
queryParams.pageNo = 1
getList()
}
/** 添加/修改操作 */
const formRef = ref()
const openForm = (type: string, id?: number) => {
if (!props.taskId) {
message.error('请选择一个生产任务单')
return
}
formRef.value.open(type, id, props.taskId)
}
/** 删除按钮操作 */
const handleDelete = async (id: number) => {
try {
//
await message.delConfirm()
//
await TaskApi.deleteTaskDetail(id)
message.success(t('common.delSuccess'))
//
await getList()
} catch {}
}
</script>

@ -0,0 +1,284 @@
<template>
<ContentWrap>
<!-- 搜索工作栏 -->
<el-form
class="-mb-15px"
:model="queryParams"
ref="queryFormRef"
:inline="true"
label-width="68px"
>
<el-form-item label="编码" prop="code">
<el-input
v-model="queryParams.code"
placeholder="请输入编码"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="下达日期" prop="orderDate">
<el-date-picker
v-model="queryParams.orderDate"
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="deliveryDate">
<el-date-picker
v-model="queryParams.deliveryDate"
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="status">
<el-select
v-model="queryParams.status"
placeholder="请选择状态"
clearable
class="!w-240px"
>
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.MES_TASK_STATUS)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="流程实例的编号" prop="processInstanceId">
<el-input
v-model="queryParams.processInstanceId"
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="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:task:create']"
>
<Icon icon="ep:plus" class="mr-5px" /> 新增
</el-button>
<el-button
type="success"
plain
@click="handleExport"
:loading="exportLoading"
v-hasPermi="['mes:task: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"
highlight-current-row
@current-change="handleCurrentChange"
>
<el-table-column label="ID" align="center" prop="id" />
<el-table-column label="编码" align="center" prop="code" />
<el-table-column label="下达日期" align="center" prop="orderDate" :formatter="dateFormatter2" />
<el-table-column label="交货日期" align="center" prop="deliveryDate" :formatter="dateFormatter2"/>
<el-table-column label="状态" align="center" prop="status">
<template #default="scope">
<dict-tag :type="DICT_TYPE.MES_TASK_STATUS" :value="scope.row.status" />
</template>
</el-table-column>
<el-table-column label="流程实例的编号" align="center" prop="processInstanceId" />
<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="['mes:task:update']"
>
编辑
</el-button>
<el-button
link
type="danger"
@click="handleDelete(scope.row.id)"
v-hasPermi="['mes:task: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>
<!-- 表单弹窗添加/修改 -->
<TaskForm ref="formRef" @success="getList" />
<!-- 子表的列表 -->
<ContentWrap>
<el-tabs model-value="taskDetail">
<el-tab-pane label="生产任务单明细" name="taskDetail">
<TaskDetailList :task-id="currentRow.id" />
</el-tab-pane>
</el-tabs>
</ContentWrap>
</template>
<script setup lang="ts">
import { getIntDictOptions, DICT_TYPE } from '@/utils/dict'
import { dateFormatter, dateFormatter2 } from '@/utils/formatTime'
import download from '@/utils/download'
import { TaskApi, TaskVO } from '@/api/mes/task'
import TaskForm from './TaskForm.vue'
import TaskDetailList from './components/TaskDetailList.vue'
/** 生产任务单 列表 */
defineOptions({ name: 'Task' })
const message = useMessage() //
const { t } = useI18n() //
const loading = ref(true) //
const list = ref<TaskVO[]>([]) //
const total = ref(0) //
const queryParams = reactive({
pageNo: 1,
pageSize: 10,
code: undefined,
orderDate: [],
deliveryDate: [],
status: undefined,
processInstanceId: undefined,
remark: undefined,
createTime: []
})
const queryFormRef = ref() //
const exportLoading = ref(false) //
/** 查询列表 */
const getList = async () => {
loading.value = true
try {
const data = await TaskApi.getTaskPage(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 TaskApi.deleteTask(id)
message.success(t('common.delSuccess'))
//
await getList()
} catch {}
}
/** 导出按钮操作 */
const handleExport = async () => {
try {
//
await message.exportConfirm()
//
exportLoading.value = true
const data = await TaskApi.exportTask(queryParams)
download.excel(data, '生产任务单.xls')
} catch {
} finally {
exportLoading.value = false
}
}
/** 选中行操作 */
const currentRow = ref({}) //
const handleCurrentChange = (row) => {
currentRow.value = row
}
/** 初始化 **/
onMounted(() => {
getList()
})
</script>
Loading…
Cancel
Save