Commit edc57409c567f780c40f6447bdd5e574b4193038
1 parent
db4579e4
feature(*): 考评奖惩分配
考评奖惩分配
Showing
24 changed files
with
987 additions
and
127 deletions
fw-morax-common/src/main/java/cn/fw/morax/common/pojo/event/ImportEvalIndicatorEvent.java
... | ... | @@ -10,21 +10,35 @@ import java.time.YearMonth; |
10 | 10 | |
11 | 11 | @Data |
12 | 12 | @Builder |
13 | -@AllArgsConstructor | |
14 | -@NoArgsConstructor | |
15 | 13 | public class ImportEvalIndicatorEvent { |
14 | + | |
15 | + /** | |
16 | + * 考评指标 | |
17 | + */ | |
18 | + private String code; | |
16 | 19 | /** |
17 | 20 | * 考评指标导入记录id |
18 | 21 | */ |
19 | 22 | private Long evalIndicatorImportRecordId; |
20 | 23 | |
21 | 24 | /** |
22 | - * 数据日期 | |
25 | + * 集团id | |
23 | 26 | */ |
24 | - private LocalDate dataDate; | |
27 | + private Long groupId; | |
25 | 28 | |
26 | 29 | /** |
27 | - * 考评指标 | |
30 | + * 数据日期 | |
28 | 31 | */ |
29 | - private String code; | |
32 | + private LocalDate dataDate; | |
33 | + | |
34 | + | |
35 | + public ImportEvalIndicatorEvent() { | |
36 | + } | |
37 | + | |
38 | + public ImportEvalIndicatorEvent(String code, Long evalIndicatorImportRecordId, Long groupId, LocalDate dataDate) { | |
39 | + this.code = code; | |
40 | + this.evalIndicatorImportRecordId = evalIndicatorImportRecordId; | |
41 | + this.groupId = groupId; | |
42 | + this.dataDate = dataDate; | |
43 | + } | |
30 | 44 | } | ... | ... |
fw-morax-dao/src/main/java/cn/fw/morax/dao/eval/EvalGroupRewardTargetHitLogDao.java
... | ... | @@ -6,6 +6,7 @@ import cn.fw.morax.domain.enums.IndicatorTypeEnum; |
6 | 6 | import cn.fw.morax.domain.vo.eval.EvalGroupIndicatorTargetHitLogVO; |
7 | 7 | import cn.fw.morax.domain.vo.eval.EvalGroupRewardTargetHitLogVO; |
8 | 8 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; |
9 | +import org.apache.ibatis.annotations.Param; | |
9 | 10 | |
10 | 11 | import java.time.YearMonth; |
11 | 12 | import java.util.List; |
... | ... | @@ -21,6 +22,10 @@ import java.util.Set; |
21 | 22 | */ |
22 | 23 | public interface EvalGroupRewardTargetHitLogDao extends BaseMapper<EvalGroupRewardTargetHitLog> { |
23 | 24 | |
24 | - List<EvalGroupRewardTargetHitLogVO> getIndicatorData(Long referId, YearMonth monthly, IndicatorTypeEnum targetType, Set<Long> poolIds, Integer evalScope); | |
25 | + List<EvalGroupRewardTargetHitLogVO> getIndicatorData(@Param("referId") Long referId, | |
26 | + @Param("monthly") YearMonth monthly, | |
27 | + @Param("targetType") IndicatorTypeEnum targetType, | |
28 | + @Param("poolIds") Set<Long> poolIds, | |
29 | + @Param("scopeType") Integer scopeType); | |
25 | 30 | |
26 | 31 | } | ... | ... |
fw-morax-dao/src/main/java/cn/fw/morax/dao/eval/EvalRewardDistDao.java
0 → 100644
1 | +package cn.fw.morax.dao.eval; | |
2 | + | |
3 | + | |
4 | +import cn.fw.morax.domain.db.eval.EvalRewardDist; | |
5 | +import com.baomidou.mybatisplus.core.mapper.BaseMapper; | |
6 | + | |
7 | +/** | |
8 | + * <p> | |
9 | + * 考评门店奖惩分配 Mapper 接口 | |
10 | + * </p> | |
11 | + * | |
12 | + * @author jiangchao | |
13 | + * @since 2023-02-23 | |
14 | + */ | |
15 | +public interface EvalRewardDistDao extends BaseMapper<EvalRewardDist> { | |
16 | + | |
17 | +} | ... | ... |
fw-morax-dao/src/main/java/cn/fw/morax/dao/eval/EvalRewardDistDetailDao.java
0 → 100644
1 | +package cn.fw.morax.dao.eval; | |
2 | + | |
3 | + | |
4 | +import cn.fw.morax.domain.db.eval.EvalRewardDistDetail; | |
5 | +import com.baomidou.mybatisplus.core.mapper.BaseMapper; | |
6 | + | |
7 | +/** | |
8 | + * <p> | |
9 | + * 考评池 Mapper 接口 | |
10 | + * </p> | |
11 | + * | |
12 | + * @author jiangchao | |
13 | + * @since 2023-02-23 | |
14 | + */ | |
15 | +public interface EvalRewardDistDetailDao extends BaseMapper<EvalRewardDistDetail> { | |
16 | + | |
17 | +} | ... | ... |
fw-morax-dao/src/main/resources/mapper/eval/EvalGroupRewardTargetHitLogMapper.xml
... | ... | @@ -21,16 +21,16 @@ |
21 | 21 | FROM |
22 | 22 | eval_group_reward_target_hit_log |
23 | 23 | WHERE |
24 | - DATE_FORMAT( data_date, '%Y-%m' ) = #{monthly} | |
24 | + DATE_FORMAT( data_date, '%Y-%m' ) >= #{monthly} | |
25 | 25 | AND pool_id IN |
26 | 26 | <foreach collection="poolIds" item="poolId" separator=" , " open="(" close=")"> |
27 | 27 | #{poolId} |
28 | 28 | </foreach> |
29 | 29 | AND refer_id = #{referId} |
30 | - AND eval_scope = #{evalScope} | |
30 | + AND scope_type = #{scopeType} | |
31 | 31 | AND target_type = #{targetType} |
32 | 32 | GROUP BY |
33 | - user_id | |
33 | + pool_id | |
34 | 34 | ); |
35 | 35 | </select> |
36 | 36 | ... | ... |
fw-morax-dao/src/main/resources/mapper/eval/EvalRewardDistDao.xml
0 → 100644
1 | +<?xml version="1.0" encoding="UTF-8"?> | |
2 | +<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> | |
3 | +<mapper namespace="cn.fw.morax.dao.eval.EvalRewardDistDao"> | |
4 | + | |
5 | + <!-- 通用查询映射结果 --> | |
6 | + <resultMap id="BaseResultMap" type="cn.fw.morax.domain.db.eval.EvalRewardDist"> | |
7 | + <result column="id" property="id"/> | |
8 | + <result column="user_id" property="userId"/> | |
9 | + <result column="eval_id" property="evalId"/> | |
10 | + <result column="eval_group_ids" property="evalGroupIds"/> | |
11 | + <result column="eval_shop_pool_ids" property="evalShopPoolIds"/> | |
12 | + <result column="shop_ids" property="shopIds"/> | |
13 | + <result column="reward" property="reward"/> | |
14 | + <result column="status" property="status"/> | |
15 | + <result column="group_id" property="groupId"/> | |
16 | + <result column="yn" property="yn"/> | |
17 | + <result column="create_time" property="createTime"/> | |
18 | + <result column="update_time" property="updateTime"/> | |
19 | + </resultMap> | |
20 | + | |
21 | + | |
22 | +</mapper> | |
0 | 23 | \ No newline at end of file | ... | ... |
fw-morax-dao/src/main/resources/mapper/eval/EvalRewardDistDetailDao.xml
0 → 100644
1 | +<?xml version="1.0" encoding="UTF-8"?> | |
2 | +<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> | |
3 | +<mapper namespace="cn.fw.morax.dao.eval.EvalRewardDistDetailDao"> | |
4 | + | |
5 | + <!-- 通用查询映射结果 --> | |
6 | + <resultMap id="BaseResultMap" type="cn.fw.morax.domain.db.eval.EvalRewardDistDetail"> | |
7 | + <result column="id" property="id"/> | |
8 | + <result column="eval_shop_dist_id" property="evalShopDistId"/> | |
9 | + <result column="user_id" property="userId"/> | |
10 | + <result column="user_name" property="userName"/> | |
11 | + <result column="post_id" property="postId"/> | |
12 | + <result column="post_name" property="postName"/> | |
13 | + <result column="shop_id" property="shopId"/> | |
14 | + <result column="shop_name" property="shopName"/> | |
15 | + <result column="reward" property="reward"/> | |
16 | + <result column="status" property="status"/> | |
17 | + <result column="group_id" property="groupId"/> | |
18 | + <result column="yn" property="yn"/> | |
19 | + <result column="create_time" property="createTime"/> | |
20 | + <result column="update_time" property="updateTime"/> | |
21 | + </resultMap> | |
22 | + | |
23 | + | |
24 | +</mapper> | |
0 | 25 | \ No newline at end of file | ... | ... |
fw-morax-domain/src/main/java/cn/fw/morax/domain/db/eval/EvalRewardDist.java
0 → 100644
1 | +package cn.fw.morax.domain.db.eval; | |
2 | + | |
3 | +import cn.fw.common.data.entity.BaseAuditableTimeEntity; | |
4 | +import cn.fw.common.data.mybatis.handler.LongListTypeHandler; | |
5 | +import com.baomidou.mybatisplus.annotation.TableField; | |
6 | +import com.baomidou.mybatisplus.annotation.TableLogic; | |
7 | +import com.baomidou.mybatisplus.annotation.TableName; | |
8 | +import lombok.Data; | |
9 | +import lombok.EqualsAndHashCode; | |
10 | +import lombok.experimental.Accessors; | |
11 | + | |
12 | +import java.io.Serializable; | |
13 | +import java.math.BigDecimal; | |
14 | +import java.time.LocalDateTime; | |
15 | +import java.util.List; | |
16 | + | |
17 | +/** | |
18 | + * <p> | |
19 | + * 考评门店奖惩分配 | |
20 | + * </p> | |
21 | + * | |
22 | + * @author jiangchao | |
23 | + * @since 2023-02-23 | |
24 | + */ | |
25 | +@Data | |
26 | +@EqualsAndHashCode(callSuper = false) | |
27 | +@Accessors(chain = true) | |
28 | +@TableName(autoResultMap = true) | |
29 | +public class EvalRewardDist extends BaseAuditableTimeEntity<EvalRewardDist, Long> { | |
30 | + | |
31 | + private static final long serialVersionUID = 1L; | |
32 | + | |
33 | + /** | |
34 | + * 用户id | |
35 | + */ | |
36 | + private Long userId; | |
37 | + | |
38 | + /** | |
39 | + * 考评id | |
40 | + */ | |
41 | + private Long evalId; | |
42 | + | |
43 | + /** | |
44 | + * 考评组编码 | |
45 | + */ | |
46 | + private Long evalGroupId; | |
47 | + | |
48 | + /** | |
49 | + * 考评组id | |
50 | + */ | |
51 | + @TableField(typeHandler = LongListTypeHandler.class) | |
52 | + private List<Long> evalShopPoolIds; | |
53 | + | |
54 | + /** | |
55 | + * 门店id | |
56 | + */ | |
57 | + @TableField(typeHandler = LongListTypeHandler.class) | |
58 | + private List<Long> shopIds; | |
59 | + | |
60 | + /** | |
61 | + * 考评奖惩 | |
62 | + */ | |
63 | + private BigDecimal reward; | |
64 | + | |
65 | + /** | |
66 | + * 状态 | |
67 | + */ | |
68 | + private Integer status; | |
69 | + | |
70 | + /** | |
71 | + * 集团id | |
72 | + */ | |
73 | + private Long groupId; | |
74 | + | |
75 | + /** | |
76 | + * 逻辑删除 | |
77 | + */ | |
78 | + @TableLogic | |
79 | + private Boolean yn; | |
80 | + | |
81 | + | |
82 | +} | ... | ... |
fw-morax-domain/src/main/java/cn/fw/morax/domain/db/eval/EvalRewardDistDetail.java
0 → 100644
1 | +package cn.fw.morax.domain.db.eval; | |
2 | + | |
3 | +import cn.fw.common.data.entity.BaseAuditableTimeEntity; | |
4 | +import com.baomidou.mybatisplus.annotation.TableLogic; | |
5 | +import com.baomidou.mybatisplus.annotation.TableName; | |
6 | +import lombok.Data; | |
7 | +import lombok.EqualsAndHashCode; | |
8 | +import lombok.experimental.Accessors; | |
9 | + | |
10 | +import java.io.Serializable; | |
11 | +import java.math.BigDecimal; | |
12 | +import java.time.LocalDateTime; | |
13 | + | |
14 | +/** | |
15 | + * <p> | |
16 | + * 考评池 | |
17 | + * </p> | |
18 | + * | |
19 | + * @author jiangchao | |
20 | + * @since 2023-02-23 | |
21 | + */ | |
22 | +@Data | |
23 | +@EqualsAndHashCode(callSuper = false) | |
24 | +@Accessors(chain = true) | |
25 | +@TableName(autoResultMap = true) | |
26 | +public class EvalRewardDistDetail extends BaseAuditableTimeEntity<EvalRewardDistDetail, Long> { | |
27 | + | |
28 | + private static final long serialVersionUID = 1L; | |
29 | + | |
30 | + /** | |
31 | + * 分配d | |
32 | + */ | |
33 | + private Long evalShopDistId; | |
34 | + | |
35 | + /** | |
36 | + * 用户id | |
37 | + */ | |
38 | + private Long userId; | |
39 | + | |
40 | + /** | |
41 | + * 用户名称 | |
42 | + */ | |
43 | + private String userName; | |
44 | + | |
45 | + /** | |
46 | + * 岗位id | |
47 | + */ | |
48 | + private Long postId; | |
49 | + | |
50 | + /** | |
51 | + * 岗位名称 | |
52 | + */ | |
53 | + private String postName; | |
54 | + | |
55 | + /** | |
56 | + * 门店id | |
57 | + */ | |
58 | + private Long shopId; | |
59 | + | |
60 | + /** | |
61 | + * 门店名称 | |
62 | + */ | |
63 | + private String shopName; | |
64 | + | |
65 | + /** | |
66 | + * 奖惩 | |
67 | + */ | |
68 | + private BigDecimal reward; | |
69 | + | |
70 | + /** | |
71 | + * 状态 | |
72 | + */ | |
73 | + private Integer status; | |
74 | + | |
75 | + /** | |
76 | + * 集团id | |
77 | + */ | |
78 | + private Long groupId; | |
79 | + | |
80 | + /** | |
81 | + * 逻辑删除 | |
82 | + */ | |
83 | + @TableLogic | |
84 | + private Boolean yn; | |
85 | + | |
86 | + | |
87 | +} | ... | ... |
fw-morax-domain/src/main/java/cn/fw/morax/domain/dto/eval/EvalRewardDistDTO.java
0 → 100644
1 | +package cn.fw.morax.domain.dto.eval; | |
2 | + | |
3 | +import lombok.Data; | |
4 | +import lombok.EqualsAndHashCode; | |
5 | +import lombok.experimental.Accessors; | |
6 | + | |
7 | +import javax.validation.Valid; | |
8 | +import javax.validation.constraints.NotNull; | |
9 | +import java.math.BigDecimal; | |
10 | +import java.util.List; | |
11 | + | |
12 | +/** | |
13 | + * <p> | |
14 | + * 考评池 | |
15 | + * </p> | |
16 | + * | |
17 | + * @author jiangchao | |
18 | + * @since 2023-02-23 | |
19 | + */ | |
20 | +@Data | |
21 | +@EqualsAndHashCode(callSuper = false) | |
22 | +@Accessors(chain = true) | |
23 | +public class EvalRewardDistDTO { | |
24 | + | |
25 | + | |
26 | + /** | |
27 | + * 分配d | |
28 | + */ | |
29 | + @NotNull(message = "分配d不能为空") | |
30 | + private Long evalShopDistId; | |
31 | + | |
32 | + /** | |
33 | + * 集团id | |
34 | + */ | |
35 | + @Valid | |
36 | + private List<EvalRewardDistDetailDTO> users; | |
37 | + | |
38 | + | |
39 | + | |
40 | +} | ... | ... |
fw-morax-domain/src/main/java/cn/fw/morax/domain/dto/eval/EvalRewardDistDetailDTO.java
0 → 100644
1 | +package cn.fw.morax.domain.dto.eval; | |
2 | + | |
3 | +import lombok.Data; | |
4 | +import lombok.EqualsAndHashCode; | |
5 | +import lombok.experimental.Accessors; | |
6 | + | |
7 | +import javax.validation.constraints.NotNull; | |
8 | +import java.math.BigDecimal; | |
9 | + | |
10 | +/** | |
11 | + * <p> | |
12 | + * 考评池 | |
13 | + * </p> | |
14 | + * | |
15 | + * @author jiangchao | |
16 | + * @since 2023-02-23 | |
17 | + */ | |
18 | +@Data | |
19 | +@EqualsAndHashCode(callSuper = false) | |
20 | +@Accessors(chain = true) | |
21 | +public class EvalRewardDistDetailDTO { | |
22 | + | |
23 | + private static final long serialVersionUID = 1L; | |
24 | + | |
25 | + /** | |
26 | + * 用户id | |
27 | + */ | |
28 | + @NotNull(message = "用户id不能为空") | |
29 | + private Long userId; | |
30 | + | |
31 | + /** | |
32 | + * 用户名称 | |
33 | + */ | |
34 | + @NotNull(message = "用户名称不能为空") | |
35 | + private String userName; | |
36 | + | |
37 | + /** | |
38 | + * 岗位id | |
39 | + */ | |
40 | + @NotNull(message = "岗位id不能为空") | |
41 | + private Long postId; | |
42 | + | |
43 | + /** | |
44 | + * 岗位名称 | |
45 | + */ | |
46 | + @NotNull(message = "岗位名称不能为空") | |
47 | + private String postName; | |
48 | + | |
49 | + /** | |
50 | + * 门店id | |
51 | + */ | |
52 | + @NotNull(message = "门店id不能为空") | |
53 | + private Long shopId; | |
54 | + | |
55 | + /** | |
56 | + * 门店名称 | |
57 | + */ | |
58 | + @NotNull(message = "门店名称不能为空") | |
59 | + private String shopName; | |
60 | + | |
61 | + /** | |
62 | + * 奖惩 | |
63 | + */ | |
64 | + @NotNull(message = "奖惩不能为空") | |
65 | + private BigDecimal reward; | |
66 | + | |
67 | + /** | |
68 | + * 状态 | |
69 | + */ | |
70 | + private Integer status; | |
71 | + | |
72 | + /** | |
73 | + * 集团id | |
74 | + */ | |
75 | + @NotNull(message = "集团不能为空") | |
76 | + private Long groupId; | |
77 | + | |
78 | + | |
79 | + | |
80 | +} | ... | ... |
fw-morax-domain/src/main/java/cn/fw/morax/domain/vo/eval/EvalRewardDistVO.java
0 → 100644
1 | +package cn.fw.morax.domain.vo.eval; | |
2 | + | |
3 | +import cn.fw.common.data.entity.BaseAuditableTimeEntity; | |
4 | +import cn.fw.common.data.mybatis.handler.LongListTypeHandler; | |
5 | +import com.baomidou.mybatisplus.annotation.TableField; | |
6 | +import com.baomidou.mybatisplus.annotation.TableLogic; | |
7 | +import com.baomidou.mybatisplus.annotation.TableName; | |
8 | +import lombok.Data; | |
9 | +import lombok.EqualsAndHashCode; | |
10 | +import lombok.experimental.Accessors; | |
11 | + | |
12 | +import java.math.BigDecimal; | |
13 | +import java.util.List; | |
14 | + | |
15 | +/** | |
16 | + * <p> | |
17 | + * 考评门店奖惩分配 | |
18 | + * </p> | |
19 | + * | |
20 | + * @author jiangchao | |
21 | + * @since 2023-02-23 | |
22 | + */ | |
23 | +@Data | |
24 | +@EqualsAndHashCode(callSuper = false) | |
25 | +@Accessors(chain = true) | |
26 | +public class EvalRewardDistVO { | |
27 | + | |
28 | + private static final long serialVersionUID = 1L; | |
29 | + | |
30 | + /** | |
31 | + * 用户id | |
32 | + */ | |
33 | + private Long userId; | |
34 | + | |
35 | + /** | |
36 | + * 考评id | |
37 | + */ | |
38 | + private Long evalId; | |
39 | + | |
40 | + /** | |
41 | + * 考评组编码 | |
42 | + */ | |
43 | + private Long evalGroupId; | |
44 | + | |
45 | + /** | |
46 | + * 考评组id | |
47 | + */ | |
48 | + @TableField(typeHandler = LongListTypeHandler.class) | |
49 | + private List<Long> evalShopPoolIds; | |
50 | + | |
51 | + /** | |
52 | + * 门店id | |
53 | + */ | |
54 | + @TableField(typeHandler = LongListTypeHandler.class) | |
55 | + private List<Long> shopIds; | |
56 | + | |
57 | + /** | |
58 | + * 考评奖惩 | |
59 | + */ | |
60 | + private BigDecimal reward; | |
61 | + | |
62 | + /** | |
63 | + * 状态 | |
64 | + */ | |
65 | + private Integer status; | |
66 | + | |
67 | + /** | |
68 | + * 集团id | |
69 | + */ | |
70 | + private Long groupId; | |
71 | + | |
72 | + /** | |
73 | + * 门店 | |
74 | + */ | |
75 | + private List<EvalShopPoolVO> shopPools; | |
76 | + | |
77 | + | |
78 | +} | ... | ... |
fw-morax-domain/src/main/java/cn/fw/morax/domain/vo/eval/EvalShopPoolVO.java
0 → 100644
1 | +package cn.fw.morax.domain.vo.eval; | |
2 | + | |
3 | +import cn.fw.common.data.entity.BaseAuditableTimeEntity; | |
4 | +import cn.fw.morax.domain.enums.EvalShopPoolStatusEnum; | |
5 | +import com.baomidou.mybatisplus.annotation.TableLogic; | |
6 | +import com.baomidou.mybatisplus.annotation.TableName; | |
7 | +import lombok.Data; | |
8 | +import lombok.EqualsAndHashCode; | |
9 | + | |
10 | +import java.math.BigDecimal; | |
11 | + | |
12 | +/** | |
13 | + * <p> | |
14 | + * 考评池 | |
15 | + * </p> | |
16 | + * | |
17 | + * @author jiangchao | |
18 | + * @since 2022-12-09 | |
19 | + */ | |
20 | +@Data | |
21 | +@EqualsAndHashCode(callSuper = false) | |
22 | +public class EvalShopPoolVO { | |
23 | + | |
24 | + private static final long serialVersionUID = 1L; | |
25 | + | |
26 | + /** | |
27 | + * 考评组编码 | |
28 | + */ | |
29 | + private String egc; | |
30 | + | |
31 | + /** | |
32 | + * 考评id | |
33 | + */ | |
34 | + private Long evalId; | |
35 | + /** | |
36 | + * 考评组id | |
37 | + */ | |
38 | + private Long evalGroupId; | |
39 | + | |
40 | +// /** | |
41 | +// * 用户id | |
42 | +// */ | |
43 | +// private Long userId; | |
44 | +// | |
45 | +// /** | |
46 | +// * 用户名称 | |
47 | +// */ | |
48 | +// private String userName; | |
49 | + | |
50 | +// /** | |
51 | +// * 岗位id | |
52 | +// */ | |
53 | +// private Long postId; | |
54 | +// | |
55 | +// /** | |
56 | +// * 岗位名称 | |
57 | +// */ | |
58 | +// private String postName; | |
59 | + | |
60 | + /** | |
61 | + * 门店id | |
62 | + */ | |
63 | + private Long shopId; | |
64 | + | |
65 | + /** | |
66 | + * 门店名称 | |
67 | + */ | |
68 | + private String shopName; | |
69 | + | |
70 | +// /** | |
71 | +// * 社保公积金门店id | |
72 | +// */ | |
73 | +// private Long fundShopId; | |
74 | +// | |
75 | +// /** | |
76 | +// * 社保公积金门店名称 | |
77 | +// */ | |
78 | +// private String fundShopName; | |
79 | + | |
80 | + /** | |
81 | + * 考评奖惩 | |
82 | + */ | |
83 | + private BigDecimal reward; | |
84 | + | |
85 | + /** | |
86 | + * 考评得分 | |
87 | + */ | |
88 | + private BigDecimal score; | |
89 | + | |
90 | +// /** | |
91 | +// * 考评得分率 | |
92 | +// */ | |
93 | +// private BigDecimal scoreRatio; | |
94 | + | |
95 | + /** | |
96 | + * 月度 | |
97 | + */ | |
98 | + private String monthly; | |
99 | + | |
100 | + /** | |
101 | + * 固定的 | |
102 | + */ | |
103 | + private EvalShopPoolStatusEnum status; | |
104 | + | |
105 | + /** | |
106 | + * 集团id | |
107 | + */ | |
108 | + private Long groupId; | |
109 | + | |
110 | + /** | |
111 | + * 逻辑删除 | |
112 | + */ | |
113 | + @TableLogic | |
114 | + private Boolean yn; | |
115 | + | |
116 | +} | ... | ... |
fw-morax-server/src/main/java/cn/fw/morax/server/controller/app/EvalController.java
... | ... | @@ -9,6 +9,8 @@ import cn.fw.data.base.domain.common.Message; |
9 | 9 | import cn.fw.morax.common.utils.PublicUtil; |
10 | 10 | import cn.fw.morax.domain.dto.eval.EvalDTO; |
11 | 11 | import cn.fw.morax.domain.dto.eval.EvalGroupIndicatorRankDTO; |
12 | +import cn.fw.morax.domain.dto.eval.EvalRewardDistDTO; | |
13 | +import cn.fw.morax.domain.dto.eval.EvalRewardDistDetailDTO; | |
12 | 14 | import cn.fw.morax.domain.vo.SelectorVO; |
13 | 15 | import cn.fw.morax.domain.vo.eval.*; |
14 | 16 | import cn.fw.morax.domain.vo.kpi.KpiIndicatorRankVO; |
... | ... | @@ -21,10 +23,7 @@ import cn.fw.security.auth.client.enums.AuthType; |
21 | 23 | import lombok.RequiredArgsConstructor; |
22 | 24 | import lombok.extern.slf4j.Slf4j; |
23 | 25 | import org.springframework.validation.annotation.Validated; |
24 | -import org.springframework.web.bind.annotation.GetMapping; | |
25 | -import org.springframework.web.bind.annotation.RequestMapping; | |
26 | -import org.springframework.web.bind.annotation.RequestParam; | |
27 | -import org.springframework.web.bind.annotation.RestController; | |
26 | +import org.springframework.web.bind.annotation.*; | |
28 | 27 | |
29 | 28 | import javax.validation.constraints.NotNull; |
30 | 29 | import java.time.LocalDate; |
... | ... | @@ -53,7 +52,7 @@ public class EvalController { |
53 | 52 | private final EvalGroupBizService evalGroupBizService; |
54 | 53 | private final EvalGroupDataService evalGroupDataService; |
55 | 54 | private final SettingDraftBizService settingDraftBizService; |
56 | - private final EvalIndicatorBizService evalIndicatorBizService; | |
55 | + private final EvalRewardService evalRewardService; | |
57 | 56 | private final EvalIndicatorValueBizService evalIndicatorValueBizService; |
58 | 57 | |
59 | 58 | /** |
... | ... | @@ -199,4 +198,26 @@ public class EvalController { |
199 | 198 | } |
200 | 199 | return success(evalGroupPoolService.queryEvalIndicatorRank(dto)); |
201 | 200 | } |
201 | + | |
202 | + /** | |
203 | + * 奖惩分配详情 | |
204 | + * | |
205 | + */ | |
206 | + @GetMapping("/reward-dist") | |
207 | + @ControllerMethod("奖惩分配详情") | |
208 | + public Message<EvalRewardDistVO> rewardDistDetail(@NotNull(message = "奖惩分配id不能为空") Long id) { | |
209 | + return success(evalRewardService.rewardDistDetail(id)); | |
210 | + } | |
211 | + | |
212 | + /** | |
213 | + * 奖惩分配 | |
214 | + * | |
215 | + */ | |
216 | + @PostMapping("/reward-dist") | |
217 | + @ControllerMethod("奖惩分配") | |
218 | + public Message<Void> rewardDist(@Validated @RequestBody EvalRewardDistDTO rewardDist) { | |
219 | + evalRewardService.rewardDist(rewardDist); | |
220 | + return success(); | |
221 | + } | |
222 | + | |
202 | 223 | } | ... | ... |
fw-morax-server/src/main/java/cn/fw/morax/server/controller/erp/EvalTaskController.java
... | ... | @@ -68,7 +68,7 @@ public class EvalTaskController { |
68 | 68 | @GetMapping("/cache-reward") |
69 | 69 | @ControllerMethod("缓存分配奖惩的考评池") |
70 | 70 | public Message<Void> cacheDistEvalShopPoolIds() { |
71 | - evalGroupTask.cacheDistEvalShopPoolIds(); | |
71 | + evalCalcTask.cacheDistEvalShopPoolIds(); | |
72 | 72 | return success(); |
73 | 73 | } |
74 | 74 | |
... | ... | @@ -93,12 +93,12 @@ public class EvalTaskController { |
93 | 93 | return success(); |
94 | 94 | } |
95 | 95 | |
96 | - @GetMapping("/check-report") | |
97 | - @ControllerMethod("当天薪酬组人员定时器") | |
98 | - public Message<Void> checkTodoCompletion() { | |
99 | - evalCalcTask.checkTodoCompletion(); | |
100 | - return success(); | |
101 | - } | |
96 | +// @GetMapping("/check-report") | |
97 | +// @ControllerMethod("当天薪酬组人员定时器") | |
98 | +// public Message<Void> checkTodoCompletion() { | |
99 | +// evalCalcTask.checkTodoCompletion(); | |
100 | +// return success(); | |
101 | +// } | |
102 | 102 | |
103 | 103 | @GetMapping("/eval-group") |
104 | 104 | @ControllerMethod("处理考评组") | ... | ... |
fw-morax-server/src/main/java/cn/fw/morax/server/task/EvalCalcTask.java
... | ... | @@ -3,6 +3,7 @@ package cn.fw.morax.server.task; |
3 | 3 | import cn.fw.morax.common.constant.TimeTaskConstant; |
4 | 4 | import cn.fw.morax.service.biz.eval.EvalCalculateService; |
5 | 5 | import cn.fw.morax.service.biz.eval.EvalIndicatorValueBizService; |
6 | +import cn.fw.morax.service.biz.eval.EvalRewardService; | |
6 | 7 | import cn.fw.morax.service.biz.kpi.IndicatorBizService; |
7 | 8 | import cn.fw.morax.service.biz.kpi.KpiCalculateService; |
8 | 9 | import cn.fw.morax.service.biz.kpi.KpiPoolBizService; |
... | ... | @@ -30,6 +31,7 @@ import java.time.YearMonth; |
30 | 31 | @ConditionalOnProperty(prefix = "task", name = "switch", havingValue = "on") |
31 | 32 | public class EvalCalcTask { |
32 | 33 | |
34 | + private final EvalRewardService evalRewardService; | |
33 | 35 | private final EvalCalculateService evalCalculateService; |
34 | 36 | private final EvalIndicatorValueBizService evalIndicatorValueBizService; |
35 | 37 | |
... | ... | @@ -75,19 +77,36 @@ public class EvalCalcTask { |
75 | 77 | } |
76 | 78 | |
77 | 79 | /** |
78 | - * 每半小时检查待办完成 | |
80 | + * 缓存分配奖惩的考评池 | |
79 | 81 | */ |
80 | - @Scheduled(cron = "0 0/30 * * * ?") | |
81 | - public void checkTodoCompletion() { | |
82 | - evalIndicatorValueBizService.checkTodoCompletion(); | |
82 | + @Scheduled(cron = "0 0 10 * * ?") | |
83 | + public void cacheDistEvalShopPoolIds() { | |
84 | + evalRewardService.cacheDistEvalShopPoolIds(LocalDate.now().minusDays(1)); | |
83 | 85 | } |
84 | 86 | |
85 | 87 | /** |
86 | - * 每天凌晨 保存考评数据 | |
88 | + * 分配奖惩 | |
87 | 89 | */ |
88 | - @Scheduled(cron = "0 0 0 * * ?") | |
89 | - public void saveEvalReportValue() { | |
90 | - evalIndicatorValueBizService.saveEvalReportValue(LocalDate.now().minusDays(1L)); | |
90 | + @Scheduled(initialDelay = 1000L * 35, fixedRate = 1000L * 50) | |
91 | + @Async | |
92 | + public void distributionEvalReward() { | |
93 | + evalRewardService.distributionEvalReward(); | |
91 | 94 | } |
92 | 95 | |
96 | +// /** | |
97 | +// * 每半小时检查待办完成 | |
98 | +// */ | |
99 | +// @Scheduled(cron = "0 0/30 * * * ?") | |
100 | +// public void checkTodoCompletion() { | |
101 | +// evalIndicatorValueBizService.checkTodoCompletion(); | |
102 | +// } | |
103 | +// | |
104 | +// /** | |
105 | +// * 每天凌晨 保存考评数据 | |
106 | +// */ | |
107 | +// @Scheduled(cron = "0 0 0 * * ?") | |
108 | +// public void saveEvalReportValue() { | |
109 | +// evalIndicatorValueBizService.saveEvalReportValue(LocalDate.now().minusDays(1L)); | |
110 | +// } | |
111 | + | |
93 | 112 | } | ... | ... |
fw-morax-server/src/main/java/cn/fw/morax/server/task/EvalGroupTask.java
... | ... | @@ -133,13 +133,7 @@ public class EvalGroupTask { |
133 | 133 | } |
134 | 134 | } |
135 | 135 | |
136 | - /** | |
137 | - * 缓存分配奖惩的考评池 | |
138 | - */ | |
139 | - @Scheduled(initialDelay = 1000L * 15, fixedRate = 1000L * 60) | |
140 | - public void cacheDistEvalShopPoolIds() { | |
141 | - evalRewardService.cacheDistEvalShopPoolIds(LocalDate.now().minusDays(1)); | |
142 | - } | |
136 | + | |
143 | 137 | |
144 | 138 | |
145 | 139 | } | ... | ... |
fw-morax-service/src/main/java/cn/fw/morax/service/biz/eval/EvalIndicatorReportService.java
... | ... | @@ -4,6 +4,9 @@ import cn.fw.common.data.mybatis.pagination.PageData; |
4 | 4 | import cn.fw.common.exception.BusinessException; |
5 | 5 | import cn.fw.common.page.AppPage; |
6 | 6 | import cn.fw.common.web.auth.LoginAuthBean; |
7 | +import cn.fw.morax.common.pojo.event.ImportEvalIndicatorEvent; | |
8 | +import cn.fw.morax.common.pojo.event.KpiGroupChangeEvent; | |
9 | +import cn.fw.morax.common.utils.EventBusUtil; | |
7 | 10 | import cn.fw.morax.common.utils.ExcelDataUtil; |
8 | 11 | import cn.fw.morax.common.utils.PublicUtil; |
9 | 12 | import cn.fw.morax.domain.db.eval.*; |
... | ... | @@ -165,6 +168,10 @@ public class EvalIndicatorReportService { |
165 | 168 | |
166 | 169 | evalIndicatorImportDetailService.saveBatch(details); |
167 | 170 | |
171 | + ImportEvalIndicatorEvent importEvalIndicatorEvent = new ImportEvalIndicatorEvent(importRecord.getIndicatorCode(), | |
172 | + importRecord.getId(), importRecord.getGroupId(), importRecord.getUploadTime()); | |
173 | + EventBusUtil.asyncPost(importEvalIndicatorEvent); | |
174 | + | |
168 | 175 | return null; |
169 | 176 | } |
170 | 177 | |
... | ... | @@ -223,6 +230,10 @@ public class EvalIndicatorReportService { |
223 | 230 | |
224 | 231 | evalIndicatorImportDetailService.saveBatch(details); |
225 | 232 | |
233 | + ImportEvalIndicatorEvent importEvalIndicatorEvent = new ImportEvalIndicatorEvent(importRecord.getIndicatorCode(), | |
234 | + importRecord.getId(), importRecord.getGroupId(), importRecord.getUploadTime()); | |
235 | + EventBusUtil.asyncPost(importEvalIndicatorEvent); | |
236 | + | |
226 | 237 | return null; |
227 | 238 | } |
228 | 239 | ... | ... |
fw-morax-service/src/main/java/cn/fw/morax/service/biz/eval/EvalRewardService.java
... | ... | @@ -2,18 +2,26 @@ package cn.fw.morax.service.biz.eval; |
2 | 2 | |
3 | 3 | import cn.fw.backlog.sdk.api.result.FailBacklogItem; |
4 | 4 | import cn.fw.common.cache.locker.DistributedLocker; |
5 | +import cn.fw.common.exception.BusinessException; | |
5 | 6 | import cn.fw.morax.common.config.TodoVal; |
6 | 7 | import cn.fw.morax.common.utils.DateUtil; |
7 | 8 | import cn.fw.morax.common.utils.PublicUtil; |
8 | 9 | import cn.fw.morax.common.utils.ThreadPoolUtil; |
9 | 10 | import cn.fw.morax.domain.bo.eval.EvalGroupRewardDistributionBO; |
10 | 11 | import cn.fw.morax.domain.db.eval.*; |
12 | +import cn.fw.morax.domain.db.salary.SalaryExtraProject; | |
13 | +import cn.fw.morax.domain.dto.eval.EvalRewardDistDTO; | |
14 | +import cn.fw.morax.domain.dto.eval.EvalRewardDistDetailDTO; | |
11 | 15 | import cn.fw.morax.domain.enums.*; |
16 | +import cn.fw.morax.domain.vo.eval.EvalRewardDistVO; | |
17 | +import cn.fw.morax.domain.vo.eval.EvalShopPoolVO; | |
12 | 18 | import cn.fw.morax.rpc.backlog.TodoRpcService; |
19 | +import cn.fw.morax.rpc.backlog.dto.BackLogItemDTO; | |
13 | 20 | import cn.fw.morax.rpc.backlog.dto.BacklogBatchPlanItemReqDTO; |
14 | 21 | import cn.fw.morax.rpc.backlog.dto.BacklogBatchPlanReqDTO; |
15 | 22 | import cn.fw.morax.rpc.erp.ErpRpcService; |
16 | 23 | import cn.fw.morax.rpc.erp.dto.RpcUserRoleInfoDTO; |
24 | +import cn.fw.morax.rpc.erp.dto.RpcUserRoleShopDTO; | |
17 | 25 | import cn.fw.morax.service.biz.calculator.eval.kpi.EvalKpiBaseCalculator; |
18 | 26 | import cn.fw.morax.service.biz.calculator.eval.reward.EvalRewardBaseCalculator; |
19 | 27 | import cn.fw.morax.service.data.eval.*; |
... | ... | @@ -21,6 +29,7 @@ import com.alibaba.fastjson.JSON; |
21 | 29 | import com.alibaba.fastjson.JSONObject; |
22 | 30 | import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; |
23 | 31 | import com.baomidou.mybatisplus.core.toolkit.Wrappers; |
32 | +import com.google.common.collect.Lists; | |
24 | 33 | import lombok.Getter; |
25 | 34 | import lombok.RequiredArgsConstructor; |
26 | 35 | import lombok.extern.slf4j.Slf4j; |
... | ... | @@ -31,6 +40,7 @@ import org.springframework.data.redis.core.StringRedisTemplate; |
31 | 40 | import org.springframework.stereotype.Service; |
32 | 41 | import org.springframework.transaction.annotation.Transactional; |
33 | 42 | |
43 | +import java.math.BigDecimal; | |
34 | 44 | import java.text.DecimalFormat; |
35 | 45 | import java.time.LocalDate; |
36 | 46 | import java.time.LocalDateTime; |
... | ... | @@ -38,6 +48,7 @@ import java.util.*; |
38 | 48 | import java.util.concurrent.RejectedExecutionException; |
39 | 49 | import java.util.concurrent.ThreadPoolExecutor; |
40 | 50 | import java.util.concurrent.locks.Lock; |
51 | +import java.util.stream.Collectors; | |
41 | 52 | |
42 | 53 | import static cn.fw.common.businessvalidator.Validator.BV; |
43 | 54 | |
... | ... | @@ -54,6 +65,8 @@ public class EvalRewardService { |
54 | 65 | private final TodoVal todoVal; |
55 | 66 | private final TodoRpcService todoRpcService; |
56 | 67 | private final ErpRpcService erpRpcService; |
68 | + private final EvalRewardDistService evalRewardDistService; | |
69 | + private final EvalRewardDistDetailService evalRewardDistDetailService; | |
57 | 70 | private final EvalPoolRewardDetailService evalPoolRewardDetailService; |
58 | 71 | private final EvalPoolCommonService evalPoolCommonService; |
59 | 72 | private final EvalUserPoolService evalUserPoolService; |
... | ... | @@ -102,6 +115,9 @@ public class EvalRewardService { |
102 | 115 | } |
103 | 116 | |
104 | 117 | |
118 | + /** | |
119 | + * 分配奖惩 | |
120 | + */ | |
105 | 121 | public void distributionEvalReward() { |
106 | 122 | BoundSetOperations<String, String> setOps = stringRedisTemplate.boundSetOps(getDistributionKey()); |
107 | 123 | ThreadPoolExecutor threadPool = ThreadPoolUtil.getInstance().getThreadPool(); |
... | ... | @@ -156,54 +172,161 @@ public class EvalRewardService { |
156 | 172 | */ |
157 | 173 | @Transactional(rollbackFor = Exception.class) |
158 | 174 | public void sendDistRewardTodo(List<EvalShopPool> pools, EvalGroup evalGroup) { |
159 | -// Eval eval = evalService.getById(evalGroup.getEvalId()); | |
160 | -// BV.notNull(eval, "考评配置不存在,请重试"); | |
161 | -// | |
162 | -// DecimalFormat decimalFormat = new DecimalFormat("##########.##"); | |
163 | -// final List<String> roleCodes = evalGroup.getRoleCodes(); | |
164 | -// final Long shopId = pool.getShopId(); | |
165 | -// final String evalGroupName = evalGroup.getName(); | |
166 | -// final String evalName = eval.getName(); | |
167 | -// final EvalTypeEnum evalType = eval.getType(); | |
168 | -// | |
169 | -// Date expireTime = DateUtil.localDateTime2Date(LocalDateTime.now().plusDays(2L)); | |
170 | -// | |
171 | -// List<BacklogBatchPlanItemReqDTO> itemList = new ArrayList<>(); | |
172 | -// List<RpcUserRoleInfoDTO> users = erpRpcService.queryUserRoleShopIds(roleCodes, shopId); | |
173 | -// for (RpcUserRoleInfoDTO user : users) { | |
174 | -// | |
175 | -// BacklogBatchPlanItemReqDTO planItemReq = new BacklogBatchPlanItemReqDTO(); | |
176 | -// planItemReq.setDataId(pool.getId().toString()); | |
177 | -// planItemReq.setUserId(user.getUserId()); | |
178 | -// planItemReq.setPlanTime(new Date()); | |
179 | -// planItemReq.setExpireTime(expireTime); | |
180 | -// | |
181 | -// Map<String, String> dynamicMap = new HashMap<>(8); | |
182 | -// dynamicMap.put("evalGroupName", evalGroupName); | |
183 | -// dynamicMap.put("evalName", evalName); | |
184 | -// dynamicMap.put("evalType", evalType.getValue().toString()); | |
185 | -// dynamicMap.put("amount", decimalFormat.format(pool.getReward())); | |
186 | -// planItemReq.setDynamicMap(dynamicMap); | |
187 | -// | |
188 | -// Map<String, Object> extraData = new HashMap<>(); | |
189 | -// planItemReq.setExtraData(extraData); | |
190 | -// itemList.add(planItemReq); | |
191 | -// } | |
192 | -// | |
193 | -// | |
194 | -// //推送待办 | |
195 | -// BacklogBatchPlanReqDTO batchPlanReq = new BacklogBatchPlanReqDTO(todoVal.getDistEvalReward(), itemList); | |
196 | -// List<FailBacklogItem> failItems = Optional.ofNullable(todoRpcService.batchPush(batchPlanReq)).orElse(new ArrayList<>()); | |
197 | -// if (PublicUtil.isNotEmpty(failItems)) { | |
198 | -// log.error("发送考评数据录入待办失败,失败人员信息:{}", JSON.toJSONString(failItems)); | |
199 | -// } | |
200 | -// | |
175 | + Eval eval = evalService.getById(evalGroup.getEvalId()); | |
176 | + BV.notNull(eval, "考评配置不存在,请重试"); | |
177 | + | |
178 | + DecimalFormat decimalFormat = new DecimalFormat("##########.##"); | |
179 | + final String roleCode = evalGroup.getRoleCodes().stream().findFirst().get(); | |
180 | + final String evalGroupName = evalGroup.getName(); | |
181 | + final String evalName = eval.getName(); | |
182 | + final EvalTypeEnum evalType = eval.getType(); | |
183 | + List<Long> shopIds = evalGroup.getShopIds(); | |
184 | + | |
185 | + Date expireTime = DateUtil.localDateTime2Date(LocalDateTime.now().plusDays(2L)); | |
186 | + | |
187 | + List<BacklogBatchPlanItemReqDTO> itemList = new ArrayList<>(); | |
188 | + List<RpcUserRoleInfoDTO> users = this.getUserEnableRoleInfos(roleCode, shopIds); | |
189 | + for (RpcUserRoleInfoDTO user : users) { | |
190 | + List<Long> manageShopIds = user.getRangeList().stream() | |
191 | + .filter(range -> shopIds.contains(range.getShopId())) | |
192 | + .map(RpcUserRoleShopDTO::getShopId).distinct().collect(Collectors.toList()); | |
193 | + if (PublicUtil.isEmpty(manageShopIds)) { | |
194 | + continue; | |
195 | + } | |
196 | + | |
197 | + List<Long> poolIds = new ArrayList<>(); | |
198 | + BigDecimal reward = BigDecimal.ZERO; | |
199 | + for (EvalShopPool pool : pools) { | |
200 | + if (manageShopIds.contains(pool.getShopId())) { | |
201 | + poolIds.add(pool.getId()); | |
202 | + reward = reward.add(pool.getReward()); | |
203 | + } | |
204 | + } | |
205 | + | |
206 | + EvalRewardDist rewardDist = new EvalRewardDist(); | |
207 | + rewardDist.setUserId(user.getUserId()); | |
208 | + rewardDist.setEvalId(evalGroup.getEvalId()); | |
209 | + rewardDist.setEvalGroupId(evalGroup.getId()); | |
210 | + rewardDist.setEvalShopPoolIds(poolIds); | |
211 | + rewardDist.setShopIds(manageShopIds); | |
212 | + rewardDist.setReward(reward); | |
213 | + rewardDist.setStatus(1); | |
214 | + rewardDist.setGroupId(evalGroup.getGroupId()); | |
215 | + rewardDist.setYn(Boolean.TRUE); | |
216 | + evalRewardDistService.save(rewardDist); | |
217 | + | |
218 | + BacklogBatchPlanItemReqDTO planItemReq = new BacklogBatchPlanItemReqDTO(); | |
219 | + planItemReq.setDataId(rewardDist.getId().toString()); | |
220 | + planItemReq.setUserId(user.getUserId()); | |
221 | + planItemReq.setPlanTime(new Date()); | |
222 | + planItemReq.setExpireTime(expireTime); | |
223 | + | |
224 | + Map<String, String> dynamicMap = new HashMap<>(8); | |
225 | + dynamicMap.put("evalGroupName", evalGroupName); | |
226 | + dynamicMap.put("evalName", evalName); | |
227 | + dynamicMap.put("evalType", evalType.getValue().toString()); | |
228 | + dynamicMap.put("amount", decimalFormat.format(rewardDist.getReward())); | |
229 | + planItemReq.setDynamicMap(dynamicMap); | |
230 | + | |
231 | + Map<String, Object> extraData = new HashMap<>(); | |
232 | + planItemReq.setExtraData(extraData); | |
233 | + itemList.add(planItemReq); | |
234 | + } | |
235 | + | |
236 | + | |
237 | + //推送待办 | |
238 | + BacklogBatchPlanReqDTO batchPlanReq = new BacklogBatchPlanReqDTO(todoVal.getDistEvalReward(), itemList); | |
239 | + List<FailBacklogItem> failItems = Optional.ofNullable(todoRpcService.batchPush(batchPlanReq)).orElse(new ArrayList<>()); | |
240 | + if (PublicUtil.isNotEmpty(failItems)) { | |
241 | + log.error("发送分配考评奖励待办失败,失败人员信息:{}", JSON.toJSONString(failItems)); | |
242 | + } | |
243 | + | |
201 | 244 | // if (PublicUtil.isEmpty(failItems) || itemList.size() > failItems.size()) { |
202 | 245 | // pool.setStatus(EvalShopPoolStatusEnum.WAIT_DIST_REWARD); |
203 | 246 | // evalShopPoolService.updateById(pool); |
204 | 247 | // } |
205 | 248 | } |
206 | 249 | |
250 | + /** | |
251 | + * 对查询的人员去重 | |
252 | + * | |
253 | + * @param roleCode | |
254 | + * @param shopIds | |
255 | + * @return | |
256 | + */ | |
257 | + public List<RpcUserRoleInfoDTO> getUserEnableRoleInfos(String roleCode, List<Long> shopIds) { | |
258 | + List<RpcUserRoleInfoDTO> userRoleInfos = erpRpcService.getUserEnableRoleInfos(roleCode, shopIds); | |
259 | + if (PublicUtil.isEmpty(userRoleInfos)) { | |
260 | + return new ArrayList<>(); | |
261 | + } | |
262 | + Set<Long> staffIds = new HashSet<>(); | |
263 | + List<RpcUserRoleInfoDTO> repeatUserRoleInfos = Lists.newArrayListWithCapacity(userRoleInfos.size()); | |
264 | + for (RpcUserRoleInfoDTO rpcUserRoleInfoDTO : userRoleInfos) { | |
265 | + if (staffIds.add(rpcUserRoleInfoDTO.getUserId())) { | |
266 | + repeatUserRoleInfos.add(rpcUserRoleInfoDTO); | |
267 | + } | |
268 | + } | |
269 | + return repeatUserRoleInfos; | |
270 | + } | |
207 | 271 | |
208 | 272 | |
273 | + /** | |
274 | + * 奖惩分配详情 | |
275 | + * @param id | |
276 | + * @return | |
277 | + */ | |
278 | + public EvalRewardDistVO rewardDistDetail(Long id) { | |
279 | + EvalRewardDist rewardDist = evalRewardDistService.getById(id); | |
280 | + BV.notNull(rewardDist, "奖惩分配不存在,请重试"); | |
281 | + EvalRewardDistVO rewardDistVO = PublicUtil.copy(rewardDist, EvalRewardDistVO.class); | |
282 | + | |
283 | + List<EvalShopPool> pools = evalShopPoolService.list(Wrappers.<EvalShopPool>lambdaQuery() | |
284 | + .in(EvalShopPool::getId, rewardDistVO.getEvalShopPoolIds()) | |
285 | + .eq(EvalShopPool::getYn, Boolean.TRUE) | |
286 | + ); | |
287 | + BV.isNotEmpty(pools, "奖惩分配不存在,请重试"); | |
288 | + List<EvalShopPoolVO> shopPools = PublicUtil.copyList(pools, EvalShopPoolVO.class); | |
289 | + rewardDistVO.setShopPools(shopPools); | |
290 | + return rewardDistVO; | |
291 | + } | |
292 | + | |
293 | + public void rewardDist(EvalRewardDistDTO rewardDistDTO) { | |
294 | + Long rewardDistId = rewardDistDTO.getEvalShopDistId(); | |
295 | + EvalRewardDist rewardDist = evalRewardDistService.getById(rewardDistId); | |
296 | + BV.notNull(rewardDist, "奖惩分配不存在,请重试"); | |
297 | + BV.isNotEmpty(rewardDistDTO.getUsers(), "奖惩分配为空,请重试"); | |
298 | + | |
299 | + BigDecimal totalReward = rewardDistDTO.getUsers().stream() | |
300 | + .map(EvalRewardDistDetailDTO::getReward) | |
301 | + .reduce(BigDecimal.ZERO, BigDecimal::add); | |
302 | + if (totalReward.compareTo(totalReward) != 0) { | |
303 | + throw new BusinessException("分配金额不等于总金额,请重试"); | |
304 | + } | |
305 | + | |
306 | + List<EvalRewardDistDetail> distDetails = Lists.newArrayListWithCapacity(rewardDistDTO.getUsers().size()); | |
307 | + for (EvalRewardDistDetailDTO distDetailDTO : rewardDistDTO.getUsers()) { | |
308 | + EvalRewardDistDetail evalRewardDistDetail = new EvalRewardDistDetail(); | |
309 | + evalRewardDistDetail.setEvalShopDistId(rewardDistId); | |
310 | + evalRewardDistDetail.setUserId(distDetailDTO.getUserId()); | |
311 | + evalRewardDistDetail.setUserName(distDetailDTO.getUserName()); | |
312 | + evalRewardDistDetail.setPostId(distDetailDTO.getPostId()); | |
313 | + evalRewardDistDetail.setPostName(distDetailDTO.getPostName()); | |
314 | + evalRewardDistDetail.setShopId(distDetailDTO.getShopId()); | |
315 | + evalRewardDistDetail.setShopName(distDetailDTO.getShopName()); | |
316 | + evalRewardDistDetail.setReward(distDetailDTO.getReward()); | |
317 | + evalRewardDistDetail.setStatus(distDetailDTO.getStatus()); | |
318 | + evalRewardDistDetail.setGroupId(distDetailDTO.getGroupId()); | |
319 | + evalRewardDistDetail.setYn(Boolean.TRUE); | |
320 | + } | |
321 | + | |
322 | + BackLogItemDTO dto = new BackLogItemDTO(rewardDist.getUserId(), todoVal.getDistEvalReward(), | |
323 | + String.valueOf(rewardDist.getId()), new Date(), null); | |
324 | + if (todoRpcService.cancel(dto)) { | |
325 | + evalRewardDistDetailService.saveBatch(distDetails); | |
326 | + } else { | |
327 | + log.error("奖惩分配待办取消失败:{}", JSON.toJSONString(rewardDist)); | |
328 | + throw new BusinessException("奖惩分配失败,请重试"); | |
329 | + } | |
330 | + | |
331 | + } | |
209 | 332 | } | ... | ... |
fw-morax-service/src/main/java/cn/fw/morax/service/component/EvalIndicatorSaveObserver.java
... | ... | @@ -35,6 +35,7 @@ import lombok.RequiredArgsConstructor; |
35 | 35 | import lombok.extern.slf4j.Slf4j; |
36 | 36 | import org.springframework.beans.factory.annotation.Value; |
37 | 37 | import org.springframework.stereotype.Component; |
38 | +import org.springframework.transaction.annotation.Transactional; | |
38 | 39 | |
39 | 40 | import java.math.BigDecimal; |
40 | 41 | import java.time.LocalDate; |
... | ... | @@ -49,19 +50,15 @@ import java.util.stream.Collectors; |
49 | 50 | @RequiredArgsConstructor |
50 | 51 | public class EvalIndicatorSaveObserver { |
51 | 52 | |
52 | - private final SalaryGeneralSettinService salaryGeneralSettinService; | |
53 | - private final SalaryConfirmService salaryConfirmService; | |
54 | - private final ErpRpcService erpRpcService; | |
55 | 53 | private final TodoRpcService todoRpcService; |
56 | - private final CommonService commonService; | |
57 | 54 | private final EvalIndicatorValueService evalIndicatorValueService; |
58 | 55 | private final EvalIndicatorImportService evalIndicatorImportService; |
59 | 56 | private final EvalIndicatorImportRecordService evalIndicatorImportRecordService; |
60 | 57 | private final EvalIndicatorImportDetailService evalIndicatorImportDetailService; |
61 | 58 | |
62 | - @Value("${todo.pay-salary-notice}") | |
59 | + @Value("${todo.eval-indicator-import}") | |
63 | 60 | @Getter |
64 | - private String paySalaryTodoCode; | |
61 | + private String evalImportTodo; | |
65 | 62 | |
66 | 63 | |
67 | 64 | /** |
... | ... | @@ -70,6 +67,7 @@ public class EvalIndicatorSaveObserver { |
70 | 67 | * @param event |
71 | 68 | */ |
72 | 69 | @Subscribe |
70 | + @Transactional(rollbackFor = Exception.class) | |
73 | 71 | public void saveEvalIndicator(ImportEvalIndicatorEvent event) { |
74 | 72 | //睡10秒保证数据落库 |
75 | 73 | try { |
... | ... | @@ -118,6 +116,8 @@ public class EvalIndicatorSaveObserver { |
118 | 116 | return; |
119 | 117 | } |
120 | 118 | evalIndicatorValueService.saveBatch(evalIndicatorValues); |
119 | + | |
120 | + this.checkDataReport(event.getCode(), event.getDataDate(), event.getGroupId()); | |
121 | 121 | } |
122 | 122 | |
123 | 123 | /** |
... | ... | @@ -126,54 +126,90 @@ public class EvalIndicatorSaveObserver { |
126 | 126 | * @param |
127 | 127 | * @return |
128 | 128 | */ |
129 | - public Boolean checkDataReport(EvalIndicatorImport indicatorImport) { | |
129 | + @Transactional(rollbackFor = Exception.class) | |
130 | + public void checkDataReport(String code, LocalDate dataDate, Long groupId) { | |
130 | 131 | List<EvalIndicatorImport> indicatorImports = evalIndicatorImportService.list(Wrappers.<EvalIndicatorImport>lambdaQuery() |
131 | 132 | .eq(EvalIndicatorImport::getStatus, DataImportStatusEnum.IMPORTING) |
132 | - .eq(EvalIndicatorImport::getIndicatorCode, indicatorImport.getIndicatorCode()) | |
133 | - .eq(EvalIndicatorImport::getGroupId, indicatorImport.getGroupId()) | |
133 | + .eq(EvalIndicatorImport::getIndicatorCode, code) | |
134 | + .eq(EvalIndicatorImport::getGroupId, groupId) | |
135 | + .eq(EvalIndicatorImport::getDataDate, dataDate) | |
134 | 136 | .eq(EvalIndicatorImport::getYn, Boolean.TRUE) |
135 | 137 | ); |
138 | + if (PublicUtil.isEmpty(indicatorImports)) { | |
139 | + return; | |
140 | + } | |
141 | + | |
142 | + List<EvalIndicatorImport> completeImports = new ArrayList<>(); | |
143 | + for (EvalIndicatorImport evalIndicatorImport : indicatorImports) { | |
144 | + EvalReportVO evalReportVO = new EvalReportVO(); | |
145 | + try { | |
146 | + evalReportVO = JSON.parseObject(evalIndicatorImport.getContent(), EvalReportVO.class); | |
147 | + } catch (Exception e) { | |
148 | + log.error("[{}]导入数据解析失败", JSON.toJSONString(evalIndicatorImport), e); | |
149 | + } | |
150 | + | |
151 | + List<EvalIndicatorImportUserVO> users = evalReportVO.getUsers(); | |
152 | + List<EvalShopVO> shops = evalReportVO.getShops(); | |
153 | + if (PublicUtil.isNotEmpty(users)) { | |
154 | + List<Long> userIds = users.stream().map(EvalIndicatorImportUserVO::getUserId).collect(Collectors.toList()); | |
155 | + List<EvalIndicatorValue> evalIndicatorValues = evalIndicatorValueService.list(Wrappers.<EvalIndicatorValue>lambdaQuery() | |
156 | + .in(EvalIndicatorValue::getUserId, userIds) | |
157 | + .eq(EvalIndicatorValue::getDataDate, evalIndicatorImport.getDataDate()) | |
158 | + .eq(EvalIndicatorValue::getDimensionType, DimensionTypeEnum.STAFF) | |
159 | + .eq(EvalIndicatorValue::getYn, Boolean.TRUE) | |
160 | + ); | |
161 | + Set<Long> reportDataUserIds = evalIndicatorValues.stream().map(EvalIndicatorValue::getUserId).collect(Collectors.toSet()); | |
162 | + userIds.removeAll(reportDataUserIds); | |
163 | + if (PublicUtil.isNotEmpty(userIds)) { | |
164 | + continue; | |
165 | + } | |
166 | + } | |
167 | + | |
168 | + if (PublicUtil.isNotEmpty(shops)) { | |
169 | + List<Long> shopIds = shops.stream().map(EvalShopVO::getShopId).collect(Collectors.toList()); | |
170 | + List<EvalIndicatorValue> evalIndicatorValues = evalIndicatorValueService.list(Wrappers.<EvalIndicatorValue>lambdaQuery() | |
171 | + .in(EvalIndicatorValue::getShopId, shopIds) | |
172 | + .eq(EvalIndicatorValue::getDataDate, evalIndicatorImport.getDataDate()) | |
173 | + .eq(EvalIndicatorValue::getDimensionType, DimensionTypeEnum.SHOP) | |
174 | + .eq(EvalIndicatorValue::getYn, Boolean.TRUE) | |
175 | + ); | |
176 | + Set<Long> reportDataShopIds = evalIndicatorValues.stream().map(EvalIndicatorValue::getShopId).collect(Collectors.toSet()); | |
177 | + shopIds.removeAll(reportDataShopIds); | |
178 | + if (PublicUtil.isNotEmpty(shopIds)) { | |
179 | + continue; | |
180 | + } | |
181 | + } | |
182 | + completeImports.add(evalIndicatorImport); | |
183 | + } | |
184 | + | |
185 | + if (PublicUtil.isEmpty(completeImports)) { | |
186 | + return; | |
187 | + } | |
188 | + | |
189 | + List<Long> completeImportIds = new ArrayList<>(); | |
190 | + for (EvalIndicatorImport evalIndicatorImport : completeImports) { | |
191 | + BackLogItemDTO dto = new BackLogItemDTO(evalIndicatorImport.getImportUserId(), getEvalImportTodo(), | |
192 | + String.valueOf(evalIndicatorImport.getId()), new Date(), null); | |
193 | + if (todoRpcService.cancel(dto)) { | |
194 | + completeImportIds.add(evalIndicatorImport.getId()); | |
195 | + } else { | |
196 | + log.error("考评录入待办取消失败:{}", JSON.toJSONString(evalIndicatorImport)); | |
197 | + } | |
198 | + } | |
199 | + | |
200 | + if (PublicUtil.isNotEmpty(completeImportIds)) { | |
201 | + evalIndicatorImportService.update(Wrappers.<EvalIndicatorImport>lambdaUpdate() | |
202 | + .set(EvalIndicatorImport::getStatus, DataImportStatusEnum.COMPLETION) | |
203 | + .in(EvalIndicatorImport::getId, completeImportIds) | |
204 | + .eq(EvalIndicatorImport::getYn, Boolean.TRUE) | |
205 | + ); | |
206 | + } | |
207 | + | |
208 | + | |
209 | + | |
136 | 210 | |
137 | 211 | |
138 | -// List<Long> shopIds = evalIndicatorImport.getShopIds(); | |
139 | -// EvalReportVO evalReportVO = new EvalReportVO(); | |
140 | -// try { | |
141 | -// evalReportVO = JSON.parseObject(evalIndicatorImport.getContent(), EvalReportVO.class); | |
142 | -// } catch (Exception e) { | |
143 | -// log.error("[{}]导入数据解析失败", JSON.toJSONString(evalIndicatorImport), e); | |
144 | -// } | |
145 | -// | |
146 | -// List<EvalIndicatorImportUserVO> users = evalReportVO.getUsers(); | |
147 | -// List<EvalShopVO> shops = evalReportVO.getShops(); | |
148 | -// if (PublicUtil.isNotEmpty(users)) { | |
149 | -// List<Long> userIds = users.stream().map(EvalIndicatorImportUserVO::getUserId).collect(Collectors.toList()); | |
150 | -// List<EvalIndicatorValue> evalIndicatorValues = evalIndicatorValueService.list(Wrappers.<EvalIndicatorValue>lambdaQuery() | |
151 | -// .in(EvalIndicatorValue::getUserId, userIds) | |
152 | -// .eq(EvalIndicatorValue::getDataDate, evalIndicatorImport.getDataDate()) | |
153 | -// .eq(EvalIndicatorValue::getDimensionType, DimensionTypeEnum.STAFF) | |
154 | -// .eq(EvalIndicatorValue::getYn, Boolean.TRUE) | |
155 | -// ); | |
156 | -// Set<Long> reportDataUserIds = evalIndicatorValues.stream().map(EvalIndicatorValue::getUserId).collect(Collectors.toSet()); | |
157 | -// for (EvalIndicatorImportUserVO user : users) { | |
158 | -// user.setReport(reportDataUserIds.contains(user.getUserId())); | |
159 | -// } | |
160 | -// } | |
161 | -// | |
162 | -// if (PublicUtil.isNotEmpty(shops)) { | |
163 | -// List<Long> shopIds = shops.stream().map(EvalShopVO::getShopId).collect(Collectors.toList()); | |
164 | -// List<EvalIndicatorValue> evalIndicatorValues = evalIndicatorValueService.list(Wrappers.<EvalIndicatorValue>lambdaQuery() | |
165 | -// .in(EvalIndicatorValue::getShopId, shopIds) | |
166 | -// .eq(EvalIndicatorValue::getDataDate, evalIndicatorImport.getDataDate()) | |
167 | -// .eq(EvalIndicatorValue::getDimensionType, DimensionTypeEnum.SHOP) | |
168 | -// .eq(EvalIndicatorValue::getYn, Boolean.TRUE) | |
169 | -// ); | |
170 | -// Set<Long> reportDataShopIds = evalIndicatorValues.stream().map(EvalIndicatorValue::getShopId).collect(Collectors.toSet()); | |
171 | -// for (EvalShopVO shop : shops) { | |
172 | -// shop.setReport(reportDataShopIds.contains(shop.getShopId())); | |
173 | -// } | |
174 | -// } | |
175 | - | |
176 | - return null; | |
212 | + return; | |
177 | 213 | } |
178 | 214 | |
179 | 215 | } |
180 | 216 | \ No newline at end of file | ... | ... |
fw-morax-service/src/main/java/cn/fw/morax/service/data/eval/EvalRewardDistDetailService.java
0 → 100644
1 | +package cn.fw.morax.service.data.eval; | |
2 | + | |
3 | + | |
4 | +import cn.fw.morax.domain.db.eval.EvalRewardDistDetail; | |
5 | +import com.baomidou.mybatisplus.extension.service.IService; | |
6 | + | |
7 | +/** | |
8 | + * <p> | |
9 | + * 考评池 服务类 | |
10 | + * </p> | |
11 | + * | |
12 | + * @author jiangchao | |
13 | + * @since 2023-02-23 | |
14 | + */ | |
15 | +public interface EvalRewardDistDetailService extends IService<EvalRewardDistDetail> { | |
16 | + | |
17 | +} | ... | ... |
fw-morax-service/src/main/java/cn/fw/morax/service/data/eval/EvalRewardDistService.java
0 → 100644
1 | +package cn.fw.morax.service.data.eval; | |
2 | + | |
3 | + | |
4 | +import cn.fw.morax.domain.db.eval.EvalRewardDist; | |
5 | +import com.baomidou.mybatisplus.extension.service.IService; | |
6 | + | |
7 | +/** | |
8 | + * <p> | |
9 | + * 考评门店奖惩分配 服务类 | |
10 | + * </p> | |
11 | + * | |
12 | + * @author jiangchao | |
13 | + * @since 2023-02-23 | |
14 | + */ | |
15 | +public interface EvalRewardDistService extends IService<EvalRewardDist> { | |
16 | + | |
17 | +} | ... | ... |
fw-morax-service/src/main/java/cn/fw/morax/service/data/eval/impl/EvalRewardDistDetailServiceImpl.java
0 → 100644
1 | +package cn.fw.morax.service.data.eval.impl; | |
2 | + | |
3 | +import cn.fw.morax.dao.eval.EvalRewardDistDetailDao; | |
4 | +import cn.fw.morax.domain.db.eval.EvalRewardDistDetail; | |
5 | +import cn.fw.morax.service.data.eval.EvalRewardDistDetailService; | |
6 | +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; | |
7 | +import org.springframework.stereotype.Service; | |
8 | + | |
9 | +/** | |
10 | + * <p> | |
11 | + * 考评池 服务实现类 | |
12 | + * </p> | |
13 | + * | |
14 | + * @author jiangchao | |
15 | + * @since 2023-02-23 | |
16 | + */ | |
17 | +@Service | |
18 | +public class EvalRewardDistDetailServiceImpl extends ServiceImpl<EvalRewardDistDetailDao, EvalRewardDistDetail> implements EvalRewardDistDetailService { | |
19 | + | |
20 | +} | ... | ... |
fw-morax-service/src/main/java/cn/fw/morax/service/data/eval/impl/EvalRewardDistServiceImpl.java
0 → 100644
1 | +package cn.fw.morax.service.data.eval.impl; | |
2 | + | |
3 | +import cn.fw.morax.dao.eval.EvalRewardDistDao; | |
4 | +import cn.fw.morax.domain.db.eval.EvalRewardDist; | |
5 | +import cn.fw.morax.service.data.eval.EvalRewardDistService; | |
6 | +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; | |
7 | +import org.springframework.stereotype.Service; | |
8 | + | |
9 | +/** | |
10 | + * <p> | |
11 | + * 考评门店奖惩分配 服务实现类 | |
12 | + * </p> | |
13 | + * | |
14 | + * @author jiangchao | |
15 | + * @since 2023-02-23 | |
16 | + */ | |
17 | +@Service | |
18 | +public class EvalRewardDistServiceImpl extends ServiceImpl<EvalRewardDistDao, EvalRewardDist> implements EvalRewardDistService { | |
19 | + | |
20 | +} | ... | ... |