|
@@ -20,14 +20,16 @@ import (
|
20
|
20
|
func (s *GoodsServ) PreOrders(
|
21
|
21
|
info *model.TaGoodsOrders,
|
22
|
22
|
details []model.TaGoodsOrdersDetail,
|
23
|
|
- customercouponid,
|
24
|
|
- innerUser string) (*goods.OrdersDetail, error) {
|
25
|
|
- // org := s.ctx.Get("org").(model.SysOrg)
|
|
23
|
+ innerUser string,
|
|
24
|
+) (*model.TaGoodsOrders, error) {
|
26
|
25
|
cust := s.ctx.Get("customer").(model.TaCustomer)
|
27
|
26
|
|
28
|
27
|
info.OrdersId = guid.NewGUIDString()
|
29
|
28
|
info.MakeStatus = goods.MAKESTATUS_NOTSTARTED
|
30
|
29
|
info.UserId = cust.CustomerId
|
|
30
|
+ info.IsPay = models.BOOL_FALSE
|
|
31
|
+ info.ActualAmount = "0.0"
|
|
32
|
+ info.CouponAmount = "0.0"
|
31
|
33
|
num, err := s.dao.GetOrderNumByUserNow(info.UserId)
|
32
|
34
|
if err != nil {
|
33
|
35
|
utils.LogError("获取5秒钟内是否下单错误:", err)
|
|
@@ -57,25 +59,48 @@ func (s *GoodsServ) PreOrders(
|
57
|
59
|
// 内部人员, 可以直接购买
|
58
|
60
|
// TODO
|
59
|
61
|
} else {
|
60
|
|
- // 客户账户
|
|
62
|
+ info.PayType = models.CONSUME_COUPON
|
|
63
|
+ }
|
|
64
|
+
|
|
65
|
+ // 保存主订单
|
|
66
|
+ if err := s.dao.SaveOrders(info); err != nil {
|
|
67
|
+ return nil, err
|
|
68
|
+ }
|
|
69
|
+
|
|
70
|
+ // 保存订单明细
|
|
71
|
+ if err := s.dao.SaveOrdersDetail(details, info.OrdersId); err != nil {
|
|
72
|
+ return nil, err
|
|
73
|
+ }
|
|
74
|
+
|
|
75
|
+ return info, nil
|
|
76
|
+}
|
|
77
|
+
|
|
78
|
+// ConfirmOrder 订单确认
|
|
79
|
+func (s *GoodsServ) ConfirmOrder(
|
|
80
|
+ ordersID, customercouponid string,
|
|
81
|
+) error {
|
|
82
|
+ info, err := s.dao.GetOrdersByID(ordersID)
|
|
83
|
+ if err != nil {
|
|
84
|
+ return utils.LogError("获取订单失败", err)
|
|
85
|
+ }
|
|
86
|
+
|
|
87
|
+ if info.Status != models.STATUS_READY {
|
|
88
|
+ return errors.New("没有订单信息")
|
|
89
|
+ }
|
|
90
|
+
|
|
91
|
+ if info.IsPay == models.BOOL_TRUE {
|
|
92
|
+ return errors.New("订单已付款,请勿重复付款!")
|
|
93
|
+ }
|
|
94
|
+
|
|
95
|
+ if info.PayType == "sales" {
|
|
96
|
+ // 内部人员, 可以直接购买
|
|
97
|
+ // TODO
|
|
98
|
+ } else {
|
|
99
|
+ // 普通客户
|
61
|
100
|
account, err := s.custDAO.GetAccountByCust(info.UserId)
|
62
|
101
|
if err != nil {
|
63
|
102
|
utils.LogError("查询用户账户信息出错: " + err.Error())
|
64
|
|
- return nil, errors.New("查询用户账户信息出错")
|
65
|
|
- }
|
66
|
|
-
|
67
|
|
- // 客户 VIP 卡
|
68
|
|
- var vipAccount float64 = 0.0
|
69
|
|
- vips, err := s.custDAO.GetValidVIPCards(info.UserId)
|
70
|
|
- if err != nil {
|
71
|
|
- return nil, utils.LogError("查询用户VIP卡信息出错", err.Error())
|
72
|
|
- }
|
73
|
|
-
|
74
|
|
- if vips != nil && len(vips) > 0 {
|
75
|
|
- for _, vip := range vips {
|
76
|
|
- vipMoney, _ := strconv.ParseFloat(vip.Balance, 64)
|
77
|
|
- vipAccount += vipMoney
|
78
|
|
- }
|
|
103
|
+ return errors.New("查询用户账户信息出错")
|
79
|
104
|
}
|
80
|
105
|
|
81
|
106
|
// 如果是使用优惠券
|
|
@@ -86,44 +111,43 @@ func (s *GoodsServ) PreOrders(
|
86
|
111
|
customerCoupon, err := s.couponDAO.GetCustomerCouponByID(customercouponid)
|
87
|
112
|
if err != nil {
|
88
|
113
|
utils.LogError("查询优惠券信息失败: " + err.Error())
|
89
|
|
- return nil, errors.New("查询优惠券信息失败")
|
|
114
|
+ return errors.New("查询优惠券信息失败")
|
90
|
115
|
}
|
91
|
116
|
if customerCoupon == nil || customerCoupon.CustomerCouponId == "" {
|
92
|
|
- return nil, errors.New("优惠券无效!")
|
|
117
|
+ return errors.New("优惠券无效!")
|
93
|
118
|
}
|
94
|
119
|
|
95
|
120
|
if customerCoupon.CaseId != info.CaseId {
|
96
|
|
- return nil, errors.New("优惠券对应案场与下单案场不一致,不允许下单!")
|
|
121
|
+ return errors.New("优惠券对应案场与下单案场不一致,不允许下单!")
|
97
|
122
|
}
|
98
|
123
|
|
99
|
124
|
if customerCoupon.Status != models.STATUS_NORMAL || !customerCoupon.UseDate.IsZero() {
|
100
|
|
- return nil, errors.New("优惠券已被使用!请重新选择优惠券!")
|
|
125
|
+ return errors.New("优惠券已被使用!请重新选择优惠券!")
|
101
|
126
|
}
|
102
|
127
|
|
103
|
128
|
if customerCoupon.StartDate.After(time.Now().Local()) {
|
104
|
|
- return nil, errors.New("该优惠券还未到有效期,不允许下单!")
|
|
129
|
+ return errors.New("该优惠券还未到有效期,不允许下单!")
|
105
|
130
|
}
|
106
|
131
|
if customerCoupon.EndDate.Before(time.Now().Local()) {
|
107
|
|
- return nil, errors.New("优惠券已失效,不允许下单!")
|
|
132
|
+ return errors.New("优惠券已失效,不允许下单!")
|
108
|
133
|
}
|
109
|
|
-
|
110
|
134
|
// 根据id获取优惠券信息
|
111
|
135
|
coupon, err := s.couponDAO.GetCouponInfoByCustomerCouponID(customercouponid)
|
112
|
136
|
if err != nil {
|
113
|
137
|
utils.LogError("查询优惠券信息失败: " + err.Error())
|
114
|
|
- return nil, errors.New("查询优惠券信息失败")
|
|
138
|
+ return errors.New("查询优惠券信息失败")
|
115
|
139
|
}
|
116
|
140
|
// 遍历优惠券可抵用的商品
|
117
|
141
|
var dyGoods = model.TaGoodsOrdersDetail{
|
118
|
142
|
Price: "0.0",
|
119
|
143
|
GoodsId: "",
|
120
|
144
|
}
|
121
|
|
- for _, detail := range details {
|
122
|
|
- if coupon.IsAll == models.BOOL_TRUE {
|
|
145
|
+ for _, detail := range info.Goods {
|
|
146
|
+ if coupon.IsAll == 1 {
|
123
|
147
|
dyprice, _ := strconv.ParseFloat(dyGoods.Price, 64)
|
124
|
148
|
detailprice, _ := strconv.ParseFloat(detail.Price, 64)
|
125
|
149
|
if dyprice < detailprice {
|
126
|
|
- dyGoods = detail
|
|
150
|
+ dyGoods = detail.TaGoodsOrdersDetail
|
127
|
151
|
}
|
128
|
152
|
} else {
|
129
|
153
|
for _, target := range coupon.Targets {
|
|
@@ -131,7 +155,7 @@ func (s *GoodsServ) PreOrders(
|
131
|
155
|
dyprice, _ := strconv.ParseFloat(dyGoods.Price, 64)
|
132
|
156
|
detailprice, _ := strconv.ParseFloat(detail.Price, 64)
|
133
|
157
|
if dyprice < detailprice {
|
134
|
|
- dyGoods = detail
|
|
158
|
+ dyGoods = detail.TaGoodsOrdersDetail
|
135
|
159
|
}
|
136
|
160
|
}
|
137
|
161
|
}
|
|
@@ -150,14 +174,21 @@ func (s *GoodsServ) PreOrders(
|
150
|
174
|
UsedAmount: dyGoods.Price,
|
151
|
175
|
CustomerCouponId: customerCoupon.CustomerCouponId,
|
152
|
176
|
}
|
153
|
|
- if err := s.dao.SaveOrdersCoupon(&ordersCoupon, info); err != nil {
|
|
177
|
+ if err := s.dao.SaveOrdersCoupon(&ordersCoupon, &info.TaGoodsOrders); err != nil {
|
154
|
178
|
utils.LogError("保存优惠信息出错: " + err.Error())
|
155
|
|
- return nil, errors.New("保存优惠信息出错")
|
|
179
|
+ return errors.New("保存优惠信息出错")
|
156
|
180
|
}
|
157
|
181
|
info.CouponAmount = dyGoods.Price
|
158
|
182
|
// info.ActualAmount = "0.0"
|
|
183
|
+
|
|
184
|
+ // 优惠券核销
|
|
185
|
+ err := s.couponDAO.VerifyCustomerCoupon(customercouponid)
|
|
186
|
+ if err != nil {
|
|
187
|
+ utils.LogError("优惠券核销出错: " + err.Error())
|
|
188
|
+ return errors.New("优惠券核销出错")
|
|
189
|
+ }
|
159
|
190
|
} else {
|
160
|
|
- return nil, errors.New("优惠券不可抵用商品")
|
|
191
|
+ return errors.New("优惠券不可抵用商品")
|
161
|
192
|
}
|
162
|
193
|
} else {
|
163
|
194
|
// 如果是使用城币
|
|
@@ -170,97 +201,10 @@ func (s *GoodsServ) PreOrders(
|
170
|
201
|
payMoney, _ := strconv.ParseFloat(info.Amount, 64)
|
171
|
202
|
payMoney = payMoney - couponAmount
|
172
|
203
|
|
173
|
|
- if accMoney+vipAccount < payMoney {
|
174
|
|
- return nil, errors.New("账户余额不足")
|
175
|
|
- }
|
176
|
|
-
|
177
|
|
- info.ActualAmount = strconv.FormatFloat(payMoney, 'f', -1, 64)
|
178
|
|
- if payMoney > 0 && couponAmount > 0 && info.PayType != models.CONSUME_INNER {
|
179
|
|
- info.PayType = models.CONSUME_COUPON_COIN
|
180
|
|
- }
|
181
|
|
- }
|
182
|
|
-
|
183
|
|
- // 保存主订单
|
184
|
|
- if err := s.dao.SaveOrders(info); err != nil {
|
185
|
|
- return nil, err
|
186
|
|
- }
|
187
|
|
-
|
188
|
|
- // 保存订单明细
|
189
|
|
- if err := s.dao.SaveOrdersDetail(details, info.OrdersId); err != nil {
|
190
|
|
- return nil, err
|
191
|
|
- }
|
192
|
|
-
|
193
|
|
- newOrders, err := s.dao.GetOrdersDetailByID(info.OrdersId, models.STATUS_READY)
|
194
|
|
- if err != nil {
|
195
|
|
- return nil, utils.LogError("下单失败, 请重试", err.Error())
|
196
|
|
- }
|
197
|
|
-
|
198
|
|
- return newOrders, nil
|
199
|
|
-}
|
200
|
|
-
|
201
|
|
-// ConfirmOrder 订单确认
|
202
|
|
-// 1、订单状态修改为有效
|
203
|
|
-// 2、订单修改为支付状态
|
204
|
|
-// 3、卡券核销
|
205
|
|
-// 4、账户或者 VIP 卡扣钱
|
206
|
|
-func (s *GoodsServ) ConfirmOrder(ordersID string) error {
|
207
|
|
- orders, err := s.dao.GetOrdersByID(ordersID)
|
208
|
|
- if err != nil {
|
209
|
|
- return utils.LogError("获取订单失败", err)
|
210
|
|
- }
|
211
|
|
-
|
212
|
|
- if orders.Status != models.STATUS_READY {
|
213
|
|
- return errors.New("没有订单信息")
|
214
|
|
- }
|
215
|
|
-
|
216
|
|
- // 如果是内部人员
|
217
|
|
- if orders.PayType == models.CONSUME_INNER {
|
218
|
|
- // 查找禁用名单
|
219
|
|
- fibUsers, err := s.userDAO.GetForbidUserByUserID(orders.UserId)
|
220
|
|
- if err != nil {
|
221
|
|
- return utils.LogError("校验下单人出错", err)
|
222
|
|
- }
|
223
|
|
-
|
224
|
|
- if fibUsers != nil && len(fibUsers) > 0 {
|
225
|
|
- for _, u := range fibUsers {
|
226
|
|
- if u.ForbidType == models.FORBID_ORDER && u.Status == models.STATUS_NORMAL {
|
227
|
|
- return errors.New("当前下单人被禁止点单")
|
228
|
|
- }
|
229
|
|
- }
|
230
|
|
- }
|
231
|
|
- } else {
|
232
|
|
- // 如果不是内部人员
|
233
|
|
-
|
234
|
|
- // 如果使用了优惠券
|
235
|
|
- coupons, err := s.dao.GetCouponByOrdersID(ordersID)
|
236
|
|
- if err != nil {
|
237
|
|
- return utils.LogError("校验订单优惠券失败", err)
|
238
|
|
- }
|
239
|
|
- if coupons != nil && len(coupons) > 0 {
|
240
|
|
- for _, cp := range coupons {
|
241
|
|
- if cp.Status != models.STATUS_NORMAL {
|
242
|
|
- return errors.New("订单优惠券已经被使用, 请重新选择优惠券")
|
243
|
|
- }
|
244
|
|
-
|
245
|
|
- // 优惠券核销
|
246
|
|
- err := s.couponDAO.VerifyCustomerCoupon(cp.CouponId)
|
247
|
|
- if err != nil {
|
248
|
|
- return utils.LogError("优惠券核销出错", err)
|
249
|
|
- }
|
250
|
|
-
|
251
|
|
- // 优惠券使用数量 + 1
|
252
|
|
- if err := s.couponDAO.IncreseCouponUsedNum(cp.CouponId); err != nil {
|
253
|
|
- return utils.LogError("更新优惠券使用出错", err)
|
254
|
|
- }
|
255
|
|
- }
|
256
|
|
- }
|
257
|
|
-
|
258
|
|
- // 如果使用了城币
|
259
|
|
- actualPay, _ := strconv.ParseFloat(orders.ActualAmount, 64)
|
260
|
|
- if actualPay > 0.01 {
|
261
|
|
- var leftPay = actualPay
|
262
|
|
-
|
263
|
|
- vips, err := s.custDAO.GetValidVIPCards(orders.UserId)
|
|
204
|
+ // 如果是城币, 则插入用户账户消费记录
|
|
205
|
+ if payMoney > 0 {
|
|
206
|
+ var leftPay = payMoney
|
|
207
|
+ vips, err := s.custDAO.GetValidVIPCards(info.UserId)
|
264
|
208
|
if err != nil {
|
265
|
209
|
return utils.LogError("查询用户 VIP卡 出错", err)
|
266
|
210
|
}
|
|
@@ -284,7 +228,7 @@ func (s *GoodsServ) ConfirmOrder(ordersID string) error {
|
284
|
228
|
leftPay -= vipMoney
|
285
|
229
|
}
|
286
|
230
|
|
287
|
|
- if err := s.saveVipChangeRec(vipPay, &vip, &orders.TaGoodsOrders); err != nil {
|
|
231
|
+ if err := s.saveVipChangeRec(vipPay, &vip, &info.TaGoodsOrders); err != nil {
|
288
|
232
|
return utils.LogError("VIP卡扣款失败", err.Error())
|
289
|
233
|
}
|
290
|
234
|
|
|
@@ -293,50 +237,391 @@ func (s *GoodsServ) ConfirmOrder(ordersID string) error {
|
293
|
237
|
}
|
294
|
238
|
}
|
295
|
239
|
}
|
296
|
|
-
|
297
|
240
|
// 如果 VIP 卡余额不足, 则使用账户余额
|
298
|
241
|
if leftPay > 0.01 {
|
299
|
|
- account, err := s.custDAO.GetAccountByCust(orders.UserId)
|
300
|
|
- if err != nil {
|
301
|
|
- return utils.LogError("查询用户账户信息出错", err)
|
302
|
|
- }
|
303
|
|
-
|
304
|
|
- accMoney, _ := strconv.ParseFloat(account.Amount, 64)
|
305
|
|
- if accMoney < actualPay {
|
306
|
|
- return errors.New("下单错误, 用户账户余额不足")
|
|
242
|
+ if leftPay > accMoney {
|
|
243
|
+ return errors.New("账户余额不足")
|
307
|
244
|
}
|
308
|
245
|
|
309
|
|
- if err := s.saveCustomerPayRec(leftPay, account, &orders.TaGoodsOrders); err != nil {
|
310
|
|
- return err
|
|
246
|
+ // 插入账户流水
|
|
247
|
+ if err := s.saveCustomerPayRec(leftPay, account, &info.TaGoodsOrders); err != nil {
|
|
248
|
+ utils.LogError("插入账户流水出错: " + err.Error())
|
|
249
|
+ return errors.New("写入账户流水出错")
|
311
|
250
|
}
|
312
|
251
|
}
|
313
|
252
|
}
|
314
|
|
-
|
315
|
|
- // 不去校验商品及库存
|
316
|
|
- // 因为暂时没有库存的概念
|
317
|
253
|
}
|
318
|
254
|
|
319
|
|
- // 更新订单状态
|
320
|
|
- orders.Status = models.STATUS_NORMAL
|
|
255
|
+ // 更新订单
|
|
256
|
+ orders := info.TaGoodsOrders
|
321
|
257
|
orders.IsPay = models.BOOL_TRUE
|
322
|
|
- if err := s.dao.UpdateOrders(&orders.TaGoodsOrders, []string{"status", "is_pay"}); err != nil {
|
323
|
|
- return utils.LogError("下单失败, 更新状态出错", err)
|
|
258
|
+ orders.Status = models.STATUS_NORMAL
|
|
259
|
+ if err := s.dao.UpdateOrders(&orders, []string{
|
|
260
|
+ "status", "is_pay", "coupon_amount", "actual_amount",
|
|
261
|
+ }); err != nil {
|
|
262
|
+ return nil
|
324
|
263
|
}
|
325
|
264
|
|
|
265
|
+ // 保存主订单
|
|
266
|
+ // if err := s.dao.SaveOrders(info); err != nil {
|
|
267
|
+ // return err
|
|
268
|
+ // }
|
|
269
|
+
|
|
270
|
+ // // 保存订单明细
|
|
271
|
+ // if err := s.dao.SaveOrdersDetail(details, info.OrdersId); err != nil {
|
|
272
|
+ // return err
|
|
273
|
+ // }
|
|
274
|
+
|
326
|
275
|
// 通知后端有新订单 - websocket
|
|
276
|
+ // orderList, err := s.GetOnLineOrders(info.CaseId, false)
|
|
277
|
+ // if err != nil {
|
|
278
|
+ // utils.LogError("获取新单列表出错: " + err.Error())
|
|
279
|
+ // return nil
|
|
280
|
+ // }
|
|
281
|
+ newOrder, err := s.GetNewGoods(info.OrdersId)
|
|
282
|
+ if err != nil {
|
|
283
|
+ // 下单流程已经结束, 不反馈错误
|
|
284
|
+ utils.LogError("获取数据失败:", err.Error())
|
|
285
|
+ return nil
|
|
286
|
+ }
|
|
287
|
+
|
327
|
288
|
msg := utils.Message{
|
328
|
289
|
To: utils.ClientID{
|
329
|
|
- Groups: []string{orders.CaseId},
|
|
290
|
+ Groups: []string{info.CaseId},
|
330
|
291
|
},
|
331
|
292
|
Data: map[string][]interface{}{
|
332
|
|
- "refreshOnlineGoodsOrders": []interface{}{*orders},
|
|
293
|
+ "refreshOnlineGoodsOrders": []interface{}{*newOrder},
|
333
|
294
|
},
|
334
|
295
|
}
|
335
|
296
|
|
|
297
|
+ utils.LogError("调用下单 Websocket ")
|
|
298
|
+
|
336
|
299
|
utils.SendMessage(msg, utils.WsMessage)
|
|
300
|
+
|
337
|
301
|
return nil
|
338
|
302
|
}
|
339
|
303
|
|
|
304
|
+// // PreOrders 预下单
|
|
305
|
+// func (s *GoodsServ) PreOrders(
|
|
306
|
+// info *model.TaGoodsOrders,
|
|
307
|
+// details []model.TaGoodsOrdersDetail,
|
|
308
|
+// customercouponid,
|
|
309
|
+// innerUser string) (*goods.OrdersDetail, error) {
|
|
310
|
+// // org := s.ctx.Get("org").(model.SysOrg)
|
|
311
|
+// cust := s.ctx.Get("customer").(model.TaCustomer)
|
|
312
|
+
|
|
313
|
+// info.OrdersId = guid.NewGUIDString()
|
|
314
|
+// info.MakeStatus = goods.MAKESTATUS_NOTSTARTED
|
|
315
|
+// info.UserId = cust.CustomerId
|
|
316
|
+// num, err := s.dao.GetOrderNumByUserNow(info.UserId)
|
|
317
|
+// if err != nil {
|
|
318
|
+// utils.LogError("获取5秒钟内是否下单错误:", err)
|
|
319
|
+// return nil, errors.New("获取5秒钟内是否下单错误")
|
|
320
|
+// }
|
|
321
|
+// if num > 0 {
|
|
322
|
+// return nil, errors.New("5 秒内不能频繁下单")
|
|
323
|
+// }
|
|
324
|
+
|
|
325
|
+// // 校验下单内容
|
|
326
|
+// if err := s.validOrdersInfo(info); err != nil {
|
|
327
|
+// return nil, err
|
|
328
|
+// }
|
|
329
|
+
|
|
330
|
+// // 校验案场信息
|
|
331
|
+// if err := s.validOrdersCase(info, cust); err != nil {
|
|
332
|
+// return nil, err
|
|
333
|
+// }
|
|
334
|
+
|
|
335
|
+// // 校验各种金额
|
|
336
|
+// if err := s.validBillCharges(info, details); err != nil {
|
|
337
|
+// return nil, err
|
|
338
|
+// }
|
|
339
|
+
|
|
340
|
+// if innerUser == "sales" {
|
|
341
|
+// info.PayType = models.CONSUME_INNER
|
|
342
|
+// // 内部人员, 可以直接购买
|
|
343
|
+// // TODO
|
|
344
|
+// } else {
|
|
345
|
+// // 客户账户
|
|
346
|
+// account, err := s.custDAO.GetAccountByCust(info.UserId)
|
|
347
|
+// if err != nil {
|
|
348
|
+// utils.LogError("查询用户账户信息出错: " + err.Error())
|
|
349
|
+// return nil, errors.New("查询用户账户信息出错")
|
|
350
|
+// }
|
|
351
|
+
|
|
352
|
+// // 客户 VIP 卡
|
|
353
|
+// var vipAccount float64 = 0.0
|
|
354
|
+// vips, err := s.custDAO.GetValidVIPCards(info.UserId)
|
|
355
|
+// if err != nil {
|
|
356
|
+// return nil, utils.LogError("查询用户VIP卡信息出错", err.Error())
|
|
357
|
+// }
|
|
358
|
+
|
|
359
|
+// if vips != nil && len(vips) > 0 {
|
|
360
|
+// for _, vip := range vips {
|
|
361
|
+// vipMoney, _ := strconv.ParseFloat(vip.Balance, 64)
|
|
362
|
+// vipAccount += vipMoney
|
|
363
|
+// }
|
|
364
|
+// }
|
|
365
|
+
|
|
366
|
+// // 如果是使用优惠券
|
|
367
|
+// if customercouponid != "" {
|
|
368
|
+// info.PayType = models.CONSUME_COUPON
|
|
369
|
+
|
|
370
|
+// // 优惠券校验
|
|
371
|
+// customerCoupon, err := s.couponDAO.GetCustomerCouponByID(customercouponid)
|
|
372
|
+// if err != nil {
|
|
373
|
+// utils.LogError("查询优惠券信息失败: " + err.Error())
|
|
374
|
+// return nil, errors.New("查询优惠券信息失败")
|
|
375
|
+// }
|
|
376
|
+// if customerCoupon == nil || customerCoupon.CustomerCouponId == "" {
|
|
377
|
+// return nil, errors.New("优惠券无效!")
|
|
378
|
+// }
|
|
379
|
+
|
|
380
|
+// if customerCoupon.CaseId != info.CaseId {
|
|
381
|
+// return nil, errors.New("优惠券对应案场与下单案场不一致,不允许下单!")
|
|
382
|
+// }
|
|
383
|
+
|
|
384
|
+// if customerCoupon.Status != models.STATUS_NORMAL || !customerCoupon.UseDate.IsZero() {
|
|
385
|
+// return nil, errors.New("优惠券已被使用!请重新选择优惠券!")
|
|
386
|
+// }
|
|
387
|
+
|
|
388
|
+// if customerCoupon.StartDate.After(time.Now().Local()) {
|
|
389
|
+// return nil, errors.New("该优惠券还未到有效期,不允许下单!")
|
|
390
|
+// }
|
|
391
|
+// if customerCoupon.EndDate.Before(time.Now().Local()) {
|
|
392
|
+// return nil, errors.New("优惠券已失效,不允许下单!")
|
|
393
|
+// }
|
|
394
|
+
|
|
395
|
+// // 根据id获取优惠券信息
|
|
396
|
+// coupon, err := s.couponDAO.GetCouponInfoByCustomerCouponID(customercouponid)
|
|
397
|
+// if err != nil {
|
|
398
|
+// utils.LogError("查询优惠券信息失败: " + err.Error())
|
|
399
|
+// return nil, errors.New("查询优惠券信息失败")
|
|
400
|
+// }
|
|
401
|
+// // 遍历优惠券可抵用的商品
|
|
402
|
+// var dyGoods = model.TaGoodsOrdersDetail{
|
|
403
|
+// Price: "0.0",
|
|
404
|
+// GoodsId: "",
|
|
405
|
+// }
|
|
406
|
+// for _, detail := range details {
|
|
407
|
+// if coupon.IsAll == models.BOOL_TRUE {
|
|
408
|
+// dyprice, _ := strconv.ParseFloat(dyGoods.Price, 64)
|
|
409
|
+// detailprice, _ := strconv.ParseFloat(detail.Price, 64)
|
|
410
|
+// if dyprice < detailprice {
|
|
411
|
+// dyGoods = detail
|
|
412
|
+// }
|
|
413
|
+// } else {
|
|
414
|
+// for _, target := range coupon.Targets {
|
|
415
|
+// if target.TargetId == detail.GoodsId {
|
|
416
|
+// dyprice, _ := strconv.ParseFloat(dyGoods.Price, 64)
|
|
417
|
+// detailprice, _ := strconv.ParseFloat(detail.Price, 64)
|
|
418
|
+// if dyprice < detailprice {
|
|
419
|
+// dyGoods = detail
|
|
420
|
+// }
|
|
421
|
+// }
|
|
422
|
+// }
|
|
423
|
+// }
|
|
424
|
+// }
|
|
425
|
+// if dyGoods.GoodsId != "" {
|
|
426
|
+// // 优惠券可以抵用商品
|
|
427
|
+// var ordersCoupon = model.TaGoodsOrdersCoupon{
|
|
428
|
+// OrdersId: info.OrdersId,
|
|
429
|
+// OrdersNo: info.OrdersNo,
|
|
430
|
+// CouponId: coupon.CouponId,
|
|
431
|
+// CouponName: coupon.CouponName,
|
|
432
|
+// OrgId: coupon.OrgId,
|
|
433
|
+// GoodsId: dyGoods.GoodsId,
|
|
434
|
+// GoodsName: dyGoods.GoodsName,
|
|
435
|
+// UsedAmount: dyGoods.Price,
|
|
436
|
+// CustomerCouponId: customerCoupon.CustomerCouponId,
|
|
437
|
+// }
|
|
438
|
+// if err := s.dao.SaveOrdersCoupon(&ordersCoupon, info); err != nil {
|
|
439
|
+// utils.LogError("保存优惠信息出错: " + err.Error())
|
|
440
|
+// return nil, errors.New("保存优惠信息出错")
|
|
441
|
+// }
|
|
442
|
+// info.CouponAmount = dyGoods.Price
|
|
443
|
+// // info.ActualAmount = "0.0"
|
|
444
|
+// } else {
|
|
445
|
+// return nil, errors.New("优惠券不可抵用商品")
|
|
446
|
+// }
|
|
447
|
+// } else {
|
|
448
|
+// // 如果是使用城币
|
|
449
|
+// info.PayType = models.CONSUME_COINCHG
|
|
450
|
+// info.CouponAmount = "0.0"
|
|
451
|
+// }
|
|
452
|
+
|
|
453
|
+// accMoney, _ := strconv.ParseFloat(account.Amount, 64)
|
|
454
|
+// couponAmount, _ := strconv.ParseFloat(info.CouponAmount, 64)
|
|
455
|
+// payMoney, _ := strconv.ParseFloat(info.Amount, 64)
|
|
456
|
+// payMoney = payMoney - couponAmount
|
|
457
|
+
|
|
458
|
+// if accMoney+vipAccount < payMoney {
|
|
459
|
+// return nil, errors.New("账户余额不足")
|
|
460
|
+// }
|
|
461
|
+
|
|
462
|
+// info.ActualAmount = strconv.FormatFloat(payMoney, 'f', -1, 64)
|
|
463
|
+// if payMoney > 0 && couponAmount > 0 && info.PayType != models.CONSUME_INNER {
|
|
464
|
+// info.PayType = models.CONSUME_COUPON_COIN
|
|
465
|
+// }
|
|
466
|
+// }
|
|
467
|
+
|
|
468
|
+// // 保存主订单
|
|
469
|
+// if err := s.dao.SaveOrders(info); err != nil {
|
|
470
|
+// return nil, err
|
|
471
|
+// }
|
|
472
|
+
|
|
473
|
+// // 保存订单明细
|
|
474
|
+// if err := s.dao.SaveOrdersDetail(details, info.OrdersId); err != nil {
|
|
475
|
+// return nil, err
|
|
476
|
+// }
|
|
477
|
+
|
|
478
|
+// newOrders, err := s.dao.GetOrdersDetailByID(info.OrdersId, models.STATUS_READY)
|
|
479
|
+// if err != nil {
|
|
480
|
+// return nil, utils.LogError("下单失败, 请重试", err.Error())
|
|
481
|
+// }
|
|
482
|
+
|
|
483
|
+// return newOrders, nil
|
|
484
|
+// }
|
|
485
|
+
|
|
486
|
+// // ConfirmOrder 订单确认
|
|
487
|
+// // 1、订单状态修改为有效
|
|
488
|
+// // 2、订单修改为支付状态
|
|
489
|
+// // 3、卡券核销
|
|
490
|
+// // 4、账户或者 VIP 卡扣钱
|
|
491
|
+// func (s *GoodsServ) ConfirmOrder(ordersID string) error {
|
|
492
|
+// orders, err := s.dao.GetOrdersByID(ordersID)
|
|
493
|
+// if err != nil {
|
|
494
|
+// return utils.LogError("获取订单失败", err)
|
|
495
|
+// }
|
|
496
|
+
|
|
497
|
+// if orders.Status != models.STATUS_READY {
|
|
498
|
+// return errors.New("没有订单信息")
|
|
499
|
+// }
|
|
500
|
+
|
|
501
|
+// // 如果是内部人员
|
|
502
|
+// if orders.PayType == models.CONSUME_INNER {
|
|
503
|
+// // 查找禁用名单
|
|
504
|
+// fibUsers, err := s.userDAO.GetForbidUserByUserID(orders.UserId)
|
|
505
|
+// if err != nil {
|
|
506
|
+// return utils.LogError("校验下单人出错", err)
|
|
507
|
+// }
|
|
508
|
+
|
|
509
|
+// if fibUsers != nil && len(fibUsers) > 0 {
|
|
510
|
+// for _, u := range fibUsers {
|
|
511
|
+// if u.ForbidType == models.FORBID_ORDER && u.Status == models.STATUS_NORMAL {
|
|
512
|
+// return errors.New("当前下单人被禁止点单")
|
|
513
|
+// }
|
|
514
|
+// }
|
|
515
|
+// }
|
|
516
|
+// } else {
|
|
517
|
+// // 如果不是内部人员
|
|
518
|
+
|
|
519
|
+// // 如果使用了优惠券
|
|
520
|
+// coupons, err := s.dao.GetCouponByOrdersID(ordersID)
|
|
521
|
+// if err != nil {
|
|
522
|
+// return utils.LogError("校验订单优惠券失败", err)
|
|
523
|
+// }
|
|
524
|
+// if coupons != nil && len(coupons) > 0 {
|
|
525
|
+// for _, cp := range coupons {
|
|
526
|
+// if cp.Status != models.STATUS_NORMAL {
|
|
527
|
+// return errors.New("订单优惠券已经被使用, 请重新选择优惠券")
|
|
528
|
+// }
|
|
529
|
+
|
|
530
|
+// // 优惠券核销
|
|
531
|
+// err := s.couponDAO.VerifyCustomerCoupon(cp.CouponId)
|
|
532
|
+// if err != nil {
|
|
533
|
+// return utils.LogError("优惠券核销出错", err)
|
|
534
|
+// }
|
|
535
|
+
|
|
536
|
+// // 优惠券使用数量 + 1
|
|
537
|
+// if err := s.couponDAO.IncreseCouponUsedNum(cp.CouponId); err != nil {
|
|
538
|
+// return utils.LogError("更新优惠券使用出错", err)
|
|
539
|
+// }
|
|
540
|
+// }
|
|
541
|
+// }
|
|
542
|
+
|
|
543
|
+// // 如果使用了城币
|
|
544
|
+// actualPay, _ := strconv.ParseFloat(orders.ActualAmount, 64)
|
|
545
|
+// if actualPay > 0.01 {
|
|
546
|
+// var leftPay = actualPay
|
|
547
|
+
|
|
548
|
+// vips, err := s.custDAO.GetValidVIPCards(orders.UserId)
|
|
549
|
+// if err != nil {
|
|
550
|
+// return utils.LogError("查询用户 VIP卡 出错", err)
|
|
551
|
+// }
|
|
552
|
+
|
|
553
|
+// var vipAccount float64
|
|
554
|
+// if vips != nil && len(vips) > 0 {
|
|
555
|
+// for _, vip := range vips {
|
|
556
|
+// vipMoney, _ := strconv.ParseFloat(vip.Balance, 64)
|
|
557
|
+// vipAccount += vipMoney
|
|
558
|
+
|
|
559
|
+// // 当前扣款
|
|
560
|
+// var vipPay float64
|
|
561
|
+// if vipMoney > leftPay {
|
|
562
|
+// // 如果卡余额比 需要扣款的多, 那么就只扣这一张卡
|
|
563
|
+// // 通过 leftPay < 0.01 来判断
|
|
564
|
+// vipPay = leftPay
|
|
565
|
+// leftPay = 0
|
|
566
|
+// } else {
|
|
567
|
+// // 如果余额不够, 先扣掉本张卡余额, 继续循环
|
|
568
|
+// vipPay = vipMoney
|
|
569
|
+// leftPay -= vipMoney
|
|
570
|
+// }
|
|
571
|
+
|
|
572
|
+// if err := s.saveVipChangeRec(vipPay, &vip, &orders.TaGoodsOrders); err != nil {
|
|
573
|
+// return utils.LogError("VIP卡扣款失败", err.Error())
|
|
574
|
+// }
|
|
575
|
+
|
|
576
|
+// if leftPay < 0.01 {
|
|
577
|
+// break
|
|
578
|
+// }
|
|
579
|
+// }
|
|
580
|
+// }
|
|
581
|
+
|
|
582
|
+// // 如果 VIP 卡余额不足, 则使用账户余额
|
|
583
|
+// if leftPay > 0.01 {
|
|
584
|
+// account, err := s.custDAO.GetAccountByCust(orders.UserId)
|
|
585
|
+// if err != nil {
|
|
586
|
+// return utils.LogError("查询用户账户信息出错", err)
|
|
587
|
+// }
|
|
588
|
+
|
|
589
|
+// accMoney, _ := strconv.ParseFloat(account.Amount, 64)
|
|
590
|
+// if accMoney < actualPay {
|
|
591
|
+// return errors.New("下单错误, 用户账户余额不足")
|
|
592
|
+// }
|
|
593
|
+
|
|
594
|
+// if err := s.saveCustomerPayRec(leftPay, account, &orders.TaGoodsOrders); err != nil {
|
|
595
|
+// return err
|
|
596
|
+// }
|
|
597
|
+// }
|
|
598
|
+// }
|
|
599
|
+
|
|
600
|
+// // 不去校验商品及库存
|
|
601
|
+// // 因为暂时没有库存的概念
|
|
602
|
+// }
|
|
603
|
+
|
|
604
|
+// // 更新订单状态
|
|
605
|
+// orders.Status = models.STATUS_NORMAL
|
|
606
|
+// orders.IsPay = models.BOOL_TRUE
|
|
607
|
+// if err := s.dao.UpdateOrders(&orders.TaGoodsOrders, []string{"status", "is_pay"}); err != nil {
|
|
608
|
+// return utils.LogError("下单失败, 更新状态出错", err)
|
|
609
|
+// }
|
|
610
|
+
|
|
611
|
+// // 通知后端有新订单 - websocket
|
|
612
|
+// msg := utils.Message{
|
|
613
|
+// To: utils.ClientID{
|
|
614
|
+// Groups: []string{orders.CaseId},
|
|
615
|
+// },
|
|
616
|
+// Data: map[string][]interface{}{
|
|
617
|
+// "refreshOnlineGoodsOrders": []interface{}{*orders},
|
|
618
|
+// },
|
|
619
|
+// }
|
|
620
|
+
|
|
621
|
+// utils.SendMessage(msg, utils.WsMessage)
|
|
622
|
+// return nil
|
|
623
|
+// }
|
|
624
|
+
|
340
|
625
|
// saveCustomerPayRec 保存账户消费流水
|
341
|
626
|
func (s *GoodsServ) saveCustomerPayRec(payMoney float64, account *model.TaCustomerAccount, info *model.TaGoodsOrders) error {
|
342
|
627
|
actAmount := strconv.FormatFloat(payMoney, 'f', -1, 64)
|