From 9f891fc36233742f8465b864c98d07f6a1dfdcaa Mon Sep 17 00:00:00 2001 From: wersd <1523826083@qq.com> Date: Thu, 3 Jul 2025 20:27:49 +0800 Subject: [PATCH] =?UTF-8?q?=E9=A1=B9=E7=9B=AE=E7=AB=8B=E9=A1=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/crm/project/index.ts | 108 ++++++++-------- src/api/system/dept/index.ts | 4 +- src/utils/dict.ts | 1 + src/views/crm/contract/ContractForm.vue | 2 +- src/views/crm/project/ProjectForm.vue | 119 ++++++++++++------ .../project/component/ProjectPartnetForm.vue | 87 +++++++++++-- src/views/crm/receivable/ReceivableForm.vue | 79 ++++++++++-- .../crm/receivable/request/RequestForm.vue | 2 +- 8 files changed, 284 insertions(+), 118 deletions(-) diff --git a/src/api/crm/project/index.ts b/src/api/crm/project/index.ts index 294a03a02..995c54e07 100644 --- a/src/api/crm/project/index.ts +++ b/src/api/crm/project/index.ts @@ -1,55 +1,53 @@ -import request from '@/config/axios' - -// CRM 项目信息 VO -export interface ProjectVO { - id: number // 主键ID - deptId: number // 部门ID - siteId: number // 场地ID - totalInvestment: number // 项目总投资额 - ownerUserId: string // 项目合伙人 - ratio: string // 比例 - investment: string // 投资额 - cooperationAgreement: number // 场地租赁合同或合作协议 - purchaseContractId: number // 设备采购合同ID - epcContractId: number // EPC施工合同ID - buildPermit: string // 同意建桩证明 - ownershipProof: string // 场地权属证明 - projectRecord: string // 项目备案 - powerSupplyReply: string // 供电答复单 - supplementaryMaterials: string // 其他补充材料文件路径 - type: number // 类型 - projectStatus: number // 状态 -} - -// CRM 项目信息 API -export const ProjectApi = { - // 查询CRM 项目信息分页 - getProjectPage: async (params: any) => { - return await request.get({ url: `/crm/project/page`, params }) - }, - - // 查询CRM 项目信息详情 - getProject: async (id: number) => { - return await request.get({ url: `/crm/project/get?id=` + id }) - }, - - // 新增CRM 项目信息 - createProject: async (data: ProjectVO) => { - return await request.post({ url: `/crm/project/create`, data }) - }, - - // 修改CRM 项目信息 - updateProject: async (data: ProjectVO) => { - return await request.put({ url: `/crm/project/update`, data }) - }, - - // 删除CRM 项目信息 - deleteProject: async (id: number) => { - return await request.delete({ url: `/crm/project/delete?id=` + id }) - }, - - // 导出CRM 项目信息 Excel - exportProject: async (params) => { - return await request.download({ url: `/crm/project/export-excel`, params }) - }, -} \ No newline at end of file +import request from '@/config/axios' + +// CRM 项目信息 VO +export interface ProjectVO { + id: number // 主键ID + deptId: number // 部门ID + siteId: number // 场地ID + totalInvestment: number // 项目总投资额 + ownerUserId: string // 项目合伙人 + ratio: string // 比例 + investment: string // 投资额 + cooperationAgreement: number // 场地租赁合同或合作协议 + purchaseContractId: number // 设备采购合同ID + epcContractId: number // EPC施工合同ID + buildPermit: string // 同意建桩证明 + ownershipProof: string // 场地权属证明 + projectRecord: string // 项目备案 + powerSupplyReply: string // 供电答复单 + investmentAgreement: string // 合作投资协议 + supplementaryMaterials: string // 其他补充材料文件路径 + type: number // 类型 + projectStatus: number // 状态 +} + +// 查询CRM 项目信息分页 +export const getProjectPage = async (params: any) => { + return await request.get({ url: `/crm/project/page`, params }) +} + +// 查询CRM 项目信息详情 +export const getProject = async (id: number) => { + return await request.get({ url: `/crm/project/get?id=` + id }) +} + +// 新增CRM 项目信息 +export const createProject = async (data: ProjectVO) => { + return await request.post({ url: `/crm/project/create`, data }) +} + +// 修改CRM 项目信息 +export const updateProject = async (data: ProjectVO) => { + return await request.put({ url: `/crm/project/update`, data }) +} + +// 删除CRM 项目信息 +export const deleteProject = async (id: number) => { + return await request.delete({ url: `/crm/project/delete?id=` + id }) +} + +// 导出CRM 项目信息 Excel +export const exportProject = async (params: any) => { + return await request.download({ url: `/crm/project/export-excel`, params }) +} diff --git a/src/api/system/dept/index.ts b/src/api/system/dept/index.ts index 0f5de12f0..588c79e0d 100644 --- a/src/api/system/dept/index.ts +++ b/src/api/system/dept/index.ts @@ -19,8 +19,8 @@ export const getSimpleDeptList = async (): Promise => { } // 查询部门(精简)列表 -export const querySimpleDeptList = async () => { - return await request.get({ url: '/system/dept/query-list?type=2'}) +export const querySimpleDeptList = async (type: number) => { + return await request.get({ url: `/system/dept/query-list?type=${type}` }) } // 查询部门列表 diff --git a/src/utils/dict.ts b/src/utils/dict.ts index 81b951fad..758046dea 100644 --- a/src/utils/dict.ts +++ b/src/utils/dict.ts @@ -218,6 +218,7 @@ export enum DICT_TYPE { CRM_CONTRACT_TYPE = 'crm_contract_type', // CRM 合同类型 CRM_CONTRACT_STATUS = 'crm_contract_status', // CRM 合同状态 CRM_CONTRACT_ATTRIBUTE = 'crm_contract_attribute', // CRM 合同属性 + CRM_PROJECT_TYPE = 'crm_project_type', // CRM 项目类型 // ========== ERP - 企业资源计划模块 ========== diff --git a/src/views/crm/contract/ContractForm.vue b/src/views/crm/contract/ContractForm.vue index 7bc470ffe..f3ce7082f 100644 --- a/src/views/crm/contract/ContractForm.vue +++ b/src/views/crm/contract/ContractForm.vue @@ -340,7 +340,7 @@ const open = async (type: string, id?: number) => { // 获取联系人 contactList.value = await ContactApi.getSimpleContactList() // 加载部门列表 - deptList.value = await DeptApi.querySimpleDeptList() + deptList.value = await DeptApi.querySimpleDeptList(2) } defineExpose({ open }) // 提供 open 方法,用于打开弹窗 diff --git a/src/views/crm/project/ProjectForm.vue b/src/views/crm/project/ProjectForm.vue index 351aabd12..715bffb33 100644 --- a/src/views/crm/project/ProjectForm.vue +++ b/src/views/crm/project/ProjectForm.vue @@ -47,18 +47,42 @@ - + - - 请选择字典生成 + + 关闭 + 开启 + + + + + 万元 + + + + + + + + + + + + + @@ -115,17 +139,17 @@ - - - - - - - + + @@ -133,33 +157,36 @@ - + - + - - + - + - + + + + + - - + + @@ -178,6 +205,8 @@ import * as DeptApi from '@/api/system/dept' import * as ContractApi from '@/api/crm/contract' import * as StationSiteApi from '@/api/crm/stationsite' import ProjectPartnetForm from './component/ProjectPartnetForm.vue' +import { totalCountFormat } from '@/views/mall/promotion/coupon/formatter' +import UploadFile from '@/components/UploadFile/src/UploadFile.vue' /** CRM 项目信息 表单 */ defineOptions({ name: 'ProjectForm' }) @@ -189,6 +218,8 @@ const dialogVisible = ref(false) // 弹窗的是否展示 const dialogTitle = ref('') // 弹窗的标题 const formLoading = ref(false) // 表单的加载中:1)修改时的数据加载;2)提交的按钮禁用 const formType = ref('') // 表单的类型:create - 新增;update - 修改 +const partners = ref([]) // 合伙人列表 + const formData = ref({ id: undefined, deptId: undefined, @@ -196,18 +227,18 @@ const formData = ref({ totalInvestment: undefined, partner: undefined, ratio: undefined, - investment: undefined, + investment: 0, cooperationAgreement: undefined, purchaseContractId: undefined, epcContractId: undefined, - buildPermit: undefined, - ownershipProof: undefined, - projectRecord: undefined, - powerSupplyReply: undefined, - supplementaryMaterials: undefined, + buildPermit: '', + ownershipProof: '', + projectRecord: '', + powerSupplyReply: '', + investmentAgreement: '', + supplementaryMaterials: [], type: undefined, - projectStatus: undefined, - partners: [], + projectStatus: undefined }) const formRules = reactive({ deptId: [{ required: true, message: '部门ID不能为空', trigger: 'blur' }], @@ -221,6 +252,24 @@ const deptList = ref([]) const contractOptions = ref([]) // 合同列表 const siteOptions = ref([]) // 场地列表 const partnerFormRef = ref() +const estimatedPiles = ref(undefined) +const gunCost = computed(() => { + if (!estimatedPiles.value || !formData.value.totalInvestment) return '' + if (Number(estimatedPiles.value) === 0) return '' + return (Number(formData.value.totalInvestment) / Number(estimatedPiles.value)).toFixed(2) +}) + +watch( + () => formData.value.siteId, + async (siteId) => { + if (siteId) { + const site = await StationSiteApi.getStationSite(siteId) + estimatedPiles.value = site.estimatedPiles + } else { + estimatedPiles.value = undefined + } + } +) /** 打开弹窗 */ const open = async (type: string, id?: number) => { @@ -238,7 +287,7 @@ const open = async (type: string, id?: number) => { } } // 加载部门列表 - deptList.value = await DeptApi.querySimpleDeptList() + deptList.value = await DeptApi.getSimpleDeptList() // 获得合同列表 contractOptions.value = await ContractApi.getContractSimpleAllList() // 获得场地列表 @@ -284,18 +333,18 @@ const resetForm = () => { totalInvestment: undefined, partner: undefined, ratio: undefined, - investment: undefined, + investment: 0, cooperationAgreement: undefined, purchaseContractId: undefined, epcContractId: undefined, - buildPermit: undefined, - ownershipProof: undefined, - projectRecord: undefined, - powerSupplyReply: undefined, - supplementaryMaterials: undefined, + buildPermit: '', + ownershipProof: '', + projectRecord: '', + powerSupplyReply: '', + investmentAgreement: '', + supplementaryMaterials: [], type: undefined, - projectStatus: undefined, - partners: [], + projectStatus: undefined } formRef.value?.resetFields() } diff --git a/src/views/crm/project/component/ProjectPartnetForm.vue b/src/views/crm/project/component/ProjectPartnetForm.vue index 752953310..f6b366f75 100644 --- a/src/views/crm/project/component/ProjectPartnetForm.vue +++ b/src/views/crm/project/component/ProjectPartnetForm.vue @@ -9,12 +9,13 @@ :disabled="disabled" > + - diff --git a/src/views/crm/receivable/ReceivableForm.vue b/src/views/crm/receivable/ReceivableForm.vue index 9ef1b0931..a711f26b3 100644 --- a/src/views/crm/receivable/ReceivableForm.vue +++ b/src/views/crm/receivable/ReceivableForm.vue @@ -129,10 +129,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + - - + + @@ -150,6 +185,7 @@ import { ReceivableVO } from '@/api/crm/receivable' import * as UserApi from '@/api/system/user' import * as CustomerApi from '@/api/crm/customer' import * as ContractApi from '@/api/crm/contract' +import * as ProjectApi from '@/api/crm/project' import { useUserStore } from '@/store/modules/user' import { DICT_TYPE, getIntDictOptions } from '@/utils/dict' @@ -160,17 +196,29 @@ const dialogVisible = ref(false) // 弹窗的是否展示 const dialogTitle = ref('') // 弹窗的标题 const formLoading = ref(false) // 表单的加载中:1)修改时的数据加载;2)提交的按钮禁用 const formType = ref('') // 表单的类型:create - 新增;update - 修改 -const formData = ref({} as ReceivableApi.ReceivableVO) +const formData = ref({} as ReceivableApi.ReceivableVO) const formRules = reactive({ customerId: [{ required: true, message: '客户不能为空', trigger: 'blur' }], contractId: [{ required: true, message: '合同不能为空', trigger: 'blur' }], returnTime: [{ required: true, message: '付款日期不能为空', trigger: 'blur' }], - price: [{ required: true, message: '付款金额不能为空', trigger: 'blur' }] + price: [{ required: true, message: '付款金额不能为空', trigger: 'blur' }], + date: [{ required: true, message: '日期不能为空', trigger: 'blur' }], + content: [{ required: true, message: '收入/开支内容不能为空', trigger: 'blur' }], + incomeType: [{ required: true, message: '收支类型不能为空', trigger: 'change' }], + projectId: [{ required: true, message: '项目名称不能为空', trigger: 'change' }], + isDeposit: [{ required: true, message: '请选择是否押金', trigger: 'change' }], }) const formRef = ref() // 表单 Ref const customerList = ref([]) // 客户列表 const contractList = ref([]) // 合同列表 const receivablePlanList = ref([]) // 付款计划列表 +const projectList = ref([]) // 项目列表 /** 打开弹窗 */ const open = async ( @@ -198,20 +246,27 @@ const open = async ( userOptions.value = await UserApi.getSimpleUserList() // 获得客户列表 customerList.value = await CustomerApi.getCustomerSimpleList() + // 获得项目列表 + projectList.value = await ProjectApi.getProjectPage({ pageSize: 1000, pageNo: 1 }).then(res => res.list || []) // 默认新建时选中自己 if (formType.value === 'create') { formData.value.ownerUserId = useUserStore().getUser.id } // 从付款计划创建付款 if (receivablePlan) { - formData.value.customerId = receivablePlan.customerId - await handleCustomerChange(receivablePlan.customerId) - formData.value.contractId = receivablePlan.contractId - await handleContractChange(receivablePlan.contractId) - if (receivablePlan.id) { - formData.value.planId = receivablePlan.id - formData.value.price = receivablePlan.price - formData.value.returnType = receivablePlan.returnType + // 修复 receivablePlan.contractId 可能为 undefined 的类型问题 + if (receivablePlan) { + formData.value.customerId = receivablePlan.customerId + await handleCustomerChange(receivablePlan.customerId) + if (receivablePlan.contractId) { + formData.value.contractId = receivablePlan.contractId + await handleContractChange(receivablePlan.contractId) + } + if (receivablePlan.id) { + formData.value.planId = receivablePlan.id + formData.value.price = receivablePlan.price + formData.value.returnType = receivablePlan.returnType + } } } } diff --git a/src/views/crm/receivable/request/RequestForm.vue b/src/views/crm/receivable/request/RequestForm.vue index 23f0838e6..521fa01d3 100644 --- a/src/views/crm/receivable/request/RequestForm.vue +++ b/src/views/crm/receivable/request/RequestForm.vue @@ -132,7 +132,7 @@ const open = async (type: string, id?: number, customerId?: number, contractId?: // 获得用户列表 userOptions.value = await UserApi.getSimpleUserList() // 加载部门列表 - deptList.value = await DeptApi.querySimpleDeptList() + deptList.value = await DeptApi.querySimpleDeptList(3) // 获得客户列表 customerList.value = await CustomerApi.getCustomerSimpleAllList() // 默认新建时选中自己