liujiandao
2024-03-26 e079b27d686b045639c7e0d470c2cbc812c401b1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
package model
 
import (
    "aps_crm/constvar"
    "aps_crm/pkg/mysqlx"
    "errors"
    "fmt"
    "github.com/shopspring/decimal"
    "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:"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"`
        ServiceContractId    int                `gorm:"column:contract_id;type:int;not null;default:0;comment:服务合同id" json:"serviceContractId"` // 服务合同id
        ServiceContract      ServiceContract    `gorm:"foreignKey:ServiceContractId"`
        SalesDetailsId       int                `gorm:"column:order_id;type:int;not null;default:0;comment:销售订单id" json:"salesDetailsId"` // 销售明细id
        SalesDetails         SalesDetails       `gorm:"foreignKey:SalesDetailsId"`
        Subject              string             `gorm:"column:subject;type:varchar(255);not null;default:'';comment:主题" json:"subject"`                       // 主题
        ProductTypeName      string             `gorm:"column:product_type_name;type:varchar(255);not null;default:'';comment:产品分类名称" json:"productTypeName"` // 产品分类名称
        ProductName          string             `gorm:"column:product_name;type:varchar(255);not null;default:'';comment:产品名称" json:"productName"`            // 产品名称
        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:"column:service_man_id;type:int;not null;default:0;comment:服务人员" json:"serviceManId"` // 服务人员
        ServiceMan           User               `gorm:"foreignKey:ServiceManId" json:"serviceMan"`                                          // 服务人员
        ContactId            int                `gorm:"linkman_id" json:"contactId"`                                                        // 联系人id
        Contact              Contact            `gorm:"foreignKey:ContactId"`
        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:"column:sale_chance_id;type:int;not null;default:0;comment:销售机会id" json:"saleChanceId"` // 销售机会id
        SaleChance           SaleChance         `gorm:"foreignKey:SaleChanceId"`
        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:"column:severity_order_id;type:int;not null;default:0;comment:严重程度id" json:"severityId"` // 严重程度id
        Severity             Severity           `gorm:"foreignKey:SeverityId"`
        ServiceOrderStatusId int                `gorm:"column:service_order_status_id;type:int;not null;default:0;comment:服务单状态id" json:"serviceOrderStatusId"` // 处理状态
        ServiceOrderStatus   ServiceOrderStatus `gorm:"foreignKey:ServiceOrderStatusId"`
        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              decimal.Decimal    `gorm:"column:car_fare;type:decimal(10,2);not null;default:'0.00';comment:希望处理时间" json:"carFare"`           //交通费                                                                 // 交通费
        ChargeAmount         decimal.Decimal    `gorm:"column:charge_amount;type:decimal(10,2);not null;default:'0.00';comment:希望处理时间" json:"chargeAmount"` //收费金额                                                       // 收费金额
        TimeSpentId          int                `gorm:"column:time_spent_id;type:int;not null;default:0;comment:花费时间" json:"timeSpentId"`                   // 花费时间
        TimeSpent            TimeSpent          `gorm:"foreignKey:TimeSpentId"`
        FaqId                int                `gorm:"column:faq_id;type:int;not null;default:0;comment:常见问题id" json:"faqId"` // 常见问题id
        Faq                  Faq                `gorm:"foreignKey:FaqId"`
        ProblemDesc          string             `gorm:"column:problem_desc;type:varchar(255);not null;default:'';comment:主题" 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"`                    // 备注
        CodeStandID          string             `json:"codeStandID" gorm:"column:code_stand_id;type:varchar(255);comment:编码id"`
        CrmModel
    }
 
    // ServiceOrderSearch 服务单搜索条件
    ServiceOrderSearch struct {
        ServiceOrder
        Orm           *gorm.DB
        QueryClass    constvar.ServiceOrderQueryClass
        KeywordType   constvar.ServiceOrderKeywordType
        Keyword       string
        PageNum       int
        PageSize      int
        Preload       bool
        ServiceManIds []int
        Order         string
    }
)
 
func (slf *ServiceOrder) TableName() string {
    return "service_order"
}
 
func NewServiceOrderSearch() *ServiceOrderSearch {
    return &ServiceOrderSearch{
        Orm: mysqlx.GetDB(),
    }
}
 
func (slf *ServiceOrderSearch) build() *gorm.DB {
    var db = slf.Orm.Model(&ServiceOrder{})
    if slf.Id != 0 {
        db = db.Where("id = ?", slf.Id)
    }
    if slf.ServiceContractId != 0 {
        db = db.Where("contract_id = ?", slf.ServiceContractId)
    }
    if slf.SalesDetailsId != 0 {
        db = db.Where("order_id = ?", slf.SalesDetailsId)
    }
    if slf.Order != "" {
        db = db.Order(slf.Order)
    }
    if slf.Preload {
        db = db.
            Preload("Client").
            Preload("ServiceContract").
            Preload("SalesDetails").
            Preload("ServiceType").
            Preload("Contact").
            Preload("ServiceMan").
            Preload("PriorityLevel").
            Preload("SaleChance").
            Preload("FaultType").
            Preload("Severity").
            Preload("ServiceOrderStatus").
            Preload("TimeSpent").
            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))
    }
 
    if len(slf.ServiceManIds) > 0 {
        db = db.Where("service_order.service_man_id in ?", slf.ServiceManIds)
    }
    if slf.ServiceNumber != "" {
        db = db.Where("service_number = ?", slf.ServiceNumber)
    }
 
    return db
}
 
func (slf *ServiceOrderSearch) Create(record *ServiceOrder) error {
    var db = slf.build()
    return db.Create(record).Error
}
 
func (slf *ServiceOrderSearch) Delete() error {
    var db = slf.build()
    return db.Delete(&ServiceOrder{}).Error
}
 
func (slf *ServiceOrderSearch) DeleteByIds(ids []int) error {
    var db = slf.build()
    db = db.Where("id in ?", ids)
    return db.Delete(&ServiceOrder{}).Error
}
 
func (slf *ServiceOrderSearch) Update(record *ServiceOrder) error {
    var db = slf.build()
    return db.Updates(record).Error
}
 
func (slf *ServiceOrderSearch) FindAll() ([]*ServiceOrder, error) {
    var db = slf.build()
    var record = make([]*ServiceOrder, 0)
    err := db.Find(&record).Error
    return record, err
}
 
func (slf *ServiceOrderSearch) SetId(id int) *ServiceOrderSearch {
    slf.Id = id
    return slf
}
 
func (slf *ServiceOrderSearch) SetServiceContractId(id int) *ServiceOrderSearch {
    slf.ServiceContractId = id
    return slf
}
 
func (slf *ServiceOrderSearch) SetSalesDetailsId(id int) *ServiceOrderSearch {
    slf.SalesDetailsId = id
    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) SetMemberIds(memberIds []int) *ServiceOrderSearch {
    slf.ServiceManIds = memberIds
    return slf
}
 
func (slf *ServiceOrderSearch) SetPreload(preload bool) *ServiceOrderSearch {
    slf.Preload = preload
    return slf
}
 
func (slf *ServiceOrderSearch) SetOrder(order string) *ServiceOrderSearch {
    slf.Order = order
    return slf
}
 
func (slf *ServiceOrderSearch) SetNumber(number string) *ServiceOrderSearch {
    slf.ServiceNumber = number
    return slf
}
 
func (slf *ServiceOrderSearch) First() (*ServiceOrder, error) {
    var db = slf.build()
    var record = new(ServiceOrder)
    err := db.First(record).Error
    return record, err
}
 
func (slf *ServiceOrderSearch) Updates(values interface{}) error {
    var db = slf.build()
    return db.Updates(values).Error
}
 
func (slf *ServiceOrderSearch) Save(record *ServiceOrder) 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 *ServiceOrderSearch) Find() ([]*ServiceOrder, int64, error) {
    var db = slf.build()
    var records = make([]*ServiceOrder, 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
}
 
func (slf *ServiceOrderSearch) UpdateByMap(data map[string]interface{}) error {
    var db = slf.build()
    return db.Updates(data).Error
}
 
func (slf *ServiceOrderSearch) Count() (int64, error) {
    var db = slf.build()
    var total int64
    err := db.Count(&total).Error
    return total, err
}
 
func (slf *ServiceOrderSearch) MaxAutoIncr() (int, error) {
    type Result struct {
        Max int
    }
 
    var (
        result Result
        db     = slf.build()
    )
 
    err := db.Select("MAX(id) as max").Scan(&result).Error
    if err != nil {
        return result.Max, fmt.Errorf("max err: %v", err)
    }
    return result.Max, nil
}