feat(mes): 新增生产工单编码及状态管理功能

新增生产工单编码规则和状态管理逻辑,优化工单创建和更新流程。
同时,更新前端表单以支持新的工单状态和来源单据字段,提升用户体验。
pull/871/MERGE
YunaiV 2026-04-04 10:15:26 +08:00
parent 469363c046
commit b2d86b12d6
3 changed files with 41 additions and 9 deletions

View File

@ -79,7 +79,7 @@
<el-form-item label="工单数量" prop="quantity"> <el-form-item label="工单数量" prop="quantity">
<el-input-number <el-input-number
v-model="formData.quantity" v-model="formData.quantity"
:min="0" :min="1"
:precision="2" :precision="2"
class="!w-1/1" class="!w-1/1"
:disabled="isDetail" :disabled="isDetail"
@ -169,13 +169,17 @@
<script setup lang="ts"> <script setup lang="ts">
import { getIntDictOptions, DICT_TYPE } from '@/utils/dict' import { getIntDictOptions, DICT_TYPE } from '@/utils/dict'
import { ProWorkOrderApi, ProWorkOrderVO } from '@/api/mes/pro/workorder' import { ProWorkOrderApi, ProWorkOrderVO } from '@/api/mes/pro/workorder'
import { generateRandomStr } from '@/utils' import { AutoCodeRecordApi } from '@/api/mes/md/autocode/record'
import MdItemSelect from '@/views/mes/md/item/components/MdItemSelect.vue' import MdItemSelect from '@/views/mes/md/item/components/MdItemSelect.vue'
import MdClientSelect from '@/views/mes/md/client/components/MdClientSelect.vue' import MdClientSelect from '@/views/mes/md/client/components/MdClientSelect.vue'
import MdVendorSelect from '@/views/mes/md/vendor/components/MdVendorSelect.vue' import MdVendorSelect from '@/views/mes/md/vendor/components/MdVendorSelect.vue'
import WorkOrderBomList from './WorkOrderBomList.vue' import WorkOrderBomList from './WorkOrderBomList.vue'
import WorkOrderItemList from './WorkOrderItemList.vue' import WorkOrderItemList from './WorkOrderItemList.vue'
import { MesProWorkOrderSourceTypeEnum, MesProWorkOrderTypeEnum } from '@/views/mes/utils/constants' import {
MesProWorkOrderSourceTypeEnum,
MesProWorkOrderTypeEnum,
MesAutoCodeRuleCode
} from '@/views/mes/utils/constants'
defineOptions({ name: 'WorkOrderForm' }) defineOptions({ name: 'WorkOrderForm' })
@ -219,13 +223,16 @@ const formRef = ref() // 表单 Ref
const isDetail = computed(() => formType.value === 'detail') const isDetail = computed(() => formType.value === 'detail')
/** 生成工单编码 */ /** 生成工单编码 */
const generateCode = () => { const generateCode = async () => {
formData.value.code = 'MO' + generateRandomStr(10) formData.value.code = await AutoCodeRecordApi.generateAutoCode(
MesAutoCodeRuleCode.PRO_WORK_ORDER_CODE
)
} }
/** 打开弹窗 */ /** 打开弹窗 */
const open = async (type: string, id?: number, parentRow?: any) => { const open = async (type: string, id?: number, parentRow?: any) => {
dialogVisible.value = true dialogVisible.value = true
// todo @AI compute formData.parentid + type
dialogTitle.value = parentRow dialogTitle.value = parentRow
? '新增子工单' ? '新增子工单'
: type === 'detail' : type === 'detail'

View File

@ -27,6 +27,15 @@
class="!w-240px" class="!w-240px"
/> />
</el-form-item> </el-form-item>
<el-form-item label="来源单据" prop="orderSourceCode">
<el-input
v-model="queryParams.orderSourceCode"
placeholder="请输入来源单据编号"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="产品" prop="productId"> <el-form-item label="产品" prop="productId">
<MdItemSelect v-model="queryParams.productId" placeholder="请选择产品" class="!w-240px" /> <MdItemSelect v-model="queryParams.productId" placeholder="请选择产品" class="!w-240px" />
</el-form-item> </el-form-item>
@ -48,7 +57,22 @@
/> />
</el-select> </el-select>
</el-form-item> </el-form-item>
<!-- TODO @AI前后端筛选去掉 status 状态 -->
<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_PRO_WORK_ORDER_STATUS)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="需求日期" prop="requestDate"> <el-form-item label="需求日期" prop="requestDate">
<el-date-picker <el-date-picker
v-model="queryParams.requestDate" v-model="queryParams.requestDate"
@ -125,8 +149,6 @@
<el-table-column label="已生产数量" align="center" prop="quantityProduced" width="100" /> <el-table-column label="已生产数量" align="center" prop="quantityProduced" width="100" />
<el-table-column label="客户编码" align="center" prop="clientCode" width="120" /> <el-table-column label="客户编码" align="center" prop="clientCode" width="120" />
<el-table-column label="客户名称" align="center" prop="clientName" width="120" /> <el-table-column label="客户名称" align="center" prop="clientName" width="120" />
<el-table-column label="供应商编码" align="center" prop="vendorCode" width="120" />
<el-table-column label="批次号" align="center" prop="batchCode" width="120" />
<el-table-column <el-table-column
label="需求日期" label="需求日期"
align="center" align="center"
@ -267,6 +289,8 @@ const queryParams = reactive({
productId: undefined, productId: undefined,
clientId: undefined, clientId: undefined,
type: undefined, type: undefined,
status: undefined,
orderSourceCode: undefined,
requestDate: undefined requestDate: undefined
}) })
const queryFormRef = ref() // const queryFormRef = ref() //

View File

@ -453,7 +453,8 @@ export const MesAutoCodeRuleCode = {
DV_MACHINERY_TYPE_CODE: 'DV_MACHINERY_TYPE_CODE', // 设备类型编码 DV_MACHINERY_TYPE_CODE: 'DV_MACHINERY_TYPE_CODE', // 设备类型编码
DV_CHECK_PLAN_CODE: 'DV_CHECK_PLAN_CODE', // 点检保养方案编码 DV_CHECK_PLAN_CODE: 'DV_CHECK_PLAN_CODE', // 点检保养方案编码
DV_SUBJECT_CODE: 'DV_SUBJECT_CODE', // 点检保养项目编码 DV_SUBJECT_CODE: 'DV_SUBJECT_CODE', // 点检保养项目编码
DV_REPAIR_CODE: 'DV_REPAIR_CODE' // 维修单编码 DV_REPAIR_CODE: 'DV_REPAIR_CODE', // 维修单编码
PRO_WORK_ORDER_CODE: 'PRO_WORK_ORDER_CODE' // 生产工单编码
} as const } as const
/** 获取物料/产品标识的标签 */ /** 获取物料/产品标识的标签 */