|
@@ -2,6 +2,7 @@ package service
|
|
|
|
|
|
import (
|
|
import (
|
|
"app.yhyue.com/moapp/jybase/common"
|
|
"app.yhyue.com/moapp/jybase/common"
|
|
|
|
+ "app.yhyue.com/moapp/jybase/date"
|
|
"app.yhyue.com/moapp/jybase/encrypt"
|
|
"app.yhyue.com/moapp/jybase/encrypt"
|
|
"app.yhyue.com/moapp/jybase/redis"
|
|
"app.yhyue.com/moapp/jybase/redis"
|
|
"encoding/json"
|
|
"encoding/json"
|
|
@@ -520,7 +521,7 @@ func QueryHandle(isAdmin bool, startTime, endTime int64, personArrStr string, so
|
|
if len(source) > 0 {
|
|
if len(source) > 0 {
|
|
sourceArr := []string{}
|
|
sourceArr := []string{}
|
|
for i := 0; i < len(source); i++ {
|
|
for i := 0; i < len(source); i++ {
|
|
- sourceArr = append(sourceArr, fmt.Sprintf(" FIND_IN_SET('%s', a.source)", source[i]))
|
|
|
|
|
|
+ sourceArr = append(sourceArr, fmt.Sprintf(" FIND_IN_SET('%d', a.source)", source[i]))
|
|
}
|
|
}
|
|
query = append(query, fmt.Sprintf(" (%s) ", strings.Join(sourceArr, " or ")))
|
|
query = append(query, fmt.Sprintf(" (%s) ", strings.Join(sourceArr, " or ")))
|
|
}
|
|
}
|
|
@@ -535,7 +536,7 @@ func (in *ParticipateStatistics) ProjectDetails(entUserIdArr []string, detailReq
|
|
queryType := GetQueryType(detailReq)
|
|
queryType := GetQueryType(detailReq)
|
|
query, countQuery := GetDetailQuery(isAdmin, personArrStr, detailReq, queryType)
|
|
query, countQuery := GetDetailQuery(isAdmin, personArrStr, detailReq, queryType)
|
|
totalCount := IC.BaseMysql.CountBySql(countQuery)
|
|
totalCount := IC.BaseMysql.CountBySql(countQuery)
|
|
- if totalCount == 0 {
|
|
|
|
|
|
+ if totalCount <= 0 {
|
|
return
|
|
return
|
|
}
|
|
}
|
|
// 处理数据 这里只是筛选出项目id和阶段信息
|
|
// 处理数据 这里只是筛选出项目id和阶段信息
|
|
@@ -558,16 +559,21 @@ func (in *ParticipateStatistics) ProjectDetails(entUserIdArr []string, detailReq
|
|
// 这个查询只用查出符合筛选条件的项目id 以及该项目对应的stage
|
|
// 这个查询只用查出符合筛选条件的项目id 以及该项目对应的stage
|
|
// 查询类型 0空搜索 全连接 1查左边 连右表查stage 2只查右表 3内连接
|
|
// 查询类型 0空搜索 全连接 1查左边 连右表查stage 2只查右表 3内连接
|
|
func GetDetailQuery(isAdmin bool, personArrStr string, req *bxcore.ProjectDetailsReq, queryType int) (string, string) {
|
|
func GetDetailQuery(isAdmin bool, personArrStr string, req *bxcore.ProjectDetailsReq, queryType int) (string, string) {
|
|
-
|
|
|
|
|
|
+ // 处理分页
|
|
|
|
+ if req.PageNum == 0 && req.PageSize == 0 {
|
|
|
|
+ req.PageNum = 1
|
|
|
|
+ req.PageSize = 50
|
|
|
|
+ }
|
|
// 这是因为数据库中 0是未参标 1是已参标, 接收参数时和其他默认参数保持一致 0-全部 1 是未参标 2 是已参标
|
|
// 这是因为数据库中 0是未参标 1是已参标, 接收参数时和其他默认参数保持一致 0-全部 1 是未参标 2 是已参标
|
|
req.IsParticipate -= 1
|
|
req.IsParticipate -= 1
|
|
if queryType == 0 {
|
|
if queryType == 0 {
|
|
// 空搜索调整
|
|
// 空搜索调整
|
|
- query1, query2, query3 := []string{}, []string{}, []string{}
|
|
|
|
|
|
+ query1, query2 := []string{}, []string{}
|
|
|
|
+ query3 := ""
|
|
//没有传时间,默认时间处理
|
|
//没有传时间,默认时间处理
|
|
- var start = time.Now().AddDate(0, 0, -30)
|
|
|
|
- query1 = append(query1, fmt.Sprintf(" a.ymd >= %s ", start.Format("20060102")))
|
|
|
|
- query2 = append(query2, fmt.Sprintf(" b.update_date >= %s ", start.Format("20060102")))
|
|
|
|
|
|
+ var start = time.Now().AddDate(0, 0, -300)
|
|
|
|
+ query1 = append(query1, fmt.Sprintf(" a.ymd >= %s ", start.Local().Format("20060102")))
|
|
|
|
+ query2 = append(query2, fmt.Sprintf(" b.update_date >= '%s' ", start.Local().Format(date.Date_Full_Layout)))
|
|
if isAdmin {
|
|
if isAdmin {
|
|
//是管理员
|
|
//是管理员
|
|
query1 = append(query1, fmt.Sprintf(" a.ent_user_id in (%s) ", personArrStr))
|
|
query1 = append(query1, fmt.Sprintf(" a.ent_user_id in (%s) ", personArrStr))
|
|
@@ -578,9 +584,9 @@ func GetDetailQuery(isAdmin bool, personArrStr string, req *bxcore.ProjectDetail
|
|
}
|
|
}
|
|
if len(personArr) > 0 {
|
|
if len(personArr) > 0 {
|
|
personStr := strings.Join(personArr, " or ")
|
|
personStr := strings.Join(personArr, " or ")
|
|
- query2 = append(query2, fmt.Sprintf(" (%s)"))
|
|
|
|
- query3 = append(query3, fmt.Sprintf(" (%s)", personStr))
|
|
|
|
|
|
+ query2 = append(query2, fmt.Sprintf(" (%s)", personStr))
|
|
}
|
|
}
|
|
|
|
+ query3 = fmt.Sprintf("b.ent_id='%d'", req.EntId) // 连接时右表的条件
|
|
} else {
|
|
} else {
|
|
//不是管理员
|
|
//不是管理员
|
|
query1 = append(query1, fmt.Sprintf(" a.position_id = %s ", personArrStr))
|
|
query1 = append(query1, fmt.Sprintf(" a.position_id = %s ", personArrStr))
|
|
@@ -591,27 +597,31 @@ func GetDetailQuery(isAdmin bool, personArrStr string, req *bxcore.ProjectDetail
|
|
}
|
|
}
|
|
if len(personArr) > 0 {
|
|
if len(personArr) > 0 {
|
|
personStr := strings.Join(personArr, " or ")
|
|
personStr := strings.Join(personArr, " or ")
|
|
- query2 = append(query2, fmt.Sprintf(" (%s)"))
|
|
|
|
- query3 = append(query3, fmt.Sprintf(" (%s)", personStr))
|
|
|
|
|
|
+ query2 = append(query2, fmt.Sprintf(" (%s)", personStr))
|
|
}
|
|
}
|
|
|
|
+ if req.PositionType > 0 {
|
|
|
|
+ query3 = fmt.Sprintf("b.ent_id='%d'", req.EntId) // 连接时右表的条件
|
|
|
|
+ } else {
|
|
|
|
+ query3 = fmt.Sprintf("b.position_ids='%d'", req.PositionId) // 连接时右表的条件
|
|
|
|
+ }
|
|
|
|
+
|
|
}
|
|
}
|
|
q := `SELECT A.project_id, B.stage
|
|
q := `SELECT A.project_id, B.stage
|
|
FROM
|
|
FROM
|
|
(SELECT DISTINCT(project_id)
|
|
(SELECT DISTINCT(project_id)
|
|
FROM
|
|
FROM
|
|
- (SELECT project_id FROM participate_push_statistics
|
|
|
|
|
|
+ (SELECT project_id FROM participate_push_statistics a
|
|
WHERE %s UNION
|
|
WHERE %s UNION
|
|
SELECT project_id
|
|
SELECT project_id
|
|
- FROM participate_stage_statistics
|
|
|
|
|
|
+ FROM participate_stage_statistics b
|
|
WHERE %s)
|
|
WHERE %s)
|
|
LIMIT %d , %d) A
|
|
LIMIT %d , %d) A
|
|
LEFT JOIN
|
|
LEFT JOIN
|
|
- participate_stage_statistics B ON A.project_id = B.project_id where %s`
|
|
|
|
- q2 := "select distinct(position_id) from participate_push_statistics where %s union select project_id from participate_stage_statistics where %s "
|
|
|
|
|
|
+ participate_stage_statistics B ON A.project_id = B.project_id and %s` // and 连接前对右表过滤
|
|
|
|
+ q2 := "select count(project_id) from (select distinct(project_id) from participate_push_statistics a where %s union select project_id from participate_stage_statistics b where %s )"
|
|
q1Str := strings.Join(query1, " and ")
|
|
q1Str := strings.Join(query1, " and ")
|
|
q2Str := strings.Join(query2, " and ")
|
|
q2Str := strings.Join(query2, " and ")
|
|
- q3Str := strings.Join(query3, " and ")
|
|
|
|
- return fmt.Sprintf(q, q1Str, q2Str, q3Str), fmt.Sprintf(q2, q1Str, q2Str)
|
|
|
|
|
|
+ return fmt.Sprintf(q, q1Str, q2Str, (req.PageNum-1)*req.PageSize, req.PageSize, query3), fmt.Sprintf(q2, q1Str, q2Str)
|
|
}
|
|
}
|
|
var q, qCount string
|
|
var q, qCount string
|
|
query := []string{}
|
|
query := []string{}
|
|
@@ -635,13 +645,13 @@ func GetDetailQuery(isAdmin bool, personArrStr string, req *bxcore.ProjectDetail
|
|
if req.StartTime == 0 && req.EndTime == 0 {
|
|
if req.StartTime == 0 && req.EndTime == 0 {
|
|
//没有传时间,默认时间处理
|
|
//没有传时间,默认时间处理
|
|
var start = time.Now().AddDate(0, 0, -30)
|
|
var start = time.Now().AddDate(0, 0, -30)
|
|
- query = append(query, fmt.Sprintf(" a.ymd >= %s ", start.Format("20060102")))
|
|
|
|
|
|
+ query = append(query, fmt.Sprintf(" a.ymd >= %s ", start.Local().Format("20060102")))
|
|
}
|
|
}
|
|
if req.StartTime != 0 {
|
|
if req.StartTime != 0 {
|
|
query = append(query, fmt.Sprintf(" a.ymd >= %d ", req.StartTime))
|
|
query = append(query, fmt.Sprintf(" a.ymd >= %d ", req.StartTime))
|
|
}
|
|
}
|
|
if req.EndTime != 0 {
|
|
if req.EndTime != 0 {
|
|
- query = append(query, fmt.Sprintf(" a.ymd <= %d ", req.EndTime))
|
|
|
|
|
|
+ query = append(query, fmt.Sprintf(" a.ymd < %d ", req.EndTime))
|
|
}
|
|
}
|
|
// 标讯/项目来源
|
|
// 标讯/项目来源
|
|
if len(req.Source) > 0 {
|
|
if len(req.Source) > 0 {
|
|
@@ -651,7 +661,7 @@ func GetDetailQuery(isAdmin bool, personArrStr string, req *bxcore.ProjectDetail
|
|
sourceArr = append(sourceArr, fmt.Sprintf(" FIND_IN_SET('%d', a.source)", 1))
|
|
sourceArr = append(sourceArr, fmt.Sprintf(" FIND_IN_SET('%d', a.source)", 1))
|
|
sourceArr = append(sourceArr, fmt.Sprintf(" FIND_IN_SET('%d', a.source)", 2))
|
|
sourceArr = append(sourceArr, fmt.Sprintf(" FIND_IN_SET('%d', a.source)", 2))
|
|
} else {
|
|
} else {
|
|
- sourceArr = append(sourceArr, fmt.Sprintf(" FIND_IN_SET('%s', a.source)", sourceArr[i]))
|
|
|
|
|
|
+ sourceArr = append(sourceArr, fmt.Sprintf(" FIND_IN_SET('%d', a.source)", req.Source[i]))
|
|
}
|
|
}
|
|
}
|
|
}
|
|
query = append(query, fmt.Sprintf(" (%s) ", strings.Join(sourceArr, " or ")))
|
|
query = append(query, fmt.Sprintf(" (%s) ", strings.Join(sourceArr, " or ")))
|
|
@@ -677,18 +687,35 @@ func GetDetailQuery(isAdmin bool, personArrStr string, req *bxcore.ProjectDetail
|
|
if len(personArr) > 0 {
|
|
if len(personArr) > 0 {
|
|
personStr := strings.Join(personArr, " or ")
|
|
personStr := strings.Join(personArr, " or ")
|
|
query = append(query, personStr)
|
|
query = append(query, personStr)
|
|
-
|
|
|
|
}
|
|
}
|
|
} else {
|
|
} else {
|
|
//不是管理员
|
|
//不是管理员
|
|
query = append(query, fmt.Sprintf(" FIND_IN_SET('%s', b.position_ids)", personArrStr))
|
|
query = append(query, fmt.Sprintf(" FIND_IN_SET('%s', b.position_ids)", personArrStr))
|
|
}
|
|
}
|
|
|
|
+ // 右连接无默认时间时
|
|
|
|
+ if req.BidUpdateStartTime == 0 && req.BidUpdateEndTime == 0 {
|
|
|
|
+ var start = time.Now().AddDate(0, 0, -30)
|
|
|
|
+ query = append(query, fmt.Sprintf(" b.update_date >= '%s' ", start.Local().Format(date.Date_Full_Layout)))
|
|
|
|
+ }
|
|
|
|
+
|
|
// 参标状态更新时间
|
|
// 参标状态更新时间
|
|
- if req.BidUpdateStartTime != "" {
|
|
|
|
- query = append(query, fmt.Sprintf("b.update_date > %s", req.BidUpdateStartTime))
|
|
|
|
|
|
+ if req.BidUpdateStartTime != 0 {
|
|
|
|
+ bidStart_, err := time.ParseInLocation(date.Date_yyyyMMdd, fmt.Sprintf("%d", req.BidUpdateStartTime), time.Local)
|
|
|
|
+ if err != nil {
|
|
|
|
+ bidStart_ = time.Now().AddDate(0, 0, -30)
|
|
|
|
+ log.Println("时间转换失败,使用默认值:", err)
|
|
|
|
+ }
|
|
|
|
+ bidStart := date.FormatDate(&bidStart_, date.Date_Full_Layout)
|
|
|
|
+ query = append(query, fmt.Sprintf("b.update_date >= '%s'", bidStart))
|
|
}
|
|
}
|
|
- if req.BidUpdateEndTime != "" {
|
|
|
|
- query = append(query, fmt.Sprintf("b.update_date > %s", req.BidUpdateStartTime))
|
|
|
|
|
|
+ if req.BidUpdateEndTime != 0 {
|
|
|
|
+ bidEnd_, err := time.ParseInLocation(date.Date_yyyyMMdd, fmt.Sprintf("%d", req.BidUpdateEndTime), time.Local)
|
|
|
|
+ if err != nil {
|
|
|
|
+ bidEnd_ = time.Now().AddDate(0, 0, -30)
|
|
|
|
+ log.Println("时间转换失败,使用默认值:", err)
|
|
|
|
+ }
|
|
|
|
+ bidEnd := date.FormatDate(&bidEnd_, date.Date_Full_Layout)
|
|
|
|
+ query = append(query, fmt.Sprintf("b.update_date < '%s'", bidEnd))
|
|
}
|
|
}
|
|
if req.BidWay != 0 {
|
|
if req.BidWay != 0 {
|
|
query = append(query, fmt.Sprintf("b.bid_way = %d", req.BidWay))
|
|
query = append(query, fmt.Sprintf("b.bid_way = %d", req.BidWay))
|
|
@@ -719,7 +746,7 @@ func GetDetailQuery(isAdmin bool, personArrStr string, req *bxcore.ProjectDetail
|
|
query = append(query, fmt.Sprintf(" a.ymd >= %d ", req.StartTime))
|
|
query = append(query, fmt.Sprintf(" a.ymd >= %d ", req.StartTime))
|
|
}
|
|
}
|
|
if req.EndTime != 0 {
|
|
if req.EndTime != 0 {
|
|
- query = append(query, fmt.Sprintf(" a.ymd <= %d ", req.EndTime))
|
|
|
|
|
|
+ query = append(query, fmt.Sprintf(" a.ymd < %d ", req.EndTime))
|
|
}
|
|
}
|
|
if len(req.Source) > 0 {
|
|
if len(req.Source) > 0 {
|
|
sourceArr := []string{}
|
|
sourceArr := []string{}
|
|
@@ -728,7 +755,7 @@ func GetDetailQuery(isAdmin bool, personArrStr string, req *bxcore.ProjectDetail
|
|
sourceArr = append(sourceArr, fmt.Sprintf(" FIND_IN_SET('%d', a.source)", 1))
|
|
sourceArr = append(sourceArr, fmt.Sprintf(" FIND_IN_SET('%d', a.source)", 1))
|
|
sourceArr = append(sourceArr, fmt.Sprintf(" FIND_IN_SET('%d', a.source)", 2))
|
|
sourceArr = append(sourceArr, fmt.Sprintf(" FIND_IN_SET('%d', a.source)", 2))
|
|
} else {
|
|
} else {
|
|
- sourceArr = append(sourceArr, fmt.Sprintf(" FIND_IN_SET('%s', a.source)", sourceArr[i]))
|
|
|
|
|
|
+ sourceArr = append(sourceArr, fmt.Sprintf(" FIND_IN_SET('%d', a.source)", req.Source[i]))
|
|
}
|
|
}
|
|
}
|
|
}
|
|
query = append(query, fmt.Sprintf(" (%s) ", strings.Join(sourceArr, " or ")))
|
|
query = append(query, fmt.Sprintf(" (%s) ", strings.Join(sourceArr, " or ")))
|
|
@@ -741,12 +768,24 @@ func GetDetailQuery(isAdmin bool, personArrStr string, req *bxcore.ProjectDetail
|
|
if req.BidWay != 0 {
|
|
if req.BidWay != 0 {
|
|
query = append(query, fmt.Sprintf("a.bid_way = %d", req.BidWay))
|
|
query = append(query, fmt.Sprintf("a.bid_way = %d", req.BidWay))
|
|
}
|
|
}
|
|
- // 参标状态更新时间
|
|
|
|
- if req.BidUpdateStartTime != "" {
|
|
|
|
- query = append(query, fmt.Sprintf("b.update_date > %s", req.BidUpdateStartTime))
|
|
|
|
|
|
+ // 参标状态更新时间
|
|
|
|
+ if req.BidUpdateStartTime != 0 {
|
|
|
|
+ bidStart_, err := time.ParseInLocation(date.Date_yyyyMMdd, fmt.Sprintf("%d", req.BidUpdateStartTime), time.Local)
|
|
|
|
+ if err != nil {
|
|
|
|
+ bidStart_ = time.Now().AddDate(0, 0, -30)
|
|
|
|
+ log.Println("时间转换失败,使用默认值:", err)
|
|
|
|
+ }
|
|
|
|
+ bidStart := date.FormatDate(&bidStart_, date.Date_Full_Layout)
|
|
|
|
+ query = append(query, fmt.Sprintf("b.update_date >= '%s'", bidStart))
|
|
}
|
|
}
|
|
- if req.BidUpdateEndTime != "" {
|
|
|
|
- query = append(query, fmt.Sprintf("b.update_date > %s", req.BidUpdateStartTime))
|
|
|
|
|
|
+ if req.BidUpdateEndTime != 0 {
|
|
|
|
+ bidEnd_, err := time.ParseInLocation(date.Date_yyyyMMdd, fmt.Sprintf("%d", req.BidUpdateEndTime), time.Local)
|
|
|
|
+ if err != nil {
|
|
|
|
+ bidEnd_ = time.Now().AddDate(0, 0, -30)
|
|
|
|
+ log.Println("时间转换失败,使用默认值:", err)
|
|
|
|
+ }
|
|
|
|
+ bidEnd := date.FormatDate(&bidEnd_, date.Date_Full_Layout)
|
|
|
|
+ query = append(query, fmt.Sprintf("b.update_date < '%s'", bidEnd))
|
|
}
|
|
}
|
|
q = "select distinct(a.project_id),b.stage,a.id,b.id from participate_push_statistics a inner join participate_stage_statistics b on(b.project_id=a.project_id %s) where %s order by a.id desc,b.id desc"
|
|
q = "select distinct(a.project_id),b.stage,a.id,b.id from participate_push_statistics a inner join participate_stage_statistics b on(b.project_id=a.project_id %s) where %s order by a.id desc,b.id desc"
|
|
qCount = "select count(distinct(a.project_id)) from participate_push_statistics a inner join participate_stage_statistics b on(b.project_id=a.project_id %s) where %s"
|
|
qCount = "select count(distinct(a.project_id)) from participate_push_statistics a inner join participate_stage_statistics b on(b.project_id=a.project_id %s) where %s"
|
|
@@ -755,11 +794,6 @@ func GetDetailQuery(isAdmin bool, personArrStr string, req *bxcore.ProjectDetail
|
|
q = fmt.Sprintf(q, joinStr, strings.Join(query, " and "))
|
|
q = fmt.Sprintf(q, joinStr, strings.Join(query, " and "))
|
|
qCount = fmt.Sprintf(qCount, joinStr, strings.Join(query, " and "))
|
|
qCount = fmt.Sprintf(qCount, joinStr, strings.Join(query, " and "))
|
|
}
|
|
}
|
|
- // 处理分页
|
|
|
|
- if req.PageNum == 0 && req.PageSize == 0 {
|
|
|
|
- req.PageNum = 1
|
|
|
|
- req.PageSize = 50
|
|
|
|
- }
|
|
|
|
q = fmt.Sprintf("%s limit %d,%d", q, (req.PageNum-1)*req.PageSize, req.PageSize)
|
|
q = fmt.Sprintf("%s limit %d,%d", q, (req.PageNum-1)*req.PageSize, req.PageSize)
|
|
return q, qCount
|
|
return q, qCount
|
|
}
|
|
}
|
|
@@ -875,17 +909,17 @@ FROM participate_push_statistics A inner join (SELECT
|
|
// IsParticipate 接收参数时 0 全部 1 未参标 2已参标 数据库中 未参标是0
|
|
// IsParticipate 接收参数时 0 全部 1 未参标 2已参标 数据库中 未参标是0
|
|
func GetQueryType(in *bxcore.ProjectDetailsReq) int {
|
|
func GetQueryType(in *bxcore.ProjectDetailsReq) int {
|
|
// TODO 调整
|
|
// TODO 调整
|
|
- if in.BidUpdateStartTime == "" && in.BidUpdateEndTime == "" && in.StartTime == 0 && in.EndTime == 0 && in.IsParticipate == -1 && in.BidWay == 0 && len(in.Source) == 0 {
|
|
|
|
|
|
+ if in.BidUpdateStartTime == 0 && in.BidUpdateEndTime == 0 && in.StartTime == 0 && in.EndTime == 0 && in.IsParticipate == 0 && in.BidWay == 0 && len(in.Source) == 0 {
|
|
return 0
|
|
return 0
|
|
}
|
|
}
|
|
if in.IsParticipate == 1 {
|
|
if in.IsParticipate == 1 {
|
|
// 未参标只筛选推送表 右表条件无效
|
|
// 未参标只筛选推送表 右表条件无效
|
|
return 1
|
|
return 1
|
|
}
|
|
}
|
|
- if (in.StartTime != 0 || in.EndTime != 0 || len(in.Source) > 0) && (in.BidUpdateStartTime == "" && in.BidUpdateEndTime == "" && in.IsParticipate != 2) {
|
|
|
|
|
|
+ if (in.StartTime != 0 || in.EndTime != 0 || len(in.Source) > 0) && (in.BidUpdateStartTime == 0 && in.BidUpdateEndTime == 0 && in.IsParticipate != 2) {
|
|
return 1
|
|
return 1
|
|
}
|
|
}
|
|
- if (in.StartTime == 0 && in.EndTime == 0 && len(in.Source) == 0) && (in.BidUpdateStartTime != "" || in.BidUpdateEndTime == "" || in.IsParticipate == 2 || in.BidWay != 0) {
|
|
|
|
|
|
+ if (in.StartTime == 0 && in.EndTime == 0 && len(in.Source) == 0) && (in.BidUpdateStartTime != 0 || in.BidUpdateEndTime == 0 || in.IsParticipate == 2 || in.BidWay != 0) {
|
|
return 2
|
|
return 2
|
|
}
|
|
}
|
|
return 3
|
|
return 3
|