正在显示
11 个修改的文件
包含
245 行增加
和
0 行删除
@@ -181,6 +181,23 @@ func (customerValueService *CustomerValueService) RemoveCustomerValue(removeCust | @@ -181,6 +181,23 @@ func (customerValueService *CustomerValueService) RemoveCustomerValue(removeCust | ||
181 | if customerValue == nil { | 181 | if customerValue == nil { |
182 | return nil, application.ThrowError(application.RES_NO_FIND_ERROR, fmt.Sprintf("%s", string(removeCustomerValueCommand.CustomerValueId))) | 182 | return nil, application.ThrowError(application.RES_NO_FIND_ERROR, fmt.Sprintf("%s", string(removeCustomerValueCommand.CustomerValueId))) |
183 | } | 183 | } |
184 | + var taskRepository domain.TaskRepository | ||
185 | + if value, err := factory.CreateTaskRepository(map[string]interface{}{ | ||
186 | + "transactionContext": transactionContext, | ||
187 | + }); err != nil { | ||
188 | + return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error()) | ||
189 | + } else { | ||
190 | + taskRepository = value | ||
191 | + } | ||
192 | + if count, _, err := taskRepository.Find(map[string]interface{}{ | ||
193 | + "customerValues": []int{customerValue.CustomerValueId}, | ||
194 | + }); err != nil { | ||
195 | + return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error()) | ||
196 | + } else { | ||
197 | + if count > 0 { | ||
198 | + return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, "该标签已被使用,不可删除") | ||
199 | + } | ||
200 | + } | ||
184 | if customerValue, err := customerValueRepository.Remove(customerValue); err != nil { | 201 | if customerValue, err := customerValueRepository.Remove(customerValue); err != nil { |
185 | return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error()) | 202 | return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error()) |
186 | } else { | 203 | } else { |
@@ -181,6 +181,23 @@ func (projectBelongService *ProjectBelongService) RemoveProjectBelong(removeProj | @@ -181,6 +181,23 @@ func (projectBelongService *ProjectBelongService) RemoveProjectBelong(removeProj | ||
181 | if projectBelong == nil { | 181 | if projectBelong == nil { |
182 | return nil, application.ThrowError(application.RES_NO_FIND_ERROR, fmt.Sprintf("%s", string(removeProjectBelongCommand.ProjectBelongId))) | 182 | return nil, application.ThrowError(application.RES_NO_FIND_ERROR, fmt.Sprintf("%s", string(removeProjectBelongCommand.ProjectBelongId))) |
183 | } | 183 | } |
184 | + var taskRepository domain.TaskRepository | ||
185 | + if value, err := factory.CreateTaskRepository(map[string]interface{}{ | ||
186 | + "transactionContext": transactionContext, | ||
187 | + }); err != nil { | ||
188 | + return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error()) | ||
189 | + } else { | ||
190 | + taskRepository = value | ||
191 | + } | ||
192 | + if count, _, err := taskRepository.Find(map[string]interface{}{ | ||
193 | + "projectBelongs": []int{projectBelong.ProjectBelongId}, | ||
194 | + }); err != nil { | ||
195 | + return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error()) | ||
196 | + } else { | ||
197 | + if count > 0 { | ||
198 | + return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, "该标签已被使用,不可删除") | ||
199 | + } | ||
200 | + } | ||
184 | if projectBelong, err := projectBelongRepository.Remove(projectBelong); err != nil { | 201 | if projectBelong, err := projectBelongRepository.Remove(projectBelong); err != nil { |
185 | return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error()) | 202 | return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error()) |
186 | } else { | 203 | } else { |
1 | +package command | ||
2 | + | ||
3 | +import ( | ||
4 | + "fmt" | ||
5 | + | ||
6 | + "github.com/astaxie/beego/validation" | ||
7 | +) | ||
8 | + | ||
9 | +type PersonNotificationStatisticsCommand struct { | ||
10 | + // 统一用户UID | ||
11 | + Uid int64 `json:"uid" valid:"Required"` | ||
12 | +} | ||
13 | + | ||
14 | +func (personNotificationStatisticsCommand *PersonNotificationStatisticsCommand) ValidateCommand() error { | ||
15 | + valid := validation.Validation{} | ||
16 | + b, err := valid.Valid(personNotificationStatisticsCommand) | ||
17 | + if err != nil { | ||
18 | + return err | ||
19 | + } | ||
20 | + if !b { | ||
21 | + for _, validErr := range valid.Errors { | ||
22 | + return fmt.Errorf("%s %s", validErr.Key, validErr.Message) | ||
23 | + } | ||
24 | + } | ||
25 | + return nil | ||
26 | +} |
@@ -12,6 +12,56 @@ import ( | @@ -12,6 +12,56 @@ import ( | ||
12 | type StatisticsService struct { | 12 | type StatisticsService struct { |
13 | } | 13 | } |
14 | 14 | ||
15 | +// 获取个人消息通知统计 | ||
16 | +func (statisticsService *StatisticsService) PersonNotificationStatistics(personNotificationStatisticsCommand *command.PersonNotificationStatisticsCommand) (interface{}, error) { | ||
17 | + if err := personNotificationStatisticsCommand.ValidateCommand(); err != nil { | ||
18 | + return nil, application.ThrowError(application.ARG_ERROR, err.Error()) | ||
19 | + } | ||
20 | + transactionContext, err := factory.CreateTransactionContext(nil) | ||
21 | + if err != nil { | ||
22 | + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error()) | ||
23 | + } | ||
24 | + if err := transactionContext.StartTransaction(); err != nil { | ||
25 | + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error()) | ||
26 | + } | ||
27 | + defer func() { | ||
28 | + transactionContext.RollbackTransaction() | ||
29 | + }() | ||
30 | + var employeeDao *dao.EmployeeDao | ||
31 | + if value, err := factory.CreateEmployeeDao(map[string]interface{}{ | ||
32 | + "transactionContext": transactionContext, | ||
33 | + }); err != nil { | ||
34 | + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error()) | ||
35 | + } else { | ||
36 | + employeeDao = value | ||
37 | + } | ||
38 | + var employeeRepository domain.EmployeeRepository | ||
39 | + if value, err := factory.CreateEmployeeRepository(map[string]interface{}{ | ||
40 | + "transactionContext": transactionContext, | ||
41 | + }); err != nil { | ||
42 | + return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error()) | ||
43 | + } else { | ||
44 | + employeeRepository = value | ||
45 | + } | ||
46 | + employee, err := employeeRepository.FindOne(map[string]interface{}{ | ||
47 | + "uid": personNotificationStatisticsCommand.Uid, | ||
48 | + }) | ||
49 | + if err != nil { | ||
50 | + return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error()) | ||
51 | + } | ||
52 | + if employee == nil { | ||
53 | + return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, "无效的企业员工") | ||
54 | + } | ||
55 | + if personNotificationStatistics, err := employeeDao.CalculatePersonUnReadNotification(personNotificationStatisticsCommand.Uid); err != nil { | ||
56 | + return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error()) | ||
57 | + } else { | ||
58 | + if err := transactionContext.CommitTransaction(); err != nil { | ||
59 | + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error()) | ||
60 | + } | ||
61 | + return personNotificationStatistics, nil | ||
62 | + } | ||
63 | +} | ||
64 | + | ||
15 | // 获取系统任务统计 | 65 | // 获取系统任务统计 |
16 | func (statisticsService *StatisticsService) SystemTaskStatistics(systemTaskStatisticsCommand *command.SystemTaskStatisticsCommand) (interface{}, error) { | 66 | func (statisticsService *StatisticsService) SystemTaskStatistics(systemTaskStatisticsCommand *command.SystemTaskStatisticsCommand) (interface{}, error) { |
17 | if err := systemTaskStatisticsCommand.ValidateCommand(); err != nil { | 67 | if err := systemTaskStatisticsCommand.ValidateCommand(); err != nil { |
@@ -15,6 +15,8 @@ type SearchTaskCommand struct { | @@ -15,6 +15,8 @@ type SearchTaskCommand struct { | ||
15 | TaskContentMatch string `json:"taskContentMatch,omitempty"` | 15 | TaskContentMatch string `json:"taskContentMatch,omitempty"` |
16 | // 任务类型 | 16 | // 任务类型 |
17 | TaskType int `json:"taskType,omitempty"` | 17 | TaskType int `json:"taskType,omitempty"` |
18 | + // 任务类型ID列表 | ||
19 | + TaskTypes []int `json:"taskTypes,omitempty"` | ||
18 | // 任务状态 | 20 | // 任务状态 |
19 | TaskStatus int `json:"taskStatus,omitempty"` | 21 | TaskStatus int `json:"taskStatus,omitempty"` |
20 | // 项目归属 | 22 | // 项目归属 |
@@ -181,6 +181,23 @@ func (taskNatureService *TaskNatureService) RemoveTaskNature(removeTaskNatureCom | @@ -181,6 +181,23 @@ func (taskNatureService *TaskNatureService) RemoveTaskNature(removeTaskNatureCom | ||
181 | if taskNature == nil { | 181 | if taskNature == nil { |
182 | return nil, application.ThrowError(application.RES_NO_FIND_ERROR, fmt.Sprintf("%s", string(removeTaskNatureCommand.TaskNatureId))) | 182 | return nil, application.ThrowError(application.RES_NO_FIND_ERROR, fmt.Sprintf("%s", string(removeTaskNatureCommand.TaskNatureId))) |
183 | } | 183 | } |
184 | + var taskRepository domain.TaskRepository | ||
185 | + if value, err := factory.CreateTaskRepository(map[string]interface{}{ | ||
186 | + "transactionContext": transactionContext, | ||
187 | + }); err != nil { | ||
188 | + return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error()) | ||
189 | + } else { | ||
190 | + taskRepository = value | ||
191 | + } | ||
192 | + if count, _, err := taskRepository.Find(map[string]interface{}{ | ||
193 | + "taskNatures": []int{taskNature.TaskNatureId}, | ||
194 | + }); err != nil { | ||
195 | + return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error()) | ||
196 | + } else { | ||
197 | + if count > 0 { | ||
198 | + return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, "该标签已被使用,不可删除") | ||
199 | + } | ||
200 | + } | ||
184 | if taskNature, err := taskNatureRepository.Remove(taskNature); err != nil { | 201 | if taskNature, err := taskNatureRepository.Remove(taskNature); err != nil { |
185 | return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error()) | 202 | return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error()) |
186 | } else { | 203 | } else { |
@@ -4,6 +4,7 @@ import ( | @@ -4,6 +4,7 @@ import ( | ||
4 | "fmt" | 4 | "fmt" |
5 | "github.com/go-pg/pg" | 5 | "github.com/go-pg/pg" |
6 | pgTransaction "github.com/linmadan/egglib-go/transaction/pg" | 6 | pgTransaction "github.com/linmadan/egglib-go/transaction/pg" |
7 | + "gitlab.fjmaimaimai.com/linmadan/mmm-worth/pkg/domain" | ||
7 | "gitlab.fjmaimaimai.com/linmadan/mmm-worth/pkg/infrastructure/pg/models" | 8 | "gitlab.fjmaimaimai.com/linmadan/mmm-worth/pkg/infrastructure/pg/models" |
8 | "time" | 9 | "time" |
9 | ) | 10 | ) |
@@ -56,6 +57,33 @@ func (dao *EmployeeDao) TransferSuMoney(uid int64, suMoney float64) error { | @@ -56,6 +57,33 @@ func (dao *EmployeeDao) TransferSuMoney(uid int64, suMoney float64) error { | ||
56 | return err | 57 | return err |
57 | } | 58 | } |
58 | 59 | ||
60 | +func (dao *EmployeeDao) CalculatePersonUnReadNotification(uid int64) (map[string]int, error) { | ||
61 | + var unReadSystemNotification int | ||
62 | + var unReadInteractionNotification int | ||
63 | + tx := dao.transactionContext.PgTx | ||
64 | + sentNotificationModel := new(models.SentNotification) | ||
65 | + if count, err := tx.Model(sentNotificationModel).Relation("Notification"). | ||
66 | + Where(`sent_notification.receiver @> '{"uid":?}'`, uid). | ||
67 | + Where("notification.notification_type = ?", domain.NOTIFICATION_TYPE_SYSTEM). | ||
68 | + Count(); err != nil { | ||
69 | + return nil, err | ||
70 | + } else { | ||
71 | + unReadSystemNotification = count | ||
72 | + } | ||
73 | + if count, err := tx.Model(sentNotificationModel).Relation("Notification"). | ||
74 | + Where(`sent_notification.receiver @> '{"uid":?}'`, uid). | ||
75 | + Where("notification.notification_type = ?", domain.NOTIFICATION_TYPE_INTERACTION). | ||
76 | + Count(); err != nil { | ||
77 | + return nil, err | ||
78 | + } else { | ||
79 | + unReadInteractionNotification = count | ||
80 | + } | ||
81 | + return map[string]int{ | ||
82 | + "unReadSystemNotification": unReadSystemNotification, | ||
83 | + "unReadInteractionNotification": unReadInteractionNotification, | ||
84 | + }, nil | ||
85 | +} | ||
86 | + | ||
59 | func (dao *EmployeeDao) CalculatePersonSuMoney(uid int64) (map[string]interface{}, error) { | 87 | func (dao *EmployeeDao) CalculatePersonSuMoney(uid int64) (map[string]interface{}, error) { |
60 | var incomeSuMoney float64 | 88 | var incomeSuMoney float64 |
61 | var incomeSuMoneyOfYesterday float64 | 89 | var incomeSuMoneyOfYesterday float64 |
@@ -118,6 +118,14 @@ func (repository *TaskRepository) Find(queryOptions map[string]interface{}) (int | @@ -118,6 +118,14 @@ func (repository *TaskRepository) Find(queryOptions map[string]interface{}) (int | ||
118 | if taskType, ok := queryOptions["taskType"]; ok && (taskType != 0) { | 118 | if taskType, ok := queryOptions["taskType"]; ok && (taskType != 0) { |
119 | query = query.Where(`task.task_type = ?`, taskType) | 119 | query = query.Where(`task.task_type = ?`, taskType) |
120 | } | 120 | } |
121 | + if taskTypes, ok := queryOptions["taskTypes"]; ok && len(taskTypes.([]int)) != 0 { | ||
122 | + query = query.WhereGroup(func(q *orm.Query) (*orm.Query, error) { | ||
123 | + for _, value := range taskTypes.([]int) { | ||
124 | + q = q.WhereOr("task.task_type = ?", value) | ||
125 | + } | ||
126 | + return q, nil | ||
127 | + }) | ||
128 | + } | ||
121 | if projectBelongs, ok := queryOptions["projectBelongs"]; ok && len(projectBelongs.([]int)) != 0 { | 129 | if projectBelongs, ok := queryOptions["projectBelongs"]; ok && len(projectBelongs.([]int)) != 0 { |
122 | query = query.WhereGroup(func(q *orm.Query) (*orm.Query, error) { | 130 | query = query.WhereGroup(func(q *orm.Query) (*orm.Query, error) { |
123 | for _, value := range projectBelongs.([]int) { | 131 | for _, value := range projectBelongs.([]int) { |
@@ -57,3 +57,18 @@ func (controller *StatisticsController) PersonSuMoneyStatistics() { | @@ -57,3 +57,18 @@ func (controller *StatisticsController) PersonSuMoneyStatistics() { | ||
57 | controller.Data["json"] = response | 57 | controller.Data["json"] = response |
58 | controller.ServeJSON() | 58 | controller.ServeJSON() |
59 | } | 59 | } |
60 | + | ||
61 | +func (controller *StatisticsController) PersonNotificationStatistics() { | ||
62 | + statisticsService := service.NewStatisticsService(nil) | ||
63 | + personNotificationStatisticsCommand := &command.PersonNotificationStatisticsCommand{} | ||
64 | + json.Unmarshal(controller.Ctx.Input.GetData("requestBody").([]byte), personNotificationStatisticsCommand) | ||
65 | + data, err := statisticsService.PersonNotificationStatistics(personNotificationStatisticsCommand) | ||
66 | + var response utils.JsonResponse | ||
67 | + if err != nil { | ||
68 | + response = utils.ResponseError(controller.Ctx, err) | ||
69 | + } else { | ||
70 | + response = utils.ResponseData(controller.Ctx, data) | ||
71 | + } | ||
72 | + controller.Data["json"] = response | ||
73 | + controller.ServeJSON() | ||
74 | +} |
@@ -9,4 +9,5 @@ func init() { | @@ -9,4 +9,5 @@ func init() { | ||
9 | beego.Router("/statistics/system-task", &controllers.StatisticsController{}, "Post:SystemTaskStatistics") | 9 | beego.Router("/statistics/system-task", &controllers.StatisticsController{}, "Post:SystemTaskStatistics") |
10 | beego.Router("/statistics/person-task", &controllers.StatisticsController{}, "Post:PersonTaskStatistics") | 10 | beego.Router("/statistics/person-task", &controllers.StatisticsController{}, "Post:PersonTaskStatistics") |
11 | beego.Router("/statistics/person-su-money", &controllers.StatisticsController{}, "Post:PersonSuMoneyStatistics") | 11 | beego.Router("/statistics/person-su-money", &controllers.StatisticsController{}, "Post:PersonSuMoneyStatistics") |
12 | + beego.Router("/statistics/person-notification", &controllers.StatisticsController{}, "Post:PersonNotificationStatistics") | ||
12 | } | 13 | } |
1 | +package statistics | ||
2 | + | ||
3 | +import ( | ||
4 | + "gitlab.fjmaimaimai.com/linmadan/mmm-worth/pkg/domain" | ||
5 | + "net/http" | ||
6 | + "time" | ||
7 | + | ||
8 | + "github.com/gavv/httpexpect" | ||
9 | + "github.com/go-pg/pg" | ||
10 | + . "github.com/onsi/ginkgo" | ||
11 | + . "github.com/onsi/gomega" | ||
12 | + pG "gitlab.fjmaimaimai.com/linmadan/mmm-worth/pkg/infrastructure/pg" | ||
13 | +) | ||
14 | + | ||
15 | +var _ = Describe("获取个人消息通知统计", func() { | ||
16 | + var notificationId int64 | ||
17 | + var sentNotificationId int64 | ||
18 | + BeforeEach(func() { | ||
19 | + _, err := pG.DB.QueryOne( | ||
20 | + pg.Scan(¬ificationId), | ||
21 | + "INSERT INTO notifications (id, notification_type, notification_title, notification_content, notification_time, external_resource_type, external_resource) VALUES (?, ?, ?, ?, ?, ?, ?) RETURNING id", | ||
22 | + 1, 1, "testNotificationTitle", "testNotificationContent", time.Now(), 1, 1) | ||
23 | + Expect(err).NotTo(HaveOccurred()) | ||
24 | + _, err1 := pG.DB.QueryOne( | ||
25 | + pg.Scan(&sentNotificationId), | ||
26 | + "INSERT INTO sent_notifications (id, notification_id, receiver, is_read, read_time) VALUES (?, ?, ?, ?, ?) RETURNING id", | ||
27 | + 1, notificationId, &domain.EmployeeInfo{ | ||
28 | + Uid: 2499036607974745088, | ||
29 | + }, false, time.Time{}) | ||
30 | + Expect(err1).NotTo(HaveOccurred()) | ||
31 | + _, err2 := pG.DB.QueryOne( | ||
32 | + pg.Scan(), | ||
33 | + "INSERT INTO employees (id, company_id, uid, employee_name, employee_account, su_money) VALUES (?, ?, ?, ?, ?, ?)", | ||
34 | + 1, 101, 2499036607974745088, "testEmployeeName", "testEmployeeAccount", 0) | ||
35 | + Expect(err2).NotTo(HaveOccurred()) | ||
36 | + }) | ||
37 | + Describe("获取个人消息通知统计", func() { | ||
38 | + Context("", func() { | ||
39 | + It("", func() { | ||
40 | + httpExpect := httpexpect.New(GinkgoT(), server.URL) | ||
41 | + body := map[string]interface{}{ | ||
42 | + "uid": 2499036607974745088, | ||
43 | + } | ||
44 | + httpExpect.POST("/statistics/person-notification"). | ||
45 | + WithJSON(body). | ||
46 | + Expect(). | ||
47 | + Status(http.StatusOK). | ||
48 | + JSON(). | ||
49 | + Object(). | ||
50 | + ContainsKey("code").ValueEqual("code", 0). | ||
51 | + ContainsKey("msg").ValueEqual("msg", "ok"). | ||
52 | + ContainsKey("data").Value("data").Object() | ||
53 | + }) | ||
54 | + }) | ||
55 | + }) | ||
56 | + AfterEach(func() { | ||
57 | + _, err := pG.DB.Exec("DELETE FROM sent_notifications WHERE true") | ||
58 | + Expect(err).NotTo(HaveOccurred()) | ||
59 | + _, err1 := pG.DB.Exec("DELETE FROM notifications WHERE true") | ||
60 | + Expect(err1).NotTo(HaveOccurred()) | ||
61 | + _, err2 := pG.DB.Exec("DELETE FROM employees WHERE true") | ||
62 | + Expect(err2).NotTo(HaveOccurred()) | ||
63 | + }) | ||
64 | +}) |
-
请 注册 或 登录 后发表评论