From 1d8f07d32634854a07379479a760ba387a53314c Mon Sep 17 00:00:00 2001
From: zhangqian <zhangqian@123.com>
Date: 星期六, 05 八月 2023 17:31:29 +0800
Subject: [PATCH] 收款单管理及账户,支付方式

---
 model/request/paymentType.go |   22 
 router/bankAccount.go        |   17 
 model/bankAccount.go         |  140 ++
 docs/swagger.yaml            |  490 +++++++++
 api/v1/receipt.go            |  112 ++
 docs/docs.go                 |  757 ++++++++++++++
 docs/swagger.json            |  757 ++++++++++++++
 router/paymentType.go        |   17 
 api/v1/paymentType.go        |  112 ++
 model/receipt.go             |  149 ++
 constvar/paymentType.go      |   12 
 api/v1/bankAccount.go        |  112 ++
 constvar/receipt.go          |   12 
 model/request/receipt.go     |   22 
 model/paymentType.go         |  140 ++
 service/bankAccount.go       |   66 +
 router/index.go              |    3 
 constvar/bankAccount.go      |   12 
 router/receipt.go            |   17 
 model/request/bankAccount.go |   22 
 service/receipt.go           |   66 +
 service/paymentType.go       |   66 +
 22 files changed, 3,117 insertions(+), 6 deletions(-)

diff --git a/api/v1/bankAccount.go b/api/v1/bankAccount.go
new file mode 100644
index 0000000..bf81a94
--- /dev/null
+++ b/api/v1/bankAccount.go
@@ -0,0 +1,112 @@
+package v1
+
+import (
+	"aps_crm/model/request"
+	"aps_crm/model/response"
+	"aps_crm/pkg/contextx"
+	"aps_crm/pkg/ecode"
+	"aps_crm/service"
+	"github.com/gin-gonic/gin"
+	"strconv"
+)
+
+type BankAccountApi struct{}
+
+// Add
+// @Tags		閾惰璐︽埛绠$悊
+// @Summary	娣诲姞閾惰璐︽埛
+// @Produce	application/json
+// @Param		object	body		request.AddBankAccount	true	"鏌ヨ鍙傛暟"
+// @Success	200		{object}	contextx.Response{}
+// @Router		/api/bankAccount/add [post]
+func (s *BankAccountApi) Add(c *gin.Context) {
+	var params request.AddBankAccount
+	ctx, ok := contextx.NewContext(c, &params)
+	if !ok {
+		return
+	}
+
+	errCode := service.NewBankAccountService().AddBankAccount(&params.BankAccount)
+	if errCode != ecode.OK {
+		ctx.Fail(errCode)
+		return
+	}
+
+	ctx.Ok()
+}
+
+// Delete
+// @Tags		閾惰璐︽埛绠$悊
+// @Summary	鍒犻櫎閾惰璐︽埛
+// @Produce	application/json
+// @Param		id	path		int	true	"鏌ヨ鍙傛暟"
+// @Success	200	{object}	contextx.Response{}
+// @Router		/api/bankAccount/delete/{id} [delete]
+func (s *BankAccountApi) Delete(c *gin.Context) {
+	ctx, ok := contextx.NewContext(c, nil)
+	if !ok {
+		return
+	}
+
+	id, _ := strconv.Atoi(c.Param("id"))
+	errCode := service.NewBankAccountService().DeleteBankAccount(id)
+	if errCode != ecode.OK {
+		ctx.Fail(errCode)
+		return
+	}
+
+	ctx.Ok()
+}
+
+// Update
+// @Tags		閾惰璐︽埛绠$悊
+// @Summary	鏇存柊閾惰璐︽埛
+// @Produce	application/json
+// @Param		object	body		request.UpdateBankAccount	true	"鏌ヨ鍙傛暟"
+// @Success	200		{object}	contextx.Response{}
+// @Router		/api/bankAccount/update [put]
+func (s *BankAccountApi) Update(c *gin.Context) {
+	var params request.UpdateBankAccount
+	ctx, ok := contextx.NewContext(c, &params)
+	if !ok {
+		return
+	}
+    if params.Id == 0 {
+        ctx.Fail(ecode.ParamsErr)
+    }
+    params.BankAccount.Id = params.Id
+
+	errCode := service.NewBankAccountService().UpdateBankAccount(&params.BankAccount)
+	if errCode != ecode.OK {
+		ctx.Fail(errCode)
+		return
+	}
+
+	ctx.Ok()
+}
+
+// List
+// @Tags		閾惰璐︽埛绠$悊
+// @Summary	鑾峰彇閾惰璐︽埛鍒楄〃
+// @Produce	application/json
+// @Param		object	query		request.GetBankAccountList	true	"鍙傛暟"
+// @Success	200	{object}	response.ListResponse{data=[]model.BankAccount}
+// @Router		/api/bankAccount/list [get]
+func (s *BankAccountApi) List(c *gin.Context) {
+	var params request.GetBankAccountList
+	ctx, ok := contextx.NewContext(c, &params)
+	if !ok {
+		return
+	}
+
+	bankAccount, total, errCode := service.NewBankAccountService().GetBankAccountList()
+	if errCode != ecode.OK {
+		ctx.Fail(errCode)
+		return
+	}
+
+	ctx.OkWithDetailed(response.ListResponse{
+		Data: bankAccount,
+		Count: total,
+	})
+}
diff --git a/api/v1/paymentType.go b/api/v1/paymentType.go
new file mode 100644
index 0000000..28d0dc1
--- /dev/null
+++ b/api/v1/paymentType.go
@@ -0,0 +1,112 @@
+package v1
+
+import (
+	"aps_crm/model/request"
+	"aps_crm/model/response"
+	"aps_crm/pkg/contextx"
+	"aps_crm/pkg/ecode"
+	"aps_crm/service"
+	"github.com/gin-gonic/gin"
+	"strconv"
+)
+
+type PaymentTypeApi struct{}
+
+// Add
+// @Tags		鏀粯鏂瑰紡绠$悊
+// @Summary	娣诲姞鏀粯鏂瑰紡
+// @Produce	application/json
+// @Param		object	body		request.AddPaymentType	true	"鏌ヨ鍙傛暟"
+// @Success	200		{object}	contextx.Response{}
+// @Router		/api/paymentType/add [post]
+func (s *PaymentTypeApi) Add(c *gin.Context) {
+	var params request.AddPaymentType
+	ctx, ok := contextx.NewContext(c, &params)
+	if !ok {
+		return
+	}
+
+	errCode := service.NewPaymentTypeService().AddPaymentType(&params.PaymentType)
+	if errCode != ecode.OK {
+		ctx.Fail(errCode)
+		return
+	}
+
+	ctx.Ok()
+}
+
+// Delete
+// @Tags		鏀粯鏂瑰紡绠$悊
+// @Summary	鍒犻櫎鏀粯鏂瑰紡
+// @Produce	application/json
+// @Param		id	path		int	true	"鏌ヨ鍙傛暟"
+// @Success	200	{object}	contextx.Response{}
+// @Router		/api/paymentType/delete/{id} [delete]
+func (s *PaymentTypeApi) Delete(c *gin.Context) {
+	ctx, ok := contextx.NewContext(c, nil)
+	if !ok {
+		return
+	}
+
+	id, _ := strconv.Atoi(c.Param("id"))
+	errCode := service.NewPaymentTypeService().DeletePaymentType(id)
+	if errCode != ecode.OK {
+		ctx.Fail(errCode)
+		return
+	}
+
+	ctx.Ok()
+}
+
+// Update
+// @Tags		鏀粯鏂瑰紡绠$悊
+// @Summary	鏇存柊鏀粯鏂瑰紡
+// @Produce	application/json
+// @Param		object	body		request.UpdatePaymentType	true	"鏌ヨ鍙傛暟"
+// @Success	200		{object}	contextx.Response{}
+// @Router		/api/paymentType/update [put]
+func (s *PaymentTypeApi) Update(c *gin.Context) {
+	var params request.UpdatePaymentType
+	ctx, ok := contextx.NewContext(c, &params)
+	if !ok {
+		return
+	}
+    if params.Id == 0 {
+        ctx.Fail(ecode.ParamsErr)
+    }
+    params.PaymentType.Id = params.Id
+
+	errCode := service.NewPaymentTypeService().UpdatePaymentType(&params.PaymentType)
+	if errCode != ecode.OK {
+		ctx.Fail(errCode)
+		return
+	}
+
+	ctx.Ok()
+}
+
+// List
+// @Tags		鏀粯鏂瑰紡绠$悊
+// @Summary	鑾峰彇鏀粯鏂瑰紡鍒楄〃
+// @Produce	application/json
+// @Param		object	query		request.GetPaymentTypeList	true	"鍙傛暟"
+// @Success	200	{object}	response.ListResponse{data=[]model.PaymentType}
+// @Router		/api/paymentType/list [get]
+func (s *PaymentTypeApi) List(c *gin.Context) {
+	var params request.GetPaymentTypeList
+	ctx, ok := contextx.NewContext(c, &params)
+	if !ok {
+		return
+	}
+
+	paymentType, total, errCode := service.NewPaymentTypeService().GetPaymentTypeList()
+	if errCode != ecode.OK {
+		ctx.Fail(errCode)
+		return
+	}
+
+	ctx.OkWithDetailed(response.ListResponse{
+		Data: paymentType,
+		Count: total,
+	})
+}
diff --git a/api/v1/receipt.go b/api/v1/receipt.go
new file mode 100644
index 0000000..e507d08
--- /dev/null
+++ b/api/v1/receipt.go
@@ -0,0 +1,112 @@
+package v1
+
+import (
+	"aps_crm/model/request"
+	"aps_crm/model/response"
+	"aps_crm/pkg/contextx"
+	"aps_crm/pkg/ecode"
+	"aps_crm/service"
+	"github.com/gin-gonic/gin"
+	"strconv"
+)
+
+type ReceiptApi struct{}
+
+// Add
+// @Tags		鏀舵鍗曠鐞�
+// @Summary	娣诲姞鏀舵鍗�
+// @Produce	application/json
+// @Param		object	body		request.AddReceipt	true	"鏌ヨ鍙傛暟"
+// @Success	200		{object}	contextx.Response{}
+// @Router		/api/receipt/add [post]
+func (s *ReceiptApi) Add(c *gin.Context) {
+	var params request.AddReceipt
+	ctx, ok := contextx.NewContext(c, &params)
+	if !ok {
+		return
+	}
+
+	errCode := service.NewReceiptService().AddReceipt(&params.Receipt)
+	if errCode != ecode.OK {
+		ctx.Fail(errCode)
+		return
+	}
+
+	ctx.Ok()
+}
+
+// Delete
+// @Tags		鏀舵鍗曠鐞�
+// @Summary	鍒犻櫎鏀舵鍗�
+// @Produce	application/json
+// @Param		id	path		int	true	"鏌ヨ鍙傛暟"
+// @Success	200	{object}	contextx.Response{}
+// @Router		/api/receipt/delete/{id} [delete]
+func (s *ReceiptApi) Delete(c *gin.Context) {
+	ctx, ok := contextx.NewContext(c, nil)
+	if !ok {
+		return
+	}
+
+	id, _ := strconv.Atoi(c.Param("id"))
+	errCode := service.NewReceiptService().DeleteReceipt(id)
+	if errCode != ecode.OK {
+		ctx.Fail(errCode)
+		return
+	}
+
+	ctx.Ok()
+}
+
+// Update
+// @Tags		鏀舵鍗曠鐞�
+// @Summary	鏇存柊鏀舵鍗�
+// @Produce	application/json
+// @Param		object	body		request.UpdateReceipt	true	"鏌ヨ鍙傛暟"
+// @Success	200		{object}	contextx.Response{}
+// @Router		/api/receipt/update [put]
+func (s *ReceiptApi) Update(c *gin.Context) {
+	var params request.UpdateReceipt
+	ctx, ok := contextx.NewContext(c, &params)
+	if !ok {
+		return
+	}
+    if params.Id == 0 {
+        ctx.Fail(ecode.ParamsErr)
+    }
+    params.Receipt.Id = params.Id
+
+	errCode := service.NewReceiptService().UpdateReceipt(&params.Receipt)
+	if errCode != ecode.OK {
+		ctx.Fail(errCode)
+		return
+	}
+
+	ctx.Ok()
+}
+
+// List
+// @Tags		鏀舵鍗曠鐞�
+// @Summary	鑾峰彇鏀舵鍗曞垪琛�
+// @Produce	application/json
+// @Param		object	query		request.GetReceiptList	true	"鍙傛暟"
+// @Success	200	{object}	response.ListResponse{data=[]model.Receipt}
+// @Router		/api/receipt/list [get]
+func (s *ReceiptApi) List(c *gin.Context) {
+	var params request.GetReceiptList
+	ctx, ok := contextx.NewContext(c, &params)
+	if !ok {
+		return
+	}
+
+	receipt, total, errCode := service.NewReceiptService().GetReceiptList()
+	if errCode != ecode.OK {
+		ctx.Fail(errCode)
+		return
+	}
+
+	ctx.OkWithDetailed(response.ListResponse{
+		Data: receipt,
+		Count: total,
+	})
+}
diff --git a/constvar/bankAccount.go b/constvar/bankAccount.go
new file mode 100644
index 0000000..4e59333
--- /dev/null
+++ b/constvar/bankAccount.go
@@ -0,0 +1,12 @@
+package constvar
+type BankAccountQueryClass string
+
+const (
+	BankAccountQueryClassExpireLessThen60Days BankAccountQueryClass = ""
+)
+
+type BankAccountKeywordType string
+
+const (
+	BankAccountKeywordCustomerName   BankAccountKeywordType = ""
+)
diff --git a/constvar/paymentType.go b/constvar/paymentType.go
new file mode 100644
index 0000000..f44593a
--- /dev/null
+++ b/constvar/paymentType.go
@@ -0,0 +1,12 @@
+package constvar
+type PaymentTypeQueryClass string
+
+const (
+	PaymentTypeQueryClassExpireLessThen60Days PaymentTypeQueryClass = ""
+)
+
+type PaymentTypeKeywordType string
+
+const (
+	PaymentTypeKeywordCustomerName   PaymentTypeKeywordType = ""
+)
diff --git a/constvar/receipt.go b/constvar/receipt.go
new file mode 100644
index 0000000..df8e86e
--- /dev/null
+++ b/constvar/receipt.go
@@ -0,0 +1,12 @@
+package constvar
+type ReceiptQueryClass string
+
+const (
+	ReceiptQueryClassExpireLessThen60Days ReceiptQueryClass = ""
+)
+
+type ReceiptKeywordType string
+
+const (
+	ReceiptKeywordCustomerName   ReceiptKeywordType = ""
+)
diff --git a/docs/docs.go b/docs/docs.go
index 1c6480c..4b55d3a 100644
--- a/docs/docs.go
+++ b/docs/docs.go
@@ -241,6 +241,169 @@
                 }
             }
         },
+        "/api/bankAccount/add": {
+            "post": {
+                "produces": [
+                    "application/json"
+                ],
+                "tags": [
+                    "閾惰璐︽埛绠$悊"
+                ],
+                "summary": "娣诲姞閾惰璐︽埛",
+                "parameters": [
+                    {
+                        "description": "鏌ヨ鍙傛暟",
+                        "name": "object",
+                        "in": "body",
+                        "required": true,
+                        "schema": {
+                            "$ref": "#/definitions/request.AddBankAccount"
+                        }
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "OK",
+                        "schema": {
+                            "$ref": "#/definitions/contextx.Response"
+                        }
+                    }
+                }
+            }
+        },
+        "/api/bankAccount/delete/{id}": {
+            "delete": {
+                "produces": [
+                    "application/json"
+                ],
+                "tags": [
+                    "閾惰璐︽埛绠$悊"
+                ],
+                "summary": "鍒犻櫎閾惰璐︽埛",
+                "parameters": [
+                    {
+                        "type": "integer",
+                        "description": "鏌ヨ鍙傛暟",
+                        "name": "id",
+                        "in": "path",
+                        "required": true
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "OK",
+                        "schema": {
+                            "$ref": "#/definitions/contextx.Response"
+                        }
+                    }
+                }
+            }
+        },
+        "/api/bankAccount/list": {
+            "get": {
+                "produces": [
+                    "application/json"
+                ],
+                "tags": [
+                    "閾惰璐︽埛绠$悊"
+                ],
+                "summary": "鑾峰彇閾惰璐︽埛鍒楄〃",
+                "parameters": [
+                    {
+                        "type": "string",
+                        "name": "keyword",
+                        "in": "query"
+                    },
+                    {
+                        "enum": [
+                            ""
+                        ],
+                        "type": "string",
+                        "x-enum-varnames": [
+                            "BankAccountKeywordCustomerName"
+                        ],
+                        "name": "keywordType",
+                        "in": "query"
+                    },
+                    {
+                        "type": "integer",
+                        "description": "椤电爜",
+                        "name": "page",
+                        "in": "query"
+                    },
+                    {
+                        "type": "integer",
+                        "description": "姣忛〉澶у皬",
+                        "name": "pageSize",
+                        "in": "query"
+                    },
+                    {
+                        "enum": [
+                            ""
+                        ],
+                        "type": "string",
+                        "x-enum-varnames": [
+                            "BankAccountQueryClassExpireLessThen60Days"
+                        ],
+                        "name": "queryClass",
+                        "in": "query"
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "OK",
+                        "schema": {
+                            "allOf": [
+                                {
+                                    "$ref": "#/definitions/response.ListResponse"
+                                },
+                                {
+                                    "type": "object",
+                                    "properties": {
+                                        "data": {
+                                            "type": "array",
+                                            "items": {
+                                                "$ref": "#/definitions/model.BankAccount"
+                                            }
+                                        }
+                                    }
+                                }
+                            ]
+                        }
+                    }
+                }
+            }
+        },
+        "/api/bankAccount/update": {
+            "put": {
+                "produces": [
+                    "application/json"
+                ],
+                "tags": [
+                    "閾惰璐︽埛绠$悊"
+                ],
+                "summary": "鏇存柊閾惰璐︽埛",
+                "parameters": [
+                    {
+                        "description": "鏌ヨ鍙傛暟",
+                        "name": "object",
+                        "in": "body",
+                        "required": true,
+                        "schema": {
+                            "$ref": "#/definitions/request.UpdateBankAccount"
+                        }
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "OK",
+                        "schema": {
+                            "$ref": "#/definitions/contextx.Response"
+                        }
+                    }
+                }
+            }
+        },
         "/api/base/captcha": {
             "post": {
                 "produces": [
@@ -3271,6 +3434,169 @@
                 }
             }
         },
+        "/api/paymentType/add": {
+            "post": {
+                "produces": [
+                    "application/json"
+                ],
+                "tags": [
+                    "鏀粯鏂瑰紡绠$悊"
+                ],
+                "summary": "娣诲姞鏀粯鏂瑰紡",
+                "parameters": [
+                    {
+                        "description": "鏌ヨ鍙傛暟",
+                        "name": "object",
+                        "in": "body",
+                        "required": true,
+                        "schema": {
+                            "$ref": "#/definitions/request.AddPaymentType"
+                        }
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "OK",
+                        "schema": {
+                            "$ref": "#/definitions/contextx.Response"
+                        }
+                    }
+                }
+            }
+        },
+        "/api/paymentType/delete/{id}": {
+            "delete": {
+                "produces": [
+                    "application/json"
+                ],
+                "tags": [
+                    "鏀粯鏂瑰紡绠$悊"
+                ],
+                "summary": "鍒犻櫎鏀粯鏂瑰紡",
+                "parameters": [
+                    {
+                        "type": "integer",
+                        "description": "鏌ヨ鍙傛暟",
+                        "name": "id",
+                        "in": "path",
+                        "required": true
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "OK",
+                        "schema": {
+                            "$ref": "#/definitions/contextx.Response"
+                        }
+                    }
+                }
+            }
+        },
+        "/api/paymentType/list": {
+            "get": {
+                "produces": [
+                    "application/json"
+                ],
+                "tags": [
+                    "鏀粯鏂瑰紡绠$悊"
+                ],
+                "summary": "鑾峰彇鏀粯鏂瑰紡鍒楄〃",
+                "parameters": [
+                    {
+                        "type": "string",
+                        "name": "keyword",
+                        "in": "query"
+                    },
+                    {
+                        "enum": [
+                            ""
+                        ],
+                        "type": "string",
+                        "x-enum-varnames": [
+                            "PaymentTypeKeywordCustomerName"
+                        ],
+                        "name": "keywordType",
+                        "in": "query"
+                    },
+                    {
+                        "type": "integer",
+                        "description": "椤电爜",
+                        "name": "page",
+                        "in": "query"
+                    },
+                    {
+                        "type": "integer",
+                        "description": "姣忛〉澶у皬",
+                        "name": "pageSize",
+                        "in": "query"
+                    },
+                    {
+                        "enum": [
+                            ""
+                        ],
+                        "type": "string",
+                        "x-enum-varnames": [
+                            "PaymentTypeQueryClassExpireLessThen60Days"
+                        ],
+                        "name": "queryClass",
+                        "in": "query"
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "OK",
+                        "schema": {
+                            "allOf": [
+                                {
+                                    "$ref": "#/definitions/response.ListResponse"
+                                },
+                                {
+                                    "type": "object",
+                                    "properties": {
+                                        "data": {
+                                            "type": "array",
+                                            "items": {
+                                                "$ref": "#/definitions/model.PaymentType"
+                                            }
+                                        }
+                                    }
+                                }
+                            ]
+                        }
+                    }
+                }
+            }
+        },
+        "/api/paymentType/update": {
+            "put": {
+                "produces": [
+                    "application/json"
+                ],
+                "tags": [
+                    "鏀粯鏂瑰紡绠$悊"
+                ],
+                "summary": "鏇存柊鏀粯鏂瑰紡",
+                "parameters": [
+                    {
+                        "description": "鏌ヨ鍙傛暟",
+                        "name": "object",
+                        "in": "body",
+                        "required": true,
+                        "schema": {
+                            "$ref": "#/definitions/request.UpdatePaymentType"
+                        }
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "OK",
+                        "schema": {
+                            "$ref": "#/definitions/contextx.Response"
+                        }
+                    }
+                }
+            }
+        },
         "/api/plan/add": {
             "post": {
                 "produces": [
@@ -4036,6 +4362,169 @@
                         "required": true,
                         "schema": {
                             "$ref": "#/definitions/request.UpdateQuotationStatuss"
+                        }
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "OK",
+                        "schema": {
+                            "$ref": "#/definitions/contextx.Response"
+                        }
+                    }
+                }
+            }
+        },
+        "/api/receipt/add": {
+            "post": {
+                "produces": [
+                    "application/json"
+                ],
+                "tags": [
+                    "鏀舵鍗曠鐞�"
+                ],
+                "summary": "娣诲姞鏀舵鍗�",
+                "parameters": [
+                    {
+                        "description": "鏌ヨ鍙傛暟",
+                        "name": "object",
+                        "in": "body",
+                        "required": true,
+                        "schema": {
+                            "$ref": "#/definitions/request.AddReceipt"
+                        }
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "OK",
+                        "schema": {
+                            "$ref": "#/definitions/contextx.Response"
+                        }
+                    }
+                }
+            }
+        },
+        "/api/receipt/delete/{id}": {
+            "delete": {
+                "produces": [
+                    "application/json"
+                ],
+                "tags": [
+                    "鏀舵鍗曠鐞�"
+                ],
+                "summary": "鍒犻櫎鏀舵鍗�",
+                "parameters": [
+                    {
+                        "type": "integer",
+                        "description": "鏌ヨ鍙傛暟",
+                        "name": "id",
+                        "in": "path",
+                        "required": true
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "OK",
+                        "schema": {
+                            "$ref": "#/definitions/contextx.Response"
+                        }
+                    }
+                }
+            }
+        },
+        "/api/receipt/list": {
+            "get": {
+                "produces": [
+                    "application/json"
+                ],
+                "tags": [
+                    "鏀舵鍗曠鐞�"
+                ],
+                "summary": "鑾峰彇鏀舵鍗曞垪琛�",
+                "parameters": [
+                    {
+                        "type": "string",
+                        "name": "keyword",
+                        "in": "query"
+                    },
+                    {
+                        "enum": [
+                            ""
+                        ],
+                        "type": "string",
+                        "x-enum-varnames": [
+                            "ReceiptKeywordCustomerName"
+                        ],
+                        "name": "keywordType",
+                        "in": "query"
+                    },
+                    {
+                        "type": "integer",
+                        "description": "椤电爜",
+                        "name": "page",
+                        "in": "query"
+                    },
+                    {
+                        "type": "integer",
+                        "description": "姣忛〉澶у皬",
+                        "name": "pageSize",
+                        "in": "query"
+                    },
+                    {
+                        "enum": [
+                            ""
+                        ],
+                        "type": "string",
+                        "x-enum-varnames": [
+                            "ReceiptQueryClassExpireLessThen60Days"
+                        ],
+                        "name": "queryClass",
+                        "in": "query"
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "OK",
+                        "schema": {
+                            "allOf": [
+                                {
+                                    "$ref": "#/definitions/response.ListResponse"
+                                },
+                                {
+                                    "type": "object",
+                                    "properties": {
+                                        "data": {
+                                            "type": "array",
+                                            "items": {
+                                                "$ref": "#/definitions/model.Receipt"
+                                            }
+                                        }
+                                    }
+                                }
+                            ]
+                        }
+                    }
+                }
+            }
+        },
+        "/api/receipt/update": {
+            "put": {
+                "produces": [
+                    "application/json"
+                ],
+                "tags": [
+                    "鏀舵鍗曠鐞�"
+                ],
+                "summary": "鏇存柊鏀舵鍗�",
+                "parameters": [
+                    {
+                        "description": "鏌ヨ鍙傛暟",
+                        "name": "object",
+                        "in": "body",
+                        "required": true,
+                        "schema": {
+                            "$ref": "#/definitions/request.UpdateReceipt"
                         }
                     }
                 ],
@@ -8071,6 +8560,24 @@
         }
     },
     "definitions": {
+        "constvar.BankAccountKeywordType": {
+            "type": "string",
+            "enum": [
+                ""
+            ],
+            "x-enum-varnames": [
+                "BankAccountKeywordCustomerName"
+            ]
+        },
+        "constvar.BankAccountQueryClass": {
+            "type": "string",
+            "enum": [
+                ""
+            ],
+            "x-enum-varnames": [
+                "BankAccountQueryClassExpireLessThen60Days"
+            ]
+        },
         "constvar.FaqKeywordType": {
             "type": "string",
             "enum": [
@@ -8087,6 +8594,42 @@
             ],
             "x-enum-varnames": [
                 "FaqQueryClassExpireLessThen60Days"
+            ]
+        },
+        "constvar.PaymentTypeKeywordType": {
+            "type": "string",
+            "enum": [
+                ""
+            ],
+            "x-enum-varnames": [
+                "PaymentTypeKeywordCustomerName"
+            ]
+        },
+        "constvar.PaymentTypeQueryClass": {
+            "type": "string",
+            "enum": [
+                ""
+            ],
+            "x-enum-varnames": [
+                "PaymentTypeQueryClassExpireLessThen60Days"
+            ]
+        },
+        "constvar.ReceiptKeywordType": {
+            "type": "string",
+            "enum": [
+                ""
+            ],
+            "x-enum-varnames": [
+                "ReceiptKeywordCustomerName"
+            ]
+        },
+        "constvar.ReceiptQueryClass": {
+            "type": "string",
+            "enum": [
+                ""
+            ],
+            "x-enum-varnames": [
+                "ReceiptQueryClassExpireLessThen60Days"
             ]
         },
         "constvar.SalesStatus": {
@@ -8281,6 +8824,17 @@
                     "items": {
                         "$ref": "#/definitions/model.Menu"
                     }
+                }
+            }
+        },
+        "model.BankAccount": {
+            "type": "object",
+            "properties": {
+                "id": {
+                    "type": "integer"
+                },
+                "name": {
+                    "type": "string"
                 }
             }
         },
@@ -8941,6 +9495,17 @@
                 }
             }
         },
+        "model.PaymentType": {
+            "type": "object",
+            "properties": {
+                "id": {
+                    "type": "integer"
+                },
+                "name": {
+                    "type": "string"
+                }
+            }
+        },
         "model.Plan": {
             "type": "object",
             "properties": {
@@ -9099,6 +9664,54 @@
                 },
                 "name": {
                     "type": "string"
+                }
+            }
+        },
+        "model.Receipt": {
+            "type": "object",
+            "properties": {
+                "bankAccountId": {
+                    "description": "璐︽埛id",
+                    "type": "integer"
+                },
+                "clientId": {
+                    "description": "瀹㈡埛id",
+                    "type": "integer"
+                },
+                "fileId": {
+                    "description": "闄勪欢id",
+                    "type": "integer"
+                },
+                "id": {
+                    "type": "integer"
+                },
+                "moneyType": {
+                    "description": "甯佺",
+                    "type": "string"
+                },
+                "paymentTypeId": {
+                    "description": "鏀舵鏂瑰紡ID",
+                    "type": "integer"
+                },
+                "principalId": {
+                    "description": "璐熻矗浜篿d",
+                    "type": "integer"
+                },
+                "receiptDate": {
+                    "description": "鏀舵鏃ユ湡",
+                    "type": "string"
+                },
+                "remark": {
+                    "description": "澶囨敞",
+                    "type": "string"
+                },
+                "sourceId": {
+                    "description": "婧愬崟id",
+                    "type": "integer"
+                },
+                "sourceType": {
+                    "description": "鏉ユ簮绫诲瀷锛�1閿�鍞槑缁嗗崟2鏈嶅姟鍚堝悓3閿�鍞彂绁�4鏀舵璁″垝5鍑哄簱鍗曪級",
+                    "type": "integer"
                 }
             }
         },
@@ -9584,7 +10197,7 @@
                     "description": "姣斾緥",
                     "type": "number"
                 },
-                "principal": {
+                "principalId": {
                     "description": "鏀舵璐熻矗浜篒D",
                     "type": "integer"
                 },
@@ -10082,6 +10695,17 @@
                 }
             }
         },
+        "request.AddBankAccount": {
+            "type": "object",
+            "properties": {
+                "id": {
+                    "type": "integer"
+                },
+                "name": {
+                    "type": "string"
+                }
+            }
+        },
         "request.AddCity": {
             "type": "object",
             "properties": {
@@ -10517,6 +11141,17 @@
                 }
             }
         },
+        "request.AddPaymentType": {
+            "type": "object",
+            "properties": {
+                "id": {
+                    "type": "integer"
+                },
+                "name": {
+                    "type": "string"
+                }
+            }
+        },
         "request.AddPlan": {
             "type": "object",
             "properties": {
@@ -10596,6 +11231,54 @@
             "properties": {
                 "name": {
                     "type": "string"
+                }
+            }
+        },
+        "request.AddReceipt": {
+            "type": "object",
+            "properties": {
+                "bankAccountId": {
+                    "description": "璐︽埛id",
+                    "type": "integer"
+                },
+                "clientId": {
+                    "description": "瀹㈡埛id",
+                    "type": "integer"
+                },
+                "fileId": {
+                    "description": "闄勪欢id",
+                    "type": "integer"
+                },
+                "id": {
+                    "type": "integer"
+                },
+                "moneyType": {
+                    "description": "甯佺",
+                    "type": "string"
+                },
+                "paymentTypeId": {
+                    "description": "鏀舵鏂瑰紡ID",
+                    "type": "integer"
+                },
+                "principalId": {
+                    "description": "璐熻矗浜篿d",
+                    "type": "integer"
+                },
+                "receiptDate": {
+                    "description": "鏀舵鏃ユ湡",
+                    "type": "string"
+                },
+                "remark": {
+                    "description": "澶囨敞",
+                    "type": "string"
+                },
+                "sourceId": {
+                    "description": "婧愬崟id",
+                    "type": "integer"
+                },
+                "sourceType": {
+                    "description": "鏉ユ簮绫诲瀷锛�1閿�鍞槑缁嗗崟2鏈嶅姟鍚堝悓3閿�鍞彂绁�4鏀舵璁″垝5鍑哄簱鍗曪級",
+                    "type": "integer"
                 }
             }
         },
@@ -12208,6 +12891,17 @@
                 }
             }
         },
+        "request.UpdateBankAccount": {
+            "type": "object",
+            "properties": {
+                "id": {
+                    "type": "integer"
+                },
+                "name": {
+                    "type": "string"
+                }
+            }
+        },
         "request.UpdateCities": {
             "type": "object",
             "properties": {
@@ -12899,6 +13593,17 @@
                 }
             }
         },
+        "request.UpdatePaymentType": {
+            "type": "object",
+            "properties": {
+                "id": {
+                    "type": "integer"
+                },
+                "name": {
+                    "type": "string"
+                }
+            }
+        },
         "request.UpdatePlan": {
             "type": "object",
             "properties": {
@@ -13036,6 +13741,54 @@
                     "items": {
                         "$ref": "#/definitions/request.UpdateQuotationStatus"
                     }
+                }
+            }
+        },
+        "request.UpdateReceipt": {
+            "type": "object",
+            "properties": {
+                "bankAccountId": {
+                    "description": "璐︽埛id",
+                    "type": "integer"
+                },
+                "clientId": {
+                    "description": "瀹㈡埛id",
+                    "type": "integer"
+                },
+                "fileId": {
+                    "description": "闄勪欢id",
+                    "type": "integer"
+                },
+                "id": {
+                    "type": "integer"
+                },
+                "moneyType": {
+                    "description": "甯佺",
+                    "type": "string"
+                },
+                "paymentTypeId": {
+                    "description": "鏀舵鏂瑰紡ID",
+                    "type": "integer"
+                },
+                "principalId": {
+                    "description": "璐熻矗浜篿d",
+                    "type": "integer"
+                },
+                "receiptDate": {
+                    "description": "鏀舵鏃ユ湡",
+                    "type": "string"
+                },
+                "remark": {
+                    "description": "澶囨敞",
+                    "type": "string"
+                },
+                "sourceId": {
+                    "description": "婧愬崟id",
+                    "type": "integer"
+                },
+                "sourceType": {
+                    "description": "鏉ユ簮绫诲瀷锛�1閿�鍞槑缁嗗崟2鏈嶅姟鍚堝悓3閿�鍞彂绁�4鏀舵璁″垝5鍑哄簱鍗曪級",
+                    "type": "integer"
                 }
             }
         },
@@ -13573,7 +14326,7 @@
                     "description": "姣斾緥",
                     "type": "number"
                 },
-                "principal": {
+                "principalId": {
                     "description": "鏀舵璐熻矗浜篒D",
                     "type": "integer"
                 },
diff --git a/docs/swagger.json b/docs/swagger.json
index 7aa19d5..67562ee 100644
--- a/docs/swagger.json
+++ b/docs/swagger.json
@@ -229,6 +229,169 @@
                 }
             }
         },
+        "/api/bankAccount/add": {
+            "post": {
+                "produces": [
+                    "application/json"
+                ],
+                "tags": [
+                    "閾惰璐︽埛绠$悊"
+                ],
+                "summary": "娣诲姞閾惰璐︽埛",
+                "parameters": [
+                    {
+                        "description": "鏌ヨ鍙傛暟",
+                        "name": "object",
+                        "in": "body",
+                        "required": true,
+                        "schema": {
+                            "$ref": "#/definitions/request.AddBankAccount"
+                        }
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "OK",
+                        "schema": {
+                            "$ref": "#/definitions/contextx.Response"
+                        }
+                    }
+                }
+            }
+        },
+        "/api/bankAccount/delete/{id}": {
+            "delete": {
+                "produces": [
+                    "application/json"
+                ],
+                "tags": [
+                    "閾惰璐︽埛绠$悊"
+                ],
+                "summary": "鍒犻櫎閾惰璐︽埛",
+                "parameters": [
+                    {
+                        "type": "integer",
+                        "description": "鏌ヨ鍙傛暟",
+                        "name": "id",
+                        "in": "path",
+                        "required": true
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "OK",
+                        "schema": {
+                            "$ref": "#/definitions/contextx.Response"
+                        }
+                    }
+                }
+            }
+        },
+        "/api/bankAccount/list": {
+            "get": {
+                "produces": [
+                    "application/json"
+                ],
+                "tags": [
+                    "閾惰璐︽埛绠$悊"
+                ],
+                "summary": "鑾峰彇閾惰璐︽埛鍒楄〃",
+                "parameters": [
+                    {
+                        "type": "string",
+                        "name": "keyword",
+                        "in": "query"
+                    },
+                    {
+                        "enum": [
+                            ""
+                        ],
+                        "type": "string",
+                        "x-enum-varnames": [
+                            "BankAccountKeywordCustomerName"
+                        ],
+                        "name": "keywordType",
+                        "in": "query"
+                    },
+                    {
+                        "type": "integer",
+                        "description": "椤电爜",
+                        "name": "page",
+                        "in": "query"
+                    },
+                    {
+                        "type": "integer",
+                        "description": "姣忛〉澶у皬",
+                        "name": "pageSize",
+                        "in": "query"
+                    },
+                    {
+                        "enum": [
+                            ""
+                        ],
+                        "type": "string",
+                        "x-enum-varnames": [
+                            "BankAccountQueryClassExpireLessThen60Days"
+                        ],
+                        "name": "queryClass",
+                        "in": "query"
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "OK",
+                        "schema": {
+                            "allOf": [
+                                {
+                                    "$ref": "#/definitions/response.ListResponse"
+                                },
+                                {
+                                    "type": "object",
+                                    "properties": {
+                                        "data": {
+                                            "type": "array",
+                                            "items": {
+                                                "$ref": "#/definitions/model.BankAccount"
+                                            }
+                                        }
+                                    }
+                                }
+                            ]
+                        }
+                    }
+                }
+            }
+        },
+        "/api/bankAccount/update": {
+            "put": {
+                "produces": [
+                    "application/json"
+                ],
+                "tags": [
+                    "閾惰璐︽埛绠$悊"
+                ],
+                "summary": "鏇存柊閾惰璐︽埛",
+                "parameters": [
+                    {
+                        "description": "鏌ヨ鍙傛暟",
+                        "name": "object",
+                        "in": "body",
+                        "required": true,
+                        "schema": {
+                            "$ref": "#/definitions/request.UpdateBankAccount"
+                        }
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "OK",
+                        "schema": {
+                            "$ref": "#/definitions/contextx.Response"
+                        }
+                    }
+                }
+            }
+        },
         "/api/base/captcha": {
             "post": {
                 "produces": [
@@ -3259,6 +3422,169 @@
                 }
             }
         },
+        "/api/paymentType/add": {
+            "post": {
+                "produces": [
+                    "application/json"
+                ],
+                "tags": [
+                    "鏀粯鏂瑰紡绠$悊"
+                ],
+                "summary": "娣诲姞鏀粯鏂瑰紡",
+                "parameters": [
+                    {
+                        "description": "鏌ヨ鍙傛暟",
+                        "name": "object",
+                        "in": "body",
+                        "required": true,
+                        "schema": {
+                            "$ref": "#/definitions/request.AddPaymentType"
+                        }
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "OK",
+                        "schema": {
+                            "$ref": "#/definitions/contextx.Response"
+                        }
+                    }
+                }
+            }
+        },
+        "/api/paymentType/delete/{id}": {
+            "delete": {
+                "produces": [
+                    "application/json"
+                ],
+                "tags": [
+                    "鏀粯鏂瑰紡绠$悊"
+                ],
+                "summary": "鍒犻櫎鏀粯鏂瑰紡",
+                "parameters": [
+                    {
+                        "type": "integer",
+                        "description": "鏌ヨ鍙傛暟",
+                        "name": "id",
+                        "in": "path",
+                        "required": true
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "OK",
+                        "schema": {
+                            "$ref": "#/definitions/contextx.Response"
+                        }
+                    }
+                }
+            }
+        },
+        "/api/paymentType/list": {
+            "get": {
+                "produces": [
+                    "application/json"
+                ],
+                "tags": [
+                    "鏀粯鏂瑰紡绠$悊"
+                ],
+                "summary": "鑾峰彇鏀粯鏂瑰紡鍒楄〃",
+                "parameters": [
+                    {
+                        "type": "string",
+                        "name": "keyword",
+                        "in": "query"
+                    },
+                    {
+                        "enum": [
+                            ""
+                        ],
+                        "type": "string",
+                        "x-enum-varnames": [
+                            "PaymentTypeKeywordCustomerName"
+                        ],
+                        "name": "keywordType",
+                        "in": "query"
+                    },
+                    {
+                        "type": "integer",
+                        "description": "椤电爜",
+                        "name": "page",
+                        "in": "query"
+                    },
+                    {
+                        "type": "integer",
+                        "description": "姣忛〉澶у皬",
+                        "name": "pageSize",
+                        "in": "query"
+                    },
+                    {
+                        "enum": [
+                            ""
+                        ],
+                        "type": "string",
+                        "x-enum-varnames": [
+                            "PaymentTypeQueryClassExpireLessThen60Days"
+                        ],
+                        "name": "queryClass",
+                        "in": "query"
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "OK",
+                        "schema": {
+                            "allOf": [
+                                {
+                                    "$ref": "#/definitions/response.ListResponse"
+                                },
+                                {
+                                    "type": "object",
+                                    "properties": {
+                                        "data": {
+                                            "type": "array",
+                                            "items": {
+                                                "$ref": "#/definitions/model.PaymentType"
+                                            }
+                                        }
+                                    }
+                                }
+                            ]
+                        }
+                    }
+                }
+            }
+        },
+        "/api/paymentType/update": {
+            "put": {
+                "produces": [
+                    "application/json"
+                ],
+                "tags": [
+                    "鏀粯鏂瑰紡绠$悊"
+                ],
+                "summary": "鏇存柊鏀粯鏂瑰紡",
+                "parameters": [
+                    {
+                        "description": "鏌ヨ鍙傛暟",
+                        "name": "object",
+                        "in": "body",
+                        "required": true,
+                        "schema": {
+                            "$ref": "#/definitions/request.UpdatePaymentType"
+                        }
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "OK",
+                        "schema": {
+                            "$ref": "#/definitions/contextx.Response"
+                        }
+                    }
+                }
+            }
+        },
         "/api/plan/add": {
             "post": {
                 "produces": [
@@ -4024,6 +4350,169 @@
                         "required": true,
                         "schema": {
                             "$ref": "#/definitions/request.UpdateQuotationStatuss"
+                        }
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "OK",
+                        "schema": {
+                            "$ref": "#/definitions/contextx.Response"
+                        }
+                    }
+                }
+            }
+        },
+        "/api/receipt/add": {
+            "post": {
+                "produces": [
+                    "application/json"
+                ],
+                "tags": [
+                    "鏀舵鍗曠鐞�"
+                ],
+                "summary": "娣诲姞鏀舵鍗�",
+                "parameters": [
+                    {
+                        "description": "鏌ヨ鍙傛暟",
+                        "name": "object",
+                        "in": "body",
+                        "required": true,
+                        "schema": {
+                            "$ref": "#/definitions/request.AddReceipt"
+                        }
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "OK",
+                        "schema": {
+                            "$ref": "#/definitions/contextx.Response"
+                        }
+                    }
+                }
+            }
+        },
+        "/api/receipt/delete/{id}": {
+            "delete": {
+                "produces": [
+                    "application/json"
+                ],
+                "tags": [
+                    "鏀舵鍗曠鐞�"
+                ],
+                "summary": "鍒犻櫎鏀舵鍗�",
+                "parameters": [
+                    {
+                        "type": "integer",
+                        "description": "鏌ヨ鍙傛暟",
+                        "name": "id",
+                        "in": "path",
+                        "required": true
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "OK",
+                        "schema": {
+                            "$ref": "#/definitions/contextx.Response"
+                        }
+                    }
+                }
+            }
+        },
+        "/api/receipt/list": {
+            "get": {
+                "produces": [
+                    "application/json"
+                ],
+                "tags": [
+                    "鏀舵鍗曠鐞�"
+                ],
+                "summary": "鑾峰彇鏀舵鍗曞垪琛�",
+                "parameters": [
+                    {
+                        "type": "string",
+                        "name": "keyword",
+                        "in": "query"
+                    },
+                    {
+                        "enum": [
+                            ""
+                        ],
+                        "type": "string",
+                        "x-enum-varnames": [
+                            "ReceiptKeywordCustomerName"
+                        ],
+                        "name": "keywordType",
+                        "in": "query"
+                    },
+                    {
+                        "type": "integer",
+                        "description": "椤电爜",
+                        "name": "page",
+                        "in": "query"
+                    },
+                    {
+                        "type": "integer",
+                        "description": "姣忛〉澶у皬",
+                        "name": "pageSize",
+                        "in": "query"
+                    },
+                    {
+                        "enum": [
+                            ""
+                        ],
+                        "type": "string",
+                        "x-enum-varnames": [
+                            "ReceiptQueryClassExpireLessThen60Days"
+                        ],
+                        "name": "queryClass",
+                        "in": "query"
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "OK",
+                        "schema": {
+                            "allOf": [
+                                {
+                                    "$ref": "#/definitions/response.ListResponse"
+                                },
+                                {
+                                    "type": "object",
+                                    "properties": {
+                                        "data": {
+                                            "type": "array",
+                                            "items": {
+                                                "$ref": "#/definitions/model.Receipt"
+                                            }
+                                        }
+                                    }
+                                }
+                            ]
+                        }
+                    }
+                }
+            }
+        },
+        "/api/receipt/update": {
+            "put": {
+                "produces": [
+                    "application/json"
+                ],
+                "tags": [
+                    "鏀舵鍗曠鐞�"
+                ],
+                "summary": "鏇存柊鏀舵鍗�",
+                "parameters": [
+                    {
+                        "description": "鏌ヨ鍙傛暟",
+                        "name": "object",
+                        "in": "body",
+                        "required": true,
+                        "schema": {
+                            "$ref": "#/definitions/request.UpdateReceipt"
                         }
                     }
                 ],
@@ -8059,6 +8548,24 @@
         }
     },
     "definitions": {
+        "constvar.BankAccountKeywordType": {
+            "type": "string",
+            "enum": [
+                ""
+            ],
+            "x-enum-varnames": [
+                "BankAccountKeywordCustomerName"
+            ]
+        },
+        "constvar.BankAccountQueryClass": {
+            "type": "string",
+            "enum": [
+                ""
+            ],
+            "x-enum-varnames": [
+                "BankAccountQueryClassExpireLessThen60Days"
+            ]
+        },
         "constvar.FaqKeywordType": {
             "type": "string",
             "enum": [
@@ -8075,6 +8582,42 @@
             ],
             "x-enum-varnames": [
                 "FaqQueryClassExpireLessThen60Days"
+            ]
+        },
+        "constvar.PaymentTypeKeywordType": {
+            "type": "string",
+            "enum": [
+                ""
+            ],
+            "x-enum-varnames": [
+                "PaymentTypeKeywordCustomerName"
+            ]
+        },
+        "constvar.PaymentTypeQueryClass": {
+            "type": "string",
+            "enum": [
+                ""
+            ],
+            "x-enum-varnames": [
+                "PaymentTypeQueryClassExpireLessThen60Days"
+            ]
+        },
+        "constvar.ReceiptKeywordType": {
+            "type": "string",
+            "enum": [
+                ""
+            ],
+            "x-enum-varnames": [
+                "ReceiptKeywordCustomerName"
+            ]
+        },
+        "constvar.ReceiptQueryClass": {
+            "type": "string",
+            "enum": [
+                ""
+            ],
+            "x-enum-varnames": [
+                "ReceiptQueryClassExpireLessThen60Days"
             ]
         },
         "constvar.SalesStatus": {
@@ -8269,6 +8812,17 @@
                     "items": {
                         "$ref": "#/definitions/model.Menu"
                     }
+                }
+            }
+        },
+        "model.BankAccount": {
+            "type": "object",
+            "properties": {
+                "id": {
+                    "type": "integer"
+                },
+                "name": {
+                    "type": "string"
                 }
             }
         },
@@ -8929,6 +9483,17 @@
                 }
             }
         },
+        "model.PaymentType": {
+            "type": "object",
+            "properties": {
+                "id": {
+                    "type": "integer"
+                },
+                "name": {
+                    "type": "string"
+                }
+            }
+        },
         "model.Plan": {
             "type": "object",
             "properties": {
@@ -9087,6 +9652,54 @@
                 },
                 "name": {
                     "type": "string"
+                }
+            }
+        },
+        "model.Receipt": {
+            "type": "object",
+            "properties": {
+                "bankAccountId": {
+                    "description": "璐︽埛id",
+                    "type": "integer"
+                },
+                "clientId": {
+                    "description": "瀹㈡埛id",
+                    "type": "integer"
+                },
+                "fileId": {
+                    "description": "闄勪欢id",
+                    "type": "integer"
+                },
+                "id": {
+                    "type": "integer"
+                },
+                "moneyType": {
+                    "description": "甯佺",
+                    "type": "string"
+                },
+                "paymentTypeId": {
+                    "description": "鏀舵鏂瑰紡ID",
+                    "type": "integer"
+                },
+                "principalId": {
+                    "description": "璐熻矗浜篿d",
+                    "type": "integer"
+                },
+                "receiptDate": {
+                    "description": "鏀舵鏃ユ湡",
+                    "type": "string"
+                },
+                "remark": {
+                    "description": "澶囨敞",
+                    "type": "string"
+                },
+                "sourceId": {
+                    "description": "婧愬崟id",
+                    "type": "integer"
+                },
+                "sourceType": {
+                    "description": "鏉ユ簮绫诲瀷锛�1閿�鍞槑缁嗗崟2鏈嶅姟鍚堝悓3閿�鍞彂绁�4鏀舵璁″垝5鍑哄簱鍗曪級",
+                    "type": "integer"
                 }
             }
         },
@@ -9572,7 +10185,7 @@
                     "description": "姣斾緥",
                     "type": "number"
                 },
-                "principal": {
+                "principalId": {
                     "description": "鏀舵璐熻矗浜篒D",
                     "type": "integer"
                 },
@@ -10070,6 +10683,17 @@
                 }
             }
         },
+        "request.AddBankAccount": {
+            "type": "object",
+            "properties": {
+                "id": {
+                    "type": "integer"
+                },
+                "name": {
+                    "type": "string"
+                }
+            }
+        },
         "request.AddCity": {
             "type": "object",
             "properties": {
@@ -10505,6 +11129,17 @@
                 }
             }
         },
+        "request.AddPaymentType": {
+            "type": "object",
+            "properties": {
+                "id": {
+                    "type": "integer"
+                },
+                "name": {
+                    "type": "string"
+                }
+            }
+        },
         "request.AddPlan": {
             "type": "object",
             "properties": {
@@ -10584,6 +11219,54 @@
             "properties": {
                 "name": {
                     "type": "string"
+                }
+            }
+        },
+        "request.AddReceipt": {
+            "type": "object",
+            "properties": {
+                "bankAccountId": {
+                    "description": "璐︽埛id",
+                    "type": "integer"
+                },
+                "clientId": {
+                    "description": "瀹㈡埛id",
+                    "type": "integer"
+                },
+                "fileId": {
+                    "description": "闄勪欢id",
+                    "type": "integer"
+                },
+                "id": {
+                    "type": "integer"
+                },
+                "moneyType": {
+                    "description": "甯佺",
+                    "type": "string"
+                },
+                "paymentTypeId": {
+                    "description": "鏀舵鏂瑰紡ID",
+                    "type": "integer"
+                },
+                "principalId": {
+                    "description": "璐熻矗浜篿d",
+                    "type": "integer"
+                },
+                "receiptDate": {
+                    "description": "鏀舵鏃ユ湡",
+                    "type": "string"
+                },
+                "remark": {
+                    "description": "澶囨敞",
+                    "type": "string"
+                },
+                "sourceId": {
+                    "description": "婧愬崟id",
+                    "type": "integer"
+                },
+                "sourceType": {
+                    "description": "鏉ユ簮绫诲瀷锛�1閿�鍞槑缁嗗崟2鏈嶅姟鍚堝悓3閿�鍞彂绁�4鏀舵璁″垝5鍑哄簱鍗曪級",
+                    "type": "integer"
                 }
             }
         },
@@ -12196,6 +12879,17 @@
                 }
             }
         },
+        "request.UpdateBankAccount": {
+            "type": "object",
+            "properties": {
+                "id": {
+                    "type": "integer"
+                },
+                "name": {
+                    "type": "string"
+                }
+            }
+        },
         "request.UpdateCities": {
             "type": "object",
             "properties": {
@@ -12887,6 +13581,17 @@
                 }
             }
         },
+        "request.UpdatePaymentType": {
+            "type": "object",
+            "properties": {
+                "id": {
+                    "type": "integer"
+                },
+                "name": {
+                    "type": "string"
+                }
+            }
+        },
         "request.UpdatePlan": {
             "type": "object",
             "properties": {
@@ -13024,6 +13729,54 @@
                     "items": {
                         "$ref": "#/definitions/request.UpdateQuotationStatus"
                     }
+                }
+            }
+        },
+        "request.UpdateReceipt": {
+            "type": "object",
+            "properties": {
+                "bankAccountId": {
+                    "description": "璐︽埛id",
+                    "type": "integer"
+                },
+                "clientId": {
+                    "description": "瀹㈡埛id",
+                    "type": "integer"
+                },
+                "fileId": {
+                    "description": "闄勪欢id",
+                    "type": "integer"
+                },
+                "id": {
+                    "type": "integer"
+                },
+                "moneyType": {
+                    "description": "甯佺",
+                    "type": "string"
+                },
+                "paymentTypeId": {
+                    "description": "鏀舵鏂瑰紡ID",
+                    "type": "integer"
+                },
+                "principalId": {
+                    "description": "璐熻矗浜篿d",
+                    "type": "integer"
+                },
+                "receiptDate": {
+                    "description": "鏀舵鏃ユ湡",
+                    "type": "string"
+                },
+                "remark": {
+                    "description": "澶囨敞",
+                    "type": "string"
+                },
+                "sourceId": {
+                    "description": "婧愬崟id",
+                    "type": "integer"
+                },
+                "sourceType": {
+                    "description": "鏉ユ簮绫诲瀷锛�1閿�鍞槑缁嗗崟2鏈嶅姟鍚堝悓3閿�鍞彂绁�4鏀舵璁″垝5鍑哄簱鍗曪級",
+                    "type": "integer"
                 }
             }
         },
@@ -13561,7 +14314,7 @@
                     "description": "姣斾緥",
                     "type": "number"
                 },
-                "principal": {
+                "principalId": {
                     "description": "鏀舵璐熻矗浜篒D",
                     "type": "integer"
                 },
diff --git a/docs/swagger.yaml b/docs/swagger.yaml
index 6fb9f7b..c8dcd43 100644
--- a/docs/swagger.yaml
+++ b/docs/swagger.yaml
@@ -1,4 +1,16 @@
 definitions:
+  constvar.BankAccountKeywordType:
+    enum:
+    - ""
+    type: string
+    x-enum-varnames:
+    - BankAccountKeywordCustomerName
+  constvar.BankAccountQueryClass:
+    enum:
+    - ""
+    type: string
+    x-enum-varnames:
+    - BankAccountQueryClassExpireLessThen60Days
   constvar.FaqKeywordType:
     enum:
     - ""
@@ -11,6 +23,30 @@
     type: string
     x-enum-varnames:
     - FaqQueryClassExpireLessThen60Days
+  constvar.PaymentTypeKeywordType:
+    enum:
+    - ""
+    type: string
+    x-enum-varnames:
+    - PaymentTypeKeywordCustomerName
+  constvar.PaymentTypeQueryClass:
+    enum:
+    - ""
+    type: string
+    x-enum-varnames:
+    - PaymentTypeQueryClassExpireLessThen60Days
+  constvar.ReceiptKeywordType:
+    enum:
+    - ""
+    type: string
+    x-enum-varnames:
+    - ReceiptKeywordCustomerName
+  constvar.ReceiptQueryClass:
+    enum:
+    - ""
+    type: string
+    x-enum-varnames:
+    - ReceiptQueryClassExpireLessThen60Days
   constvar.SalesStatus:
     enum:
     - 1
@@ -167,6 +203,13 @@
         items:
           $ref: '#/definitions/model.Menu'
         type: array
+    type: object
+  model.BankAccount:
+    properties:
+      id:
+        type: integer
+      name:
+        type: string
     type: object
   model.City:
     properties:
@@ -598,6 +641,13 @@
       name:
         type: string
     type: object
+  model.PaymentType:
+    properties:
+      id:
+        type: integer
+      name:
+        type: string
+    type: object
   model.Plan:
     properties:
       clientId:
@@ -702,6 +752,41 @@
         type: integer
       name:
         type: string
+    type: object
+  model.Receipt:
+    properties:
+      bankAccountId:
+        description: 璐︽埛id
+        type: integer
+      clientId:
+        description: 瀹㈡埛id
+        type: integer
+      fileId:
+        description: 闄勪欢id
+        type: integer
+      id:
+        type: integer
+      moneyType:
+        description: 甯佺
+        type: string
+      paymentTypeId:
+        description: 鏀舵鏂瑰紡ID
+        type: integer
+      principalId:
+        description: 璐熻矗浜篿d
+        type: integer
+      receiptDate:
+        description: 鏀舵鏃ユ湡
+        type: string
+      remark:
+        description: 澶囨敞
+        type: string
+      sourceId:
+        description: 婧愬崟id
+        type: integer
+      sourceType:
+        description: 鏉ユ簮绫诲瀷锛�1閿�鍞槑缁嗗崟2鏈嶅姟鍚堝悓3閿�鍞彂绁�4鏀舵璁″垝5鍑哄簱鍗曪級
+        type: integer
     type: object
   model.RefundMethod:
     properties:
@@ -1021,7 +1106,7 @@
       percent:
         description: 姣斾緥
         type: number
-      principal:
+      principalId:
         description: 鏀舵璐熻矗浜篒D
         type: integer
       remark:
@@ -1358,6 +1443,13 @@
           $ref: '#/definitions/request.CasbinInfo'
         type: array
     type: object
+  request.AddBankAccount:
+    properties:
+      id:
+        type: integer
+      name:
+        type: string
+    type: object
   request.AddCity:
     properties:
       name:
@@ -1653,6 +1745,13 @@
     required:
     - name
     type: object
+  request.AddPaymentType:
+    properties:
+      id:
+        type: integer
+      name:
+        type: string
+    type: object
   request.AddPlan:
     properties:
       plan:
@@ -1705,6 +1804,41 @@
         type: string
     required:
     - name
+    type: object
+  request.AddReceipt:
+    properties:
+      bankAccountId:
+        description: 璐︽埛id
+        type: integer
+      clientId:
+        description: 瀹㈡埛id
+        type: integer
+      fileId:
+        description: 闄勪欢id
+        type: integer
+      id:
+        type: integer
+      moneyType:
+        description: 甯佺
+        type: string
+      paymentTypeId:
+        description: 鏀舵鏂瑰紡ID
+        type: integer
+      principalId:
+        description: 璐熻矗浜篿d
+        type: integer
+      receiptDate:
+        description: 鏀舵鏃ユ湡
+        type: string
+      remark:
+        description: 澶囨敞
+        type: string
+      sourceId:
+        description: 婧愬崟id
+        type: integer
+      sourceType:
+        description: 鏉ユ簮绫诲瀷锛�1閿�鍞槑缁嗗崟2鏈嶅姟鍚堝悓3閿�鍞彂绁�4鏀舵璁″垝5鍑哄簱鍗曪級
+        type: integer
     type: object
   request.AddRefundMethod:
     properties:
@@ -2801,6 +2935,13 @@
     required:
     - account_id
     type: object
+  request.UpdateBankAccount:
+    properties:
+      id:
+        type: integer
+      name:
+        type: string
+    type: object
   request.UpdateCities:
     properties:
       cities:
@@ -3267,6 +3408,13 @@
     required:
     - order_type
     type: object
+  request.UpdatePaymentType:
+    properties:
+      id:
+        type: integer
+      name:
+        type: string
+    type: object
   request.UpdatePlan:
     properties:
       id:
@@ -3358,6 +3506,41 @@
         type: array
     required:
     - quotation_status
+    type: object
+  request.UpdateReceipt:
+    properties:
+      bankAccountId:
+        description: 璐︽埛id
+        type: integer
+      clientId:
+        description: 瀹㈡埛id
+        type: integer
+      fileId:
+        description: 闄勪欢id
+        type: integer
+      id:
+        type: integer
+      moneyType:
+        description: 甯佺
+        type: string
+      paymentTypeId:
+        description: 鏀舵鏂瑰紡ID
+        type: integer
+      principalId:
+        description: 璐熻矗浜篿d
+        type: integer
+      receiptDate:
+        description: 鏀舵鏃ユ湡
+        type: string
+      remark:
+        description: 澶囨敞
+        type: string
+      sourceId:
+        description: 婧愬崟id
+        type: integer
+      sourceType:
+        description: 鏉ユ簮绫诲瀷锛�1閿�鍞槑缁嗗崟2鏈嶅姟鍚堝悓3閿�鍞彂绁�4鏀舵璁″垝5鍑哄簱鍗曪級
+        type: integer
     type: object
   request.UpdateRefundMethod:
     properties:
@@ -3715,7 +3898,7 @@
       percent:
         description: 姣斾緥
         type: number
-      principal:
+      principalId:
         description: 鏀舵璐熻矗浜篒D
         type: integer
       remark:
@@ -4838,6 +5021,107 @@
       summary: 璁剧疆瑙掕壊鑿滃崟
       tags:
       - Authority
+  /api/bankAccount/add:
+    post:
+      parameters:
+      - description: 鏌ヨ鍙傛暟
+        in: body
+        name: object
+        required: true
+        schema:
+          $ref: '#/definitions/request.AddBankAccount'
+      produces:
+      - application/json
+      responses:
+        "200":
+          description: OK
+          schema:
+            $ref: '#/definitions/contextx.Response'
+      summary: 娣诲姞閾惰璐︽埛
+      tags:
+      - 閾惰璐︽埛绠$悊
+  /api/bankAccount/delete/{id}:
+    delete:
+      parameters:
+      - description: 鏌ヨ鍙傛暟
+        in: path
+        name: id
+        required: true
+        type: integer
+      produces:
+      - application/json
+      responses:
+        "200":
+          description: OK
+          schema:
+            $ref: '#/definitions/contextx.Response'
+      summary: 鍒犻櫎閾惰璐︽埛
+      tags:
+      - 閾惰璐︽埛绠$悊
+  /api/bankAccount/list:
+    get:
+      parameters:
+      - in: query
+        name: keyword
+        type: string
+      - enum:
+        - ""
+        in: query
+        name: keywordType
+        type: string
+        x-enum-varnames:
+        - BankAccountKeywordCustomerName
+      - description: 椤电爜
+        in: query
+        name: page
+        type: integer
+      - description: 姣忛〉澶у皬
+        in: query
+        name: pageSize
+        type: integer
+      - enum:
+        - ""
+        in: query
+        name: queryClass
+        type: string
+        x-enum-varnames:
+        - BankAccountQueryClassExpireLessThen60Days
+      produces:
+      - application/json
+      responses:
+        "200":
+          description: OK
+          schema:
+            allOf:
+            - $ref: '#/definitions/response.ListResponse'
+            - properties:
+                data:
+                  items:
+                    $ref: '#/definitions/model.BankAccount'
+                  type: array
+              type: object
+      summary: 鑾峰彇閾惰璐︽埛鍒楄〃
+      tags:
+      - 閾惰璐︽埛绠$悊
+  /api/bankAccount/update:
+    put:
+      parameters:
+      - description: 鏌ヨ鍙傛暟
+        in: body
+        name: object
+        required: true
+        schema:
+          $ref: '#/definitions/request.UpdateBankAccount'
+      produces:
+      - application/json
+      responses:
+        "200":
+          description: OK
+          schema:
+            $ref: '#/definitions/contextx.Response'
+      summary: 鏇存柊閾惰璐︽埛
+      tags:
+      - 閾惰璐︽埛绠$悊
   /api/base/captcha:
     post:
       produces:
@@ -6691,6 +6975,107 @@
       summary: 鏇存柊宸ュ崟绫诲瀷
       tags:
       - OrderType
+  /api/paymentType/add:
+    post:
+      parameters:
+      - description: 鏌ヨ鍙傛暟
+        in: body
+        name: object
+        required: true
+        schema:
+          $ref: '#/definitions/request.AddPaymentType'
+      produces:
+      - application/json
+      responses:
+        "200":
+          description: OK
+          schema:
+            $ref: '#/definitions/contextx.Response'
+      summary: 娣诲姞鏀粯鏂瑰紡
+      tags:
+      - 鏀粯鏂瑰紡绠$悊
+  /api/paymentType/delete/{id}:
+    delete:
+      parameters:
+      - description: 鏌ヨ鍙傛暟
+        in: path
+        name: id
+        required: true
+        type: integer
+      produces:
+      - application/json
+      responses:
+        "200":
+          description: OK
+          schema:
+            $ref: '#/definitions/contextx.Response'
+      summary: 鍒犻櫎鏀粯鏂瑰紡
+      tags:
+      - 鏀粯鏂瑰紡绠$悊
+  /api/paymentType/list:
+    get:
+      parameters:
+      - in: query
+        name: keyword
+        type: string
+      - enum:
+        - ""
+        in: query
+        name: keywordType
+        type: string
+        x-enum-varnames:
+        - PaymentTypeKeywordCustomerName
+      - description: 椤电爜
+        in: query
+        name: page
+        type: integer
+      - description: 姣忛〉澶у皬
+        in: query
+        name: pageSize
+        type: integer
+      - enum:
+        - ""
+        in: query
+        name: queryClass
+        type: string
+        x-enum-varnames:
+        - PaymentTypeQueryClassExpireLessThen60Days
+      produces:
+      - application/json
+      responses:
+        "200":
+          description: OK
+          schema:
+            allOf:
+            - $ref: '#/definitions/response.ListResponse'
+            - properties:
+                data:
+                  items:
+                    $ref: '#/definitions/model.PaymentType'
+                  type: array
+              type: object
+      summary: 鑾峰彇鏀粯鏂瑰紡鍒楄〃
+      tags:
+      - 鏀粯鏂瑰紡绠$悊
+  /api/paymentType/update:
+    put:
+      parameters:
+      - description: 鏌ヨ鍙傛暟
+        in: body
+        name: object
+        required: true
+        schema:
+          $ref: '#/definitions/request.UpdatePaymentType'
+      produces:
+      - application/json
+      responses:
+        "200":
+          description: OK
+          schema:
+            $ref: '#/definitions/contextx.Response'
+      summary: 鏇存柊鏀粯鏂瑰紡
+      tags:
+      - 鏀粯鏂瑰紡绠$悊
   /api/plan/add:
     post:
       parameters:
@@ -7170,6 +7555,107 @@
       summary: 鏇存柊鎶ヤ环鍗曠姸鎬�
       tags:
       - QuotationStatus
+  /api/receipt/add:
+    post:
+      parameters:
+      - description: 鏌ヨ鍙傛暟
+        in: body
+        name: object
+        required: true
+        schema:
+          $ref: '#/definitions/request.AddReceipt'
+      produces:
+      - application/json
+      responses:
+        "200":
+          description: OK
+          schema:
+            $ref: '#/definitions/contextx.Response'
+      summary: 娣诲姞鏀舵鍗�
+      tags:
+      - 鏀舵鍗曠鐞�
+  /api/receipt/delete/{id}:
+    delete:
+      parameters:
+      - description: 鏌ヨ鍙傛暟
+        in: path
+        name: id
+        required: true
+        type: integer
+      produces:
+      - application/json
+      responses:
+        "200":
+          description: OK
+          schema:
+            $ref: '#/definitions/contextx.Response'
+      summary: 鍒犻櫎鏀舵鍗�
+      tags:
+      - 鏀舵鍗曠鐞�
+  /api/receipt/list:
+    get:
+      parameters:
+      - in: query
+        name: keyword
+        type: string
+      - enum:
+        - ""
+        in: query
+        name: keywordType
+        type: string
+        x-enum-varnames:
+        - ReceiptKeywordCustomerName
+      - description: 椤电爜
+        in: query
+        name: page
+        type: integer
+      - description: 姣忛〉澶у皬
+        in: query
+        name: pageSize
+        type: integer
+      - enum:
+        - ""
+        in: query
+        name: queryClass
+        type: string
+        x-enum-varnames:
+        - ReceiptQueryClassExpireLessThen60Days
+      produces:
+      - application/json
+      responses:
+        "200":
+          description: OK
+          schema:
+            allOf:
+            - $ref: '#/definitions/response.ListResponse'
+            - properties:
+                data:
+                  items:
+                    $ref: '#/definitions/model.Receipt'
+                  type: array
+              type: object
+      summary: 鑾峰彇鏀舵鍗曞垪琛�
+      tags:
+      - 鏀舵鍗曠鐞�
+  /api/receipt/update:
+    put:
+      parameters:
+      - description: 鏌ヨ鍙傛暟
+        in: body
+        name: object
+        required: true
+        schema:
+          $ref: '#/definitions/request.UpdateReceipt'
+      produces:
+      - application/json
+      responses:
+        "200":
+          description: OK
+          schema:
+            $ref: '#/definitions/contextx.Response'
+      summary: 鏇存柊鏀舵鍗�
+      tags:
+      - 鏀舵鍗曠鐞�
   /api/refundMethod/add:
     post:
       parameters:
diff --git a/model/bankAccount.go b/model/bankAccount.go
new file mode 100644
index 0000000..006e9b8
--- /dev/null
+++ b/model/bankAccount.go
@@ -0,0 +1,140 @@
+package model
+
+import (
+	"aps_crm/constvar"
+	"aps_crm/pkg/mysqlx"
+	"errors"
+	"fmt"
+	"gorm.io/gorm"
+)
+
+type (
+	// BankAccount 閾惰璐︽埛
+	BankAccount struct {
+		Id   int    `json:"id" gorm:"column:id;primary_key;AUTO_INCREMENT"`
+		Name   string    `json:"name" gorm:"column:name"`
+	}
+
+	// BankAccountSearch 閾惰璐︽埛鎼滅储鏉′欢
+	BankAccountSearch struct {
+		BankAccount
+		Orm *gorm.DB
+        QueryClass  constvar.BankAccountQueryClass
+        KeywordType constvar.BankAccountKeywordType
+        Keyword     string
+        PageNum  int
+        PageSize int
+	}
+)
+
+func (BankAccount) TableName() string {
+	return "bank_account"
+}
+
+func NewBankAccountSearch() *BankAccountSearch {
+	return &BankAccountSearch{
+		Orm: mysqlx.GetDB(),
+	}
+}
+
+func (slf *BankAccountSearch) build() *gorm.DB {
+	var db = slf.Orm.Model(&BankAccount{})
+	if slf.Id != 0 {
+		db = db.Where("id = ?", slf.Id)
+	}
+
+	return db
+}
+
+func (slf *BankAccountSearch) Create(record *BankAccount) error {
+	var db = slf.build()
+	return db.Create(record).Error
+}
+
+func (slf *BankAccountSearch) CreateBatch(records []*BankAccount) error {
+	var db = slf.build()
+	return db.Create(records).Error
+}
+
+func (slf *BankAccountSearch) Delete() error {
+	var db = slf.build()
+	return db.Delete(&BankAccount{}).Error
+}
+
+func (slf *BankAccountSearch) Update(record *BankAccount) error {
+	var db = slf.build()
+	return db.Updates(record).Error
+}
+
+func (slf *BankAccountSearch) FindAll() ([]*BankAccount, error) {
+	var db = slf.build()
+	var record = make([]*BankAccount, 0)
+	err := db.Find(&record).Error
+	return record, err
+}
+
+func (slf *BankAccountSearch) SetId(id int) *BankAccountSearch {
+	slf.Id = id
+	return slf
+}
+
+func (slf *BankAccountSearch) SetOrm(tx *gorm.DB) *BankAccountSearch {
+	slf.Orm = tx
+	return slf
+}
+
+func (slf *BankAccountSearch) First() (*BankAccount, error) {
+	var db = slf.build()
+	var record = new(BankAccount)
+	err := db.First(record).Error
+	return record, err
+}
+
+func (slf *BankAccountSearch) Updates(values interface{}) error {
+	var db = slf.build()
+	return db.Updates(values).Error
+}
+
+func (slf *BankAccountSearch) Save(record *BankAccount) error {
+	if record.Id == 0 {
+		return errors.New("id涓虹┖")
+	}
+	var db = slf.build()
+
+	if err := db.Save(record).Error; err != nil {
+		return fmt.Errorf("save err: %v, record: %+v", err, record)
+	}
+
+	return nil
+}
+
+func (slf *BankAccountSearch) Find() ([]*BankAccount, int64, error) {
+	var db = slf.build()
+	var records = make([]*BankAccount, 0)
+	var total int64
+	if err := db.Count(&total).Error; err != nil {
+		return records, total, err
+	}
+	if slf.PageNum > 0 && slf.PageSize > 0 {
+		db = db.Limit(slf.PageSize).Offset((slf.PageNum - 1) * slf.PageSize)
+	}
+
+	err := db.Find(&records).Error
+	return records, total, err
+}
+
+// InitDefaultData 鍒濆鍖栨暟鎹�
+func (slf *BankAccountSearch) InitDefaultData() error {
+	var (
+		db          = slf.Orm.Table(slf.TableName())
+		total int64 = 0
+	)
+	if err := db.Count(&total).Error; err != nil {
+		return err
+	}
+	if total != 0 {
+		return nil
+	}
+	records := []*BankAccount{}
+	return slf.CreateBatch(records)
+}
diff --git a/model/paymentType.go b/model/paymentType.go
new file mode 100644
index 0000000..e16a84a
--- /dev/null
+++ b/model/paymentType.go
@@ -0,0 +1,140 @@
+package model
+
+import (
+	"aps_crm/constvar"
+	"aps_crm/pkg/mysqlx"
+	"errors"
+	"fmt"
+	"gorm.io/gorm"
+)
+
+type (
+	// PaymentType 鏀粯鏂瑰紡
+	PaymentType struct {
+		Id   int    `json:"id" gorm:"column:id;primary_key;AUTO_INCREMENT"`
+		Name   string    `json:"name" gorm:"column:name"`
+	}
+
+	// PaymentTypeSearch 鏀粯鏂瑰紡鎼滅储鏉′欢
+	PaymentTypeSearch struct {
+		PaymentType
+		Orm *gorm.DB
+        QueryClass  constvar.PaymentTypeQueryClass
+        KeywordType constvar.PaymentTypeKeywordType
+        Keyword     string
+        PageNum  int
+        PageSize int
+	}
+)
+
+func (PaymentType) TableName() string {
+	return "payment_type"
+}
+
+func NewPaymentTypeSearch() *PaymentTypeSearch {
+	return &PaymentTypeSearch{
+		Orm: mysqlx.GetDB(),
+	}
+}
+
+func (slf *PaymentTypeSearch) build() *gorm.DB {
+	var db = slf.Orm.Model(&PaymentType{})
+	if slf.Id != 0 {
+		db = db.Where("id = ?", slf.Id)
+	}
+
+	return db
+}
+
+func (slf *PaymentTypeSearch) Create(record *PaymentType) error {
+	var db = slf.build()
+	return db.Create(record).Error
+}
+
+func (slf *PaymentTypeSearch) CreateBatch(records []*PaymentType) error {
+	var db = slf.build()
+	return db.Create(records).Error
+}
+
+func (slf *PaymentTypeSearch) Delete() error {
+	var db = slf.build()
+	return db.Delete(&PaymentType{}).Error
+}
+
+func (slf *PaymentTypeSearch) Update(record *PaymentType) error {
+	var db = slf.build()
+	return db.Updates(record).Error
+}
+
+func (slf *PaymentTypeSearch) FindAll() ([]*PaymentType, error) {
+	var db = slf.build()
+	var record = make([]*PaymentType, 0)
+	err := db.Find(&record).Error
+	return record, err
+}
+
+func (slf *PaymentTypeSearch) SetId(id int) *PaymentTypeSearch {
+	slf.Id = id
+	return slf
+}
+
+func (slf *PaymentTypeSearch) SetOrm(tx *gorm.DB) *PaymentTypeSearch {
+	slf.Orm = tx
+	return slf
+}
+
+func (slf *PaymentTypeSearch) First() (*PaymentType, error) {
+	var db = slf.build()
+	var record = new(PaymentType)
+	err := db.First(record).Error
+	return record, err
+}
+
+func (slf *PaymentTypeSearch) Updates(values interface{}) error {
+	var db = slf.build()
+	return db.Updates(values).Error
+}
+
+func (slf *PaymentTypeSearch) Save(record *PaymentType) error {
+	if record.Id == 0 {
+		return errors.New("id涓虹┖")
+	}
+	var db = slf.build()
+
+	if err := db.Save(record).Error; err != nil {
+		return fmt.Errorf("save err: %v, record: %+v", err, record)
+	}
+
+	return nil
+}
+
+func (slf *PaymentTypeSearch) Find() ([]*PaymentType, int64, error) {
+	var db = slf.build()
+	var records = make([]*PaymentType, 0)
+	var total int64
+	if err := db.Count(&total).Error; err != nil {
+		return records, total, err
+	}
+	if slf.PageNum > 0 && slf.PageSize > 0 {
+		db = db.Limit(slf.PageSize).Offset((slf.PageNum - 1) * slf.PageSize)
+	}
+
+	err := db.Find(&records).Error
+	return records, total, err
+}
+
+// InitDefaultData 鍒濆鍖栨暟鎹�
+func (slf *PaymentTypeSearch) InitDefaultData() error {
+	var (
+		db          = slf.Orm.Table(slf.TableName())
+		total int64 = 0
+	)
+	if err := db.Count(&total).Error; err != nil {
+		return err
+	}
+	if total != 0 {
+		return nil
+	}
+	records := []*PaymentType{}
+	return slf.CreateBatch(records)
+}
diff --git a/model/receipt.go b/model/receipt.go
new file mode 100644
index 0000000..60d1d2a
--- /dev/null
+++ b/model/receipt.go
@@ -0,0 +1,149 @@
+package model
+
+import (
+	"aps_crm/constvar"
+	"aps_crm/pkg/mysqlx"
+	"errors"
+	"fmt"
+	"gorm.io/gorm"
+)
+
+type (
+	// Receipt 鏀舵鍗�
+	Receipt struct {
+		Id            int    `json:"id" gorm:"column:id;primary_key;AUTO_INCREMENT"`
+		ClientId      int    `gorm:"client_id" json:"clientId"`            // 瀹㈡埛id
+		SourceType    int    `gorm:"source_type" json:"sourceType"`        // 鏉ユ簮绫诲瀷锛�1閿�鍞槑缁嗗崟2鏈嶅姟鍚堝悓3閿�鍞彂绁�4鏀舵璁″垝5鍑哄簱鍗曪級
+		SourceId      int    `gorm:"source_id" json:"sourceId"`            // 婧愬崟id
+		PrincipalId   int    `gorm:"principal_id" json:"principalId"`      // 璐熻矗浜篿d
+		ReceiptDate   string `gorm:"receipt_date" json:"receiptDate"`      // 鏀舵鏃ユ湡
+		MoneyType     string `gorm:"money_type" json:"moneyType"`          // 甯佺
+		PaymentTypeId int    `gorm:"payment_type_id" json:"paymentTypeId"` // 鏀舵鏂瑰紡ID
+		BankAccountId int    `gorm:"bank_account_id" json:"bankAccountId"` // 璐︽埛id
+		Remark        string `gorm:"remark" json:"remark"`                 // 澶囨敞
+		FileId        int    `gorm:"file_id" json:"fileId"`                // 闄勪欢id
+	}
+
+	// ReceiptSearch 鏀舵鍗曟悳绱㈡潯浠�
+	ReceiptSearch struct {
+		Receipt
+		Orm         *gorm.DB
+		QueryClass  constvar.ReceiptQueryClass
+		KeywordType constvar.ReceiptKeywordType
+		Keyword     string
+		PageNum     int
+		PageSize    int
+	}
+)
+
+func (Receipt) TableName() string {
+	return "receipt"
+}
+
+func NewReceiptSearch() *ReceiptSearch {
+	return &ReceiptSearch{
+		Orm: mysqlx.GetDB(),
+	}
+}
+
+func (slf *ReceiptSearch) build() *gorm.DB {
+	var db = slf.Orm.Model(&Receipt{})
+	if slf.Id != 0 {
+		db = db.Where("id = ?", slf.Id)
+	}
+
+	return db
+}
+
+func (slf *ReceiptSearch) Create(record *Receipt) error {
+	var db = slf.build()
+	return db.Create(record).Error
+}
+
+func (slf *ReceiptSearch) CreateBatch(records []*Receipt) error {
+	var db = slf.build()
+	return db.Create(records).Error
+}
+
+func (slf *ReceiptSearch) Delete() error {
+	var db = slf.build()
+	return db.Delete(&Receipt{}).Error
+}
+
+func (slf *ReceiptSearch) Update(record *Receipt) error {
+	var db = slf.build()
+	return db.Updates(record).Error
+}
+
+func (slf *ReceiptSearch) FindAll() ([]*Receipt, error) {
+	var db = slf.build()
+	var record = make([]*Receipt, 0)
+	err := db.Find(&record).Error
+	return record, err
+}
+
+func (slf *ReceiptSearch) SetId(id int) *ReceiptSearch {
+	slf.Id = id
+	return slf
+}
+
+func (slf *ReceiptSearch) SetOrm(tx *gorm.DB) *ReceiptSearch {
+	slf.Orm = tx
+	return slf
+}
+
+func (slf *ReceiptSearch) First() (*Receipt, error) {
+	var db = slf.build()
+	var record = new(Receipt)
+	err := db.First(record).Error
+	return record, err
+}
+
+func (slf *ReceiptSearch) Updates(values interface{}) error {
+	var db = slf.build()
+	return db.Updates(values).Error
+}
+
+func (slf *ReceiptSearch) Save(record *Receipt) error {
+	if record.Id == 0 {
+		return errors.New("id涓虹┖")
+	}
+	var db = slf.build()
+
+	if err := db.Save(record).Error; err != nil {
+		return fmt.Errorf("save err: %v, record: %+v", err, record)
+	}
+
+	return nil
+}
+
+func (slf *ReceiptSearch) Find() ([]*Receipt, int64, error) {
+	var db = slf.build()
+	var records = make([]*Receipt, 0)
+	var total int64
+	if err := db.Count(&total).Error; err != nil {
+		return records, total, err
+	}
+	if slf.PageNum > 0 && slf.PageSize > 0 {
+		db = db.Limit(slf.PageSize).Offset((slf.PageNum - 1) * slf.PageSize)
+	}
+
+	err := db.Find(&records).Error
+	return records, total, err
+}
+
+// InitDefaultData 鍒濆鍖栨暟鎹�
+func (slf *ReceiptSearch) InitDefaultData() error {
+	var (
+		db          = slf.Orm.Table(slf.TableName())
+		total int64 = 0
+	)
+	if err := db.Count(&total).Error; err != nil {
+		return err
+	}
+	if total != 0 {
+		return nil
+	}
+	records := []*Receipt{}
+	return slf.CreateBatch(records)
+}
diff --git a/model/request/bankAccount.go b/model/request/bankAccount.go
new file mode 100644
index 0000000..3eed94e
--- /dev/null
+++ b/model/request/bankAccount.go
@@ -0,0 +1,22 @@
+package request
+
+import (
+    "aps_crm/constvar"
+    "aps_crm/model"
+)
+
+type AddBankAccount struct {
+	model.BankAccount
+}
+
+type UpdateBankAccount struct {
+	Id int `json:"id"`
+	model.BankAccount
+}
+
+type GetBankAccountList struct {
+	PageInfo
+	QueryClass  constvar.BankAccountQueryClass  `json:"queryClass" form:"queryClass"`
+	KeywordType constvar.BankAccountKeywordType `json:"keywordType"  form:"keywordType"`
+	Keyword     string                       `json:"keyword" form:"keyword"`
+}
diff --git a/model/request/paymentType.go b/model/request/paymentType.go
new file mode 100644
index 0000000..3c9e8ae
--- /dev/null
+++ b/model/request/paymentType.go
@@ -0,0 +1,22 @@
+package request
+
+import (
+    "aps_crm/constvar"
+    "aps_crm/model"
+)
+
+type AddPaymentType struct {
+	model.PaymentType
+}
+
+type UpdatePaymentType struct {
+	Id int `json:"id"`
+	model.PaymentType
+}
+
+type GetPaymentTypeList struct {
+	PageInfo
+	QueryClass  constvar.PaymentTypeQueryClass  `json:"queryClass" form:"queryClass"`
+	KeywordType constvar.PaymentTypeKeywordType `json:"keywordType"  form:"keywordType"`
+	Keyword     string                       `json:"keyword" form:"keyword"`
+}
diff --git a/model/request/receipt.go b/model/request/receipt.go
new file mode 100644
index 0000000..677d508
--- /dev/null
+++ b/model/request/receipt.go
@@ -0,0 +1,22 @@
+package request
+
+import (
+    "aps_crm/constvar"
+    "aps_crm/model"
+)
+
+type AddReceipt struct {
+	model.Receipt
+}
+
+type UpdateReceipt struct {
+	Id int `json:"id"`
+	model.Receipt
+}
+
+type GetReceiptList struct {
+	PageInfo
+	QueryClass  constvar.ReceiptQueryClass  `json:"queryClass" form:"queryClass"`
+	KeywordType constvar.ReceiptKeywordType `json:"keywordType"  form:"keywordType"`
+	Keyword     string                       `json:"keyword" form:"keyword"`
+}
diff --git a/router/bankAccount.go b/router/bankAccount.go
new file mode 100644
index 0000000..d5adf98
--- /dev/null
+++ b/router/bankAccount.go
@@ -0,0 +1,17 @@
+package router
+
+import (
+	v1 "aps_crm/api/v1"
+	"github.com/gin-gonic/gin"
+)
+
+func InitBankAccountRouter(router *gin.RouterGroup) {
+	BankAccountRouter := router.Group("bankAccount")
+	BankAccountApi := v1.BankAccountApi{}
+	{
+		BankAccountRouter.POST("add", BankAccountApi.Add)             // 娣诲姞閾惰璐︽埛
+		BankAccountRouter.DELETE("delete/:id", BankAccountApi.Delete) // 鍒犻櫎閾惰璐︽埛
+		BankAccountRouter.PUT("update", BankAccountApi.Update)        // 鏇存柊閾惰璐︽埛
+		BankAccountRouter.GET("list", BankAccountApi.List)            // 鑾峰彇閾惰璐︽埛鍒楄〃
+	}
+}
diff --git a/router/index.go b/router/index.go
index 635352f..386f3c8 100644
--- a/router/index.go
+++ b/router/index.go
@@ -167,6 +167,9 @@
 		InitTimeSpentRouter(PrivateGroup)
 		InitFaultTypeRouter(PrivateGroup)
 		InitServiceCollectionPlanRouter(PrivateGroup)
+		InitReceiptRouter(PrivateGroup)
+		InitBankAccountRouter(PrivateGroup)
+		InitPaymentTypeRouter(PrivateGroup)
 	}
 	return Router
 }
diff --git a/router/paymentType.go b/router/paymentType.go
new file mode 100644
index 0000000..a320b69
--- /dev/null
+++ b/router/paymentType.go
@@ -0,0 +1,17 @@
+package router
+
+import (
+	v1 "aps_crm/api/v1"
+	"github.com/gin-gonic/gin"
+)
+
+func InitPaymentTypeRouter(router *gin.RouterGroup) {
+	PaymentTypeRouter := router.Group("paymentType")
+	PaymentTypeApi := v1.PaymentTypeApi{}
+	{
+		PaymentTypeRouter.POST("add", PaymentTypeApi.Add)             // 娣诲姞鏀粯鏂瑰紡
+		PaymentTypeRouter.DELETE("delete/:id", PaymentTypeApi.Delete) // 鍒犻櫎鏀粯鏂瑰紡
+		PaymentTypeRouter.PUT("update", PaymentTypeApi.Update)        // 鏇存柊鏀粯鏂瑰紡
+		PaymentTypeRouter.GET("list", PaymentTypeApi.List)            // 鑾峰彇鏀粯鏂瑰紡鍒楄〃
+	}
+}
diff --git a/router/receipt.go b/router/receipt.go
new file mode 100644
index 0000000..eea9a00
--- /dev/null
+++ b/router/receipt.go
@@ -0,0 +1,17 @@
+package router
+
+import (
+	v1 "aps_crm/api/v1"
+	"github.com/gin-gonic/gin"
+)
+
+func InitReceiptRouter(router *gin.RouterGroup) {
+	ReceiptRouter := router.Group("receipt")
+	ReceiptApi := v1.ReceiptApi{}
+	{
+		ReceiptRouter.POST("add", ReceiptApi.Add)             // 娣诲姞鏀舵鍗�
+		ReceiptRouter.DELETE("delete/:id", ReceiptApi.Delete) // 鍒犻櫎鏀舵鍗�
+		ReceiptRouter.PUT("update", ReceiptApi.Update)        // 鏇存柊鏀舵鍗�
+		ReceiptRouter.GET("list", ReceiptApi.List)            // 鑾峰彇鏀舵鍗曞垪琛�
+	}
+}
diff --git a/service/bankAccount.go b/service/bankAccount.go
new file mode 100644
index 0000000..4516672
--- /dev/null
+++ b/service/bankAccount.go
@@ -0,0 +1,66 @@
+package service
+
+import (
+	"aps_crm/model"
+	"aps_crm/model/request"
+	"aps_crm/pkg/ecode"
+)
+
+type BankAccountService struct{}
+
+func NewBankAccountService() BankAccountService {
+	return BankAccountService{}
+}
+
+func (BankAccountService) AddBankAccount(bankAccount *model.BankAccount) int {
+	err := model.NewBankAccountSearch().Create(bankAccount)
+	if err != nil {
+		return ecode.DBErr
+	}
+
+	return ecode.OK
+}
+
+func (BankAccountService) DeleteBankAccount(id int) int {
+	err := model.NewBankAccountSearch().SetId(id).Delete()
+	if err != nil {
+		return ecode.DBErr
+	}
+	return ecode.OK
+}
+
+func (BankAccountService) GetBankAccountList() ([]*model.BankAccount, int64, int) {
+	list, total, err := model.NewBankAccountSearch().Find()
+	if err != nil {
+		return nil, 0, ecode.DBErr
+	}
+
+	return list, total, ecode.OK
+}
+
+func (BankAccountService) UpdateBankAccounts(BankAccounts []*request.UpdateBankAccount) int {
+	for _, v := range BankAccounts {
+		// check BankAccount exist
+		_, err := model.NewBankAccountSearch().SetId(v.Id).First()
+		if err != nil {
+			return ecode.DBErr
+		}
+
+		err = model.NewBankAccountSearch().SetId(v.Id).Updates(map[string]interface{}{
+
+		})
+		if err != nil {
+			return ecode.DBErr
+		}
+	}
+
+	return ecode.OK
+}
+
+func (BankAccountService) UpdateBankAccount(bankAccount *model.BankAccount) int {
+		err := model.NewBankAccountSearch().SetId(bankAccount.Id).Save(bankAccount)
+		if err != nil {
+			return ecode.DBErr
+		}
+	return ecode.OK
+}
diff --git a/service/paymentType.go b/service/paymentType.go
new file mode 100644
index 0000000..83ec447
--- /dev/null
+++ b/service/paymentType.go
@@ -0,0 +1,66 @@
+package service
+
+import (
+	"aps_crm/model"
+	"aps_crm/model/request"
+	"aps_crm/pkg/ecode"
+)
+
+type PaymentTypeService struct{}
+
+func NewPaymentTypeService() PaymentTypeService {
+	return PaymentTypeService{}
+}
+
+func (PaymentTypeService) AddPaymentType(paymentType *model.PaymentType) int {
+	err := model.NewPaymentTypeSearch().Create(paymentType)
+	if err != nil {
+		return ecode.DBErr
+	}
+
+	return ecode.OK
+}
+
+func (PaymentTypeService) DeletePaymentType(id int) int {
+	err := model.NewPaymentTypeSearch().SetId(id).Delete()
+	if err != nil {
+		return ecode.DBErr
+	}
+	return ecode.OK
+}
+
+func (PaymentTypeService) GetPaymentTypeList() ([]*model.PaymentType, int64, int) {
+	list, total, err := model.NewPaymentTypeSearch().Find()
+	if err != nil {
+		return nil, 0, ecode.DBErr
+	}
+
+	return list, total, ecode.OK
+}
+
+func (PaymentTypeService) UpdatePaymentTypes(PaymentTypes []*request.UpdatePaymentType) int {
+	for _, v := range PaymentTypes {
+		// check PaymentType exist
+		_, err := model.NewPaymentTypeSearch().SetId(v.Id).First()
+		if err != nil {
+			return ecode.DBErr
+		}
+
+		err = model.NewPaymentTypeSearch().SetId(v.Id).Updates(map[string]interface{}{
+
+		})
+		if err != nil {
+			return ecode.DBErr
+		}
+	}
+
+	return ecode.OK
+}
+
+func (PaymentTypeService) UpdatePaymentType(paymentType *model.PaymentType) int {
+		err := model.NewPaymentTypeSearch().SetId(paymentType.Id).Save(paymentType)
+		if err != nil {
+			return ecode.DBErr
+		}
+	return ecode.OK
+}
diff --git a/service/receipt.go b/service/receipt.go
new file mode 100644
index 0000000..834c6df
--- /dev/null
+++ b/service/receipt.go
@@ -0,0 +1,66 @@
+package service
+
+import (
+	"aps_crm/model"
+	"aps_crm/model/request"
+	"aps_crm/pkg/ecode"
+)
+
+type ReceiptService struct{}
+
+func NewReceiptService() ReceiptService {
+	return ReceiptService{}
+}
+
+func (ReceiptService) AddReceipt(receipt *model.Receipt) int {
+	err := model.NewReceiptSearch().Create(receipt)
+	if err != nil {
+		return ecode.DBErr
+	}
+
+	return ecode.OK
+}
+
+func (ReceiptService) DeleteReceipt(id int) int {
+	err := model.NewReceiptSearch().SetId(id).Delete()
+	if err != nil {
+		return ecode.DBErr
+	}
+	return ecode.OK
+}
+
+func (ReceiptService) GetReceiptList() ([]*model.Receipt, int64, int) {
+	list, total, err := model.NewReceiptSearch().Find()
+	if err != nil {
+		return nil, 0, ecode.DBErr
+	}
+
+	return list, total, ecode.OK
+}
+
+func (ReceiptService) UpdateReceipts(Receipts []*request.UpdateReceipt) int {
+	for _, v := range Receipts {
+		// check Receipt exist
+		_, err := model.NewReceiptSearch().SetId(v.Id).First()
+		if err != nil {
+			return ecode.DBErr
+		}
+
+		err = model.NewReceiptSearch().SetId(v.Id).Updates(map[string]interface{}{
+
+		})
+		if err != nil {
+			return ecode.DBErr
+		}
+	}
+
+	return ecode.OK
+}
+
+func (ReceiptService) UpdateReceipt(receipt *model.Receipt) int {
+		err := model.NewReceiptSearch().SetId(receipt.Id).Save(receipt)
+		if err != nil {
+			return ecode.DBErr
+		}
+	return ecode.OK
+}

--
Gitblit v1.8.0