作者 tangxvhui
@@ -263,3 +263,11 @@ func CreateTaskAnomalyRepository(options map[string]interface{}) domain.TaskAnom @@ -263,3 +263,11 @@ func CreateTaskAnomalyRepository(options map[string]interface{}) domain.TaskAnom
263 } 263 }
264 return repository.NewTaskAnomalyRepository(transactionContext) 264 return repository.NewTaskAnomalyRepository(transactionContext)
265 } 265 }
  266 +
  267 +func CreateLogOptRepository(options map[string]interface{}) domain.LogOptRepository {
  268 + var transactionContext *pg.TransactionContext
  269 + if value, ok := options["transactionContext"]; ok {
  270 + transactionContext = value.(*pg.TransactionContext)
  271 + }
  272 + return repository.NewLogOptRepository(transactionContext)
  273 +}
  1 +package command
  2 +
  3 +import "github.com/beego/beego/v2/core/validation"
  4 +
  5 +type QueryLogCommand struct {
  6 + CompanyId int64 `cname:"公司ID" json:"-"`
  7 + TaskId int `cname:"任务ID" json:"taskId,string" valid:"Required"`
  8 + PageNumber int64 `cname:"分页页码" json:"pageNumber" valid:"Required"`
  9 + PageSize int64 `cname:"分页数量" json:"pageSize" valid:"Required"`
  10 +}
  11 +
  12 +func (in *QueryLogCommand) Valid(*validation.Validation) {
  13 +
  14 +}
  1 +package log_opt
  2 +
  3 +import (
  4 + "fmt"
  5 + "github.com/linmadan/egglib-go/core/application"
  6 + "gitlab.fjmaimaimai.com/allied-creation/performance/pkg/application/factory"
  7 + "gitlab.fjmaimaimai.com/allied-creation/performance/pkg/domain"
  8 + "gitlab.fjmaimaimai.com/allied-creation/performance/pkg/log"
  9 + "strconv"
  10 + "time"
  11 +)
  12 +
  13 +func CreateTask(u *domain.UserAuth, task domain.Task) error {
  14 + transactionContext, err := factory.StartTransaction()
  15 + if err != nil {
  16 + return err
  17 + }
  18 + defer func() {
  19 + _ = transactionContext.RollbackTransaction()
  20 + if err := recover(); err != nil {
  21 + log.Logger.Error(application.ThrowError(application.BUSINESS_ERROR, fmt.Sprintf("创建任务日志异常:%s", err)).Error())
  22 + }
  23 + }()
  24 + logOptRepo := factory.CreateLogOptRepository(map[string]interface{}{"transactionContext": transactionContext})
  25 +
  26 + logOpt := createdLogOpt(u, strconv.Itoa(task.Id))
  27 + logOpt.OptMethod = domain.CREATE
  28 + logOpt.OptField = "创建了任务"
  29 + logOpt.OptValue = task.Alias
  30 +
  31 + _, err = logOptRepo.Insert(logOpt)
  32 + if err != nil {
  33 + return application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
  34 + }
  35 + if err := transactionContext.CommitTransaction(); err != nil {
  36 + return application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  37 + }
  38 + return nil
  39 +}
  40 +
  41 +func UpdateTask(u *domain.UserAuth,
  42 + srcTask *domain.Task,
  43 + newTask *domain.Task,
  44 + srcStage []*domain.TaskStage,
  45 + newStage []*domain.TaskStage,
  46 +) error {
  47 + transactionContext, err := factory.StartTransaction()
  48 + if err != nil {
  49 + return err
  50 + }
  51 + defer func() {
  52 + _ = transactionContext.RollbackTransaction()
  53 + if err := recover(); err != nil {
  54 + log.Logger.Error(application.ThrowError(application.BUSINESS_ERROR, fmt.Sprintf("更新任务日志异常:%s", err)).Error())
  55 + }
  56 + }()
  57 + logOptRepo := factory.CreateLogOptRepository(map[string]interface{}{"transactionContext": transactionContext})
  58 +
  59 + var logArray = compareTask(u, srcTask, newTask)
  60 + var logArray2 = compareStage(u, newTask.Id, srcStage, newStage)
  61 + logArray = append(logArray, logArray2...)
  62 + if len(logArray) == 0 {
  63 + return nil
  64 + }
  65 + for _, v := range logArray {
  66 + _, err = logOptRepo.Insert(v)
  67 + if err != nil {
  68 + return application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
  69 + }
  70 + }
  71 + if err := transactionContext.CommitTransaction(); err != nil {
  72 + return application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  73 + }
  74 + return nil
  75 +}
  76 +
  77 +func compareTask(u *domain.UserAuth, srcTask *domain.Task, newTask *domain.Task) []*domain.LogOpt {
  78 + var taskId = strconv.Itoa(newTask.Id)
  79 + logArray := make([]*domain.LogOpt, 0)
  80 + if srcTask.Alias != newTask.Alias {
  81 + logOpt := createdLogOpt(u, taskId)
  82 + logOpt.OptField = "修改了任务名称"
  83 + logOpt.OptValue = newTask.Alias
  84 + logArray = append(logArray, logOpt)
  85 + }
  86 +
  87 + if srcTask.EndTime != newTask.EndTime {
  88 + logOpt := createdLogOpt(u, taskId)
  89 + logOpt.OptField = "修改了任务截止时间"
  90 + if newTask.EndTime == 0 {
  91 + logOpt.OptValue = "未设置时间"
  92 + } else {
  93 + logOpt.OptValue = time.Unix(newTask.EndTime, 0).Local().Format("2006-01-02 15:04:05")
  94 + }
  95 + logArray = append(logArray, logOpt)
  96 + }
  97 +
  98 + if srcTask.UseEndTime != newTask.UseEndTime {
  99 + logOpt := createdLogOpt(u, taskId)
  100 + logOpt.OptField = "修改了任务截止时间应用到日评中"
  101 + if newTask.UseEndTime == 0 {
  102 + logOpt.OptValue = "不应用"
  103 + } else {
  104 + logOpt.OptValue = "应用"
  105 + }
  106 + logArray = append(logArray, logOpt)
  107 + }
  108 +
  109 + if srcTask.LevelName != newTask.LevelName {
  110 + logOpt := createdLogOpt(u, taskId)
  111 + logOpt.OptField = "修改了任务类型"
  112 + logOpt.OptValue = newTask.LevelName
  113 + logArray = append(logArray, logOpt)
  114 + }
  115 +
  116 + if srcTask.SortBy != newTask.SortBy {
  117 + logOpt := createdLogOpt(u, taskId)
  118 + logOpt.OptField = "修改了任务优先级"
  119 + logOpt.OptValue = newTask.SortBy.Named()
  120 + logArray = append(logArray, logOpt)
  121 + }
  122 +
  123 + if srcTask.AssistFlagMax != newTask.AssistFlagMax {
  124 + logOpt := createdLogOpt(u, taskId)
  125 + logOpt.OptField = "修改了上级辅导时间"
  126 + logOpt.OptValue = strconv.Itoa(newTask.AssistFlagMax)
  127 + logArray = append(logArray, logOpt)
  128 + }
  129 +
  130 + // 新的任务相关方
  131 + uidNewMap := map[int]int{}
  132 + for _, id := range newTask.RelatedUser {
  133 + uidNewMap[id] = id
  134 + }
  135 + // 被移除的任务相关方
  136 + removedIds := make([]int, 0)
  137 + for _, id := range srcTask.RelatedUser {
  138 + if _, ok := uidNewMap[id]; ok {
  139 + delete(uidNewMap, id) // 删除后,剩余的都是新增的
  140 + } else {
  141 + removedIds = append(removedIds, id)
  142 + }
  143 + }
  144 +
  145 + // 变动的任务相关方
  146 + changeIds := make([]int, 0)
  147 + for _, v := range removedIds {
  148 + changeIds = append(changeIds, v)
  149 + }
  150 + for _, v := range uidNewMap {
  151 + changeIds = append(changeIds, v)
  152 + }
  153 + userMap, _ := getUserMap(changeIds)
  154 +
  155 + for _, v := range removedIds {
  156 + logOpt := createdLogOpt(u, taskId)
  157 + logOpt.OptMethod = domain.DELETE
  158 + logOpt.OptField = "移除了任务相关方"
  159 + if v, ok := userMap[v]; ok {
  160 + logOpt.OptValue = v.Name
  161 + }
  162 + logArray = append(logArray, logOpt)
  163 + }
  164 +
  165 + for _, v := range uidNewMap {
  166 + logOpt := createdLogOpt(u, taskId)
  167 + logOpt.OptMethod = domain.CREATE
  168 + logOpt.OptField = "添加了任务相关方"
  169 + if v, ok := userMap[v]; ok {
  170 + logOpt.OptValue = v.Name
  171 + }
  172 + logArray = append(logArray, logOpt)
  173 + }
  174 +
  175 + return logArray
  176 +}
  177 +
  178 +func compareStage(u *domain.UserAuth, id int, srcStage []*domain.TaskStage, newStage []*domain.TaskStage) []*domain.LogOpt {
  179 + taskId := strconv.Itoa(id)
  180 + logArray := make([]*domain.LogOpt, 0)
  181 + srcMap := map[int]*domain.TaskStage{}
  182 + for i := range srcStage {
  183 + it := srcStage[i]
  184 + srcMap[it.Id] = it
  185 + }
  186 +
  187 + for i := range newStage {
  188 + it := newStage[i]
  189 + if it.DeletedAt != nil {
  190 + logOpt := createdLogOpt(u, taskId)
  191 + logOpt.OptMethod = domain.DELETE
  192 + logOpt.OptField = "删除了里程碑"
  193 + logOpt.OptValue = it.Name
  194 + logArray = append(logArray, logOpt)
  195 + continue
  196 + }
  197 +
  198 + // 新旧比对
  199 + if v, ok := srcMap[it.Id]; ok {
  200 + if it.Name != v.Name {
  201 + logOpt := createdLogOpt(u, taskId)
  202 + logOpt.OptField = "修改了里程碑名称"
  203 + logOpt.OptValue = it.Name
  204 + logArray = append(logArray, logOpt)
  205 + }
  206 + if it.PlanCompletedAt != v.PlanCompletedAt {
  207 + logOpt := createdLogOpt(u, taskId)
  208 + logOpt.OptField = "修改了里程碑" + it.Name + "计划完成时间"
  209 + if it.PlanCompletedAt == 0 {
  210 + logOpt.OptValue = "未设置时间"
  211 + } else {
  212 + logOpt.OptValue = time.Unix(it.PlanCompletedAt, 0).Local().Format("2006-01-02 15:04:05")
  213 + }
  214 + logArray = append(logArray, logOpt)
  215 + }
  216 + } else {
  217 + logOpt := createdLogOpt(u, taskId)
  218 + logOpt.OptMethod = domain.CREATE
  219 + logOpt.OptField = "创建了里程碑"
  220 + logOpt.OptValue = it.Name
  221 + logArray = append(logArray, logOpt)
  222 + }
  223 + }
  224 +
  225 + return logArray
  226 +}
  227 +
  228 +func getUserMap(ids []int) (map[int]*domain.User, error) {
  229 + userMap := map[int]*domain.User{}
  230 + if len(ids) == 0 {
  231 + return userMap, nil
  232 + }
  233 + transactionContext, err := factory.CreateTransactionContext(nil)
  234 + if err != nil {
  235 + return userMap, err
  236 + }
  237 + userRepo := factory.CreateUserRepository(map[string]interface{}{"transactionContext": transactionContext})
  238 + _, users, err := userRepo.Find(map[string]interface{}{"ids": ids, "limit": len(ids)})
  239 + if err != nil {
  240 + return userMap, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
  241 + }
  242 + for i := range users {
  243 + user := users[i]
  244 + userMap[int(user.Id)] = user
  245 + }
  246 + return userMap, nil
  247 +}
  248 +
  249 +func createdLogOpt(u *domain.UserAuth, taskId string) *domain.LogOpt {
  250 + var createdAt = time.Now()
  251 + var updatedAt = createdAt
  252 + operator := domain.StaffDesc{
  253 + UserId: int(u.UserId),
  254 + CompanyName: u.CompanyName,
  255 + Account: u.Phone,
  256 + UserName: u.Name,
  257 + }
  258 + return &domain.LogOpt{
  259 + Id: 0,
  260 + CompanyId: int(u.CompanyId),
  261 + Operator: operator,
  262 + OptMethod: domain.UPDATE,
  263 + OptTargetId: taskId,
  264 + OptField: "",
  265 + OptValue: "",
  266 + CreatedAt: createdAt,
  267 + UpdatedAt: updatedAt,
  268 + }
  269 +}
  1 +package log_opt
  2 +
  3 +import (
  4 + "github.com/linmadan/egglib-go/core/application"
  5 + "github.com/linmadan/egglib-go/utils/tool_funs"
  6 + "gitlab.fjmaimaimai.com/allied-creation/performance/pkg/application/factory"
  7 + "gitlab.fjmaimaimai.com/allied-creation/performance/pkg/application/log_opt/command"
  8 +)
  9 +
  10 +type LogOptService struct {
  11 +}
  12 +
  13 +func NewLogOptService() *LogOptService {
  14 + newRoleService := &LogOptService{}
  15 + return newRoleService
  16 +}
  17 +
  18 +func (rs *LogOptService) List(in *command.QueryLogCommand) (interface{}, error) {
  19 + transactionContext, err := factory.ValidateStartTransaction(in)
  20 + if err != nil {
  21 + return nil, err
  22 + }
  23 + defer func() {
  24 + transactionContext.RollbackTransaction()
  25 + }()
  26 +
  27 + ssMap := tool_funs.SimpleStructToMap(in)
  28 + ssMap["companyId"] = in.CompanyId
  29 + ssMap["optTargetId"] = in.TaskId
  30 +
  31 + logRepository := factory.CreateLogOptRepository(map[string]interface{}{"transactionContext": transactionContext})
  32 + total, logList, err := logRepository.Find(ssMap)
  33 + if err != nil {
  34 + return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
  35 + }
  36 +
  37 + if err := transactionContext.CommitTransaction(); err != nil {
  38 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  39 + }
  40 +
  41 + return tool_funs.SimpleWrapGridMap(total, logList), nil
  42 +}
@@ -22,9 +22,12 @@ type AssessInfoResp struct { @@ -22,9 +22,12 @@ type AssessInfoResp struct {
22 SupperUser string `json:"superUser"` //目标用户的上级 22 SupperUser string `json:"superUser"` //目标用户的上级
23 DutyTime string `json:"dutyTime"` //入职时间 23 DutyTime string `json:"dutyTime"` //入职时间
24 AssessContent []*domain.StaffAssessContent `json:"assessContent"` //评估内容 24 AssessContent []*domain.StaffAssessContent `json:"assessContent"` //评估内容
25 - //CategoryTaskRecords []*domain.TaskRecord `json:"categoryTaskRecords"` //类别任务反馈记录  
26 - //AssessTaskRecords []*domain.TaskRecord `json:"assessTaskRecords"` //评估任务反馈记录  
27 - TaskRecords []*domain.TaskRecord `json:"taskRecords"` //里程碑内容 25 + TaskRecords []*TaskRecordAdapter `json:"taskRecords"` //里程碑内容
  26 +}
  27 +
  28 +type TaskRecordAdapter struct {
  29 + *domain.TaskRecord
  30 + EndTime int64 `json:"endTime"` // 任务截止的时间戳,单位:秒;等于0时表示未设置时间
28 } 31 }
29 32
30 // 周期内的每日自评小结 33 // 周期内的每日自评小结
@@ -909,25 +909,42 @@ func (srv StaffAssessServeice) GetAssessInfo(param *query.AssessInfoQuery) (*ada @@ -909,25 +909,42 @@ func (srv StaffAssessServeice) GetAssessInfo(param *query.AssessInfoQuery) (*ada
909 srv.recoverAssessCache(transactionContext, assessData.Id, assessContentList) 909 srv.recoverAssessCache(transactionContext, assessData.Id, assessContentList)
910 } 910 }
911 911
912 - taskRecords := make([]*domain.TaskRecord, 0) // 类别任务反馈记录  
913 - //categoryTaskRecords := make([]*domain.TaskRecord, 0) // 类别任务反馈记录  
914 - //assessTaskRecords := make([]*domain.TaskRecord, 0) // 评估项任务反馈记录 912 + taskRecordAdapter := make([]*adapter.TaskRecordAdapter, 0) // 类别任务反馈记录
915 // 如果评估类型为自评、目标是登录用户时,获取所有任务记录数据 913 // 如果评估类型为自评、目标是登录用户时,获取所有任务记录数据
916 if assessData.Types == domain.AssessSelf || param.UserId == assessData.TargetUser.UserId { 914 if assessData.Types == domain.AssessSelf || param.UserId == assessData.TargetUser.UserId {
917 taskRecordRepository := factory.CreateTaskRecordRepository(map[string]interface{}{"transactionContext": transactionContext}) 915 taskRecordRepository := factory.CreateTaskRecordRepository(map[string]interface{}{"transactionContext": transactionContext})
918 - _, taskRecords, err = taskRecordRepository.Find(map[string]interface{}{"staffAssessId": assessData.Id}) 916 + _, taskRecords, err := taskRecordRepository.Find(map[string]interface{}{"staffAssessId": assessData.Id})
919 if err != nil { 917 if err != nil {
920 return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, "获取里程碑数据:"+err.Error()) 918 return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, "获取里程碑数据:"+err.Error())
921 } 919 }
922 - //// 区分任务来源分类  
923 - //for i := range taskRecords {  
924 - // it := taskRecords[i]  
925 - // if it.TaskCreatedBy == 0 {  
926 - // categoryTaskRecords = append(categoryTaskRecords, it)  
927 - // } else {  
928 - // assessTaskRecords = append(assessTaskRecords, it)  
929 - // }  
930 - //} 920 +
  921 + taskIdMap := map[int]int{}
  922 + taskIdArray := make([]int, 0)
  923 + for _, v := range taskRecords {
  924 + taskIdMap[v.TaskId] = v.TaskId
  925 + }
  926 + for _, v := range taskIdMap {
  927 + taskIdArray = append(taskIdArray, v)
  928 + }
  929 + taskMap := map[int]*domain.Task{}
  930 + taskRepository := factory.CreateTaskRepository(map[string]interface{}{"transactionContext": transactionContext})
  931 + _, tasks, err := taskRepository.Find(map[string]interface{}{"ids": taskIdArray, "limit": len(taskIdArray)})
  932 + if err != nil {
  933 + return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, "获取里程碑数据:"+err.Error())
  934 + }
  935 + for i := range tasks {
  936 + taskMap[tasks[i].Id] = tasks[i]
  937 + }
  938 +
  939 + for i := range taskRecords {
  940 + it := taskRecords[i]
  941 + a := &adapter.TaskRecordAdapter{}
  942 + a.TaskRecord = it
  943 + if v, ok := taskMap[it.TaskId]; ok {
  944 + a.EndTime = v.EndTime
  945 + }
  946 + taskRecordAdapter = append(taskRecordAdapter, a)
  947 + }
931 } 948 }
932 949
933 if err := transactionContext.CommitTransaction(); err != nil { 950 if err := transactionContext.CommitTransaction(); err != nil {
@@ -952,9 +969,7 @@ func (srv StaffAssessServeice) GetAssessInfo(param *query.AssessInfoQuery) (*ada @@ -952,9 +969,7 @@ func (srv StaffAssessServeice) GetAssessInfo(param *query.AssessInfoQuery) (*ada
952 SupperUser: "", 969 SupperUser: "",
953 DutyTime: "", 970 DutyTime: "",
954 AssessContent: assessContentList, 971 AssessContent: assessContentList,
955 - //CategoryTaskRecords: categoryTaskRecords,  
956 - //AssessTaskRecords: assessTaskRecords,  
957 - TaskRecords: taskRecords, 972 + TaskRecords: taskRecordAdapter,
958 } 973 }
959 if len(assessContentList) == 0 { 974 if len(assessContentList) == 0 {
960 result.AssessContent = []*domain.StaffAssessContent{} 975 result.AssessContent = []*domain.StaffAssessContent{}
@@ -763,13 +763,11 @@ func (srv StaffAssessServeice) GetAssessSelfInfoV2(param *query.GetExecutorSelfA @@ -763,13 +763,11 @@ func (srv StaffAssessServeice) GetAssessSelfInfoV2(param *query.GetExecutorSelfA
763 cache = srv.recoverAssessCache(transactionContext, assessData.Id, assessContentList) 763 cache = srv.recoverAssessCache(transactionContext, assessData.Id, assessContentList)
764 } 764 }
765 765
766 - taskRecords := make([]*domain.TaskRecord, 0) // 类别任务反馈记录  
767 - //categoryTaskRecords := make([]*domain.TaskRecord, 0) // 类别任务反馈记录  
768 - //assessTaskRecords := make([]*domain.TaskRecord, 0) // 评估项任务反馈记录 766 + taskRecordAdapter := make([]*adapter.TaskRecordAdapter, 0) // 类别任务反馈记录
769 // 如果评估类型为自评、目标是登录用户时,获取所有任务记录数据 767 // 如果评估类型为自评、目标是登录用户时,获取所有任务记录数据
770 if param.UserId == param.TargetUserId { 768 if param.UserId == param.TargetUserId {
771 taskRecordRepository := factory.CreateTaskRecordRepository(map[string]interface{}{"transactionContext": transactionContext}) 769 taskRecordRepository := factory.CreateTaskRecordRepository(map[string]interface{}{"transactionContext": transactionContext})
772 - _, taskRecords, err = taskRecordRepository.Find(map[string]interface{}{"staffAssessId": assessData.Id}) 770 + _, taskRecords, err := taskRecordRepository.Find(map[string]interface{}{"staffAssessId": assessData.Id})
773 if err != nil { 771 if err != nil {
774 return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, "获取里程碑数据:"+err.Error()) 772 return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, "获取里程碑数据:"+err.Error())
775 } 773 }
@@ -777,15 +775,35 @@ func (srv StaffAssessServeice) GetAssessSelfInfoV2(param *query.GetExecutorSelfA @@ -777,15 +775,35 @@ func (srv StaffAssessServeice) GetAssessSelfInfoV2(param *query.GetExecutorSelfA
777 if param.AcquireCache != 0 { 775 if param.AcquireCache != 0 {
778 srv.recoverCacheWithTaskRecord(cache, taskRecords) 776 srv.recoverCacheWithTaskRecord(cache, taskRecords)
779 } 777 }
780 - //// 区分任务来源分类  
781 - //for i := range taskRecords {  
782 - // it := taskRecords[i]  
783 - // if it.TaskCreatedBy == 0 {  
784 - // categoryTaskRecords = append(categoryTaskRecords, it)  
785 - // } else {  
786 - // assessTaskRecords = append(assessTaskRecords, it)  
787 - // }  
788 - //} 778 +
  779 + taskIdMap := map[int]int{}
  780 + taskIdArray := make([]int, 0)
  781 + for _, v := range taskRecords {
  782 + taskIdMap[v.TaskId] = v.TaskId
  783 + }
  784 + for _, v := range taskIdMap {
  785 + taskIdArray = append(taskIdArray, v)
  786 + }
  787 +
  788 + taskMap := map[int]*domain.Task{}
  789 + taskRepository := factory.CreateTaskRepository(map[string]interface{}{"transactionContext": transactionContext})
  790 + _, tasks, err := taskRepository.Find(map[string]interface{}{"ids": taskIdArray, "limit": len(taskIdArray)})
  791 + if err != nil {
  792 + return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, "获取里程碑数据:"+err.Error())
  793 + }
  794 + for i := range tasks {
  795 + taskMap[tasks[i].Id] = tasks[i]
  796 + }
  797 +
  798 + for i := range taskRecords {
  799 + it := taskRecords[i]
  800 + a := &adapter.TaskRecordAdapter{}
  801 + a.TaskRecord = it
  802 + if v, ok := taskMap[it.TaskId]; ok {
  803 + a.EndTime = v.EndTime
  804 + }
  805 + taskRecordAdapter = append(taskRecordAdapter, a)
  806 + }
789 } 807 }
790 808
791 if err := transactionContext.CommitTransaction(); err != nil { 809 if err := transactionContext.CommitTransaction(); err != nil {
@@ -810,9 +828,7 @@ func (srv StaffAssessServeice) GetAssessSelfInfoV2(param *query.GetExecutorSelfA @@ -810,9 +828,7 @@ func (srv StaffAssessServeice) GetAssessSelfInfoV2(param *query.GetExecutorSelfA
810 SupperUser: "", 828 SupperUser: "",
811 DutyTime: "", 829 DutyTime: "",
812 AssessContent: assessContentList, 830 AssessContent: assessContentList,
813 - //CategoryTaskRecords: categoryTaskRecords,  
814 - //AssessTaskRecords: assessTaskRecords,  
815 - TaskRecords: taskRecords, 831 + TaskRecords: taskRecordAdapter,
816 } 832 }
817 if staffDesc != nil { 833 if staffDesc != nil {
818 result.CompanyName = staffDesc.CompanyName 834 result.CompanyName = staffDesc.CompanyName
@@ -9,7 +9,7 @@ type UpdateTaskCommand struct { @@ -9,7 +9,7 @@ type UpdateTaskCommand struct {
9 RelatedUserId []string `json:"relatedUserId"` // 相关人员id 9 RelatedUserId []string `json:"relatedUserId"` // 相关人员id
10 SortBy int `json:"sortBy"` // 优先级排序;值越小优先级越高 10 SortBy int `json:"sortBy"` // 优先级排序;值越小优先级越高
11 EndTime int64 `json:"endTime"` // 任务截止的时间戳,单位:秒;等于0时表示未设置时间 11 EndTime int64 `json:"endTime"` // 任务截止的时间戳,单位:秒;等于0时表示未设置时间
12 - UseEndtime int `json:"useEndTime"` // 是否应用任务截止的时间;默认值0:不应用,1:应用 12 + UseEndTime int `json:"useEndTime"` // 是否应用任务截止的时间;默认值0:不应用,1:应用
13 StageList []struct { 13 StageList []struct {
14 Id int `json:"id,string"` 14 Id int `json:"id,string"`
15 Name string `json:"name"` //里程碑名称 15 Name string `json:"name"` //里程碑名称
@@ -2,6 +2,7 @@ package service @@ -2,6 +2,7 @@ package service
2 2
3 import ( 3 import (
4 "fmt" 4 "fmt"
  5 + "gitlab.fjmaimaimai.com/allied-creation/performance/pkg/application/log_opt"
5 "strconv" 6 "strconv"
6 "strings" 7 "strings"
7 "time" 8 "time"
@@ -116,8 +117,8 @@ func (srv TaskService) CreateTaskByProject(transactionContext application.Transa @@ -116,8 +117,8 @@ func (srv TaskService) CreateTaskByProject(transactionContext application.Transa
116 return nil 117 return nil
117 } 118 }
118 119
119 -// 创建任务  
120 -func (srv TaskService) CreateTask(param *command.CreateTaskCommand) (map[string]interface{}, error) { 120 +// CreateTask 创建任务
  121 +func (srv TaskService) CreateTask(param *command.CreateTaskCommand, userReq *domain.UserAuth) (map[string]interface{}, error) {
121 sortNamed := domain.TaskSortBy(param.SortBy) 122 sortNamed := domain.TaskSortBy(param.SortBy)
122 if sortNamed.Named() == "" { 123 if sortNamed.Named() == "" {
123 return nil, application.ThrowError(application.TRANSACTION_ERROR, "优先级设置错误") 124 return nil, application.ThrowError(application.TRANSACTION_ERROR, "优先级设置错误")
@@ -220,11 +221,15 @@ func (srv TaskService) CreateTask(param *command.CreateTaskCommand) (map[string] @@ -220,11 +221,15 @@ func (srv TaskService) CreateTask(param *command.CreateTaskCommand) (map[string]
220 if err := transactionContext.CommitTransaction(); err != nil { 221 if err := transactionContext.CommitTransaction(); err != nil {
221 return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error()) 222 return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
222 } 223 }
  224 +
  225 + // 生成创建日志
  226 + _ = log_opt.CreateTask(userReq, newTask)
  227 +
223 return map[string]interface{}{"id": newTask.Id}, nil 228 return map[string]interface{}{"id": newTask.Id}, nil
224 } 229 }
225 230
226 -// 更新任务  
227 -func (srv TaskService) UpdateTask(param *command.UpdateTaskCommand) (map[string]interface{}, error) { 231 +// UpdateTask 更新任务
  232 +func (srv TaskService) UpdateTask(param *command.UpdateTaskCommand, userReq *domain.UserAuth) (map[string]interface{}, error) {
228 transactionContext, err := factory.CreateTransactionContext(nil) 233 transactionContext, err := factory.CreateTransactionContext(nil)
229 if err != nil { 234 if err != nil {
230 return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error()) 235 return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
@@ -274,6 +279,14 @@ func (srv TaskService) UpdateTask(param *command.UpdateTaskCommand) (map[string] @@ -274,6 +279,14 @@ func (srv TaskService) UpdateTask(param *command.UpdateTaskCommand) (map[string]
274 if leaderList[0].CompanyId != int64(param.CompanyId) { 279 if leaderList[0].CompanyId != int64(param.CompanyId) {
275 return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, "负责人数据验证不通过") 280 return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, "负责人数据验证不通过")
276 } 281 }
  282 +
  283 + // 拷贝数据
  284 + var copyTask = taskData.Copy()
  285 + var copyStageList = make([]*domain.TaskStage, 0)
  286 + for _, v := range stageList {
  287 + copyStageList = append(copyStageList, v)
  288 + }
  289 +
277 //更新任务的相关人员 290 //更新任务的相关人员
278 relatedUserIds := []int{} 291 relatedUserIds := []int{}
279 for _, val := range param.RelatedUserId { 292 for _, val := range param.RelatedUserId {
@@ -382,7 +395,7 @@ func (srv TaskService) UpdateTask(param *command.UpdateTaskCommand) (map[string] @@ -382,7 +395,7 @@ func (srv TaskService) UpdateTask(param *command.UpdateTaskCommand) (map[string]
382 } else { 395 } else {
383 taskData.EndTime = dayEndTime(time.Unix(param.EndTime, 10)).Unix() 396 taskData.EndTime = dayEndTime(time.Unix(param.EndTime, 10)).Unix()
384 } 397 }
385 - taskData.UseEndTime = param.UseEndtime 398 + taskData.UseEndTime = param.UseEndTime
386 taskData.AssistFlagMax = param.AssistFlagMax 399 taskData.AssistFlagMax = param.AssistFlagMax
387 err = taskRepo.Save(taskData) 400 err = taskRepo.Save(taskData)
388 if err != nil { 401 if err != nil {
@@ -420,6 +433,10 @@ func (srv TaskService) UpdateTask(param *command.UpdateTaskCommand) (map[string] @@ -420,6 +433,10 @@ func (srv TaskService) UpdateTask(param *command.UpdateTaskCommand) (map[string]
420 if err := transactionContext.CommitTransaction(); err != nil { 433 if err := transactionContext.CommitTransaction(); err != nil {
421 return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error()) 434 return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
422 } 435 }
  436 +
  437 + // 生成更新日志
  438 + _ = log_opt.UpdateTask(userReq, &copyTask, taskData, copyStageList, stageList)
  439 +
423 return map[string]interface{}{ 440 return map[string]interface{}{
424 "id": param.Id, 441 "id": param.Id,
425 }, nil 442 }, nil
  1 +package domain
  2 +
  3 +import "time"
  4 +
  5 +type OptMethod int
  6 +
  7 +const (
  8 + CREATE OptMethod = 1 // 创建
  9 + UPDATE OptMethod = 2 // 更新
  10 + DELETE OptMethod = 3 // 删除
  11 +)
  12 +
  13 +// LogOpt 操作日志
  14 +type LogOpt struct {
  15 + //OptModule string `json:"optModule" comment:"操作模块"`
  16 + Id int `json:"id,string" comment:"ID" pg:"id,pk"`
  17 + CompanyId int `json:"companyId" comment:"公司ID"`
  18 + Operator StaffDesc `json:"operator" comment:"操作人"`
  19 + OptMethod OptMethod `json:"optMethod" comment:"操作方法"`
  20 + OptTargetId string `json:"optTargetId" comment:"操作目标ID"`
  21 + OptField string `json:"optField" comment:"操作字段"`
  22 + OptValue string `json:"optValue" comment:"操作字段值"`
  23 + CreatedAt time.Time `json:"createdAt" comment:"创建时间"`
  24 + UpdatedAt time.Time `json:"updatedAt" comment:"更新时间"`
  25 + DeletedAt *time.Time `json:"deletedAt" comment:"删除时间"`
  26 +}
  27 +
  28 +type LogOptRepository interface {
  29 + Insert(opt *LogOpt) (*LogOpt, error)
  30 + Remove(opt *LogOpt) (*LogOpt, error)
  31 + FindOne(queryOptions map[string]interface{}) (*LogOpt, error)
  32 + Find(queryOptions map[string]interface{}) (int64, []*LogOpt, error)
  33 + Count(queryOptions map[string]interface{}) (int64, error)
  34 +}
@@ -51,6 +51,7 @@ func init() { @@ -51,6 +51,7 @@ func init() {
51 &models.SummaryEvaluationValue{}, 51 &models.SummaryEvaluationValue{},
52 &models.Permission{}, 52 &models.Permission{},
53 &models.LogSms{}, 53 &models.LogSms{},
  54 + &models.LogOpt{},
54 &models.MessagePersonal{}, 55 &models.MessagePersonal{},
55 &models.Task{}, 56 &models.Task{},
56 &models.TaskStage{}, 57 &models.TaskStage{},
  1 +package models
  2 +
  3 +import (
  4 + "gitlab.fjmaimaimai.com/allied-creation/performance/pkg/domain"
  5 + "time"
  6 +)
  7 +
  8 +// LogOpt 操作日志
  9 +type LogOpt struct {
  10 + //OptModule string `comment:"操作模块"`
  11 + tableName struct{} `comment:"操作日志" pg:"log_opt"`
  12 + Id int `comment:"ID" pg:"id,pk"`
  13 + CompanyId int `comment:"公司ID"`
  14 + Operator domain.StaffDesc `comment:"操作人"`
  15 + OptMethod domain.OptMethod `comment:"操作方法"`
  16 + OptTargetId string `comment:"操作目标ID"`
  17 + OptField string `comment:"操作字段"`
  18 + OptValue string `comment:"操作字段值"`
  19 + CreatedAt time.Time `comment:"创建时间"`
  20 + UpdatedAt time.Time `comment:"更新时间"`
  21 + DeletedAt *time.Time `comment:"删除时间"`
  22 +}
  1 +package repository
  2 +
  3 +import (
  4 + "errors"
  5 + "fmt"
  6 + "time"
  7 +
  8 + "github.com/go-pg/pg/v10"
  9 + "github.com/linmadan/egglib-go/persistent/pg/sqlbuilder"
  10 + pgTransaction "github.com/linmadan/egglib-go/transaction/pg"
  11 + "gitlab.fjmaimaimai.com/allied-creation/performance/pkg/domain"
  12 + "gitlab.fjmaimaimai.com/allied-creation/performance/pkg/infrastructure/pg/models"
  13 + "gitlab.fjmaimaimai.com/allied-creation/performance/pkg/utils"
  14 +)
  15 +
  16 +type LogOptRepository struct {
  17 + transactionContext *pgTransaction.TransactionContext
  18 +}
  19 +
  20 +func NewLogOptRepository(transactionContext *pgTransaction.TransactionContext) *LogOptRepository {
  21 + return &LogOptRepository{transactionContext: transactionContext}
  22 +}
  23 +
  24 +func (repo *LogOptRepository) TransformToDomain(m *models.LogOpt) domain.LogOpt {
  25 + return domain.LogOpt{
  26 + Id: m.Id,
  27 + CompanyId: m.CompanyId,
  28 + Operator: m.Operator,
  29 + OptMethod: m.OptMethod,
  30 + OptTargetId: m.OptTargetId,
  31 + OptField: m.OptField,
  32 + OptValue: m.OptValue,
  33 + CreatedAt: m.CreatedAt.Local(),
  34 + UpdatedAt: m.UpdatedAt.Local(),
  35 + DeletedAt: m.DeletedAt,
  36 + }
  37 +}
  38 +
  39 +func (repo *LogOptRepository) TransformToModel(d *domain.LogOpt) models.LogOpt {
  40 + return models.LogOpt{
  41 + Id: d.Id,
  42 + CompanyId: d.CompanyId,
  43 + Operator: d.Operator,
  44 + OptMethod: d.OptMethod,
  45 + OptTargetId: d.OptTargetId,
  46 + OptField: d.OptField,
  47 + OptValue: d.OptValue,
  48 + CreatedAt: d.CreatedAt,
  49 + UpdatedAt: d.UpdatedAt,
  50 + DeletedAt: d.DeletedAt,
  51 + }
  52 +}
  53 +
  54 +func (repo *LogOptRepository) Insert(d *domain.LogOpt) (*domain.LogOpt, error) {
  55 + var isCreate = d.Id == 0
  56 + if isCreate {
  57 + id, err := utils.NewSnowflakeId()
  58 + if err != nil {
  59 + return d, err
  60 + }
  61 + d.Id = int(id)
  62 + d.CreatedAt = time.Now()
  63 + d.UpdatedAt = d.CreatedAt
  64 + } else {
  65 + d.UpdatedAt = time.Now()
  66 + }
  67 + m := repo.TransformToModel(d)
  68 + tx := repo.transactionContext.PgTx
  69 + var err error
  70 + if isCreate {
  71 + _, err = tx.Model(&m).Returning("id").Insert()
  72 + } else {
  73 + _, err = tx.Model(&m).Returning("id").WherePK().Update() // 更新和删除必须增加条件
  74 + }
  75 + if err != nil {
  76 + return nil, err
  77 + }
  78 + d.Id = m.Id
  79 + return d, nil
  80 +}
  81 +
  82 +func (repo *LogOptRepository) Remove(d *domain.LogOpt) (*domain.LogOpt, error) {
  83 + tx := repo.transactionContext.PgTx
  84 + nowTime := time.Now()
  85 + m := repo.TransformToModel(d)
  86 + m.DeletedAt = &nowTime
  87 + if _, err := tx.Model(&m).WherePK().Update(); err != nil {
  88 + return d, err
  89 + }
  90 + return d, nil
  91 +}
  92 +
  93 +func (repo *LogOptRepository) FindOne(queryOptions map[string]interface{}) (*domain.LogOpt, error) {
  94 + tx := repo.transactionContext.PgTx
  95 + m := new(models.LogOpt)
  96 + query := tx.Model(m)
  97 + query.Where("deleted_at isnull")
  98 + if id, ok := queryOptions["id"]; ok {
  99 + query.Where("id=?", id)
  100 + }
  101 + if err := query.First(); err != nil {
  102 + if errors.Is(err, pg.ErrNoRows) {
  103 + return nil, fmt.Errorf("没有此资源")
  104 + } else {
  105 + return nil, err
  106 + }
  107 + }
  108 + u := repo.TransformToDomain(m)
  109 + return &u, nil
  110 +}
  111 +
  112 +func (repo *LogOptRepository) Find(queryOptions map[string]interface{}) (int64, []*domain.LogOpt, error) {
  113 + tx := repo.transactionContext.PgTx
  114 + var m []*models.LogOpt
  115 +
  116 + query := tx.Model(&m).Where("deleted_at isnull")
  117 +
  118 + if v, ok := queryOptions["ids"]; ok {
  119 + query.Where("id in (?)", pg.In(v))
  120 + }
  121 +
  122 + if v, ok := queryOptions["id"]; ok {
  123 + query.Where("id=?", v)
  124 + }
  125 +
  126 + if v, ok := queryOptions["companyId"]; ok {
  127 + query.Where("company_id = ?", v)
  128 + }
  129 +
  130 + if v, ok := queryOptions["optTargetId"]; ok {
  131 + query.Where("opt_target_id = ?", v)
  132 + }
  133 +
  134 + if v, ok := queryOptions["limit"].(int64); ok {
  135 + query.Limit(int(v))
  136 + }
  137 + if v, ok := queryOptions["offset"].(int64); ok {
  138 + query.Offset(int(v))
  139 + }
  140 +
  141 + // 按创建时间降序
  142 + query.Order("created_at DESC")
  143 +
  144 + count, err := query.SelectAndCount()
  145 + if err != nil {
  146 + return 0, nil, err
  147 + }
  148 + var arrays []*domain.LogOpt
  149 + for _, v := range m {
  150 + d := repo.TransformToDomain(v)
  151 + arrays = append(arrays, &d)
  152 + }
  153 + return int64(count), arrays, nil
  154 +}
  155 +
  156 +func (repo *LogOptRepository) Count(queryOptions map[string]interface{}) (int64, error) {
  157 + tx := repo.transactionContext.PgTx
  158 + m := new(models.LogOpt)
  159 + query := sqlbuilder.BuildQuery(tx.Model(m), queryOptions)
  160 + query.Where("deleted_at isnull")
  161 +
  162 + if id, ok := queryOptions["id"]; ok {
  163 + query.Where("id = ?", id)
  164 + }
  165 +
  166 + if notId, ok := queryOptions["notId"]; ok {
  167 + query.Where("id != ?", notId)
  168 + }
  169 +
  170 + if v, ok := queryOptions["companyId"]; ok {
  171 + query.Where("company_id = ?", v)
  172 + }
  173 +
  174 + count, err := query.Count()
  175 + if err != nil {
  176 + return 0, err
  177 + }
  178 + return int64(count), nil
  179 +}
@@ -145,6 +145,9 @@ func (repo *TaskRepository) Find(queryOptions map[string]interface{}) (int, []*d @@ -145,6 +145,9 @@ func (repo *TaskRepository) Find(queryOptions map[string]interface{}) (int, []*d
145 if val, ok := queryOptions["id"]; ok { 145 if val, ok := queryOptions["id"]; ok {
146 query.Where("task.id=?", val) 146 query.Where("task.id=?", val)
147 } 147 }
  148 + if val, ok := queryOptions["ids"]; ok {
  149 + query.Where("task.id in(?)", pg.In(val))
  150 + }
148 if val, ok := queryOptions["leaderId"]; ok { 151 if val, ok := queryOptions["leaderId"]; ok {
149 query.Where("task.leader->>'id'=?", val) 152 query.Where("task.leader->>'id'=?", val)
150 } 153 }
  1 +package controllers
  2 +
  3 +import (
  4 + "github.com/linmadan/egglib-go/core/application"
  5 + "github.com/linmadan/egglib-go/web/beego"
  6 + service "gitlab.fjmaimaimai.com/allied-creation/performance/pkg/application/log_opt"
  7 + "gitlab.fjmaimaimai.com/allied-creation/performance/pkg/application/log_opt/command"
  8 + "gitlab.fjmaimaimai.com/allied-creation/performance/pkg/port/beego/middlewares"
  9 +)
  10 +
  11 +type LogOptController struct {
  12 + beego.BaseController
  13 +}
  14 +
  15 +func (controller *LogOptController) ListLog() {
  16 + logService := service.NewLogOptService()
  17 + in := &command.QueryLogCommand{}
  18 + if err := controller.Unmarshal(in); err != nil {
  19 + controller.Response(nil, application.ThrowError(application.ARG_ERROR, err.Error()))
  20 + } else {
  21 + ua := middlewares.GetUser(controller.Ctx)
  22 + in.CompanyId = ua.CompanyId
  23 + controller.Response(logService.List(in))
  24 + }
  25 +}
@@ -41,7 +41,7 @@ func (c *TaskController) UpdateTask() { @@ -41,7 +41,7 @@ func (c *TaskController) UpdateTask() {
41 } 41 }
42 userReq := middlewares.GetUser(c.Ctx) 42 userReq := middlewares.GetUser(c.Ctx)
43 paramReq.CompanyId = int(userReq.CompanyId) 43 paramReq.CompanyId = int(userReq.CompanyId)
44 - data, err := srv.UpdateTask(paramReq) 44 + data, err := srv.UpdateTask(paramReq, userReq)
45 c.Response(data, err) 45 c.Response(data, err)
46 } 46 }
47 47
@@ -57,7 +57,7 @@ func (c *TaskController) CreateTask() { @@ -57,7 +57,7 @@ func (c *TaskController) CreateTask() {
57 } 57 }
58 userReq := middlewares.GetUser(c.Ctx) 58 userReq := middlewares.GetUser(c.Ctx)
59 paramReq.CompanyId = int(userReq.CompanyId) 59 paramReq.CompanyId = int(userReq.CompanyId)
60 - resp, err := srv.CreateTask(paramReq) 60 + resp, err := srv.CreateTask(paramReq, userReq)
61 c.Response(resp, err) 61 c.Response(resp, err)
62 } 62 }
63 63
  1 +package routers
  2 +
  3 +import (
  4 + "github.com/beego/beego/v2/server/web"
  5 + "github.com/linmadan/egglib-go/web/beego/filters"
  6 + "gitlab.fjmaimaimai.com/allied-creation/performance/pkg/port/beego/controllers"
  7 + "gitlab.fjmaimaimai.com/allied-creation/performance/pkg/port/beego/middlewares"
  8 +)
  9 +
  10 +func init() {
  11 + ns := web.NewNamespace("/v1/log-opt",
  12 + web.NSBefore(filters.AllowCors(), middlewares.CheckAdminToken()),
  13 + web.NSRouter("/list", &controllers.LogOptController{}, "Post:ListLog"),
  14 + )
  15 +
  16 + web.AddNamespace(ns)
  17 +}