heli-mes/mes-ui/mes-ui-admin-vue3/src/views/heli/plantask/edit.vue

504 lines
20 KiB
Vue
Raw Normal View History

2025-01-09 18:29:48 +08:00
<template>
<el-card class="hl-card" style="position: relative">
<template #header>
<span><span v-html="dialogTitle"></span></span>
</template>
<el-form ref="formRef" :model="formData" label-width="160px" v-loading="formLoading">
<el-card class="hl-card-info">
<template #header>
<div class="hl-card-info-icona"></div><span class="hl-card-info-text">基础信息</span>
</template>
<el-row>
<el-col :span="24">
<el-row>
<el-col :span="6">
<el-row>
<el-col :span="24">
<el-form-item label="生产任务单号" prop="taskNo">
<el-input class="!w-265px" placeholder="系统自动生成" v-model="formData.taskNo" disabled />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<el-form-item label="项目名称" prop="projectName">
<el-input class="!w-265px" placeholder="项目名称" v-model="formData.projectName" disabled />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<el-form-item label="BOM清单号" prop="bomCode">
<el-input class="!w-265px" placeholder="" v-model="formData.bomCode" disabled />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="80">
<el-form-item label="子项目数量" prop="projectSubNum">
<el-input disabled v-model="formData.projectSubNum" show-word-limit class="!w-265px"/>
</el-form-item>
</el-col>
</el-row>
</el-col>
<el-col :span="6">
<el-row>
<el-col :span="24">
<el-form-item label="生产计划单号" prop="planNo">
<el-input class="!w-265px" placeholder="生产计划单号" v-model="formData.planNo" disabled />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<el-form-item label="项目结束日期" prop="projectEndTime">
<el-date-picker class="!w-265px" v-model="formData.projectEndTime" type="date" value-format="x" placeholder="项目结束日期" disabled />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<el-form-item label="BOM版本号" prop="bomVersion">
<el-input class="!w-265px" placeholder="BOM版本号" v-model="formData.bomVersion" disabled>
<template #append v-if="refreshStatus == 1"><el-button @click="handleReFresh" style="background-color:var(--el-color-primary); color:#fff">
<Icon icon="ep:refresh" />
</el-button></template>
</el-input>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="80">
<el-form-item label="备注" prop="description">
<el-input :disabled="detailDisabled" class="!w-713px" type="textarea" v-model="formData.description" show-word-limit maxlength="200" />
</el-form-item>
</el-col>
</el-row>
</el-col>
<el-col :span="6">
<el-row>
<el-col :span="24">
<el-form-item label="项目编号" prop="projectCode">
<el-input class="!w-265px" placeholder="项目编号" v-model="formData.projectCode" disabled />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<el-form-item label="子项目名称" prop="projectSubName">
<el-input class="!w-265px" placeholder="子项目名称" v-model="formData.projectSubName" disabled />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<el-form-item label="创建时间" prop="createTime">
<el-date-picker class="!w-265px" v-model="formData.createTime" type="date" value-format="x" placeholder="创建时间" disabled />
</el-form-item>
</el-col>
</el-row>
</el-col>
<el-col :span="6">
<el-row>
<el-col :span="24">
<el-form-item label="客户名称" prop="customerName">
<el-input class="!w-265px" v-model="formData.customerName" placeholder="客户名称" disabled />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<el-form-item label="子项目编号" prop="projectSubCode">
<el-input class="!w-265px" v-model="formData.projectSubCode" placeholder="子项目编号" disabled />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<el-form-item label="单据状态" prop="status">
<el-select v-model="formData.status" placeholder="单据状态" clearable class="!w-265px" disabled>
<el-option v-for="dict in getIntDictOptions(DICT_TYPE.HELI_BOM_STATUS)" :key="dict.value" :label="dict.label" :value="dict.value" />
</el-select>
</el-form-item>
</el-col>
</el-row>
</el-col>
</el-row>
</el-col>
</el-row>
</el-card>
<!-- 表格类信息 -->
<el-card class="hl-card-info">
<template #header>
<div class="hl-card-info-icona"></div><span class="hl-card-info-text">任务明细</span>
</template>
<el-row>
<el-col>
<el-card class="hl-incard">
<el-form ref="subFormRef" :model="formData.bomDetails" :rules="subFormRules" v-loading="formLoading" label-width="0" >
<el-table :row-class-name="tableRowClassName" :data="formData.bomDetails" >
<el-table-column label="序号" type="index" min-width="50px" />
<el-table-column label="变更次数" prop="bomEditStatus" max-width="60px" align="center">
<template #default="{ row}">
<el-text class="mx-1" max-width="60px">{{row.bomOperateCount==0?'无':'第'+row.bomOperateCount+'次'}}</el-text>
</template>
</el-table-column>
<!-- <el-table-column v-if="formData.bomStatus == 2|| formData.bomStatus == 7" style="text-align: center" label="库存" prop="amount" min-width="150"> -->
<el-table-column
style="text-align: center"
label="变更履历"
max-width="70px"
:show-overflow-tooltip="true"
>
<template #header>
<span class="hl-table_header">*</span>变更履历
</template>
<template #default="{ row}">
<span class="memo-content">{{ row.memo }}</span>
<!-- <el-tooltip
class="box-item"
effect="dark"
placement="top-end"
:content="row.memo"
>
<el-button link>备注</el-button> -->
<!-- </el-tooltip> -->
</template>
</el-table-column>
<el-table-column label="零件名称" prop="materialName" max-width="80px"/>
<el-table-column label="是否标准件" prop="typeName" max-width="100px" />
<el-table-column label="材质" prop="compositionName" max-width="80px"/>
<el-table-column label="规格型号" prop="spec" max-width="80px"/>
<el-table-column label="图号" prop="blueprintNo" max-width="50px"/>
<el-table-column label="数量" prop="amount" max-width="50px"/>
<el-table-column label="BOM状态" prop="bomEditStatus">
<template #default="{ row, $index }">
<el-form-item :prop="`${$index}.bomEditStatus`" class="mb-0px!">
<el-select class="!w-265px" v-model="row.bomEditStatus" disabled placeholder="下拉选择">
<el-option
v-for="dicts in heliBomStatusOptions" :key="dicts.value"
:label="dicts.label" :value="dicts.value" />
</el-select>
</el-form-item>
</template>
</el-table-column>
<el-table-column label="零件编码" prop="materialCode" max-width="80px"/>
<el-table-column label="系统单位" prop="unit">
<template #header> <span class="hl-table_header">*</span>系统单位</template>
<template #default="{ row, $index }">
<el-form-item :prop="`${$index}.unit`" class="mb-0px!">
<span v-if="row.type == '1'">{{ getDictLabel(DICT_TYPE.HELI_MATERIAL_UNIT, row.unit) }}</span>
<el-select disabled v-else v-model="row.unit" clearable class="!w-250px">
<el-option v-for="dict in getStrDictOptions(DICT_TYPE.HELI_MATERIAL_UNIT)" :key="dict.value" :label="dict.label" :value="dict.value" />
</el-select>
</el-form-item>
</template>
</el-table-column>
<el-table-column min-width="80px" align="center" fixed="right">
<template #header><span class="hl-table_header">*</span>负责人</template>
<template #default="{ row}">
<el-select :disabled="getDisable(row.bomEditStatus)" clearable filterable v-model="row.owner" placeholder="请选择负责人" style="width: 170px">
<el-option
v-for="item in ownerList"
:key="item.index"
:label="item.label"
:value="item.id"
/>
</el-select>
<!-- <el-form-item :prop="`${$index}.owner`" class="mb-0px!" :rules="subFormRules.owner">
<UserSelect :disabled="detailDisabled" v-model="row.owner" @update:new-value="handleSelectedUser9($index, $event)" class="!w-265px" />
</el-form-item> -->
</template>
</el-table-column>
<el-table-column min-width="120px" align="center" fixed="right">
<template #header><span class="hl-table_header">*</span>需求完成日期</template>
<template #default="{ row, $index }">
<el-form-item v-if="getDisable(row.bomEditStatus) == true" :prop="`${$index}.requireEndDate`" class="mb-0px!" >
<el-date-picker :disabled="getDisable(row.bomEditStatus)" class="!w-265px" v-model="row.requireEndDate" type="date" value-format="x" placeholder="需求完成日期" />
</el-form-item>
<el-form-item v-if="getDisable(row.bomEditStatus)==false" :prop="`${$index}.requireEndDate`" class="mb-0px!" :rules="subFormRules.requireEndDate">
2025-01-09 18:29:48 +08:00
<el-date-picker :disabled="getDisable(row.bomEditStatus)" class="!w-265px" v-model="row.requireEndDate" type="date" value-format="x" placeholder="需求完成日期" />
</el-form-item>
</template>
</el-table-column>
</el-table>
</el-form>
</el-card>
</el-col>
</el-row>
</el-card>
<el-card class="hl-card-info">
<template #header>
<div class="hl-card-info-icona"></div><span class="hl-card-info-text">操作日志</span>
</template>
<el-row>
<el-col>
<el-card class="hl-incard">
<el-table :data="formData.operateLogs" class="hl-table" :style="{ height: formData.operateLogs.length > 10 ? '450px' : '' }">
<el-table-column prop="type" label="操作" align="center" width="200px">
<template #default="scope">
{{ getDictLabel(DICT_TYPE.SYSTEM_OPERATE_TYPE, scope.row.type) }}
</template>
</el-table-column>
<el-table-column prop="userNickname" label="操作人" align="center" />
<el-table-column label="操作时间" align="center" prop="startTime" width="220" :formatter="dateFormatter" />
</el-table>
</el-card>
</el-col>
</el-row>
</el-card>
</el-form>
<div class="hl-footer text-center">
<el-button @click="() => router.back()" size="large"> </el-button>
<el-button v-if="pageType != 'detail' && formData.status == 1" @click="submitForm('SAVE')" type="primary" :disabled="formLoading" size="large"> </el-button>
<el-button v-if="pageType != 'detail' && formData.status == 1" @click="submitForm('SUBMIT')" type="success" :disabled="formLoading" size="large"> </el-button>
<el-button v-if="pageType != 'detail' && formData.status == 2" @click="submitForm('CANCEL_SUBMIT')" type="danger" :disabled="formLoading" size="large">取消提交</el-button>
</div>
</el-card>
</template>
<script setup lang="ts">
import { inject } from 'vue'
import { Search, Plus } from '@element-plus/icons-vue'
import { getIntDictOptions, getStrDictOptions, getDictLabel, DICT_TYPE } from '@/utils/dict'
import { betweenDay, formatDate, dateFormatter } from '@/utils/formatTime'
import { getOperateLogPage } from '@/api/system/operatelog'
import * as PlanTaskApi from '@/api/heli/plantask'
import * as PlanTaskBomApi from '@/api/heli/plantaskbom'
import UserSelect from '@/views/heli/hlvuestyle/userSelect.vue'
import * as TaskDispatchApi from '@/api/heli/taskdispatch'
import { get } from 'sortablejs'
const reload: any = inject('reload')
const { t } = useI18n() // 国际化
const message = useMessage() // 消息弹窗
const { query } = useRoute()
const router = useRouter()
const formLoading = ref(false) // 表单的加载中1修改时的数据加载2提交的按钮禁用
const formRef = ref() // 表单
const subFormRef = ref() //子表单 Ref
const formData = ref({
id: undefined,
active: undefined,
projectId: undefined,
projectPlanId: undefined,
projectPlanSubId: undefined,
processBomId: undefined,
taskNo: undefined,
planNo: undefined,
projectCode: undefined,
customerName: undefined,
projectName: undefined,
projectEndTime: undefined,
projectSubCode: undefined,
projectSubName: undefined,
bomCode: undefined,
bomVersion: undefined,
createTime: undefined,
description: undefined,
status: undefined,
operateLogs: [],
bomDetails: []
})
const getDisable = (bomEditStatus)=>{
if(bomEditStatus == 1){
return true;
}else{
return detailDisabled.value
}
}
const subFormRules = reactive({
owner: [{ required: true, message: '负责人不能为空', trigger: 'blur' }],
requireEndDate: [{ required: true, message: '要求完成日期不能为空', trigger: 'blur' }]
})
//接收物料传递的数据
const handleSelectedMaterial = (row: any, newValue: any) => {
row.materialId = newValue.id
row.materialName = newValue.name
row.materialCode = newValue.code
row.spec = newValue.spec
row.unit = newValue.unit
}
const heliBomStatusOptions = ref<bomEditStatusEnum[]>([
{ value: 0, label: '初始' },
{ value: 1, label: '删除' },
{ value: 2, label: '新增' },
{ value: 3, label: '增补' },
{ value: 4, label: '修改' },
]);
const submitForm = async (operate) => {
// 校验表单
await subFormRef.value.validate()
if (operate == 'SUBMIT' && formData.value.bomDetails.length == 0) {
message.alertWarning('任务明细不能为空')
return
}
// 提交请求
formLoading.value = true
try {
formData.value.active = operate
const data = formData.value as unknown as PlanTaskApi.PlanTaskVO
data.status = operate == 'SUBMIT' ? 2 : 1
await PlanTaskApi.updatePlanTask(data)
message.success(t('common.updateSuccess'))
// 发送操作成功的事件
emit('success')
} finally {
formLoading.value = false
reload()
}
}
const handleReFresh = async () => {
if(formData.value.status == 2){
message.alertWarning('请先取消提交,再点击此按钮!')
return
}
// 提交请求
formLoading.value = true
try {
await PlanTaskApi.refreshPlanTaskByPlanId(formData.value.projectPlanSubId)
} finally {
reload()
}
formLoading.value = false
}
const refreshStatus = ref()
const queryParams = reactive({
pageNo: 1,
pageSize: 99,
taskId: undefined
})
type OwnerListType = {
index: number;
id: number;
label: string;
};
const getOwnerListThis = async (): Promise<OwnerListType[]> => {
let tempList: any[];
let ownerList: OwnerListType[] = [];
tempList = personList.value;
if (tempList) {
tempList.forEach((item, index) => {
let key = Object.keys(item)[0];
let value = item[key] as string;
ownerList.push({ index: index + 1, id: Number(key), label: value });
});
}
return ownerList;
};
const dialogTitle = ref('')
const detailDisabled = ref(false)
const pageType = ref('')
const personList = ref([])
const ownerList = ref<OwnerListType[]>([]);
onMounted(async () => {
pageType.value = query.type
dialogTitle.value = t('action.' + query.type)
// 获取库存信息
formData.value = await PlanTaskApi.getPlanTask(query.id)
// 获得bom需要更新的状态
refreshStatus.value = await PlanTaskApi.getPlanTaskBomStatus(query.id)
personList.value = await TaskDispatchApi.getOwnerList(0,1);
ownerList.value = await getOwnerListThis();
queryParams.taskId = query.id
formData.value.bomDetails = (await PlanTaskBomApi.getPlanTaskBomPage(queryParams)).list
formData.value.bomDetails.forEach((item) => {
item.amount = formData.value.projectSubNum * item.amount;
item.typeName = item.type == 1 ? '是' : '否'
if(item.owner){
item.owner = Number(item.owner)
}
})
// 操作日志
let logParams = {
pageNo: 1,
pageSize: 99,
businessId: formData.value.id,
businessType: 'PLAN_TASK'
}
formData.value.operateLogs = (await getOperateLogPage(logParams)).list
if ('detail' == query.type || formData.value.status == 2) {
detailDisabled.value = true
}
})
const tableRowClassName = ({ row }) => {
switch (row.bomEditStatus) {
case 1:
return 'status-1';
case 2:
return 'status-2';
case 3:
return 'status-3';
case 4:
console.log('sss')
return 'status-4';
default:
return '';
}
}
// 责任人
const handleSelectedUser9 = (currentIndex, newValue: any) => {
formData.value.bomDetails[currentIndex].owner = newValue?.id
}
</script>
<style>
a {
color: #409eff;
text-decoration: none;
}
.upload-file-uploader {
margin-bottom: 10px;
display: inline-block;
margin-right: 20px;
}
.hl-card .alter-class {
position: relative;
border: solid 1px orange;
outline: solid 1px orange;
}
.el-form-item__content {
margin-left: 0px !important;
}
.status-1 {
background-color: #f2f2f2 !important;
}
.status-2 {
background-color: #90EE90 !important;
}
.status-3 {
background-color: #BBFFFF !important;
}
.status-4 {
background-color: #EE9A00 !important;
}
</style>