Ver código fonte

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

胡轶钦 6 anos atrás
pai
commit
387b6bbb80

+ 2
- 2
conf/db.conf Ver arquivo

@@ -5,7 +5,7 @@ db_type      = mysql
5 5
 con_protocol = tcp
6 6
 
7 7
 ; 数据库地址,可以使用IP
8
-db_addr      = localhost
8
+db_addr      = 192.168.0.122
9 9
 
10 10
 ; 端口
11 11
 db_port      = 3306
@@ -26,4 +26,4 @@ dbprefix     =
26 26
 db_debug     = false
27 27
 
28 28
 ; 字符集
29
-char_set     = utf8
29
+char_set     = utf8mb4

+ 28
- 2
controllers/auth.go Ver arquivo

@@ -75,12 +75,26 @@ func (c *BaseController) authWechat(serv *service.SysServ) {
75 75
 	// 用户微信信息
76 76
 	var wxDetail map[string]interface{}
77 77
 	detailRaw := c.GetSession("wechat_user")
78
+
78 79
 	if detailRaw != nil {
79 80
 		wxDetail = detailRaw.(map[string]interface{})
80 81
 	}
81 82
 
83
+	// DEV MODE
84
+	wxDetail = map[string]interface{}{
85
+		"openid":     " OPENID",
86
+		" nickname":  "NICKNAME",
87
+		"sex":        "1",
88
+		"province":   "PROVINCE",
89
+		"city":       "CITY",
90
+		"country":    "COUNTRY",
91
+		"headimgurl": "http://thirdwx.qlogo.cn/mmopen/g3MonUZtNHkdmzicIlibx6iaFqAc56vxLSUfpb6n5WKSYVY0ChQKkiaJSgQ1dZuTOgvLLrhJbERQQ4eMsv84eavHiaiceqxibJxCfHe/46",
92
+		"unionid":    "o6_bmasdasdsad6_2sgVt7hMZOPfL",
93
+	}
94
+
82 95
 	if custID == "" && wxDetail == nil {
83
-		wxDetail = c.getWechatDetail()
96
+		wxDetail = c.getWechatDetail(serv)
97
+
84 98
 		c.SetSession("wechat_user", wxDetail)
85 99
 	}
86 100
 
@@ -148,16 +162,28 @@ func (c *BaseController) needAuth() bool {
148 162
 }
149 163
 
150 164
 // getWechatDetail 获取微信个人信息详情
151
-func (c *BaseController) getWechatDetail() map[string]interface{} {
165
+func (c *BaseController) getWechatDetail(serv *service.SysServ) map[string]interface{} {
152 166
 	// 微信 code
153 167
 	code := c.GetString("code")
154 168
 	if code == "" {
155 169
 		c.ResponseError(
156 170
 			errors.New("没有接收到微信 code"),
171
+			http.StatusUnauthorized,
172
+		)
173
+	}
174
+
175
+	// TODO
176
+	// 机构先默认写死
177
+	conf, err := serv.GetWeChatConfig("1")
178
+	if err != nil {
179
+		utils.LogError("查询微信配置失败: " + err.Error())
180
+		c.ResponseError(
181
+			errors.New("没有找到微信相关配置"),
157 182
 			http.StatusBadRequest,
158 183
 		)
159 184
 	}
160 185
 
186
+	utils.InitWeChatClient(conf)
161 187
 	usr, err := utils.GetWxUserInfo(code)
162 188
 	if err != nil {
163 189
 		c.ResponseError(

+ 16
- 0
controllers/cases/case.go Ver arquivo

@@ -1,6 +1,7 @@
1 1
 package cases
2 2
 
3 3
 import (
4
+	"errors"
4 5
 	"spaceofcheng/services/controllers"
5 6
 	"spaceofcheng/services/models/model"
6 7
 	"spaceofcheng/services/service/cases"
@@ -66,3 +67,18 @@ func (c *CaseController) DelCase() {
66 67
 	}
67 68
 	c.ResponseJSON("删除成功!")
68 69
 }
70
+
71
+// GetOrgCases 获取机构案场
72
+func (c *CaseController) GetOrgCases() {
73
+	org := c.GetString("org")
74
+	if org == "" {
75
+		c.ResponseError(errors.New("未确定机构"))
76
+	}
77
+
78
+	res, err := c.dao.GetAllCasesAndSales(org)
79
+	if err != nil {
80
+		c.ResponseError(err)
81
+	}
82
+
83
+	c.ResponseJSON(res)
84
+}

+ 0
- 9
controllers/config.go Ver arquivo

@@ -24,15 +24,6 @@ func (c *BaseController) initConfig() {
24 24
 		c.Configer[AliYunConf] = aliConf
25 25
 	}
26 26
 
27
-	// 微信
28
-	clientType := utils.GetClientType(c.Ctx.Request)
29
-	if clientType == utils.ClientWechat {
30
-		wxConf := c.getConfig("conf/wechat.conf")
31
-		if wxConf != nil {
32
-			c.Configer[WeChatConf] = wxConf
33
-		}
34
-	}
35
-
36 27
 	// 短信
37 28
 	smsConf := c.getConfig("conf/sms.conf")
38 29
 	if smsConf != nil {

+ 168
- 0
controllers/course/course.go Ver arquivo

@@ -2,6 +2,7 @@ package course
2 2
 
3 3
 import (
4 4
 	"spaceofcheng/services/controllers"
5
+	"spaceofcheng/services/models/model"
5 6
 	"spaceofcheng/services/service/course"
6 7
 )
7 8
 
@@ -17,3 +18,170 @@ type CourseController struct {
17 18
 func (c *CourseController) Constructor() {
18 19
 	c.dao = course.NewCourseServ(c.Context)
19 20
 }
21
+
22
+// GetCourseList 获取课程列表
23
+func (c *CourseController) GetCourseList() {
24
+	caseids := c.GetString("caseid")
25
+	if caseids == "" {
26
+		cases := c.Context.Get("cases").([]model.SysUserCase)
27
+		caseids = c.GetCaseIDs(cases)
28
+	}
29
+	page, _ := c.GetInt("page")
30
+	pageSize, _ := c.GetInt("pagesize")
31
+	name := c.GetString("name")
32
+	typeid := c.GetString("typeid")
33
+	courses, err := c.dao.GetCourseList(caseids, name, typeid, page, pageSize)
34
+	if err != nil {
35
+		c.ResponseError(err)
36
+	}
37
+	c.ResponseJSON(courses)
38
+}
39
+
40
+// GetCourseByID 获取课程明细
41
+func (c *CourseController) GetCourseByID() {
42
+	courseid := c.GetString(":courseid")
43
+	info, err := c.dao.GetCourseByID(courseid)
44
+	if err != nil {
45
+		c.ResponseError(err)
46
+	}
47
+	c.ResponseJSON(info)
48
+}
49
+
50
+// SaveCourse 保存课程
51
+func (c *CourseController) SaveCourse() {
52
+	course := model.TaCourse{}
53
+	if err := c.ParseForm(&course); err != nil {
54
+		c.ResponseError(err)
55
+	}
56
+	tagids := c.GetString("tagids")
57
+	newinfo, err := c.dao.SaveCourse(course, tagids)
58
+	if err != nil {
59
+		c.ResponseError(err)
60
+	}
61
+	c.ResponseJSON(newinfo)
62
+}
63
+
64
+// DeleteCourse 删除课程
65
+func (c *CourseController) DeleteCourse() {
66
+	courseid := c.GetString(":courseid")
67
+	err := c.dao.DelCourse(courseid)
68
+	if err != nil {
69
+		c.ResponseError(err)
70
+	}
71
+	c.ResponseJSON("删除成功!")
72
+}
73
+
74
+// CoursePublic 课程发布
75
+func (c *CourseController) CoursePublic() {
76
+	courseid := c.GetString(":courseid")
77
+	err := c.dao.CoursePublic(courseid)
78
+	if err != nil {
79
+		c.ResponseError(err)
80
+	}
81
+	c.ResponseJSON("操作成功!")
82
+}
83
+
84
+// CourseUnPublic 课程取消发布
85
+func (c *CourseController) CourseUnPublic() {
86
+	courseid := c.GetString(":courseid")
87
+	err := c.dao.CourseUnPublic(courseid)
88
+	if err != nil {
89
+		c.ResponseError(err)
90
+	}
91
+	c.ResponseJSON("操作成功!")
92
+}
93
+
94
+// GetCourseImgs 获取课程图片
95
+func (c *CourseController) GetCourseImgs() {
96
+	courseid := c.GetString(":courseid")
97
+	imgs, err := c.dao.GetCourseImgs(courseid)
98
+	if err != nil {
99
+		c.ResponseError(err)
100
+	}
101
+	c.ResponseJSON(imgs)
102
+}
103
+
104
+// SaveCourseImg 保存课程图片
105
+func (c *CourseController) SaveCourseImg() {
106
+	img := model.TaCourseImg{}
107
+	if err := c.ParseForm(&img); err != nil {
108
+		c.ResponseError(err)
109
+	}
110
+	newimg, err := c.dao.SaveCourseImg(img)
111
+	if err != nil {
112
+		c.ResponseError(err)
113
+	}
114
+	c.ResponseJSON(newimg)
115
+}
116
+
117
+// DelCourseImg 删除课程图片
118
+func (c *CourseController) DelCourseImg() {
119
+	courseid := c.GetString(":courseid")
120
+	err := c.dao.DelCourseImg(courseid)
121
+	if err != nil {
122
+		c.ResponseError(err)
123
+	}
124
+	c.ResponseJSON("操作成功!")
125
+}
126
+
127
+// GetCourseSchedule 获取课程排期
128
+func (c *CourseController) GetCourseSchedule() {
129
+	name := c.GetString("name")
130
+	caseids := c.GetString("caseid")
131
+	if caseids == "" {
132
+		cases := c.Context.Get("cases").([]model.SysUserCase)
133
+		caseids = c.GetCaseIDs(cases)
134
+	}
135
+	date := c.GetString("date")
136
+	page, _ := c.GetInt("page")
137
+	pageSize, _ := c.GetInt("pagesize")
138
+	list, err := c.dao.GetCourseSchedule(name, caseids, date, page, pageSize)
139
+	if err != nil {
140
+		c.ResponseError(err)
141
+	}
142
+	c.ResponseJSON(list)
143
+}
144
+
145
+// GetDetails 获取所有排课
146
+func (c *CourseController) GetDetails() {
147
+	caseid := c.GetString("caseid")
148
+	date := c.GetString("date")
149
+	list, err := c.dao.GetDetails(caseid, date)
150
+	if err != nil {
151
+		c.ResponseError(err)
152
+	}
153
+	c.ResponseJSON(list)
154
+}
155
+
156
+// GetDetailByID 获取单个排课信息
157
+func (c *CourseController) GetDetailByID() {
158
+	detailid := c.GetString(":detailid")
159
+	detail, err := c.dao.GetDetailByID(detailid)
160
+	if err != nil {
161
+		c.ResponseError(err)
162
+	}
163
+	c.ResponseJSON(detail)
164
+}
165
+
166
+// SaveDetail 保存排课信息
167
+func (c *CourseController) SaveDetail() {
168
+	detail := model.TaCourseDetail{}
169
+	if err := c.ParseForm(&detail); err != nil {
170
+		c.ResponseError(err)
171
+	}
172
+	newdetail, err := c.dao.SaveDetail(detail)
173
+	if err != nil {
174
+		c.ResponseError(err)
175
+	}
176
+	c.ResponseJSON(newdetail)
177
+}
178
+
179
+// DelCourseDetail 删除课程明细
180
+func (c *CourseController) DelCourseDetail() {
181
+	detailid := c.GetString(":detailid")
182
+	err := c.dao.DelCourseDetail(detailid)
183
+	if err != nil {
184
+		c.ResponseError(err)
185
+	}
186
+	c.ResponseJSON("删除成功!")
187
+}

+ 5
- 0
log/common.log Ver arquivo

@@ -20,3 +20,8 @@
20 20
 2018/08/21 13:41:04 [E] 您没有该案场的权限!
21 21
 2018/08/21 14:26:22 [E] 用户登录失败: dial tcp 192.168.0.62:3306: connectex: A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond.
22 22
 2018/08/21 14:27:06 [E] 用户登录失败: dial tcp 192.168.0.62:3306: connectex: A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond.
23
+2018/08/23 19:57:03 [E] 获取人员映射账户失败: Params type error
24
+2018/08/23 19:58:00 [E] 获取人员映射账户失败: Params type error
25
+2018/08/23 19:58:39 [E] 获取人员映射账户失败: Params type error
26
+2018/08/23 20:03:16 [E] 获取人员映射账户失败: Params type error
27
+2018/08/23 20:05:14 [E] 获取人员映射账户失败: Params type error

+ 43
- 0
models/cases/cases.go Ver arquivo

@@ -107,3 +107,46 @@ func (m *CaseDAO) DelCase(caseid string) error {
107 107
 	_, err := m.db.Cols(cols...).Where("case_id=?", caseid).Update(caseinfo)
108 108
 	return err
109 109
 }
110
+
111
+// GetCaseByOrg 获取案场列表
112
+func (m *CaseDAO) GetCaseByOrg(org string) ([]model.SysCase, error) {
113
+	var cs []model.SysCase
114
+
115
+	if err := m.db.Where("org_id=?", org).
116
+		And("status=?", models.STATUS_NORMAL).
117
+		Asc("create_date").
118
+		Find(&cs); err != nil {
119
+		return nil, err
120
+	}
121
+
122
+	return cs, nil
123
+}
124
+
125
+type UserCase struct {
126
+	CaseId   string
127
+	CaseName string
128
+	UserId   string
129
+	UserName string
130
+}
131
+
132
+// GetCaseUserByType 获取案场人员
133
+func (m *CaseDAO) GetCaseUserByType(csIDs []string, typeID string) ([]UserCase, error) {
134
+	query := `
135
+		SELECT n.user_id, n.real_name as user_name, s.case_id, '' as case_name
136
+		FROM
137
+			td_user_type s
138
+		JOIN sys_user_type m ON s.type_id = m.type_id
139
+		JOIN sys_user n ON m.user_id = n.user_id
140
+		AND n.status = ?
141
+		WHERE
142
+			s.case_id IN ('` + strings.Join(csIDs, "','") + `')
143
+		AND s.type_id = ?
144
+	`
145
+
146
+	var users []UserCase
147
+	if err := m.db.SQL(query, models.STATUS_NORMAL, typeID).Find(&users); err != nil {
148
+		return nil, err
149
+	}
150
+
151
+	return users, nil
152
+}

+ 14
- 0
models/constant.go Ver arquivo

@@ -69,3 +69,17 @@ const (
69 69
 	// 推荐
70 70
 	ACCSOURCE_RECOMMEND = "recommend"
71 71
 )
72
+
73
+// 微信配置表
74
+const (
75
+	WECHAT_WX   = "wechat"
76
+	WECHAT_MINI = "mini"
77
+)
78
+
79
+// 人员类型
80
+const (
81
+	// 销售
82
+	USERTYPE_SALES = "sales"
83
+	// 主管
84
+	USERTYPE_MANAGER = "manager"
85
+)

+ 298
- 3
models/course/course.go Ver arquivo

@@ -5,6 +5,8 @@ import (
5 5
 	"spaceofcheng/services/models/model"
6 6
 	"spaceofcheng/services/utils"
7 7
 	"strconv"
8
+	"strings"
9
+	"time"
8 10
 
9 11
 	"github.com/go-xorm/xorm"
10 12
 )
@@ -23,11 +25,304 @@ func NewCourseDAO(ctx *utils.Context) *CourseDAO {
23 25
 	}
24 26
 }
25 27
 
28
+const (
29
+	STATUS_UNPUBLISH = 0
30
+)
31
+
32
+// CourseInfo 课程
33
+type CourseInfo struct {
34
+	model.TaCourse `xorm:"extends"`
35
+	CourseType     string
36
+}
37
+
26 38
 // GetCourseList 获取课程列表
27
-func (m *CourseDAO) GetCourseList(caseids, name, typeid string, page, pageSize int) ([]model.TaCourse, error) {
39
+func (m *CourseDAO) GetCourseList(caseids, name, typeid string, page, pageSize int) ([]CourseInfo, error) {
40
+	var courses []CourseInfo
41
+	sql := `select a.*,b.location_name from ta_course a left join td_cms_image_location b on a.location_id = b.location_id where a.case_id in ('` +
42
+		strings.Replace(caseids, ",", "','", -1) + `') and a.status>` + strconv.Itoa(models.STATUS_DEL)
43
+
44
+	if name != "" {
45
+		sql += ` and a.course_name like '%` + name + `%'`
46
+	}
47
+
48
+	if typeid != "" {
49
+		sql += ` and a.location_id='` + typeid + `'`
50
+	}
51
+
52
+	sql += ` order by create_date desc limit ` + strconv.Itoa((page-1)*pageSize) + `, ` + strconv.Itoa(page*pageSize)
53
+	err := m.db.Sql(sql).Find(&courses)
54
+	return courses, err
55
+}
56
+
57
+// GetCourseCount 获取课程总数
58
+func (m *CourseDAO) GetCourseCount(caseids, name, typeid string) (int, error) {
59
+	var course []model.TaCourse
60
+	dao := m.db.Where("case_id in ('" + strings.Replace(caseids, ",", "','", -1) + "')").And("status>" + strconv.Itoa(models.STATUS_DEL))
61
+
62
+	if name != "" {
63
+		dao.And("course_name like '%" + name + "%'")
64
+	}
65
+
66
+	if typeid != "" {
67
+		dao.And("location_id=?", typeid)
68
+	}
69
+	err := dao.Find(&course)
70
+	if err != nil {
71
+		return 0, err
72
+	}
73
+	if len(course) > 0 {
74
+		return len(course), nil
75
+	}
76
+	return 0, nil
77
+}
78
+
79
+// GetCourseByID 根据ID获取课程
80
+func (m *CourseDAO) GetCourseByID(courseid string) (*model.TaCourse, error) {
81
+	var course []model.TaCourse
82
+	err := m.db.Where("course_id=?", courseid).Find(&course)
83
+	if err != nil {
84
+		return nil, err
85
+	}
86
+	if len(course) > 0 {
87
+		return &course[0], nil
88
+	}
89
+	return nil, nil
90
+}
91
+
92
+// AddCourse 新增课程信息
93
+func (m *CourseDAO) AddCourse(course model.TaCourse) (*model.TaCourse, error) {
94
+	course.CourseId = utils.GetGUID()
95
+	course.CreateDate = time.Now()
96
+	course.Status = STATUS_UNPUBLISH
97
+	user := m.ctx.Get("user").(model.SysUser)
98
+	course.CreateUser = user.UserId
99
+	_, err := m.db.Insert(course)
100
+	return &course, err
101
+}
102
+
103
+// UpdateCourse 修改课程信息
104
+func (m *CourseDAO) UpdateCourse(course model.TaCourse) error {
105
+	var cols = []string{
106
+		"course_name",
107
+		"price",
108
+		"case_id",
109
+		"location_id",
110
+		"course_num",
111
+		"max_num",
112
+		"min_num",
113
+		"begin_date",
114
+		"end_date",
115
+		"course_img",
116
+		"course_desc",
117
+		"remark",
118
+		"is_select",
119
+	}
120
+	_, err := m.db.Cols(cols...).Where("course_id=?", course.CourseId).Update(course)
121
+	return err
122
+}
123
+
124
+// DelCourse 删除课程信息
125
+func (m *CourseDAO) DelCourse(courseid string) error {
126
+	var info = model.TaCourse{
127
+		CourseId: courseid,
128
+		Status:   models.STATUS_DEL,
129
+	}
130
+	var cols = []string{
131
+		"status",
132
+	}
133
+	_, err := m.db.Cols(cols...).Where("course_id=?", courseid).Update(info)
134
+	return err
135
+}
136
+
137
+// CoursePublic 课程发布
138
+func (m *CourseDAO) CoursePublic(courseid string) error {
139
+	var info = model.TaCourse{
140
+		CourseId: courseid,
141
+		Status:   models.STATUS_NORMAL,
142
+	}
143
+	var cols = []string{
144
+		"status",
145
+	}
146
+	_, err := m.db.Cols(cols...).Where("course_id=?", courseid).Update(info)
147
+	return err
148
+}
149
+
150
+// CourseUnPublic 取消课程发布
151
+func (m *CourseDAO) CourseUnPublic(courseid string) error {
152
+	var info = model.TaCourse{
153
+		CourseId: courseid,
154
+		Status:   STATUS_UNPUBLISH,
155
+	}
156
+	var cols = []string{
157
+		"status",
158
+	}
159
+	_, err := m.db.Cols(cols...).Where("course_id=?", courseid).Update(info)
160
+	return err
161
+}
162
+
163
+// GetCourseImgs 获取课程图片
164
+func (m *CourseDAO) GetCourseImgs(courseid string) ([]model.TaCourseImg, error) {
165
+	var imgs []model.TaCourseImg
166
+	err := m.db.Where("course_id=?", courseid).Find(&imgs)
167
+	return imgs, err
168
+}
169
+
170
+// AddCourseImg 新增课程图片
171
+func (m *CourseDAO) AddCourseImg(courseimg model.TaCourseImg) (*model.TaCourseImg, error) {
172
+	courseimg.ImgId = utils.GetGUID()
173
+	_, err := m.db.Insert(courseimg)
174
+	return &courseimg, err
175
+}
176
+
177
+// UpdateCourseImg 修改课程图片
178
+func (m *CourseDAO) UpdateCourseImg(courseimg model.TaCourseImg) error {
179
+	var cols = []string{
180
+		"sort",
181
+	}
182
+	_, err := m.db.Cols(cols...).Where("img_id=?", courseimg.ImgId).Update(courseimg)
183
+	return err
184
+}
185
+
186
+// DelCourseImg 删除课程图片
187
+func (m *CourseDAO) DelCourseImg(imgid string) error {
188
+	sql := `delete from ta_course_img where img_id='` + imgid + `'`
189
+	_, err := m.db.Exec(sql)
190
+	return err
191
+}
192
+
193
+// CourseDetail 课程详情
194
+type CourseDetail struct {
195
+	model.TaCourse `xorm:"extends"`
196
+	CourseTags     []model.TaCourseTag
197
+	CourseImgs     []model.TaCourseImg
198
+	CourseDetail   []model.TaCourseDetail
199
+}
200
+
201
+// GetCourseInfo 获取课程详情
202
+func (m *CourseDAO) GetCourseInfo(courseid string) (*CourseDetail, error) {
203
+	var courses []CourseDetail
204
+	sql := `select * from ta_course where course_id='` + courseid + `'`
205
+	err := m.db.Sql(sql).Find(&courses)
206
+	if err != nil {
207
+		return nil, err
208
+	}
209
+	if len(courses) > 0 {
210
+		return &courses[0], nil
211
+	}
212
+	return nil, nil
213
+}
214
+
215
+// GetCourseDetail 获取课程明细
216
+func (m *CourseDAO) GetCourseDetail(courseid string) ([]model.TaCourseDetail, error) {
217
+	var details []model.TaCourseDetail
218
+	err := m.db.Where("course_id=?", courseid).And("status>" + strconv.Itoa(models.STATUS_DEL)).Find(&details)
219
+	return details, err
220
+}
221
+
222
+// GetDetails 获取所有的排课记录
223
+func (m *CourseDAO) GetDetails(caseid, date string) ([]model.TaCourseDetail, error) {
224
+	var details []model.TaCourseDetail
225
+	err := m.db.Where("status>"+strconv.Itoa(models.STATUS_DEL)).And("DATE_FORMAT(begin_date,'%Y-%m') = ?", date).Find(&details)
226
+	return details, err
227
+}
228
+
229
+// GetCourseSchedule 获取需要排课的记录
230
+func (m *CourseDAO) GetCourseSchedule(name, caseids, date string, page, pageSize int) ([]model.TaCourse, error) {
231
+	var courses []model.TaCourse
232
+	dao := m.db.Where("status=?", STATUS_UNPUBLISH).And("schedule_num<course_num").And(date + " BETWEEN begin_date and end_date")
233
+	if name != "" {
234
+		dao.And("course_name like '%" + name + "%'")
235
+	}
236
+	if caseids != "" {
237
+		dao.And("caseids in ('" + strings.Replace(caseids, ",", "','", -1) + "')")
238
+	}
239
+	err := dao.OrderBy("create_date").Limit(pageSize, (page-1)*pageSize).Find(&courses)
240
+	return courses, err
241
+}
242
+
243
+// GetCourseScheduleCount 获取排课记录数
244
+func (m *CourseDAO) GetCourseScheduleCount(name, caseids, date string) (int, error) {
28 245
 	var courses []model.TaCourse
246
+	dao := m.db.Where("status=?", STATUS_UNPUBLISH).And("schedule_num<course_num").And(date + " BETWEEN begin_date and end_date")
247
+	if name != "" {
248
+		dao.And("course_name like '%" + name + "%'")
249
+	}
250
+	if caseids != "" {
251
+		dao.And("caseids in ('" + strings.Replace(caseids, ",", "','", -1) + "')")
252
+	}
253
+	err := dao.Find(&courses)
254
+	return len(courses), err
255
+}
29 256
 
30
-	m.db.Where("status>" + strconv.Itoa(models.STATUS_DEL)).And("")
257
+// GetDetailByID 获取排课明细
258
+func (m *CourseDAO) GetDetailByID(detailid string) (*model.TaCourseDetail, error) {
259
+	var details []model.TaCourseDetail
260
+	err := m.db.Where("detail_id=?", detailid).And("status>" + strconv.Itoa(models.STATUS_DEL)).Find(&details)
261
+	if err != nil {
262
+		return nil, err
263
+	}
264
+	if len(details) > 0 {
265
+		return &details[0], nil
266
+	}
267
+	return nil, nil
268
+}
269
+
270
+// AddCourseDetail 新增明细
271
+func (m *CourseDAO) AddCourseDetail(detail model.TaCourseDetail) (*model.TaCourseDetail, error) {
272
+	detail.CreateDate = time.Now()
273
+	detail.Status = models.STATUS_NORMAL
274
+	detail.DetailId = utils.GetGUID()
275
+	_, err := m.db.Insert(detail)
276
+	return &detail, err
277
+}
278
+
279
+// UpdateCourseDetail 修改明细
280
+func (m *CourseDAO) UpdateCourseDetail(detail model.TaCourseDetail) error {
281
+	var cols = []string{
282
+		"detail_name",
283
+		"begin_date",
284
+		"end_date",
285
+	}
286
+	_, err := m.db.Cols(cols...).Where("detail_id=?", detail.DetailId).Update(detail)
287
+	return err
288
+}
289
+
290
+// DelCourseDetail 刪除明细
291
+func (m *CourseDAO) DelCourseDetail(detailid string) error {
292
+	var info = model.TaCourseDetail{
293
+		DetailId: detailid,
294
+		Status:   models.STATUS_DEL,
295
+	}
296
+	var cols = []string{
297
+		"status",
298
+	}
299
+	_, err := m.db.Cols(cols...).Where("detail_id=?", detailid).Update(info)
300
+	return err
301
+}
302
+
303
+// DelCourseTag 删除课程对应标签
304
+func (m *CourseDAO) DelCourseTag(courseid string) error {
305
+	sql := `delete from ta_course_tag where course_id='` + courseid + `'`
306
+	_, err := m.db.Exec(sql)
307
+	return err
308
+}
309
+
310
+// SaveCourseTag 保存课程对应标签
311
+func (m *CourseDAO) SaveCourseTag(coursetags []model.TaCourseTag) error {
312
+	_, err := m.db.Insert(coursetags)
313
+	return err
314
+}
315
+
316
+// GetCourseTag 获取课程对应标签
317
+func (m *CourseDAO) GetCourseTag(courseid string) ([]model.TaCourseTag, error) {
318
+	var coursetags []model.TaCourseTag
319
+	err := m.db.Where("course_id=?", courseid).Find(&coursetags)
320
+	return coursetags, err
321
+}
31 322
 
32
-	return courses, nil
323
+// CourseTagSave 保存课程对应标签
324
+func (m *CourseDAO) CourseTagSave(courseid, tagids string) error {
325
+	sql := `insert into ta_course_tag(course_id,tag_id) select '` + courseid + `',tag_id from td_course_tag where tag_id in ('` + strings.Replace(tagids, ",", "','", -1) + `') and status>` + strconv.Itoa(models.STATUS_DEL)
326
+	_, err := m.db.Exec(sql)
327
+	return err
33 328
 }

+ 2
- 17
models/course/tag.go Ver arquivo

@@ -5,7 +5,6 @@ import (
5 5
 	"spaceofcheng/services/models/model"
6 6
 	"spaceofcheng/services/utils"
7 7
 	"strconv"
8
-	"strings"
9 8
 )
10 9
 
11 10
 // GetTagsList 获取标签列表
@@ -29,23 +28,9 @@ func (m *CourseDAO) GetTagsCount(orgid string) (int, error) {
29 28
 }
30 29
 
31 30
 // AddCourseTag 新增课程标签
32
-func (m *CourseDAO) AddCourseTag(tag *model.TdCourseTag) (*model.TdCourseTag, error) {
31
+func (m *CourseDAO) AddCourseTag(tag model.TdCourseTag) (*model.TdCourseTag, error) {
33 32
 	tag.TagId = utils.GetGUID()
34 33
 	tag.Status = models.STATUS_NORMAL
35 34
 	_, err := m.db.Insert(tag)
36
-	return tag, err
37
-}
38
-
39
-// DelCourseTag 删除课程对应标签
40
-func (m *CourseDAO) DelCourseTag(courseid string) error {
41
-	sql := `delete ta_course_tag where course_id='` + courseid + `'`
42
-	_, err := m.db.Exec(sql)
43
-	return err
44
-}
45
-
46
-// CourseTagSave 保存课程对应标签
47
-func (m *CourseDAO) CourseTagSave(courseid, tagids string) error {
48
-	sql := `insert into ta_course_tag(course_id,tag_id) select '` + courseid + `',tag_id from td_course_tag where tag_id in ('` + strings.Replace(tagids, ",", "','", -1) + `') and status>` + strconv.Itoa(models.STATUS_DEL)
49
-	_, err := m.db.Exec(sql)
50
-	return err
35
+	return &tag, err
51 36
 }

+ 3
- 1
models/model/sys_wechat_conf.go Ver arquivo

@@ -3,10 +3,12 @@ package model
3 3
 type SysWechatConf struct {
4 4
 	ConfId string `xorm:"VARCHAR(64)"`
5 5
 	OrgId  string `xorm:"VARCHAR(64)"`
6
-	Type   int    `xorm:"comment('wechat 微信公众号 mini 小程序') SMALLINT(6)"`
6
+	Type   string `xorm:"comment('wechat 微信公众号 mini 小程序') VARCHAR(20)"`
7 7
 	Appid  string `xorm:"VARCHAR(50)"`
8 8
 	Secret string `xorm:"VARCHAR(50)"`
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"`
13
+	Status int    `xorm:"SMALLINT(6)"`
12 14
 }

+ 20
- 19
models/model/ta_course.go Ver arquivo

@@ -5,23 +5,24 @@ import (
5 5
 )
6 6
 
7 7
 type TaCourse struct {
8
-	CourseId     string    `xorm:"not null pk VARCHAR(64)"`
9
-	CourseName   string    `xorm:"VARCHAR(50)"`
10
-	Price        float32   `xorm:"FLOAT(8,2)"`
11
-	OrgId        string    `xorm:"VARCHAR(64)"`
12
-	CaseId       string    `xorm:"VARCHAR(64)"`
13
-	LocationName string    `xorm:"VARCHAR(50)"`
14
-	CourseNum    int       `xorm:"INT(11)"`
15
-	ScheduleNum  int       `xorm:"INT(11)"`
16
-	MaxNum       int       `xorm:"INT(11)"`
17
-	MinNum       int       `xorm:"INT(11)"`
18
-	BeginDate    time.Time `xorm:"DATETIME"`
19
-	EndDate      time.Time `xorm:"DATETIME"`
20
-	CourseImg    string    `xorm:"TEXT"`
21
-	CourseDesc   string    `xorm:"VARCHAR(500)"`
22
-	Remark       string    `xorm:"TEXT"`
23
-	IsSelect     int       `xorm:"TINYINT(1)"`
24
-	Status       int       `xorm:"SMALLINT(6)"`
25
-	CreateDate   time.Time `xorm:"DATETIME"`
26
-	CreateUser   string    `xorm:"VARCHAR(64)"`
8
+	CourseId    string    `xorm:"not null pk VARCHAR(64)"`
9
+	CourseName  string    `xorm:"VARCHAR(50)"`
10
+	Price       float32   `xorm:"FLOAT(8,2)"`
11
+	OrgId       string    `xorm:"VARCHAR(64)"`
12
+	CaseId      string    `xorm:"VARCHAR(64)"`
13
+	LocationId  string    `xorm:"VARCHAR(64)"`
14
+	CourseNum   int       `xorm:"INT(11)"`
15
+	ScheduleNum int       `xorm:"INT(11)"`
16
+	MaxNum      int       `xorm:"INT(11)"`
17
+	MinNum      int       `xorm:"INT(11)"`
18
+	BeginDate   time.Time `xorm:"DATETIME"`
19
+	EndDate     time.Time `xorm:"DATETIME"`
20
+	CourseImg   string    `xorm:"TEXT"`
21
+	CourseDesc  string    `xorm:"VARCHAR(500)"`
22
+	Remark      string    `xorm:"TEXT"`
23
+	IsSelect    int       `xorm:"TINYINT(1)"`
24
+	Status      int       `xorm:"SMALLINT(6)"`
25
+	CreateDate  time.Time `xorm:"DATETIME"`
26
+	CreateUser  string    `xorm:"VARCHAR(64)"`
27
+	SignupNum   int       `xorm:"INT(11)"`
27 28
 }

+ 12
- 1
models/sys.go Ver arquivo

@@ -136,7 +136,7 @@ func (m *SysDAO) UpdateUserMapping(user *model.TaUserMapping) error {
136 136
 	_, err := m.db.Cols(cols...).
137 137
 		Where("account_type=?", user.AccountType).
138 138
 		And("openid=?", user.Openid).
139
-		Update(&user)
139
+		Update(user)
140 140
 	return err
141 141
 }
142 142
 
@@ -154,3 +154,14 @@ func GetCaseByContext(ctx *utils.Context) (string, error) {
154 154
 
155 155
 	return cs.CaseId, nil
156 156
 }
157
+
158
+// GetWeChatConfig 获取微信配置
159
+func (m *SysDAO) GetWeChatConfig(org string) (*model.SysWechatConf, error) {
160
+	conf := new(model.SysWechatConf)
161
+
162
+	if _, err := m.db.Where("org_id=?", org).And("type=?", WECHAT_WX).Get(conf); err != nil {
163
+		return nil, err
164
+	}
165
+
166
+	return conf, nil
167
+}

+ 20
- 2
routers/common.go Ver arquivo

@@ -154,8 +154,26 @@ func getCommonRoutes() beego.LinkNamespace {
154 154
 		beego.NSRouter("/rolemenu/:roleid", &system.RoleController{}, "put:SaveRoleMenus"),
155 155
 
156 156
 		// course 课程
157
-		beego.NSRouter("/course/taglist", &course.CourseController{}, "get:GetCourseTagsByPage"),
158
-		beego.NSRouter("/course/tag", &course.CourseController{}, "get:GetCourseTags"),
157
+		beego.NSRouter("/coursetag", &course.CourseController{}, "get:GetCourseTagsByPage"),
158
+		// beego.NSRouter("/coursetag", &course.CourseController{}, "get:GetCourseTags"),
159
+
160
+		beego.NSRouter("/course", &course.CourseController{}, "get:GetCourseList"),
161
+		beego.NSRouter("/course/:courseid", &course.CourseController{}, "get:GetCourseByID"),
162
+		beego.NSRouter("/course", &course.CourseController{}, "post:SaveCourse"),
163
+		beego.NSRouter("/course", &course.CourseController{}, "put:SaveCourse"),
164
+		beego.NSRouter("/course/:courseid", &course.CourseController{}, "delete:DeleteCourse"),
165
+		beego.NSRouter("/course/:courseid/public", &course.CourseController{}, "put:CoursePublic"),
166
+		beego.NSRouter("/course/:courseid/unpublic", &course.CourseController{}, "get:CourseUnPublic"),
167
+		beego.NSRouter("/courseimg/:courseid", &course.CourseController{}, "get:GetCourseImgs"),
168
+		beego.NSRouter("/courseimg", &course.CourseController{}, "post:SaveCourseImg"),
169
+		beego.NSRouter("/courseimg", &course.CourseController{}, "put:SaveCourseImg"),
170
+		beego.NSRouter("/courseimg/:courseid", &course.CourseController{}, "delete:DelCourseImg"),
171
+		beego.NSRouter("/schedule", &course.CourseController{}, "get:GetCourseSchedule"),
172
+		beego.NSRouter("/detail", &course.CourseController{}, "get:GetDetails"),
173
+		beego.NSRouter("/detail/:detailid", &course.CourseController{}, "get:GetDetailByID"),
174
+		beego.NSRouter("/detail", &course.CourseController{}, "post:SaveDetail"),
175
+		beego.NSRouter("/detail", &course.CourseController{}, "put:SaveDetail"),
176
+		beego.NSRouter("/detail/:detailid", &course.CourseController{}, "delete:DelCourseDetail"),
159 177
 
160 178
 		// 文件
161 179
 		beego.NSRouter("/file", &controllers.BaseController{}, "post:FileUpload"),

+ 1
- 1
routers/guest.go Ver arquivo

@@ -20,7 +20,7 @@ func getGuestRoutes() beego.LinkNamespace {
20 20
 		beego.NSRouter("/cms/news", &message.MessageController{}, "get:GetNewsByLocation"),
21 21
 
22 22
 		// 案场
23
-		beego.NSRouter("/casearea", &cases.CaseController{}, "get:GetAreaByCase"),
23
+		beego.NSRouter("/case", &cases.CaseController{}, "get:GetOrgCases"),
24 24
 
25 25
 		// 验证码 获取, 校验
26 26
 		beego.NSRouter("/captcha", &controllers.BaseController{}, "get:SendCaptcha"),

+ 1
- 64
routers/wechat.go Ver arquivo

@@ -1,11 +1,7 @@
1 1
 package routers
2 2
 
3 3
 import (
4
-	"spaceofcheng/services/controllers"
5 4
 	"spaceofcheng/services/controllers/customer"
6
-	"spaceofcheng/services/controllers/goods"
7
-	"spaceofcheng/services/controllers/message"
8
-	"spaceofcheng/services/controllers/user"
9 5
 
10 6
 	"github.com/astaxie/beego"
11 7
 )
@@ -14,66 +10,7 @@ func getWechatRoutes() beego.LinkNamespace {
14 10
 	prefix := beego.AppConfig.String("api::wechat")
15 11
 
16 12
 	return beego.NSNamespace(prefix,
17
-		// 商品分类
18
-		beego.NSRouter("/type/goods", &goods.GoodsController{}, "get:GetGoodsType"),
19
-		beego.NSRouter("/type/goods/:typeid", &goods.GoodsController{}, "get:GetGoodsTypeByID"),
20
-		beego.NSRouter("/type/goods", &goods.GoodsController{}, "post:SaveGoodsType"),
21
-		beego.NSRouter("/type/goods/:typeid", &goods.GoodsController{}, "put:SaveGoodsType"),
22
-		beego.NSRouter("/type/goods/:typeid", &goods.GoodsController{}, "delete:DelGoodsType"),
23
-
24
-		// 商品规格
25
-		beego.NSRouter("/spec/goods", &goods.GoodsController{}, "get:GetGoodsSpec"),
26
-		beego.NSRouter("/spec/goods/:specid", &goods.GoodsController{}, "get:GetGoodsSpecByID"),
27
-		beego.NSRouter("/spec/goods", &goods.GoodsController{}, "post:SaveGoodsSpec"),
28
-		beego.NSRouter("/spec/goods/:specid", &goods.GoodsController{}, "put:SaveGoodsSpec"),
29
-		beego.NSRouter("/spec/goods/:specid", &goods.GoodsController{}, "delete:DelGoodsSpec"),
30
-
31
-		// 系统用户
32
-		beego.NSRouter("/user", &user.UserController{}, "get:GetUserList"),
33
-		beego.NSRouter("/user/:userid", &user.UserController{}, "get:GetUserByID"),
34
-		beego.NSRouter("/user/:userid/password", &user.UserController{}, "put:UpdatePassword"),
35
-		beego.NSRouter("/user/password/reset", &user.UserController{}, "put:ResetPassword"),
36
-		beego.NSRouter("/signout", &user.UserController{}, "post:SignOut"),
37
-
38
-		// cms 位置
39
-		beego.NSRouter("/cms/area", &message.MessageController{}, "get:GetLocations"),
40
-		beego.NSRouter("/cms/area/:locationid", &message.MessageController{}, "get:GetLocationById"),
41
-		beego.NSRouter("/cms/area", &message.MessageController{}, "post:SaveLocation"),
42
-		beego.NSRouter("/cms/area/:locationid", &message.MessageController{}, "put:SaveLocation"),
43
-		beego.NSRouter("/cms/area/:locationid", &message.MessageController{}, "delete:DelLocation"),
44
-
45
-		// cms
46
-		beego.NSRouter("/cms/info", &message.MessageController{}, "get:GetCmsInfoList"),
47
-		beego.NSRouter("/cms/info/:infoid", &message.MessageController{}, "get:GetCmsInfoByID"),
48
-		beego.NSRouter("/cms/info", &message.MessageController{}, "post:SaveCmsInfo"),
49
-		beego.NSRouter("/cms/info/:infoid", &message.MessageController{}, "put:SaveCmsInfo"),
50
-		beego.NSRouter("/cms/info/:infoid", &message.MessageController{}, "delete:DelCmsInfo"),
51
-
52
-		// cms 图片
53
-		beego.NSRouter("/cms/image", &message.MessageController{}, "get:GetImgList"),
54
-		beego.NSRouter("/cms/image/:imgid", &message.MessageController{}, "get:GetImgByID"),
55
-		beego.NSRouter("/cms/image", &message.MessageController{}, "post:SaveImage"),
56
-		beego.NSRouter("/cms/image/:imgid", &message.MessageController{}, "put:SaveImage"),
57
-		beego.NSRouter("/cms/image/:imgid", &message.MessageController{}, "delete:DelImg"),
58
-
59
-		// cms 消息
60
-		beego.NSRouter("/cms/news", &message.MessageController{}, "get:GetNews"),
61
-		beego.NSRouter("/cms/news/:newsid", &message.MessageController{}, "get:GetNewsByID"),
62
-		beego.NSRouter("/cms/news", &message.MessageController{}, "post:SaveNews"),
63
-		beego.NSRouter("/cms/news/:newsid", &message.MessageController{}, "put:SaveNews"),
64
-		beego.NSRouter("/cms/news/:newsid", &message.MessageController{}, "delete:DelNews"),
65
-
66
-		// cms 案场
67
-		beego.NSRouter("/cms/case", &message.MessageController{}, "get:GetCmsCase"),
68
-		beego.NSRouter("/cms/case/:cmscaseid", &message.MessageController{}, "get:GetCmsCaseByID"),
69
-		beego.NSRouter("/cms/case", &message.MessageController{}, "post:SaveCmsCase"),
70
-		beego.NSRouter("/cms/case/:cmscaseid", &message.MessageController{}, "put:SaveCmsCase"),
71
-		beego.NSRouter("/cms/case/:cmscaseid", &message.MessageController{}, "delete:DelCmsCase"),
72
-
73
-		// 文件
74
-		beego.NSRouter("/file", &controllers.BaseController{}, "post:FileUpload"),
75
-
76 13
 		// 会员
77
-		beego.NSRouter("/customer", &customer.CustomerController{}, "get:CustWXList"),
14
+		beego.NSRouter("/customer", &customer.CustomerController{}, "get:GetCustWXByID"),
78 15
 	)
79 16
 }

+ 27
- 0
service/cases/cases.go Ver arquivo

@@ -1,6 +1,8 @@
1 1
 package cases
2 2
 
3 3
 import (
4
+	"errors"
5
+	"spaceofcheng/services/models"
4 6
 	"spaceofcheng/services/models/cases"
5 7
 	"spaceofcheng/services/models/model"
6 8
 	"spaceofcheng/services/models/system"
@@ -96,3 +98,28 @@ func (s *CaseServ) DelCase(caseid string) error {
96 98
 	err := s.dao.DelCase(caseid)
97 99
 	return err
98 100
 }
101
+
102
+// GetAllCasesAndSales 获取所有案场
103
+func (s *CaseServ) GetAllCasesAndSales(org string) (map[string]interface{}, error) {
104
+	cs, err := s.dao.GetCaseByOrg(org)
105
+	if err != nil {
106
+		utils.LogError("获取案场列表失败: " + err.Error())
107
+		return nil, errors.New("获取案场列表失败")
108
+	}
109
+
110
+	csIDs := []string{}
111
+	for _, c := range cs {
112
+		csIDs = append(csIDs, c.CaseId)
113
+	}
114
+
115
+	users, err := s.dao.GetCaseUserByType(csIDs, models.USERTYPE_SALES)
116
+	if err != nil {
117
+		utils.LogError("获取案场销售失败: " + err.Error())
118
+		return nil, errors.New("获取案场销售失败")
119
+	}
120
+
121
+	return map[string]interface{}{
122
+		"cases": cs,
123
+		"sales": users,
124
+	}, nil
125
+}

+ 327
- 0
service/course/course.go Ver arquivo

@@ -1,8 +1,14 @@
1 1
 package course
2 2
 
3 3
 import (
4
+	"spaceofcheng/services/models"
4 5
 	"spaceofcheng/services/models/course"
6
+	"spaceofcheng/services/models/model"
7
+	"spaceofcheng/services/service"
5 8
 	"spaceofcheng/services/utils"
9
+	"strings"
10
+
11
+	"github.com/astaxie/beego"
6 12
 )
7 13
 
8 14
 // CourseServ 系统处理
@@ -18,3 +24,324 @@ func NewCourseServ(ctx *utils.Context) *CourseServ {
18 24
 		dao: course.NewCourseDAO(ctx),
19 25
 	}
20 26
 }
27
+
28
+// GetCourseList 获取课程列表
29
+func (s *CourseServ) GetCourseList(caseids, name, typeid string, page, pageSize int) (map[string]interface{}, error) {
30
+	if pageSize == 0 {
31
+		pageSize = service.PAGENUM
32
+	}
33
+	if page == 0 {
34
+		page = 1
35
+	}
36
+	list, err := s.dao.GetCourseList(caseids, name, typeid, page, pageSize)
37
+	if err != nil {
38
+		beego.Error(err)
39
+		return nil, err
40
+	}
41
+	total, err := s.dao.GetCourseCount(caseids, name, typeid)
42
+	if err != nil {
43
+		beego.Error(err)
44
+		return nil, err
45
+	}
46
+
47
+	return map[string]interface{}{
48
+		"list":     list,
49
+		"pagesize": pageSize,
50
+		"pagenum":  total,
51
+		"page":     page,
52
+	}, err
53
+}
54
+
55
+// GetCourseByID 获取课程明细
56
+func (s *CourseServ) GetCourseByID(courseid string) (*course.CourseDetail, error) {
57
+	if courseid == "" {
58
+		return nil, utils.LogError("不存在课程信息!")
59
+	}
60
+	info, err := s.dao.GetCourseInfo(courseid)
61
+	if err != nil {
62
+		return nil, err
63
+	}
64
+	if info == nil {
65
+		return nil, utils.LogError("不存在课程信息!")
66
+	}
67
+	if info.Status == models.STATUS_DEL {
68
+		return nil, utils.LogError("课程已被删除!")
69
+	}
70
+
71
+	tags, err := s.dao.GetCourseTag(courseid)
72
+	if err != nil {
73
+		return nil, err
74
+	}
75
+	info.CourseTags = tags
76
+	details, err := s.dao.GetCourseDetail(courseid)
77
+	if err != nil {
78
+		return nil, err
79
+	}
80
+	info.CourseDetail = details
81
+	imgs, err := s.dao.GetCourseImgs(courseid)
82
+	if err != nil {
83
+		return nil, err
84
+	}
85
+	info.CourseImgs = imgs
86
+	return info, nil
87
+}
88
+
89
+// SaveCourse 保存课程信息
90
+func (s *CourseServ) SaveCourse(course model.TaCourse, tagids string) (*model.TaCourse, error) {
91
+	var newInfo *model.TaCourse
92
+	var err error
93
+	if course.CourseName == "" {
94
+		return nil, utils.LogError("课程名称不允许为空!")
95
+	}
96
+	if course.CourseImg == "" {
97
+		return nil, utils.LogError("课程主图不允许为空!")
98
+	}
99
+	if course.LocationId == "" {
100
+		return nil, utils.LogError("课程类型不允许为空!")
101
+	}
102
+	if course.CaseId == "" {
103
+		return nil, utils.LogError("课程案场不允许为空!")
104
+	}
105
+	if course.Price == 0 {
106
+		return nil, utils.LogError("课程价格不允许为0!")
107
+	}
108
+	if course.MinNum == 0 {
109
+		return nil, utils.LogError("最小开课人数不允许为0!")
110
+	}
111
+	if course.MaxNum == 0 {
112
+		return nil, utils.LogError("上课人数不允许为0!")
113
+	}
114
+	if course.MaxNum < course.MinNum {
115
+		return nil, utils.LogError("上课人数不允许小于最小开课人数!")
116
+	}
117
+	if course.CourseNum == 0 {
118
+		return nil, utils.LogError("课时数不允许为0!")
119
+	}
120
+	if course.BeginDate.IsZero() || course.EndDate.IsZero() {
121
+		return nil, utils.LogError("课程时间不允许为空!")
122
+	}
123
+	if course.EndDate.After(course.BeginDate) {
124
+		return nil, utils.LogError("截止时间必须大于开始时间!")
125
+	}
126
+	if tagids == "" {
127
+		return nil, utils.LogError("请选择课程标签!")
128
+	}
129
+	if course.CourseId == "" {
130
+		newInfo, err = s.dao.AddCourse(course)
131
+		if err != nil {
132
+			return nil, err
133
+		}
134
+	} else {
135
+		err = s.dao.UpdateCourse(course)
136
+		if err != nil {
137
+			return nil, err
138
+		}
139
+		newInfo = &course
140
+		err = s.dao.DelCourseTag(course.CourseId)
141
+		if err != nil {
142
+			return nil, err
143
+		}
144
+	}
145
+
146
+	tags := strings.Split(tagids, ",")
147
+	var courseTags []model.TaCourseTag
148
+	for _, tag := range tags {
149
+		arr := strings.Split(tag, ":")
150
+		var tagid = ""
151
+		if len(arr) > 1 {
152
+			tagid = arr[1]
153
+		} else {
154
+			var taginfo = model.TdCourseTag{
155
+				TagName: arr[0],
156
+				OrgId:   course.OrgId,
157
+			}
158
+			newtag, err := s.dao.AddCourseTag(taginfo)
159
+			if err != nil {
160
+				return nil, err
161
+			}
162
+			tagid = newtag.TagId
163
+		}
164
+		var coursetag = model.TaCourseTag{
165
+			CourseId: course.CourseId,
166
+			TagId:    tagid,
167
+		}
168
+		courseTags = append(courseTags, coursetag)
169
+	}
170
+
171
+	if len(courseTags) > 0 {
172
+		err = s.dao.SaveCourseTag(courseTags)
173
+		return nil, err
174
+	}
175
+	return newInfo, nil
176
+}
177
+
178
+// DelCourse 刪除课程信息
179
+func (s *CourseServ) DelCourse(courseid string) error {
180
+	if courseid == "" {
181
+		return utils.LogError("没有对应的课程!")
182
+	}
183
+	err := s.dao.DelCourse(courseid)
184
+	return err
185
+}
186
+
187
+// CoursePublic 课程发布
188
+func (s *CourseServ) CoursePublic(courseid string) error {
189
+	if courseid == "" {
190
+		return utils.LogError("没有对应的课程!")
191
+	}
192
+	info, err := s.dao.GetCourseByID(courseid)
193
+	if err != nil {
194
+		return err
195
+	}
196
+	if info.Status != course.STATUS_UNPUBLISH {
197
+		return utils.LogError("当前课程状态异常!请刷新后重试!")
198
+	}
199
+	err = s.dao.CoursePublic(courseid)
200
+	return err
201
+}
202
+
203
+// CourseUnPublic 课程取消发布
204
+func (s *CourseServ) CourseUnPublic(courseid string) error {
205
+	if courseid == "" {
206
+		return utils.LogError("没有对应的课程!")
207
+	}
208
+	info, err := s.dao.GetCourseByID(courseid)
209
+	if err != nil {
210
+		return err
211
+	}
212
+	if info.Status != models.STATUS_NORMAL {
213
+		return utils.LogError("当前课程状态异常!请刷新后重试!")
214
+	}
215
+	err = s.dao.CourseUnPublic(courseid)
216
+	return err
217
+}
218
+
219
+// GetCourseImgs 获取课程图片
220
+func (s *CourseServ) GetCourseImgs(courseid string) ([]model.TaCourseImg, error) {
221
+	if courseid == "" {
222
+		return nil, utils.LogError("没有对应的课程!")
223
+	}
224
+	imgs, err := s.dao.GetCourseImgs(courseid)
225
+	return imgs, err
226
+}
227
+
228
+// SaveCourseImg 保存课程图片
229
+func (s *CourseServ) SaveCourseImg(img model.TaCourseImg) (*model.TaCourseImg, error) {
230
+	var newinfo *model.TaCourseImg
231
+	var err error
232
+	if img.ImgUrl == "" {
233
+		return nil, utils.LogError("请先上传图片!")
234
+	}
235
+	if img.ImgId == "" {
236
+		newinfo, err = s.dao.AddCourseImg(img)
237
+	} else {
238
+		newinfo = &img
239
+		err = s.dao.UpdateCourseImg(img)
240
+	}
241
+	return newinfo, err
242
+}
243
+
244
+// DelCourseImg 刪除课程图片
245
+func (s *CourseServ) DelCourseImg(imgid string) error {
246
+	if imgid == "" {
247
+		return utils.LogError("没有需要删除的内容!")
248
+	}
249
+	err := s.dao.DelCourseImg(imgid)
250
+	return err
251
+}
252
+
253
+// GetCourseSchedule 获取课程排期
254
+func (s *CourseServ) GetCourseSchedule(name, caseids, date string, page, pageSize int) (map[string]interface{}, error) {
255
+	if pageSize == 0 {
256
+		pageSize = service.PAGENUM
257
+	}
258
+	if page == 0 {
259
+		page = 1
260
+	}
261
+	if date == "" {
262
+		return nil, utils.LogError("请先选择需要排课的日期!")
263
+	}
264
+	list, err := s.dao.GetCourseSchedule(name, caseids, date, page, pageSize)
265
+	if err != nil {
266
+		beego.Error(err)
267
+		return nil, err
268
+	}
269
+	total, err := s.dao.GetCourseScheduleCount(name, caseids, date)
270
+	if err != nil {
271
+		beego.Error(err)
272
+		return nil, err
273
+	}
274
+
275
+	return map[string]interface{}{
276
+		"list":     list,
277
+		"pagesize": pageSize,
278
+		"pagenum":  total,
279
+		"page":     page,
280
+	}, err
281
+}
282
+
283
+// GetDetails 获取所有排课
284
+func (s *CourseServ) GetDetails(caseid, date string) ([]model.TaCourseDetail, error) {
285
+	if caseid == "" {
286
+		return nil, utils.LogError("请先选择案场!")
287
+	}
288
+	if date == "" {
289
+		return nil, utils.LogError("请选择需要查看的月份!")
290
+	}
291
+	details, err := s.dao.GetDetails(caseid, date)
292
+	return details, err
293
+}
294
+
295
+// GetDetailByID 获取单个排课信息
296
+func (s *CourseServ) GetDetailByID(detailid string) (*model.TaCourseDetail, error) {
297
+	if detailid == "" {
298
+		return nil, utils.LogError("没有对应的排课信息!")
299
+	}
300
+	detail, err := s.dao.GetDetailByID(detailid)
301
+	return detail, err
302
+}
303
+
304
+// SaveDetail 保存排课信息
305
+func (s *CourseServ) SaveDetail(detail model.TaCourseDetail) (*model.TaCourseDetail, error) {
306
+	var newinfo *model.TaCourseDetail
307
+	if detail.CourseId == "" {
308
+		return nil, utils.LogError("没有对应的课程信息!")
309
+	}
310
+	if detail.DetailName == "" {
311
+		return nil, utils.LogError("课程名称不能为空!")
312
+	}
313
+	if detail.BeginDate.IsZero() || detail.EndDate.IsZero() {
314
+		return nil, utils.LogError("课程时间不能为空!")
315
+	}
316
+	if detail.BeginDate.After(detail.EndDate) {
317
+		return nil, utils.LogError("课程截止时间必须大于开始时间!")
318
+	}
319
+	if detail.DetailId == "" {
320
+		course, err := s.dao.GetCourseByID(detail.CourseId)
321
+		if err != nil {
322
+			return nil, err
323
+		}
324
+		detail.OrgId = course.OrgId
325
+		detail.CaseId = course.CaseId
326
+		newinfo, err = s.dao.AddCourseDetail(detail)
327
+		if err != nil {
328
+			return nil, err
329
+		}
330
+	} else {
331
+		err := s.dao.UpdateCourseDetail(detail)
332
+		if err != nil {
333
+			return nil, err
334
+		}
335
+		newinfo = &detail
336
+	}
337
+	return newinfo, nil
338
+}
339
+
340
+// DelCourseDetail 删除课程明细
341
+func (s *CourseServ) DelCourseDetail(detailid string) error {
342
+	if detailid == "" {
343
+		return utils.LogError("没有对应的排课信息!")
344
+	}
345
+	err := s.dao.DelCourseDetail(detailid)
346
+	return err
347
+}

+ 21
- 0
service/sys.go Ver arquivo

@@ -2,6 +2,7 @@ package service
2 2
 
3 3
 import (
4 4
 	"encoding/json"
5
+	"errors"
5 6
 	"spaceofcheng/services/models"
6 7
 	"spaceofcheng/services/models/model"
7 8
 	"spaceofcheng/services/utils"
@@ -128,3 +129,23 @@ func (s *SysServ) CheckWechatUserMapping(user map[string]interface{}) (*model.Ta
128 129
 
129 130
 	return &userMapping, nil
130 131
 }
132
+
133
+// GetWeChatConfig 获取微信配置
134
+func (s SysServ) GetWeChatConfig(org string) (map[string]string, error) {
135
+	conf, err := s.dao.GetWeChatConfig(org)
136
+	if err != nil {
137
+		return nil, err
138
+	}
139
+
140
+	if conf.ConfId == "" {
141
+		return nil, errors.New("未找到微信配置")
142
+	}
143
+
144
+	return map[string]string{
145
+		"appid":  conf.Appid,
146
+		"secret": conf.Secret,
147
+		"token":  conf.Token,
148
+		"aeskey": conf.Aeskey,
149
+		"wxid":   conf.Wxid,
150
+	}, nil
151
+}

BIN
swagger.zip Ver arquivo