浏览代码

Merge branch '2.1.0' of http://git.ycjcjy.com/SpaceOfCheng/services into 2.1.0

胡轶钦 6 年前
父节点
当前提交
3f94b02fc6
共有 7 个文件被更改,包括 486 次插入163 次删除
  1. 18
    0
      controllers/course/order.go
  2. 7
    8
      controllers/goods/order.go
  3. 14
    0
      models/course/order.go
  4. 1
    0
      routers/wechat.go
  5. 14
    8
      service/course/order.go
  6. 431
    146
      service/goods/orders.go
  7. 1
    1
      service/vipcard/vipcard.go

+ 18
- 0
controllers/course/order.go 查看文件

@@ -8,6 +8,7 @@ import (
8 8
 	"spaceofcheng/services/utils"
9 9
 )
10 10
 
11
+// 下单
11 12
 func (c *CourseController) PostOrder() {
12 13
 	// 订单主信息
13 14
 	info := c.GetString("info")
@@ -42,3 +43,20 @@ func (c *CourseController) PostOrder() {
42 43
 
43 44
 	c.ResponseJSON(newOrders)
44 45
 }
46
+
47
+// ConfirmOrders 确认订单
48
+func (c *CourseController) ConfirmOrders() {
49
+
50
+	// 订单优惠券
51
+	customercouponid := c.GetString("customercouponid")
52
+
53
+	// 订单id
54
+	ordersid := c.GetString(":ordersid")
55
+
56
+	err := c.serv.ConfirmOrders(ordersid, customercouponid)
57
+	if err != nil {
58
+		c.ResponseError(err)
59
+	}
60
+
61
+	c.ResponseJSON("下单成功!")
62
+}

+ 7
- 8
controllers/goods/order.go 查看文件

@@ -107,12 +107,6 @@ func (c *GoodsController) PostOrder() {
107 107
 		c.ResponseError(errors.New("无有效订单详情信息"))
108 108
 	}
109 109
 
110
-	// 订单优惠券
111
-	customercouponid := c.GetString("customercouponid")
112
-	if customercouponid == "undefined" {
113
-		customercouponid = ""
114
-	}
115
-
116 110
 	//
117 111
 	var orderInfo model.TaGoodsOrders
118 112
 	var orderDetail []model.TaGoodsOrdersDetail
@@ -140,7 +134,7 @@ func (c *GoodsController) PostOrder() {
140 134
 		)
141 135
 	}
142 136
 
143
-	newOrders, err := c.serv.PreOrders(&orderInfo, orderDetail, customercouponid, innerUser)
137
+	newOrders, err := c.serv.PreOrders(&orderInfo, orderDetail, innerUser)
144 138
 	if err != nil {
145 139
 		c.ResponseError(err)
146 140
 	}
@@ -152,7 +146,12 @@ func (c *GoodsController) PostOrder() {
152 146
 func (c *GoodsController) ConfirmOrders() {
153 147
 	ordersID := c.GetString(":ordersid")
154 148
 
155
-	if err := c.serv.ConfirmOrder(ordersID); err != nil {
149
+	// 订单优惠券
150
+	customercouponid := c.GetString("customercouponid")
151
+	if customercouponid == "undefined" {
152
+		customercouponid = ""
153
+	}
154
+	if err := c.serv.ConfirmOrder(ordersID, customercouponid); err != nil {
156 155
 		c.ResponseError(err)
157 156
 	}
158 157
 

+ 14
- 0
models/course/order.go 查看文件

@@ -65,3 +65,17 @@ func (m *CourseDAO) SaveOrdersCoupon(coupon *model.TaCourseOrdersCoupon, order *
65 65
 	_, err := m.db.Insert(coupon)
66 66
 	return err
67 67
 }
68
+
69
+// UpdateOrderPay 更新订单为已支付
70
+func (m *CourseDAO) UpdateOrderPay(info *model.TaCourseOrders) error {
71
+	info.IsPay = models.BOOL_TRUE
72
+	info.Status = models.STATUS_NORMAL
73
+	var cols = []string{
74
+		"is_pay",
75
+		"status",
76
+		"actual_amount",
77
+		"coupon_amount",
78
+	}
79
+	_, err := m.db.Cols(cols...).Where("orders_id=?", info.OrdersId).Update(info)
80
+	return err
81
+}

+ 1
- 0
routers/wechat.go 查看文件

@@ -36,6 +36,7 @@ func getWechatRoutes(prefix string) beego.LinkNamespace {
36 36
 		beego.NSRouter("/order/goods", &goods.GoodsController{}, "post:PostOrder"),
37 37
 		beego.NSRouter("/order/goods/:ordersid", &goods.GoodsController{}, "put:ConfirmOrders"),
38 38
 		beego.NSRouter("/order/course", &course.CourseController{}, "post:PostOrder"),
39
+		beego.NSRouter("/order/course/:ordersid", &course.CourseController{}, "put:ConfirmOrders"),
39 40
 
40 41
 		// 课程
41 42
 		beego.NSRouter("/course/user", &course.CourseController{}, "get:GetCustomerCourse"),

+ 14
- 8
service/course/order.go 查看文件

@@ -71,6 +71,11 @@ func (s *CourseServ) ConfirmOrders(ordersID, customercouponid string) error {
71 71
 	if couseOrder.Status != models.STATUS_READY {
72 72
 		return errors.New("没有订单信息")
73 73
 	}
74
+
75
+	if couseOrder.IsPay != models.BOOL_TRUE {
76
+		return errors.New("订单已付款,请勿重复付款!")
77
+	}
78
+
74 79
 	cust := s.ctx.Get("customer").(model.TaCustomer)
75 80
 
76 81
 	// TODO
@@ -240,10 +245,10 @@ func (s *CourseServ) ConfirmOrders(ordersID, customercouponid string) error {
240 245
 	}
241 246
 
242 247
 	// 更新订单信息
243
-	// if err := s.SaveOrder(couseOrder, course); err != nil {
244
-	// 	utils.LogError("课程下单失败: " + err.Error())
245
-	// 	return errors.New("下单失败, 请重试")
246
-	// }
248
+	if err := s.SaveOrder(couseOrder, course); err != nil {
249
+		utils.LogError("课程下单失败: " + err.Error())
250
+		return errors.New("下单失败, 请重试")
251
+	}
247 252
 
248 253
 	// 发送短信
249 254
 	utils.SendSMS("orders", cust.Phone, course.CourseName)
@@ -579,6 +584,7 @@ func (s *CourseServ) saveCustomerPayRec(account *model.TaCustomerAccount, info *
579 584
 // AddOrder 保存订单信息
580 585
 func (s *CourseServ) AddOrder(order *model.TaCourseOrders) (*model.TaCourseOrders, error) {
581 586
 	// 订单信息
587
+	order.Status = models.STATUS_READY
582 588
 	neworder, err := s.dao.SaveCourseOrder(order)
583 589
 	if err != nil {
584 590
 		utils.LogError("课程下单失败: " + err.Error())
@@ -590,10 +596,10 @@ func (s *CourseServ) AddOrder(order *model.TaCourseOrders) (*model.TaCourseOrder
590 596
 // SaveOrder 保存订单明细
591 597
 func (s *CourseServ) SaveOrder(order *model.TaCourseOrders, course *course.CourseDetail) error {
592 598
 	// 订单信息
593
-	// if err := s.dao.SaveCourseOrder(order); err != nil {
594
-	// 	utils.LogError("课程下单失败: " + err.Error())
595
-	// 	return errors.New("下单失败, 请重试")
596
-	// }
599
+	if err := s.dao.UpdateOrderPay(order); err != nil {
600
+		utils.LogError("课程下单失败: " + err.Error())
601
+		return errors.New("下单失败, 请重试")
602
+	}
597 603
 
598 604
 	// 默认城币购买
599 605
 	// courseObtaimType := models.COURSE_GETBY_COINCHG

+ 431
- 146
service/goods/orders.go 查看文件

@@ -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)

+ 1
- 1
service/vipcard/vipcard.go 查看文件

@@ -143,7 +143,7 @@ func (s *VipcardServ) SaveCustomerVip(vipchild *model.TaVipCardChild, createUser
143 143
 		ChangeType:    models.CONSUME_COINCHG,
144 144
 		ChangeSource:  models.ACCSOURCE_RECHARGE,
145 145
 		SourceId:      vipchild.VipCardChildId,
146
-		SourceName:    vipchild.VipCardChildCode,
146
+		SourceName:    "充值",
147 147
 		Amount:        info.Amount,
148 148
 		FloatType:     models.ACCOUNT_INCOME,
149 149
 		CreateUser:    createUser.UserId,