|
|
|
|
@ -110,15 +110,10 @@
|
|
|
|
|
</el-form-item>
|
|
|
|
|
</el-col>
|
|
|
|
|
<el-col :span="12">
|
|
|
|
|
<el-form-item label="订单类型" prop="projectTypeId">
|
|
|
|
|
<el-cascader
|
|
|
|
|
v-model="form.projectTypeId"
|
|
|
|
|
:options="projectTypeOptions"
|
|
|
|
|
:props="{ value: 'projectTypeId', label: 'typeName', children: 'children', emitPath: false }"
|
|
|
|
|
placeholder="请选择订单类型"
|
|
|
|
|
style="width: 100%"
|
|
|
|
|
:disabled="isFormDisabled"
|
|
|
|
|
/>
|
|
|
|
|
<el-form-item label="订单类型" prop="orderType">
|
|
|
|
|
<el-select v-model="form.orderType" placeholder="请选择订单类型" style="width: 100%" :disabled="isFormDisabled" clearable>
|
|
|
|
|
<el-option v-for="dict in erp_order_type" :key="dict.value" :label="dict.label" :value="dict.value" />
|
|
|
|
|
</el-select>
|
|
|
|
|
</el-form-item>
|
|
|
|
|
</el-col>
|
|
|
|
|
<!-- <el-col :span="12">-->
|
|
|
|
|
@ -126,13 +121,6 @@
|
|
|
|
|
<!-- <el-input v-model="form.paymentMethod" placeholder="请输入付款方式(如:3-3-3-1)" />-->
|
|
|
|
|
<!-- </el-form-item>-->
|
|
|
|
|
<!-- </el-col>-->
|
|
|
|
|
<el-col :span="12">
|
|
|
|
|
<el-form-item label="部门" prop="deptId">
|
|
|
|
|
<el-select v-model="form.deptId" placeholder="请选择部门" :disabled="isFormDisabled">
|
|
|
|
|
<el-option v-for="item in deptInfoList" :key="item.deptId" :label="item.deptName" :value="item.deptId" />
|
|
|
|
|
</el-select>
|
|
|
|
|
</el-form-item>
|
|
|
|
|
</el-col>
|
|
|
|
|
<!-- <el-col :span="12">
|
|
|
|
|
<el-form-item label="项目经理" prop="managerId">
|
|
|
|
|
<el-select v-model="form.managerId" placeholder="请选择项目经理" :disabled="isFormDisabled" clearable filterable>
|
|
|
|
|
@ -350,17 +338,28 @@
|
|
|
|
|
<el-input v-model="addProjectForm.projectName" placeholder="请输入项目名称" />
|
|
|
|
|
</el-form-item>
|
|
|
|
|
</el-col>
|
|
|
|
|
<el-col :span="12">
|
|
|
|
|
<!-- <el-col :span="12">
|
|
|
|
|
<el-form-item label="项目类别" prop="projectCategory">
|
|
|
|
|
<el-select v-model="addProjectForm.projectCategory" placeholder="请选择项目类别" style="width: 100%">
|
|
|
|
|
<el-option
|
|
|
|
|
v-for="dict in project_category"
|
|
|
|
|
v-for="dict in addProjectCategoryOptions"
|
|
|
|
|
:key="dict.value"
|
|
|
|
|
:label="dict.label"
|
|
|
|
|
:value="dict.value"
|
|
|
|
|
/>
|
|
|
|
|
</el-select>
|
|
|
|
|
</el-form-item>
|
|
|
|
|
</el-col> -->
|
|
|
|
|
<el-col :span="12">
|
|
|
|
|
<el-form-item label="项目类型" prop="projectTypeId">
|
|
|
|
|
<el-cascader
|
|
|
|
|
v-model="addProjectForm.projectTypeId"
|
|
|
|
|
:options="projectTypeOptions"
|
|
|
|
|
:props="{ value: 'projectTypeId', label: 'typeName', children: 'children', emitPath: false }"
|
|
|
|
|
placeholder="请选择项目类型"
|
|
|
|
|
style="width: 100%"
|
|
|
|
|
/>
|
|
|
|
|
</el-form-item>
|
|
|
|
|
</el-col>
|
|
|
|
|
<el-col :span="12">
|
|
|
|
|
<el-form-item label="部门" prop="deptId">
|
|
|
|
|
@ -482,9 +481,20 @@ const router = useRouter();
|
|
|
|
|
// 页面状态:路由、字典、加载状态
|
|
|
|
|
// ---------------------------------------------------------------------------
|
|
|
|
|
const routeParams = ref<Record<string, any>>({});
|
|
|
|
|
const { business_direction, project_status, contract_flag, project_category, spare_flag, contract_status, project_phases, project_source } = toRefs<any>(
|
|
|
|
|
proxy?.useDict('business_direction', 'project_status', 'contract_flag', 'project_category', 'spare_flag', 'contract_status', 'project_phases', 'project_source')
|
|
|
|
|
const { business_direction, project_status, contract_flag, project_category, spare_flag, contract_status, project_phases, project_source, erp_order_type } = toRefs<any>(
|
|
|
|
|
proxy?.useDict(
|
|
|
|
|
'business_direction',
|
|
|
|
|
'project_status',
|
|
|
|
|
'contract_flag',
|
|
|
|
|
'project_category',
|
|
|
|
|
'spare_flag',
|
|
|
|
|
'contract_status',
|
|
|
|
|
'project_phases',
|
|
|
|
|
'project_source',
|
|
|
|
|
'erp_order_type'
|
|
|
|
|
)
|
|
|
|
|
);
|
|
|
|
|
const addProjectCategoryOptions = computed(() => (project_category.value || []).filter((item: any) => Number(item.value) >= 0 && Number(item.value) <= 2));
|
|
|
|
|
|
|
|
|
|
const buttonLoading = ref(false);
|
|
|
|
|
const projectInfoFormRef = ref<FormInstance>();
|
|
|
|
|
@ -499,7 +509,10 @@ const isCodeGenerated = ref(false);
|
|
|
|
|
// 关联项目(erp_project_contracts):列表、新增弹窗、选择已有项目弹窗
|
|
|
|
|
// ---------------------------------------------------------------------------
|
|
|
|
|
/** 关联项目行类型:projectSource 区分新增/已有;_projectForm 仅新增项目暂存时的表单快照 */
|
|
|
|
|
type ProjectRow = ProjectContractsVO & { _projectForm?: any };
|
|
|
|
|
type ProjectRow = ProjectContractsVO & {
|
|
|
|
|
projectTypeId?: string | number;
|
|
|
|
|
_projectForm?: any;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
const projectList = ref<ProjectRow[]>([]);
|
|
|
|
|
const projectListLoading = ref(false);
|
|
|
|
|
@ -523,6 +536,7 @@ const addProjectForm = reactive<Record<string, any>>({
|
|
|
|
|
projectCode: undefined,
|
|
|
|
|
projectName: undefined,
|
|
|
|
|
projectCategory: undefined,
|
|
|
|
|
projectTypeId: undefined,
|
|
|
|
|
deptId: undefined,
|
|
|
|
|
managerId: undefined,
|
|
|
|
|
chargeId: undefined,
|
|
|
|
|
@ -534,7 +548,7 @@ const addProjectForm = reactive<Record<string, any>>({
|
|
|
|
|
const addProjectRules = {
|
|
|
|
|
projectCode: [{ required: true, message: '项目编号不能为空', trigger: 'blur' }],
|
|
|
|
|
projectName: [{ required: true, message: '项目名称不能为空', trigger: 'blur' }],
|
|
|
|
|
projectCategory: [{ required: true, message: '项目类别不能为空', trigger: 'change' }],
|
|
|
|
|
projectTypeId: [{ required: true, message: '项目类型不能为空', trigger: 'change' }],
|
|
|
|
|
deptId: [{ required: true, message: '部门不能为空', trigger: 'change' }],
|
|
|
|
|
managerId: [{ required: true, message: '项目经理不能为空', trigger: 'change' }],
|
|
|
|
|
deputyId: [{ required: true, message: '分管副总不能为空', trigger: 'change' }],
|
|
|
|
|
@ -559,6 +573,7 @@ const resetAddProjectForm = () => {
|
|
|
|
|
addProjectForm.projectCode = undefined;
|
|
|
|
|
addProjectForm.projectName = undefined;
|
|
|
|
|
addProjectForm.projectCategory = undefined;
|
|
|
|
|
addProjectForm.projectTypeId = undefined;
|
|
|
|
|
addProjectForm.deptId = undefined;
|
|
|
|
|
addProjectForm.managerId = undefined;
|
|
|
|
|
addProjectForm.chargeId = undefined;
|
|
|
|
|
@ -586,6 +601,7 @@ const submitAddProject = () => {
|
|
|
|
|
row.managerName = manager ? manager.nickName : undefined;
|
|
|
|
|
row.amount = addProjectForm.amount as any;
|
|
|
|
|
row.projectCategory = addProjectForm.projectCategory;
|
|
|
|
|
row.projectTypeId = addProjectForm.projectTypeId;
|
|
|
|
|
proxy?.$modal.msgSuccess('项目修改成功');
|
|
|
|
|
} else {
|
|
|
|
|
// 新增项目行
|
|
|
|
|
@ -602,6 +618,7 @@ const submitAddProject = () => {
|
|
|
|
|
managerName: manager ? manager.nickName : undefined,
|
|
|
|
|
amount: addProjectForm.amount as any,
|
|
|
|
|
projectCategory: addProjectForm.projectCategory,
|
|
|
|
|
projectTypeId: addProjectForm.projectTypeId,
|
|
|
|
|
projectSource: PROJECT_SOURCE_NEW,
|
|
|
|
|
_projectForm: { ...addProjectForm }
|
|
|
|
|
};
|
|
|
|
|
@ -632,14 +649,16 @@ const handleEditProject = (row: ProjectRow) => {
|
|
|
|
|
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.projectTypeId = pf.projectTypeId ?? row.projectTypeId;
|
|
|
|
|
addProjectForm.deptId = pf.deptId ?? (row as any).deptId ?? undefined;
|
|
|
|
|
addProjectForm.managerId = pf.managerId ?? (row as any).managerId ?? undefined;
|
|
|
|
|
addProjectForm.chargeId = pf.chargeId ?? (row as any).chargeId ?? undefined;
|
|
|
|
|
addProjectForm.deputyId = pf.deputyId ?? (row as any).deputyId ?? undefined;
|
|
|
|
|
const peopleIdVal = pf.peopleId ?? (row as any).peopleId;
|
|
|
|
|
if (peopleIdVal) {
|
|
|
|
|
addProjectForm.peopleId = Array.isArray(pf.peopleId)
|
|
|
|
|
? pf.peopleId
|
|
|
|
|
: String(pf.peopleId)
|
|
|
|
|
: String(peopleIdVal)
|
|
|
|
|
.split(',')
|
|
|
|
|
.map((id: string) => id.trim())
|
|
|
|
|
.filter((id: string) => id) as any;
|
|
|
|
|
@ -675,7 +694,31 @@ const loadProjectContractsList = async () => {
|
|
|
|
|
projectListLoading.value = true;
|
|
|
|
|
try {
|
|
|
|
|
const res = await getErpProjectContractsList({ contractId } as any);
|
|
|
|
|
projectList.value = (res.data || []).map((item: ProjectContractsVO) => ({ ...(item as any) }));
|
|
|
|
|
projectList.value = (res.data || []).map((item: ProjectContractsVO) => {
|
|
|
|
|
const row = { ...(item as any) } as ProjectRow;
|
|
|
|
|
if (row.projectSource === PROJECT_SOURCE_NEW) {
|
|
|
|
|
const peopleIdVal = (row as any).peopleId;
|
|
|
|
|
row._projectForm = {
|
|
|
|
|
projectCode: row.projectCode,
|
|
|
|
|
projectName: row.projectName,
|
|
|
|
|
projectCategory: row.projectCategory,
|
|
|
|
|
projectTypeId: row.projectTypeId,
|
|
|
|
|
deptId: (row as any).deptId,
|
|
|
|
|
managerId: (row as any).managerId,
|
|
|
|
|
chargeId: (row as any).chargeId,
|
|
|
|
|
deputyId: (row as any).deputyId,
|
|
|
|
|
peopleId: Array.isArray(peopleIdVal)
|
|
|
|
|
? peopleIdVal
|
|
|
|
|
: String(peopleIdVal || '')
|
|
|
|
|
.split(',')
|
|
|
|
|
.map((id: string) => id.trim())
|
|
|
|
|
.filter((id: string) => id),
|
|
|
|
|
amount: row.amount,
|
|
|
|
|
remark: row.remark
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
return row;
|
|
|
|
|
});
|
|
|
|
|
} catch (e) {
|
|
|
|
|
console.error(e);
|
|
|
|
|
projectList.value = [];
|
|
|
|
|
@ -731,7 +774,7 @@ const projectSelectCallback = (selectedProjects: ProjectInfoVO[]) => {
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
// ---------------------------------------------------------------------------
|
|
|
|
|
// 下拉与字典:部门、用户、回款阶段、项目类型
|
|
|
|
|
// 下拉与字典:部门、用户、回款阶段
|
|
|
|
|
// ---------------------------------------------------------------------------
|
|
|
|
|
const deptInfoList = ref([]);
|
|
|
|
|
const getDeptInfoListSelect = async () => {
|
|
|
|
|
@ -787,9 +830,38 @@ const projectTypeList = ref<ProjectTypeVO[]>([]);
|
|
|
|
|
const getProjectTypeList = async () => {
|
|
|
|
|
const res = await listProjectType({} as any);
|
|
|
|
|
projectTypeList.value = res.data || [];
|
|
|
|
|
projectTypeOptions.value = proxy?.handleTree<ProjectTypeVO>(res.data, 'projectTypeId', 'parentId') || [];
|
|
|
|
|
projectTypeOptions.value = proxy?.handleTree<ProjectTypeVO>(res.data || [], 'projectTypeId', 'parentId') || [];
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/** 项目类型父级ID -> 项目类别 映射 */
|
|
|
|
|
function mapProjectCategoryByParentId(parentId: string | number | undefined): string | undefined {
|
|
|
|
|
const parentIdStr = parentId === undefined || parentId === null ? '' : String(parentId);
|
|
|
|
|
const categoryMap: Record<string, string> = {
|
|
|
|
|
'1': ProjectCategoryEnum.SALE_IMPLEMENT,
|
|
|
|
|
'8': ProjectCategoryEnum.SALE_LOGISTICS,
|
|
|
|
|
'11': ProjectCategoryEnum.SALE_SPARE
|
|
|
|
|
};
|
|
|
|
|
return categoryMap[parentIdStr];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/** 根据项目类型自动回填项目类别(parentId: 1->实施, 8->物流, 11->备件) */
|
|
|
|
|
function syncProjectCategoryByProjectType(projectTypeId: string | number | undefined): void {
|
|
|
|
|
if (projectTypeId === undefined || projectTypeId === null || projectTypeId === '') return;
|
|
|
|
|
const type = projectTypeList.value.find((item) => String(item.projectTypeId) === String(projectTypeId));
|
|
|
|
|
if (!type) return;
|
|
|
|
|
const mappedCategory = mapProjectCategoryByParentId(type.parentId);
|
|
|
|
|
if (mappedCategory !== undefined) {
|
|
|
|
|
addProjectForm.projectCategory = mappedCategory;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
watch(
|
|
|
|
|
() => addProjectForm.projectTypeId,
|
|
|
|
|
(newProjectTypeId) => {
|
|
|
|
|
syncProjectCategoryByProjectType(newProjectTypeId);
|
|
|
|
|
}
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
// ---------------------------------------------------------------------------
|
|
|
|
|
// 主表单:合同订单(项目)信息、校验规则、计算属性
|
|
|
|
|
// ---------------------------------------------------------------------------
|
|
|
|
|
@ -814,6 +886,7 @@ const initFormData: ProjectInfoFormEx = {
|
|
|
|
|
projectCategory: '9',
|
|
|
|
|
spareFlag: '1',
|
|
|
|
|
projectTypeId: undefined,
|
|
|
|
|
orderType: undefined,
|
|
|
|
|
paymentMethod: undefined,
|
|
|
|
|
deptId: undefined,
|
|
|
|
|
managerId: undefined,
|
|
|
|
|
@ -844,9 +917,8 @@ const data = reactive<{ form: ProjectInfoFormEx; rules: any }>({
|
|
|
|
|
projectName: [{ required: true, message: '订单名称不能为空', trigger: 'blur' }],
|
|
|
|
|
businessDirection: [{ required: true, message: '业务方向不能为空', trigger: 'change' }],
|
|
|
|
|
projectCategory: [{ required: true, message: '订单类别不能为空', trigger: 'change' }],
|
|
|
|
|
projectTypeId: [{ required: true, message: '订单类型不能为空', trigger: 'change' }],
|
|
|
|
|
orderType: [{ required: true, message: '订单类型不能为空', trigger: 'change' }],
|
|
|
|
|
customerContractCode: [{ required: true, message: '客户合同编号不能为空', trigger: 'blur' }],
|
|
|
|
|
deptId: [{ required: true, message: '部门不能为空', trigger: 'change' }],
|
|
|
|
|
peopleId: [{ required: true, message: '抄送人员不能为空', trigger: 'change' }],
|
|
|
|
|
ossId: [{ required: true, message: '请上传终版合同', trigger: 'change' }]
|
|
|
|
|
}
|
|
|
|
|
@ -895,6 +967,7 @@ function buildProjectContractsPayload(row: ProjectRow, index: number): Record<st
|
|
|
|
|
const pf = row._projectForm;
|
|
|
|
|
base.projectCode = pf.projectCode;
|
|
|
|
|
base.projectName = pf.projectName;
|
|
|
|
|
base.projectTypeId = pf.projectTypeId;
|
|
|
|
|
base.deptId = pf.deptId;
|
|
|
|
|
base.managerId = pf.managerId;
|
|
|
|
|
base.chargeId = pf.chargeId;
|
|
|
|
|
@ -978,7 +1051,7 @@ const submitForm = (status: string, mode: boolean) => {
|
|
|
|
|
// 数据加载:合同信息、关联项目、项目阶段计划
|
|
|
|
|
// ---------------------------------------------------------------------------
|
|
|
|
|
const loadSelectOptions = async () => {
|
|
|
|
|
await Promise.all([getUserList(), getDeptInfoListSelect(), getPaymentStageList(), getCustomerInfoListSelect()]);
|
|
|
|
|
await Promise.all([getUserList(), getDeptInfoListSelect(), getPaymentStageList(), getCustomerInfoListSelect(), getProjectTypeList()]);
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/** 日期格式化为 YYYY-MM-DD */
|
|
|
|
|
@ -1127,7 +1200,6 @@ onMounted(async () => {
|
|
|
|
|
console.error('获取合同信息失败:', error);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
await getProjectTypeList();
|
|
|
|
|
proxy?.$modal.closeLoading();
|
|
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
|