feat(mes): 优化 cal plan 的代码实现

pull/871/MERGE
YunaiV 2026-04-02 01:36:36 +08:00
parent 71c7d498f1
commit e41961283c
4 changed files with 60 additions and 29 deletions

View File

@ -6,7 +6,7 @@
:rules="formRules" :rules="formRules"
label-width="100px" label-width="100px"
v-loading="formLoading" v-loading="formLoading"
:disabled="formType === 'detail'" :disabled="isDetail"
> >
<el-row> <el-row>
<el-col :span="8"> <el-col :span="8">
@ -98,6 +98,7 @@
/> />
</el-form-item> </el-form-item>
</el-col> </el-col>
<!-- TODO @AI去掉状态的展示没意义 -->
<el-col :span="8"> <el-col :span="8">
<el-form-item label="状态" prop="status"> <el-form-item label="状态" prop="status">
<dict-tag :type="DICT_TYPE.MES_CAL_PLAN_STATUS" :value="formData.status" /> <dict-tag :type="DICT_TYPE.MES_CAL_PLAN_STATUS" :value="formData.status" />
@ -113,16 +114,16 @@
</el-row> </el-row>
</el-form> </el-form>
<!-- 编辑/查看时显示子资源 Tab --> <!-- 编辑/查看时显示子资源 Tab -->
<el-tabs v-if="formType === 'update' || formType === 'detail'" v-model="activeTab" class="mt-10px"> <el-tabs v-if="formType === 'update' || isDetail" v-model="activeTab" class="mt-10px">
<el-tab-pane label="班次" name="shift"> <el-tab-pane label="班次" name="shift">
<CalShiftList :plan-id="formData.id!" :readonly="formType === 'detail'" /> <CalShiftList :plan-id="formData.id!" :readonly="isDetail" />
</el-tab-pane> </el-tab-pane>
<el-tab-pane label="班组" name="team"> <el-tab-pane label="班组" name="team">
<CalPlanTeamList :plan-id="formData.id!" :readonly="formType === 'detail'" /> <CalPlanTeamList :plan-id="formData.id!" :readonly="isDetail" />
</el-tab-pane> </el-tab-pane>
</el-tabs> </el-tabs>
<template #footer> <template #footer>
<template v-if="formType !== 'detail'"> <template v-if="!isDetail">
<!-- 确认按钮仅草稿状态显示 --> <!-- 确认按钮仅草稿状态显示 -->
<el-button <el-button
v-if="formType === 'update' && formData.status === MesCalPlanStatusEnum.PREPARE" v-if="formType === 'update' && formData.status === MesCalPlanStatusEnum.PREPARE"
@ -145,25 +146,33 @@
<script setup lang="ts"> <script setup lang="ts">
import { getIntDictOptions, DICT_TYPE } from '@/utils/dict' import { getIntDictOptions, DICT_TYPE } from '@/utils/dict'
import { CalPlanApi, CalPlanVO } from '@/api/mes/cal/plan' import { CalPlanApi, CalPlanVO } from '@/api/mes/cal/plan'
import { generateRandomStr } from '@/utils'
import { import {
MesCalPlanStatusEnum, MesCalPlanStatusEnum,
MesCalShiftTypeEnum, MesCalShiftTypeEnum,
MesCalShiftMethodEnum MesCalShiftMethodEnum,
MesAutoCodeRuleCode
} from '@/views/mes/utils/constants' } from '@/views/mes/utils/constants'
import { AutoCodeRecordApi } from '@/api/mes/md/autocode/record'
import CalShiftList from './CalShiftList.vue' import CalShiftList from './CalShiftList.vue'
import CalPlanTeamList from './CalPlanTeamList.vue' import CalPlanTeamList from './CalPlanTeamList.vue'
// TODO @AIisDetail compute
defineOptions({ name: 'CalPlanForm' }) defineOptions({ name: 'CalPlanForm' })
const { t } = useI18n() // const { t } = useI18n() //
const message = useMessage() // const message = useMessage() //
const dialogVisible = ref(false) // const dialogVisible = ref(false) //
const dialogTitle = ref('') //
const formLoading = ref(false) // const formLoading = ref(false) //
const formType = ref('') // create - update - const formType = ref('') // create - update - detail -
const isDetail = computed(() => formType.value === 'detail') //
const dialogTitle = computed(() => {
const titles = {
create: '新增排班计划',
update: '修改排班计划',
detail: '查看排班计划'
}
return titles[formType.value] || formType.value
}) //
const activeTab = ref('shift') // Tab const activeTab = ref('shift') // Tab
const formData = ref({ const formData = ref({
id: undefined, id: undefined,
@ -189,16 +198,13 @@ const formRules = reactive({
const formRef = ref() const formRef = ref()
/** 生成计划编码 */ /** 生成计划编码 */
const generateCode = () => { const generateCode = async () => {
// TODO @AI formData.value.code = await AutoCodeRecordApi.generateAutoCode(MesAutoCodeRuleCode.CAL_PLAN_CODE)
formData.value.code = 'PLAN' + generateRandomStr(8)
} }
/** 打开弹窗 */ /** 打开弹窗 */
const open = async (type: string, id?: number) => { const open = async (type: string, id?: number) => {
dialogVisible.value = true dialogVisible.value = true
// TODO @AIdialogtitle compute
dialogTitle.value = type === 'detail' ? '查看' : t('action.' + type)
formType.value = type formType.value = type
resetForm() resetForm()
// / // /

View File

@ -25,7 +25,7 @@
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
<!-- TODO @AI右边成员 --> <!-- TODO @AI右边成员后端接口可以加你加下 -->
<!-- 表单弹窗添加/修改 --> <!-- 表单弹窗添加/修改 -->
<Dialog :title="dialogTitle" v-model="dialogVisible" width="500px"> <Dialog :title="dialogTitle" v-model="dialogVisible" width="500px">
@ -66,7 +66,7 @@ defineOptions({ name: 'CalPlanTeamList' })
const props = defineProps<{ const props = defineProps<{
planId: number // planId: number //
readonly?: boolean // TODO @AI formType readonly?: boolean // DONE @AI formType isDetail readonly
}>() }>()
const { t } = useI18n() // const { t } = useI18n() //

View File

@ -1,7 +1,6 @@
<template> <template>
<ContentWrap> <ContentWrap>
<!-- 搜索工作栏 --> <!-- 搜索工作栏 -->
<!-- TODO @AI开始时间结束时间 -->
<el-form <el-form
class="-mb-15px" class="-mb-15px"
:model="queryParams" :model="queryParams"
@ -27,6 +26,28 @@
class="!w-240px" class="!w-240px"
/> />
</el-form-item> </el-form-item>
<el-form-item label="开始日期" prop="startDate">
<el-date-picker
v-model="queryParams.startDate"
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="endDate">
<el-date-picker
v-model="queryParams.endDate"
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="shiftType"> <el-form-item label="轮班方式" prop="shiftType">
<el-select <el-select
v-model="queryParams.shiftType" v-model="queryParams.shiftType"
@ -79,27 +100,31 @@
<!-- 列表 --> <!-- 列表 -->
<ContentWrap> <ContentWrap>
<el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true"> <el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true">
<!-- TODO @AI编码查看不用查看按钮 --> <el-table-column label="计划编码" align="center" prop="code" min-width="120">
<el-table-column label="计划编码" align="center" prop="code" min-width="120" /> <template #default="scope">
<el-link type="primary" @click="openForm('detail', scope.row.id)">
{{ scope.row.code }}
</el-link>
</template>
</el-table-column>
<el-table-column label="计划名称" align="center" prop="name" min-width="150" /> <el-table-column label="计划名称" align="center" prop="name" min-width="150" />
<el-table-column label="班组类型" align="center" prop="calendarType" min-width="100"> <el-table-column label="班组类型" align="center" prop="calendarType" min-width="100">
<template #default="scope"> <template #default="scope">
<dict-tag :type="DICT_TYPE.MES_CAL_CALENDAR_TYPE" :value="scope.row.calendarType" /> <dict-tag :type="DICT_TYPE.MES_CAL_CALENDAR_TYPE" :value="scope.row.calendarType" />
</template> </template>
</el-table-column> </el-table-column>
<!-- TODO @AIdateFormatter2dateFormatter2 -->
<el-table-column <el-table-column
label="开始日期" label="开始日期"
align="center" align="center"
prop="startDate" prop="startDate"
:formatter="dateFormatter" :formatter="dateFormatter2"
width="180px" width="180px"
/> />
<el-table-column <el-table-column
label="结束日期" label="结束日期"
align="center" align="center"
prop="endDate" prop="endDate"
:formatter="dateFormatter" :formatter="dateFormatter2"
width="180px" width="180px"
/> />
<el-table-column label="轮班方式" align="center" prop="shiftType" min-width="100"> <el-table-column label="轮班方式" align="center" prop="shiftType" min-width="100">
@ -124,11 +149,8 @@
:formatter="dateFormatter" :formatter="dateFormatter"
width="180px" width="180px"
/> />
<el-table-column label="操作" align="center" width="150"> <el-table-column label="操作" align="center" width="120">
<template #default="scope"> <template #default="scope">
<el-button link type="primary" @click="openForm('detail', scope.row.id)">
查看
</el-button>
<el-button <el-button
v-if="scope.row.status === MesCalPlanStatusEnum.PREPARE" v-if="scope.row.status === MesCalPlanStatusEnum.PREPARE"
link link
@ -164,7 +186,7 @@
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import { dateFormatter } from '@/utils/formatTime' import { dateFormatter, dateFormatter2 } from '@/utils/formatTime'
import download from '@/utils/download' import download from '@/utils/download'
import { CalPlanApi, CalPlanVO } from '@/api/mes/cal/plan' import { CalPlanApi, CalPlanVO } from '@/api/mes/cal/plan'
import CalPlanForm from './CalPlanForm.vue' import CalPlanForm from './CalPlanForm.vue'
@ -184,6 +206,8 @@ const queryParams = reactive({
pageSize: 10, pageSize: 10,
code: undefined, code: undefined,
name: undefined, name: undefined,
startDate: undefined,
endDate: undefined,
shiftType: undefined, shiftType: undefined,
status: undefined status: undefined
}) })

View File

@ -445,7 +445,8 @@ export const MesAutoCodeRuleCode = {
WM_STOCK_TAKING_CODE: 'WM_STOCK_TAKING_CODE', // 盘点任务编码 WM_STOCK_TAKING_CODE: 'WM_STOCK_TAKING_CODE', // 盘点任务编码
TRANSFER_CODE: 'TRANSFER_CODE', // 转移调拨单编码 TRANSFER_CODE: 'TRANSFER_CODE', // 转移调拨单编码
WM_OUTSOURCE_ISSUE_CODE: 'WM_OUTSOURCE_ISSUE_CODE', // 外协发料单编码 WM_OUTSOURCE_ISSUE_CODE: 'WM_OUTSOURCE_ISSUE_CODE', // 外协发料单编码
CAL_TEAM_CODE: 'CAL_TEAM_CODE' // 班组编码 CAL_TEAM_CODE: 'CAL_TEAM_CODE', // 班组编码
CAL_PLAN_CODE: 'CAL_PLAN_CODE' // 排班计划编码
} as const } as const
/** 获取物料/产品标识的标签 */ /** 获取物料/产品标识的标签 */