Commit edc57409c567f780c40f6447bdd5e574b4193038

Authored by 姜超
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 +}
... ...