Performance.go 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371
  1. package services
  2. import (
  3. "ERP_salary/dto"
  4. db "ERP_salary/initialize"
  5. "ERP_salary/logs"
  6. "ERP_salary/models/Account"
  7. models "ERP_salary/models/Performance"
  8. "errors"
  9. "gogs.baozhida.cn/zoie/ERP_libs/lib"
  10. )
  11. type Performance struct {
  12. }
  13. func (e *Performance) GetPage(c *dto.PerformanceUserPageReq) (list []models.Perf, cnt int64) {
  14. var err error
  15. err = db.DB.Model(&models.Perf{}).
  16. Scopes(
  17. dto.MakeCondition(c.GetNeedSearch()),
  18. dto.Paginate(c.GetPageSize(), c.GetPageIndex()),
  19. dto.WithNormalState(),
  20. ).
  21. Preload("PointList", "t__state = ?", 1).
  22. Preload("PointList.PerformancePoints").
  23. Preload("Target", "t__state = ?", 1).
  24. Find(&list).Limit(-1).Offset(-1).
  25. Count(&cnt).Error
  26. if err != nil {
  27. logs.Error("db error: %s ", err)
  28. return
  29. }
  30. for i := 0; i < len(list); i++ {
  31. list[i].T_submit_name = Account.Read_User_T_name_Get(list[i].T_submit)
  32. }
  33. return
  34. }
  35. func (e *Performance) GetManagerPage(c *dto.PerformancePageReq) (list []models.Perf, cnt int64) {
  36. var err error
  37. err = db.DB.Model(&models.Perf{}).
  38. Scopes(
  39. dto.MakeCondition(c.GetNeedSearch()),
  40. dto.Paginate(c.GetPageSize(), c.GetPageIndex()),
  41. dto.WithNormalState(),
  42. ).
  43. Where("t_audit in (?)", []int{2, 3}).
  44. Preload("PointList", "t__state = ?", 1).
  45. Preload("PointList.PerformancePoints").
  46. Preload("Target", "t__state = ?", 1).
  47. Find(&list).Limit(-1).Offset(-1).
  48. Count(&cnt).Error
  49. if err != nil {
  50. logs.Error("db error: %s ", err)
  51. return
  52. }
  53. for i := 0; i < len(list); i++ {
  54. list[i].T_submit_name = Account.Read_User_T_name_Get(list[i].T_submit)
  55. }
  56. return
  57. }
  58. func (e *Performance) GetSubmitUserPage() (list []string) {
  59. var err error
  60. err = db.DB.Model(&models.Perf{}).
  61. Select("Distinct t_submit").
  62. Scopes(
  63. dto.WithNormalState(),
  64. ).
  65. Where("t_audit in (?)", []int{2, 3}).
  66. Find(&list).Error
  67. if err != nil {
  68. logs.Error("db error: %s ", err)
  69. return
  70. }
  71. return
  72. }
  73. // GetPerfPointsByPerfId 根据绩效ID获取关联的绩效点列表
  74. func (e *Performance) GetPerfPointsByPerfId(perfId int) (pointList []models.PerfPoint, err error) {
  75. err = db.DB.Model(&models.PerfPoint{}).
  76. Scopes(dto.WithNormalState()).
  77. Where("t_performance_id = ?", perfId).
  78. Find(&pointList).Error
  79. if err != nil {
  80. logs.Error("获取绩效点列表失败: %s", err)
  81. return
  82. }
  83. // 获取绩效点详细信息
  84. for i := range pointList {
  85. var performancePoints models.PerformancePoints
  86. err = db.DB.Model(&models.PerformancePoints{}).
  87. Scopes(dto.WithNormalState()).
  88. Where("id = ?", pointList[i].T_performance_points_id).
  89. First(&performancePoints).Error
  90. if err == nil {
  91. pointList[i].PerformancePoints = performancePoints
  92. }
  93. }
  94. return
  95. }
  96. // InsertFromStats 从统计结果插入绩效记录
  97. func (e *Performance) InsertFromStats(perf *models.Perf, pointList []models.PerfPoint) (id int, err error) {
  98. tx := db.DB.Begin()
  99. defer func() {
  100. if err != nil {
  101. tx.Rollback()
  102. } else {
  103. tx.Commit()
  104. }
  105. }()
  106. // 创建绩效主记录
  107. err = tx.Create(perf).Error
  108. if err != nil {
  109. logs.Error("创建绩效主记录失败: %s", err)
  110. return
  111. }
  112. // 设置绩效点的关联ID
  113. for i := range pointList {
  114. pointList[i].T_performance_id = perf.Id
  115. pointList[i].T_State = 1
  116. }
  117. // 批量创建绩效点记录
  118. if len(pointList) > 0 {
  119. err = tx.Create(&pointList).Error
  120. if err != nil {
  121. logs.Error("创建绩效点记录失败: %s", err)
  122. return
  123. }
  124. }
  125. id = perf.Id
  126. return
  127. }
  128. // Get 获取单个绩效记录
  129. func (e *Performance) Get(c dto.PerformanceGetReq) (r models.Perf, err error) {
  130. err = db.DB.Scopes(dto.WithNormalState()).Preload("Target", "t__state = ?", 1).First(&r, c.GetId()).Error
  131. if err != nil {
  132. logs.Error("db error: %s", err)
  133. return
  134. }
  135. return
  136. }
  137. // 添加
  138. func (e *Performance) Insert(c *dto.PerformanceInsertReq) (id int, err error) {
  139. var data models.Perf
  140. // 开启事务
  141. tx := db.DB.Begin()
  142. defer func() {
  143. if err != nil {
  144. tx.Rollback()
  145. } else {
  146. tx.Commit()
  147. }
  148. }()
  149. // 生成主表数据
  150. c.Generate(&data)
  151. // 唯一性校验:同一月份+同一用户不可重复
  152. {
  153. var cnt int64
  154. query := db.DB.Model(&models.Perf{}).
  155. Scopes(dto.WithNormalState()).
  156. Where("t_date = ? AND t_submit = ?", data.T_date, data.T_submit)
  157. err = query.Count(&cnt).Error
  158. if err != nil {
  159. logs.Error("db error: %s", err)
  160. return
  161. }
  162. if cnt > 0 {
  163. return 0, errors.New("当月该用户已添加过该绩效")
  164. }
  165. }
  166. // 读取员工考核指标,设置考核绩效点
  167. user := Account.Read_User_Get(data.T_submit)
  168. if user.T_verify_perf_target == 0 {
  169. return 0, errors.New("用户未配置工资级别,请联系管理员配置!")
  170. }
  171. targetSvc := PerformanceTarget{}
  172. target, _ := targetSvc.Get(user.T_verify_perf_target)
  173. if target.Id > 0 {
  174. data.T_assess_points = target.T_assess_points
  175. data.T_perf = target.T_perf
  176. data.T_performance_target_id = target.Id
  177. }
  178. // 根据绩效点明细计算工作量
  179. if len(c.PointList) > 0 {
  180. totalWorkload := 0.0
  181. for _, p := range c.PointList {
  182. if p.T_points_denominator != 0 {
  183. totalWorkload += float64(p.T_points_numerator) / float64(p.T_points_denominator) * float64(p.T_quantity)
  184. }
  185. }
  186. data.T_workload = totalWorkload
  187. }
  188. // 创建绩效主记录
  189. err = tx.Create(&data).Error
  190. if err != nil {
  191. logs.Error("db error: %s", err)
  192. return
  193. }
  194. // 批量创建绩效点明细
  195. if len(c.PointList) > 0 {
  196. for i := range c.PointList {
  197. c.PointList[i].T_performance_id = data.Id
  198. c.PointList[i].T_State = 1
  199. }
  200. err = tx.Create(&c.PointList).Error
  201. if err != nil {
  202. logs.Error("db error: %s", err)
  203. return
  204. }
  205. }
  206. id = data.Id
  207. return
  208. }
  209. // 修改
  210. func (e *Performance) Update(c *dto.PerformanceUpdateReq) error {
  211. var performance = models.Perf{}
  212. err := db.DB.Scopes(dto.WithNormalState()).First(&performance, c.GetId()).Error
  213. if err != nil {
  214. logs.Error("db error: %s", err)
  215. return dto.GetFailedErr
  216. }
  217. // 已打款 不可修改
  218. if performance.T_audit == 3 {
  219. logs.Error("db error: %s", err)
  220. return errors.New("已打款,不可修改")
  221. }
  222. tx := db.DB.Begin()
  223. defer func() {
  224. if err != nil {
  225. tx.Rollback()
  226. } else {
  227. tx.Commit()
  228. }
  229. }()
  230. // 先根据请求生成需要更新的主记录字段
  231. c.Generate(&performance)
  232. // 如 T_submit 可能变更,则刷新考核指标
  233. user := Account.Read_User_Get(performance.T_submit)
  234. targetSvc := PerformanceTarget{}
  235. target, _ := targetSvc.Get(user.T_verify_perf_target)
  236. if target.Id > 0 {
  237. performance.T_assess_points = target.T_assess_points
  238. performance.T_perf = target.T_perf
  239. performance.T_performance_target_id = target.Id
  240. }
  241. // 重新计算工作量(基于新绩效点列表)
  242. if len(c.PointList) > 0 {
  243. totalWorkload := 0.0
  244. for _, p := range c.PointList {
  245. if p.T_points_denominator != 0 {
  246. totalWorkload += float64(p.T_points_numerator) / float64(p.T_points_denominator) * float64(p.T_quantity)
  247. }
  248. }
  249. performance.T_workload = totalWorkload
  250. }
  251. // 保存主记录
  252. err = tx.Save(&performance).Error
  253. if err != nil {
  254. logs.Error("db error: %s", err)
  255. return err
  256. }
  257. // 软删除旧的绩效点
  258. if err = tx.Model(&models.PerfPoint{}).
  259. Where("t_performance_id = ? AND t__state = ?", performance.Id, 1).
  260. Update("t__state", 0).Error; err != nil {
  261. logs.Error("db error: %s", err)
  262. return err
  263. }
  264. // 插入新的绩效点列表
  265. if len(c.PointList) > 0 {
  266. for i := range c.PointList {
  267. c.PointList[i].T_performance_id = performance.Id
  268. c.PointList[i].T_State = 1
  269. }
  270. if err = tx.Create(&c.PointList).Error; err != nil {
  271. logs.Error("db error: %s", err)
  272. return err
  273. }
  274. }
  275. return nil
  276. }
  277. func (e *Performance) UpdateAudit(c *dto.PerformanceUpdateAuditReq) error {
  278. var performance = models.Perf{}
  279. err := db.DB.Scopes(dto.WithNormalState()).First(&performance, c.GetId()).Error
  280. if err != nil {
  281. logs.Error("db error: %s", err)
  282. return dto.GetFailedErr
  283. }
  284. // 已打款 不可修改
  285. if performance.T_audit == 1 && c.T_audit == 3 {
  286. logs.Error("db error: %s", err)
  287. return errors.New("未提交,不可修改")
  288. }
  289. tx := db.DB.Begin()
  290. defer func() {
  291. if err != nil {
  292. tx.Rollback()
  293. } else {
  294. tx.Commit()
  295. }
  296. }()
  297. performance.T_audit = c.T_audit
  298. // 保存主记录
  299. err = tx.Save(&performance).Error
  300. if err != nil {
  301. logs.Error("db error: %s", err)
  302. return err
  303. }
  304. return nil
  305. }
  306. // 删除
  307. func (e *Performance) Delete(c *dto.PerformanceDeleteReq) error {
  308. var performance = models.Perf{}
  309. err := db.DB.Scopes(dto.WithNormalState()).First(&performance, c.GetId()).Error
  310. if err != nil {
  311. logs.Error("db error: %s", err)
  312. return dto.GetFailedErr
  313. }
  314. performance.T_State = 0
  315. err = db.DB.Save(&performance).Error
  316. if err != nil {
  317. logs.Error(lib.FuncName(), err)
  318. return dto.DeleteFailedErr
  319. }
  320. return nil
  321. }