作者 陈志颖

refactor:重构清单排行榜

@@ -383,7 +383,7 @@ func (statisticsService *StatisticsService) EmployeesContributionsStatistics(emp @@ -383,7 +383,7 @@ func (statisticsService *StatisticsService) EmployeesContributionsStatistics(emp
383 } 383 }
384 } 384 }
385 385
386 -// 员工排行榜统计 386 +// TODO 员工排行榜统计
387 func (statisticsService *StatisticsService) EmployeesRankingListStatistics(employeesRankingListStatisticsCommand *command.EmployeesRankingListStatisticsCommand) (interface{}, error) { 387 func (statisticsService *StatisticsService) EmployeesRankingListStatistics(employeesRankingListStatisticsCommand *command.EmployeesRankingListStatisticsCommand) (interface{}, error) {
388 if err := employeesRankingListStatisticsCommand.ValidateCommand(); err != nil { 388 if err := employeesRankingListStatisticsCommand.ValidateCommand(); err != nil {
389 return nil, application.ThrowError(application.ARG_ERROR, err.Error()) 389 return nil, application.ThrowError(application.ARG_ERROR, err.Error())
  1 +package query
  2 +
  3 +import (
  4 + "fmt"
  5 + "github.com/astaxie/beego/validation"
  6 +)
  7 +
  8 +type ExchangeListRankingQuery struct {
  9 + ActivityId int64 `json:"activityId"`
  10 + CompanyId int64 `json:"companyId"` // 公司ID
  11 + Offset int `json:"offset,omitempty"` // 查询偏离量
  12 + Limit int `json:"limit,omitempty"` // 查询限制
  13 + Uid int64 `json:"uid"` // 统一用户id
  14 +}
  15 +
  16 +func (exchangeListRankingQuery *ExchangeListRankingQuery) ValidateCommand() error {
  17 + valid := validation.Validation{}
  18 + b, err := valid.Valid(exchangeListRankingQuery)
  19 + if err != nil {
  20 + return err
  21 + }
  22 + if !b {
  23 + for _, validErr := range valid.Errors {
  24 + return fmt.Errorf("%s %s", validErr.Key, validErr.Message)
  25 + }
  26 + }
  27 + return nil
  28 +}
@@ -1060,7 +1060,7 @@ func (cashPoolService *CashPoolService) GetExchangeCashPerson(getExchangeCashPer @@ -1060,7 +1060,7 @@ func (cashPoolService *CashPoolService) GetExchangeCashPerson(getExchangeCashPer
1060 // 1060 //
1061 //} 1061 //}
1062 1062
1063 -// 返回兑换素币清单列表 1063 +// TODO 返回兑换素币清单列表
1064 func (cashPoolService *CashPoolService) ListExchangeCashPerson(listExchangeCashPersonQuery *query.ListExchangeCashPersonQuery) (interface{}, error) { 1064 func (cashPoolService *CashPoolService) ListExchangeCashPerson(listExchangeCashPersonQuery *query.ListExchangeCashPersonQuery) (interface{}, error) {
1065 if err := listExchangeCashPersonQuery.ValidateQuery(); err != nil { 1065 if err := listExchangeCashPersonQuery.ValidateQuery(); err != nil {
1066 return nil, application.ThrowError(application.ARG_ERROR, err.Error()) 1066 return nil, application.ThrowError(application.ARG_ERROR, err.Error())
@@ -1598,6 +1598,41 @@ func (cashPoolService *CashPoolService) ListExchangeCashPersonById(exportExchang @@ -1598,6 +1598,41 @@ func (cashPoolService *CashPoolService) ListExchangeCashPersonById(exportExchang
1598 } 1598 }
1599 } 1599 }
1600 1600
  1601 +// TODO 员工兑换清单榜单
  1602 +func (cashPoolService *CashPoolService) ExchangeListRanking(exchangeListRankingQuery *query.ExchangeListRankingQuery) (interface{}, error) {
  1603 + if err := exchangeListRankingQuery.ValidateCommand(); err != nil {
  1604 + return nil, application.ThrowError(application.ARG_ERROR, err.Error())
  1605 + }
  1606 + transactionContext, err := factory.CreateTransactionContext(nil)
  1607 + if err != nil {
  1608 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  1609 + }
  1610 + if err := transactionContext.StartTransaction(); err != nil {
  1611 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  1612 + }
  1613 + defer func() {
  1614 + transactionContext.RollbackTransaction()
  1615 + }()
  1616 +
  1617 + var cashPoolDao *dao.CashPoolDao
  1618 + if value, err := factory.CreateCashPoolDao(map[string]interface{}{
  1619 + "transactionContext": transactionContext,
  1620 + }); err != nil {
  1621 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  1622 + } else {
  1623 + cashPoolDao = value
  1624 + }
  1625 +
  1626 + if exchangeCashListRankingStatistics, err := cashPoolDao.ExchangeCashListRanking(tool_funs.SimpleStructToMap(exchangeListRankingQuery)); err != nil {
  1627 + return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
  1628 + } else {
  1629 + if err := transactionContext.CommitTransaction(); err != nil {
  1630 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  1631 + }
  1632 + return exchangeCashListRankingStatistics, nil
  1633 + }
  1634 +}
  1635 +
1601 func NewCashPoolService(options map[string]interface{}) *CashPoolService { 1636 func NewCashPoolService(options map[string]interface{}) *CashPoolService {
1602 newCashPoolService := &CashPoolService{} 1637 newCashPoolService := &CashPoolService{}
1603 return newCashPoolService 1638 return newCashPoolService
@@ -13,6 +13,8 @@ type SearchTaskCommand struct { @@ -13,6 +13,8 @@ type SearchTaskCommand struct {
13 Sponsor int64 `json:"sponsor,omitempty"` 13 Sponsor int64 `json:"sponsor,omitempty"`
14 // 任务内容匹配 14 // 任务内容匹配
15 TaskContentMatch string `json:"taskContentMatch,omitempty"` 15 TaskContentMatch string `json:"taskContentMatch,omitempty"`
  16 + // 任务名称匹配
  17 + TaskNameMatch string `json:"taskNameMatch,omitempty"`
16 // 任务类型 18 // 任务类型
17 TaskType int `json:"taskType,omitempty"` 19 TaskType int `json:"taskType,omitempty"`
18 // 任务类型ID列表 20 // 任务类型ID列表
@@ -77,6 +77,133 @@ func (dao *CashPoolDao) CalculateActivityExchangedSuMoney(activityId int64) (map @@ -77,6 +77,133 @@ func (dao *CashPoolDao) CalculateActivityExchangedSuMoney(activityId int64) (map
77 }, nil 77 }, nil
78 } 78 }
79 79
  80 +// TODO 返回兑换清单榜单
  81 +func (dao *CashPoolDao) ExchangeCashListRanking(queryOptions map[string]interface{}) (map[string]interface{}, error) {
  82 + var retPeople []struct {
  83 + Uid int
  84 + EmployeeName string
  85 + SuMoney float64
  86 + Cash float64
  87 + Ranking int
  88 + }
  89 +
  90 + var retEmployee []struct {
  91 + Uid int
  92 + EmployeeName string
  93 + SuMoney float64
  94 + Cash float64
  95 + Ranking int
  96 + }
  97 +
  98 + tx := dao.transactionContext.PgTx
  99 +
  100 + // 清单人员排名
  101 + exchangeCashPersonListModels := new(models.ExchangeCashPersonList)
  102 + queryPeople := tx.Model(exchangeCashPersonListModels)
  103 + queryPeople = queryPeople.Join("JOIN employees AS e ON e.uid = exchange_cash_person_list.uid")
  104 + queryPeople = queryPeople.ColumnExpr("exchange_cash_person_list.uid AS uid")
  105 + queryPeople = queryPeople.ColumnExpr("exchange_cash_person_list.employee_name AS employee_name")
  106 + queryPeople = queryPeople.ColumnExpr("sum(exchange_cash_person_list.exchanged_cash) AS cash")
  107 + queryPeople = queryPeople.ColumnExpr("sum(exchange_cash_person_list.exchanged_su_money) AS su_money")
  108 + queryPeople = queryPeople.ColumnExpr("RANK() OVER (ORDER BY sum(exchange_cash_person_list.exchanged_su_money) DESC) AS ranking")
  109 + if companyId, ok := queryOptions["companyId"]; ok && (companyId.(int64) != 0) {
  110 + queryPeople = queryPeople.Where("e.company_id = ?", companyId)
  111 + }
  112 + if activityId, ok := queryOptions["activityId"]; ok && (activityId.(int64) != 0){
  113 + queryPeople = queryPeople.Where("exchange_cash_person_list.activity_id = ?", activityId)
  114 + }
  115 + queryPeople = queryPeople.Group("exchange_cash_person_list.uid")
  116 + queryPeople = queryPeople.Group("exchange_cash_person_list.employee_name")
  117 + if offset, ok := queryOptions["offset"]; ok {
  118 + offset := offset.(int)
  119 + if offset > -1 {
  120 + queryPeople = queryPeople.Offset(offset)
  121 + }
  122 + } else {
  123 + queryPeople = queryPeople.Offset(0)
  124 + }
  125 + if limit, ok := queryOptions["limit"]; ok {
  126 + limit := limit.(int)
  127 + if limit > -1 {
  128 + queryPeople = queryPeople.Limit(limit)
  129 + }
  130 + } else {
  131 + queryPeople = queryPeople.Limit(20)
  132 + }
  133 +
  134 + if err := queryPeople.Order("su_money DESC").Select(&retPeople); err != nil {
  135 + return nil, err
  136 + }
  137 +
  138 + // 当前员工排名
  139 + queryEmployee := tx.Model(exchangeCashPersonListModels)
  140 + queryEmployee = queryEmployee.Join("JOIN employees AS e ON e.uid = exchange_cash_person_list.uid")
  141 + queryEmployee = queryEmployee.ColumnExpr("exchange_cash_person_list.uid AS uid")
  142 + queryEmployee = queryEmployee.ColumnExpr("exchange_cash_person_list.employee_name AS employee_name")
  143 + queryEmployee = queryEmployee.ColumnExpr("sum(exchange_cash_person_list.exchanged_cash) AS cash")
  144 + queryEmployee = queryEmployee.ColumnExpr("sum(exchange_cash_person_list.exchanged_su_money) AS su_money")
  145 + queryEmployee = queryEmployee.ColumnExpr("RANK() OVER (ORDER BY sum(exchange_cash_person_list.exchanged_su_money) DESC) AS ranking")
  146 + if companyId, ok := queryOptions["companyId"]; ok && (companyId.(int64) != 0) {
  147 + queryEmployee = queryEmployee.Where("e.company_id = ?", companyId)
  148 + }
  149 + if activityId, ok := queryOptions["activityId"]; ok && (activityId.(int64) != 0) {
  150 + queryEmployee = queryEmployee.Where("exchange_cash_person_list.activity_id = ?", activityId)
  151 + }
  152 + if uid, ok := queryOptions["uid"]; ok {
  153 + queryEmployee = queryEmployee.Where("exchange_cash_person_list.uid = ?", uid)
  154 + }
  155 + queryEmployee = queryEmployee.Group("exchange_cash_person_list.uid")
  156 + queryEmployee = queryEmployee.Group("exchange_cash_person_list.employee_name")
  157 + if err := queryEmployee.Order("su_money DESC").Select(&retEmployee); err != nil {
  158 + return nil, err
  159 + }
  160 +
  161 + // 清单已兑换素币
  162 + var activityExchangedSuMoney float64
  163 + queryListSuMoney := tx.Model(exchangeCashPersonListModels)
  164 + queryListSuMoney = queryListSuMoney.Join("JOIN employees AS e ON e.uid = exchange_cash_person_list.uid")
  165 + queryListSuMoney = queryListSuMoney.ColumnExpr("sum(exchange_cash_person_list.exchanged_su_money) AS activity_exchanged_su_money")
  166 + if companyId, ok := queryOptions["companyId"]; ok && (companyId.(int64) != 0) {
  167 + queryListSuMoney = queryListSuMoney.Where("e.company_id = ?", companyId)
  168 + }
  169 + if activityId, ok := queryOptions["activityId"]; ok && (activityId.(int64) != 0) {
  170 + queryListSuMoney = queryListSuMoney.Where("exchange_cash_person_list.activity_id = ?", activityId)
  171 + }
  172 + if err := queryListSuMoney.Select(&activityExchangedSuMoney); err != nil {
  173 + return nil, err
  174 + }
  175 +
  176 + // 清单已兑换现金
  177 + var activityExchangedCash float64
  178 + queryListCash := tx.Model(exchangeCashPersonListModels)
  179 + queryListCash = queryListCash.Join("JOIN employees AS e ON e.uid = exchange_cash_person_list.uid")
  180 + queryListCash = queryListCash.ColumnExpr("sum(exchange_cash_person_list.exchanged_cash) AS activity_exchanged_cash")
  181 + if companyId, ok := queryOptions["companyId"]; ok && (companyId.(int64) != 0) {
  182 + queryListCash = queryListCash.Where("e.company_id = ?", companyId)
  183 + }
  184 + if activityId, ok := queryOptions["activityId"]; ok && (activityId.(int64) != 0) {
  185 + queryListCash = queryListCash.Where("exchange_cash_person_list.activity_id = ?", activityId)
  186 + }
  187 + if err := queryListCash.Select(&activityExchangedCash); err != nil {
  188 + return nil, err
  189 + }
  190 +
  191 + // 清单计数
  192 + queryCount := tx.Model(exchangeCashPersonListModels)
  193 + count, err := queryCount.Count()
  194 + if err != nil {
  195 + return nil, err
  196 + }
  197 +
  198 + return map[string]interface{} {
  199 + "people": retPeople, // 员工排行榜
  200 + "count": count, // 计数
  201 + "currentEmployee": retEmployee[0], // 当前员工排名
  202 + "exchangedSuMoney": activityExchangedSuMoney, // 清单已兑换素币
  203 + "exchangedCash": activityExchangedCash, // 清单已兑换现金
  204 + }, nil
  205 +}
  206 +
80 func NewCashPoolDao(transactionContext *pgTransaction.TransactionContext) (*CashPoolDao, error) { 207 func NewCashPoolDao(transactionContext *pgTransaction.TransactionContext) (*CashPoolDao, error) {
81 if transactionContext == nil { 208 if transactionContext == nil {
82 return nil, fmt.Errorf("transactionContext参数不能为nil") 209 return nil, fmt.Errorf("transactionContext参数不能为nil")
@@ -283,7 +283,7 @@ func (dao *EmployeeDao) CalculateEmployeesSuMoney(companyId int, startTime time. @@ -283,7 +283,7 @@ func (dao *EmployeeDao) CalculateEmployeesSuMoney(companyId int, startTime time.
283 // }, nil 283 // }, nil
284 //} 284 //}
285 285
286 -// 排行榜统计 286 +// TODO 排行榜统计,排名
287 func (dao *EmployeeDao) CalculateEmployeesRankingList(companyId int, startTime time.Time, endTime time.Time, offset int, limit int) (map[string]interface{}, error) { 287 func (dao *EmployeeDao) CalculateEmployeesRankingList(companyId int, startTime time.Time, endTime time.Time, offset int, limit int) (map[string]interface{}, error) {
288 var retWealth []struct { 288 var retWealth []struct {
289 Uid int 289 Uid int
@@ -288,7 +288,6 @@ func (dao *TaskDao) CalculatePersonTask(uid int64) (map[string]interface{}, erro @@ -288,7 +288,6 @@ func (dao *TaskDao) CalculatePersonTask(uid int64) (map[string]interface{}, erro
288 } else { 288 } else {
289 completedAsParticipator = int64(count) 289 completedAsParticipator = int64(count)
290 } 290 }
291 - // TODO 已过期竞标任务统计  
292 if count, err := tx.Model(taskModel). 291 if count, err := tx.Model(taskModel).
293 Where(`task.sponsor @> '{"uid":?}'`, uid). 292 Where(`task.sponsor @> '{"uid":?}'`, uid).
294 //Where(`task.task_type = ? `, domain.TASK_STATUS_EXPIRED). 293 //Where(`task.task_type = ? `, domain.TASK_STATUS_EXPIRED).
@@ -95,6 +95,8 @@ func (repository *TaskRepository) FindOne(queryOptions map[string]interface{}) ( @@ -95,6 +95,8 @@ func (repository *TaskRepository) FindOne(queryOptions map[string]interface{}) (
95 return repository.transformPgModelToDomainModel(taskModel) 95 return repository.transformPgModelToDomainModel(taskModel)
96 } 96 }
97 } 97 }
  98 +
  99 +// TODO 添加任务名称搜索
98 func (repository *TaskRepository) Find(queryOptions map[string]interface{}) (int64, []*domain.Task, error) { 100 func (repository *TaskRepository) Find(queryOptions map[string]interface{}) (int64, []*domain.Task, error) {
99 tx := repository.transactionContext.PgTx 101 tx := repository.transactionContext.PgTx
100 var taskModels []*models.Task 102 var taskModels []*models.Task
@@ -480,3 +480,19 @@ func (controller *SuMoneyController) ExportExchangeList() { @@ -480,3 +480,19 @@ func (controller *SuMoneyController) ExportExchangeList() {
480 func (controller *SuMoneyController) ExportSuMoneyTransactionRecord() { 480 func (controller *SuMoneyController) ExportSuMoneyTransactionRecord() {
481 481
482 } 482 }
  483 +
  484 +// 返回兑换素币清单排行榜
  485 +func (controller *SuMoneyController) ExchangeCashListRanking() {
  486 + cashPoolService := service.NewCashPoolService(nil)
  487 + exchangeListRankingQuery := &query.ExchangeListRankingQuery{}
  488 + json.Unmarshal(controller.Ctx.Input.GetData("requestBody").([]byte), exchangeListRankingQuery)
  489 + data, err := cashPoolService.ExchangeListRanking(exchangeListRankingQuery)
  490 + var response utils.JsonResponse
  491 + if err != nil {
  492 + response = utils.ResponseError(controller.Ctx, err)
  493 + } else {
  494 + response = utils.ResponseData(controller.Ctx, data)
  495 + }
  496 + controller.Data["json"] = response
  497 + controller.ServeJSON()
  498 +}
@@ -34,4 +34,5 @@ func init() { @@ -34,4 +34,5 @@ func init() {
34 beego.Router("/cash-pool/activity/exchange-list/:listId", &controllers.SuMoneyController{}, "Delete:RemoveExchangeCashPerson") // 删除素币兑换清单 34 beego.Router("/cash-pool/activity/exchange-list/:listId", &controllers.SuMoneyController{}, "Delete:RemoveExchangeCashPerson") // 删除素币兑换清单
35 beego.Router("/cash-pool/activity/exchange-list/import", &controllers.SuMoneyController{}, "Post:ImportExchangeList") // 导入素币兑换清单 35 beego.Router("/cash-pool/activity/exchange-list/import", &controllers.SuMoneyController{}, "Post:ImportExchangeList") // 导入素币兑换清单
36 beego.Router("/cash-pool/activity/exchange-list/export", &controllers.SuMoneyController{}, "Post:ExportExchangeList") // 导出素币兑换清单 36 beego.Router("/cash-pool/activity/exchange-list/export", &controllers.SuMoneyController{}, "Post:ExportExchangeList") // 导出素币兑换清单
  37 + beego.Router("/cash-pool/activity/exchange-list/ranking", &controllers.SuMoneyController{}, "Post:ExchangeCashListRanking") // 兑换素币清单排行榜
37 } 38 }