diff --git a/src/api/crm/finance/index.ts b/src/api/crm/finance/index.ts
new file mode 100644
index 000000000..39189f617
--- /dev/null
+++ b/src/api/crm/finance/index.ts
@@ -0,0 +1,47 @@
+import request from '@/config/axios'
+
+// CRM 财务票据 VO
+export interface FinanceInvoiceVO {
+ id: number // 主键
+ ticketNumber: string // 票据号
+ billDate: Date // 单据日期
+ invoiceType: number // 发票类型
+ auxiliaryType: number // 辅助类型
+ writeOffStatus: number // 核销状态
+ customerId: number // 往来单位
+ customerName?: string // 往来单位名称
+ amount: number // 金额
+}
+
+// CRM 财务票据 API
+export const FinanceInvoiceApi = {
+ // 查询CRM 财务票据分页
+ getFinanceInvoicePage: async (params: any) => {
+ return await request.get({ url: `/crm/finance/invoice/page`, params })
+ },
+
+ // 查询CRM 财务票据详情
+ getFinanceInvoice: async (id: number) => {
+ return await request.get({ url: `/crm/finance/invoice/get?id=` + id })
+ },
+
+ // 新增CRM 财务票据
+ createFinanceInvoice: async (data: FinanceInvoiceVO) => {
+ return await request.post({ url: `/crm/finance/invoice/create`, data })
+ },
+
+ // 修改CRM 财务票据
+ updateFinanceInvoice: async (data: FinanceInvoiceVO) => {
+ return await request.put({ url: `/crm/finance/invoice/update`, data })
+ },
+
+ // 删除CRM 财务票据
+ deleteFinanceInvoice: async (id: number) => {
+ return await request.delete({ url: `/crm/finance/invoice/delete?id=` + id })
+ },
+
+ // 导出CRM 财务票据 Excel
+ exportFinanceInvoice: async (params) => {
+ return await request.download({ url: `/crm/finance/invoice/export-excel`, params })
+ },
+}
diff --git a/src/api/crm/finance/writeoff/index.ts b/src/api/crm/finance/writeoff/index.ts
new file mode 100644
index 000000000..0a8ae28da
--- /dev/null
+++ b/src/api/crm/finance/writeoff/index.ts
@@ -0,0 +1,22 @@
+import request from '@/config/axios'
+
+// CRM 财务票据核销 VO
+export interface CrmFinanceWriteoffRespVO {
+ customerId: number; // 往来单位
+ customerName: string; // 往来单位名称
+ unwrittenOffIncomeInvoiceAmount: string; // 未核销收款票据金额
+ unwrittenOffIncomeAmount: string; // 未核销收款金额
+ unwrittenOffIncomeDiffAmount: string; // 未核销收款差额
+ unwrittenOffOutcomeInvoiceAmount: string; // 未核销付款票据金额
+ unwrittenOffOutcomeAmount: string; // 未核销付款金额
+ unwrittenOffOutcomeDiffAmount: string; // 未核销付款差额
+}
+
+
+// CRM 财务票据 API
+export const FinanceWriteoffApi = {
+ // 查询CRM 财务票据核销分页
+ getFinanceInvoicePage: async (params: any) => {
+ return await request.get({ url: `/crm/finance/writeoff/page`, params })
+ },
+}
diff --git a/src/utils/dict.ts b/src/utils/dict.ts
index 851d2282f..ec9831ca3 100644
--- a/src/utils/dict.ts
+++ b/src/utils/dict.ts
@@ -225,6 +225,9 @@ export enum DICT_TYPE {
CRM_PROJECT_TYPE = 'crm_project_type', // CRM 项目类型
CRM_PROJECT_POWER_SUPPLY_TYPE = 'crm_project_power_supply_type', // CRM 项目供电模式
CRM_PROJECT_DOCUMENT_CONFIG = 'crm_project_document_config', // CRM 项目文档配置
+ CRM_FINANCE_INVOICE_TYPE = 'crm_finance_invoice_type', // CRM 票据发票类型
+ CRM_FINANCE_INVOICE_AUXILIARY_TYPE = 'crm_finance_invoice_auxiliary_type', // CRM 票据辅助类型
+ CRM_FINANCE_INVOICE_WRITE_OFF_STATUS = 'crm_finance_invoice_write_off_status', // CRM 票据核销状态
// ========== ERP - 企业资源计划模块 ==========
ERP_AUDIT_STATUS = 'erp_audit_status', // ERP 审批状态
diff --git a/src/views/crm/finance/FinanceInvoiceForm.vue b/src/views/crm/finance/FinanceInvoiceForm.vue
new file mode 100644
index 000000000..9e748e9fa
--- /dev/null
+++ b/src/views/crm/finance/FinanceInvoiceForm.vue
@@ -0,0 +1,196 @@
+
+
+
+
\ No newline at end of file
diff --git a/src/views/crm/finance/index.vue b/src/views/crm/finance/index.vue
new file mode 100644
index 000000000..255addc16
--- /dev/null
+++ b/src/views/crm/finance/index.vue
@@ -0,0 +1,298 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 搜索
+ 重置
+
+ 新增
+
+
+ 导出
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ scope.row.customerName }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 编辑
+
+
+ 删除
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/views/crm/finance/writeoff/index.vue b/src/views/crm/finance/writeoff/index.vue
new file mode 100644
index 000000000..ce56a7b51
--- /dev/null
+++ b/src/views/crm/finance/writeoff/index.vue
@@ -0,0 +1,134 @@
+
+
+
+
+
+
+
+
+
+ 搜索
+ 重置
+
+
+
+
+
+
+
+
+
+ {{ scope.row.customerName }}
+
+
+
+
+
+
+
+ 应收额
+
+
+ {{ scope.row.unwrittenOffIncomeDiffAmount }}
+
+
+
+
+
+
+ 应付额
+
+
+ {{ scope.row.unwrittenOffOutcomeDiffAmount }}
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/crm/project/document/ProjectDocumentForm.vue b/src/views/crm/project/document/ProjectDocumentForm.vue
new file mode 100644
index 000000000..400864226
--- /dev/null
+++ b/src/views/crm/project/document/ProjectDocumentForm.vue
@@ -0,0 +1,334 @@
+
+
+
+
\ No newline at end of file
diff --git a/src/views/crm/project/document/index.vue b/src/views/crm/project/document/index.vue
new file mode 100644
index 000000000..5773aab2a
--- /dev/null
+++ b/src/views/crm/project/document/index.vue
@@ -0,0 +1,462 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 搜索
+ 重置
+
+
+
+
+
+
+
+
+
+
+
+ {{ scope.row.cooperationAgreementName }}
+
+
+
+
+ 已核验
+
+
+
+ 无需
+
+
+ 缺项
+
+
+
+
+
+
+
+ {{ scope.row.purchaseContractName }}
+
+
+
+
+ 已核验
+
+
+
+ 无需
+
+
+ 缺项
+
+
+
+
+
+
+
+ {{ scope.row.epcContractName }}
+
+
+
+
+ 已核验
+
+
+
+ 无需
+
+
+ 缺项
+
+
+
+
+
+
+
+
+ {{ extractFileName(scope.row.buildPermit) }}
+
+
+
+
+ 已核验
+
+
+
+ 无需
+
+
+ 缺项
+
+
+
+
+
+
+
+
+ {{ extractFileName(scope.row.ownershipProof) }}
+
+
+
+
+ 已核验
+
+
+
+ 无需
+
+
+ 缺项
+
+
+
+
+
+
+
+ {{ extractFileName(scope.row.projectRecord) }}
+
+
+
+
+ 已核验
+
+
+
+ 无需
+
+
+ 缺项
+
+
+
+
+
+
+
+ {{ extractFileName(scope.row.investmentAgreement) }}
+
+
+
+
+ 已核验
+
+
+
+ 无需
+
+
+ 缺项
+
+
+
+
+
+
+
+ {{ extractFileName(scope.row.investmentShareAgreement) }}
+
+
+
+
+ 已核验
+
+
+
+ 无需
+
+
+ 缺项
+
+
+
+
+
+
+
+ {{ extractFileName(scope.row.powerSupplyReply) }}
+
+
+
+
+ 已核验
+
+
+
+ 无需
+
+
+ 缺项
+
+
+
+
+
+
+
+ 查看
+
+
+
+
+ 已核验
+
+
+
+ 无需
+
+
+ 缺项
+
+
+
+
+
+
+
+ 编辑
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file