zjxpcyc 6 年前
父节点
当前提交
76e93d2eac

+ 40
- 52
controllers/auth.go 查看文件

@@ -72,37 +72,48 @@ func (c *BaseController) authWechat(serv *service.SysServ) {
72 72
 		custID = custIDRaw.(string)
73 73
 	}
74 74
 
75
+	// 机构ID - 后面再思考机构问题
76
+	var orgID = "1"
77
+	// 微信配置
78
+	wxConf, err := serv.GetWeChatConfig(orgID)
79
+	if err != nil {
80
+		utils.LogError("查询微信配置失败: " + err.Error())
81
+		c.ResponseError(
82
+			errors.New("没有找到微信相关配置"),
83
+			http.StatusBadRequest,
84
+		)
85
+	}
86
+	utils.WxClientSingleton(orgID, wxConf)
87
+
75 88
 	// 用户微信信息
76 89
 	var wxDetail map[string]interface{}
77
-	detailRaw := c.GetSession("wechat_user")
78 90
 
91
+	detailRaw := c.GetSession("wechat_user")
79 92
 	if detailRaw != nil {
80 93
 		wxDetail = detailRaw.(map[string]interface{})
81
-	}
82
-
83
-	// DEV MODE
84
-	if c.RunMode == "dev" {
85
-		wxDetail = map[string]interface{}{
86
-			"openid":     " OPENID",
87
-			"nickname":   "NICKNAME",
88
-			"sex":        "1",
89
-			"province":   "PROVINCE",
90
-			"city":       "CITY",
91
-			"country":    "COUNTRY",
92
-			"headimgurl": "http://thirdwx.qlogo.cn/mmopen/g3MonUZtNHkdmzicIlibx6iaFqAc56vxLSUfpb6n5WKSYVY0ChQKkiaJSgQ1dZuTOgvLLrhJbERQQ4eMsv84eavHiaiceqxibJxCfHe/46",
93
-			"unionid":    "o6_bmasdasdsad6_2sgVt7hMZOPfL",
94
+	} else {
95
+		// DEV MODE
96
+		if c.RunMode == "dev" {
97
+			wxDetail = map[string]interface{}{
98
+				"openid":     "OPENID",
99
+				"nickname":   "NICKNAME",
100
+				"sex":        "1",
101
+				"province":   "PROVINCE",
102
+				"city":       "CITY",
103
+				"country":    "COUNTRY",
104
+				"headimgurl": "http://thirdwx.qlogo.cn/mmopen/g3MonUZtNHkdmzicIlibx6iaFqAc56vxLSUfpb6n5WKSYVY0ChQKkiaJSgQ1dZuTOgvLLrhJbERQQ4eMsv84eavHiaiceqxibJxCfHe/46",
105
+				"unionid":    "o6_bmasdasdsad6_2sgVt7hMZOPfL",
106
+			}
107
+		} else {
108
+			wxDetail = c.getWechatDetail(orgID, serv)
94 109
 		}
95
-	}
96
-
97
-	if custID == "" && wxDetail == nil {
98
-		wxDetail = c.getWechatDetail(serv)
99 110
 
100 111
 		c.SetSession("wechat_user", wxDetail)
101 112
 	}
102 113
 
103 114
 	c.Context.Set("wxInfo", wxDetail)
104 115
 
105
-	// 普通客户映射检查
116
+	// 户映射检查
106 117
 	userMap, err := serv.CheckWechatUserMapping(wxDetail)
107 118
 	if err != nil {
108 119
 		c.ResponseError(
@@ -110,10 +121,7 @@ func (c *BaseController) authWechat(serv *service.SysServ) {
110 121
 			http.StatusInternalServerError,
111 122
 		)
112 123
 	}
113
-
114
-	if userMap != nil {
115
-		c.Context.Set("userMap", *userMap)
116
-	}
124
+	c.Context.Set("userMap", *userMap)
117 125
 
118 126
 	if !c.needAuth() {
119 127
 		return
@@ -121,21 +129,13 @@ func (c *BaseController) authWechat(serv *service.SysServ) {
121 129
 
122 130
 	// 未登录或者绑定, 返回 401
123 131
 	if custID == "" && userMap.UserId == "" {
124
-		wxConf, ok := c.Configer[WeChatConf]
125
-		if ok {
126
-			c.ResponseData(
127
-				map[string]interface{}{
128
-					"appid": wxConf.String("appid"),
129
-				},
130
-				errors.New("用户未登录"),
131
-				http.StatusUnauthorized,
132
-			)
133
-		} else {
134
-			c.ResponseError(
135
-				errors.New("用户未登录"),
136
-				http.StatusUnauthorized,
137
-			)
138
-		}
132
+		c.ResponseData(
133
+			map[string]interface{}{
134
+				"appid": wxConf["appid"],
135
+			},
136
+			errors.New("用户未登录或绑定"),
137
+			http.StatusUnauthorized,
138
+		)
139 139
 	}
140 140
 
141 141
 	if custID == "" {
@@ -168,7 +168,7 @@ func (c *BaseController) needAuth() bool {
168 168
 }
169 169
 
170 170
 // getWechatDetail 获取微信个人信息详情
171
-func (c *BaseController) getWechatDetail(serv *service.SysServ) map[string]interface{} {
171
+func (c *BaseController) getWechatDetail(org string, serv *service.SysServ) map[string]interface{} {
172 172
 	// 微信 code
173 173
 	code := c.GetString("code")
174 174
 	if code == "" {
@@ -178,19 +178,7 @@ func (c *BaseController) getWechatDetail(serv *service.SysServ) map[string]inter
178 178
 		)
179 179
 	}
180 180
 
181
-	// TODO
182
-	// 机构先默认写死
183
-	conf, err := serv.GetWeChatConfig("1")
184
-	if err != nil {
185
-		utils.LogError("查询微信配置失败: " + err.Error())
186
-		c.ResponseError(
187
-			errors.New("没有找到微信相关配置"),
188
-			http.StatusBadRequest,
189
-		)
190
-	}
191
-
192
-	utils.InitWeChatClient(conf)
193
-	usr, err := utils.GetWxUserInfo(code)
181
+	usr, err := utils.WxClientFor(org).GetUserInfo(code)
194 182
 	if err != nil {
195 183
 		c.ResponseError(
196 184
 			utils.LogError("获取微信个人信息失败: "+err.Error()),

+ 7
- 7
controllers/context.go 查看文件

@@ -9,13 +9,13 @@ import (
9 9
 * Context 说明
10 10
 * - 所有 stuct 类型均不是指针
11 11
 * - 包含内容如下
12
-* user					用户基本信息
13
-* customer			会员基本信息
14
-* userMap				用户/会员 映射第三方账户
15
-* wxInfo				微信信息
16
-* cases					用户所有案场信息
17
-* currentCase 	当前案场
18
-* org						用户当前组织
12
+* user					SysUser 									用户基本信息
13
+* customer			TaCustomer 								会员基本信息
14
+* userMap				TaUserMapping 						用户/会员 映射第三方账户
15
+* wxInfo				map[string]interface{} 		微信信息
16
+* cases					[]SysUserCase 						用户所有案场信息
17
+* currentCase		SysUserCase 							当前案场
18
+* org						SysOrg 										用户当前组织
19 19
 **/
20 20
 
21 21
 // initContext 初始化 Context

+ 9
- 27
controllers/customer/customer.go 查看文件

@@ -4,7 +4,6 @@ import (
4 4
 	"errors"
5 5
 	"net/http"
6 6
 	"spaceofcheng/services/controllers"
7
-	"spaceofcheng/services/models"
8 7
 	"spaceofcheng/services/models/model"
9 8
 	"spaceofcheng/services/service/customer"
10 9
 	"spaceofcheng/services/utils"
@@ -55,33 +54,16 @@ func (c *CustomerController) GetCustWXByID() {
55 54
 
56 55
 	userMap := userMapRaw.(model.TaUserMapping)
57 56
 
58
-	if userMap.UserType == models.USERMAP_USER {
59
-		// 如果是用户
60
-		userID := userMap.UserId
61
-		user, err := c.serv.GetCustUserByID(userID)
62
-		if err != nil {
63
-			utils.LogError(err)
64
-			c.ResponseError(errors.New("获取用户信息失败, 请重试"))
65
-		}
66
-
67
-		c.ResponseJSON(map[string]interface{}{
68
-			"user":     user,
69
-			"userType": userMap.UserType,
70
-		})
71
-	} else {
72
-		// 如果是客户
73
-		custID := userMap.UserId
74
-		cust, err := c.serv.GetCustWithWXByID(custID)
75
-		if err != nil {
76
-			utils.LogError(err)
77
-			c.ResponseError(errors.New("获取用户信息失败, 请重试"))
78
-		}
79
-
80
-		c.ResponseJSON(map[string]interface{}{
81
-			"customer": cust,
82
-			"userType": userMap.UserType,
83
-		})
57
+	custID := userMap.UserId
58
+	cust, err := c.serv.GetCustWithWXByID(custID)
59
+	if err != nil {
60
+		utils.LogError(err)
61
+		c.ResponseError(errors.New("获取用户信息失败, 请重试"))
84 62
 	}
63
+
64
+	c.ResponseJSON(map[string]interface{}{
65
+		"customer": cust,
66
+	})
85 67
 }
86 68
 
87 69
 // SignIn 微信登录

+ 27
- 0
controllers/goods/dicts.go 查看文件

@@ -0,0 +1,27 @@
1
+package goods
2
+
3
+import (
4
+	"spaceofcheng/services/models/goods"
5
+)
6
+
7
+// GetMakeStatus 获取制作状态字典
8
+func (c GoodsController) GetMakeStatus() {
9
+	data := []map[string]string{
10
+		map[string]string{
11
+			"TypeId":   goods.MAKESTATUS_NOTSTARTED,
12
+			"TypeName": "未开始",
13
+		},
14
+		map[string]string{
15
+			"TypeId":   goods.MAKESTATUS_FINISHED,
16
+			"TypeName": "已完成",
17
+		},
18
+		map[string]string{
19
+			"TypeId":   goods.MAKESTATUS_CANCEL,
20
+			"TypeName": "已取消",
21
+		},
22
+	}
23
+
24
+	c.ResponseJSON(map[string]interface{}{
25
+		"list": data,
26
+	})
27
+}

+ 96
- 2
controllers/goods/goods.go 查看文件

@@ -1,13 +1,19 @@
1 1
 package goods
2 2
 
3 3
 import (
4
+	"encoding/json"
5
+	"errors"
4 6
 	"spaceofcheng/services/controllers"
7
+	goodsModel "spaceofcheng/services/models/goods"
8
+	"spaceofcheng/services/models/model"
5 9
 	"spaceofcheng/services/service/goods"
10
+	"spaceofcheng/services/utils"
11
+	"strings"
6 12
 )
7 13
 
8 14
 // GoodsController 商品
9 15
 type GoodsController struct {
10
-	dao *goods.GoodsServ
16
+	serv *goods.GoodsServ
11 17
 	controllers.BaseController
12 18
 }
13 19
 
@@ -15,5 +21,93 @@ type GoodsController struct {
15 21
 // @Title Constructor
16 22
 // @Description 初始化 Controller, 系统自动调用
17 23
 func (c *GoodsController) Constructor() {
18
-	c.dao = goods.NewGoodsServ(c.Context)
24
+	c.serv = goods.NewGoodsServ(c.Context)
25
+}
26
+
27
+// GetListByCase 获取案场商品列表
28
+// 管理端
29
+func (c *GoodsController) GetListByCase() {
30
+	page, _ := c.GetInt("page")
31
+	pagesize, _ := c.GetInt("pagesize")
32
+	caseID := c.GetString("caseid")
33
+	goodsName := c.GetString("name")
34
+	goodsType := c.GetString("type")
35
+
36
+	goodsList, cnt, err := c.serv.GetGoodsListPageNavi(goodsName, goodsType, caseID, page, pagesize)
37
+	if err != nil {
38
+		c.ResponseError(err)
39
+	}
40
+
41
+	c.ResponseJSON(map[string]interface{}{
42
+		"list":     goodsList,
43
+		"pagesize": pagesize,
44
+		"pagenum":  cnt,
45
+		"page":     page,
46
+	})
47
+}
48
+
49
+// GetListForWechat 获取商品列表
50
+// 微信端
51
+func (c *GoodsController) GetListForWechat() {
52
+	caseID := c.GetString("caseid")
53
+	if caseID == "" {
54
+		c.ResponseError(errors.New("请指定案场"))
55
+	}
56
+
57
+	goodsList, err := c.serv.GetListByCase(caseID)
58
+	if err != nil {
59
+		c.ResponseError(err)
60
+	}
61
+
62
+	c.ResponseJSON(map[string]interface{}{
63
+		"list": goodsList,
64
+	})
65
+}
66
+
67
+// UpdateGoods 新增或者更新商品
68
+func (c *GoodsController) UpdateGoods() {
69
+	// 商品
70
+	gds := model.TaGoods{}
71
+	if err := c.ParseForm(&gds); err != nil {
72
+		utils.LogError("接收商品参数失败: " + err.Error())
73
+		c.ResponseError(errors.New("接收商品参数失败"))
74
+	}
75
+
76
+	// 图片
77
+	images := strings.Split(c.GetString("images"), ",")
78
+
79
+	// 规格
80
+	var specs []goodsModel.SpecWithPrice
81
+	specsJSON := c.GetString("specs")
82
+	if err := json.Unmarshal([]byte(specsJSON), &specs); err != nil {
83
+		utils.LogError("接收商品参数失败: " + err.Error())
84
+		c.ResponseError(errors.New("接收商品参数失败"))
85
+	}
86
+
87
+	goodsID := c.GetString(":id")
88
+	gds.GoodsId = goodsID
89
+
90
+	if err := c.serv.UpdateGoods(&gds, images, specs); err != nil {
91
+		c.ResponseError(err)
92
+	}
93
+
94
+	c.ResponseJSON(map[string]interface{}{
95
+		"goods":  gds,
96
+		"images": images,
97
+		"specs":  specs,
98
+	})
99
+}
100
+
101
+// DeleteGoods 删除商品
102
+func (c *GoodsController) DeleteGoods() {
103
+	goodsID := c.GetString(":id")
104
+	if goodsID == "" {
105
+		c.ResponseError(errors.New("没有需要删除的商品"))
106
+	}
107
+
108
+	if err := c.serv.DeleteGoods(goodsID); err != nil {
109
+		c.ResponseError(err)
110
+	}
111
+
112
+	c.ResponseJSON("ok")
19 113
 }

+ 15
- 0
controllers/goods/order.go 查看文件

@@ -0,0 +1,15 @@
1
+package goods
2
+
3
+// GetOrderList 获取商品订单
4
+// 管理端 - 统计查询
5
+func (c *GoodsController) GetOrderList() {
6
+	// caseID := c.GetString("caseid")
7
+	// userType := c.GetString("usertype")
8
+	// status := c.GetString("status")
9
+	// orderStart := c.GetString("startdate")
10
+	// orderEnd := c.GetString("enddate")
11
+
12
+	// page, _ := c.GetInt("page")
13
+	// pagesize, _ := c.GetInt("pagesize")
14
+
15
+}

+ 7
- 5
controllers/goods/spec.go 查看文件

@@ -1,6 +1,8 @@
1 1
 package goods
2 2
 
3
-import "spaceofcheng/services/models/model"
3
+import (
4
+	"spaceofcheng/services/models/model"
5
+)
4 6
 
5 7
 // GetGoodsSpec 获取商品规格列表
6 8
 func (c *GoodsController) GetGoodsSpec() {
@@ -11,7 +13,7 @@ func (c *GoodsController) GetGoodsSpec() {
11 13
 	}
12 14
 	page, _ := c.GetInt("page")
13 15
 	pageSize, _ := c.GetInt("pagesize")
14
-	goodsSpec, err := c.dao.GetGoodsSpec(caseids, page, pageSize)
16
+	goodsSpec, err := c.serv.GetGoodsSpec(caseids, page, pageSize)
15 17
 	if err != nil {
16 18
 		c.ResponseError(err)
17 19
 	}
@@ -21,7 +23,7 @@ func (c *GoodsController) GetGoodsSpec() {
21 23
 // GetGoodsSpecByID 根据ID获取商品分类
22 24
 func (c *GoodsController) GetGoodsSpecByID() {
23 25
 	specid := c.GetString(":specid")
24
-	goodsSpec, err := c.dao.GetGoodsSpecByID(specid)
26
+	goodsSpec, err := c.serv.GetGoodsSpecByID(specid)
25 27
 	if err != nil {
26 28
 		c.ResponseError(err)
27 29
 	}
@@ -34,7 +36,7 @@ func (c *GoodsController) SaveGoodsSpec() {
34 36
 	if err := c.ParseForm(&goodsSpec); err != nil {
35 37
 		c.ResponseError(err)
36 38
 	}
37
-	newSpec, err := c.dao.SaveGoodsSpec(goodsSpec)
39
+	newSpec, err := c.serv.SaveGoodsSpec(goodsSpec)
38 40
 	if err != nil {
39 41
 		c.ResponseError(err)
40 42
 	}
@@ -44,7 +46,7 @@ func (c *GoodsController) SaveGoodsSpec() {
44 46
 // DelGoodsSpec 删除商品分类
45 47
 func (c *GoodsController) DelGoodsSpec() {
46 48
 	specid := c.GetString(":specid")
47
-	err := c.dao.DelGoodsSpec(specid)
49
+	err := c.serv.DelGoodsSpec(specid)
48 50
 	if err != nil {
49 51
 		c.ResponseError(err)
50 52
 	}

+ 7
- 5
controllers/goods/type.go 查看文件

@@ -1,6 +1,8 @@
1 1
 package goods
2 2
 
3
-import "spaceofcheng/services/models/model"
3
+import (
4
+	"spaceofcheng/services/models/model"
5
+)
4 6
 
5 7
 // GetGoodsType 获取商品分类列表
6 8
 func (c *GoodsController) GetGoodsType() {
@@ -11,7 +13,7 @@ func (c *GoodsController) GetGoodsType() {
11 13
 	}
12 14
 	page, _ := c.GetInt("page")
13 15
 	pageSize, _ := c.GetInt("pagesize")
14
-	goodstype, err := c.dao.GetGoodsType(caseids, page, pageSize)
16
+	goodstype, err := c.serv.GetGoodsType(caseids, page, pageSize)
15 17
 	if err != nil {
16 18
 		c.ResponseError(err)
17 19
 	}
@@ -21,7 +23,7 @@ func (c *GoodsController) GetGoodsType() {
21 23
 // GetGoodsTypeByID 根据ID获取商品分类
22 24
 func (c *GoodsController) GetGoodsTypeByID() {
23 25
 	typeid := c.GetString(":typeid")
24
-	goodsType, err := c.dao.GetGoodsTypeByID(typeid)
26
+	goodsType, err := c.serv.GetGoodsTypeByID(typeid)
25 27
 	if err != nil {
26 28
 		c.ResponseError(err)
27 29
 	}
@@ -34,7 +36,7 @@ func (c *GoodsController) SaveGoodsType() {
34 36
 	if err := c.ParseForm(&goodsType); err != nil {
35 37
 		c.ResponseError(err)
36 38
 	}
37
-	newtype, err := c.dao.SaveGoodsType(goodsType)
39
+	newtype, err := c.serv.SaveGoodsType(goodsType)
38 40
 	if err != nil {
39 41
 		c.ResponseError(err)
40 42
 	}
@@ -44,7 +46,7 @@ func (c *GoodsController) SaveGoodsType() {
44 46
 // DelGoodsType 删除商品分类
45 47
 func (c *GoodsController) DelGoodsType() {
46 48
 	typeid := c.GetString(":typeid")
47
-	err := c.dao.DelGoodsType(typeid)
49
+	err := c.serv.DelGoodsType(typeid)
48 50
 	if err != nil {
49 51
 		c.ResponseError(err)
50 52
 	}

+ 0
- 17
log/common.2018-08-17.log 查看文件

@@ -1,17 +0,0 @@
1
-2018/08/17 13:45:31 [E] 用户登录失败: 用户密码不正确
2
-2018/08/17 13:47:02 [E] 用户登录失败: 用户密码不正确
3
-2018/08/17 17:29:34 [E] 获取用户案场信息失败: Error 1054: Unknown column 's.user_id' in 'where clause'
4
-2018/08/17 17:29:34 [E] 获取用户案场信息失败: Error 1054: Unknown column 's.user_id' in 'where clause'
5
-2018/08/17 17:30:02 [E] 获取用户案场信息失败: Error 1054: Unknown column 's.user_id' in 'where clause'
6
-2018/08/17 17:30:02 [E] 获取用户案场信息失败: Error 1054: Unknown column 's.user_id' in 'where clause'
7
-2018/08/17 17:35:08 [E] 用户没有设置默认案场
8
-2018/08/17 17:35:08 [E] 用户没有设置默认案场
9
-2018/08/17 17:37:03 [E] 用户没有设置默认案场
10
-2018/08/17 17:37:03 [E] 获取用户组织信息失败: 没有查询到机构信息
11
-2018/08/17 17:37:03 [E] 获取用户组织信息失败: 没有查询到机构信息
12
-2018/08/17 17:41:34 [E] 用户没有设置默认案场
13
-2018/08/17 17:41:34 [E] 获取用户组织信息失败: 没有查询到机构信息
14
-2018/08/17 17:41:34 [E] 获取用户组织信息失败: 没有查询到机构信息
15
-2018/08/17 17:42:13 [E] 用户没有设置默认案场
16
-2018/08/17 17:47:00 [E] 用户没有设置默认案场
17
-2018/08/17 17:47:48 [E] 用户没有设置默认案场

+ 7
- 0
log/common.2018-08-24.log 查看文件

@@ -0,0 +1,7 @@
1
+2018/08/24 09:40:16 [E] 验证码 - 17714208769 : 648633
2
+2018/08/24 10:53:37 [E] 获取人员映射账户失败: Error 1205: Lock wait timeout exceeded; try restarting transaction
3
+2018/08/24 10:54:58 [E] 获取人员映射账户失败: Error 1205: Lock wait timeout exceeded; try restarting transaction
4
+2018/08/24 10:55:03 [E] 获取人员映射账户失败: Error 1205: Lock wait timeout exceeded; try restarting transaction
5
+2018/08/24 10:55:42 [E] 获取人员映射账户失败: Error 1205: Lock wait timeout exceeded; try restarting transaction
6
+2018/08/24 10:55:46 [E] 获取人员映射账户失败: Error 1205: Lock wait timeout exceeded; try restarting transaction
7
+2018/08/24 11:30:58 [E] 更新用户映射信息失败:Params type error

log/common.2018-08-18.log → log/common.2018-08-25.log 查看文件


+ 74
- 7
log/common.log 查看文件

@@ -1,7 +1,74 @@
1
-2018/08/24 09:40:16 [E] 验证码 - 17714208769 : 648633
2
-2018/08/24 10:53:37 [E] 获取人员映射账户失败: Error 1205: Lock wait timeout exceeded; try restarting transaction
3
-2018/08/24 10:54:58 [E] 获取人员映射账户失败: Error 1205: Lock wait timeout exceeded; try restarting transaction
4
-2018/08/24 10:55:03 [E] 获取人员映射账户失败: Error 1205: Lock wait timeout exceeded; try restarting transaction
5
-2018/08/24 10:55:42 [E] 获取人员映射账户失败: Error 1205: Lock wait timeout exceeded; try restarting transaction
6
-2018/08/24 10:55:46 [E] 获取人员映射账户失败: Error 1205: Lock wait timeout exceeded; try restarting transaction
7
-2018/08/24 11:30:58 [E] 更新用户映射信息失败:Params type error
1
+2018/08/26 09:37:50 [E] 查询微信配置失败: Error 1054: Unknown column 'rmark' in 'field list'
2
+2018/08/26 09:38:37 [I] 请求远程接口: %!(EXTRA string=https://api.weixin.qq.com/cgi-bin/token?appid=wx7320287e057bbeee&grant_type=client_credential&secret=6e844dc2ade439545c47569ba1707673)
3
+2018/08/26 09:38:37 [I] 远程请求结果:%!(EXTRA string={"access_token":"13_-Lg_RS71-apY79btcVmfgOoi47yZER01vtlROS4cXfqgIRfbPkzUPTwvZz6w0DlHMJIk7h-xISGUwZ0Tosff1sEpcfhNiBLw6zvr-l9zpi-tp2N6hJY7QM4uExMIZTSOixTUS9uHKOiK7trvUZWdAIAHMJ","expires_in":7200})
4
+2018/08/26 09:38:37 [I] 接口返回结果: %!(EXTRA map[string]interface {}=map[expires_in:7200 access_token:13_-Lg_RS71-apY79btcVmfgOoi47yZER01vtlROS4cXfqgIRfbPkzUPTwvZz6w0DlHMJIk7h-xISGUwZ0Tosff1sEpcfhNiBLw6zvr-l9zpi-tp2N6hJY7QM4uExMIZTSOixTUS9uHKOiK7trvUZWdAIAHMJ])
5
+2018/08/26 09:44:13 [I] 请求远程接口: %!(EXTRA string=https://api.weixin.qq.com/cgi-bin/token?appid=wx7320287e057bbeee&grant_type=client_credential&secret=6e844dc2ade439545c47569ba1707673)
6
+2018/08/26 09:44:13 [I] 远程请求结果:%!(EXTRA string={"access_token":"13_2REPD5yYQxrGgfgH94odWyxn0xLwS_-9HvVko999_vYdApibljI1UuhMYohVkLz84IMkGEyf9BpSFWbR9oH3qJffwFnjb-f3XVDXjuuGRPpFU5q3acQ1-8Q5PzEXWZdAJAGFI","expires_in":7200})
7
+2018/08/26 09:44:13 [I] 接口返回结果: %!(EXTRA map[string]interface {}=map[access_token:13_2REPD5yYQxrGgfgH94odWyxn0xLwS_-9HvVko999_vYdApibljI1UuhMYohVkLz84IMkGEyf9BpSFWbR9oH3qJffwFnjb-f3XVDXjuuGRPpFU5q3acQ1-8Q5PzEXWZdAJAGFI expires_in:7200])
8
+2018/08/26 09:45:32 [I] 请求远程接口: %!(EXTRA string=https://api.weixin.qq.com/cgi-bin/token?appid=wx7320287e057bbeee&grant_type=client_credential&secret=6e844dc2ade439545c47569ba1707673)
9
+2018/08/26 09:45:32 [I] 远程请求结果:%!(EXTRA string={"access_token":"13_xTyy-6CTPuz4gw7CzuHQhZ73GnK1IL_KpzT9EgUTUX4qSgdqH0ZEgNMxhavJY-kMsaHN15owtkQe0dlf9kfE7Cl0PvCmC9OPc5PiJhflZ2NAAiZp84sKHp81FDsTSBeAHAYXG","expires_in":7200})
10
+2018/08/26 09:45:32 [I] 接口返回结果: %!(EXTRA map[string]interface {}=map[access_token:13_xTyy-6CTPuz4gw7CzuHQhZ73GnK1IL_KpzT9EgUTUX4qSgdqH0ZEgNMxhavJY-kMsaHN15owtkQe0dlf9kfE7Cl0PvCmC9OPc5PiJhflZ2NAAiZp84sKHp81FDsTSBeAHAYXG expires_in:7200])
11
+2018/08/26 09:49:08 [I] 请求远程接口: %!(EXTRA string=https://api.weixin.qq.com/cgi-bin/token?appid=wx7320287e057bbeee&grant_type=client_credential&secret=6e844dc2ade439545c47569ba1707673)
12
+2018/08/26 09:49:09 [I] 远程请求结果:%!(EXTRA string={"access_token":"13_K6k5JNOBeMpIe_gitC04i233yiyA6yh1smV1feyiUQTk6010b98PU3X67e8KCvaCjTR0HmjrttsTJLrtzg54TwKnGLE-UgV7NDMMhp4u2r2V56ghJDZ5-7xlC9SxvTkIu0nmQAfAif3ktCULIQZeADAVDM","expires_in":7200})
13
+2018/08/26 09:49:09 [I] 接口返回结果: %!(EXTRA map[string]interface {}=map[access_token:13_K6k5JNOBeMpIe_gitC04i233yiyA6yh1smV1feyiUQTk6010b98PU3X67e8KCvaCjTR0HmjrttsTJLrtzg54TwKnGLE-UgV7NDMMhp4u2r2V56ghJDZ5-7xlC9SxvTkIu0nmQAfAif3ktCULIQZeADAVDM expires_in:7200])
14
+2018/08/26 09:50:11 [I] 请求远程接口: %!(EXTRA string=https://api.weixin.qq.com/cgi-bin/token?appid=wx7320287e057bbeee&grant_type=client_credential&secret=6e844dc2ade439545c47569ba1707673)
15
+2018/08/26 09:50:11 [I] 远程请求结果:%!(EXTRA string={"access_token":"13_Dm3oaLYTAMFOsaxzn6Sm-liedNbNRUDD0lZuCSUHfVFWry9R7oXyyLDXGOsDR6XO_cAReWZ0KBgituizW20oxfHHq8ezj0iiUveePrL03Cml6x7R0WkzMOiNGcXmyzo3Igh3r8QhGK2WfuwOMVQfAAAHQL","expires_in":7200})
16
+2018/08/26 09:50:11 [I] 接口返回结果: %!(EXTRA map[string]interface {}=map[access_token:13_Dm3oaLYTAMFOsaxzn6Sm-liedNbNRUDD0lZuCSUHfVFWry9R7oXyyLDXGOsDR6XO_cAReWZ0KBgituizW20oxfHHq8ezj0iiUveePrL03Cml6x7R0WkzMOiNGcXmyzo3Igh3r8QhGK2WfuwOMVQfAAAHQL expires_in:7200])
17
+2018/08/26 09:51:59 [I] 请求远程接口: %!(EXTRA string=https://api.weixin.qq.com/cgi-bin/token?appid=wx7320287e057bbeee&grant_type=client_credential&secret=6e844dc2ade439545c47569ba1707673)
18
+2018/08/26 09:51:59 [I] 远程请求结果:%!(EXTRA string={"access_token":"13_B0bGSFxdnZK5KT9wzuHQhZ73GnK1IL_KpzT9EvI_ZHhdHbiwSy9FiEfhct77uI_1Brx6kBu3SklukBzw2BnWBk-Q52pYYIb9NpZELzJVR8tzWWbPWD9Tc36StP7FmdpzG1y9UrT4A3idUIDfVRGgAEAZVK","expires_in":7200})
19
+2018/08/26 09:51:59 [I] 接口返回结果: %!(EXTRA map[string]interface {}=map[access_token:13_B0bGSFxdnZK5KT9wzuHQhZ73GnK1IL_KpzT9EvI_ZHhdHbiwSy9FiEfhct77uI_1Brx6kBu3SklukBzw2BnWBk-Q52pYYIb9NpZELzJVR8tzWWbPWD9Tc36StP7FmdpzG1y9UrT4A3idUIDfVRGgAEAZVK expires_in:7200])
20
+2018/08/26 09:52:26 [I] 请求远程接口: %!(EXTRA string=https://api.weixin.qq.com/cgi-bin/token?appid=wx7320287e057bbeee&grant_type=client_credential&secret=6e844dc2ade439545c47569ba1707673)
21
+2018/08/26 09:52:26 [I] 远程请求结果:%!(EXTRA string={"access_token":"13_JaO07aaK8Vbt8mVhb88JC_57VjUKFd0UxQUL0TVMKNF0DUrcHPt4tjZjaeF3K1UI0NPOyNqYytzPg5YfIeSfDowMBreC86pigfPIXZrwlqspCOddE5QtTmD8uGQZ7_VhX0aHegYT8Iy-dSupBNQcAFAPBE","expires_in":7200})
22
+2018/08/26 09:52:26 [I] 接口返回结果: %!(EXTRA map[string]interface {}=map[access_token:13_JaO07aaK8Vbt8mVhb88JC_57VjUKFd0UxQUL0TVMKNF0DUrcHPt4tjZjaeF3K1UI0NPOyNqYytzPg5YfIeSfDowMBreC86pigfPIXZrwlqspCOddE5QtTmD8uGQZ7_VhX0aHegYT8Iy-dSupBNQcAFAPBE expires_in:7200])
23
+2018/08/26 09:52:52 [I] 请求远程接口: %!(EXTRA string=https://api.weixin.qq.com/cgi-bin/token?appid=wx7320287e057bbeee&grant_type=client_credential&secret=6e844dc2ade439545c47569ba1707673)
24
+2018/08/26 09:52:52 [I] 远程请求结果:%!(EXTRA string={"access_token":"13_W_Xh9756zIW8jFK4bRxCsoQiUV0j-zAfNmXR38hdAk10_MDRh15cOJkDRkROLC6iU7zSqQxcPQQz-NsBHfFaK9Ol1HliVvIg8efKZGrfBwXva0asAn0OnU869MNfv5-EtNzJl_talvZ7N2twBOBfAEAVIV","expires_in":7200})
25
+2018/08/26 09:52:52 [I] 接口返回结果: %!(EXTRA map[string]interface {}=map[expires_in:7200 access_token:13_W_Xh9756zIW8jFK4bRxCsoQiUV0j-zAfNmXR38hdAk10_MDRh15cOJkDRkROLC6iU7zSqQxcPQQz-NsBHfFaK9Ol1HliVvIg8efKZGrfBwXva0asAn0OnU869MNfv5-EtNzJl_talvZ7N2twBOBfAEAVIV])
26
+2018/08/26 09:53:06 [I] 请求远程接口: %!(EXTRA string=https://api.weixin.qq.com/cgi-bin/token?appid=wx7320287e057bbeee&grant_type=client_credential&secret=6e844dc2ade439545c47569ba1707673)
27
+2018/08/26 09:53:06 [I] 远程请求结果:%!(EXTRA string={"access_token":"13_x8W4tYHqT6-xw2KZbRxCsoQiUV0j-zAfNmXR38hdAk10_MDRh15cOJkDRkTiPc6vNMq046pPpyHg_ksa0ELjakenatHGtKfyBPLppB1hTwdcpghc5Z8QmY5upPqR37Epw0HfFweotkLnljJiOEOfAEAXNX","expires_in":7200})
28
+2018/08/26 09:53:06 [I] 接口返回结果: %!(EXTRA map[string]interface {}=map[access_token:13_x8W4tYHqT6-xw2KZbRxCsoQiUV0j-zAfNmXR38hdAk10_MDRh15cOJkDRkTiPc6vNMq046pPpyHg_ksa0ELjakenatHGtKfyBPLppB1hTwdcpghc5Z8QmY5upPqR37Epw0HfFweotkLnljJiOEOfAEAXNX expires_in:7200])
29
+2018/08/26 09:54:43 [I] 请求远程接口: %!(EXTRA string=https://api.weixin.qq.com/cgi-bin/token?appid=wx7320287e057bbeee&grant_type=client_credential&secret=6e844dc2ade439545c47569ba1707673)
30
+2018/08/26 09:54:44 [I] 远程请求结果:%!(EXTRA string={"access_token":"13_PK1MfsKJTJBSyulyKvLRHiorDM-9wwzYsyPyvpnEpTQgtpnYsMM6AwA9DcpV5vq0REYd69l3WhYQ1_0AOZcTW7GKQaAxLmxj47IBXdxLScTYi4l-8ZtP6ZmS96kFROeAGAJVS","expires_in":7200})
31
+2018/08/26 09:54:44 [I] 接口返回结果: %!(EXTRA map[string]interface {}=map[access_token:13_PK1MfsKJTJBSyulyKvLRHiorDM-9wwzYsyPyvpnEpTQgtpnYsMM6AwA9DcpV5vq0REYd69l3WhYQ1_0AOZcTW7GKQaAxLmxj47IBXdxLScTYi4l-8ZtP6ZmS96kFROeAGAJVS expires_in:7200])
32
+2018/08/26 09:56:04 [I] 请求远程接口: %!(EXTRA string=https://api.weixin.qq.com/cgi-bin/token?appid=wx7320287e057bbeee&grant_type=client_credential&secret=6e844dc2ade439545c47569ba1707673)
33
+2018/08/26 09:56:04 [I] 远程请求结果:%!(EXTRA string={"access_token":"13_igGxdtw6AzmfTOu9cIlzH2dMOQRu-NPQ0Pm92NS4Hm9llCRTrFHsaxQb0etiAjOuQBL7_ep7csgPjvyNWEEZGOZ28akNtaDQD1ApoYYeAihI58iUra270dbdmO8MNEfAGAWXO","expires_in":7200})
34
+2018/08/26 09:56:04 [I] 接口返回结果: %!(EXTRA map[string]interface {}=map[access_token:13_igGxdtw6AzmfTOu9cIlzH2dMOQRu-NPQ0Pm92NS4Hm9llCRTrFHsaxQb0etiAjOuQBL7_ep7csgPjvyNWEEZGOZ28akNtaDQD1ApoYYeAihI58iUra270dbdmO8MNEfAGAWXO expires_in:7200])
35
+2018/08/26 10:01:23 [I] 请求远程接口: %!(EXTRA string=https://api.weixin.qq.com/cgi-bin/token?appid=wx7320287e057bbeee&grant_type=client_credential&secret=6e844dc2ade439545c47569ba1707673)
36
+2018/08/26 10:01:23 [I] 远程请求结果:%!(EXTRA string={"access_token":"13_ho3BftxaKmrGQie6QrTSheSWuAj8XAN8wpjERCj2FB00PWVCksSlu-X-3yVreKXyMZiE9TKDHdpFRJ4TwWiWKC6Bn7nwuF38emI9H3YKw41aq4OzdCHxSpeswgkiUTmGyyLdUBTGvBg3LrgbQUQaACACGC","expires_in":7200})
37
+2018/08/26 10:01:23 [I] 接口返回结果: %!(EXTRA map[string]interface {}=map[expires_in:7200 access_token:13_ho3BftxaKmrGQie6QrTSheSWuAj8XAN8wpjERCj2FB00PWVCksSlu-X-3yVreKXyMZiE9TKDHdpFRJ4TwWiWKC6Bn7nwuF38emI9H3YKw41aq4OzdCHxSpeswgkiUTmGyyLdUBTGvBg3LrgbQUQaACACGC])
38
+2018/08/26 10:03:00 [I] 请求远程接口: %!(EXTRA string=https://api.weixin.qq.com/cgi-bin/token?appid=wx7320287e057bbeee&grant_type=client_credential&secret=6e844dc2ade439545c47569ba1707673)
39
+2018/08/26 10:03:00 [I] 远程请求结果:%!(EXTRA string={"access_token":"13_mPkwKKOyg1_TrG55P9WmMf-uZJq9ElASxwnCi3kwUmH6i2JfpZRszI-vThMJ8p2BZ155si1rJiD9T1OMphQ2LlU4mVJK2VylENa49ZYKq1nman7AQKmmUhQQf1NF61dSpJzwWL1YcmtxdswWPEWcAFAGVN","expires_in":7200})
40
+2018/08/26 10:03:00 [I] 接口返回结果: %!(EXTRA map[string]interface {}=map[access_token:13_mPkwKKOyg1_TrG55P9WmMf-uZJq9ElASxwnCi3kwUmH6i2JfpZRszI-vThMJ8p2BZ155si1rJiD9T1OMphQ2LlU4mVJK2VylENa49ZYKq1nman7AQKmmUhQQf1NF61dSpJzwWL1YcmtxdswWPEWcAFAGVN expires_in:7200])
41
+2018/08/26 10:03:34 [I] 请求远程接口: %!(EXTRA string=https://api.weixin.qq.com/cgi-bin/token?appid=wx7320287e057bbeee&grant_type=client_credential&secret=6e844dc2ade439545c47569ba1707673)
42
+2018/08/26 10:03:37 [I] 请求远程接口: %!(EXTRA string=https://api.weixin.qq.com/cgi-bin/token?appid=wx7320287e057bbeee&grant_type=client_credential&secret=6e844dc2ade439545c47569ba1707673)
43
+2018/08/26 10:03:37 [I] 远程请求结果:%!(EXTRA string={"access_token":"13_pDrce0TWVtCLO-krXhdBpI73YPmDSHDuiZldQlc0KhV3MDE9JEF9fhiCft8VbdEtodGzPVCL0_HE1pGlJ8SPI64yDhihRsrgkw7gh8tUnzSXlax1SqATFixZjSN6ufmekVUwX1lTNaQxz74BDSNaAHAYNI","expires_in":7200})
44
+2018/08/26 10:03:37 [I] 接口返回结果: %!(EXTRA map[string]interface {}=map[access_token:13_pDrce0TWVtCLO-krXhdBpI73YPmDSHDuiZldQlc0KhV3MDE9JEF9fhiCft8VbdEtodGzPVCL0_HE1pGlJ8SPI64yDhihRsrgkw7gh8tUnzSXlax1SqATFixZjSN6ufmekVUwX1lTNaQxz74BDSNaAHAYNI expires_in:7200])
45
+2018/08/26 10:06:33 [I] 请求远程接口: %!(EXTRA string=https://api.weixin.qq.com/cgi-bin/token?appid=wx7320287e057bbeee&grant_type=client_credential&secret=6e844dc2ade439545c47569ba1707673)
46
+2018/08/26 10:06:33 [I] 远程请求结果:%!(EXTRA string={"access_token":"13_DZoFCC4yhlTyAkYxNIDuR2xRUAWJHPruJFOqDuEV3D5d1DdqVNkCznwmzs340F7K4wM5CiXND7hySR6ljElUYYPdZq_LrWW-g-Q5SzsRT6RRelYmhu4yRe8J8cBBg_ElkEbervWfr1DBlstvZOHaAIADSL","expires_in":7200})
47
+2018/08/26 10:06:33 [I] 接口返回结果: %!(EXTRA map[string]interface {}=map[access_token:13_DZoFCC4yhlTyAkYxNIDuR2xRUAWJHPruJFOqDuEV3D5d1DdqVNkCznwmzs340F7K4wM5CiXND7hySR6ljElUYYPdZq_LrWW-g-Q5SzsRT6RRelYmhu4yRe8J8cBBg_ElkEbervWfr1DBlstvZOHaAIADSL expires_in:7200])
48
+2018/08/26 10:08:42 [I] 请求远程接口: %!(EXTRA string=https://api.weixin.qq.com/cgi-bin/token?appid=wx7320287e057bbeee&grant_type=client_credential&secret=6e844dc2ade439545c47569ba1707673)
49
+2018/08/26 10:08:43 [I] 远程请求结果:%!(EXTRA string={"access_token":"13_96NNB_wLDEFTiOTGTmi9TkQvj1AiAe3lQIQWnbQIohFWbJ5DduY27W7k_Acaf8CUKq-N1Bl9yorRUuG690EDGHwBuA5tpkg3fAvrnn50VNEmTbtaNN3H22dcMu5eqxZIAtptEs_n5SRPXBfXOKIcACABXV","expires_in":7200})
50
+2018/08/26 10:08:43 [I] 接口返回结果: %!(EXTRA map[string]interface {}=map[access_token:13_96NNB_wLDEFTiOTGTmi9TkQvj1AiAe3lQIQWnbQIohFWbJ5DduY27W7k_Acaf8CUKq-N1Bl9yorRUuG690EDGHwBuA5tpkg3fAvrnn50VNEmTbtaNN3H22dcMu5eqxZIAtptEs_n5SRPXBfXOKIcACABXV expires_in:7200])
51
+2018/08/26 10:28:46 [I] 请求远程接口: %!(EXTRA string=https://api.weixin.qq.com/cgi-bin/token?appid=wx7320287e057bbeee&grant_type=client_credential&secret=6e844dc2ade439545c47569ba1707673)
52
+2018/08/26 10:28:47 [I] 远程请求结果:%!(EXTRA string={"access_token":"13_tfSozSKyxf6tttaz0yd2aut_EFTLarqBafPHq9AIARgmCTZL471kN1LURN4Fkklongv4QIwKWMKPgiDc0Lz_2UrwBmbDWFsr_CsKoXMewVTLbjcPRMzVwps-bgL865o-ivCgAv_1lk9AZ92BFPFeAFAYIY","expires_in":7200})
53
+2018/08/26 10:28:47 [I] 接口返回结果: %!(EXTRA map[string]interface {}=map[access_token:13_tfSozSKyxf6tttaz0yd2aut_EFTLarqBafPHq9AIARgmCTZL471kN1LURN4Fkklongv4QIwKWMKPgiDc0Lz_2UrwBmbDWFsr_CsKoXMewVTLbjcPRMzVwps-bgL865o-ivCgAv_1lk9AZ92BFPFeAFAYIY expires_in:7200])
54
+2018/08/26 10:36:16 [I] 请求远程接口: %!(EXTRA string=https://api.weixin.qq.com/cgi-bin/token?appid=wx7320287e057bbeee&grant_type=client_credential&secret=6e844dc2ade439545c47569ba1707673)
55
+2018/08/26 10:36:16 [I] 远程请求结果:%!(EXTRA string={"access_token":"13_Bgp4G3PY317x9UpbQOS6uPUvYLON3hDKHhqdyhD0TB_S4qUw5Kps-GnjTBABV8fU0Fq5JZkiTeXHHCLXnolcWgx3lMMy736Q_UU2hWVRHoiVTR7WRe08Yg3p2_OxIS43-bhf5ZZ1Pq1vpla5PDDfABACQQ","expires_in":7200})
56
+2018/08/26 10:36:16 [I] 接口返回结果: %!(EXTRA map[string]interface {}=map[access_token:13_Bgp4G3PY317x9UpbQOS6uPUvYLON3hDKHhqdyhD0TB_S4qUw5Kps-GnjTBABV8fU0Fq5JZkiTeXHHCLXnolcWgx3lMMy736Q_UU2hWVRHoiVTR7WRe08Yg3p2_OxIS43-bhf5ZZ1Pq1vpla5PDDfABACQQ expires_in:7200])
57
+2018/08/26 10:37:08 [I] 请求远程接口: %!(EXTRA string=https://api.weixin.qq.com/cgi-bin/token?appid=wx7320287e057bbeee&grant_type=client_credential&secret=6e844dc2ade439545c47569ba1707673)
58
+2018/08/26 10:37:08 [I] 远程请求结果:%!(EXTRA string={"access_token":"13_7OsVSwADwqEcwqQKNIDuR2xRUAWJHPruJFOqDlmHgDjknD0fdU94o7ndqas3U5aNtlfiNoovlsA4RLjUmqIMGf0vTlCFBjQ_M8L-N-i1jlcQiugyXFDRWsui1CUIG_9gW7gCdS1LUybkGRE4ZCIcABAEHN","expires_in":7200})
59
+2018/08/26 10:37:08 [I] 接口返回结果: %!(EXTRA map[string]interface {}=map[access_token:13_7OsVSwADwqEcwqQKNIDuR2xRUAWJHPruJFOqDlmHgDjknD0fdU94o7ndqas3U5aNtlfiNoovlsA4RLjUmqIMGf0vTlCFBjQ_M8L-N-i1jlcQiugyXFDRWsui1CUIG_9gW7gCdS1LUybkGRE4ZCIcABAEHN expires_in:7200])
60
+2018/08/26 10:48:19 [I] 请求远程接口: %!(EXTRA string=https://api.weixin.qq.com/cgi-bin/token?appid=wx7320287e057bbeee&grant_type=client_credential&secret=6e844dc2ade439545c47569ba1707673)
61
+2018/08/26 10:48:20 [I] 远程请求结果:%!(EXTRA string={"access_token":"13_kgQXjSoiSNu6r7VNYRaB7Jkvc6MyxsgqlfRp0GD3t4U9VVRlLLteA1jq_4IZBAVt3zYLiacrmsTJLR2nD9qb99yUWfPaLFP8NBTDPvu4cFYbNFHmOBMUJwVW9lVEaPm_2kQY1tnqcmFRpa6uKOGeABAFJB","expires_in":7200})
62
+2018/08/26 10:48:20 [I] 接口返回结果: %!(EXTRA map[string]interface {}=map[access_token:13_kgQXjSoiSNu6r7VNYRaB7Jkvc6MyxsgqlfRp0GD3t4U9VVRlLLteA1jq_4IZBAVt3zYLiacrmsTJLR2nD9qb99yUWfPaLFP8NBTDPvu4cFYbNFHmOBMUJwVW9lVEaPm_2kQY1tnqcmFRpa6uKOGeABAFJB expires_in:7200])
63
+2018/08/26 10:57:38 [I] 请求远程接口: %!(EXTRA string=https://api.weixin.qq.com/cgi-bin/token?appid=wx7320287e057bbeee&grant_type=client_credential&secret=6e844dc2ade439545c47569ba1707673)
64
+2018/08/26 10:57:38 [I] 远程请求结果:%!(EXTRA string={"access_token":"13_IuDEV53CHWkI4PMqWBMNgMuHx4Y6f7UP5MD90PRncFeGPK9Ri00Zbf6d-IvnUZ3FEhCN7bkwGK9wJPJGXu-RY5J91Cpr_OII7IZhVYPjtdLWuBIPzkcq28gKfxTRlSQTCQXGc3_khJMAJrNIDUThAGAGXW","expires_in":7200})
65
+2018/08/26 10:57:38 [I] 接口返回结果: %!(EXTRA map[string]interface {}=map[access_token:13_IuDEV53CHWkI4PMqWBMNgMuHx4Y6f7UP5MD90PRncFeGPK9Ri00Zbf6d-IvnUZ3FEhCN7bkwGK9wJPJGXu-RY5J91Cpr_OII7IZhVYPjtdLWuBIPzkcq28gKfxTRlSQTCQXGc3_khJMAJrNIDUThAGAGXW expires_in:7200])
66
+2018/08/26 10:58:56 [I] 请求远程接口: %!(EXTRA string=https://api.weixin.qq.com/cgi-bin/token?appid=wx7320287e057bbeee&grant_type=client_credential&secret=6e844dc2ade439545c47569ba1707673)
67
+2018/08/26 10:58:56 [I] 远程请求结果:%!(EXTRA string={"access_token":"13_j6hv2N3bFx7qKu-zMWqgXQqP5f3C1fi5MKw7aVmOU27p7NHWfiwleuTzzhyuccc9zfejZJV9s615X9pGZo2swrUQa_R4b3jFxn7OLuA3jDgBBUQwvIv578aeNjgLLVfAIAUUE","expires_in":7200})
68
+2018/08/26 10:58:56 [I] 接口返回结果: %!(EXTRA map[string]interface {}=map[access_token:13_j6hv2N3bFx7qKu-zMWqgXQqP5f3C1fi5MKw7aVmOU27p7NHWfiwleuTzzhyuccc9zfejZJV9s615X9pGZo2swrUQa_R4b3jFxn7OLuA3jDgBBUQwvIv578aeNjgLLVfAIAUUE expires_in:7200])
69
+2018/08/26 15:20:02 [I] 请求远程接口: %!(EXTRA string=https://api.weixin.qq.com/cgi-bin/token?appid=wx7320287e057bbeee&grant_type=client_credential&secret=6e844dc2ade439545c47569ba1707673)
70
+2018/08/26 15:20:03 [I] 远程请求结果:%!(EXTRA string={"access_token":"13_BWujCeV9M2yUp5tsJpx7FaGHTMbuGAJ0c3XHxCrkY7-Ro9tiu-cAJNx45PdkiNe5SfTZrW7ZhHXz36VnZ8HYzN6arFiFgloLHh9qJIb9_sIqFAgi2NPApcOm16BXEF4GY7KDOza67EWofM1jIQIgABAUCU","expires_in":7200})
71
+2018/08/26 15:20:03 [I] 接口返回结果: %!(EXTRA map[string]interface {}=map[access_token:13_BWujCeV9M2yUp5tsJpx7FaGHTMbuGAJ0c3XHxCrkY7-Ro9tiu-cAJNx45PdkiNe5SfTZrW7ZhHXz36VnZ8HYzN6arFiFgloLHh9qJIb9_sIqFAgi2NPApcOm16BXEF4GY7KDOza67EWofM1jIQIgABAUCU expires_in:7200])
72
+2018/08/26 16:17:50 [I] 请求远程接口: %!(EXTRA string=https://api.weixin.qq.com/cgi-bin/token?appid=wx7320287e057bbeee&grant_type=client_credential&secret=6e844dc2ade439545c47569ba1707673)
73
+2018/08/26 16:17:50 [I] 远程请求结果:%!(EXTRA string={"access_token":"13_hezlnSFBORaBwf5SdwfaSZEoGO35hkS4XL7D2SKqDSUwryGZpP6lFh9fVUDjFQzwv0oH3wZnP5ANT4rE1nQEeBgZTHIPo5Qzu5KpHhVFQNc_0bb6XGAFm-ugPf9iKI2tVA4SIfILsf6VunDeLZUeAAAVJE","expires_in":7200})
74
+2018/08/26 16:17:50 [I] 接口返回结果: %!(EXTRA map[string]interface {}=map[access_token:13_hezlnSFBORaBwf5SdwfaSZEoGO35hkS4XL7D2SKqDSUwryGZpP6lFh9fVUDjFQzwv0oH3wZnP5ANT4rE1nQEeBgZTHIPo5Qzu5KpHhVFQNc_0bb6XGAFm-ugPf9iKI2tVA4SIfILsf6VunDeLZUeAAAVJE expires_in:7200])

+ 1
- 12
models/customer/customer.go 查看文件

@@ -93,7 +93,7 @@ func (m *CustomerDAO) GetCustWithWXByID(custID string) (*CustWithWX, error) {
93 93
 
94 94
 	cust := CustWithWX{}
95 95
 	query := `
96
-		SELECT *
96
+		SELECT *, t.user_id as map_user
97 97
 		FROM
98 98
 			ta_customer t
99 99
 		LEFT JOIN ta_user_mapping s ON t.customer_id = s.user_id
@@ -215,14 +215,3 @@ func (m *CustomerDAO) GetCustomerByID(id string) (*model.TaCustomer, error) {
215 215
 
216 216
 	return cust, nil
217 217
 }
218
-
219
-// GetForbidUserByUserID 查询禁用人员
220
-func (m *CustomerDAO) GetForbidUserByUserID(userID string) ([]model.TaForbidUser, error) {
221
-	var fbUsers []model.TaForbidUser
222
-
223
-	if err := m.db.Where("user_id=?", userID).Find(&fbUsers); err != nil {
224
-		return nil, err
225
-	}
226
-
227
-	return fbUsers, nil
228
-}

+ 195
- 16
models/goods/goods.go 查看文件

@@ -26,8 +26,56 @@ func NewGoodsDAO(ctx *utils.Context) *GoodsDAO {
26 26
 	}
27 27
 }
28 28
 
29
+// GetGoodsListPageNavi 获取商品列表
30
+// 管理端接口
31
+func (m *GoodsDAO) GetGoodsListPageNavi(name, typeID, caseID string, limit []int) ([]GoodsWithSpec, int64, error) {
32
+	sql := `
33
+		SELECT *
34
+		FROM
35
+			ta_goods t
36
+		WHERE
37
+			t.case_id = ?
38
+	`
39
+
40
+	if name != "" {
41
+		sql += `
42
+			AND LOWER(t.goods_name) LIKE '%` + name + `%'
43
+		`
44
+	}
45
+
46
+	if typeID != "" {
47
+		sql += `
48
+			AND t.type_id = '` + typeID + `'
49
+		`
50
+	}
51
+
52
+	sql += `		
53
+		AND t.status > ?
54
+		ORDER BY
55
+			t.type_id,
56
+			t.create_date
57
+	`
58
+
59
+	var goodsList []GoodsWithSpec
60
+	cnt, err := utils.NewPageNaviEngine(m.ctx).GetPageList(&goodsList, sql, limit, caseID, models.STATUS_DEL)
61
+	if err != nil {
62
+		return nil, 0, err
63
+	}
64
+
65
+	for inx, goods := range goodsList {
66
+		specs, err := m.GetSpecWithPrice(goods.GoodsId)
67
+		if err != nil {
68
+			return nil, 0, err
69
+		}
70
+
71
+		goodsList[inx].Specs = specs
72
+	}
73
+
74
+	return goodsList, cnt, nil
75
+}
76
+
29 77
 // GetGoodsListOfCase 获取案场商品列表
30
-// 暂时没涉及分页
78
+// 微信端 暂时没涉及分页
31 79
 func (m *GoodsDAO) GetGoodsListOfCase(caseID string) ([]GoodsWithSpec, error) {
32 80
 	var goodsList []GoodsWithSpec
33 81
 
@@ -37,13 +85,8 @@ func (m *GoodsDAO) GetGoodsListOfCase(caseID string) ([]GoodsWithSpec, error) {
37 85
 	}
38 86
 
39 87
 	for inx, goods := range goodsList {
40
-		sql = `SELECT * FROM td_spec t
41
-			JOIN ta_goods_spec s ON t.spec_id = s.spec_id
42
-			WHERE t.status = ? AND s.goods_id = ?
43
-		`
44
-
45
-		var specs []SpecWithPrice
46
-		if err := m.db.SQL(sql, models.STATUS_DEL, goods.GoodsId).Find(&specs); err != nil {
88
+		specs, err := m.GetSpecWithPrice(goods.GoodsId)
89
+		if err != nil {
47 90
 			return nil, err
48 91
 		}
49 92
 
@@ -53,10 +96,23 @@ func (m *GoodsDAO) GetGoodsListOfCase(caseID string) ([]GoodsWithSpec, error) {
53 96
 	return goodsList, nil
54 97
 }
55 98
 
99
+// GetSpecWithPrice 获取商品规格 含 金额
100
+func (m *GoodsDAO) GetSpecWithPrice(goodsID string) ([]SpecWithPrice, error) {
101
+	sql := `SELECT * FROM td_spec t
102
+		JOIN ta_goods_spec s ON t.spec_id = s.spec_id
103
+		WHERE t.status = ? AND s.goods_id = ?
104
+	`
105
+
106
+	var specs []SpecWithPrice
107
+	err := m.db.SQL(sql, models.STATUS_DEL, goodsID).Find(&specs)
108
+
109
+	return specs, err
110
+}
111
+
56 112
 // GetGoodsByID 依据ID 获取商品
57
-func (m *GoodsDAO) GetGoodsByID(id, caseID string) (*model.TaGoods, error) {
113
+func (m *GoodsDAO) GetGoodsByID(id string) (*model.TaGoods, error) {
58 114
 	goods := new(model.TaGoods)
59
-	if _, err := m.db.Where("goods_id=?", id).And("case_id=?", caseID).Get(goods); err != nil {
115
+	if _, err := m.db.Where("goods_id=?", id).Get(goods); err != nil {
60 116
 		return nil, err
61 117
 	}
62 118
 
@@ -85,17 +141,35 @@ func (m *GoodsDAO) GetGoodsWithPriceByID(id, spec, caseID string) (*GoodsWithPri
85 141
 	return goods, nil
86 142
 }
87 143
 
88
-// UpdateGoods 更新商品
89
-func (m *GoodsDAO) UpdateGoods(goods *model.TaGoods, cols []string) error {
90
-	if _, err := m.db.Where("goods_id=?", goods.GoodsId).Cols(cols...).Update(goods); err != nil {
91
-		return err
144
+// GetGoodsWithSpecByID  依据ID 获取商品(含规格)
145
+func (m *GoodsDAO) GetGoodsWithSpecByID(id string) (*GoodsWithSpec, error) {
146
+	goods := new(model.TaGoods)
147
+	if _, err := m.db.Where("goods_id=?", id).Get(goods); err != nil {
148
+		return nil, err
92 149
 	}
93 150
 
94
-	return nil
151
+	var specs []SpecWithPrice
152
+	query := `
153
+		SELECT
154
+			t.*, s.goods_price
155
+		FROM
156
+			td_spec t
157
+		JOIN ta_goods_spec s ON t.spec_id = s.spec_id
158
+		WHERE
159
+			s.goods_id = ?
160
+	`
161
+	if err := m.db.SQL(query, id).Find(&specs); err != nil {
162
+		return nil, err
163
+	}
164
+
165
+	return &GoodsWithSpec{
166
+		TaGoods: *goods,
167
+		Specs:   specs,
168
+	}, nil
95 169
 }
96 170
 
97 171
 // SaveGoods 保存商品
98
-func (m *GoodsDAO) SaveGoods(goods *model.TaGoods) error {
172
+func (m *GoodsDAO) SaveGoods(goods *model.TaGoods, images []string, specs []SpecWithPrice) error {
99 173
 	userRaw := m.ctx.Get("user")
100 174
 	if userRaw == nil {
101 175
 		return errors.New("登录异常, 请登出重试")
@@ -108,9 +182,114 @@ func (m *GoodsDAO) SaveGoods(goods *model.TaGoods) error {
108 182
 	goods.CreateUser = user.UserId
109 183
 	goods.OrgId = user.OrgId
110 184
 
185
+	// 商品图片
186
+	if images != nil && len(images) > 0 {
187
+		goodsImages := make([]model.TaGoodsImg, 0)
188
+
189
+		for _, img := range images {
190
+			goodsImages = append(goodsImages, model.TaGoodsImg{
191
+				ImgId:   guid.NewGUIDString(),
192
+				GoodsId: goods.GoodsId,
193
+				ImgUrl:  img,
194
+				Status:  models.STATUS_NORMAL,
195
+			})
196
+		}
197
+
198
+		if _, err := m.db.Insert(&goodsImages); err != nil {
199
+			return err
200
+		}
201
+	}
202
+
203
+	// 规格
204
+	if specs != nil && len(specs) > 0 {
205
+		goodsSpecs := make([]model.TaGoodsSpec, 0)
206
+
207
+		for _, spec := range specs {
208
+			goodsSpecs = append(goodsSpecs, model.TaGoodsSpec{
209
+				SpecId:     spec.SpecId,
210
+				GoodsId:    goods.GoodsId,
211
+				GoodsPrice: spec.GoodsPrice,
212
+			})
213
+		}
214
+
215
+		if _, err := m.db.Insert(&goodsSpecs); err != nil {
216
+			return err
217
+		}
218
+	}
219
+
111 220
 	if _, err := m.db.Insert(goods); err != nil {
112 221
 		return err
113 222
 	}
114 223
 
115 224
 	return nil
116 225
 }
226
+
227
+// UpdateGoods 更新商品
228
+func (m *GoodsDAO) UpdateGoods(goods *model.TaGoods, images []string, specs []SpecWithPrice) error {
229
+	cols := []string{
230
+		"goods_name",
231
+		"type_id",
232
+		"status",
233
+	}
234
+
235
+	// 商品图片
236
+	if images != nil && len(images) > 0 {
237
+		// 先清除旧数据
238
+		if _, err := m.db.Delete(&model.TaGoodsImg{GoodsId: goods.GoodsId}); err != nil {
239
+			return err
240
+		}
241
+
242
+		goodsImages := make([]model.TaGoodsImg, 0)
243
+		for _, img := range images {
244
+			goodsImages = append(goodsImages, model.TaGoodsImg{
245
+				ImgId:   guid.NewGUIDString(),
246
+				GoodsId: goods.GoodsId,
247
+				ImgUrl:  img,
248
+				Status:  models.STATUS_NORMAL,
249
+			})
250
+		}
251
+
252
+		if _, err := m.db.Insert(&goodsImages); err != nil {
253
+			return err
254
+		}
255
+	}
256
+
257
+	// 规格
258
+	if specs != nil && len(specs) > 0 {
259
+		// 先清除旧数据
260
+		if _, err := m.db.Delete(&model.TaGoodsSpec{GoodsId: goods.GoodsId}); err != nil {
261
+			return err
262
+		}
263
+
264
+		goodsSpecs := make([]model.TaGoodsSpec, 0)
265
+		for _, spec := range specs {
266
+			goodsSpecs = append(goodsSpecs, model.TaGoodsSpec{
267
+				SpecId:     spec.SpecId,
268
+				GoodsId:    goods.GoodsId,
269
+				GoodsPrice: spec.GoodsPrice,
270
+			})
271
+		}
272
+
273
+		if _, err := m.db.Insert(&goodsSpecs); err != nil {
274
+			return err
275
+		}
276
+	}
277
+
278
+	if _, err := m.db.Where("goods_id=?", goods.GoodsId).Cols(cols...).Update(goods); err != nil {
279
+		return err
280
+	}
281
+
282
+	return nil
283
+}
284
+
285
+// DeleteGoods 删除商品
286
+func (m *GoodsDAO) DeleteGoods(id string) error {
287
+	goods := new(model.TaGoods)
288
+	goods.Status = models.STATUS_DEL
289
+
290
+	if _, err := m.db.Where("goods_id=?", id).Cols("status").Update(goods); err != nil {
291
+		return err
292
+	}
293
+
294
+	return nil
295
+}

+ 57
- 0
models/goods/orders.go 查看文件

@@ -12,6 +12,11 @@ import (
12 12
 	"github.com/yl10/kit/guid"
13 13
 )
14 14
 
15
+// GetOrdersByCases 获取案场订单列表
16
+func (m *GoodsDAO) GetOrdersByCases() error {
17
+	return nil
18
+}
19
+
15 20
 // SaveOrders 下单
16 21
 func (m *GoodsDAO) SaveOrders(order *model.TaGoodsOrders) error {
17 22
 	if order.UserId == "" {
@@ -110,3 +115,55 @@ func (m *GoodsDAO) getCaseByID(caseID string) (*model.SysCase, error) {
110 115
 
111 116
 	return cs, nil
112 117
 }
118
+
119
+// GetOrdersByCaseID 获取订单列表
120
+func (m *GoodsDAO) GetOrdersByCaseID(caseID, userType string, makeStatus []string, orderDate []time.Time, limit []int) ([]OrdersWithGoods, int64, error) {
121
+	var orderList []OrdersWithGoods
122
+
123
+	query := "select * from ta_goods_orders where case_id = ? and status = ?"
124
+
125
+	// 制作状态
126
+	if makeStatus != nil && len(makeStatus) > 0 {
127
+		query += ` and make_status in ('` + strings.Join(makeStatus, "','") + `')`
128
+	}
129
+
130
+	// 用户类型
131
+	if userType != "" {
132
+		query += ` and user_type = '` + userType + `'`
133
+	}
134
+
135
+	// 订单起始时间
136
+	if orderDate != nil && len(orderDate) > 0 {
137
+		query += ` and DATE_FORMAT(create_date, '%Y-%m-%d %H:%i') >= '` + orderDate[0].Format("2006-01-02 15:04") + `'`
138
+
139
+		if len(orderDate) > 1 {
140
+			query += ` and DATE_FORMAT(create_date, '%Y-%m-%d %H:%i') <= '` + orderDate[1].Format("2006-01-02 15:04") + `'`
141
+		}
142
+	}
143
+
144
+	query += " order by create_date asc"
145
+
146
+	var cnt int64
147
+	if limit != nil && len(limit) > 1 {
148
+		var err error
149
+		cnt, err = utils.NewPageNaviEngine(m.ctx).GetPageList(&orderList, query, limit, caseID, models.STATUS_NORMAL)
150
+		if err != nil {
151
+			return nil, 0, err
152
+		}
153
+	} else {
154
+		if err := m.db.SQL(query, caseID, models.STATUS_NORMAL).Find(&orderList); err != nil {
155
+			return nil, 0, err
156
+		}
157
+	}
158
+
159
+	for i, o := range orderList {
160
+		var details []model.TaGoodsOrdersDetail
161
+		if err := m.db.Where("orders_id=?", o.OrdersId).Find(&details); err != nil {
162
+			return nil, 0, err
163
+		}
164
+
165
+		orderList[i].Goods = details
166
+	}
167
+
168
+	return orderList, cnt, nil
169
+}

+ 15
- 1
models/goods/types.go 查看文件

@@ -4,10 +4,18 @@ import (
4 4
 	"spaceofcheng/services/models/model"
5 5
 )
6 6
 
7
+// 商品订单 - 制作状态
8
+const (
9
+	MAKESTATUS_NOTSTARTED = "not started"
10
+	MAKESTATUS_DOING      = "doing"
11
+	MAKESTATUS_FINISHED   = "finished"
12
+	MAKESTATUS_CANCEL     = "cancel"
13
+)
14
+
7 15
 // SpecWithPrice 规格价格
8 16
 type SpecWithPrice struct {
9 17
 	model.TdSpec
10
-	GoodsPrice float32 `xorm:"FLOAT(8,2)"`
18
+	GoodsPrice string `xorm:"DECIMAL(8,2)"`
11 19
 }
12 20
 
13 21
 // GoodsWithSpec 含规格商品
@@ -21,3 +29,9 @@ type GoodsWithPrice struct {
21 29
 	model.TaGoods     `xorm."extends"`
22 30
 	model.TaGoodsSpec `xorm."extends"`
23 31
 }
32
+
33
+// OrdersWithGoods 订单列表
34
+type OrdersWithGoods struct {
35
+	model.TaGoodsOrders
36
+	Goods []model.TaGoodsOrdersDetail
37
+}

+ 1
- 1
models/model/sys_wechat_conf.go 查看文件

@@ -9,6 +9,6 @@ type SysWechatConf struct {
9 9
 	Token  string `xorm:"VARCHAR(50)"`
10 10
 	Aeskey string `xorm:"VARCHAR(100)"`
11 11
 	Wxid   string `xorm:"VARCHAR(50)"`
12
-	Rmark  string `xorm:"TEXT"`
12
+	Remark string `xorm:"TEXT"`
13 13
 	Status int    `xorm:"SMALLINT(6)"`
14 14
 }

+ 1
- 0
models/model/ta_goods_orders.go 查看文件

@@ -25,4 +25,5 @@ type TaGoodsOrders struct {
25 25
 	IsPay        int       `xorm:"TINYINT(1)"`
26 26
 	ActualAmount string    `xorm:"DECIMAL(8,2)"`
27 27
 	CouponAmount string    `xorm:"DECIMAL(8,2)"`
28
+	MakeStatus   string    `xorm:"VARCHAR(20)"`
28 29
 }

+ 42
- 0
models/system/user.go 查看文件

@@ -378,3 +378,45 @@ func (m *UserDAO) UpdateUserMapping(userMap *model.TaUserMapping, cols []string)
378 378
 	_, err := m.db.Where("mapping_id=?", userMap.MappingId).Cols(cols...).Update(userMap)
379 379
 	return err
380 380
 }
381
+
382
+type UserWithType struct {
383
+	model.SysUser
384
+	TypeId   string
385
+	TypeName string
386
+	CaseId   string
387
+}
388
+
389
+// GetUserWithTypeByID 获取用户类型
390
+func (m *UserDAO) GetUserWithTypeByID(userID string) ([]UserWithType, error) {
391
+	query := `
392
+		SELECT
393
+			t.*, m.type_id,
394
+			m.type_name,
395
+			m.case_id
396
+		FROM
397
+			sys_user t
398
+		JOIN sys_user_type s ON t.user_id = s.user_id
399
+		JOIN td_user_type m ON s.type_id = m.type_id
400
+		AND m.status = ?
401
+		WHERE
402
+			t.user_id = ?
403
+	`
404
+
405
+	var userTypes []UserWithType
406
+	if err := m.db.SQL(query, models.STATUS_NORMAL, userID).Find(&userTypes); err != nil {
407
+		return nil, err
408
+	}
409
+
410
+	return userTypes, nil
411
+}
412
+
413
+// GetForbidUserByUserID 查询禁用人员
414
+func (m *UserDAO) GetForbidUserByUserID(userID string) ([]model.TaForbidUser, error) {
415
+	var fbUsers []model.TaForbidUser
416
+
417
+	if err := m.db.Where("user_id=?", userID).Find(&fbUsers); err != nil {
418
+		return nil, err
419
+	}
420
+
421
+	return fbUsers, nil
422
+}

+ 9
- 0
routers/common.go 查看文件

@@ -175,6 +175,15 @@ func getCommonRoutes() beego.LinkNamespace {
175 175
 		beego.NSRouter("/detail", &course.CourseController{}, "put:SaveDetail"),
176 176
 		beego.NSRouter("/detail/:detailid", &course.CourseController{}, "delete:DelCourseDetail"),
177 177
 
178
+		// 商品
179
+		beego.NSRouter("/goods", &goods.GoodsController{}, "get:GetListByCase"),
180
+		beego.NSRouter("/goods", &goods.GoodsController{}, "post:UpdateGoods"),
181
+		beego.NSRouter("/goods/:id", &goods.GoodsController{}, "put:UpdateGoods"),
182
+		beego.NSRouter("/goods/:id", &goods.GoodsController{}, "delete:UpdateGoods"),
183
+
184
+		// 商品订单
185
+		beego.NSRouter("/order/goods", &goods.GoodsController{}, "get:GetListByCase"),
186
+
178 187
 		// 文件
179 188
 		beego.NSRouter("/file", &controllers.BaseController{}, "post:FileUpload"),
180 189
 

+ 7
- 0
routers/guest.go 查看文件

@@ -4,6 +4,7 @@ import (
4 4
 	"spaceofcheng/services/controllers"
5 5
 	"spaceofcheng/services/controllers/cases"
6 6
 	"spaceofcheng/services/controllers/customer"
7
+	"spaceofcheng/services/controllers/goods"
7 8
 	"spaceofcheng/services/controllers/message"
8 9
 	"spaceofcheng/services/controllers/user"
9 10
 
@@ -22,6 +23,12 @@ func getGuestRoutes() beego.LinkNamespace {
22 23
 		// 案场
23 24
 		beego.NSRouter("/case", &cases.CaseController{}, "get:GetOrgCases"),
24 25
 
26
+		// 商品制作状态
27
+		beego.NSRouter("/dict/order/makestatus", &goods.GoodsController{}, "get:GetMakeStatus"),
28
+
29
+		// 商品
30
+		beego.NSRouter("/goods", &goods.GoodsController{}, "get:GetListForWechat"),
31
+
25 32
 		// 验证码 获取, 校验
26 33
 		beego.NSRouter("/captcha", &controllers.BaseController{}, "get:SendCaptcha"),
27 34
 		beego.NSRouter("/captcha", &controllers.BaseController{}, "post:ValidCaptcha"),

+ 4
- 3
service/customer/customer.go 查看文件

@@ -156,13 +156,14 @@ func (s *CustomerServ) BindWechatCust(userMap *model.TaUserMapping, phone, caseI
156 156
 		return nil, errors.New("用户状态不正确")
157 157
 	}
158 158
 
159
-	// triggerRegiteEvent 触发注册事件
160
-	utils.EmitEvent(events.EvtRegiste, *cust)
161
-
159
+	// 如果客户ID 与映射表中一致, 说明已经绑定过了
162 160
 	if cust.CustomerId == userMap.UserId {
163 161
 		return cust, nil
164 162
 	}
165 163
 
164
+	// triggerRegiteEvent 触发注册事件
165
+	utils.EmitEvent(events.EvtRegiste, *cust)
166
+
166 167
 	// 更新用户映射信息
167 168
 	userMap.UserId = cust.CustomerId
168 169
 	if err := s.dao.UpdateUserMapping(userMap, []string{"user_id"}); err != nil {

+ 87
- 0
service/goods/goods.go 查看文件

@@ -1,10 +1,15 @@
1 1
 package goods
2 2
 
3 3
 import (
4
+	"errors"
5
+	"spaceofcheng/services/models"
4 6
 	"spaceofcheng/services/models/cases"
5 7
 	"spaceofcheng/services/models/customer"
6 8
 	"spaceofcheng/services/models/goods"
9
+	"spaceofcheng/services/models/model"
10
+	"spaceofcheng/services/models/system"
7 11
 	"spaceofcheng/services/utils"
12
+	"strings"
8 13
 )
9 14
 
10 15
 // GoodsServ 系统处理
@@ -13,6 +18,7 @@ type GoodsServ struct {
13 18
 	dao     *goods.GoodsDAO
14 19
 	caseDAO *cases.CaseDAO
15 20
 	custDAO *customer.CustomerDAO
21
+	userDAO *system.UserDAO
16 22
 }
17 23
 
18 24
 // NewGoodsServ 初始化
@@ -22,5 +28,86 @@ func NewGoodsServ(ctx *utils.Context) *GoodsServ {
22 28
 		dao:     goods.NewGoodsDAO(ctx),
23 29
 		caseDAO: cases.NewCaseDAO(ctx),
24 30
 		custDAO: customer.NewCustomerDAO(ctx),
31
+		userDAO: system.NewUserDAO(ctx),
25 32
 	}
26 33
 }
34
+
35
+// GetListByCase 获取商品列表
36
+// 微信端
37
+func (s *GoodsServ) GetListByCase(id string) ([]goods.GoodsWithSpec, error) {
38
+	res, err := s.dao.GetGoodsListOfCase(id)
39
+
40
+	if err != nil {
41
+		utils.LogError("获取商品列表失败: " + err.Error())
42
+		return nil, errors.New("获取列表失败, 请重试")
43
+	}
44
+
45
+	return res, nil
46
+}
47
+
48
+// GetGoodsListPageNavi 获取商品列表
49
+// 前端 - 非统计部分
50
+func (s *GoodsServ) GetGoodsListPageNavi(name, typeID, caseID string, page, pagesize int) ([]goods.GoodsWithSpec, int64, error) {
51
+	if page < 1 {
52
+		page = 1
53
+	}
54
+	if pagesize < 0 {
55
+		pagesize = 0
56
+	}
57
+
58
+	offset := (page - 1) * pagesize
59
+
60
+	res, cnt, err := s.dao.GetGoodsListPageNavi(strings.ToLower(name), typeID, caseID, []int{pagesize, offset})
61
+	if err != nil {
62
+		utils.LogError("获取商品列表失败: " + err.Error())
63
+		return nil, 0, errors.New("获取列表失败, 请重试")
64
+	}
65
+
66
+	return res, cnt, nil
67
+}
68
+
69
+// UpdateGoods 更新商品
70
+// 如果没有则新增
71
+func (s *GoodsServ) UpdateGoods(goods *model.TaGoods, images []string, specs []goods.SpecWithPrice) error {
72
+	if err := utils.NewAuthEngine(s.ctx).CheckCase(goods.CaseId); err != nil {
73
+		return err
74
+	}
75
+
76
+	if goods.GoodsId == "" {
77
+		if err := s.dao.SaveGoods(goods, images, specs); err != nil {
78
+			utils.LogError("保存商品失败: " + err.Error())
79
+			return errors.New("保存商品失败, 请重试")
80
+		}
81
+	} else {
82
+		if err := s.dao.UpdateGoods(goods, images, specs); err != nil {
83
+			utils.LogError("更新商品失败: " + err.Error())
84
+			return errors.New("更新商品失败, 请重试")
85
+		}
86
+	}
87
+
88
+	return nil
89
+}
90
+
91
+// DeleteGoods 删除商品
92
+func (s *GoodsServ) DeleteGoods(id string) error {
93
+	goods, err := s.dao.GetGoodsByID(id)
94
+	if err != nil {
95
+		utils.LogError("查询商品失败: " + err.Error())
96
+		return errors.New("校验商品失败")
97
+	}
98
+
99
+	if goods.Status == models.STATUS_DEL {
100
+		return nil
101
+	}
102
+
103
+	if err := utils.NewAuthEngine(s.ctx).CheckCase(goods.CaseId); err != nil {
104
+		return err
105
+	}
106
+
107
+	if err := s.dao.DeleteGoods(id); err != nil {
108
+		utils.LogError("删除商品失败: " + err.Error())
109
+		return errors.New("删除商品失败")
110
+	}
111
+
112
+	return nil
113
+}

+ 82
- 1
service/goods/orders.go 查看文件

@@ -3,9 +3,11 @@ package goods
3 3
 import (
4 4
 	"errors"
5 5
 	"spaceofcheng/services/models"
6
+	"spaceofcheng/services/models/goods"
6 7
 	"spaceofcheng/services/models/model"
7 8
 	"spaceofcheng/services/utils"
8 9
 	"strconv"
10
+	"time"
9 11
 )
10 12
 
11 13
 // Orders 下单
@@ -72,6 +74,10 @@ func (s *GoodsServ) Orders(
72 74
 		}
73 75
 	}
74 76
 
77
+	// TODO
78
+	// 通知后端有新订单 - websocket
79
+	// utils.SendMessage()
80
+
75 81
 	return nil
76 82
 }
77 83
 
@@ -148,7 +154,32 @@ func (s *GoodsServ) validOrdersInfo(info *model.TaGoodsOrders) error {
148 154
 
149 155
 	// 如果是管理人员
150 156
 	if cust.UserId != "" {
151
-		fibUsers, err := s.custDAO.GetForbidUserByUserID(cust.UserId)
157
+		// 查找用户类型
158
+		userWithTypes, err := s.userDAO.GetUserWithTypeByID(cust.UserId)
159
+		if err != nil {
160
+			utils.LogError("查询下单人类型出错: " + err.Error())
161
+			return errors.New("验证下单人出错")
162
+		}
163
+		if userWithTypes != nil && len(userWithTypes) > 0 {
164
+			for _, ut := range userWithTypes {
165
+				if ut.Status != models.STATUS_NORMAL {
166
+					return errors.New("下单人状态不正确, 不能下单")
167
+				}
168
+
169
+				if ut.CaseId == caseID {
170
+					info.UserType = ut.TypeId
171
+
172
+					// 下单人姓名 - 姓名不存在则用昵称
173
+					info.UserName = ut.RealName
174
+					if info.UserName == "" {
175
+						info.UserName = cust.CustomerName
176
+					}
177
+				}
178
+			}
179
+		}
180
+
181
+		// 查找禁用名单
182
+		fibUsers, err := s.userDAO.GetForbidUserByUserID(cust.UserId)
152 183
 		if err != nil {
153 184
 			utils.LogError("查询下单人是否被禁出错: " + err.Error())
154 185
 			return errors.New("验证下单人出错")
@@ -202,3 +233,53 @@ func (s *GoodsServ) validBillCharges(info *model.TaGoodsOrders, details []model.
202 233
 
203 234
 	return nil
204 235
 }
236
+
237
+// GetOrderList 获取订单列表
238
+// 管理端 - 查询统计
239
+func (s *GoodsServ) GetOrderList(caseID, userType, status string, orderDate []time.Time, page, pagesize int) ([]goods.OrdersWithGoods, int64, error) {
240
+	if err := utils.NewAuthEngine(s.ctx).CheckCase(caseID); err != nil {
241
+		return nil, 0, err
242
+	}
243
+
244
+	var makeStatus []string
245
+	if status != "" {
246
+		makeStatus = []string{status}
247
+	}
248
+
249
+	if page < 1 {
250
+		page = 1
251
+	}
252
+	if pagesize < 0 {
253
+		pagesize = 0
254
+	}
255
+	limit := []int{
256
+		pagesize,
257
+		(page - 1) * pagesize,
258
+	}
259
+
260
+	orderList, cnt, err := s.dao.GetOrdersByCaseID(caseID, userType, makeStatus, orderDate, limit)
261
+	if err != nil {
262
+		utils.LogError("获取商品订单列表失败: " + err.Error())
263
+		return nil, 0, errors.New("获取商品订单列表失败")
264
+	}
265
+
266
+	return orderList, cnt, nil
267
+}
268
+
269
+// GetOnLineOrders 获取订单列表
270
+// 管理端 - 在线订单
271
+func (s *GoodsServ) GetOnLineOrders(caseID string) ([]goods.OrdersWithGoods, error) {
272
+	if err := utils.NewAuthEngine(s.ctx).CheckCase(caseID); err != nil {
273
+		return nil, err
274
+	}
275
+
276
+	makeStatus := []string{goods.MAKESTATUS_NOTSTARTED, goods.MAKESTATUS_DOING}
277
+
278
+	orderList, _, err := s.dao.GetOrdersByCaseID(caseID, "", makeStatus, nil, nil)
279
+	if err != nil {
280
+		utils.LogError("获取在线订单列表失败: " + err.Error())
281
+		return nil, errors.New("获取在线订单列表失败")
282
+	}
283
+
284
+	return orderList, nil
285
+}

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

@@ -113,6 +113,7 @@ func (s *SysServ) CheckWechatUserMapping(user map[string]interface{}) (*model.Ta
113 113
 			if userMapping.Openid == um.Openid &&
114 114
 				userMapping.AccountType == um.AccountType &&
115 115
 				userMapping.UserType == um.UserType {
116
+				userMapping.UserId = um.UserId
116 117
 
117 118
 				// 存在的用户, 使用 ID 作为检查条件去更新
118 119
 				userMapping.MappingId = um.MappingId
@@ -123,7 +124,6 @@ func (s *SysServ) CheckWechatUserMapping(user map[string]interface{}) (*model.Ta
123 124
 	// 更新数据库内容, 没有的话则插入
124 125
 	err = s.dao.UpdateUserMapping(&userMapping)
125 126
 	if err != nil {
126
-		beego.Error(err)
127 127
 		return nil, err
128 128
 	}
129 129
 

+ 23
- 0
utils/permission.go 查看文件

@@ -25,6 +25,29 @@ func NewAuthEngine(ctx *Context) *DataAuthEngine {
25 25
 	return &DataAuthEngine{ctx: ctx}
26 26
 }
27 27
 
28
+// CheckCase 校验案场数据权限
29
+func (t *DataAuthEngine) CheckCase(caseID string) error {
30
+	cases := t.ctx.Get("cases")
31
+	if cases == nil {
32
+		return errors.New("请授权用户案场权限")
33
+	}
34
+
35
+	found := false
36
+	userCases := cases.([]model.SysUserCase)
37
+
38
+	for _, cs := range userCases {
39
+		if caseID == cs.CaseId {
40
+			found = true
41
+		}
42
+	}
43
+
44
+	if !found {
45
+		return errors.New("用户无该案场数据权限")
46
+	}
47
+
48
+	return nil
49
+}
50
+
28 51
 // AuthFilter 按权限过滤
29 52
 func (t *DataAuthEngine) AuthFilter(targ interface{}, sql string, params ...interface{}) error {
30 53
 	if t.ctx == nil {

+ 17
- 11
utils/wechat.go 查看文件

@@ -4,20 +4,26 @@ import (
4 4
 	"github.com/zjxpcyc/wechat/wx"
5 5
 )
6 6
 
7
-var wxCli *wx.Client
7
+var wxClients map[string]*wx.Client
8 8
 
9
-// InitWeChatClient 初始化
10
-func InitWeChatClient(cert map[string]string) {
11
-	wxCli = wx.NewClient(cert)
12
-	wx.SetLogInst(defaultLogger)
9
+// WxClientSingleton 初始化
10
+func WxClientSingleton(org string, cert map[string]string) {
11
+	if wxClients == nil {
12
+		wxClients = map[string]*wx.Client{
13
+			org: wx.NewClient(cert),
14
+		}
15
+	} else {
16
+		if _, ok := wxClients[org]; !ok {
17
+			wxClients[org] = wx.NewClient(cert)
18
+		}
19
+	}
13 20
 }
14 21
 
15
-// GetWxUserInfo 微信获取用户信息
16
-func GetWxUserInfo(code string) (map[string]interface{}, error) {
17
-	return wxCli.GetUserInfo(code)
22
+// WxClientFor 微信客户端
23
+func WxClientFor(org string) *wx.Client {
24
+	return wxClients[org]
18 25
 }
19 26
 
20
-// WechatSignature 启用 Wechat 接口
21
-func WechatSignature(timestamp, nonce string) string {
22
-	return wxCli.Signature(timestamp, nonce)
27
+func init() {
28
+	wx.SetLogInst(defaultLogger)
23 29
 }