diff --git a/src/api/crm/billtemplate/index.ts b/src/api/crm/billtemplate/index.ts
new file mode 100644
index 000000000..3f653bb0e
--- /dev/null
+++ b/src/api/crm/billtemplate/index.ts
@@ -0,0 +1,41 @@
+import request from '@/config/axios'
+
+// 票据模版 VO
+export interface BillTemplateVO {
+  id: number // 主键
+  name: string // 名称
+  status: number // 状态
+}
+
+// 票据模版 API
+export const BillTemplateApi = {
+  // 查询票据模版分页
+  getBillTemplatePage: async (params: any) => {
+    return await request.get({ url: `/crm/bill-template/page`, params })
+  },
+
+  // 查询票据模版详情
+  getBillTemplate: async (id: number) => {
+    return await request.get({ url: `/crm/bill-template/get?id=` + id })
+  },
+
+  // 新增票据模版
+  createBillTemplate: async (data: BillTemplateVO) => {
+    return await request.post({ url: `/crm/bill-template/create`, data })
+  },
+
+  // 修改票据模版
+  updateBillTemplate: async (data: BillTemplateVO) => {
+    return await request.put({ url: `/crm/bill-template/update`, data })
+  },
+
+  // 删除票据模版
+  deleteBillTemplate: async (id: number) => {
+    return await request.delete({ url: `/crm/bill-template/delete?id=` + id })
+  },
+
+  // 导出票据模版 Excel
+  exportBillTemplate: async (params) => {
+    return await request.download({ url: `/crm/bill-template/export-excel`, params })
+  },
+}
\ No newline at end of file
diff --git a/src/api/crm/billtemplateproduct/index.ts b/src/api/crm/billtemplateproduct/index.ts
new file mode 100644
index 000000000..1a1b1d2ac
--- /dev/null
+++ b/src/api/crm/billtemplateproduct/index.ts
@@ -0,0 +1,46 @@
+import request from '@/config/axios'
+
+// 票据模版产品关联 VO
+export interface BillTemplateProductVO {
+  id: number // 主键
+  billTemplateId: number // 票据模版ID
+  productId: number // 产品ID
+  productInvoice: number // 产品票据
+  productInvoiceItems: number // 产品开票项目
+  serviceFeeInvoice: number // 服务费票据
+  serviceFeeInvoiceItems: number // 服务费开票项目
+  status: number // 状态
+}
+
+// 票据模版产品关联 API
+export const BillTemplateProductApi = {
+  // 查询票据模版产品关联分页
+  getBillTemplateProductPage: async (params: any) => {
+    return await request.get({ url: `/crm/bill-template-product/page`, params })
+  },
+
+  // 查询票据模版产品关联详情
+  getBillTemplateProduct: async (id: number) => {
+    return await request.get({ url: `/crm/bill-template-product/get?id=` + id })
+  },
+
+  // 新增票据模版产品关联
+  createBillTemplateProduct: async (data: BillTemplateProductVO) => {
+    return await request.post({ url: `/crm/bill-template-product/create`, data })
+  },
+
+  // 修改票据模版产品关联
+  updateBillTemplateProduct: async (data: BillTemplateProductVO) => {
+    return await request.put({ url: `/crm/bill-template-product/update`, data })
+  },
+
+  // 删除票据模版产品关联
+  deleteBillTemplateProduct: async (id: number) => {
+    return await request.delete({ url: `/crm/bill-template-product/delete?id=` + id })
+  },
+
+  // 导出票据模版产品关联 Excel
+  exportBillTemplateProduct: async (params) => {
+    return await request.download({ url: `/crm/bill-template-product/export-excel`, params })
+  },
+}
diff --git a/src/views/crm/billtemplate/BillTemplateForm.vue b/src/views/crm/billtemplate/BillTemplateForm.vue
new file mode 100644
index 000000000..04646d5ff
--- /dev/null
+++ b/src/views/crm/billtemplate/BillTemplateForm.vue
@@ -0,0 +1,105 @@
+
+  
+
+
diff --git a/src/views/crm/billtemplate/index.vue b/src/views/crm/billtemplate/index.vue
new file mode 100644
index 000000000..41b17b61e
--- /dev/null
+++ b/src/views/crm/billtemplate/index.vue
@@ -0,0 +1,210 @@
+
+  
+    
+    
+      
+        
+      
+      
+        
+          
+        
+      
+      
+        
+      
+      
+         搜索
+         重置
+        
+           新增
+        
+        
+           导出
+        
+      
+    
+  
+
+  
+  
+    
+      
+      
+      
+        
+          
+        
+      
+      
+      
+      
+        
+          
+            编辑
+          
+          
+            删除
+          
+        
+      
+    
+    
+    
+  
+
+  
+  
+
+
+
diff --git a/src/views/crm/billtemplateproduct/BillTemplateProductForm.vue b/src/views/crm/billtemplateproduct/BillTemplateProductForm.vue
new file mode 100644
index 000000000..85afb917d
--- /dev/null
+++ b/src/views/crm/billtemplateproduct/BillTemplateProductForm.vue
@@ -0,0 +1,126 @@
+
+  
+
+
diff --git a/src/views/crm/billtemplateproduct/index.vue b/src/views/crm/billtemplateproduct/index.vue
new file mode 100644
index 000000000..fcb710407
--- /dev/null
+++ b/src/views/crm/billtemplateproduct/index.vue
@@ -0,0 +1,210 @@
+
+  
+    
+    
+      
+        
+      
+      
+        
+          
+        
+      
+      
+      
+         搜索
+         重置
+        
+           新增
+        
+        
+           导出
+        
+      
+    
+  
+
+  
+  
+    
+      
+      
+      
+      
+      
+      
+      
+
+      
+      
+      
+      
+      
+      
+      
+        
+          
+            编辑
+          
+          
+            删除
+          
+        
+      
+    
+    
+    
+  
+
+  
+  
+
+
+