Compare commits

...

2 Commits

@ -113,6 +113,11 @@
</template>
</el-table-column>
<el-table-column label="部门" align="center" prop="deptName" width="100" v-if="columns[8].visible" />
<el-table-column label="合同状态" align="center" prop="contractStatus" v-if="columns[17].visible">
<template #default="scope">
<dict-tag :options="contract_status" :value="scope.row.contractStatus" />
</template>
</el-table-column>
<el-table-column label="合同签订日期" align="center" prop="contractDate" width="120" v-if="columns[9].visible">
<template #default="scope">
<span>{{ parseTime(scope.row.contractDate, '{y}-{m}-{d}') }}</span>
@ -133,11 +138,6 @@
<span>{{ parseTime(scope.row.twoDate, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column>
<el-table-column label="合同状态" align="center" prop="contractStatus" v-if="columns[17].visible">
<template #default="scope">
<dict-tag :options="contract_status" :value="scope.row.contractStatus" />
</template>
</el-table-column>
<el-table-column label="流程状态" align="center" prop="flowStatus" v-if="columns[18].visible" />
<el-table-column label="合同模板ID" align="center" prop="templateId" v-if="columns[19].visible" />
<el-table-column label="附件ID" align="center" prop="ossId" v-if="columns[20].visible" />
@ -187,7 +187,7 @@
<span>{{ parseTime(scope.row.updateTime, '{y}-{m}-{d} {h}:{i}:{s}') }}</span>
</template>
</el-table-column>
<el-table-column label="操作" align="center" width="240" fixed="right" class-name="small-padding fixed-width">
<el-table-column label="操作" align="center" width="180" fixed="right" class-name="small-padding fixed-width">
<template #default="scope">
<el-tooltip content="查看详情" placement="top" v-if="canViewDetail(scope.row)">
<el-button link type="info" icon="DocumentChecked" @click="handleView(scope.row)"></el-button>

@ -1,5 +1,15 @@
<template>
<div class="p-2">
<!-- 内容变更生成的新合同提示激活后将继承原合同关联项目并作废原合同 -->
<el-alert
v-if="isFromContentChange"
type="info"
:closable="false"
show-icon
style="margin-bottom: 12px"
>
本合同由合同内容变更生成激活后将继承原合同关联项目并作废原合同下方关联项目已预填原合同项目
</el-alert>
<el-card shadow="never" style="margin-top: 0">
<approvalButton
@submitForm="submitForm"
@ -40,9 +50,18 @@
<el-table-column label="项目名称" align="center" prop="projectName" min-width="160" show-overflow-tooltip />
<el-table-column label="部门" align="center" prop="deptName" min-width="140" />
<el-table-column label="项目经理" align="center" prop="managerName" min-width="120" />
<el-table-column label="金额" align="center" prop="amount" min-width="120"/>
<el-table-column label="操作" width="80" align="center" fixed="right" v-if="!isFormDisabled">
<el-table-column label="金额" align="center" prop="amount" min-width="120" />
<el-table-column label="操作" width="140" align="center" fixed="right" v-if="!isFormDisabled">
<template #default="scope">
<el-button
v-if="scope.row.projectSource === PROJECT_SOURCE_NEW"
type="primary"
link
icon="Edit"
@click="handleEditProject(scope.row)"
>
编辑
</el-button>
<el-button type="danger" link icon="Delete" @click="handleRemoveProject(scope.row)"></el-button>
</template>
</el-table-column>
@ -50,6 +69,13 @@
</el-card>
<el-card shadow="never" style="margin-top: 0">
<template #header>
<el-row :gutter="10">
<el-col :span="1.5">
<span class="card-title">合同订单信息</span>
</el-col>
</el-row>
</template>
<el-form ref="projectInfoFormRef" :model="form" :rules="rules" label-width="120px">
<el-row :gutter="20">
<el-col :span="12">
@ -107,27 +133,27 @@
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<!-- <el-col :span="12">
<el-form-item label="项目经理" prop="managerId">
<el-select v-model="form.managerId" placeholder="请选择项目经理" :disabled="isFormDisabled" clearable filterable>
<el-option v-for="user in userList" :key="user.userId" :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="请选择部门负责人" :disabled="true">
<el-option v-for="user in userList" :key="user.userId" :label="user.nickName" :value="user.userId" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="分管副总" prop="deputyId">
<el-select v-model="form.deputyId" placeholder="请选择分管副总" :disabled="true">
<el-option v-for="user in userList" :key="user.userId" :label="user.nickName" :value="user.userId" />
</el-select>
</el-form-item>
</el-col>
</el-col> -->
<!-- <el-col :span="12">-->
<!-- <el-form-item label="部门负责人" prop="chargeId">-->
<!-- <el-select v-model="form.chargeId" placeholder="请选择部门负责人" :disabled="true">-->
<!-- <el-option v-for="user in userList" :key="user.userId" :label="user.nickName" :value="user.userId" />-->
<!-- </el-select>-->
<!-- </el-form-item>-->
<!-- </el-col>-->
<!-- <el-col :span="12">-->
<!-- <el-form-item label="分管副总" prop="deputyId">-->
<!-- <el-select v-model="form.deputyId" placeholder="请选择分管副总" :disabled="true">-->
<!-- <el-option v-for="user in userList" :key="user.userId" :label="user.nickName" :value="user.userId" />-->
<!-- </el-select>-->
<!-- </el-form-item>-->
<!-- </el-col>-->
<el-col :span="12">
<el-form-item label="合同编号" prop="contractCode">
<el-input v-model="form.contractCode" placeholder="请输入合同编号" :disabled="true" />
@ -138,6 +164,13 @@
<el-input v-model="form.contractName" placeholder="请输入合同名称" :disabled="true" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="合同总价" prop="amount">
<el-input v-model="form.amount" placeholder="请输入合同总价" :disabled="true">
<template #append></template>
</el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="抄送人员" prop="peopleId">
<el-select v-model="form.peopleId" placeholder="请选择抄送人员" :disabled="isFormDisabled" clearable filterable multiple>
@ -146,19 +179,13 @@
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="合同总价" prop="amount">
<el-input v-model="form.amount" placeholder="请输入合同总价" :disabled="true">
<template #append></template>
</el-input>
<el-form-item label="订单状态" prop="projectStatus">
<el-input
:value="(project_status || []).find((d: any) => d.value === form.projectStatus)?.label || ''"
disabled
/>
</el-form-item>
</el-col>
<!-- <el-col :span="12">-->
<!-- <el-form-item label="项目状态" prop="projectStatus">-->
<!-- <el-radio-group v-model="form.projectStatus" disabled>-->
<!-- <el-radio v-for="dict in project_status" :key="dict.value" :value="dict.value">{{ dict.label }} </el-radio>-->
<!-- </el-radio-group>-->
<!-- </el-form-item>-->
<!-- </el-col>-->
<el-col :span="12">
<el-form-item label="终版合同上传" prop="ossId">
<FileUpload
@ -182,50 +209,16 @@
<!-- 项目阶段计划 -->
<el-card shadow="never" style="margin-top: 0">
<!-- <template #header>-->
<!-- <el-row :gutter="10">-->
<!-- <el-col :span="1.5">-->
<!-- <span class="card-title">回款阶段</span>-->
<!-- </el-col>-->
<!-- <el-col :span="1.5" v-if="!isFormDisabled">-->
<!-- <el-button type="primary" icon="Plus" @click="handleAddPlanStage"></el-button>-->
<!-- </el-col>-->
<!-- </el-row>-->
<!-- </template>-->
<template #header>
<el-row :gutter="10">
<el-col :span="1.5">
<span class="card-title">回款信息</span>
</el-col>
</el-row>
</template>
<el-table :data="planStageList" border stripe max-height="400">
<el-table-column label="序号" type="index" width="60" align="center" />
<!-- <el-table-column label="项目阶段" width="150" align="center">-->
<!-- <template #default="scope">-->
<!-- <el-select v-model="scope.row.projectPhases" placeholder="请选择项目阶段" style="width: 100%" :disabled="isFormDisabled">-->
<!-- <el-option v-for="dict in project_phases" :key="dict.value" :label="dict.label" :value="dict.value" />-->
<!-- </el-select>-->
<!-- </template>-->
<!-- </el-table-column>-->
<!-- <el-table-column label="计划开始时间" width="160" align="center">-->
<!-- <template #default="scope">-->
<!-- <el-date-picker-->
<!-- v-model="scope.row.planStartTime"-->
<!-- type="date"-->
<!-- value-format="YYYY-MM-DD"-->
<!-- placeholder="选择日期"-->
<!-- style="width: 100%"-->
<!-- :disabled="isFormDisabled"-->
<!-- />-->
<!-- </template>-->
<!-- </el-table-column>-->
<!-- <el-table-column label="计划结束时间" width="160" align="center">-->
<!-- <template #default="scope">-->
<!-- <el-date-picker-->
<!-- v-model="scope.row.planEndTime"-->
<!-- type="date"-->
<!-- value-format="YYYY-MM-DD"-->
<!-- placeholder="选择日期"-->
<!-- style="width: 100%"-->
<!-- :disabled="isFormDisabled"-->
<!-- />-->
<!-- </template>-->
<!-- </el-table-column>-->
<el-table-column label="回款阶段" width="220" align="center">
<template #default="scope">
<el-select v-model="scope.row.collectionStage" placeholder="请选择回款阶段" clearable style="width: 100%" :disabled="isFormDisabled">
@ -246,18 +239,6 @@
/>
</template>
</el-table-column>
<!-- <el-table-column label="预计回款金额" width="150" align="center">-->
<!-- <template #default="scope">-->
<!-- <el-input-number-->
<!-- v-model="scope.row.repaymentAmount"-->
<!-- :min="0"-->
<!-- :precision="2"-->
<!-- controls-position="right"-->
<!-- style="width: 100%"-->
<!-- :disabled="isFormDisabled"-->
<!-- />-->
<!-- </template>-->
<!-- </el-table-column>-->
<el-table-column label="预计回款时间" width="220" align="center">
<template #default="scope">
<el-date-picker
@ -310,8 +291,15 @@
</el-table>
</el-card>
<!-- 新增项目弹窗 -->
<el-dialog title="新增项目" v-model="addProjectDialog.visible" width="800px" append-to-body destroy-on-close @close="resetAddProjectForm">
<!-- 新增/编辑项目弹窗 -->
<el-dialog
:title="addProjectDialog.mode === 'edit' ? '编辑项目' : '新增项目'"
v-model="addProjectDialog.visible"
width="800px"
append-to-body
destroy-on-close
@close="resetAddProjectForm"
>
<el-form ref="addProjectFormRef" :model="addProjectForm" :rules="addProjectRules" label-width="120px">
<el-row :gutter="20">
<el-col :span="12">
@ -411,6 +399,9 @@
</template>
<script setup name="ProjectInfoEdit" lang="ts">
import { ref, reactive, computed, toRefs, getCurrentInstance, onMounted, nextTick, watch } from 'vue';
import { useRoute, useRouter } from 'vue-router';
import type { ComponentInternalInstance } from 'vue';
import { getErpProjectInfoList, getProjectInfo } from '@/api/oa/erp/projectInfo';
import { saveContractOrder, updateContractOrder, submitContractOrderAndFlowStart } from '@/api/oa/erp/contractOrder';
import { ProjectInfoForm, ProjectInfoVO } from '@/api/oa/erp/projectInfo/types';
@ -477,9 +468,19 @@ type ProjectRow = ProjectContractsVO & { _projectForm?: any };
const projectList = ref<ProjectRow[]>([]);
const projectListLoading = ref(false);
/** 本合同是否由内容变更生成有原合同ID用于展示提示并预填原合同关联项目 */
const isFromContentChange = ref(false);
// ----- -----
const addProjectDialog = reactive({ visible: false });
// ----- / -----
const addProjectDialog = reactive<{
visible: boolean;
mode: 'add' | 'edit';
currentRow: ProjectRow | null;
}>({
visible: false,
mode: 'add',
currentRow: null
});
const addProjectFormRef = ref<FormInstance>();
const addProjectCodeGenerated = ref(false);
const addProjectSubmitLoading = ref(false);
@ -500,7 +501,9 @@ const addProjectRules = {
projectName: [{ required: true, message: '项目名称不能为空', trigger: 'blur' }],
projectCategory: [{ required: true, message: '项目类别不能为空', trigger: 'change' }],
deptId: [{ required: true, message: '部门不能为空', trigger: 'change' }],
managerId: [{ required: true, message: '项目经理不能为空', trigger: 'change' }]
managerId: [{ required: true, message: '项目经理不能为空', trigger: 'change' }],
deputyId: [{ required: true, message: '分管副总不能为空', trigger: 'change' }],
chargeId: [{ required: true, message: '部门负责人不能为空', trigger: 'change' }]
};
const generateAddProjectCode = async () => {
@ -531,36 +534,86 @@ const resetAddProjectForm = () => {
addProjectCodeGenerated.value = false;
};
/** 新增项目确定:校验后加入 projectListprojectSource=新增),提交时由 submitForm 统一保存 */
/** 新增/编辑项目确定:校验后加入或更新 projectList提交时由 submitForm 统一保存 */
const submitAddProject = () => {
addProjectFormRef.value?.validate((valid: boolean) => {
if (!valid) return;
const dept = deptInfoList.value.find((d: any) => d.deptId === addProjectForm.deptId);
const manager = userList.value.find((u: any) => u.userId === addProjectForm.managerId);
const row: ProjectRow = {
projectContractsId: undefined as any,
projectId: undefined as any,
contractId: form.value.contractId as any,
sortOrder: projectList.value.length + 1,
remark: addProjectForm.remark,
activeFlag: '1',
projectCode: addProjectForm.projectCode,
projectName: addProjectForm.projectName,
deptName: dept ? dept.deptName : undefined,
managerName: manager ? manager.nickName : undefined,
amount: addProjectForm.amount as any,
projectCategory: addProjectForm.projectCategory,
projectSource: PROJECT_SOURCE_NEW,
_projectForm: { ...addProjectForm }
};
projectList.value.push(row);
if (addProjectDialog.mode === 'edit' && addProjectDialog.currentRow) {
//
const row = addProjectDialog.currentRow;
row._projectForm = { ...addProjectForm };
row.remark = addProjectForm.remark;
row.projectCode = addProjectForm.projectCode;
row.projectName = addProjectForm.projectName;
row.deptName = dept ? dept.deptName : undefined;
row.managerName = manager ? manager.nickName : undefined;
row.amount = addProjectForm.amount as any;
row.projectCategory = addProjectForm.projectCategory;
proxy?.$modal.msgSuccess('项目修改成功');
} else {
//
const row: ProjectRow = {
projectContractsId: undefined as any,
projectId: undefined as any,
contractId: form.value.contractId as any,
sortOrder: projectList.value.length + 1,
remark: addProjectForm.remark,
activeFlag: '1',
projectCode: addProjectForm.projectCode,
projectName: addProjectForm.projectName,
deptName: dept ? dept.deptName : undefined,
managerName: manager ? manager.nickName : undefined,
amount: addProjectForm.amount as any,
projectCategory: addProjectForm.projectCategory,
projectSource: PROJECT_SOURCE_NEW,
_projectForm: { ...addProjectForm }
};
projectList.value.push(row);
proxy?.$modal.msgSuccess('已添加到待保存列表,请在提交时一并保存');
}
addProjectDialog.visible = false;
proxy?.$modal.msgSuccess('已添加到待保存列表,请在提交时一并保存');
});
};
const handleAddProject = () => {
addProjectDialog.mode = 'add';
addProjectDialog.currentRow = null;
resetAddProjectForm();
//
addProjectForm.amount = form.value.amount;
addProjectDialog.visible = true;
};
/** 编辑“新增项目”行:仅对 projectSource=新增 的行开放 */
const handleEditProject = (row: ProjectRow) => {
if (row.projectSource !== PROJECT_SOURCE_NEW) {
return;
}
addProjectDialog.mode = 'edit';
addProjectDialog.currentRow = row;
const pf = row._projectForm || {};
addProjectForm.projectCode = pf.projectCode ?? row.projectCode;
addProjectForm.projectName = pf.projectName ?? row.projectName;
addProjectForm.projectCategory = pf.projectCategory ?? row.projectCategory;
addProjectForm.deptId = pf.deptId ?? undefined;
addProjectForm.managerId = pf.managerId ?? undefined;
addProjectForm.chargeId = pf.chargeId ?? undefined;
addProjectForm.deputyId = pf.deputyId ?? undefined;
if (pf.peopleId) {
addProjectForm.peopleId = Array.isArray(pf.peopleId)
? pf.peopleId
: String(pf.peopleId)
.split(',')
.map((id: string) => id.trim())
.filter((id: string) => id) as any;
} else {
addProjectForm.peopleId = undefined as any;
}
addProjectForm.amount = pf.amount ?? row.amount;
addProjectForm.remark = pf.remark ?? row.remark;
addProjectCodeGenerated.value = !!addProjectForm.projectCode;
addProjectDialog.visible = true;
};
@ -652,6 +705,23 @@ const getDeptInfoListSelect = async () => {
deptInfoList.value = res.data;
};
// /
watch(
() => addProjectForm.deptId,
(newDeptId) => {
if (!newDeptId) {
addProjectForm.chargeId = undefined;
addProjectForm.deputyId = undefined;
return;
}
const deptInfo = deptInfoList.value.find((dept: any) => dept.deptId === newDeptId);
if (deptInfo) {
addProjectForm.chargeId = deptInfo.leader;
addProjectForm.deputyId = deptInfo.vicePresident;
}
}
);
const userList = ref([]);
const getUserList = async () => {
const params: UserQuery = { pageNum: 1, pageSize: 9999 };
@ -733,7 +803,6 @@ const data = reactive<{ form: ProjectInfoFormEx; rules: any }>({
projectCategory: [{ required: true, message: '订单类别不能为空', trigger: 'change' }],
projectTypeId: [{ required: true, message: '订单类型不能为空', trigger: 'change' }],
deptId: [{ required: true, message: '部门不能为空', trigger: 'change' }],
managerId: [{ required: true, message: '项目经理不能为空', trigger: 'change' }],
peopleId: [{ required: true, message: '抄送人员不能为空', trigger: 'change' }],
ossId: [{ required: true, message: '请上传终版合同', trigger: 'change' }]
}
@ -823,6 +892,7 @@ const submitForm = (status: string, mode: boolean) => {
projectId: submitData.projectId,
projectCode: submitData.projectCode,
projectName: submitData.projectName,
businessDirection: submitData.businessDirection,
contractManagerId: submitData.peopleId,
hasExistProject
};
@ -853,6 +923,7 @@ const loadSelectOptions = async () => {
/** 根据路由 contractId 加载合同信息并回填表单;有项目则加载主项目+阶段+关联项目,无则从合同带出 */
const loadContractInfo = async () => {
isFromContentChange.value = false;
const contractId = routeParams.value.contractId as string | number;
if (contractId) {
try {
@ -922,10 +993,24 @@ const loadContractInfo = async () => {
} as ErpProjectPlanStageForm;
});
}
//
const originalId = (contractData as any).originalContractId;
if (originalId != null && originalId !== '') {
isFromContentChange.value = true;
projectListLoading.value = true;
try {
const projRes = await getErpProjectContractsList({ contractId: originalId } as any);
projectList.value = (projRes.data || []).map((item: any) => ({ ...(item as any) }));
} finally {
projectListLoading.value = false;
}
}
}
}
// erp_project_contracts form.contractId
await loadProjectContractsList();
// erp_project_contracts
if (!isFromContentChange.value) {
await loadProjectContractsList();
}
} catch (error) {
console.error('查询合同信息失败:', error);
}

@ -235,9 +235,11 @@ async function getDeptAllUser(deptId: any) {
}
/** 查询所有用户 */
async function getAllUser() {
const res = await listUserByDeptId(100);
allUserList.value = res.data || [];
async function getAllUser(deptId: any) {
if (deptId !== null && deptId !== '' && deptId !== undefined) {
const res = await listUserByDeptId(deptId);
allUserList.value = res.data || [];
}
}
/** 取消按钮 */
@ -287,7 +289,7 @@ const handleAdd = async (row?: DeptVO) => {
getDeptAllUser(row.deptId);
}
//
getAllUser();
getAllUser(row.deptId);
dialog.visible = true;
dialog.title = '添加部门';
}
@ -299,7 +301,7 @@ const handleUpdate = async (row: DeptVO) => {
//
getDeptAllUser(row.deptId);
//
getAllUser();
getAllUser(row.deptId);
const res = await getDept(row.deptId);
form.value = res.data;
const response = await listDeptExcludeChild(row.deptId);

Loading…
Cancel
Save