1.1.23 合同激活 去掉部门。合同激活 项目类别 研发预投去掉,添加项目类型。订单类型改成 实施类、备件类、软件服务类。项目信息添加时实施、物流与备件 合到一起为销售项目。

项目信息的项目类别区分销售实施、物流、备件。项目类型改为销售项目类型。
dev
yinq 2 days ago
parent 30c6107bee
commit 3464274df8

@ -44,6 +44,36 @@ export interface ProjectContractsVO {
*/ */
projectName?: string; projectName?: string;
/**
* ID
*/
projectTypeId?: string | number;
/**
* ID
*/
deptId?: string | number;
/**
*
*/
managerId?: string | number;
/**
*
*/
chargeId?: string | number;
/**
*
*/
deputyId?: string | number;
/**
*
*/
peopleId?: string;
/** /**
* *
*/ */

@ -54,6 +54,11 @@ export interface ProjectInfoVO {
*/ */
projectTypeId: string | number; projectTypeId: string | number;
/**
* erp_order_type
*/
orderType?: string;
/** /**
* *
*/ */
@ -264,6 +269,11 @@ export interface ProjectInfoForm extends BaseEntity {
*/ */
projectTypeId?: string | number; projectTypeId?: string | number;
/**
* erp_order_type
*/
orderType?: string;
/** /**
* *
*/ */
@ -479,6 +489,11 @@ export interface ProjectInfoQuery extends PageQuery {
*/ */
projectTypeId?: string | number; projectTypeId?: string | number;
/**
* erp_order_type
*/
orderType?: string;
/** /**
* *
*/ */

@ -59,10 +59,16 @@ export enum CodeRuleEnum {
* *
*/ */
export enum ProjectCategoryEnum { export enum ProjectCategoryEnum {
/** /**
* *
*/ */
SALE_IMPLEMENT = '1', SALE_IMPLEMENT = '0',
/**
*
*/
SALE_LOGISTICS = '1',
/** /**
* *

@ -121,7 +121,11 @@
<dict-tag :options="spare_flag" :value="scope.row.spareFlag" /> <dict-tag :options="spare_flag" :value="scope.row.spareFlag" />
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="订单类型" align="center" prop="typeName" width="130" v-if="columns[8].visible" /> <el-table-column label="订单类型" align="center" prop="orderType" width="130" v-if="columns[8].visible">
<template #default="scope">
<dict-tag :options="erp_order_type" :value="scope.row.orderType" />
</template>
</el-table-column>
<el-table-column label="付款方式" align="center" prop="paymentMethod" width="120" v-if="columns[9].visible" /> <el-table-column label="付款方式" align="center" prop="paymentMethod" width="120" v-if="columns[9].visible" />
<el-table-column label="部门" align="center" prop="deptName" width="120" v-if="columns[10].visible" /> <el-table-column label="部门" align="center" prop="deptName" width="120" v-if="columns[10].visible" />
<el-table-column label="项目经理" align="center" prop="managerName" width="100" v-if="columns[11].visible" /> <el-table-column label="项目经理" align="center" prop="managerName" width="100" v-if="columns[11].visible" />
@ -205,8 +209,20 @@ import ApprovalRecord from '@/components/Process/approvalRecord.vue';
const { proxy } = getCurrentInstance() as ComponentInternalInstance; const { proxy } = getCurrentInstance() as ComponentInternalInstance;
const route = useRoute(); const route = useRoute();
const router = useRouter(); const router = useRouter();
const { business_direction, project_status, active_flag, contract_flag, project_category, spare_flag, wf_business_status, order_purchase_status, order_delivery_status, order_invoice_status } = toRefs<any>( const { business_direction, project_status, active_flag, contract_flag, project_category, spare_flag, wf_business_status, order_purchase_status, order_delivery_status, order_invoice_status, erp_order_type } = toRefs<any>(
proxy?.useDict('business_direction', 'project_status', 'active_flag', 'contract_flag', 'project_category', 'spare_flag', 'wf_business_status', 'order_purchase_status', 'order_delivery_status', 'order_invoice_status') proxy?.useDict(
'business_direction',
'project_status',
'active_flag',
'contract_flag',
'project_category',
'spare_flag',
'wf_business_status',
'order_purchase_status',
'order_delivery_status',
'order_invoice_status',
'erp_order_type'
)
); );
const approvalRecordRef = ref<InstanceType<typeof ApprovalRecord>>(); const approvalRecordRef = ref<InstanceType<typeof ApprovalRecord>>();
@ -269,6 +285,7 @@ const data = reactive<{ queryParams: ProjectInfoQuery }>({
projectCategory: undefined, projectCategory: undefined,
spareFlag: undefined, spareFlag: undefined,
projectTypeId: undefined, projectTypeId: undefined,
orderType: undefined,
paymentMethod: undefined, paymentMethod: undefined,
deptId: undefined, deptId: undefined,
managerId: undefined, managerId: undefined,

@ -260,11 +260,11 @@
<!-- 上传终版合同对话框 --> <!-- 上传终版合同对话框 -->
<el-dialog v-model="uploadDialog.visible" title="合同激活" width="520px" append-to-body> <el-dialog v-model="uploadDialog.visible" title="合同激活" width="520px" append-to-body>
<el-form ref="uploadFormRef" :model="uploadDialog.form" :rules="uploadFormRules" label-width="120px"> <el-form ref="uploadFormRef" :model="uploadDialog.form" :rules="uploadFormRules" label-width="120px">
<el-form-item label="部门" prop="contractDeptId" required> <!-- <el-form-item label="部门" prop="contractDeptId" required>
<el-select v-model="uploadDialog.form.contractDeptId" placeholder="请选择部门" style="width: 100%"> <el-select v-model="uploadDialog.form.contractDeptId" placeholder="请选择部门" style="width: 100%">
<el-option v-for="item in deptInfoList" :key="item.deptId" :label="item.deptName" :value="item.deptId" /> <el-option v-for="item in deptInfoList" :key="item.deptId" :label="item.deptName" :value="item.deptId" />
</el-select> </el-select>
</el-form-item> </el-form-item> -->
<el-form-item label="签字合同附件" prop="oss" required> <el-form-item label="签字合同附件" prop="oss" required>
<fileUpload v-model="uploadDialog.form.oss" :limit="1" /> <fileUpload v-model="uploadDialog.form.oss" :limit="1" />
</el-form-item> </el-form-item>
@ -394,7 +394,7 @@ const columns = ref<FieldOption[]>([
{ key: 5, label: `合同大类`, visible: true }, { key: 5, label: `合同大类`, visible: true },
{ key: 6, label: `合同类型`, visible: false }, { key: 6, label: `合同类型`, visible: false },
{ key: 7, label: `业务方向`, visible: true }, { key: 7, label: `业务方向`, visible: true },
{ key: 8, label: `部门`, visible: true }, { key: 8, label: `部门`, visible: false },
{ key: 9, label: `合同签订日期`, visible: true }, { key: 9, label: `合同签订日期`, visible: true },
{ key: 10, label: `合同总价`, visible: true }, { key: 10, label: `合同总价`, visible: true },
{ key: 11, label: `甲方公司`, visible: true }, { key: 11, label: `甲方公司`, visible: true },

@ -110,15 +110,10 @@
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="12"> <el-col :span="12">
<el-form-item label="订单类型" prop="projectTypeId"> <el-form-item label="订单类型" prop="orderType">
<el-cascader <el-select v-model="form.orderType" placeholder="请选择订单类型" style="width: 100%" :disabled="isFormDisabled" clearable>
v-model="form.projectTypeId" <el-option v-for="dict in erp_order_type" :key="dict.value" :label="dict.label" :value="dict.value" />
:options="projectTypeOptions" </el-select>
:props="{ value: 'projectTypeId', label: 'typeName', children: 'children', emitPath: false }"
placeholder="请选择订单类型"
style="width: 100%"
:disabled="isFormDisabled"
/>
</el-form-item> </el-form-item>
</el-col> </el-col>
<!-- <el-col :span="12">--> <!-- <el-col :span="12">-->
@ -126,13 +121,6 @@
<!-- <el-input v-model="form.paymentMethod" placeholder="请输入付款方式3-3-3-1" />--> <!-- <el-input v-model="form.paymentMethod" placeholder="请输入付款方式3-3-3-1" />-->
<!-- </el-form-item>--> <!-- </el-form-item>-->
<!-- </el-col>--> <!-- </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-col :span="12">
<el-form-item label="项目经理" prop="managerId"> <el-form-item label="项目经理" prop="managerId">
<el-select v-model="form.managerId" placeholder="请选择项目经理" :disabled="isFormDisabled" clearable filterable> <el-select v-model="form.managerId" placeholder="请选择项目经理" :disabled="isFormDisabled" clearable filterable>
@ -350,17 +338,28 @@
<el-input v-model="addProjectForm.projectName" placeholder="请输入项目名称" /> <el-input v-model="addProjectForm.projectName" placeholder="请输入项目名称" />
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="12"> <!-- <el-col :span="12">
<el-form-item label="项目类别" prop="projectCategory"> <el-form-item label="项目类别" prop="projectCategory">
<el-select v-model="addProjectForm.projectCategory" placeholder="请选择项目类别" style="width: 100%"> <el-select v-model="addProjectForm.projectCategory" placeholder="请选择项目类别" style="width: 100%">
<el-option <el-option
v-for="dict in project_category" v-for="dict in addProjectCategoryOptions"
:key="dict.value" :key="dict.value"
:label="dict.label" :label="dict.label"
:value="dict.value" :value="dict.value"
/> />
</el-select> </el-select>
</el-form-item> </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>
<el-col :span="12"> <el-col :span="12">
<el-form-item label="部门" prop="deptId"> <el-form-item label="部门" prop="deptId">
@ -482,9 +481,20 @@ const router = useRouter();
// //
// --------------------------------------------------------------------------- // ---------------------------------------------------------------------------
const routeParams = ref<Record<string, any>>({}); 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>( 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') 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 buttonLoading = ref(false);
const projectInfoFormRef = ref<FormInstance>(); const projectInfoFormRef = ref<FormInstance>();
@ -499,7 +509,10 @@ const isCodeGenerated = ref(false);
// erp_project_contracts // erp_project_contracts
// --------------------------------------------------------------------------- // ---------------------------------------------------------------------------
/** 关联项目行类型projectSource 区分新增/已有_projectForm 仅新增项目暂存时的表单快照 */ /** 关联项目行类型projectSource 区分新增/已有_projectForm 仅新增项目暂存时的表单快照 */
type ProjectRow = ProjectContractsVO & { _projectForm?: any }; type ProjectRow = ProjectContractsVO & {
projectTypeId?: string | number;
_projectForm?: any;
};
const projectList = ref<ProjectRow[]>([]); const projectList = ref<ProjectRow[]>([]);
const projectListLoading = ref(false); const projectListLoading = ref(false);
@ -523,6 +536,7 @@ const addProjectForm = reactive<Record<string, any>>({
projectCode: undefined, projectCode: undefined,
projectName: undefined, projectName: undefined,
projectCategory: undefined, projectCategory: undefined,
projectTypeId: undefined,
deptId: undefined, deptId: undefined,
managerId: undefined, managerId: undefined,
chargeId: undefined, chargeId: undefined,
@ -534,7 +548,7 @@ const addProjectForm = reactive<Record<string, any>>({
const addProjectRules = { const addProjectRules = {
projectCode: [{ required: true, message: '项目编号不能为空', trigger: 'blur' }], projectCode: [{ required: true, message: '项目编号不能为空', trigger: 'blur' }],
projectName: [{ 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' }], deptId: [{ required: true, message: '部门不能为空', trigger: 'change' }],
managerId: [{ required: true, message: '项目经理不能为空', trigger: 'change' }], managerId: [{ required: true, message: '项目经理不能为空', trigger: 'change' }],
deputyId: [{ required: true, message: '分管副总不能为空', trigger: 'change' }], deputyId: [{ required: true, message: '分管副总不能为空', trigger: 'change' }],
@ -559,6 +573,7 @@ const resetAddProjectForm = () => {
addProjectForm.projectCode = undefined; addProjectForm.projectCode = undefined;
addProjectForm.projectName = undefined; addProjectForm.projectName = undefined;
addProjectForm.projectCategory = undefined; addProjectForm.projectCategory = undefined;
addProjectForm.projectTypeId = undefined;
addProjectForm.deptId = undefined; addProjectForm.deptId = undefined;
addProjectForm.managerId = undefined; addProjectForm.managerId = undefined;
addProjectForm.chargeId = undefined; addProjectForm.chargeId = undefined;
@ -586,6 +601,7 @@ const submitAddProject = () => {
row.managerName = manager ? manager.nickName : undefined; row.managerName = manager ? manager.nickName : undefined;
row.amount = addProjectForm.amount as any; row.amount = addProjectForm.amount as any;
row.projectCategory = addProjectForm.projectCategory; row.projectCategory = addProjectForm.projectCategory;
row.projectTypeId = addProjectForm.projectTypeId;
proxy?.$modal.msgSuccess('项目修改成功'); proxy?.$modal.msgSuccess('项目修改成功');
} else { } else {
// //
@ -602,6 +618,7 @@ const submitAddProject = () => {
managerName: manager ? manager.nickName : undefined, managerName: manager ? manager.nickName : undefined,
amount: addProjectForm.amount as any, amount: addProjectForm.amount as any,
projectCategory: addProjectForm.projectCategory, projectCategory: addProjectForm.projectCategory,
projectTypeId: addProjectForm.projectTypeId,
projectSource: PROJECT_SOURCE_NEW, projectSource: PROJECT_SOURCE_NEW,
_projectForm: { ...addProjectForm } _projectForm: { ...addProjectForm }
}; };
@ -632,14 +649,16 @@ const handleEditProject = (row: ProjectRow) => {
addProjectForm.projectCode = pf.projectCode ?? row.projectCode; addProjectForm.projectCode = pf.projectCode ?? row.projectCode;
addProjectForm.projectName = pf.projectName ?? row.projectName; addProjectForm.projectName = pf.projectName ?? row.projectName;
addProjectForm.projectCategory = pf.projectCategory ?? row.projectCategory; addProjectForm.projectCategory = pf.projectCategory ?? row.projectCategory;
addProjectForm.deptId = pf.deptId ?? undefined; addProjectForm.projectTypeId = pf.projectTypeId ?? row.projectTypeId;
addProjectForm.managerId = pf.managerId ?? undefined; addProjectForm.deptId = pf.deptId ?? (row as any).deptId ?? undefined;
addProjectForm.chargeId = pf.chargeId ?? undefined; addProjectForm.managerId = pf.managerId ?? (row as any).managerId ?? undefined;
addProjectForm.deputyId = pf.deputyId ?? undefined; addProjectForm.chargeId = pf.chargeId ?? (row as any).chargeId ?? undefined;
if (pf.peopleId) { 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) addProjectForm.peopleId = Array.isArray(pf.peopleId)
? pf.peopleId ? pf.peopleId
: String(pf.peopleId) : String(peopleIdVal)
.split(',') .split(',')
.map((id: string) => id.trim()) .map((id: string) => id.trim())
.filter((id: string) => id) as any; .filter((id: string) => id) as any;
@ -675,7 +694,31 @@ const loadProjectContractsList = async () => {
projectListLoading.value = true; projectListLoading.value = true;
try { try {
const res = await getErpProjectContractsList({ contractId } as any); 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) { } catch (e) {
console.error(e); console.error(e);
projectList.value = []; projectList.value = [];
@ -731,7 +774,7 @@ const projectSelectCallback = (selectedProjects: ProjectInfoVO[]) => {
}; };
// --------------------------------------------------------------------------- // ---------------------------------------------------------------------------
// //
// --------------------------------------------------------------------------- // ---------------------------------------------------------------------------
const deptInfoList = ref([]); const deptInfoList = ref([]);
const getDeptInfoListSelect = async () => { const getDeptInfoListSelect = async () => {
@ -787,9 +830,38 @@ const projectTypeList = ref<ProjectTypeVO[]>([]);
const getProjectTypeList = async () => { const getProjectTypeList = async () => {
const res = await listProjectType({} as any); const res = await listProjectType({} as any);
projectTypeList.value = res.data || []; 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', projectCategory: '9',
spareFlag: '1', spareFlag: '1',
projectTypeId: undefined, projectTypeId: undefined,
orderType: undefined,
paymentMethod: undefined, paymentMethod: undefined,
deptId: undefined, deptId: undefined,
managerId: undefined, managerId: undefined,
@ -844,9 +917,8 @@ const data = reactive<{ form: ProjectInfoFormEx; rules: any }>({
projectName: [{ required: true, message: '订单名称不能为空', trigger: 'blur' }], projectName: [{ required: true, message: '订单名称不能为空', trigger: 'blur' }],
businessDirection: [{ required: true, message: '业务方向不能为空', trigger: 'change' }], businessDirection: [{ required: true, message: '业务方向不能为空', trigger: 'change' }],
projectCategory: [{ 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' }], customerContractCode: [{ required: true, message: '客户合同编号不能为空', trigger: 'blur' }],
deptId: [{ required: true, message: '部门不能为空', trigger: 'change' }],
peopleId: [{ required: true, message: '抄送人员不能为空', trigger: 'change' }], peopleId: [{ required: true, message: '抄送人员不能为空', trigger: 'change' }],
ossId: [{ 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; const pf = row._projectForm;
base.projectCode = pf.projectCode; base.projectCode = pf.projectCode;
base.projectName = pf.projectName; base.projectName = pf.projectName;
base.projectTypeId = pf.projectTypeId;
base.deptId = pf.deptId; base.deptId = pf.deptId;
base.managerId = pf.managerId; base.managerId = pf.managerId;
base.chargeId = pf.chargeId; base.chargeId = pf.chargeId;
@ -978,7 +1051,7 @@ const submitForm = (status: string, mode: boolean) => {
// //
// --------------------------------------------------------------------------- // ---------------------------------------------------------------------------
const loadSelectOptions = async () => { const loadSelectOptions = async () => {
await Promise.all([getUserList(), getDeptInfoListSelect(), getPaymentStageList(), getCustomerInfoListSelect()]); await Promise.all([getUserList(), getDeptInfoListSelect(), getPaymentStageList(), getCustomerInfoListSelect(), getProjectTypeList()]);
}; };
/** 日期格式化为 YYYY-MM-DD */ /** 日期格式化为 YYYY-MM-DD */
@ -1127,7 +1200,6 @@ onMounted(async () => {
console.error('获取合同信息失败:', error); console.error('获取合同信息失败:', error);
} }
} }
await getProjectTypeList();
proxy?.$modal.closeLoading(); proxy?.$modal.closeLoading();
}); });
}); });

@ -21,7 +21,7 @@
<el-col :span="1.5"> <el-col :span="1.5">
<span class="card-title">项目关联合同</span> <span class="card-title">项目关联合同</span>
</el-col> </el-col>
<el-col :span="1.5"> <!-- <el-col :span="1.5">
<el-button <el-button
type="primary" type="primary"
plain plain
@ -31,7 +31,7 @@
:disabled="routeParams.type === 'view' || routeParams.type === 'approval' || form.contractFlag === '2'" :disabled="routeParams.type === 'view' || routeParams.type === 'approval' || form.contractFlag === '2'"
>新增关联 >新增关联
</el-button> </el-button>
</el-col> </el-col> -->
</el-row> </el-row>
</template> </template>
@ -70,7 +70,7 @@
<el-row :gutter="20"> <el-row :gutter="20">
<el-col :span="12"> <el-col :span="12">
<el-form-item label="有无合同" prop="contractFlag"> <el-form-item label="有无合同" prop="contractFlag">
<el-radio-group v-model="form.contractFlag"> <el-radio-group v-model="form.contractFlag" disabled>
<el-radio v-for="dict in contract_flag" :key="dict.value" :value="dict.value">{{ dict.label }} </el-radio> <el-radio v-for="dict in contract_flag" :key="dict.value" :value="dict.value">{{ dict.label }} </el-radio>
</el-radio-group> </el-radio-group>
</el-form-item> </el-form-item>
@ -344,13 +344,36 @@ const projectTypeOptions = ref<ProjectTypeVO[]>([]);
const projectTypeList = ref<ProjectTypeVO[]>([]); const projectTypeList = ref<ProjectTypeVO[]>([]);
/** 查询项目类型列表 */ /** 查询项目类型列表 */
const getProjectTypeList = async () => { const getProjectTypeList = async () => {
const params = { spareFlag: form.value.spareFlag } as any; const params = { } as any;
const res = await listProjectType(params); const res = await listProjectType(params);
// //
projectTypeList.value = res.data || []; 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];
}
/** 根据项目类型自动回填项目类别(仅新增模式) */
function syncProjectCategoryByProjectType(projectTypeId: string | number | undefined): void {
const mappedCategory = projectTypeId
? mapProjectCategoryByParentId(
projectTypeList.value.find((item) => String(item.projectTypeId) === String(projectTypeId))?.parentId
)
: undefined;
if (!mappedCategory) return;
form.value.projectCategory = mappedCategory;
form.value.spareFlag = mappedCategory === ProjectCategoryEnum.SALE_SPARE ? '1' : '0';
}
type ProjectInfoFormEx = ProjectInfoForm & { type ProjectInfoFormEx = ProjectInfoForm & {
flowCode?: string; flowCode?: string;
variables?: any; variables?: any;
@ -406,6 +429,15 @@ const data = reactive<{ form: ProjectInfoFormEx; rules: any }>({
const { form, rules } = toRefs(data); const { form, rules } = toRefs(data);
watch(
() => form.value.projectTypeId,
(newProjectTypeId) => {
const editingMode = !!form.value.projectId;
if (editingMode) return;
syncProjectCategoryByProjectType(newProjectTypeId as any);
}
);
// //
const generateProjectCode = async () => { const generateProjectCode = async () => {
if (isCodeGenerated.value) return; if (isCodeGenerated.value) return;
@ -554,10 +586,6 @@ onMounted(async () => {
if (form.value.projectCode) { if (form.value.projectCode) {
isCodeGenerated.value = true; isCodeGenerated.value = true;
} }
//
if (routeParams.value.projectCategory) {
form.value.projectCategory = routeParams.value.projectCategory as string;
}
} }
form.value.spareFlag = form.value.projectCategory === ProjectCategoryEnum.SALE_SPARE ? '1' : '0'; form.value.spareFlag = form.value.projectCategory === ProjectCategoryEnum.SALE_SPARE ? '1' : '0';
await getProjectTypeList(); await getProjectTypeList();

@ -67,8 +67,7 @@
<!-- >--> <!-- >-->
<!-- {{ dict.label }}--> <!-- {{ dict.label }}-->
<!-- </el-dropdown-item>--> <!-- </el-dropdown-item>-->
<el-dropdown-item command="1">销售项目实施物流</el-dropdown-item> <el-dropdown-item command="1">销售项目</el-dropdown-item>
<el-dropdown-item command="2">销售项目备件</el-dropdown-item>
<el-dropdown-item command="3">研发项目</el-dropdown-item> <el-dropdown-item command="3">研发项目</el-dropdown-item>
<el-dropdown-item command="4" :disabled="!isBmjl">预投项目</el-dropdown-item> <el-dropdown-item command="4" :disabled="!isBmjl">预投项目</el-dropdown-item>
</el-dropdown-menu> </el-dropdown-menu>
@ -139,7 +138,7 @@
<dict-tag :options="spare_flag" :value="scope.row.spareFlag" /> <dict-tag :options="spare_flag" :value="scope.row.spareFlag" />
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="项目类型" align="center" prop="typeName" width="130" v-if="columns[8].visible" /> <el-table-column label="销售项目类型" align="center" prop="typeName" width="130" v-if="columns[8].visible" />
<el-table-column label="付款方式" align="center" prop="paymentMethod" width="120" v-if="columns[9].visible" /> <el-table-column label="付款方式" align="center" prop="paymentMethod" width="120" v-if="columns[9].visible" />
<el-table-column label="部门" align="center" prop="deptName" width="120" v-if="columns[10].visible" /> <el-table-column label="部门" align="center" prop="deptName" width="120" v-if="columns[10].visible" />
<el-table-column label="项目经理" align="center" prop="managerName" width="100" v-if="columns[11].visible" /> <el-table-column label="项目经理" align="center" prop="managerName" width="100" v-if="columns[11].visible" />
@ -281,7 +280,7 @@ const columns = ref<FieldOption[]>([
{ key: 5, label: `业务方向`, visible: true }, { key: 5, label: `业务方向`, visible: true },
{ key: 6, label: `项目类别`, visible: true }, { key: 6, label: `项目类别`, visible: true },
{ key: 7, label: `备件标识`, visible: true }, { key: 7, label: `备件标识`, visible: true },
{ key: 8, label: `项目类型`, visible: true }, { key: 8, label: `销售项目类型`, visible: true },
{ key: 9, label: `付款方式`, visible: false }, { key: 9, label: `付款方式`, visible: false },
{ key: 10, label: `部门`, visible: true }, { key: 10, label: `部门`, visible: true },
{ key: 11, label: `项目经理`, visible: true }, { key: 11, label: `项目经理`, visible: true },

Loading…
Cancel
Save