wangpengfei
2023-08-10 724674c54da32406a16264850c3719b2553aada6
Merge branch 'master' into fly

# Conflicts:
# model/index.go
14个文件已修改
410 ■■■■ 已修改文件
api/v1/serviceOrder.go 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
constvar/serviceOrder.go 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
docs/docs.go 91 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
docs/swagger.json 91 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
docs/swagger.yaml 66 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
model/request/serviceOrder.go 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
model/salesDetails.go 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
model/serviceContract.go 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
model/serviceFollowup.go 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
model/serviceOrder.go 80 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
model/timeSpent.go 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
router/serviceOrder.go 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
service/serviceFollowup.go 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
service/serviceOrder.go 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
api/v1/serviceOrder.go
@@ -99,15 +99,17 @@
// @Tags        服务单管理
// @Summary    获取服务单列表
// @Produce    application/json
// @Param        object    body        request.GetServiceOrderList    true    "参数"
// @Success    200    {object}    response.ListResponse{data=[]model.ServiceOrder}
// @Router        /api/serviceOrder/list [get]
// @Router        /api/serviceOrder/list [post]
func (s *ServiceOrderApi) List(c *gin.Context) {
    ctx, ok := contextx.NewContext(c, nil)
    var params request.GetServiceOrderList
    ctx, ok := contextx.NewContext(c, &params)
    if !ok {
        return
    }
    serviceOrder, total, errCode := service.NewServiceOrderService().GetServiceOrderList()
    serviceOrder, total, errCode := service.NewServiceOrderService().GetServiceOrderList(params.Page, params.PageSize, params.QueryClass, params.KeywordType, params.Keyword)
    if errCode != ecode.OK {
        ctx.Fail(errCode)
        return
constvar/serviceOrder.go
@@ -1,4 +1,5 @@
package constvar
type ServiceOrderQueryClass string
const (
@@ -8,5 +9,12 @@
type ServiceOrderKeywordType string
const (
    ServiceOrderKeywordCustomerName   ServiceOrderKeywordType = ""
    ServiceOrderKeywordOrderNumber     ServiceOrderKeywordType = "服务单编号"
    ServiceOrderKeywordSubject         ServiceOrderKeywordType = "主题"
    ServiceOrderKeywordClientName      ServiceOrderKeywordType = "客户名称"
    ServiceOrderKeywordRealProcessTime ServiceOrderKeywordType = "实际处理时间"
    ServiceOrderKeywordServiceMan      ServiceOrderKeywordType = "服务人员"
    ServiceOrderKeywordServiceType     ServiceOrderKeywordType = "服务方式"
    ServiceOrderKeywordProductType     ServiceOrderKeywordType = "产品类别"
    ServiceOrderKeywordFaultType       ServiceOrderKeywordType = "故障类别"
)
docs/docs.go
@@ -8388,7 +8388,7 @@
            }
        },
        "/api/serviceOrder/list": {
            "get": {
            "post": {
                "produces": [
                    "application/json"
                ],
@@ -8396,6 +8396,17 @@
                    "服务单管理"
                ],
                "summary": "获取服务单列表",
                "parameters": [
                    {
                        "description": "参数",
                        "name": "object",
                        "in": "body",
                        "required": true,
                        "schema": {
                            "$ref": "#/definitions/request.GetServiceOrderList"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
@@ -10084,6 +10095,38 @@
                "ServiceFollowupKeywordCustomerServiceNo",
                "ServiceFollowupKeywordVisitor",
                "ServiceFollowupKeywordSatisfactionDegree"
            ]
        },
        "constvar.ServiceOrderKeywordType": {
            "type": "string",
            "enum": [
                "服务单编号",
                "主题",
                "客户名称",
                "实际处理时间",
                "服务人员",
                "服务方式",
                "产品类别",
                "故障类别"
            ],
            "x-enum-varnames": [
                "ServiceOrderKeywordOrderNumber",
                "ServiceOrderKeywordSubject",
                "ServiceOrderKeywordClientName",
                "ServiceOrderKeywordRealProcessTime",
                "ServiceOrderKeywordServiceMan",
                "ServiceOrderKeywordServiceType",
                "ServiceOrderKeywordProductType",
                "ServiceOrderKeywordFaultType"
            ]
        },
        "constvar.ServiceOrderQueryClass": {
            "type": "string",
            "enum": [
                ""
            ],
            "x-enum-varnames": [
                "ServiceOrderQueryClassExpireLessThen60Days"
            ]
        },
        "constvar.UserType": {
@@ -11854,8 +11897,17 @@
        "model.ServiceFollowup": {
            "type": "object",
            "properties": {
                "Member": {
                    "$ref": "#/definitions/model.User"
                },
                "client": {
                    "$ref": "#/definitions/model.Client"
                },
                "clientId": {
                    "type": "integer"
                },
                "contact": {
                    "$ref": "#/definitions/model.Contact"
                },
                "contactId": {
                    "type": "integer"
@@ -11869,6 +11921,9 @@
                "id": {
                    "type": "integer"
                },
                "isVisit": {
                    "$ref": "#/definitions/model.IsVisit"
                },
                "isVisitId": {
                    "type": "integer"
                },
@@ -11877,6 +11932,9 @@
                },
                "number": {
                    "type": "string"
                },
                "oldMember": {
                    "$ref": "#/definitions/model.User"
                },
                "oldMemberId": {
                    "type": "integer"
@@ -11887,6 +11945,9 @@
                "remark": {
                    "type": "string"
                },
                "satisfaction": {
                    "$ref": "#/definitions/model.Satisfaction"
                },
                "satisfactionId": {
                    "type": "integer"
                },
@@ -11896,8 +11957,14 @@
                "serviceOrder": {
                    "$ref": "#/definitions/model.ServiceOrder"
                },
                "solveRate": {
                    "$ref": "#/definitions/model.SolveRate"
                },
                "solveRateId": {
                    "type": "integer"
                },
                "timelyRate": {
                    "$ref": "#/definitions/model.TimelyRate"
                },
                "timelyRateId": {
                    "type": "integer"
@@ -14425,6 +14492,28 @@
                }
            }
        },
        "request.GetServiceOrderList": {
            "type": "object",
            "properties": {
                "keyword": {
                    "type": "string"
                },
                "keywordType": {
                    "$ref": "#/definitions/constvar.ServiceOrderKeywordType"
                },
                "page": {
                    "description": "页码",
                    "type": "integer"
                },
                "pageSize": {
                    "description": "每页大小",
                    "type": "integer"
                },
                "queryClass": {
                    "$ref": "#/definitions/constvar.ServiceOrderQueryClass"
                }
            }
        },
        "request.GetSubOrderList": {
            "type": "object",
            "properties": {
docs/swagger.json
@@ -8376,7 +8376,7 @@
            }
        },
        "/api/serviceOrder/list": {
            "get": {
            "post": {
                "produces": [
                    "application/json"
                ],
@@ -8384,6 +8384,17 @@
                    "服务单管理"
                ],
                "summary": "获取服务单列表",
                "parameters": [
                    {
                        "description": "参数",
                        "name": "object",
                        "in": "body",
                        "required": true,
                        "schema": {
                            "$ref": "#/definitions/request.GetServiceOrderList"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
@@ -10072,6 +10083,38 @@
                "ServiceFollowupKeywordCustomerServiceNo",
                "ServiceFollowupKeywordVisitor",
                "ServiceFollowupKeywordSatisfactionDegree"
            ]
        },
        "constvar.ServiceOrderKeywordType": {
            "type": "string",
            "enum": [
                "服务单编号",
                "主题",
                "客户名称",
                "实际处理时间",
                "服务人员",
                "服务方式",
                "产品类别",
                "故障类别"
            ],
            "x-enum-varnames": [
                "ServiceOrderKeywordOrderNumber",
                "ServiceOrderKeywordSubject",
                "ServiceOrderKeywordClientName",
                "ServiceOrderKeywordRealProcessTime",
                "ServiceOrderKeywordServiceMan",
                "ServiceOrderKeywordServiceType",
                "ServiceOrderKeywordProductType",
                "ServiceOrderKeywordFaultType"
            ]
        },
        "constvar.ServiceOrderQueryClass": {
            "type": "string",
            "enum": [
                ""
            ],
            "x-enum-varnames": [
                "ServiceOrderQueryClassExpireLessThen60Days"
            ]
        },
        "constvar.UserType": {
@@ -11842,8 +11885,17 @@
        "model.ServiceFollowup": {
            "type": "object",
            "properties": {
                "Member": {
                    "$ref": "#/definitions/model.User"
                },
                "client": {
                    "$ref": "#/definitions/model.Client"
                },
                "clientId": {
                    "type": "integer"
                },
                "contact": {
                    "$ref": "#/definitions/model.Contact"
                },
                "contactId": {
                    "type": "integer"
@@ -11857,6 +11909,9 @@
                "id": {
                    "type": "integer"
                },
                "isVisit": {
                    "$ref": "#/definitions/model.IsVisit"
                },
                "isVisitId": {
                    "type": "integer"
                },
@@ -11865,6 +11920,9 @@
                },
                "number": {
                    "type": "string"
                },
                "oldMember": {
                    "$ref": "#/definitions/model.User"
                },
                "oldMemberId": {
                    "type": "integer"
@@ -11875,6 +11933,9 @@
                "remark": {
                    "type": "string"
                },
                "satisfaction": {
                    "$ref": "#/definitions/model.Satisfaction"
                },
                "satisfactionId": {
                    "type": "integer"
                },
@@ -11884,8 +11945,14 @@
                "serviceOrder": {
                    "$ref": "#/definitions/model.ServiceOrder"
                },
                "solveRate": {
                    "$ref": "#/definitions/model.SolveRate"
                },
                "solveRateId": {
                    "type": "integer"
                },
                "timelyRate": {
                    "$ref": "#/definitions/model.TimelyRate"
                },
                "timelyRateId": {
                    "type": "integer"
@@ -14413,6 +14480,28 @@
                }
            }
        },
        "request.GetServiceOrderList": {
            "type": "object",
            "properties": {
                "keyword": {
                    "type": "string"
                },
                "keywordType": {
                    "$ref": "#/definitions/constvar.ServiceOrderKeywordType"
                },
                "page": {
                    "description": "页码",
                    "type": "integer"
                },
                "pageSize": {
                    "description": "每页大小",
                    "type": "integer"
                },
                "queryClass": {
                    "$ref": "#/definitions/constvar.ServiceOrderQueryClass"
                }
            }
        },
        "request.GetSubOrderList": {
            "type": "object",
            "properties": {
docs/swagger.yaml
@@ -238,6 +238,32 @@
    - ServiceFollowupKeywordCustomerServiceNo
    - ServiceFollowupKeywordVisitor
    - ServiceFollowupKeywordSatisfactionDegree
  constvar.ServiceOrderKeywordType:
    enum:
    - 服务单编号
    - 主题
    - 客户名称
    - 实际处理时间
    - 服务人员
    - 服务方式
    - 产品类别
    - 故障类别
    type: string
    x-enum-varnames:
    - ServiceOrderKeywordOrderNumber
    - ServiceOrderKeywordSubject
    - ServiceOrderKeywordClientName
    - ServiceOrderKeywordRealProcessTime
    - ServiceOrderKeywordServiceMan
    - ServiceOrderKeywordServiceType
    - ServiceOrderKeywordProductType
    - ServiceOrderKeywordFaultType
  constvar.ServiceOrderQueryClass:
    enum:
    - ""
    type: string
    x-enum-varnames:
    - ServiceOrderQueryClassExpireLessThen60Days
  constvar.UserType:
    enum:
    - 1
@@ -1410,8 +1436,14 @@
    type: object
  model.ServiceFollowup:
    properties:
      Member:
        $ref: '#/definitions/model.User'
      client:
        $ref: '#/definitions/model.Client'
      clientId:
        type: integer
      contact:
        $ref: '#/definitions/model.Contact'
      contactId:
        type: integer
      customerServiceSheet:
@@ -1420,26 +1452,36 @@
        type: string
      id:
        type: integer
      isVisit:
        $ref: '#/definitions/model.IsVisit'
      isVisitId:
        type: integer
      memberId:
        type: integer
      number:
        type: string
      oldMember:
        $ref: '#/definitions/model.User'
      oldMemberId:
        type: integer
      planId:
        type: integer
      remark:
        type: string
      satisfaction:
        $ref: '#/definitions/model.Satisfaction'
      satisfactionId:
        type: integer
      serviceId:
        type: integer
      serviceOrder:
        $ref: '#/definitions/model.ServiceOrder'
      solveRate:
        $ref: '#/definitions/model.SolveRate'
      solveRateId:
        type: integer
      timelyRate:
        $ref: '#/definitions/model.TimelyRate'
      timelyRateId:
        type: integer
    type: object
@@ -3171,6 +3213,21 @@
      pageSize:
        description: 每页大小
        type: integer
    type: object
  request.GetServiceOrderList:
    properties:
      keyword:
        type: string
      keywordType:
        $ref: '#/definitions/constvar.ServiceOrderKeywordType'
      page:
        description: 页码
        type: integer
      pageSize:
        description: 每页大小
        type: integer
      queryClass:
        $ref: '#/definitions/constvar.ServiceOrderQueryClass'
    type: object
  request.GetSubOrderList:
    properties:
@@ -10614,7 +10671,14 @@
      tags:
      - 服务单管理
  /api/serviceOrder/list:
    get:
    post:
      parameters:
      - description: 参数
        in: body
        name: object
        required: true
        schema:
          $ref: '#/definitions/request.GetServiceOrderList'
      produces:
      - application/json
      responses:
model/request/serviceOrder.go
@@ -40,7 +40,7 @@
type GetServiceOrderList struct {
    PageInfo
    QueryClass  constvar.ServiceOrderQueryClass  `json:"queryClass"`
    KeywordType constvar.ServiceOrderKeywordType `json:"keywordType"`
    Keyword     string                           `json:"keyword"`
    QueryClass  constvar.ServiceOrderQueryClass  `json:"queryClass" form:"queryClass"`
    KeywordType constvar.ServiceOrderKeywordType `json:"keywordType" form:"keywordType"`
    Keyword     string                           `json:"keyword" form:"keyword"`
}
model/salesDetails.go
@@ -77,7 +77,7 @@
    case constvar.SalesDetailsKeywordTypePrincipal:
        db = db.Joins("left join user on user.id = sales_details.member_id").Where("user.username like ?", fmt.Sprintf("%%%s%%", slf.Keyword))
    case constvar.SalesDetailsKeywordTypeProductName:
        //db = db.Joins("left join sales_details_product sdp on sdp.sales_details_id = sales_details.id left join product").Where("user.username like ?", fmt.Sprintf("%%%s%%", slf.Keyword))
        db = db.Joins("left join sales_details_product sdp on sdp.sales_details_id = sales_details.id left join products on sdp.product_id = products.id").Where("products.name like ?", fmt.Sprintf("%%%s%%", slf.Keyword))
    }
    if slf.Preload {
model/serviceContract.go
@@ -26,9 +26,9 @@
        Quotation               Quotation             `json:"quotation" gorm:"foreignKey:QuotationId"`
        ServiceContractTypeId   int                   `json:"serviceContractTypeId" gorm:"column:service_contract_type_id;type:int;comment:合同类型id"`
        ServiceContractType     ServiceContractType   `json:"serviceContractType" gorm:"foreignKey:ServiceContractTypeId"`
        SignTime                string                `json:"signTime" gorm:"column:sign_time;type:datetime;comment:签约时间"`
        StartTime               string                `json:"startTime" gorm:"column:start_time;type:datetime;comment:开始时间"`
        EndTime                 string                `json:"endTime" gorm:"column:end_time;type:datetime;comment:结束时间"`
        SignTime                string                `json:"signTime" gorm:"column:sign_time;type:varchar(255);comment:签约时间"`
        StartTime               string                `json:"startTime" gorm:"column:start_time;type:varchar(255);comment:开始时间"`
        EndTime                 string                `json:"endTime" gorm:"column:end_time;type:varchar(255);comment:结束时间"`
        ServiceContractStatusId int                   `json:"serviceContractStatusId" gorm:"column:service_contract_status_id;type:int;comment:合同状态id"`
        ServiceContractStatus   ServiceContractStatus `json:"serviceContractStatus" gorm:"foreignKey:ServiceContractStatusId"`
        ServiceTimes            int                   `json:"serviceTimes" gorm:"column:service_times;type:int;comment:服务次数"`
@@ -96,7 +96,7 @@
    case constvar.ServiceContractKeywordPrincipal:
        db = db.Joins("left join user on user.id = service_contract.member_id").Where("user.username like ?", fmt.Sprintf("%%%s%%", slf.Keyword))
    case constvar.ServiceContractKeywordProductName:
        db = db.Joins("Products", clause.LeftJoin).Where("Products.name like ?", fmt.Sprintf("%%%s%%", slf.Keyword))
        db = db.Joins("left join service_contract_product scp on scp.service_contract_id = service_contract.id left join products on scp.product_id = products.id").Where("products.name like ?", fmt.Sprintf("%%%s%%", slf.Keyword))
    case constvar.ServiceContractKeywordServiceBeginDate:
        db = db.Where("start_time = ?", slf.Keyword)
    case constvar.ServiceContractKeywordServiceEndDate:
model/serviceFollowup.go
@@ -10,18 +10,26 @@
    ServiceFollowup struct {
        Id                   int                  `json:"id" gorm:"column:id;primary_key;AUTO_INCREMENT"`
        ClientId             int                  `json:"clientId" gorm:"column:client_id;type:int;comment:客户id"`
        Client               Client               `json:"client" gorm:"foreignKey:ClientId"`
        Number               string               `json:"number" gorm:"column:number;type:varchar(255);comment:合同编号"`
        ContactId            int                  `json:"contactId" gorm:"column:contact_id;type:int;comment:联系人id"`
        Contact              Contact              `json:"contact"  gorm:"foreignKey:ContactId"`
        ServiceId            int                  `json:"serviceId" gorm:"column:service_id;type:int;comment:客户服务单id"`
        ServiceOrder         ServiceOrder         `gorm:"foreignKey:ServiceId"`
        CustomerServiceSheet CustomerServiceSheet `json:"customerServiceSheet" gorm:"foreignKey:ServiceId"`
        MemberId             int                  `json:"memberId" gorm:"column:member_id;type:int;comment:服务人员id"`
        Member               User                 `json:"Member" gorm:"foreignKey:MemberId"`
        PlanId               int                  `json:"planId" gorm:"column:plan_id;type:int;comment:服务计划id"`
        SatisfactionId       int                  `json:"satisfactionId" gorm:"column:satisfaction_id;type:int;comment:满意度id"`
        Satisfaction         Satisfaction         `json:"satisfaction" gorm:"foreignKey:SatisfactionId"`
        TimelyRateId         int                  `json:"timelyRateId" gorm:"column:timely_rate_id;type:int;comment:及时率id"`
        TimelyRate           TimelyRate           `json:"timelyRate" gorm:"foreignKey:TimelyRateId"`
        SolveRateId          int                  `json:"solveRateId" gorm:"column:solve_rate_id;type:int;comment:解决率id"`
        SolveRate            SolveRate            `json:"solveRate" gorm:"foreignKey:SolveRateId"`
        IsVisitId            int                  `json:"isVisitId" gorm:"column:is_visit_id;type:int;comment:服务人员是否来过id"`
        IsVisit              IsVisit              `json:"isVisit"  gorm:"foreignKey:IsVisitId"`
        OldMemberId          int                  `json:"oldMemberId" gorm:"column:old_member_id;type:int;comment:原服务人员"`
        OldMember            User                 `json:"oldMember" gorm:"foreignKey:OldMemberId"`
        Remark               string               `json:"remark" gorm:"column:remark;type:text;comment:备注"`
        File                 string               `json:"file" gorm:"column:file;type:varchar(255);comment:附件"`
@@ -36,6 +44,7 @@
        OrderBy     string
        PageNum     int
        PageSize    int
        Preload     bool
    }
)
@@ -69,6 +78,19 @@
    case constvar.ServiceFollowupKeywordSatisfactionDegree:
        db = db.Where("satisfaction_id = ?", slf.Keyword)
    }
    if slf.Preload {
        db = db.Preload("CustomerServiceSheet").
            Preload("ServiceOrder").
            Preload("Client").
            Preload("Contact").
            Preload("Satisfaction").
            Preload("TimelyRate").
            Preload("SolveRate").
            Preload("IsVisit").
            Preload("OldMember").
            Preload("Member")
    }
    return db
@@ -111,7 +133,7 @@
        db = db.Limit(slf.PageSize).Offset((slf.PageNum - 1) * slf.PageSize)
    }
    err := db.Preload("CustomerServiceSheet").Preload("ServiceOrder").Find(&records).Error
    err := db.Find(&records).Error
    return records, total, err
}
@@ -120,6 +142,11 @@
    return slf
}
func (slf *ServiceFollowupSearch) SetPreload(preload bool) *ServiceFollowupSearch {
    slf.Preload = preload
    return slf
}
func (slf *ServiceFollowupSearch) SetKeywordType(keyword constvar.ServiceFollowupKeywordType) *ServiceFollowupSearch {
    slf.KeywordType = keyword
    return slf
model/serviceOrder.go
@@ -6,51 +6,51 @@
    "errors"
    "fmt"
    "gorm.io/gorm"
    "gorm.io/gorm/clause"
)
type (
    // ServiceOrder 服务单
    ServiceOrder struct {
        Id              int           `json:"id" gorm:"column:id;primary_key;AUTO_INCREMENT"`
        ServiceNumber   string        `gorm:"service_number" json:"serviceNumber"` // 服务单编号
        ClientId        int           `gorm:"client_id" json:"clientId"`           // 客户id
        ServiceNumber   string        `gorm:"column:service_number;type:varchar(255);not null;default:'';comment:'服务单编号'" json:"serviceNumber"` // 服务单编号
        ClientId        int           `gorm:"column:client_id;type:int;not null;default:0;comment:'客户id'" json:"clientId"`                      // 客户id
        Client          Client        `gorm:"foreignKey:ClientId"`
        ContractId      int           `gorm:"contract_id" json:"contractId"` // 合同id
        ContractId      int           `gorm:"column:contract_id;type:int;not null;default:0;comment:'合同id'" json:"contractId"` // 合同id
        Contract        Contract      `gorm:"foreignKey:ContractId"`
        OrderId         int           `gorm:"order_id" json:"orderId"` // 销售订单id
        OrderId         int           `gorm:"column:order_id;type:int;not null;default:0;comment:'销售订单id'" json:"orderId"` // 销售订单id
        OrderManage     OrderManage   `gorm:"foreignKey:OrderId"`
        Subject         string        `gorm:"subject" json:"subject"`      // 主题
        ProductId       int           `gorm:"product_id" json:"productId"` // 产品id
        Subject         string        `gorm:"column:subject;type:varchar(255);not null;default:'';comment:'主题'" json:"subject"` // 主题
        ProductId       int           `gorm:"column:product_id;type:int;not null;default:0;comment:'产品id'" json:"productId"`    // 产品id
        Product         Product       `gorm:"foreignKey:ProductId"`
        ServiceTypeId   int           `gorm:"service_type_id" json:"serviceTypeId"` // 服务方式id
        ServiceTypeId   int           `gorm:"column:service_type_id;type:int;not null;default:0;comment:'服务方式id'" json:"serviceTypeId"` // 服务方式id
        ServiceType     ServiceType   `gorm:"foreignKey:ServiceTypeId"`
        ServiceManId    int           `gorm:"service_man_id" json:"serviceManId"` // 服务人员
        ServiceManId    int           `gorm:"column:service_man_id;type:int;not null;default:0;comment:'服务人员'" json:"serviceManId"` // 服务人员
        ContactId       int           `gorm:"linkman_id" json:"contactId"`        // 联系人id
        Contact         Contact       `gorm:"foreignKey:ContactId"`
        Address         string        `gorm:"address" json:"address"`                   // 上门地址
        PriorityLevelId int           `gorm:"priority_level_id" json:"priorityLevelId"` // 优先级别id
        Address         string        `gorm:"column:address;type:varchar(255);not null;default:'';comment:'上门地址'" json:"address"`           // 上门地址
        PriorityLevelId int           `gorm:"column:priority_level_id;type:int;not null;default:0;comment:'优先级别id'" json:"priorityLevelId"` // 优先级别id
        PriorityLevel   PriorityLevel `gorm:"foreignKey:PriorityLevelId"`
        AppointmentTime string        `gorm:"appointment_time" json:"appointmentTime"` // 预约上门时间
        SaleChanceId    int           `gorm:"sale_leads" json:"saleChanceId"`          // 销售机会id
        SaleChanceId    int           `gorm:"column:sale_chance_id;type:int;not null;default:0;comment:'销售机会id'" json:"saleChanceId"` // 销售机会id
        SaleChance     SaleChance `gorm:"foreignKey:SaleChanceId"`
        FaultTypeId    int        `gorm:"severity_id" json:"faultTypeId"` // 故障类别id
        FaultTypeId     int           `gorm:"column:severity_id;type:int;not null;default:0;comment:'故障类别id'" json:"faultTypeId"` // 故障类别id
        FaultType      FaultType  `gorm:"foreignKey:FaultTypeId"`
        SeverityId     int        `gorm:"severity_id" json:"severity"` // 严重程度id
        SeverityId      int           `gorm:"column:severity_id;type:int;not null;default:0;comment:'严重程度id'" json:"severity"` // 严重程度id
        Severity       Severity   `gorm:"foreignKey:SeverityId"`
        Status         int        `gorm:"status" json:"status"`              // 处理状态
        ExpectTime     string     `gorm:"expect_time" json:"expectTime"`     // 希望处理时间
        RealTime       string     `gorm:"real_time" json:"realTime"`         // 实际处理时间
        ExpectTime      string        `gorm:"column:expect_time;type:varchar(255);not null;default:'';comment:'希望处理时间'" json:"expectTime"` // 希望处理时间
        RealTime        string        `gorm:"column:real_time;type:varchar(255);not null;default:'';comment:'实际处理时间'" json:"realTime"`     // 实际处理时间
        CarFare        float64    `gorm:"car_fare" json:"carFare"`           // 交通费
        ChargeAmount   float64    `gorm:"charge_amount" json:"chargeAmount"` // 收费金额
        TimeSpentId    int        `gorm:"time_spent_id" json:"timeSpentId"`  // 花费时间
        TimeSpentId     int           `gorm:"column:time_spent_id;type:int;not null;default:0;comment:'花费时间'" json:"timeSpentId"`          // 花费时间
        TimeSpent      TimeSpent  `gorm:"foreignKey:TimeSpentId"`
        FaqId          int        `gorm:"problem_id" json:"faqId"` // 常见问题id
        FaqId           int           `gorm:"column:problem_id;type:int;not null;default:0;comment:'常见问题id'" json:"faqId"` // 常见问题id
        Faq            Faq        `gorm:"foreignKey:FaqId"`
        ProblemDesc    string     `gorm:"problem_desc" json:"problemDesc"`       // 问题描述
        Solution       string     `gorm:"solution" json:"solution"`              // 解决方法
        SolutionRemark string     `gorm:"solution_remark" json:"solutionRemark"` // 内部备注
        Remark         string     `gorm:"remark" json:"remark"`                  // 备注
        ProblemDesc     string        `gorm:"column:subject;type:varchar(255);not null;default:'';comment:'主题'problem_desc" json:"problemDesc"`  // 问题描述
        Solution        string        `gorm:"column:solution;type:varchar(255);not null;default:'';comment:'解决方法'" json:"solution"`              // 解决方法
        SolutionRemark  string        `gorm:"column:solution_remark;type:varchar(255);not null;default:'';comment:'内部备注'" json:"solutionRemark"` // 内部备注
        Remark          string        `gorm:"column:remark;type:varchar(255);not null;default:'';comment:'备注'" json:"remark"`                    // 备注
    }
    // ServiceOrderSearch 服务单搜索条件
@@ -94,6 +94,22 @@
            Preload("Severity").
            Preload("Faq")
    }
    switch slf.KeywordType {
    case constvar.ServiceOrderKeywordClientName:
        db = db.Joins("Client", clause.LeftJoin).Where("Client.name like ?", fmt.Sprintf("%%%s%%", slf.Keyword))
    case constvar.ServiceOrderKeywordOrderNumber:
        db = db.Where("service_number = ?", fmt.Sprintf("%%%s%%", slf.Keyword))
    case constvar.ServiceOrderKeywordSubject:
        db = db.Where("subject = ?", fmt.Sprintf("%%%s%%", slf.Keyword))
    case constvar.ServiceOrderKeywordRealProcessTime:
        db = db.Where("real_time = ?", fmt.Sprintf("%%%s%%", slf.Keyword))
    case constvar.ServiceOrderKeywordServiceMan:
        db = db.Joins("left join user on user.id = service_order.service_man_id").Where("user.username like ?", fmt.Sprintf("%%%s%%", slf.Keyword))
    case constvar.ServiceOrderKeywordServiceType:
        db = db.Joins("ServiceType", clause.LeftJoin).Where("ServiceType.name like ?", fmt.Sprintf("%%%s%%", slf.Keyword))
    case constvar.ServiceOrderKeywordFaultType:
        db = db.Joins("FaultType", clause.LeftJoin).Where("FaultType.name like ?", fmt.Sprintf("%%%s%%", slf.Keyword))
    }
    return db
}
@@ -125,6 +141,26 @@
    return slf
}
func (slf *ServiceOrderSearch) SetPage(page, size int) *ServiceOrderSearch {
    slf.PageNum, slf.PageSize = page, size
    return slf
}
func (slf *ServiceOrderSearch) SetKeywordType(keyword constvar.ServiceOrderKeywordType) *ServiceOrderSearch {
    slf.KeywordType = keyword
    return slf
}
func (slf *ServiceOrderSearch) SetQueryClass(queryClass constvar.ServiceOrderQueryClass) *ServiceOrderSearch {
    slf.QueryClass = queryClass
    return slf
}
func (slf *ServiceOrderSearch) SetKeyword(keyword string) *ServiceOrderSearch {
    slf.Keyword = keyword
    return slf
}
func (slf *ServiceOrderSearch) SetPreload(preload bool) *ServiceOrderSearch {
    slf.Preload = preload
    return slf
model/timeSpent.go
@@ -12,7 +12,7 @@
    // TimeSpent 花费时间
    TimeSpent 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;type:varchar(255);not null;default:'';comment:名称"`
    }
    // TimeSpentSearch 花费时间搜索条件
router/serviceOrder.go
@@ -12,6 +12,6 @@
        ServiceOrderRouter.POST("add", ServiceOrderApi.Add)             // 添加服务单
        ServiceOrderRouter.DELETE("delete/:id", ServiceOrderApi.Delete) // 删除服务单
        ServiceOrderRouter.PUT("update", ServiceOrderApi.Update)        // 更新服务单
        ServiceOrderRouter.GET("list", ServiceOrderApi.List)            // 获取服务单列表
        ServiceOrderRouter.POST("list", ServiceOrderApi.List)           // 获取服务单列表
    }
}
service/serviceFollowup.go
@@ -46,7 +46,9 @@
    contacts, total, err := model.NewServiceFollowupSearch().
        SetKeywordType(keywordType).
        SetKeyword(keyword).
        SetPage(page, pageSize).FindAll()
        SetPage(page, pageSize).
        SetPreload(true).
        FindAll()
    if err != nil {
        return nil, 0, ecode.ServiceFollowupListErr
    }
service/serviceOrder.go
@@ -1,6 +1,7 @@
package service
import (
    "aps_crm/constvar"
    "aps_crm/model"
    "aps_crm/model/request"
    "aps_crm/pkg/ecode"
@@ -29,8 +30,14 @@
    return ecode.OK
}
func (ServiceOrderService) GetServiceOrderList() ([]*model.ServiceOrder, int64, int) {
    list, total, err := model.NewServiceOrderSearch().SetPreload(true).Find()
func (ServiceOrderService) GetServiceOrderList(page, pageSize int, queryClass constvar.ServiceOrderQueryClass, keywordType constvar.ServiceOrderKeywordType, keyword string) ([]*model.ServiceOrder, int64, int) {
    list, total, err := model.NewServiceOrderSearch().
        SetPage(page, pageSize).
        SetKeyword(keyword).
        SetKeywordType(keywordType).
        SetQueryClass(queryClass).
        SetPreload(true).
        Find()
    if err != nil {
        return nil, 0, ecode.DBErr
    }