作者 唐旭辉

Merge branch 'dev' of http://gitlab.fjmaimaimai.com/mmm-go/oppmg into dev

# Conflicts:
#	Dockerfile
@@ -15,4 +15,4 @@ ADD . $APP_DIR @@ -15,4 +15,4 @@ ADD . $APP_DIR
15 RUN cd $APP_DIR && CGO_ENABLED=0 go build -mod=vendor -ldflags '-d -w -s' -o oppmg 15 RUN cd $APP_DIR && CGO_ENABLED=0 go build -mod=vendor -ldflags '-d -w -s' -o oppmg
16 WORKDIR $APP_DIR 16 WORKDIR $APP_DIR
17 EXPOSE 8080 17 EXPOSE 8080
18 -CMD [ "./oppmg" ] 18 +CMD ["./oppmg"]
@@ -69,7 +69,7 @@ func (this *BulletinController) BulletinList() { @@ -69,7 +69,7 @@ func (this *BulletinController) BulletinList() {
69 return 69 return
70 } 70 }
71 rsp, err := bulletin.BulletinList(uid, companyId, request) 71 rsp, err := bulletin.BulletinList(uid, companyId, request)
72 - msg = protocol.NewReturnResponse(rsp, err) 72 + msg = protocol.NewPageDataResponse(rsp, err)
73 } 73 }
74 74
75 //GetBulletin 75 //GetBulletin
@@ -149,3 +149,29 @@ func (this *BulletinController) OperateBulletin() { @@ -149,3 +149,29 @@ func (this *BulletinController) OperateBulletin() {
149 rsp, err := bulletin.OperateBulletin(companyId, request) 149 rsp, err := bulletin.OperateBulletin(companyId, request)
150 msg = protocol.NewReturnResponse(rsp, err) 150 msg = protocol.NewReturnResponse(rsp, err)
151 } 151 }
  152 +
  153 +//BulletinFeedbacks 反馈详情
  154 +//@router /bulletinFeedbacks [post]
  155 +func (this *BulletinController) BulletinFeedbacks() {
  156 + var msg *protocol.ResponseMessage
  157 + defer func() {
  158 + this.ResposeJson(msg)
  159 + }()
  160 + var request *protocol.BulletinFeedbacksRequest
  161 + if err := json.Unmarshal(this.Ctx.Input.RequestBody, &request); err != nil {
  162 + log.Error("json 解析失败", err)
  163 + msg = protocol.BadRequestParam("1")
  164 + return
  165 + }
  166 + if b, m := this.Valid(request); !b {
  167 + msg = m
  168 + return
  169 + }
  170 + companyId := this.GetCompanyId()
  171 + if companyId <= 0 {
  172 + msg = protocol.BadRequestParam("1")
  173 + return
  174 + }
  175 + rsp, err := bulletin.BulletinFeedbacks(companyId, request)
  176 + msg = protocol.NewPageDataResponse(rsp, err)
  177 +}
@@ -2,7 +2,7 @@ @@ -2,7 +2,7 @@
2 export PATH=/root/local/bin:$PATH 2 export PATH=/root/local/bin:$PATH
3 kubectl -n mmm-suplus-dev get pods | grep -q oppmg 3 kubectl -n mmm-suplus-dev get pods | grep -q oppmg
4 if [ "$?" == "1" ];then 4 if [ "$?" == "1" ];then
5 - kubectl create -f /tmp/dev/oppmgmg/oppmg.yaml --record 5 + kubectl create -f /tmp/dev/mmm-go-oppmg/oppmg.yaml --record
6 kubectl -n mmm-suplus-dev get svc | grep -q oppmg 6 kubectl -n mmm-suplus-dev get svc | grep -q oppmg
7 if [ "$?" == "0" ];then 7 if [ "$?" == "0" ];then
8 echo "oppmg service install success!" 8 echo "oppmg service install success!"
@@ -16,7 +16,7 @@ if [ "$?" == "1" ];then @@ -16,7 +16,7 @@ if [ "$?" == "1" ];then
16 echo "oppmg deployment install fail!" 16 echo "oppmg deployment install fail!"
17 fi 17 fi
18 else 18 else
19 - kubectl delete -f /tmp/dev/oppmg/oppmg.yaml 19 + kubectl delete -f /tmp/dev/mmm-go-oppmg/oppmg.yaml
20 kubectl -n mmm-suplus-dev get svc | grep -q oppmg 20 kubectl -n mmm-suplus-dev get svc | grep -q oppmg
21 while [ "$?" == "0" ] 21 while [ "$?" == "0" ]
22 do 22 do
@@ -27,7 +27,7 @@ else @@ -27,7 +27,7 @@ else
27 do 27 do
28 kubectl -n mmm-suplus-dev get pods | grep -q oppmg 28 kubectl -n mmm-suplus-dev get pods | grep -q oppmg
29 done 29 done
30 - kubectl create -f /tmp/dev/oppmg/oppmg.yaml --record 30 + kubectl create -f /tmp/dev/mmm-go-oppmg/oppmg.yaml --record
31 kubectl -n mmm-suplus-dev get svc | grep -q oppmg 31 kubectl -n mmm-suplus-dev get svc | grep -q oppmg
32 if [ "$?" == "0" ];then 32 if [ "$?" == "0" ];then
33 echo "oppmg service update success!" 33 echo "oppmg service update success!"
@@ -46,17 +46,14 @@ spec: @@ -46,17 +46,14 @@ spec:
46 - name: oppmg 46 - name: oppmg
47 image: 192.168.0.243:5000/mmm/oppmg:dev 47 image: 192.168.0.243:5000/mmm/oppmg:dev
48 imagePullPolicy: Always 48 imagePullPolicy: Always
49 - ports:  
50 - - containerPort: 8080  
51 volumeMounts: 49 volumeMounts:
52 - - mountPath: /opt/logs 50 + - mountPath: /opt/logs
53 name: accesslogs 51 name: accesslogs
  52 + - mountPath: /var/www/oppmg/file
  53 + name: mmmjihuitest-pvc1
  54 + ports:
  55 + - containerPort: 8080
54 env: 56 env:
55 - - name: ENTERPRISE_SERVICE_HOST  
56 - valueFrom:  
57 - configMapKeyRef:  
58 - name: suplus-config  
59 - key: service.enterprise  
60 - name: MYSQL_HOST 57 - name: MYSQL_HOST
61 valueFrom: 58 valueFrom:
62 configMapKeyRef: 59 configMapKeyRef:
@@ -67,6 +64,16 @@ spec: @@ -67,6 +64,16 @@ spec:
67 configMapKeyRef: 64 configMapKeyRef:
68 name: suplus-config 65 name: suplus-config
69 key: mysql.port 66 key: mysql.port
  67 + - name: REDIS_HOST
  68 + valueFrom:
  69 + configMapKeyRef:
  70 + name: suplus-config
  71 + key: redis.ip
  72 + - name: REDIS_PORT
  73 + valueFrom:
  74 + configMapKeyRef:
  75 + name: suplus-config
  76 + key: redis.port
70 - name: MYSQL_USER 77 - name: MYSQL_USER
71 valueFrom: 78 valueFrom:
72 configMapKeyRef: 79 configMapKeyRef:
@@ -79,16 +86,17 @@ spec: @@ -79,16 +86,17 @@ spec:
79 key: mysql.password 86 key: mysql.password
80 - name: MYSQL_DB_NAME 87 - name: MYSQL_DB_NAME
81 value: "opportunity_dev" 88 value: "opportunity_dev"
82 - - name: LOG_LEVEL  
83 - value: "debug"  
84 - name: RUN_MODE 89 - name: RUN_MODE
85 value: "test" 90 value: "test"
86 - - name: aliyun_logs_suplus 91 + - name: LOG_LEVEL
  92 + value: "debug"
  93 + - name: aliyun_logs_suplusfile
87 value: "stdout" 94 value: "stdout"
88 - name: aliyun_logs_access 95 - name: aliyun_logs_access
89 - value: "/opt/logs/oppmg.log"  
90 - - name: aliyun_logs_access  
91 - value: "/var/www/opp/file" 96 + value: " /opt/logs/app.log"
92 volumes: 97 volumes:
93 - name: accesslogs 98 - name: accesslogs
94 emptyDir: {} 99 emptyDir: {}
  100 + - name: mmmjihuitest-pvc1
  101 + persistentVolumeClaim:
  102 + claimName: mmmjihuitest-pvc
@@ -14,6 +14,7 @@ type AuditTemplate struct { @@ -14,6 +14,7 @@ type AuditTemplate struct {
14 Name string `orm:"column(name);size(20)" description:"子分类名称"` 14 Name string `orm:"column(name);size(20)" description:"子分类名称"`
15 Doc string `orm:"column(doc);size(255)" description:"说明"` 15 Doc string `orm:"column(doc);size(255)" description:"说明"`
16 Icon string `orm:"column(icon);size(255)" description:"图标"` 16 Icon string `orm:"column(icon);size(255)" description:"图标"`
  17 + Code string `orm:"column(code);size(50)" description:"编码"`
17 NoticeType int8 `orm:"column(notice_type)" description:"通知方式"` 18 NoticeType int8 `orm:"column(notice_type)" description:"通知方式"`
18 NoApprover int8 `orm:"column(no_approver)" description:"审核人空时:【1:自动通过】【2:转交给管理员】"` 19 NoApprover int8 `orm:"column(no_approver)" description:"审核人空时:【1:自动通过】【2:转交给管理员】"`
19 SortNum int `orm:"column(sort_num)" description:"自定义排序编号"` 20 SortNum int `orm:"column(sort_num)" description:"自定义排序编号"`
@@ -2,6 +2,7 @@ package models @@ -2,6 +2,7 @@ package models
2 2
3 import ( 3 import (
4 "fmt" 4 "fmt"
  5 + "oppmg/utils"
5 "time" 6 "time"
6 7
7 "github.com/astaxie/beego/orm" 8 "github.com/astaxie/beego/orm"
@@ -73,3 +74,29 @@ func DeleteBulletinQuestionAnswer(id int) (err error) { @@ -73,3 +74,29 @@ func DeleteBulletinQuestionAnswer(id int) (err error) {
73 } 74 }
74 return 75 return
75 } 76 }
  77 +
  78 +func GetBulletinQuestionAnswers(page, pageSize int, id int, v interface{}) (total int, err error) {
  79 + sql := `select b.*,a.nick_name `
  80 + where := ` from user a INNER JOIN (
  81 +select b.*,a.user_id from user_company a INNER JOIN (
  82 +select answer,update_at,uid from bulletin_question_answer where bulletin_id =? order by update_at desc
  83 +)b on a.id = b.uid
  84 +) b on a.id = b.user_id `
  85 + sqlCount := `select count(0) `
  86 + sqlCount += where
  87 +
  88 + sql += where
  89 + sql += ` limit ?,?`
  90 + if v != nil {
  91 + if err = utils.ExecuteQueryOne(&total, sqlCount, id); err != nil {
  92 + return
  93 + }
  94 + }
  95 + if page == 0 {
  96 + page = 1
  97 + }
  98 + if err = utils.ExecuteQueryAll(v, sql, id, (page-1)*pageSize, pageSize); err != nil {
  99 + return
  100 + }
  101 + return
  102 +}
@@ -11,6 +11,7 @@ type ChanceType struct { @@ -11,6 +11,7 @@ type ChanceType struct {
11 Id int `orm:"column(id);auto"` 11 Id int `orm:"column(id);auto"`
12 Name string `orm:"column(name);size(50)" description:"机会类型名称"` 12 Name string `orm:"column(name);size(50)" description:"机会类型名称"`
13 Icon string `orm:"column(icon);size(500);null" description:"图标地址"` 13 Icon string `orm:"column(icon);size(500);null" description:"图标地址"`
  14 + Code string `orm:"column(code);size(50)" description:"编码"`
14 CompanyId int `orm:"column(company_id)" description:"表company.id 公司编号"` 15 CompanyId int `orm:"column(company_id)" description:"表company.id 公司编号"`
15 SortNum int `orm:"column(sort_num);null" description:"序号 公司下的序号"` 16 SortNum int `orm:"column(sort_num);null" description:"序号 公司下的序号"`
16 CreateAt time.Time `orm:"column(create_at);type(timestamp);null" description:"创建时间 "` 17 CreateAt time.Time `orm:"column(create_at);type(timestamp);null" description:"创建时间 "`
@@ -34,7 +34,7 @@ const ( @@ -34,7 +34,7 @@ const (
34 ) 34 )
35 35
36 const ( 36 const (
37 - DeleteUserMsgSql = "delete from user_msg where company_id=? and msg_type=? and source_id=?" 37 + SqlDeleteUserMsg = "delete from user_msg where company_id=? and msg_type=? and source_id=?"
38 ) 38 )
39 39
40 func (t *UserMsg) TableName() string { 40 func (t *UserMsg) TableName() string {
@@ -86,12 +86,13 @@ type TemplateAddResponse struct { @@ -86,12 +86,13 @@ type TemplateAddResponse struct {
86 } 86 }
87 87
88 type Template struct { 88 type Template struct {
89 - Id int64 `json:"id"` //创建时 0  
90 - ChanceTypeId int `json:"chanceTypeId"` //机会类型编号  
91 - Name string `json:"name"`  
92 - Doc string `json:"doc"`  
93 - Icon string `json:"icon"`  
94 - InputList []*InputElement `json:"inputList"` 89 + Id int64 `json:"id"` //创建时 0
  90 + Code string `json:"code" valid:"Required; MaxSize(6)"`
  91 + ChanceTypeId int `json:"chanceTypeId" valid:"Required;"` //机会类型编号
  92 + Name string `json:"name" valid:"Required;"`
  93 + Doc string `json:"doc" valid:"Required;"`
  94 + Icon string `json:"icon" valid:"Required;"`
  95 + InputList []*InputElement `json:"inputList" valid:"Required;"`
95 } 96 }
96 97
97 /*TemplateUpdate */ 98 /*TemplateUpdate */
@@ -107,6 +108,7 @@ type TemplateListRequest struct { @@ -107,6 +108,7 @@ type TemplateListRequest struct {
107 } 108 }
108 type TemplateListResponse struct { 109 type TemplateListResponse struct {
109 List []*TemplateList `json:"list"` 110 List []*TemplateList `json:"list"`
  111 + //ResponsePageInfo
110 } 112 }
111 113
112 type TemplateList struct { 114 type TemplateList struct {
@@ -145,6 +147,7 @@ type TemplateEditVisibleResponse struct { @@ -145,6 +147,7 @@ type TemplateEditVisibleResponse struct {
145 type TemplateOperateCategoryRequest struct { 147 type TemplateOperateCategoryRequest struct {
146 Id int `json:"id"` 148 Id int `json:"id"`
147 Name string `json:"name"` 149 Name string `json:"name"`
  150 + Code string `json:"code"`
148 Icon string `json:"icon"` 151 Icon string `json:"icon"`
149 } 152 }
150 type TemplateOperateCategoryResponse struct { 153 type TemplateOperateCategoryResponse struct {
@@ -44,22 +44,22 @@ type BulletinReleaseResponse struct { @@ -44,22 +44,22 @@ type BulletinReleaseResponse struct {
44 44
45 /*BulletinList */ 45 /*BulletinList */
46 type BulletinListRequest struct { 46 type BulletinListRequest struct {
47 - Status int8 `json:"status"` //1:待上架 2:上架  
48 - Page int `json:"page"`  
49 - PageSize int `json:"pageSize"` 47 + Status int8 `json:"status"` //1:待上架 2:上架
  48 + RequestPageInfo
50 } 49 }
51 type BulletinListResponse struct { 50 type BulletinListResponse struct {
52 - List []*BulletinItem `json:"list"`  
53 - Total int 51 + List []*BulletinItem `json:"list"`
  52 + //Total int
  53 + ResponsePageInfo
54 } 54 }
55 55
56 type BulletinItem struct { 56 type BulletinItem struct {
57 - Id int `json:"id"`  
58 - Type int8 `json:"type"`  
59 - Title string `json:"title"`  
60 - Status int8 `json:"status"`  
61 - Receiver []Receiver `json:"receiver" valid:"Required"`  
62 - CreateAt string `json:"time"` 57 + Id int `json:"id"`
  58 + Type int8 `json:"type"`
  59 + Title string `json:"title"`
  60 + Status int8 `json:"status"`
  61 + Receiver []VisibleObject `json:"receiver" valid:"Required"`
  62 + CreateAt string `json:"time"`
63 } 63 }
64 64
65 /*GetBulletin */ 65 /*GetBulletin */
@@ -107,3 +107,24 @@ type OperateBulletinRequest struct { @@ -107,3 +107,24 @@ type OperateBulletinRequest struct {
107 } 107 }
108 type OperateBulletinResponse struct { 108 type OperateBulletinResponse struct {
109 } 109 }
  110 +
  111 +/*BulletinFeedbacks 反馈详情*/
  112 +type BulletinFeedbacksRequest struct {
  113 + RequestPageInfo
  114 + Id int `json:"id" valid:"Required"` //公告编号
  115 +}
  116 +type BulletinFeedbacksResponse struct {
  117 + ResponsePageInfo
  118 + List []FeedBackItem `json:"list"`
  119 +}
  120 +
  121 +type FeedBackItem struct {
  122 + Time int64 `json:"time"`
  123 + Name string `json:"name"`
  124 + Content string `json:"content"`
  125 +}
  126 +
  127 +type Answer struct {
  128 + VoteResults []int `json:"voteResults"`
  129 + EditContent string `json:"editContent"`
  130 +}
@@ -52,6 +52,7 @@ func init() { @@ -52,6 +52,7 @@ func init() {
52 beego.NSRouter("/get", &controllers.BulletinController{}, "post:GetBulletin"), 52 beego.NSRouter("/get", &controllers.BulletinController{}, "post:GetBulletin"),
53 beego.NSRouter("/update", &controllers.BulletinController{}, "post:UpdateBulletin"), 53 beego.NSRouter("/update", &controllers.BulletinController{}, "post:UpdateBulletin"),
54 beego.NSRouter("/operate", &controllers.BulletinController{}, "post:OperateBulletin"), 54 beego.NSRouter("/operate", &controllers.BulletinController{}, "post:OperateBulletin"),
  55 + beego.NSRouter("/feedbacks", &controllers.BulletinController{}, "post:BulletinFeedbacks"),
55 ), 56 ),
56 beego.NSNamespace("/common", 57 beego.NSNamespace("/common",
57 beego.NSRouter("/department", &controllers.CommonController{}, "post:SelectorDepartment"), 58 beego.NSRouter("/department", &controllers.CommonController{}, "post:SelectorDepartment"),
@@ -35,6 +35,7 @@ func TemplateAdd(uid, companyId int64, request *protocol.TemplateAddRequest) (rs @@ -35,6 +35,7 @@ func TemplateAdd(uid, companyId int64, request *protocol.TemplateAddRequest) (rs
35 Name: request.Template.Name, 35 Name: request.Template.Name,
36 Doc: request.Template.Doc, 36 Doc: request.Template.Doc,
37 Icon: request.Template.Icon, 37 Icon: request.Template.Icon,
  38 + Code: request.Template.Code,
38 NoApprover: 1, //TODO:配置 39 NoApprover: 1, //TODO:配置
39 SortNum: 0, 40 SortNum: 0,
40 VisibleType: int8(0), 41 VisibleType: int8(0),
@@ -285,6 +286,7 @@ func TemplateOperateCategory(uid, companyId int64, request *protocol.TemplateOpe @@ -285,6 +286,7 @@ func TemplateOperateCategory(uid, companyId int64, request *protocol.TemplateOpe
285 chanceType = &models.ChanceType{ 286 chanceType = &models.ChanceType{
286 Name: request.Name, 287 Name: request.Name,
287 Icon: request.Icon, 288 Icon: request.Icon,
  289 + Code: request.Code,
288 CompanyId: int(companyId), 290 CompanyId: int(companyId),
289 CreateAt: time.Now(), 291 CreateAt: time.Now(),
290 UpdateAt: time.Now(), 292 UpdateAt: time.Now(),
@@ -162,21 +162,22 @@ func BulletinList(uid, companyId int64, request *protocol.BulletinListRequest) ( @@ -162,21 +162,22 @@ func BulletinList(uid, companyId int64, request *protocol.BulletinListRequest) (
162 list []*models.Bulletin 162 list []*models.Bulletin
163 total int 163 total int
164 ) 164 )
165 - if request.Page == 0 {  
166 - request.Page = 1 165 + if request.PageIndex == 0 {
  166 + request.PageIndex += 1
167 } 167 }
168 if request.PageSize == 0 { 168 if request.PageSize == 0 {
169 request.PageSize = 20 169 request.PageSize = 20
170 } 170 }
171 rsp = &protocol.BulletinListResponse{} 171 rsp = &protocol.BulletinListResponse{}
172 - if list, total, err = models.GetBulletins(companyId, request.Status, request.Page, request.PageSize); err != nil { 172 + if list, total, err = models.GetBulletins(companyId, request.Status, request.PageIndex, request.PageSize); err != nil {
173 log.Error(err.Error()) 173 log.Error(err.Error())
174 return 174 return
175 } 175 }
176 if len(list) == 0 { 176 if len(list) == 0 {
177 return 177 return
178 } 178 }
179 - rsp.Total = total 179 + rsp.TotalPage = total
  180 + rsp.CurrentPage = request.PageIndex
180 for i := range list { 181 for i := range list {
181 bulletin := list[i] 182 bulletin := list[i]
182 item := &protocol.BulletinItem{ 183 item := &protocol.BulletinItem{
@@ -186,8 +187,8 @@ func BulletinList(uid, companyId int64, request *protocol.BulletinListRequest) ( @@ -186,8 +187,8 @@ func BulletinList(uid, companyId int64, request *protocol.BulletinListRequest) (
186 Status: int8(bulletin.Status), 187 Status: int8(bulletin.Status),
187 CreateAt: bulletin.CreateAt.Format("2006-01-02 15:04:05"), 188 CreateAt: bulletin.CreateAt.Format("2006-01-02 15:04:05"),
188 } 189 }
189 - if item.Receiver, err = getUsersName(bulletin.Receiver); err != nil {  
190 - log.Error(err.Error()) 190 + if item.Receiver, err = agg.GetVisibleObject(bulletin.Receiver); err != nil {
  191 + log.Error(bulletin.Receiver, err.Error())
191 continue 192 continue
192 } 193 }
193 rsp.List = append(rsp.List, item) 194 rsp.List = append(rsp.List, item)
@@ -374,7 +375,7 @@ func OperateBulletin(companyId int64, request *protocol.OperateBulletinRequest) @@ -374,7 +375,7 @@ func OperateBulletin(companyId int64, request *protocol.OperateBulletinRequest)
374 orm.Begin() 375 orm.Begin()
375 if request.CmdType == protocol.BulletinUnRelease { //下架 376 if request.CmdType == protocol.BulletinUnRelease { //下架
376 status = protocol.BulletinUnRelease 377 status = protocol.BulletinUnRelease
377 - if err = utils.ExecuteSQLWithOrmer(orm, models.DeleteUserMsgSql, companyId, models.MsgTypeBulletin, bulletin.Id); err != nil { 378 + if err = utils.ExecuteSQLWithOrmer(orm, models.SqlDeleteUserMsg, companyId, models.MsgTypeBulletin, bulletin.Id); err != nil {
378 log.Error(err.Error()) 379 log.Error(err.Error())
379 orm.Rollback() 380 orm.Rollback()
380 return 381 return
@@ -397,3 +398,57 @@ func OperateBulletin(companyId int64, request *protocol.OperateBulletinRequest) @@ -397,3 +398,57 @@ func OperateBulletin(companyId int64, request *protocol.OperateBulletinRequest)
397 rsp = &protocol.OperateBulletinResponse{} 398 rsp = &protocol.OperateBulletinResponse{}
398 return 399 return
399 } 400 }
  401 +
  402 +//反馈详情
  403 +func BulletinFeedbacks(companyId int64, request *protocol.BulletinFeedbacksRequest) (rsp *protocol.BulletinFeedbacksResponse, err error) {
  404 + type Feedback struct {
  405 + Answer string `orm:"column(answer);null" description:"答案"`
  406 + Uid int64 `orm:"column(uid);null" description:"用户id"`
  407 + UpdateAt time.Time `orm:"column(update_at);type(timestamp);null" description:"更新时间"`
  408 + NickName string `orm:"column(nick_name);size(100)" description:"昵称"`
  409 + }
  410 + var (
  411 + feedbacks []Feedback
  412 + total int
  413 + answer protocol.Answer
  414 + )
  415 + rsp = &protocol.BulletinFeedbacksResponse{}
  416 + if total, err = models.GetBulletinQuestionAnswers(request.PageIndex, request.PageSize, request.Id, &feedbacks); err != nil {
  417 + if err == orm2.ErrNoRows {
  418 + err = nil
  419 + }
  420 + return
  421 + }
  422 + rsp.CurrentPage = request.PageIndex
  423 + rsp.TotalPage = total
  424 + for i := range feedbacks {
  425 + tmp := feedbacks[i]
  426 + var content string
  427 + var other string
  428 + if err = json.Unmarshal([]byte(tmp.Answer), &answer); err != nil {
  429 + log.Error(err.Error())
  430 + continue
  431 + }
  432 + for i := range answer.VoteResults {
  433 + value := answer.VoteResults[i]
  434 + if value == -1 {
  435 + other = " 其他"
  436 + } else if value < 10 {
  437 + content += string(byte('A') + byte(value) - 1)
  438 + if i+1 < len(answer.VoteResults) {
  439 + content += ","
  440 + }
  441 + }
  442 + }
  443 + content = content + other
  444 + if len(answer.EditContent) != 0 {
  445 + content = fmt.Sprintf("%v (%v)", content, answer.EditContent)
  446 + }
  447 + rsp.List = append(rsp.List, protocol.FeedBackItem{
  448 + Time: tmp.UpdateAt.Unix(),
  449 + Name: tmp.NickName,
  450 + Content: content,
  451 + })
  452 + }
  453 + return
  454 +}