From 663db1dd160e759c9401289554543b1d1ea1e5cb Mon Sep 17 00:00:00 2001
From: zhangqian <zhangqian@123.com>
Date: 星期六, 05 八月 2023 12:17:17 +0800
Subject: [PATCH] 服务单管理故障类别增删改查,服务单管理花费时间增删改查,增加服务方式、花费时间、严重程度、优先级别初始化数据

---
 model/severity.go             |   42 
 constvar/timeSpent.go         |   12 
 service/faultType.go          |   66 +
 service/serviceOrder.go       |   14 
 docs/swagger.yaml             |  302 ++++++-
 model/request/serviceOrder.go |   31 
 model/serviceType.go          |   43 
 api/v1/timeSpent.go           |  106 ++
 api/v1/serviceType.go         |    5 
 pkg/safe/safe.go              |    2 
 pkg/structx/structx.go        |   16 
 model/timeSpent.go            |  142 +++
 constvar/faultType.go         |   12 
 router/faultType.go           |   17 
 model/request/faultType.go    |   22 
 api/v1/serviceOrder.go        |   15 
 docs/docs.go                  |  447 +++++++++--
 model/priorityLevel.go        |   42 
 docs/swagger.json             |  447 +++++++++--
 model/serviceOrder.go         |   30 
 router/timeSpent.go           |   17 
 model/faultType.go            |  119 +++
 model/index.go                |   54 +
 model/request/timeSpent.go    |   22 
 api/v1/faultType.go           |  106 ++
 service/timeSpent.go          |   66 +
 api/v1/severity.go            |    5 
 model/faq.go                  |   21 
 28 files changed, 1,899 insertions(+), 324 deletions(-)

diff --git a/api/v1/faultType.go b/api/v1/faultType.go
new file mode 100644
index 0000000..2b2beb5
--- /dev/null
+++ b/api/v1/faultType.go
@@ -0,0 +1,106 @@
+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 FaultTypeApi struct{}
+
+// Add
+// @Tags		鏁呴殰绫诲埆绠$悊
+// @Summary	娣诲姞鏁呴殰绫诲埆
+// @Produce	application/json
+// @Param		object	body		request.AddFaultType	true	"鏌ヨ鍙傛暟"
+// @Success	200		{object}	contextx.Response{}
+// @Router		/api/faultType/add [post]
+func (s *FaultTypeApi) Add(c *gin.Context) {
+	var params request.AddFaultType
+	ctx, ok := contextx.NewContext(c, &params)
+	if !ok {
+		return
+	}
+
+	errCode := service.NewFaultTypeService().AddFaultType(&params.FaultType)
+	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/faultType/delete/{id} [delete]
+func (s *FaultTypeApi) Delete(c *gin.Context) {
+	ctx, ok := contextx.NewContext(c, nil)
+	if !ok {
+		return
+	}
+
+	id, _ := strconv.Atoi(c.Param("id"))
+	errCode := service.NewFaultTypeService().DeleteFaultType(id)
+	if errCode != ecode.OK {
+		ctx.Fail(errCode)
+		return
+	}
+
+	ctx.Ok()
+}
+
+// Update
+// @Tags		鏁呴殰绫诲埆绠$悊
+// @Summary	鏇存柊鏁呴殰绫诲埆
+// @Produce	application/json
+// @Param		object	body		request.UpdateFaultType	true	"鏌ヨ鍙傛暟"
+// @Success	200		{object}	contextx.Response{}
+// @Router		/api/faultType/update [put]
+func (s *FaultTypeApi) Update(c *gin.Context) {
+	var params request.UpdateFaultType
+	ctx, ok := contextx.NewContext(c, &params)
+	if !ok {
+		return
+	}
+
+	errCode := service.NewFaultTypeService().UpdateFaultType(&params.FaultType)
+	if errCode != ecode.OK {
+		ctx.Fail(errCode)
+		return
+	}
+
+	ctx.Ok()
+}
+
+// List
+// @Tags		鏁呴殰绫诲埆绠$悊
+// @Summary	鑾峰彇鏁呴殰绫诲埆鍒楄〃
+// @Produce	application/json
+// @Success	200	{object}	response.ListResponse{data=[]model.FaultType}
+// @Router		/api/faultType/list [get]
+func (s *FaultTypeApi) List(c *gin.Context) {
+	ctx, ok := contextx.NewContext(c, nil)
+	if !ok {
+		return
+	}
+
+	faultType, total, errCode := service.NewFaultTypeService().GetFaultTypeList()
+	if errCode != ecode.OK {
+		ctx.Fail(errCode)
+		return
+	}
+
+	ctx.OkWithDetailed(response.ListResponse{
+		Data: faultType,
+		Count: total,
+	})
+}
diff --git a/api/v1/serviceOrder.go b/api/v1/serviceOrder.go
index 3beabbd..426dcef 100644
--- a/api/v1/serviceOrder.go
+++ b/api/v1/serviceOrder.go
@@ -6,6 +6,7 @@
 	"aps_crm/model/response"
 	"aps_crm/pkg/contextx"
 	"aps_crm/pkg/ecode"
+	"aps_crm/pkg/structx"
 	"aps_crm/service"
 	"github.com/gin-gonic/gin"
 	"strconv"
@@ -28,6 +29,10 @@
 	}
 
 	serviceOrder := new(model.ServiceOrder)
+	if err := structx.AssignTo(params, serviceOrder); err != nil {
+		ctx.Fail(ecode.ParamsErr)
+		return
+	}
 
 	errCode := service.NewServiceOrderService().AddServiceOrder(serviceOrder)
 	if errCode != ecode.OK {
@@ -75,7 +80,13 @@
 		return
 	}
 
-	errCode := service.NewServiceOrderService().UpdateServiceOrder(&params.ServiceOrder)
+	serviceOrder := new(model.ServiceOrder)
+	if err := structx.AssignTo(params, serviceOrder); err != nil {
+		ctx.Fail(ecode.ParamsErr)
+		return
+	}
+
+	errCode := service.NewServiceOrderService().UpdateServiceOrder(serviceOrder)
 	if errCode != ecode.OK {
 		ctx.Fail(errCode)
 		return
@@ -103,7 +114,7 @@
 	}
 
 	ctx.OkWithDetailed(response.ListResponse{
-		Data: serviceOrder,
+		Data:  serviceOrder,
 		Count: total,
 	})
 }
diff --git a/api/v1/serviceType.go b/api/v1/serviceType.go
index 5e4ba9f..ed5843b 100644
--- a/api/v1/serviceType.go
+++ b/api/v1/serviceType.go
@@ -1,7 +1,6 @@
 package v1
 
 import (
-	"aps_crm/model"
 	"aps_crm/model/request"
 	"aps_crm/model/response"
 	"aps_crm/pkg/contextx"
@@ -27,9 +26,7 @@
 		return
 	}
 
-	serviceType := new(model.ServiceType)
-
-	errCode := service.NewServiceTypeService().AddServiceType(serviceType)
+	errCode := service.NewServiceTypeService().AddServiceType(&params.ServiceType)
 	if errCode != ecode.OK {
 		ctx.Fail(errCode)
 		return
diff --git a/api/v1/severity.go b/api/v1/severity.go
index e7f5e7a..fe4100d 100644
--- a/api/v1/severity.go
+++ b/api/v1/severity.go
@@ -1,7 +1,6 @@
 package v1
 
 import (
-	"aps_crm/model"
 	"aps_crm/model/request"
 	"aps_crm/model/response"
 	"aps_crm/pkg/contextx"
@@ -27,9 +26,7 @@
 		return
 	}
 
-	severity := new(model.Severity)
-
-	errCode := service.NewSeverityService().AddSeverity(severity)
+	errCode := service.NewSeverityService().AddSeverity(&params.Severity)
 	if errCode != ecode.OK {
 		ctx.Fail(errCode)
 		return
diff --git a/api/v1/timeSpent.go b/api/v1/timeSpent.go
new file mode 100644
index 0000000..0960310
--- /dev/null
+++ b/api/v1/timeSpent.go
@@ -0,0 +1,106 @@
+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 TimeSpentApi struct{}
+
+// Add
+// @Tags		鑺辫垂鏃堕棿绠$悊
+// @Summary	娣诲姞鑺辫垂鏃堕棿
+// @Produce	application/json
+// @Param		object	body		request.AddTimeSpent	true	"鏌ヨ鍙傛暟"
+// @Success	200		{object}	contextx.Response{}
+// @Router		/api/timeSpent/add [post]
+func (s *TimeSpentApi) Add(c *gin.Context) {
+	var params request.AddTimeSpent
+	ctx, ok := contextx.NewContext(c, &params)
+	if !ok {
+		return
+	}
+
+	errCode := service.NewTimeSpentService().AddTimeSpent(&params.TimeSpent)
+	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/timeSpent/delete/{id} [delete]
+func (s *TimeSpentApi) Delete(c *gin.Context) {
+	ctx, ok := contextx.NewContext(c, nil)
+	if !ok {
+		return
+	}
+
+	id, _ := strconv.Atoi(c.Param("id"))
+	errCode := service.NewTimeSpentService().DeleteTimeSpent(id)
+	if errCode != ecode.OK {
+		ctx.Fail(errCode)
+		return
+	}
+
+	ctx.Ok()
+}
+
+// Update
+// @Tags		鑺辫垂鏃堕棿绠$悊
+// @Summary	鏇存柊鑺辫垂鏃堕棿
+// @Produce	application/json
+// @Param		object	body		request.UpdateTimeSpent	true	"鏌ヨ鍙傛暟"
+// @Success	200		{object}	contextx.Response{}
+// @Router		/api/timeSpent/update [put]
+func (s *TimeSpentApi) Update(c *gin.Context) {
+	var params request.UpdateTimeSpent
+	ctx, ok := contextx.NewContext(c, &params)
+	if !ok {
+		return
+	}
+
+	errCode := service.NewTimeSpentService().UpdateTimeSpent(&params.TimeSpent)
+	if errCode != ecode.OK {
+		ctx.Fail(errCode)
+		return
+	}
+
+	ctx.Ok()
+}
+
+// List
+// @Tags		鑺辫垂鏃堕棿绠$悊
+// @Summary	鑾峰彇鑺辫垂鏃堕棿鍒楄〃
+// @Produce	application/json
+// @Success	200	{object}	response.ListResponse{data=[]model.TimeSpent}
+// @Router		/api/timeSpent/list [get]
+func (s *TimeSpentApi) List(c *gin.Context) {
+	ctx, ok := contextx.NewContext(c, nil)
+	if !ok {
+		return
+	}
+
+	timeSpent, total, errCode := service.NewTimeSpentService().GetTimeSpentList()
+	if errCode != ecode.OK {
+		ctx.Fail(errCode)
+		return
+	}
+
+	ctx.OkWithDetailed(response.ListResponse{
+		Data: timeSpent,
+		Count: total,
+	})
+}
diff --git a/constvar/faultType.go b/constvar/faultType.go
new file mode 100644
index 0000000..e522e0a
--- /dev/null
+++ b/constvar/faultType.go
@@ -0,0 +1,12 @@
+package constvar
+type FaultTypeQueryClass string
+
+const (
+	FaultTypeQueryClassExpireLessThen60Days FaultTypeQueryClass = ""
+)
+
+type FaultTypeKeywordType string
+
+const (
+	FaultTypeKeywordCustomerName   FaultTypeKeywordType = ""
+)
diff --git a/constvar/timeSpent.go b/constvar/timeSpent.go
new file mode 100644
index 0000000..4f38fe2
--- /dev/null
+++ b/constvar/timeSpent.go
@@ -0,0 +1,12 @@
+package constvar
+type TimeSpentQueryClass string
+
+const (
+	TimeSpentQueryClassExpireLessThen60Days TimeSpentQueryClass = ""
+)
+
+type TimeSpentKeywordType string
+
+const (
+	TimeSpentKeywordCustomerName   TimeSpentKeywordType = ""
+)
diff --git a/docs/docs.go b/docs/docs.go
index 041b0a8..20e3b51 100644
--- a/docs/docs.go
+++ b/docs/docs.go
@@ -2196,6 +2196,128 @@
                 }
             }
         },
+        "/api/faultType/add": {
+            "post": {
+                "produces": [
+                    "application/json"
+                ],
+                "tags": [
+                    "鏁呴殰绫诲埆绠$悊"
+                ],
+                "summary": "娣诲姞鏁呴殰绫诲埆",
+                "parameters": [
+                    {
+                        "description": "鏌ヨ鍙傛暟",
+                        "name": "object",
+                        "in": "body",
+                        "required": true,
+                        "schema": {
+                            "$ref": "#/definitions/request.AddFaultType"
+                        }
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "OK",
+                        "schema": {
+                            "$ref": "#/definitions/contextx.Response"
+                        }
+                    }
+                }
+            }
+        },
+        "/api/faultType/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/faultType/list": {
+            "get": {
+                "produces": [
+                    "application/json"
+                ],
+                "tags": [
+                    "鏁呴殰绫诲埆绠$悊"
+                ],
+                "summary": "鑾峰彇鏁呴殰绫诲埆鍒楄〃",
+                "responses": {
+                    "200": {
+                        "description": "OK",
+                        "schema": {
+                            "allOf": [
+                                {
+                                    "$ref": "#/definitions/response.ListResponse"
+                                },
+                                {
+                                    "type": "object",
+                                    "properties": {
+                                        "data": {
+                                            "type": "array",
+                                            "items": {
+                                                "$ref": "#/definitions/model.FaultType"
+                                            }
+                                        }
+                                    }
+                                }
+                            ]
+                        }
+                    }
+                }
+            }
+        },
+        "/api/faultType/update": {
+            "put": {
+                "produces": [
+                    "application/json"
+                ],
+                "tags": [
+                    "鏁呴殰绫诲埆绠$悊"
+                ],
+                "summary": "鏇存柊鏁呴殰绫诲埆",
+                "parameters": [
+                    {
+                        "description": "鏌ヨ鍙傛暟",
+                        "name": "object",
+                        "in": "body",
+                        "required": true,
+                        "schema": {
+                            "$ref": "#/definitions/request.UpdateFaultType"
+                        }
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "OK",
+                        "schema": {
+                            "$ref": "#/definitions/contextx.Response"
+                        }
+                    }
+                }
+            }
+        },
         "/api/followRecord/add": {
             "post": {
                 "produces": [
@@ -7252,6 +7374,128 @@
                 }
             }
         },
+        "/api/timeSpent/add": {
+            "post": {
+                "produces": [
+                    "application/json"
+                ],
+                "tags": [
+                    "鑺辫垂鏃堕棿绠$悊"
+                ],
+                "summary": "娣诲姞鑺辫垂鏃堕棿",
+                "parameters": [
+                    {
+                        "description": "鏌ヨ鍙傛暟",
+                        "name": "object",
+                        "in": "body",
+                        "required": true,
+                        "schema": {
+                            "$ref": "#/definitions/request.AddTimeSpent"
+                        }
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "OK",
+                        "schema": {
+                            "$ref": "#/definitions/contextx.Response"
+                        }
+                    }
+                }
+            }
+        },
+        "/api/timeSpent/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/timeSpent/list": {
+            "get": {
+                "produces": [
+                    "application/json"
+                ],
+                "tags": [
+                    "鑺辫垂鏃堕棿绠$悊"
+                ],
+                "summary": "鑾峰彇鑺辫垂鏃堕棿鍒楄〃",
+                "responses": {
+                    "200": {
+                        "description": "OK",
+                        "schema": {
+                            "allOf": [
+                                {
+                                    "$ref": "#/definitions/response.ListResponse"
+                                },
+                                {
+                                    "type": "object",
+                                    "properties": {
+                                        "data": {
+                                            "type": "array",
+                                            "items": {
+                                                "$ref": "#/definitions/model.TimeSpent"
+                                            }
+                                        }
+                                    }
+                                }
+                            ]
+                        }
+                    }
+                }
+            }
+        },
+        "/api/timeSpent/update": {
+            "put": {
+                "produces": [
+                    "application/json"
+                ],
+                "tags": [
+                    "鑺辫垂鏃堕棿绠$悊"
+                ],
+                "summary": "鏇存柊鑺辫垂鏃堕棿",
+                "parameters": [
+                    {
+                        "description": "鏌ヨ鍙傛暟",
+                        "name": "object",
+                        "in": "body",
+                        "required": true,
+                        "schema": {
+                            "$ref": "#/definitions/request.UpdateTimeSpent"
+                        }
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "OK",
+                        "schema": {
+                            "$ref": "#/definitions/contextx.Response"
+                        }
+                    }
+                }
+            }
+        },
         "/api/timelyRate/add": {
             "post": {
                 "produces": [
@@ -8333,6 +8577,17 @@
                 }
             }
         },
+        "model.FaultType": {
+            "type": "object",
+            "properties": {
+                "id": {
+                    "type": "integer"
+                },
+                "name": {
+                    "type": "string"
+                }
+            }
+        },
         "model.FollowRecord": {
             "type": "object",
             "properties": {
@@ -9319,14 +9574,21 @@
                 "client": {
                     "$ref": "#/definitions/model.Client"
                 },
-                "client_id": {
+                "clientId": {
                     "description": "瀹㈡埛id",
+                    "type": "integer"
+                },
+                "contact": {
+                    "$ref": "#/definitions/model.Contact"
+                },
+                "contact_id": {
+                    "description": "鑱旂郴浜篿d",
                     "type": "integer"
                 },
                 "contract": {
                     "$ref": "#/definitions/model.Contract"
                 },
-                "contract_id": {
+                "contractId": {
                     "description": "鍚堝悓id",
                     "type": "integer"
                 },
@@ -9340,14 +9602,10 @@
                 "id": {
                     "type": "integer"
                 },
-                "linkman_id": {
-                    "description": "鑱旂郴浜篿d",
-                    "type": "integer"
-                },
                 "order": {
                     "$ref": "#/definitions/model.OrderManage"
                 },
-                "order_id": {
+                "orderId": {
                     "description": "閿�鍞鍗昳d",
                     "type": "integer"
                 },
@@ -9369,7 +9627,7 @@
                 "product": {
                     "$ref": "#/definitions/model.Product"
                 },
-                "product_id": {
+                "productId": {
                     "description": "浜у搧id",
                     "type": "integer"
                 },
@@ -9381,22 +9639,25 @@
                     "description": "澶囨敞",
                     "type": "string"
                 },
-                "sale_leads": {
+                "saleChance": {
+                    "$ref": "#/definitions/model.SaleChance"
+                },
+                "saleChanceId": {
                     "description": "閿�鍞満浼歩d",
                     "type": "integer"
+                },
+                "serviceManId": {
+                    "description": "鏈嶅姟浜哄憳",
+                    "type": "integer"
+                },
+                "serviceNumber": {
+                    "description": "鏈嶅姟鍗曠紪鍙�",
+                    "type": "string"
                 },
                 "serviceType": {
                     "$ref": "#/definitions/model.ServiceType"
                 },
-                "service_man_id": {
-                    "description": "鏈嶅姟浜哄憳",
-                    "type": "integer"
-                },
-                "service_number": {
-                    "description": "鏈嶅姟鍗曠紪鍙�",
-                    "type": "string"
-                },
-                "service_type_id": {
+                "serviceTypeId": {
                     "description": "鏈嶅姟鏂瑰紡",
                     "type": "integer"
                 },
@@ -9495,6 +9756,17 @@
                     "items": {
                         "$ref": "#/definitions/model.Product"
                     }
+                }
+            }
+        },
+        "model.TimeSpent": {
+            "type": "object",
+            "properties": {
+                "id": {
+                    "type": "integer"
+                },
+                "name": {
+                    "type": "string"
                 }
             }
         },
@@ -9890,6 +10162,17 @@
             }
         },
         "request.AddFaq": {
+            "type": "object",
+            "properties": {
+                "id": {
+                    "type": "integer"
+                },
+                "name": {
+                    "type": "string"
+                }
+            }
+        },
+        "request.AddFaultType": {
             "type": "object",
             "properties": {
                 "id": {
@@ -10631,17 +10914,15 @@
                     "description": "鏀惰垂閲戦",
                     "type": "number"
                 },
-                "client": {
-                    "$ref": "#/definitions/model.Client"
-                },
-                "client_id": {
+                "clientId": {
                     "description": "瀹㈡埛id",
                     "type": "integer"
                 },
-                "contract": {
-                    "$ref": "#/definitions/model.Contract"
+                "contact_id": {
+                    "description": "鑱旂郴浜篿d",
+                    "type": "integer"
                 },
-                "contract_id": {
+                "contractId": {
                     "description": "鍚堝悓id",
                     "type": "integer"
                 },
@@ -10649,25 +10930,9 @@
                     "description": "甯屾湜澶勭悊鏃堕棿",
                     "type": "string"
                 },
-                "faq": {
-                    "$ref": "#/definitions/model.Faq"
-                },
-                "id": {
-                    "type": "integer"
-                },
-                "linkman_id": {
-                    "description": "鑱旂郴浜篿d",
-                    "type": "integer"
-                },
-                "order": {
-                    "$ref": "#/definitions/model.OrderManage"
-                },
-                "order_id": {
+                "orderId": {
                     "description": "閿�鍞鍗昳d",
                     "type": "integer"
-                },
-                "priorityLevel": {
-                    "$ref": "#/definitions/model.PriorityLevel"
                 },
                 "priority_level_id": {
                     "description": "浼樺厛绾у埆",
@@ -10681,10 +10946,7 @@
                     "description": "甯歌闂id",
                     "type": "integer"
                 },
-                "product": {
-                    "$ref": "#/definitions/model.Product"
-                },
-                "product_id": {
+                "productId": {
                     "description": "浜у搧id",
                     "type": "integer"
                 },
@@ -10696,27 +10958,25 @@
                     "description": "澶囨敞",
                     "type": "string"
                 },
-                "sale_leads": {
+                "saleChanceId": {
                     "description": "閿�鍞満浼歩d",
                     "type": "integer"
                 },
-                "serviceType": {
-                    "$ref": "#/definitions/model.ServiceType"
-                },
-                "service_man_id": {
+                "serviceManId": {
                     "description": "鏈嶅姟浜哄憳",
                     "type": "integer"
                 },
-                "service_number": {
+                "serviceNumber": {
                     "description": "鏈嶅姟鍗曠紪鍙�",
                     "type": "string"
                 },
-                "service_type_id": {
+                "serviceTypeId": {
                     "description": "鏈嶅姟鏂瑰紡",
                     "type": "integer"
                 },
                 "severity": {
-                    "$ref": "#/definitions/model.Severity"
+                    "description": "涓ラ噸绋嬪害",
+                    "type": "integer"
                 },
                 "solution": {
                     "description": "瑙e喅鏂规硶",
@@ -10804,6 +11064,17 @@
                     "items": {
                         "$ref": "#/definitions/model.Product"
                     }
+                }
+            }
+        },
+        "request.AddTimeSpent": {
+            "type": "object",
+            "properties": {
+                "id": {
+                    "type": "integer"
+                },
+                "name": {
+                    "type": "string"
                 }
             }
         },
@@ -12165,6 +12436,17 @@
                 }
             }
         },
+        "request.UpdateFaultType": {
+            "type": "object",
+            "properties": {
+                "id": {
+                    "type": "integer"
+                },
+                "name": {
+                    "type": "string"
+                }
+            }
+        },
         "request.UpdateFollowRecord": {
             "type": "object",
             "required": [
@@ -13286,17 +13568,15 @@
                     "description": "鏀惰垂閲戦",
                     "type": "number"
                 },
-                "client": {
-                    "$ref": "#/definitions/model.Client"
-                },
-                "client_id": {
+                "clientId": {
                     "description": "瀹㈡埛id",
                     "type": "integer"
                 },
-                "contract": {
-                    "$ref": "#/definitions/model.Contract"
+                "contact_id": {
+                    "description": "鑱旂郴浜篿d",
+                    "type": "integer"
                 },
-                "contract_id": {
+                "contractId": {
                     "description": "鍚堝悓id",
                     "type": "integer"
                 },
@@ -13304,25 +13584,12 @@
                     "description": "甯屾湜澶勭悊鏃堕棿",
                     "type": "string"
                 },
-                "faq": {
-                    "$ref": "#/definitions/model.Faq"
-                },
                 "id": {
                     "type": "integer"
                 },
-                "linkman_id": {
-                    "description": "鑱旂郴浜篿d",
-                    "type": "integer"
-                },
-                "order": {
-                    "$ref": "#/definitions/model.OrderManage"
-                },
-                "order_id": {
+                "orderId": {
                     "description": "閿�鍞鍗昳d",
                     "type": "integer"
-                },
-                "priorityLevel": {
-                    "$ref": "#/definitions/model.PriorityLevel"
                 },
                 "priority_level_id": {
                     "description": "浼樺厛绾у埆",
@@ -13336,10 +13603,7 @@
                     "description": "甯歌闂id",
                     "type": "integer"
                 },
-                "product": {
-                    "$ref": "#/definitions/model.Product"
-                },
-                "product_id": {
+                "productId": {
                     "description": "浜у搧id",
                     "type": "integer"
                 },
@@ -13351,27 +13615,25 @@
                     "description": "澶囨敞",
                     "type": "string"
                 },
-                "sale_leads": {
+                "saleChanceId": {
                     "description": "閿�鍞満浼歩d",
                     "type": "integer"
                 },
-                "serviceType": {
-                    "$ref": "#/definitions/model.ServiceType"
-                },
-                "service_man_id": {
+                "serviceManId": {
                     "description": "鏈嶅姟浜哄憳",
                     "type": "integer"
                 },
-                "service_number": {
+                "serviceNumber": {
                     "description": "鏈嶅姟鍗曠紪鍙�",
                     "type": "string"
                 },
-                "service_type_id": {
+                "serviceTypeId": {
                     "description": "鏈嶅姟鏂瑰紡",
                     "type": "integer"
                 },
                 "severity": {
-                    "$ref": "#/definitions/model.Severity"
+                    "description": "涓ラ噸绋嬪害",
+                    "type": "integer"
                 },
                 "solution": {
                     "description": "瑙e喅鏂规硶",
@@ -13501,6 +13763,17 @@
                 }
             }
         },
+        "request.UpdateTimeSpent": {
+            "type": "object",
+            "properties": {
+                "id": {
+                    "type": "integer"
+                },
+                "name": {
+                    "type": "string"
+                }
+            }
+        },
         "request.UpdateTimelyRate": {
             "type": "object",
             "required": [
diff --git a/docs/swagger.json b/docs/swagger.json
index 92d8014..5375918 100644
--- a/docs/swagger.json
+++ b/docs/swagger.json
@@ -2184,6 +2184,128 @@
                 }
             }
         },
+        "/api/faultType/add": {
+            "post": {
+                "produces": [
+                    "application/json"
+                ],
+                "tags": [
+                    "鏁呴殰绫诲埆绠$悊"
+                ],
+                "summary": "娣诲姞鏁呴殰绫诲埆",
+                "parameters": [
+                    {
+                        "description": "鏌ヨ鍙傛暟",
+                        "name": "object",
+                        "in": "body",
+                        "required": true,
+                        "schema": {
+                            "$ref": "#/definitions/request.AddFaultType"
+                        }
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "OK",
+                        "schema": {
+                            "$ref": "#/definitions/contextx.Response"
+                        }
+                    }
+                }
+            }
+        },
+        "/api/faultType/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/faultType/list": {
+            "get": {
+                "produces": [
+                    "application/json"
+                ],
+                "tags": [
+                    "鏁呴殰绫诲埆绠$悊"
+                ],
+                "summary": "鑾峰彇鏁呴殰绫诲埆鍒楄〃",
+                "responses": {
+                    "200": {
+                        "description": "OK",
+                        "schema": {
+                            "allOf": [
+                                {
+                                    "$ref": "#/definitions/response.ListResponse"
+                                },
+                                {
+                                    "type": "object",
+                                    "properties": {
+                                        "data": {
+                                            "type": "array",
+                                            "items": {
+                                                "$ref": "#/definitions/model.FaultType"
+                                            }
+                                        }
+                                    }
+                                }
+                            ]
+                        }
+                    }
+                }
+            }
+        },
+        "/api/faultType/update": {
+            "put": {
+                "produces": [
+                    "application/json"
+                ],
+                "tags": [
+                    "鏁呴殰绫诲埆绠$悊"
+                ],
+                "summary": "鏇存柊鏁呴殰绫诲埆",
+                "parameters": [
+                    {
+                        "description": "鏌ヨ鍙傛暟",
+                        "name": "object",
+                        "in": "body",
+                        "required": true,
+                        "schema": {
+                            "$ref": "#/definitions/request.UpdateFaultType"
+                        }
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "OK",
+                        "schema": {
+                            "$ref": "#/definitions/contextx.Response"
+                        }
+                    }
+                }
+            }
+        },
         "/api/followRecord/add": {
             "post": {
                 "produces": [
@@ -7240,6 +7362,128 @@
                 }
             }
         },
+        "/api/timeSpent/add": {
+            "post": {
+                "produces": [
+                    "application/json"
+                ],
+                "tags": [
+                    "鑺辫垂鏃堕棿绠$悊"
+                ],
+                "summary": "娣诲姞鑺辫垂鏃堕棿",
+                "parameters": [
+                    {
+                        "description": "鏌ヨ鍙傛暟",
+                        "name": "object",
+                        "in": "body",
+                        "required": true,
+                        "schema": {
+                            "$ref": "#/definitions/request.AddTimeSpent"
+                        }
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "OK",
+                        "schema": {
+                            "$ref": "#/definitions/contextx.Response"
+                        }
+                    }
+                }
+            }
+        },
+        "/api/timeSpent/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/timeSpent/list": {
+            "get": {
+                "produces": [
+                    "application/json"
+                ],
+                "tags": [
+                    "鑺辫垂鏃堕棿绠$悊"
+                ],
+                "summary": "鑾峰彇鑺辫垂鏃堕棿鍒楄〃",
+                "responses": {
+                    "200": {
+                        "description": "OK",
+                        "schema": {
+                            "allOf": [
+                                {
+                                    "$ref": "#/definitions/response.ListResponse"
+                                },
+                                {
+                                    "type": "object",
+                                    "properties": {
+                                        "data": {
+                                            "type": "array",
+                                            "items": {
+                                                "$ref": "#/definitions/model.TimeSpent"
+                                            }
+                                        }
+                                    }
+                                }
+                            ]
+                        }
+                    }
+                }
+            }
+        },
+        "/api/timeSpent/update": {
+            "put": {
+                "produces": [
+                    "application/json"
+                ],
+                "tags": [
+                    "鑺辫垂鏃堕棿绠$悊"
+                ],
+                "summary": "鏇存柊鑺辫垂鏃堕棿",
+                "parameters": [
+                    {
+                        "description": "鏌ヨ鍙傛暟",
+                        "name": "object",
+                        "in": "body",
+                        "required": true,
+                        "schema": {
+                            "$ref": "#/definitions/request.UpdateTimeSpent"
+                        }
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "OK",
+                        "schema": {
+                            "$ref": "#/definitions/contextx.Response"
+                        }
+                    }
+                }
+            }
+        },
         "/api/timelyRate/add": {
             "post": {
                 "produces": [
@@ -8321,6 +8565,17 @@
                 }
             }
         },
+        "model.FaultType": {
+            "type": "object",
+            "properties": {
+                "id": {
+                    "type": "integer"
+                },
+                "name": {
+                    "type": "string"
+                }
+            }
+        },
         "model.FollowRecord": {
             "type": "object",
             "properties": {
@@ -9307,14 +9562,21 @@
                 "client": {
                     "$ref": "#/definitions/model.Client"
                 },
-                "client_id": {
+                "clientId": {
                     "description": "瀹㈡埛id",
+                    "type": "integer"
+                },
+                "contact": {
+                    "$ref": "#/definitions/model.Contact"
+                },
+                "contact_id": {
+                    "description": "鑱旂郴浜篿d",
                     "type": "integer"
                 },
                 "contract": {
                     "$ref": "#/definitions/model.Contract"
                 },
-                "contract_id": {
+                "contractId": {
                     "description": "鍚堝悓id",
                     "type": "integer"
                 },
@@ -9328,14 +9590,10 @@
                 "id": {
                     "type": "integer"
                 },
-                "linkman_id": {
-                    "description": "鑱旂郴浜篿d",
-                    "type": "integer"
-                },
                 "order": {
                     "$ref": "#/definitions/model.OrderManage"
                 },
-                "order_id": {
+                "orderId": {
                     "description": "閿�鍞鍗昳d",
                     "type": "integer"
                 },
@@ -9357,7 +9615,7 @@
                 "product": {
                     "$ref": "#/definitions/model.Product"
                 },
-                "product_id": {
+                "productId": {
                     "description": "浜у搧id",
                     "type": "integer"
                 },
@@ -9369,22 +9627,25 @@
                     "description": "澶囨敞",
                     "type": "string"
                 },
-                "sale_leads": {
+                "saleChance": {
+                    "$ref": "#/definitions/model.SaleChance"
+                },
+                "saleChanceId": {
                     "description": "閿�鍞満浼歩d",
                     "type": "integer"
+                },
+                "serviceManId": {
+                    "description": "鏈嶅姟浜哄憳",
+                    "type": "integer"
+                },
+                "serviceNumber": {
+                    "description": "鏈嶅姟鍗曠紪鍙�",
+                    "type": "string"
                 },
                 "serviceType": {
                     "$ref": "#/definitions/model.ServiceType"
                 },
-                "service_man_id": {
-                    "description": "鏈嶅姟浜哄憳",
-                    "type": "integer"
-                },
-                "service_number": {
-                    "description": "鏈嶅姟鍗曠紪鍙�",
-                    "type": "string"
-                },
-                "service_type_id": {
+                "serviceTypeId": {
                     "description": "鏈嶅姟鏂瑰紡",
                     "type": "integer"
                 },
@@ -9483,6 +9744,17 @@
                     "items": {
                         "$ref": "#/definitions/model.Product"
                     }
+                }
+            }
+        },
+        "model.TimeSpent": {
+            "type": "object",
+            "properties": {
+                "id": {
+                    "type": "integer"
+                },
+                "name": {
+                    "type": "string"
                 }
             }
         },
@@ -9878,6 +10150,17 @@
             }
         },
         "request.AddFaq": {
+            "type": "object",
+            "properties": {
+                "id": {
+                    "type": "integer"
+                },
+                "name": {
+                    "type": "string"
+                }
+            }
+        },
+        "request.AddFaultType": {
             "type": "object",
             "properties": {
                 "id": {
@@ -10619,17 +10902,15 @@
                     "description": "鏀惰垂閲戦",
                     "type": "number"
                 },
-                "client": {
-                    "$ref": "#/definitions/model.Client"
-                },
-                "client_id": {
+                "clientId": {
                     "description": "瀹㈡埛id",
                     "type": "integer"
                 },
-                "contract": {
-                    "$ref": "#/definitions/model.Contract"
+                "contact_id": {
+                    "description": "鑱旂郴浜篿d",
+                    "type": "integer"
                 },
-                "contract_id": {
+                "contractId": {
                     "description": "鍚堝悓id",
                     "type": "integer"
                 },
@@ -10637,25 +10918,9 @@
                     "description": "甯屾湜澶勭悊鏃堕棿",
                     "type": "string"
                 },
-                "faq": {
-                    "$ref": "#/definitions/model.Faq"
-                },
-                "id": {
-                    "type": "integer"
-                },
-                "linkman_id": {
-                    "description": "鑱旂郴浜篿d",
-                    "type": "integer"
-                },
-                "order": {
-                    "$ref": "#/definitions/model.OrderManage"
-                },
-                "order_id": {
+                "orderId": {
                     "description": "閿�鍞鍗昳d",
                     "type": "integer"
-                },
-                "priorityLevel": {
-                    "$ref": "#/definitions/model.PriorityLevel"
                 },
                 "priority_level_id": {
                     "description": "浼樺厛绾у埆",
@@ -10669,10 +10934,7 @@
                     "description": "甯歌闂id",
                     "type": "integer"
                 },
-                "product": {
-                    "$ref": "#/definitions/model.Product"
-                },
-                "product_id": {
+                "productId": {
                     "description": "浜у搧id",
                     "type": "integer"
                 },
@@ -10684,27 +10946,25 @@
                     "description": "澶囨敞",
                     "type": "string"
                 },
-                "sale_leads": {
+                "saleChanceId": {
                     "description": "閿�鍞満浼歩d",
                     "type": "integer"
                 },
-                "serviceType": {
-                    "$ref": "#/definitions/model.ServiceType"
-                },
-                "service_man_id": {
+                "serviceManId": {
                     "description": "鏈嶅姟浜哄憳",
                     "type": "integer"
                 },
-                "service_number": {
+                "serviceNumber": {
                     "description": "鏈嶅姟鍗曠紪鍙�",
                     "type": "string"
                 },
-                "service_type_id": {
+                "serviceTypeId": {
                     "description": "鏈嶅姟鏂瑰紡",
                     "type": "integer"
                 },
                 "severity": {
-                    "$ref": "#/definitions/model.Severity"
+                    "description": "涓ラ噸绋嬪害",
+                    "type": "integer"
                 },
                 "solution": {
                     "description": "瑙e喅鏂规硶",
@@ -10792,6 +11052,17 @@
                     "items": {
                         "$ref": "#/definitions/model.Product"
                     }
+                }
+            }
+        },
+        "request.AddTimeSpent": {
+            "type": "object",
+            "properties": {
+                "id": {
+                    "type": "integer"
+                },
+                "name": {
+                    "type": "string"
                 }
             }
         },
@@ -12153,6 +12424,17 @@
                 }
             }
         },
+        "request.UpdateFaultType": {
+            "type": "object",
+            "properties": {
+                "id": {
+                    "type": "integer"
+                },
+                "name": {
+                    "type": "string"
+                }
+            }
+        },
         "request.UpdateFollowRecord": {
             "type": "object",
             "required": [
@@ -13274,17 +13556,15 @@
                     "description": "鏀惰垂閲戦",
                     "type": "number"
                 },
-                "client": {
-                    "$ref": "#/definitions/model.Client"
-                },
-                "client_id": {
+                "clientId": {
                     "description": "瀹㈡埛id",
                     "type": "integer"
                 },
-                "contract": {
-                    "$ref": "#/definitions/model.Contract"
+                "contact_id": {
+                    "description": "鑱旂郴浜篿d",
+                    "type": "integer"
                 },
-                "contract_id": {
+                "contractId": {
                     "description": "鍚堝悓id",
                     "type": "integer"
                 },
@@ -13292,25 +13572,12 @@
                     "description": "甯屾湜澶勭悊鏃堕棿",
                     "type": "string"
                 },
-                "faq": {
-                    "$ref": "#/definitions/model.Faq"
-                },
                 "id": {
                     "type": "integer"
                 },
-                "linkman_id": {
-                    "description": "鑱旂郴浜篿d",
-                    "type": "integer"
-                },
-                "order": {
-                    "$ref": "#/definitions/model.OrderManage"
-                },
-                "order_id": {
+                "orderId": {
                     "description": "閿�鍞鍗昳d",
                     "type": "integer"
-                },
-                "priorityLevel": {
-                    "$ref": "#/definitions/model.PriorityLevel"
                 },
                 "priority_level_id": {
                     "description": "浼樺厛绾у埆",
@@ -13324,10 +13591,7 @@
                     "description": "甯歌闂id",
                     "type": "integer"
                 },
-                "product": {
-                    "$ref": "#/definitions/model.Product"
-                },
-                "product_id": {
+                "productId": {
                     "description": "浜у搧id",
                     "type": "integer"
                 },
@@ -13339,27 +13603,25 @@
                     "description": "澶囨敞",
                     "type": "string"
                 },
-                "sale_leads": {
+                "saleChanceId": {
                     "description": "閿�鍞満浼歩d",
                     "type": "integer"
                 },
-                "serviceType": {
-                    "$ref": "#/definitions/model.ServiceType"
-                },
-                "service_man_id": {
+                "serviceManId": {
                     "description": "鏈嶅姟浜哄憳",
                     "type": "integer"
                 },
-                "service_number": {
+                "serviceNumber": {
                     "description": "鏈嶅姟鍗曠紪鍙�",
                     "type": "string"
                 },
-                "service_type_id": {
+                "serviceTypeId": {
                     "description": "鏈嶅姟鏂瑰紡",
                     "type": "integer"
                 },
                 "severity": {
-                    "$ref": "#/definitions/model.Severity"
+                    "description": "涓ラ噸绋嬪害",
+                    "type": "integer"
                 },
                 "solution": {
                     "description": "瑙e喅鏂规硶",
@@ -13489,6 +13751,17 @@
                 }
             }
         },
+        "request.UpdateTimeSpent": {
+            "type": "object",
+            "properties": {
+                "id": {
+                    "type": "integer"
+                },
+                "name": {
+                    "type": "string"
+                }
+            }
+        },
         "request.UpdateTimelyRate": {
             "type": "object",
             "required": [
diff --git a/docs/swagger.yaml b/docs/swagger.yaml
index e8359e8..a09d957 100644
--- a/docs/swagger.yaml
+++ b/docs/swagger.yaml
@@ -452,6 +452,13 @@
       name:
         type: string
     type: object
+  model.FaultType:
+    properties:
+      id:
+        type: integer
+      name:
+        type: string
+    type: object
   model.FollowRecord:
     properties:
       client:
@@ -1099,12 +1106,17 @@
         type: number
       client:
         $ref: '#/definitions/model.Client'
-      client_id:
+      clientId:
         description: 瀹㈡埛id
+        type: integer
+      contact:
+        $ref: '#/definitions/model.Contact'
+      contact_id:
+        description: 鑱旂郴浜篿d
         type: integer
       contract:
         $ref: '#/definitions/model.Contract'
-      contract_id:
+      contractId:
         description: 鍚堝悓id
         type: integer
       expect_time:
@@ -1114,12 +1126,9 @@
         $ref: '#/definitions/model.Faq'
       id:
         type: integer
-      linkman_id:
-        description: 鑱旂郴浜篿d
-        type: integer
       order:
         $ref: '#/definitions/model.OrderManage'
-      order_id:
+      orderId:
         description: 閿�鍞鍗昳d
         type: integer
       priority_level_id:
@@ -1135,7 +1144,7 @@
         type: integer
       product:
         $ref: '#/definitions/model.Product'
-      product_id:
+      productId:
         description: 浜у搧id
         type: integer
       real_time:
@@ -1144,20 +1153,22 @@
       remark:
         description: 澶囨敞
         type: string
-      sale_leads:
+      saleChance:
+        $ref: '#/definitions/model.SaleChance'
+      saleChanceId:
         description: 閿�鍞満浼歩d
         type: integer
-      service_man_id:
+      serviceManId:
         description: 鏈嶅姟浜哄憳
         type: integer
-      service_number:
+      serviceNumber:
         description: 鏈嶅姟鍗曠紪鍙�
         type: string
-      service_type_id:
-        description: 鏈嶅姟鏂瑰紡
-        type: integer
       serviceType:
         $ref: '#/definitions/model.ServiceType'
+      serviceTypeId:
+        description: 鏈嶅姟鏂瑰紡
+        type: integer
       severity:
         $ref: '#/definitions/model.Severity'
       solution:
@@ -1222,6 +1233,13 @@
         items:
           $ref: '#/definitions/model.Product'
         type: array
+    type: object
+  model.TimeSpent:
+    properties:
+      id:
+        type: integer
+      name:
+        type: string
     type: object
   model.TimelyRate:
     properties:
@@ -1492,6 +1510,13 @@
     - name
     type: object
   request.AddFaq:
+    properties:
+      id:
+        type: integer
+      name:
+        type: string
+    type: object
+  request.AddFaultType:
     properties:
       id:
         type: integer
@@ -1985,45 +2010,31 @@
       charge_amount:
         description: 鏀惰垂閲戦
         type: number
-      client:
-        $ref: '#/definitions/model.Client'
-      client_id:
+      clientId:
         description: 瀹㈡埛id
         type: integer
-      contract:
-        $ref: '#/definitions/model.Contract'
-      contract_id:
+      contact_id:
+        description: 鑱旂郴浜篿d
+        type: integer
+      contractId:
         description: 鍚堝悓id
         type: integer
       expect_time:
         description: 甯屾湜澶勭悊鏃堕棿
         type: string
-      faq:
-        $ref: '#/definitions/model.Faq'
-      id:
-        type: integer
-      linkman_id:
-        description: 鑱旂郴浜篿d
-        type: integer
-      order:
-        $ref: '#/definitions/model.OrderManage'
-      order_id:
+      orderId:
         description: 閿�鍞鍗昳d
         type: integer
       priority_level_id:
         description: 浼樺厛绾у埆
         type: integer
-      priorityLevel:
-        $ref: '#/definitions/model.PriorityLevel'
       problem_desc:
         description: 闂鎻忚堪
         type: string
       problem_id:
         description: 甯歌闂id
         type: integer
-      product:
-        $ref: '#/definitions/model.Product'
-      product_id:
+      productId:
         description: 浜у搧id
         type: integer
       real_time:
@@ -2032,22 +2043,21 @@
       remark:
         description: 澶囨敞
         type: string
-      sale_leads:
+      saleChanceId:
         description: 閿�鍞満浼歩d
         type: integer
-      service_man_id:
+      serviceManId:
         description: 鏈嶅姟浜哄憳
         type: integer
-      service_number:
+      serviceNumber:
         description: 鏈嶅姟鍗曠紪鍙�
         type: string
-      service_type_id:
+      serviceTypeId:
         description: 鏈嶅姟鏂瑰紡
         type: integer
-      serviceType:
-        $ref: '#/definitions/model.ServiceType'
       severity:
-        $ref: '#/definitions/model.Severity'
+        description: 涓ラ噸绋嬪害
+        type: integer
       solution:
         description: 瑙e喅鏂规硶
         type: string
@@ -2106,6 +2116,13 @@
         items:
           $ref: '#/definitions/model.Product'
         type: array
+    type: object
+  request.AddTimeSpent:
+    properties:
+      id:
+        type: integer
+      name:
+        type: string
     type: object
   request.AddTimelyRate:
     properties:
@@ -3034,6 +3051,13 @@
       name:
         type: string
     type: object
+  request.UpdateFaultType:
+    properties:
+      id:
+        type: integer
+      name:
+        type: string
+    type: object
   request.UpdateFollowRecord:
     properties:
       follow_record:
@@ -3781,45 +3805,33 @@
       charge_amount:
         description: 鏀惰垂閲戦
         type: number
-      client:
-        $ref: '#/definitions/model.Client'
-      client_id:
+      clientId:
         description: 瀹㈡埛id
         type: integer
-      contract:
-        $ref: '#/definitions/model.Contract'
-      contract_id:
+      contact_id:
+        description: 鑱旂郴浜篿d
+        type: integer
+      contractId:
         description: 鍚堝悓id
         type: integer
       expect_time:
         description: 甯屾湜澶勭悊鏃堕棿
         type: string
-      faq:
-        $ref: '#/definitions/model.Faq'
       id:
         type: integer
-      linkman_id:
-        description: 鑱旂郴浜篿d
-        type: integer
-      order:
-        $ref: '#/definitions/model.OrderManage'
-      order_id:
+      orderId:
         description: 閿�鍞鍗昳d
         type: integer
       priority_level_id:
         description: 浼樺厛绾у埆
         type: integer
-      priorityLevel:
-        $ref: '#/definitions/model.PriorityLevel'
       problem_desc:
         description: 闂鎻忚堪
         type: string
       problem_id:
         description: 甯歌闂id
         type: integer
-      product:
-        $ref: '#/definitions/model.Product'
-      product_id:
+      productId:
         description: 浜у搧id
         type: integer
       real_time:
@@ -3828,22 +3840,21 @@
       remark:
         description: 澶囨敞
         type: string
-      sale_leads:
+      saleChanceId:
         description: 閿�鍞満浼歩d
         type: integer
-      service_man_id:
+      serviceManId:
         description: 鏈嶅姟浜哄憳
         type: integer
-      service_number:
+      serviceNumber:
         description: 鏈嶅姟鍗曠紪鍙�
         type: string
-      service_type_id:
+      serviceTypeId:
         description: 鏈嶅姟鏂瑰紡
         type: integer
-      serviceType:
-        $ref: '#/definitions/model.ServiceType'
       severity:
-        $ref: '#/definitions/model.Severity'
+        description: 涓ラ噸绋嬪害
+        type: integer
       solution:
         description: 瑙e喅鏂规硶
         type: string
@@ -3928,6 +3939,13 @@
         items:
           $ref: '#/definitions/model.Product'
         type: array
+    type: object
+  request.UpdateTimeSpent:
+    properties:
+      id:
+        type: integer
+      name:
+        type: string
     type: object
   request.UpdateTimelyRate:
     properties:
@@ -5892,6 +5910,81 @@
       summary: 鏇存柊甯歌闂
       tags:
       - 甯歌闂绠$悊
+  /api/faultType/add:
+    post:
+      parameters:
+      - description: 鏌ヨ鍙傛暟
+        in: body
+        name: object
+        required: true
+        schema:
+          $ref: '#/definitions/request.AddFaultType'
+      produces:
+      - application/json
+      responses:
+        "200":
+          description: OK
+          schema:
+            $ref: '#/definitions/contextx.Response'
+      summary: 娣诲姞鏁呴殰绫诲埆
+      tags:
+      - 鏁呴殰绫诲埆绠$悊
+  /api/faultType/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/faultType/list:
+    get:
+      produces:
+      - application/json
+      responses:
+        "200":
+          description: OK
+          schema:
+            allOf:
+            - $ref: '#/definitions/response.ListResponse'
+            - properties:
+                data:
+                  items:
+                    $ref: '#/definitions/model.FaultType'
+                  type: array
+              type: object
+      summary: 鑾峰彇鏁呴殰绫诲埆鍒楄〃
+      tags:
+      - 鏁呴殰绫诲埆绠$悊
+  /api/faultType/update:
+    put:
+      parameters:
+      - description: 鏌ヨ鍙傛暟
+        in: body
+        name: object
+        required: true
+        schema:
+          $ref: '#/definitions/request.UpdateFaultType'
+      produces:
+      - application/json
+      responses:
+        "200":
+          description: OK
+          schema:
+            $ref: '#/definitions/contextx.Response'
+      summary: 鏇存柊鏁呴殰绫诲埆
+      tags:
+      - 鏁呴殰绫诲埆绠$悊
   /api/followRecord/add:
     post:
       parameters:
@@ -9000,6 +9093,81 @@
       summary: 鏇存柊瀛愯鍗�
       tags:
       - SubOrder
+  /api/timeSpent/add:
+    post:
+      parameters:
+      - description: 鏌ヨ鍙傛暟
+        in: body
+        name: object
+        required: true
+        schema:
+          $ref: '#/definitions/request.AddTimeSpent'
+      produces:
+      - application/json
+      responses:
+        "200":
+          description: OK
+          schema:
+            $ref: '#/definitions/contextx.Response'
+      summary: 娣诲姞鑺辫垂鏃堕棿
+      tags:
+      - 鑺辫垂鏃堕棿绠$悊
+  /api/timeSpent/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/timeSpent/list:
+    get:
+      produces:
+      - application/json
+      responses:
+        "200":
+          description: OK
+          schema:
+            allOf:
+            - $ref: '#/definitions/response.ListResponse'
+            - properties:
+                data:
+                  items:
+                    $ref: '#/definitions/model.TimeSpent'
+                  type: array
+              type: object
+      summary: 鑾峰彇鑺辫垂鏃堕棿鍒楄〃
+      tags:
+      - 鑺辫垂鏃堕棿绠$悊
+  /api/timeSpent/update:
+    put:
+      parameters:
+      - description: 鏌ヨ鍙傛暟
+        in: body
+        name: object
+        required: true
+        schema:
+          $ref: '#/definitions/request.UpdateTimeSpent'
+      produces:
+      - application/json
+      responses:
+        "200":
+          description: OK
+          schema:
+            $ref: '#/definitions/contextx.Response'
+      summary: 鏇存柊鑺辫垂鏃堕棿
+      tags:
+      - 鑺辫垂鏃堕棿绠$悊
   /api/timelyRate/add:
     post:
       parameters:
diff --git a/model/faq.go b/model/faq.go
index 9fe3184..874b5bc 100644
--- a/model/faq.go
+++ b/model/faq.go
@@ -12,18 +12,18 @@
 	// Faq 甯歌闂
 	Faq struct {
 		Id   int    `json:"id" gorm:"column:id;primary_key;AUTO_INCREMENT"`
-		Name   string    `json:"name" gorm:"column:name"`
+		Name string `json:"name" gorm:"column:name"`
 	}
 
 	// FaqSearch 甯歌闂鎼滅储鏉′欢
 	FaqSearch struct {
 		Faq
-		Orm *gorm.DB
-        QueryClass  constvar.FaqQueryClass
-        KeywordType constvar.FaqKeywordType
-        Keyword     string
-        PageNum  int
-        PageSize int
+		Orm         *gorm.DB
+		QueryClass  constvar.FaqQueryClass
+		KeywordType constvar.FaqKeywordType
+		Keyword     string
+		PageNum     int
+		PageSize    int
 	}
 )
 
@@ -49,6 +49,11 @@
 func (slf *FaqSearch) Create(record *Faq) error {
 	var db = slf.build()
 	return db.Create(record).Error
+}
+
+func (slf *FaqSearch) CreateBatch(records []*Faq) error {
+	var db = slf.build()
+	return db.Create(records).Error
 }
 
 func (slf *FaqSearch) Delete() error {
@@ -111,4 +116,4 @@
 
 	err := db.Find(&records).Error
 	return records, total, err
-}
\ No newline at end of file
+}
diff --git a/model/faultType.go b/model/faultType.go
new file mode 100644
index 0000000..68306bc
--- /dev/null
+++ b/model/faultType.go
@@ -0,0 +1,119 @@
+package model
+
+import (
+	"aps_crm/constvar"
+	"aps_crm/pkg/mysqlx"
+	"errors"
+	"fmt"
+	"gorm.io/gorm"
+)
+
+type (
+	// FaultType 鏁呴殰绫诲埆
+	FaultType struct {
+		Id   int    `json:"id" gorm:"column:id;primary_key;AUTO_INCREMENT"`
+		Name string `json:"name" gorm:"column:name"`
+	}
+
+	// FaultTypeSearch 鏁呴殰绫诲埆鎼滅储鏉′欢
+	FaultTypeSearch struct {
+		FaultType
+		Orm         *gorm.DB
+		QueryClass  constvar.FaultTypeQueryClass
+		KeywordType constvar.FaultTypeKeywordType
+		Keyword     string
+		PageNum     int
+		PageSize    int
+	}
+)
+
+func (FaultType) TableName() string {
+	return "fault_type"
+}
+
+func NewFaultTypeSearch() *FaultTypeSearch {
+	return &FaultTypeSearch{
+		Orm: mysqlx.GetDB(),
+	}
+}
+
+func (slf *FaultTypeSearch) build() *gorm.DB {
+	var db = slf.Orm.Model(&FaultType{})
+	if slf.Id != 0 {
+		db = db.Where("id = ?", slf.Id)
+	}
+
+	return db
+}
+
+func (slf *FaultTypeSearch) Create(record *FaultType) error {
+	var db = slf.build()
+	return db.Create(record).Error
+}
+
+func (slf *FaultTypeSearch) CreateBatch(records []*FaultType) error {
+	var db = slf.build()
+	return db.Create(records).Error
+}
+
+func (slf *FaultTypeSearch) Delete() error {
+	var db = slf.build()
+	return db.Delete(&FaultType{}).Error
+}
+
+func (slf *FaultTypeSearch) Update(record *FaultType) error {
+	var db = slf.build()
+	return db.Updates(record).Error
+}
+
+func (slf *FaultTypeSearch) FindAll() ([]*FaultType, error) {
+	var db = slf.build()
+	var record = make([]*FaultType, 0)
+	err := db.Find(&record).Error
+	return record, err
+}
+
+func (slf *FaultTypeSearch) SetId(id int) *FaultTypeSearch {
+	slf.Id = id
+	return slf
+}
+
+func (slf *FaultTypeSearch) First() (*FaultType, error) {
+	var db = slf.build()
+	var record = new(FaultType)
+	err := db.First(record).Error
+	return record, err
+}
+
+func (slf *FaultTypeSearch) Updates(values interface{}) error {
+	var db = slf.build()
+	return db.Updates(values).Error
+}
+
+func (slf *FaultTypeSearch) Save(record *FaultType) 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 *FaultTypeSearch) Find() ([]*FaultType, int64, error) {
+	var db = slf.build()
+	var records = make([]*FaultType, 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
+}
diff --git a/model/index.go b/model/index.go
index 7a0f17c..7a90d35 100644
--- a/model/index.go
+++ b/model/index.go
@@ -4,6 +4,8 @@
 	"aps_crm/conf"
 	"aps_crm/pkg/logx"
 	"aps_crm/pkg/mysqlx"
+	"aps_crm/pkg/safe"
+	"gorm.io/gorm/schema"
 )
 
 func Init() error {
@@ -14,7 +16,9 @@
 	if err := RegisterTables(); err != nil {
 		return err
 	}
-
+	safe.Go(func() {
+		InsertDefaultData()
+	})
 	return nil
 }
 
@@ -66,19 +70,39 @@
 		Satisfaction{},
 		TimelyRate{},
 		SolveRate{},
-        IsVisit{},
-        IsVisit{},
-        ReportSource{},
-        OrderType{},
-        ServiceContractStatus{},
-        ServiceContractType{},
-        RefundMethod{},
-        IsInvoice{},
-        AccountId{},
-        SalesReturnStatus{},
-        Repository{},
-        QuotationStatus{},
-        Currency{},
+		IsVisit{},
+		IsVisit{},
+		ReportSource{},
+		OrderType{},
+		ServiceContractStatus{},
+		ServiceContractType{},
+		RefundMethod{},
+		IsInvoice{},
+		AccountId{},
+		SalesReturnStatus{},
+		Repository{},
+		QuotationStatus{},
+		Currency{},
 	)
 	return err
-}
\ No newline at end of file
+}
+
+type InitDefaultData interface {
+	InitDefaultData() error
+}
+
+func InsertDefaultData() {
+	models := []interface{}{
+		NewServiceTypeSearch(),
+		NewPriorityLevelSearch(),
+		NewSeveritySearch(),
+		NewTimeSpentSearch(),
+	}
+	for _, model := range models {
+		if id, ok := model.(InitDefaultData); ok {
+			if err := id.InitDefaultData(); err != nil {
+				logx.Errorf("InitDefaultData for table: %v, err :%v", model.(schema.Tabler).TableName(), err.Error())
+			}
+		}
+	}
+}
diff --git a/model/priorityLevel.go b/model/priorityLevel.go
index be5b783..b2240f8 100644
--- a/model/priorityLevel.go
+++ b/model/priorityLevel.go
@@ -12,18 +12,18 @@
 	// PriorityLevel 浼樺厛绾у埆
 	PriorityLevel struct {
 		Id   int    `json:"id" gorm:"column:id;primary_key;AUTO_INCREMENT"`
-		Name   string    `json:"name" gorm:"column:name"`
+		Name string `json:"name" gorm:"column:name"`
 	}
 
 	// PriorityLevelSearch 浼樺厛绾у埆鎼滅储鏉′欢
 	PriorityLevelSearch struct {
 		PriorityLevel
-		Orm *gorm.DB
-        QueryClass  constvar.PriorityLevelQueryClass
-        KeywordType constvar.PriorityLevelKeywordType
-        Keyword     string
-        PageNum  int
-        PageSize int
+		Orm         *gorm.DB
+		QueryClass  constvar.PriorityLevelQueryClass
+		KeywordType constvar.PriorityLevelKeywordType
+		Keyword     string
+		PageNum     int
+		PageSize    int
 	}
 )
 
@@ -49,6 +49,11 @@
 func (slf *PriorityLevelSearch) Create(record *PriorityLevel) error {
 	var db = slf.build()
 	return db.Create(record).Error
+}
+
+func (slf *PriorityLevelSearch) CreateBatch(records []*PriorityLevel) error {
+	var db = slf.build()
+	return db.Create(records).Error
 }
 
 func (slf *PriorityLevelSearch) Delete() error {
@@ -111,4 +116,25 @@
 
 	err := db.Find(&records).Error
 	return records, total, err
-}
\ No newline at end of file
+}
+
+// InitDefaultData 鍒濆鍖栨暟鎹�
+func (slf *PriorityLevelSearch) 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 := []*PriorityLevel{
+		{Name: "浣�"},
+		{Name: "涓�鑸�"},
+		{Name: "楂�"},
+		{Name: "绱ф��"},
+	}
+	return slf.CreateBatch(records)
+}
diff --git a/model/request/faultType.go b/model/request/faultType.go
new file mode 100644
index 0000000..06ec614
--- /dev/null
+++ b/model/request/faultType.go
@@ -0,0 +1,22 @@
+package request
+
+import (
+    "aps_crm/constvar"
+    "aps_crm/model"
+)
+
+type AddFaultType struct {
+	model.FaultType
+}
+
+type UpdateFaultType struct {
+	Id int `json:"id"`
+	model.FaultType
+}
+
+type GetFaultTypeList struct {
+	PageInfo
+	QueryClass  constvar.FaultTypeQueryClass  `json:"queryClass"`
+	KeywordType constvar.FaultTypeKeywordType `json:"keywordType"`
+	Keyword     string                           `json:"keyword"`
+}
diff --git a/model/request/serviceOrder.go b/model/request/serviceOrder.go
index d89e900..8e1c83b 100644
--- a/model/request/serviceOrder.go
+++ b/model/request/serviceOrder.go
@@ -1,17 +1,40 @@
 package request
 
 import (
-    "aps_crm/constvar"
-    "aps_crm/model"
+	"aps_crm/constvar"
 )
 
 type AddServiceOrder struct {
-	model.ServiceOrder
+	ServiceNumber   string  `gorm:"service_number" json:"serviceNumber"`        // 鏈嶅姟鍗曠紪鍙�
+	ClientId        int     `gorm:"client_id" json:"clientId"`                  // 瀹㈡埛id
+	ContractId      int     `gorm:"contract_id" json:"contractId"`              // 鍚堝悓id
+	OrderId         int     `gorm:"order_id" json:"orderId"`                    // 閿�鍞鍗昳d
+	Subject         string  `gorm:"subject" json:"subject"`                     // 涓婚
+	ProductId       int     `gorm:"product_id" json:"productId"`                // 浜у搧id
+	ServiceTypeId   int     `gorm:"service_type_id" json:"serviceTypeId"`       // 鏈嶅姟鏂瑰紡
+	ServiceManId    int     `gorm:"service_man_id" json:"serviceManId"`         // 鏈嶅姟浜哄憳
+	ContactId       int     `gorm:"linkman_id" json:"contact_id"`               // 鑱旂郴浜篿d
+	Address         string  `gorm:"address" json:"address"`                     // 涓婇棬鍦板潃
+	PriorityLevelId int     `gorm:"priority_level_id" json:"priority_level_id"` // 浼樺厛绾у埆
+	AppointmentTime string  `gorm:"appointment_time" json:"appointment_time"`   // 棰勭害涓婇棬鏃堕棿
+	SaleChanceId    int     `gorm:"sale_leads" json:"saleChanceId"`             // 閿�鍞満浼歩d
+	SeverityId      int     `gorm:"severity_id" json:"severity"`                // 涓ラ噸绋嬪害
+	Status          int     `gorm:"status" json:"status"`                       // 澶勭悊鐘舵��
+	ExpectTime      string  `gorm:"expect_time" json:"expect_time"`             // 甯屾湜澶勭悊鏃堕棿
+	RealTime        string  `gorm:"real_time" json:"real_time"`                 // 瀹為檯澶勭悊鏃堕棿
+	CarFare         float64 `gorm:"car_fare" json:"car_fare"`                   // 浜ら�氳垂
+	ChargeAmount    float64 `gorm:"charge_amount" json:"charge_amount"`         // 鏀惰垂閲戦
+	TimeSpentId     int     `gorm:"time_spent_id" json:"time_spent_id"`         // 鑺辫垂鏃堕棿
+	FaqId           int     `gorm:"problem_id" json:"problem_id"`               // 甯歌闂id
+	ProblemDesc     string  `gorm:"problem_desc" json:"problem_desc"`           // 闂鎻忚堪
+	Solution        string  `gorm:"solution" json:"solution"`                   // 瑙e喅鏂规硶
+	SolutionRemark  string  `gorm:"solution_remark" json:"solution_remark"`     // 鍐呴儴澶囨敞
+	Remark          string  `gorm:"remark" json:"remark"`                       // 澶囨敞
 }
 
 type UpdateServiceOrder struct {
 	Id int `json:"id"`
-	model.ServiceOrder
+	AddServiceOrder
 }
 
 type GetServiceOrderList struct {
diff --git a/model/request/timeSpent.go b/model/request/timeSpent.go
new file mode 100644
index 0000000..120461a
--- /dev/null
+++ b/model/request/timeSpent.go
@@ -0,0 +1,22 @@
+package request
+
+import (
+    "aps_crm/constvar"
+    "aps_crm/model"
+)
+
+type AddTimeSpent struct {
+	model.TimeSpent
+}
+
+type UpdateTimeSpent struct {
+	Id int `json:"id"`
+	model.TimeSpent
+}
+
+type GetTimeSpentList struct {
+	PageInfo
+	QueryClass  constvar.TimeSpentQueryClass  `json:"queryClass"`
+	KeywordType constvar.TimeSpentKeywordType `json:"keywordType"`
+	Keyword     string                           `json:"keyword"`
+}
diff --git a/model/serviceOrder.go b/model/serviceOrder.go
index d8de6eb..fc6307c 100644
--- a/model/serviceOrder.go
+++ b/model/serviceOrder.go
@@ -12,26 +12,28 @@
 	// ServiceOrder 鏈嶅姟鍗�
 	ServiceOrder struct {
 		Id              int           `json:"id" gorm:"column:id;primary_key;AUTO_INCREMENT"`
-		ServiceNumber   string        `gorm:"service_number" json:"service_number"` // 鏈嶅姟鍗曠紪鍙�
-		ClientId        int           `gorm:"client_id" json:"client_id"`           // 瀹㈡埛id
+		ServiceNumber   string        `gorm:"service_number" json:"serviceNumber"` // 鏈嶅姟鍗曠紪鍙�
+		ClientId        int           `gorm:"client_id" json:"clientId"`           // 瀹㈡埛id
 		Client          Client        `gorm:"foreignKey:ClientId"`
-		ContractId      int           `gorm:"contract_id" json:"contract_id"` // 鍚堝悓id
+		ContractId      int           `gorm:"contract_id" json:"contractId"` // 鍚堝悓id
 		Contract        Contract      `gorm:"foreignKey:ContractId"`
-		OrderId         int           `gorm:"order_id" json:"order_id"` // 閿�鍞鍗昳d
-		Order           OrderManage   `gorm:"foreignKey:OrderId"`
-		Subject         string        `gorm:"subject" json:"subject"`       // 涓婚
-		ProductId       int           `gorm:"product_id" json:"product_id"` // 浜у搧id
+		OrderId         int           `gorm:"order_id" json:"orderId"` // 閿�鍞鍗昳d
+		OrderManage     OrderManage   `gorm:"foreignKey:OrderId"`
+		Subject         string        `gorm:"subject" json:"subject"`      // 涓婚
+		ProductId       int           `gorm:"product_id" json:"productId"` // 浜у搧id
 		Product         Product       `gorm:"foreignKey:ProductId"`
-		ServiceTypeId   int           `gorm:"service_type_id" json:"service_type_id"` // 鏈嶅姟鏂瑰紡
+		ServiceTypeId   int           `gorm:"service_type_id" json:"serviceTypeId"` // 鏈嶅姟鏂瑰紡
 		ServiceType     ServiceType   `gorm:"foreignKey:ServiceTypeId"`
-		ServiceManId    int           `gorm:"service_man_id" json:"service_man_id"`       // 鏈嶅姟浜哄憳
-		LinkmanId       int           `gorm:"linkman_id" json:"linkman_id"`               // 鑱旂郴浜篿d
+		ServiceManId    int           `gorm:"service_man_id" json:"serviceManId"` // 鏈嶅姟浜哄憳
+		ContactId       int           `gorm:"linkman_id" json:"contact_id"`       // 鑱旂郴浜篿d
+		Contact         Contact       `gorm:"foreignKey:ContactId"`
 		Address         string        `gorm:"address" json:"address"`                     // 涓婇棬鍦板潃
 		PriorityLevelId int           `gorm:"priority_level_id" json:"priority_level_id"` // 浼樺厛绾у埆
 		PriorityLevel   PriorityLevel `gorm:"foreignKey:PriorityLevelId"`
 		AppointmentTime string        `gorm:"appointment_time" json:"appointment_time"` // 棰勭害涓婇棬鏃堕棿
-		SaleLeads       int           `gorm:"sale_leads" json:"sale_leads"`             // 閿�鍞満浼歩d
-		SeverityId      int           `gorm:"severity_id" json:"severity"`              // 涓ラ噸绋嬪害
+		SaleChanceId    int           `gorm:"sale_leads" json:"saleChanceId"`           // 閿�鍞満浼歩d
+		SaleChance      SaleChance    `gorm:"foreignKey:SaleChanceId"`
+		SeverityId      int           `gorm:"severity_id" json:"severity"` // 涓ラ噸绋嬪害
 		Severity        Severity      `gorm:"foreignKey:SeverityId"`
 		Status          int           `gorm:"status" json:"status"`               // 澶勭悊鐘舵��
 		ExpectTime      string        `gorm:"expect_time" json:"expect_time"`     // 甯屾湜澶勭悊鏃堕棿
@@ -76,12 +78,14 @@
 		db = db.Where("id = ?", slf.Id)
 	}
 	if slf.Preload {
-		db = db.Model(&ServiceOrder{}).
+		db = db.
 			Preload("Client").
 			Preload("Contract").
 			Preload("OrderManage").
 			Preload("Product").
 			Preload("ServiceType").
+			Preload("Contact").
+			Preload("SaleChance").
 			Preload("PriorityLevel").
 			Preload("Severity").
 			Preload("Faq")
diff --git a/model/serviceType.go b/model/serviceType.go
index 7e6f686..402a9a5 100644
--- a/model/serviceType.go
+++ b/model/serviceType.go
@@ -12,18 +12,18 @@
 	// ServiceType 鏈嶅姟绫诲瀷
 	ServiceType struct {
 		Id   int    `json:"id" gorm:"column:id;primary_key;AUTO_INCREMENT"`
-		Name   string    `json:"name" gorm:"column:name"`
+		Name string `json:"name" gorm:"column:name"`
 	}
 
 	// ServiceTypeSearch 鏈嶅姟绫诲瀷鎼滅储鏉′欢
 	ServiceTypeSearch struct {
 		ServiceType
-		Orm *gorm.DB
-        QueryClass  constvar.ServiceTypeQueryClass
-        KeywordType constvar.ServiceTypeKeywordType
-        Keyword     string
-        PageNum  int
-        PageSize int
+		Orm         *gorm.DB
+		QueryClass  constvar.ServiceTypeQueryClass
+		KeywordType constvar.ServiceTypeKeywordType
+		Keyword     string
+		PageNum     int
+		PageSize    int
 	}
 )
 
@@ -49,6 +49,11 @@
 func (slf *ServiceTypeSearch) Create(record *ServiceType) error {
 	var db = slf.build()
 	return db.Create(record).Error
+}
+
+func (slf *ServiceTypeSearch) CreateBatch(records []*ServiceType) error {
+	var db = slf.build()
+	return db.Create(records).Error
 }
 
 func (slf *ServiceTypeSearch) Delete() error {
@@ -111,4 +116,26 @@
 
 	err := db.Find(&records).Error
 	return records, total, err
-}
\ No newline at end of file
+}
+
+// InitDefaultData 鍒濆鍖栨暟鎹�
+func (slf *ServiceTypeSearch) 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 := []*ServiceType{
+		{Name: "鐢佃瘽"},
+		{Name: "杩滅▼"},
+		{Name: "閫佷慨"},
+		{Name: "涓婇棬"},
+		{Name: "鍏朵粬"},
+	}
+	return slf.CreateBatch(records)
+}
diff --git a/model/severity.go b/model/severity.go
index 0fb1bc0..681c4f7 100644
--- a/model/severity.go
+++ b/model/severity.go
@@ -12,18 +12,18 @@
 	// Severity 涓ラ噸绋嬪害
 	Severity struct {
 		Id   int    `json:"id" gorm:"column:id;primary_key;AUTO_INCREMENT"`
-		Name   string    `json:"name" gorm:"column:name"`
+		Name string `json:"name" gorm:"column:name"`
 	}
 
 	// SeveritySearch 涓ラ噸绋嬪害鎼滅储鏉′欢
 	SeveritySearch struct {
 		Severity
-		Orm *gorm.DB
-        QueryClass  constvar.SeverityQueryClass
-        KeywordType constvar.SeverityKeywordType
-        Keyword     string
-        PageNum  int
-        PageSize int
+		Orm         *gorm.DB
+		QueryClass  constvar.SeverityQueryClass
+		KeywordType constvar.SeverityKeywordType
+		Keyword     string
+		PageNum     int
+		PageSize    int
 	}
 )
 
@@ -49,6 +49,11 @@
 func (slf *SeveritySearch) Create(record *Severity) error {
 	var db = slf.build()
 	return db.Create(record).Error
+}
+
+func (slf *SeveritySearch) CreateBatch(records []*Severity) error {
+	var db = slf.build()
+	return db.Create(records).Error
 }
 
 func (slf *SeveritySearch) Delete() error {
@@ -111,4 +116,25 @@
 
 	err := db.Find(&records).Error
 	return records, total, err
-}
\ No newline at end of file
+}
+
+// InitDefaultData 鍒濆鍖栨暟鎹�
+func (slf *SeveritySearch) 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 := []*Severity{
+		{Name: "杞�"},
+		{Name: "涓ラ噸"},
+		{Name: "杈冧弗閲�"},
+		{Name: "鐗逛弗閲�"},
+	}
+	return slf.CreateBatch(records)
+}
diff --git a/model/timeSpent.go b/model/timeSpent.go
new file mode 100644
index 0000000..1a4a5b0
--- /dev/null
+++ b/model/timeSpent.go
@@ -0,0 +1,142 @@
+package model
+
+import (
+	"aps_crm/constvar"
+	"aps_crm/pkg/mysqlx"
+	"errors"
+	"fmt"
+	"gorm.io/gorm"
+)
+
+type (
+	// TimeSpent 鑺辫垂鏃堕棿
+	TimeSpent struct {
+		Id   int    `json:"id" gorm:"column:id;primary_key;AUTO_INCREMENT"`
+		Name string `json:"name" gorm:"column:name"`
+	}
+
+	// TimeSpentSearch 鑺辫垂鏃堕棿鎼滅储鏉′欢
+	TimeSpentSearch struct {
+		TimeSpent
+		Orm         *gorm.DB
+		QueryClass  constvar.TimeSpentQueryClass
+		KeywordType constvar.TimeSpentKeywordType
+		Keyword     string
+		PageNum     int
+		PageSize    int
+	}
+)
+
+func (TimeSpent) TableName() string {
+	return "time_spent"
+}
+
+func NewTimeSpentSearch() *TimeSpentSearch {
+	return &TimeSpentSearch{
+		Orm: mysqlx.GetDB(),
+	}
+}
+
+func (slf *TimeSpentSearch) build() *gorm.DB {
+	var db = slf.Orm.Model(&TimeSpent{})
+	if slf.Id != 0 {
+		db = db.Where("id = ?", slf.Id)
+	}
+
+	return db
+}
+
+func (slf *TimeSpentSearch) Create(record *TimeSpent) error {
+	var db = slf.build()
+	return db.Create(record).Error
+}
+
+func (slf *TimeSpentSearch) CreateBatch(records []*TimeSpent) error {
+	var db = slf.build()
+	return db.Create(records).Error
+}
+
+func (slf *TimeSpentSearch) Delete() error {
+	var db = slf.build()
+	return db.Delete(&TimeSpent{}).Error
+}
+
+func (slf *TimeSpentSearch) Update(record *TimeSpent) error {
+	var db = slf.build()
+	return db.Updates(record).Error
+}
+
+func (slf *TimeSpentSearch) FindAll() ([]*TimeSpent, error) {
+	var db = slf.build()
+	var record = make([]*TimeSpent, 0)
+	err := db.Find(&record).Error
+	return record, err
+}
+
+func (slf *TimeSpentSearch) SetId(id int) *TimeSpentSearch {
+	slf.Id = id
+	return slf
+}
+
+func (slf *TimeSpentSearch) First() (*TimeSpent, error) {
+	var db = slf.build()
+	var record = new(TimeSpent)
+	err := db.First(record).Error
+	return record, err
+}
+
+func (slf *TimeSpentSearch) Updates(values interface{}) error {
+	var db = slf.build()
+	return db.Updates(values).Error
+}
+
+func (slf *TimeSpentSearch) Save(record *TimeSpent) 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 *TimeSpentSearch) Find() ([]*TimeSpent, int64, error) {
+	var db = slf.build()
+	var records = make([]*TimeSpent, 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 *TimeSpentSearch) 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 := []*TimeSpent{
+		{Name: "1灏忔椂"},
+		{Name: "2灏忔椂"},
+		{Name: "0.5涓伐浣滄棩"},
+		{Name: "1涓伐浣滄棩"},
+		{Name: "2涓伐浣滄棩"},
+		{Name: "2涓伐浣滄棩浠ヤ笂"},
+	}
+	return slf.CreateBatch(records)
+}
diff --git a/pkg/safe/safe.go b/pkg/safe/safe.go
index 2e37644..91ce826 100644
--- a/pkg/safe/safe.go
+++ b/pkg/safe/safe.go
@@ -1,7 +1,7 @@
 package safe
 
 import (
-	"aps_admin/pkg/logx"
+	"aps_crm/pkg/logx"
 	"runtime/debug"
 )
 
diff --git a/pkg/structx/structx.go b/pkg/structx/structx.go
new file mode 100644
index 0000000..e038656
--- /dev/null
+++ b/pkg/structx/structx.go
@@ -0,0 +1,16 @@
+package structx
+
+import "encoding/json"
+
+func AssignTo(from interface{}, to interface{}) error {
+	data, err := json.Marshal(from)
+	if err != nil {
+		return err
+	}
+
+	err = json.Unmarshal(data, to)
+	if err != nil {
+		return err
+	}
+	return nil
+}
diff --git a/router/faultType.go b/router/faultType.go
new file mode 100644
index 0000000..4d8d1d5
--- /dev/null
+++ b/router/faultType.go
@@ -0,0 +1,17 @@
+package router
+
+import (
+	v1 "aps_crm/api/v1"
+	"github.com/gin-gonic/gin"
+)
+
+func InitFaultTypeRouter(router *gin.RouterGroup) {
+	FaultTypeRouter := router.Group("faultType")
+	FaultTypeApi := v1.FaultTypeApi{}
+	{
+		FaultTypeRouter.POST("add", FaultTypeApi.Add)             // 娣诲姞鏁呴殰绫诲埆
+		FaultTypeRouter.DELETE("delete/:id", FaultTypeApi.Delete) // 鍒犻櫎鏁呴殰绫诲埆
+		FaultTypeRouter.PUT("update", FaultTypeApi.Update)        // 鏇存柊鏁呴殰绫诲埆
+		FaultTypeRouter.GET("list", FaultTypeApi.List)            // 鑾峰彇鏁呴殰绫诲埆鍒楄〃
+	}
+}
diff --git a/router/timeSpent.go b/router/timeSpent.go
new file mode 100644
index 0000000..5b537c7
--- /dev/null
+++ b/router/timeSpent.go
@@ -0,0 +1,17 @@
+package router
+
+import (
+	v1 "aps_crm/api/v1"
+	"github.com/gin-gonic/gin"
+)
+
+func InitTimeSpentRouter(router *gin.RouterGroup) {
+	TimeSpentRouter := router.Group("timeSpent")
+	TimeSpentApi := v1.TimeSpentApi{}
+	{
+		TimeSpentRouter.POST("add", TimeSpentApi.Add)             // 娣诲姞鑺辫垂鏃堕棿
+		TimeSpentRouter.DELETE("delete/:id", TimeSpentApi.Delete) // 鍒犻櫎鑺辫垂鏃堕棿
+		TimeSpentRouter.PUT("update", TimeSpentApi.Update)        // 鏇存柊鑺辫垂鏃堕棿
+		TimeSpentRouter.GET("list", TimeSpentApi.List)            // 鑾峰彇鑺辫垂鏃堕棿鍒楄〃
+	}
+}
diff --git a/service/faultType.go b/service/faultType.go
new file mode 100644
index 0000000..efa655e
--- /dev/null
+++ b/service/faultType.go
@@ -0,0 +1,66 @@
+package service
+
+import (
+	"aps_crm/model"
+	"aps_crm/model/request"
+	"aps_crm/pkg/ecode"
+)
+
+type FaultTypeService struct{}
+
+func NewFaultTypeService() FaultTypeService {
+	return FaultTypeService{}
+}
+
+func (FaultTypeService) AddFaultType(FaultType *model.FaultType) int {
+	err := model.NewFaultTypeSearch().Create(FaultType)
+	if err != nil {
+		return ecode.DBErr
+	}
+
+	return ecode.OK
+}
+
+func (FaultTypeService) DeleteFaultType(id int) int {
+	err := model.NewFaultTypeSearch().SetId(id).Delete()
+	if err != nil {
+		return ecode.DBErr
+	}
+	return ecode.OK
+}
+
+func (FaultTypeService) GetFaultTypeList() ([]*model.FaultType, int64, int) {
+	list, total, err := model.NewFaultTypeSearch().Find()
+	if err != nil {
+		return nil, 0, ecode.DBErr
+	}
+
+	return list, total, ecode.OK
+}
+
+func (FaultTypeService) UpdateFaultTypes(FaultTypes []*request.UpdateFaultType) int {
+	for _, v := range FaultTypes {
+		// check FaultType exist
+		_, err := model.NewFaultTypeSearch().SetId(v.Id).First()
+		if err != nil {
+			return ecode.DBErr
+		}
+
+		err = model.NewFaultTypeSearch().SetId(v.Id).Updates(map[string]interface{}{
+
+		})
+		if err != nil {
+			return ecode.DBErr
+		}
+	}
+
+	return ecode.OK
+}
+
+func (FaultTypeService) UpdateFaultType(faultType *model.FaultType) int {
+		err := model.NewFaultTypeSearch().Save(faultType)
+		if err != nil {
+			return ecode.DBErr
+		}
+	return ecode.OK
+}
diff --git a/service/serviceOrder.go b/service/serviceOrder.go
index 2c2e80d..60a6d5f 100644
--- a/service/serviceOrder.go
+++ b/service/serviceOrder.go
@@ -30,7 +30,7 @@
 }
 
 func (ServiceOrderService) GetServiceOrderList() ([]*model.ServiceOrder, int64, int) {
-	list, total, err := model.NewServiceOrderSearch().Find()
+	list, total, err := model.NewServiceOrderSearch().SetPreload(true).Find()
 	if err != nil {
 		return nil, 0, ecode.DBErr
 	}
@@ -46,9 +46,7 @@
 			return ecode.DBErr
 		}
 
-		err = model.NewServiceOrderSearch().SetId(v.Id).Updates(map[string]interface{}{
-
-		})
+		err = model.NewServiceOrderSearch().SetId(v.Id).Updates(map[string]interface{}{})
 		if err != nil {
 			return ecode.DBErr
 		}
@@ -58,9 +56,9 @@
 }
 
 func (ServiceOrderService) UpdateServiceOrder(serviceOrder *model.ServiceOrder) int {
-		err := model.NewServiceOrderSearch().Save(serviceOrder)
-		if err != nil {
-			return ecode.DBErr
-		}
+	err := model.NewServiceOrderSearch().Save(serviceOrder)
+	if err != nil {
+		return ecode.DBErr
+	}
 	return ecode.OK
 }
diff --git a/service/timeSpent.go b/service/timeSpent.go
new file mode 100644
index 0000000..4c245ef
--- /dev/null
+++ b/service/timeSpent.go
@@ -0,0 +1,66 @@
+package service
+
+import (
+	"aps_crm/model"
+	"aps_crm/model/request"
+	"aps_crm/pkg/ecode"
+)
+
+type TimeSpentService struct{}
+
+func NewTimeSpentService() TimeSpentService {
+	return TimeSpentService{}
+}
+
+func (TimeSpentService) AddTimeSpent(TimeSpent *model.TimeSpent) int {
+	err := model.NewTimeSpentSearch().Create(TimeSpent)
+	if err != nil {
+		return ecode.DBErr
+	}
+
+	return ecode.OK
+}
+
+func (TimeSpentService) DeleteTimeSpent(id int) int {
+	err := model.NewTimeSpentSearch().SetId(id).Delete()
+	if err != nil {
+		return ecode.DBErr
+	}
+	return ecode.OK
+}
+
+func (TimeSpentService) GetTimeSpentList() ([]*model.TimeSpent, int64, int) {
+	list, total, err := model.NewTimeSpentSearch().Find()
+	if err != nil {
+		return nil, 0, ecode.DBErr
+	}
+
+	return list, total, ecode.OK
+}
+
+func (TimeSpentService) UpdateTimeSpents(TimeSpents []*request.UpdateTimeSpent) int {
+	for _, v := range TimeSpents {
+		// check TimeSpent exist
+		_, err := model.NewTimeSpentSearch().SetId(v.Id).First()
+		if err != nil {
+			return ecode.DBErr
+		}
+
+		err = model.NewTimeSpentSearch().SetId(v.Id).Updates(map[string]interface{}{
+
+		})
+		if err != nil {
+			return ecode.DBErr
+		}
+	}
+
+	return ecode.OK
+}
+
+func (TimeSpentService) UpdateTimeSpent(timeSpent *model.TimeSpent) int {
+		err := model.NewTimeSpentSearch().Save(timeSpent)
+		if err != nil {
+			return ecode.DBErr
+		}
+	return ecode.OK
+}

--
Gitblit v1.8.0