feat(oa/erp): 添加项目计划编辑页面路由配置

- 实现项目计划查看页面路由配置
- 固定项目计划状态选择器为只读状态
- 增加基础数据加载控制与缓存机制
- 实现表单数据重置与刷新通知功能
- 添加列表页面数据刷新检查机制
- 引入 onActivated 生命周期优化数据加载
- 完善合同总价计算与默认值处理
- 优化审批流程回调与页面跳转逻辑
dev
zangch@mesnac.com 1 month ago
parent a6f5edea4b
commit 070d61f490

@ -102,7 +102,19 @@ export const constantRoutes: RouteRecordRaw[] = [
{ {
path: 'contractInfo/edit', path: 'contractInfo/edit',
component: () => import('@/views/oa/erp/contractInfo/edit.vue'), component: () => import('@/views/oa/erp/contractInfo/edit.vue'),
name: 'edit', name: 'ContractInfoEdit',
},
{
path: 'erpProjectPlan/edit/:projectPlanId',
component: () => import('@/views/oa/erp/erpProjectPlan/edit.vue'),
name: 'ErpProjectPlanEdit',
meta: { title: '项目计划编辑', activeMenu: '/oa/erp/erpProjectPlan' }
},
{
path: 'erpProjectPlan/view/:projectPlanId',
component: () => import('@/views/oa/erp/erpProjectPlan/edit.vue'),
name: 'ErpProjectPlanView',
meta: { title: '项目计划查看', activeMenu: '/oa/erp/erpProjectPlan' }
} }
] ]
}, },

@ -76,7 +76,8 @@
</el-col> </el-col>
<el-col :span="12"> <el-col :span="12">
<el-form-item label="项目计划状态" prop="projectPlanStatus"> <el-form-item label="项目计划状态" prop="projectPlanStatus">
<el-select v-model="form.projectPlanStatus" placeholder="请选择项目计划状态" :disabled="!isBasicEditable"> <!-- <el-select v-model="form.projectPlanStatus" placeholder="请选择项目计划状态" :disabled="!isBasicEditable"> -->
<el-select v-model="form.projectPlanStatus" placeholder="请选择项目计划状态" :disabled="true">
<el-option v-for="dict in project_plan_status" :key="dict.value" :label="dict.label" :value="dict.value"></el-option> <el-option v-for="dict in project_plan_status" :key="dict.value" :label="dict.label" :value="dict.value"></el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
@ -169,7 +170,7 @@
</template> </template>
<script setup lang="ts" name="ErpProjectPlanEdit"> <script setup lang="ts" name="ErpProjectPlanEdit">
import { ref, reactive, onMounted, getCurrentInstance, watch, computed } from 'vue'; import { ref, reactive, onMounted, onActivated, getCurrentInstance, watch, computed } from 'vue';
import { useRoute, useRouter } from 'vue-router'; import { useRoute, useRouter } from 'vue-router';
import { getErpProjectPlan, addErpProjectPlan, updateErpProjectPlan, projectPlanSubmitAndFlowStart } from '@/api/oa/erp/erpProjectPlan'; import { getErpProjectPlan, addErpProjectPlan, updateErpProjectPlan, projectPlanSubmitAndFlowStart } from '@/api/oa/erp/erpProjectPlan';
import { ErpProjectPlanForm } from '@/api/oa/erp/erpProjectPlan/types'; import { ErpProjectPlanForm } from '@/api/oa/erp/erpProjectPlan/types';
@ -187,6 +188,7 @@ const { project_plan_status , project_phases, collection_stage } = toRefs<any>(
const route = useRoute(); const route = useRoute();
const router = useRouter(); const router = useRouter();
const userStore = useUserStore(); const userStore = useUserStore();
const refreshFlagKey = 'erpProjectPlanListShouldRefresh';
// //
const submitVerifyRef = ref<InstanceType<typeof SubmitVerify>>(); const submitVerifyRef = ref<InstanceType<typeof SubmitVerify>>();
@ -206,12 +208,6 @@ const syncRouteParams = () => {
}; };
syncRouteParams(); syncRouteParams();
watch(
() => route.fullPath,
() => {
syncRouteParams();
}
);
// approvalButtonpageType'edit''update' // approvalButtonpageType'edit''update'
const approvalPageType = computed(() => { const approvalPageType = computed(() => {
@ -295,8 +291,9 @@ const projectInfoList = ref<any[]>([]);
const userList = ref<any[]>([]); const userList = ref<any[]>([]);
const contractInfoList = ref<any[]>([]); const contractInfoList = ref<any[]>([]);
const contractTotalPrice = ref<number>(0); const contractTotalPrice = ref<number>(0);
const baseDataLoaded = ref(false);
const form = ref<ErpProjectPlanForm>({ const createEmptyForm = (): ErpProjectPlanForm => ({
projectPlanId: undefined, projectPlanId: undefined,
projectId: undefined, projectId: undefined,
managerId: undefined, managerId: undefined,
@ -309,11 +306,22 @@ const form = ref<ErpProjectPlanForm>({
planStageList: [] planStageList: []
}); });
const form = ref<ErpProjectPlanForm>(createEmptyForm());
const rules = reactive({ const rules = reactive({
projectId: [{ required: true, message: '请选择项目', trigger: 'change' }], projectId: [{ required: true, message: '请选择项目', trigger: 'change' }],
managerId: [{ required: true, message: '请选择项目经理', trigger: 'change' }] managerId: [{ required: true, message: '请选择项目经理', trigger: 'change' }]
}); });
const notifyListRefresh = () => {
sessionStorage.setItem(refreshFlagKey, Date.now().toString());
};
const resetForm = () => {
form.value = createEmptyForm();
contractTotalPrice.value = 0;
};
/** 获取项目列表 */ /** 获取项目列表 */
const getProjectInfoList = async () => { const getProjectInfoList = async () => {
const res = await getErpProjectInfoList({}); const res = await getErpProjectInfoList({});
@ -332,6 +340,14 @@ const getContractInfoList = async () => {
contractInfoList.value = res.data; contractInfoList.value = res.data;
}; };
const initBaseData = async () => {
if (baseDataLoaded.value) {
return;
}
await Promise.all([getProjectInfoList(), getUserList(), getContractInfoList()]);
baseDataLoaded.value = true;
};
/** 添加阶段 */ /** 添加阶段 */
const handleAddStage = () => { const handleAddStage = () => {
const newStage = { const newStage = {
@ -470,6 +486,7 @@ const submitForm = async (status = 'draft') => {
form.value = res.data; form.value = res.data;
buttonLoading.value = false; buttonLoading.value = false;
proxy?.$modal.msgSuccess('操作成功'); proxy?.$modal.msgSuccess('操作成功');
notifyListRefresh();
proxy?.$tab.closePage(); proxy?.$tab.closePage();
router.go(-1); router.go(-1);
} else { } else {
@ -485,6 +502,7 @@ const submitForm = async (status = 'draft') => {
} }
buttonLoading.value = false; buttonLoading.value = false;
proxy?.$modal.msgSuccess('暂存成功'); proxy?.$modal.msgSuccess('暂存成功');
notifyListRefresh();
proxy?.$tab.closePage(); proxy?.$tab.closePage();
router.go(-1); router.go(-1);
} }
@ -536,6 +554,7 @@ const saveLimited = () => {
} }
await updateErpProjectPlan(form.value); await updateErpProjectPlan(form.value);
proxy?.$modal.msgSuccess('保存成功'); proxy?.$modal.msgSuccess('保存成功');
notifyListRefresh();
proxy?.$tab.closePage(); proxy?.$tab.closePage();
router.go(-1); router.go(-1);
} finally { } finally {
@ -544,54 +563,76 @@ const saveLimited = () => {
}); });
}; };
/** 审批对话框 */
const approvalVerifyOpen = async () => {
await submitVerifyRef.value?.openDialog(routeParams.value.taskId);
};
const loadFormData = async () => {
await initBaseData();
syncRouteParams();
const projectPlanId = routeParams.value.projectPlanId;
draftLoading.value = false;
submitLoading.value = false;
buttonLoading.value = false;
if (projectPlanId && projectPlanId !== '0') {
const res = await getErpProjectPlan(projectPlanId as string);
form.value = res.data;
if (!form.value.flowStatus) {
form.value.flowStatus = 'draft';
}
if (!form.value.planStageList) {
form.value.planStageList = [];
}
if (form.value.contractId) {
const contract = contractInfoList.value.find(c => c.contractId === form.value.contractId);
if (contract) {
contractTotalPrice.value = contract.totalPrice || 0;
} else {
contractTotalPrice.value = 0;
}
} else {
contractTotalPrice.value = 0;
}
} else {
resetForm();
form.value.flowStatus = 'draft';
}
};
/** 返回列表 */ /** 返回列表 */
const goBack = () => { const goBack = () => {
router.back(); router.back();
}; };
/** 初始化数据 */ /** 审批记录 */
const initData = async () => {
await Promise.all([getProjectInfoList(), getUserList(), getContractInfoList()]);
syncRouteParams();
const projectPlanId = routeParams.value.projectPlanId;
if (projectPlanId && projectPlanId !== '0') {
const res = await getErpProjectPlan(projectPlanId as string);
form.value = res.data;
// flowStatusapprovalButton
if (!form.value.flowStatus) {
form.value.flowStatus = 'draft';
}
//
if (form.value.contractId) {
const contract = contractInfoList.value.find(c => c.contractId === form.value.contractId);
if (contract) {
contractTotalPrice.value = contract.totalPrice || 0;
}
}
}
};
//
const approvalVerifyOpen = async () => {
await submitVerifyRef.value?.openDialog(routeParams.value.taskId);
};
//
const handleApprovalRecord = () => { const handleApprovalRecord = () => {
approvalRecordRef.value?.init(form.value.projectPlanId); approvalRecordRef.value?.init(form.value.projectPlanId);
}; };
// //
const submitCallback = async () => { const submitCallback = async () => {
notifyListRefresh();
await proxy?.$tab.closePage(route); await proxy?.$tab.closePage(route);
router.go(-1); router.go(-1);
}; };
watch(
() => route.fullPath,
() => {
loadFormData();
}
);
onMounted(() => { onMounted(() => {
initData(); loadFormData();
});
onActivated(() => {
loadFormData();
}); });
</script> </script>

@ -176,6 +176,7 @@
import { listUser } from '@/api/system/user'; import { listUser } from '@/api/system/user';
import { getErpProjectInfoList } from '@/api/oa/erp/projectInfo'; import { getErpProjectInfoList } from '@/api/oa/erp/projectInfo';
import { getErpContractInfoList } from '@/api/oa/erp/contractInfo'; import { getErpContractInfoList } from '@/api/oa/erp/contractInfo';
import { onActivated } from 'vue';
import { useRouter } from 'vue-router'; import { useRouter } from 'vue-router';
import ApprovalRecord from '@/components/Process/approvalRecord.vue'; import ApprovalRecord from '@/components/Process/approvalRecord.vue';
@ -184,6 +185,7 @@
const { active_flag, project_plan_status , project_phases, collection_stage} = toRefs<any>(proxy?.useDict('active_flag', 'project_plan_status', 'project_phases', 'collection_stage')); const { active_flag, project_plan_status , project_phases, collection_stage} = toRefs<any>(proxy?.useDict('active_flag', 'project_plan_status', 'project_phases', 'collection_stage'));
const approvalRecordRef = ref<InstanceType<typeof ApprovalRecord>>(); const approvalRecordRef = ref<InstanceType<typeof ApprovalRecord>>();
const refreshFlagKey = 'erpProjectPlanListShouldRefresh';
const erpProjectPlanList = ref<ErpProjectPlanVO[]>([]); const erpProjectPlanList = ref<ErpProjectPlanVO[]>([]);
const projectInfoList = ref<any[]>([]); const projectInfoList = ref<any[]>([]);
@ -271,6 +273,15 @@
loading.value = false; loading.value = false;
} }
/** 检查是否需要刷新列表 */
const checkShouldRefresh = () => {
const flag = sessionStorage.getItem(refreshFlagKey);
if (flag) {
sessionStorage.removeItem(refreshFlagKey);
handleQuery();
}
}
/** 获取项目列表 */ /** 获取项目列表 */
const getProjectInfoList = async () => { const getProjectInfoList = async () => {
const res = await getErpProjectInfoList({}); const res = await getErpProjectInfoList({});
@ -407,5 +418,10 @@
getProjectInfoList(); getProjectInfoList();
getUserList(); getUserList();
getContractInfoList(); getContractInfoList();
checkShouldRefresh();
});
onActivated(() => {
checkShouldRefresh();
}); });
</script> </script>

Loading…
Cancel
Save