项目周报流程完善

dev
lh 1 week ago
parent 599b544d50
commit e047db3cbd

@ -221,6 +221,16 @@ export const getUserList = (query: UserQuery): AxiosPromise<UserVO[]> => {
});
};
/**
* id
*/
export const listUserByDeptAndRole = (query: any): AxiosPromise<any> => {
return request({
url: '/system/user/listByDeptAndRole',
method: 'get',
params: query
});
};
export default {
listUser,
@ -239,5 +249,6 @@ export default {
updateAuthRole,
deptTreeSelect,
listUserByDeptId,
getUserList
getUserList,
listUserByDeptAndRole
};

@ -22,7 +22,7 @@ export enum CodeRuleEnum {
*/
AFTER_SALES = '1012',
PROJECT_REPORT = '1011'
PROJECT_REPORT = '1013'
}
/**

@ -12,6 +12,8 @@
:pageType="routeParams.type"
:mode="false"
/>
</el-card>
<el-card shadow="never">
<el-form
ref="projectFormRef"
:model="form"
@ -23,7 +25,17 @@
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="项目名称" prop="projectName">
<el-input v-model="form.projectName" placeholder="请输入项目名称" />
<el-input v-model="form.projectName" placeholder="请输入项目名称" :disabled="routeParams.reportData && routeParams.type === 'add'">
<template #suffix>
<el-icon
style="cursor: pointer; margin-right: 4px; font-size: 14px"
@click="openProjectSelect"
v-show="!routeParams.reportData && routeParams.type === 'add'"
>
<Search />
</el-icon>
</template>
</el-input>
</el-form-item>
</el-col>
<el-col :span="12">
@ -38,22 +50,22 @@
</el-col>
<el-col :span="12">
<el-form-item label="项目经理" prop="managerName">
<el-input v-model="form.managerName" placeholder="请输入项目经理" />
<el-input v-model="form.managerName" placeholder="请输入项目经理" :disabled="routeParams.type === 'add'" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="部门" prop="deptName">
<el-input v-model="form.deptName" placeholder="请输入部门" />
<el-input v-model="form.deptName" placeholder="请输入部门" :disabled="routeParams.type === 'add'" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="部门负责人" prop="chargeName">
<el-input v-model="form.chargeName" placeholder="请输入部门负责人" />
<el-input v-model="form.chargeName" placeholder="请输入部门负责人" :disabled="routeParams.type === 'add'" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="分管副总" prop="deputyName">
<el-input v-model="form.deputyName" placeholder="请输入分管副总" />
<el-input v-model="form.deputyName" placeholder="请输入分管副总" :disabled="routeParams.type === 'add'" />
</el-form-item>
</el-col>
<el-col :span="12">
@ -115,6 +127,8 @@
</el-form>
</el-card>
<ProjectSelect ref="projectSelectRef" :multiple="false" @confirm-call-back="projectInfoSelectCallBack"></ProjectSelect>
<!-- 项目周报具体信息管理区域 -->
<el-card shadow="never" style="margin-top: 20px">
<template #header>
@ -124,12 +138,14 @@
<!-- 项目周报具体信息表格 -->
<div style="margin-bottom: 16px">
<el-button
type="primary"
icon="Plus"
v-if="!hasReportDetails && routeParams.type !== 'view' && routeParams.type !== 'approval' && routeParams.type !== 'add'"
@click="handleAddReport"
>新增周报
</el-button>
type="warning"
plain
icon="Download"
@click="handleExport"
v-hasPermi="['oa/erp:projectReportDetail:export']"
v-if="routeParams.type === 'view'"
>导出</el-button
>
</div>
<el-table v-loading="buttonLoading" border :data="projectReportDetailList" v-if="routeParams.type !== 'add' && routeParams.type !== 'approval'">
<el-table-column label="项目周报明细ID" align="center" prop="reportDetailId" v-if="columns[0].visible" />
@ -146,10 +162,18 @@
<el-table-column label="本周完成工作" align="center" prop="tasksCompleted" v-if="columns[7].visible" />
<el-table-column label="下周计划" align="center" prop="nextPlan" v-if="columns[8].visible" />
<el-table-column label="风险及解决措施" align="center" prop="riskResolution" v-if="columns[9].visible" />
<el-table-column label="项目状态" align="center" prop="scheduleStatus" v-if="columns[12].visible">
<template #default="scope">
<dict-tag :options="project_risk_status" :value="scope.row.scheduleStatus" />
</template>
</el-table-column>
<el-table-column label="计划完成率" align="center" prop="plannedCompletionRate" v-if="columns[10].visible" />
<el-table-column label="周报情况说明" align="center" prop="informationNote" v-if="columns[11].visible" />
<el-table-column label="项目状态" align="center" prop="scheduleStatus" v-if="columns[12].visible" />
<el-table-column label="周报状态(1暂存 2审批中 3可用)" align="center" prop="projectReportStatus" v-if="columns[13].visible" />
<el-table-column label="周报状态(1暂存 2审批中 3可用)" align="center" prop="projectReportStatus" v-if="columns[13].visible">
<template #default="scope">
<dict-tag :options="project_report_status" :value="scope.row.projectReportStatus" />
</template>
</el-table-column>
<el-table-column label="流程状态" align="center" prop="flowStatus" v-if="columns[14].visible" />
<el-table-column label="排序号" align="center" prop="sortOrder" v-if="columns[15].visible" />
<el-table-column label="项目阶段(预留)" align="center" prop="projectPhases" v-if="columns[16].visible" />
@ -186,12 +210,20 @@
</el-col>
<el-col :span="12">
<el-form-item label="填写日期" prop="fillTime">
<el-date-picker clearable v-model="projectReportForm.fillTime" type="date" value-format="YYYY-MM-DD" placeholder="请选择填写日期" />
<el-date-picker
clearable
v-model="datePart"
type="date"
format="YYYY-MM-DD"
value-format="YYYY-MM-DD"
placeholder="请选择填写日期"
@change="handleDateChange"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="所在的工作周" prop="currentWorkWeek">
<el-input v-model="projectReportForm.currentWorkWeek" placeholder="请输入所在的工作周" clearable @keyup.enter="console.log(1)" />
<el-input v-model="projectReportForm.currentWorkWeek" placeholder="请输入所在的工作周" clearable />
</el-form-item>
</el-col>
<el-col :span="12">
@ -235,8 +267,10 @@
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="项目阶段" prop="projectPhases">
<el-input v-model="projectReportForm.projectPhases" placeholder="请输入项目阶段" clearable />
<el-form-item label="项目状态" prop="scheduleStatus">
<el-select v-model="projectReportForm.scheduleStatus" placeholder="请选择项目状态" clearable>
<el-option v-for="dict in project_risk_status" :key="dict.value" :label="dict.label" :value="dict.value" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
@ -249,7 +283,7 @@
<el-input v-model="projectReportForm.ossId" placeholder="请输入附件ID" clearable />
</el-form-item>
</el-col>
<el-col :span="12">
<el-col :span="12" v-show="false">
<el-form-item label="激活标识" prop="activeFlag">
<el-input v-model="projectReportForm.activeFlag" placeholder="请输入激活标识" clearable />
</el-form-item>
@ -352,8 +386,6 @@
</template>
<script setup name="ContractInfoEdit" lang="ts">
import { addContractInfo, contractSubmitAndFlowStart, getContractInfo, updateContractInfo } from '@/api/oa/erp/contractInfo';
import { ContractInfoForm } from '@/api/oa/erp/contractInfo/types';
import { ContractMaterialVO, ContractprojectReportForm } from '@/api/oa/erp/contractMaterial/types';
import { getBaseUnitInfoList } from '@/api/oa/base/unitInfo';
import { getRuleGenerateCode } from '@/api/system/codeRule';
@ -385,6 +417,7 @@ import {
ProjectReportDetailFormEx
} from '@/api/oa/erp/projectReportDetail/types';
import { fa } from 'element-plus/es/locale/index.mjs';
import ProjectSelect from '@/components/ProjectSelect/index.vue';
const { proxy } = getCurrentInstance() as ComponentInternalInstance;
const route = useRoute();
@ -392,12 +425,12 @@ const router = useRouter();
//
const routeParams = ref<Record<string, any>>({});
const { contract_category, business_direction, contract_flag, contract_type, contract_status, plan_flag } = toRefs<any>(
proxy?.useDict('contract_category', 'business_direction', 'contract_flag', 'contract_type', 'contract_status', 'plan_flag')
);
const { project_report_status, project_risk_status } = toRefs<any>(proxy?.useDict('project_report_status', 'project_risk_status'));
const buttonLoading = ref(false);
const projectFormRef = ref<ElFormInstance>();
//
const projectSelectRef = ref<InstanceType<typeof ProjectSelect>>();
//
const submitVerifyRef = ref<InstanceType<typeof SubmitVerify>>();
@ -418,6 +451,12 @@ const flowInstanceBizExtBo = ref<Record<string, any>>({});
const type = ref(0);
const total = ref(0);
//
const CACHE_KEYS = {
PROJECT_REPORT_DRAFT: 'project_report_draft_data',
PROJECT_REPORT_DETAIL_DRAFT: 'project_report_detail_draft_data'
};
//
const initFormData: ProjectReportForm = {
reportId: undefined,
@ -482,6 +521,47 @@ const dialog = reactive<DialogOption>({
title: ''
});
const projectReportList = ref<ProjectReportVO[]>([]);
//
const openProjectSelect = () => {
projectSelectRef.value.open();
};
/** 查询项目周报信息列表 */
const getList = async () => {
// loading.value = true;
const res = await listProjectReport(queryParams.value);
projectReportList.value = res.rows;
total.value = res.total;
// loading.value = false;
};
//
const projectInfoSelectCallBack = (data: any) => {
if (data.length > 0) {
setFromProjectInfo(data);
getList();
} else {
projectFormRef.value?.resetFields();
proxy?.$modal.msgWarning('请选择项目信息');
getList();
}
};
//
const setFromProjectInfo = (data: any) => {
const projectInfoList = data;
form.value.projectId = projectInfoList[0].projectId;
form.value.projectName = projectInfoList[0].projectName;
form.value.projectCode = projectInfoList[0].projectCode;
form.value.managerId = projectInfoList[0].managerId;
form.value.milestonePlan = projectInfoList[0].milestonePlan;
form.value.deptId = projectInfoList[0].deptId;
form.value.chargeId = projectInfoList[0].chargeId;
form.value.deputyId = projectInfoList[0].deputyId;
form.value.managerName = projectInfoList[0].managerName;
form.value.deptName = projectInfoList[0].deptName;
form.value.chargeName = projectInfoList[0].chargeName;
form.value.deputyName = projectInfoList[0].deputyName;
};
/** 文件按钮操作 */
const handleFile = () => {
type.value = 0;
@ -529,9 +609,9 @@ const hasReportDetails = computed(() => {
//
const columns = ref<FieldOption[]>([
{ key: 0, label: `项目周报明细ID`, visible: true },
{ key: 1, label: `项目周报ID`, visible: true },
{ key: 2, label: `项目ID`, visible: true },
{ key: 0, label: `项目周报明细ID`, visible: false },
{ key: 1, label: `项目周报ID`, visible: false },
{ key: 2, label: `项目ID`, visible: false },
{ key: 3, label: `填写日期`, visible: true },
{ key: 4, label: `所在的工作周`, visible: true },
{ key: 5, label: `所属里程碑`, visible: true },
@ -544,12 +624,12 @@ const columns = ref<FieldOption[]>([
{ key: 12, label: `项目状态`, visible: true },
{ key: 13, label: `周报状态(1暂存 2审批中 3可用)`, visible: true },
{ key: 14, label: `流程状态`, visible: true },
{ key: 15, label: `排序号`, visible: true },
{ key: 16, label: `项目阶段(预留)`, visible: true },
{ key: 17, label: `合同ID(预留)`, visible: true },
{ key: 15, label: `排序号`, visible: false },
{ key: 16, label: `项目阶段(预留)`, visible: false },
{ key: 17, label: `合同ID(预留)`, visible: false },
{ key: 18, label: `附件ID`, visible: true },
{ key: 19, label: `备注`, visible: true },
{ key: 20, label: `激活标识`, visible: true },
{ key: 20, label: `激活标识`, visible: false },
{ key: 21, label: `删除标志`, visible: true },
{ key: 22, label: `创建部门`, visible: true },
{ key: 23, label: `创建时间`, visible: true },
@ -590,12 +670,36 @@ const initprojectReportFormData: ProjectReportDetailFormEx = {
} as any;
const projectReportForm = ref<ProjectReportDetailFormEx>({ ...initprojectReportFormData });
const projectReportFormQuery = ref<ProjectReportDetailQuery>({
pageNum: 1,
pageSize: 10,
reportId: undefined,
projectId: undefined,
fillTime: undefined,
currentWorkWeek: undefined,
milestonePlan: undefined,
secondaryPhase: undefined,
tasksCompleted: undefined,
nextPlan: undefined,
riskResolution: undefined,
plannedCompletionRate: undefined,
informationNote: undefined,
scheduleStatus: undefined,
projectReportStatus: undefined,
flowStatus: undefined,
sortOrder: undefined,
projectPhases: undefined,
contractId: undefined,
ossId: undefined,
activeFlag: undefined,
params: {}
});
//
const reportRules = {
tasksCompleted: [{ required: true, message: '本周完成工作不能为空', trigger: 'blur' }],
nextPlan: [{ required: true, message: '下周计划不能为空', trigger: 'blur' }],
riskResolution: [{ required: true, message: '风险及解决措施不能为空', trigger: 'blur' }]
secondaryPhase: [{ required: true, message: '二级进度阶段不能为空', trigger: 'blur' }]
};
//
@ -634,7 +738,16 @@ const handleDeleteMaterial = async (row: ContractMaterialVO) => {
console.error('删除合同物料失败:', error);
}
};
/** 导出按钮操作 */
const handleExport = () => {
proxy?.download(
'oa/erp/projectReportDetail/export',
{
...queryParams.value
},
`projectReportDetail_${new Date().getTime()}.xlsx`
);
};
//
const resetProjectReportForm = () => {
projectReportForm.value = { ...initprojectReportFormData };
@ -678,45 +791,125 @@ const submitProjectReportForm = () => {
}
});
};
//
const datePart = ref(''); // YYYY-MM-DD
onMounted(async () => {
nextTick(async () => {
//
routeParams.value = route.query;
//
const reportDataStr = routeParams.value.reportData as string;
if (reportDataStr && (routeParams.value.type === 'update' || routeParams.value.type === 'view' || routeParams.value.type === 'add')) {
proxy?.$modal.loading('正在加载数据,请稍后...');
const reportData = JSON.parse(decodeURIComponent(reportDataStr));
Object.assign(form.value, reportData);
Object.assign(projectReportForm.value, reportData);
// console.log(form.value);
// console.log(projectReportForm.value);
proxy?.$modal.closeLoading();
} else if (routeParams.value.type === 'add') {
} else if (routeParams.value.type === 'approval' || routeParams.value.type === 'view') {
//
const projectDetailReportId = routeParams.value.id;
if (projectDetailReportId) {
proxy?.$modal.loading('正在加载数据,请稍后...');
const reportDetailRes = await getProjectReportDetail(projectDetailReportId);
const reportId = reportDetailRes.data.reportId;
if (reportId && routeParams.value.type === 'view') {
const reportRes = await getProjectReport(reportId);
Object.assign(form.value, reportRes.data);
Object.assign(projectReportForm.value, reportDetailRes.data);
projectReportDetailList.value = [reportDetailRes.data];
// -
const getWorkWeek = (dateString) => {
if (!dateString) return '';
const date = new Date(dateString);
if (isNaN(date.getTime())) {
return '';
}
const year = date.getFullYear();
const firstDayOfYear = new Date(year, 0, 1);
// 使
const timeDiff = date.getTime() - firstDayOfYear.getTime();
const days = Math.floor(timeDiff / (24 * 60 * 60 * 1000)) + 1;
//
const firstDayWeek = firstDayOfYear.getDay();
const isoFirstDayWeek = firstDayWeek === 0 ? 7 : firstDayWeek;
const weekNumber = Math.ceil((days + isoFirstDayWeek - 1) / 7);
// 0-1-...6-
const weekday = date.getDay();
const weekdays = ['周日', '周一', '周二', '周三', '周四', '周五', '周六'];
return `${weekdays[weekday]}`;
};
//
const initDefaultDate = () => {
if (routeParams.value.type === 'add') {
//
const cachedFormData = proxy?.$cache.local.getJSON(CACHE_KEYS.PROJECT_REPORT_DRAFT);
const cachedDetailData = proxy?.$cache.local.getJSON(CACHE_KEYS.PROJECT_REPORT_DETAIL_DRAFT);
if (cachedFormData) {
//
Object.assign(form.value, cachedFormData);
}
if (cachedDetailData) {
//
Object.assign(projectReportForm.value, cachedDetailData);
// fillTime
if (projectReportForm.value.fillTime) {
const [date] = projectReportForm.value.fillTime.split(' ');
if (date) {
datePart.value = date;
//
projectReportForm.value.currentWorkWeek = getWorkWeek(date);
}
if (reportId && routeParams.value.type === 'approval') {
const reportRes = await getProjectReport(reportId);
Object.assign(form.value, reportRes.data);
Object.assign(projectReportForm.value, reportDetailRes.data);
}
proxy?.$modal.closeLoading();
}
} else {
//
const now = new Date();
// YYYY-MM-DD
const year = now.getFullYear();
const month = String(now.getMonth() + 1).padStart(2, '0');
const day = String(now.getDate()).padStart(2, '0');
const dateStr = `${year}-${month}-${day}`;
// HH:mm:ss
const hours = String(now.getHours()).padStart(2, '0');
const minutes = String(now.getMinutes()).padStart(2, '0');
const seconds = String(now.getSeconds()).padStart(2, '0');
const timeStr = `${hours}:${minutes}:${seconds}`;
//
datePart.value = dateStr;
//
projectReportForm.value.fillTime = `${dateStr} ${timeStr}`;
//
projectReportForm.value.currentWorkWeek = getWorkWeek(dateStr);
}
}
};
//
const handleDateChange = (selectedDate) => {
if (selectedDate) {
//
const now = new Date();
const hours = String(now.getHours()).padStart(2, '0');
const minutes = String(now.getMinutes()).padStart(2, '0');
const seconds = String(now.getSeconds()).padStart(2, '0');
const timeStr = `${hours}:${minutes}:${seconds}`;
//
projectReportForm.value.fillTime = `${selectedDate} ${timeStr}`;
//
projectReportForm.value.currentWorkWeek = getWorkWeek(selectedDate);
} else {
//
projectReportForm.value.fillTime = '';
projectReportForm.value.currentWorkWeek = '';
}
};
// fillTime
watch(
() => projectReportForm.value.fillTime,
(newValue) => {
if (newValue && (routeParams.value.type === 'update' || routeParams.value.type === 'view' || routeParams.value.type === 'approval')) {
//
const [date] = newValue.split(' ');
if (date) {
datePart.value = date;
}
}
});
});
},
{ immediate: true }
);
//
const handleApprovalRecord = () => {
@ -746,12 +939,7 @@ watch(
}
);
const isCodeGenerated = ref(false);
//
const generateUniqueId = () => {
const timestamp = Date.now().toString(36);
const randomStr = Math.random().toString(36).substr(2, 9);
return `XMZB-${timestamp}-${randomStr}`;
};
//
const generateCode = async () => {
if (isCodeGenerated.value) return; //
@ -765,14 +953,122 @@ const generateCode = async () => {
proxy?.$modal.msgError('生成业务编号失败');
}
};
// 稿
const saveToDraftCache = () => {
try {
//
proxy?.$cache.local.setJSON(CACHE_KEYS.PROJECT_REPORT_DRAFT, form.value);
//
proxy?.$cache.local.setJSON(CACHE_KEYS.PROJECT_REPORT_DETAIL_DRAFT, projectReportForm.value);
console.log('草稿数据已保存到缓存');
} catch (error) {
console.error('保存草稿到缓存失败:', error);
}
};
// 稿
const loadFromDraftCache = () => {
try {
const cachedFormData = proxy?.$cache.local.getJSON(CACHE_KEYS.PROJECT_REPORT_DRAFT);
const cachedDetailData = proxy?.$cache.local.getJSON(CACHE_KEYS.PROJECT_REPORT_DETAIL_DRAFT);
if (cachedFormData) {
Object.assign(form.value, cachedFormData);
}
if (cachedDetailData) {
Object.assign(projectReportForm.value, cachedDetailData);
//
if (projectReportForm.value.fillTime) {
const [date] = projectReportForm.value.fillTime.split(' ');
if (date) {
datePart.value = date;
projectReportForm.value.currentWorkWeek = getWorkWeek(date);
}
}
}
return !!cachedFormData || !!cachedDetailData;
} catch (error) {
console.error('从缓存加载草稿失败:', error);
return false;
}
};
// 稿
const clearDraftCache = () => {
try {
proxy?.$cache.local.remove(CACHE_KEYS.PROJECT_REPORT_DRAFT);
proxy?.$cache.local.remove(CACHE_KEYS.PROJECT_REPORT_DETAIL_DRAFT);
console.log('草稿缓存已清除');
} catch (error) {
console.error('清除草稿缓存失败:', error);
}
};
//
const handleClearDraft = () => {
clearDraftCache();
proxy?.$modal.msgSuccess('草稿缓存已清除');
//
projectFormRef.value?.resetFields();
projectReportDetailFormRef.value?.resetFields();
datePart.value = '';
initDefaultDate();
};
/** 提交按钮 */
const submitForm = async (status: string, mode: boolean) => {
try {
buttonLoading.value = true;
//
let formValid = false;
let detailFormValid = false;
//
await new Promise((resolve) => {
projectFormRef.value?.validate((valid: boolean) => {
formValid = valid;
resolve(null);
});
});
if (!formValid) {
proxy?.$modal.msgError('请完善项目周报信息');
//
const errorFields = document.querySelector('.el-form-item__error');
if (errorFields) {
errorFields.scrollIntoView({ behavior: 'smooth', block: 'center' });
}
return;
}
//
await new Promise((resolve) => {
projectReportDetailFormRef.value?.validate((valid: boolean) => {
detailFormValid = valid;
resolve(null);
});
});
if (!detailFormValid) {
proxy?.$modal.msgError('请完善项目周报明细信息');
//
const errorFields = document.querySelector('.el-form-item__error');
if (errorFields) {
errorFields.scrollIntoView({ behavior: 'smooth', block: 'center' });
}
return;
}
// 稿
if (status != 'draft') {
//
projectReportForm.value.flowCode = FlowCodeEnum.PROJECT_REPRORT_CODE;
const msg = await generateCode();
//
projectReportForm.value.variables = {
projectId: projectReportForm.value.projectId,
@ -781,7 +1077,7 @@ const submitForm = async (status: string, mode: boolean) => {
//
projectReportForm.value.bizExt = {
businessTitle: '项目周报明细',
businessCode: generateUniqueId()
businessCode: msg
};
// 使
const requestData = {
@ -791,25 +1087,78 @@ const submitForm = async (status: string, mode: boolean) => {
projectReportForm.value.flowStatus = 'waiting';
const res = await projectReportSubmitAndFlowStart(requestData);
projectReportForm.value = { ...projectReportForm.value, ...res.data };
//
clearDraftCache();
proxy?.$modal.msgSuccess('操作成功');
proxy?.$tab.closePage();
router.go(-1);
} else {
//
if (status === 'draft') {
projectReportForm.value.flowStatus = 'draft';
//
saveToDraftCache();
}
// if (form.value.contractId) {
// await updateContractInfo(form.value).finally(() => (buttonLoading.value = false));
// } else {
// await addContractInfo(form.value).finally(() => (buttonLoading.value = false));
// }
buttonLoading.value = false;
proxy?.$modal.msgSuccess('暂存成功');
proxy?.$tab.closePage();
router.go(-1);
}
} catch (error) {
console.error('提交失败:', error);
proxy?.$modal.msgError('提交失败');
} finally {
buttonLoading.value = false;
}
};
onMounted(async () => {
nextTick(async () => {
//
routeParams.value = route.query;
//
const reportDataStr = routeParams.value.reportData as string;
if (reportDataStr && (routeParams.value.type === 'update' || routeParams.value.type === 'view' || routeParams.value.type === 'add')) {
proxy?.$modal.loading('正在加载数据,请稍后...');
const reportData = JSON.parse(decodeURIComponent(reportDataStr));
Object.assign(form.value, reportData);
if (routeParams.value.type === 'add') {
Object.assign(projectReportForm.value, reportData);
projectReportForm.value.informationNote = '';
} else if (routeParams.value.type === 'view') {
Object.assign(projectReportFormQuery.value, reportData);
const res = await listProjectReportDetail(projectReportFormQuery.value);
console.log()
projectReportDetailList.value = res.rows;
console.log(projectReportDetailList.value);
}
proxy?.$modal.closeLoading();
} else if (routeParams.value.type === 'add') {
//
initDefaultDate();
} else if (routeParams.value.type === 'approval' || routeParams.value.type === 'view') {
//
const projectDetailReportId = routeParams.value.id;
if (projectDetailReportId) {
proxy?.$modal.loading('正在加载数据,请稍后...');
const reportDetailRes = await getProjectReportDetail(projectDetailReportId);
const reportId = reportDetailRes.data.reportId;
if (reportId && routeParams.value.type === 'view') {
const reportRes = await getProjectReport(reportId);
Object.assign(form.value, reportRes.data);
Object.assign(projectReportForm.value, reportDetailRes.data);
projectReportDetailList.value = [reportDetailRes.data];
}
if (reportId && routeParams.value.type === 'approval') {
const reportRes = await getProjectReport(reportId);
Object.assign(form.value, reportRes.data);
Object.assign(projectReportForm.value, reportDetailRes.data);
}
proxy?.$modal.closeLoading();
}
}
});
});
</script>

@ -7,7 +7,7 @@
<el-row :gutter="10" class="form-row">
<el-col :span="12">
<el-form-item label="项目名称" prop="projectName">
<el-input v-model="queryParams.projectName" placeholder="请输入项目名称">
<el-input v-model="queryParams.projectName" placeholder="请输入项目名称" clearable @keyup.enter="handleQuery">
<!-- <template #suffix>
<el-icon style="cursor: pointer; margin-right: 4px; font-size: 14px" @click="openProjectSelect">
<Search />
@ -18,31 +18,31 @@
</el-col>
<el-col :span="12">
<el-form-item label="项目编号" prop="projectCode">
<el-input v-model="queryParams.projectCode" placeholder="请输入项目编号" clearable />
<el-input v-model="queryParams.projectCode" placeholder="请输入项目编号" clearable @keyup.enter="handleQuery" />
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="10" class="form-row">
<el-col :span="12">
<el-form-item label="项目经理" prop="managerName">
<el-input v-model="queryParams.managerName" placeholder="请输入项目经理" clearable />
<el-input v-model="queryParams.managerName" placeholder="请输入项目经理" clearable @keyup.enter="handleQuery" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="当前里程碑" prop="milestonePlan">
<el-input v-model="queryParams.milestonePlan" placeholder="请输入当前里程碑" clearable />
<el-input v-model="queryParams.milestonePlan" placeholder="请输入当前里程碑" clearable @keyup.enter="handleQuery" />
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="10" class="form-row">
<el-col :span="12">
<el-form-item label="部门名称" prop="deptName">
<el-input v-model="queryParams.deptName" placeholder="请输入部门名称" clearable />
<el-input v-model="queryParams.deptName" placeholder="请输入部门名称" clearable @keyup.enter="handleQuery" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="部门负责人" prop="chargeName">
<el-input v-model="queryParams.chargeName" placeholder="请输入部门负责人" clearable />
<el-input v-model="queryParams.chargeName" placeholder="请输入部门负责人" clearable @keyup.enter="handleQuery" />
</el-form-item>
</el-col>
<el-col :span="12" v-show="false">
@ -155,8 +155,8 @@
<el-table-column label="附件ID" align="center" prop="ossId" v-if="columns[11].visible" />
<el-table-column label="备注" align="center" prop="remark" v-if="columns[12].visible" />
<el-table-column label="激活标识" align="center" prop="activeFlag" v-if="columns[13].visible" />
<el-table-column label="创建时间" align="center" prop="createTime" v-if="columns[17].visible" />
<el-table-column label="更新时间" align="center" prop="updateTime" v-if="columns[19].visible" />
<el-table-column label="创建时间" align="center" prop="createTime" width="100" v-if="columns[17].visible" />
<el-table-column label="更新时间" align="center" prop="updateTime" width="100" v-if="columns[19].visible" />
<el-table-column label="操作" align="center" width="150" fixed="right" class-name="small-padding fixed-width">
<template #default="scope">
<el-tooltip content="新增" placement="top">
@ -182,6 +182,134 @@
</el-table>
<pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" />
<!-- 添加或修改项目周报信息对话框 -->
<el-dialog :title="dialog.title" v-model="dialog.visible" width="800px" append-to-body>
<el-form ref="projectReportFormRef" :model="form" :rules="rules" label-width="120px">
<el-row :gutter="10" class="form-row">
<el-col :span="12">
<el-form-item label="项目名称" prop="projectName">
<el-input v-model="form.projectName" placeholder="请输入项目名称" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="项目编码" prop="projectCode">
<el-input v-model="form.projectCode" placeholder="请输入项目编码" />
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="10" class="form-row">
<el-col :span="12">
<el-form-item label="当前里程碑" prop="milestonePlan">
<el-input v-model="form.milestonePlan" placeholder="请输入当前里程碑" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="部门" prop="deptId">
<el-select v-model="form.deptId" placeholder="请选择部门" clearable filterable :loading="loadingUsers" @change="handleDeptChange">
<el-option v-for="item in deptList" :key="item.deptId" :label="item.deptName" :value="item.deptId" />
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="10" class="form-row">
<el-col :span="12">
<el-form-item label="项目经理" prop="managerId">
<el-select
v-model="form.managerId"
placeholder="请选择项目经理"
clearable
filterable
:loading="loadingManagers"
:disabled="!form.deptId"
@change="handleManagerChange"
>
<el-option v-for="user in managerList" :key="user.nickName" :label="user.nickName" :value="user.userId" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="部门负责人" prop="chargeId">
<el-select
v-model="form.chargeId"
placeholder="请选择部门负责人"
clearable
filterable
:loading="loadingCharges"
:disabled="!form.deptId"
@change="handleChargeChange"
>
<el-option v-for="user in chargeList" :key="user.nickName" :label="user.nickName" :value="user.userId" />
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="10" class="form-row">
<el-col :span="12">
<el-form-item label="分管副总" prop="deputyId">
<el-select
v-model="form.deputyId"
placeholder="请选择分管副总"
clearable
filterable
:loading="loadingDeputies"
:disabled="!form.deptId"
@change="handleDeputyChange"
>
<el-option v-for="user in deputyList" :key="user.nickName" :label="user.nickName" :value="user.userId" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="12" v-show="false">
<el-form-item label="附件ID" prop="ossId">
<el-input v-model="form.ossId" placeholder="请输入附件ID" />
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="10" class="form-row" v-show="false">
<el-col :span="12" v-show="false">
<el-form-item label="排序号" prop="sortOrder">
<el-input v-model="form.sortOrder" placeholder="请输入排序号" />
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="10" class="form-row">
<el-col :span="12">
<el-form-item label="周报情况说明" prop="informationNote">
<el-input v-model="form.informationNote" type="textarea" placeholder="请输入内容" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="备注" prop="remark">
<el-input v-model="form.remark" type="textarea" placeholder="请输入备注" />
</el-form-item>
</el-col>
<el-col :span="12" v-show="false">
<el-form-item label="激活标识" prop="activeFlag">
<el-input v-model="form.activeFlag" placeholder="请输入激活标识" />
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="10" class="form-row" v-show="false">
<el-col :span="12">
<el-form-item label="项目ID" prop="projectId">
<el-input v-model="form.projectId" placeholder="请输入项目ID" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="项目经理" prop="managerId">
<el-input v-model="form.managerId" placeholder="请输入项目经理" />
</el-form-item>
</el-col>
</el-row>
</el-form>
<template #footer>
<div class="dialog-footer">
<el-button :loading="buttonLoading" type="primary" @click="submitForm"> </el-button>
<el-button @click="cancel"> </el-button>
</div>
</template>
</el-dialog>
</el-card>
</div>
</template>
@ -191,6 +319,9 @@ import { ProjectReportVO, ProjectReportQuery, ProjectReportForm } from '@/api/oa
import { listProjectReport, getProjectReport, delProjectReport, addProjectReport, updateProjectReport } from '@/api/oa/erp/projectReport';
import ProjectSelect from '@/components/ProjectSelect/index.vue';
import { report } from 'process';
import { fa } from 'element-plus/es/locale/index.mjs';
import { allListDept, listDept } from '@/api/system/dept';
import { listUserByDeptAndRole, listUserByDeptId } from '@/api/system/user';
const { proxy } = getCurrentInstance() as ComponentInternalInstance;
@ -229,7 +360,7 @@ const columns = ref<FieldOption[]>([
{ key: 9, label: `周报情况说明`, visible: true },
{ key: 10, label: `排序号`, visible: false },
{ key: 11, label: `附件ID`, visible: true },
{ key: 12, label: `备注`, visible: true },
{ key: 12, label: `备注`, visible: false },
{ key: 13, label: `激活标识`, visible: false },
{ key: 14, label: `删除标志`, visible: false },
{ key: 15, label: `创建部门`, visible: true },
@ -284,12 +415,141 @@ const data = reactive<PageData<ProjectReportForm, ProjectReportQuery>>({
params: {}
},
rules: {
projectName: [{ required: true, message: '项目名称不能为空', trigger: 'blur' }]
projectName: [{ required: true, message: '项目名称不能为空', trigger: 'blur' }],
projectCode: [{ required: true, message: '项目编码不能为空', trigger: 'blur' }]
}
});
const { queryParams, form, rules } = toRefs(data);
const deptList = ref<any[]>([]);
const managerList = ref<any[]>([]);
const chargeList = ref<any[]>([]);
const deputyList = ref<any[]>([]);
const loadingManagers = ref(false);
const loadingCharges = ref(false);
const loadingDeputies = ref(false);
const loadingUsers = ref(false);
//
const getDeptList = async () => {
try {
const res = await allListDept();
deptList.value = res.data || [];
} catch (error) {
console.error('获取部门列表失败:', error);
deptList.value = [];
}
};
//
const getManagers = async (deptId: number | string) => {
try {
loadingManagers.value = true;
const res = await listUserByDeptAndRole({
deptId: deptId,
roleName: ''
});
managerList.value = res.data || [];
} catch (error) {
console.error('获取项目经理列表失败:', error);
managerList.value = [];
} finally {
loadingManagers.value = false;
}
};
//
const getCharges = async (deptId: number | string) => {
try {
loadingCharges.value = true;
const res = await listUserByDeptAndRole({
deptId: deptId,
roleName: ''
});
chargeList.value = res.data || [];
} catch (error) {
console.error('获取部门负责人列表失败:', error);
chargeList.value = [];
} finally {
loadingCharges.value = false;
}
};
//
const getDeputies = async (deptId: number | string) => {
try {
loadingDeputies.value = true;
const res = await listUserByDeptAndRole({
deptId: deptId,
roleName: ''
});
deputyList.value = res.data || [];
} catch (error) {
console.error('获取分管副总列表失败:', error);
deputyList.value = [];
} finally {
loadingDeputies.value = false;
}
};
// ID
const getUsersByDept = async (deptId: number | string) => {
if (!deptId) {
managerList.value = [];
chargeList.value = [];
deputyList.value = [];
return;
}
try {
//
await Promise.all([getManagers(deptId), getCharges(deptId), getDeputies(deptId)]);
} catch (error) {
console.error('获取用户列表失败:', error);
}
};
//
const handleDeptChange = async (deptId: number | string) => {
//
form.value.managerId = undefined;
form.value.chargeId = undefined;
form.value.deputyId = undefined;
form.value.managerName = undefined;
form.value.chargeName = undefined;
form.value.deputyName = undefined;
//
await getUsersByDept(deptId);
//
const selectedDept = deptList.value.find((dept) => {
// ID
return String(dept.deptId) === String(deptId) || String(dept.id) === String(deptId);
});
if (selectedDept) {
form.value.deptName = selectedDept.deptName || selectedDept.label;
}
};
//
const handleManagerChange = (userId: number | string) => {
const selectedUser = managerList.value.find((user) => String(user.userId) === String(userId));
if (selectedUser) {
form.value.managerName = selectedUser.nickName || selectedUser.label;
}
};
const handleChargeChange = (userId: number | string) => {
const selectedUser = chargeList.value.find((user) => String(user.userId) === String(userId));
if (selectedUser) {
form.value.chargeName = selectedUser.nickName || selectedUser.label;
}
};
const handleDeputyChange = (userId: number | string) => {
const selectedUser = deputyList.value.find((user) => String(user.userId) === String(userId));
if (selectedUser) {
form.value.deputyName = selectedUser.nickName || selectedUser.label;
}
};
//
const openProjectSelect = () => {
projectSelectRef.value.open();
@ -360,6 +620,22 @@ const handleSelectionChange = (selection: ProjectReportVO[]) => {
single.value = selection.length != 1;
multiple.value = !selection.length;
};
/** 提交按钮 */
const submitForm = () => {
projectReportFormRef.value?.validate(async (valid: boolean) => {
if (valid) {
buttonLoading.value = true;
if (form.value.reportId) {
await updateProjectReport(form.value).finally(() => (buttonLoading.value = false));
} else {
await addProjectReport(form.value).finally(() => (buttonLoading.value = false));
}
proxy?.$modal.msgSuccess('操作成功');
dialog.visible = false;
await getList();
}
});
};
/** 新增按钮操作 */
const handleAdd = (row?: ProjectReportVO) => {
reset();
@ -409,7 +685,30 @@ const handleUpdate = async (row?: ProjectReportVO) => {
reset();
const _reportId = row?.reportId || ids.value[0];
const res = await getProjectReport(_reportId);
//
form.value = { ...initFormData };
Object.assign(form.value, res.data);
console.log('编辑获取的数据:', res.data);
//
if (form.value.deptId) {
await getUsersByDept(form.value.deptId);
const a = listUserByDeptId(form.value.deptId);
console.log(a);
//
console.log('项目经理列表:', managerList.value);
console.log('部门负责人列表:', chargeList.value);
console.log('分管副总列表:', deputyList.value);
//
// IDlabel
// managerName
//
}
dialog.visible = true;
dialog.title = '修改项目周报信息';
};
@ -436,5 +735,6 @@ const handleExport = () => {
onMounted(() => {
getList();
getDeptList();
});
</script>

Loading…
Cancel
Save