fuliqi
2024-08-21 db86411bb09d9a3450d14a91125adb26a53cc191
合同在线率 打分
8个文件已修改
134 ■■■■ 已修改文件
ycl-pojo/src/main/java/com/ycl/platform/domain/entity/ContractRuleRecord.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/java/com/ycl/platform/mapper/ContractRuleRecordMapper.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/java/com/ycl/platform/mapper/ContractScoreMapper.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/java/com/ycl/platform/service/impl/ContractScoreServiceImpl.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/java/com/ycl/plus/CustomMetaObjectHandler.java 17 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/java/com/ycl/task/ContractTask.java 88 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/resources/mapper/zgyw/ContractRuleRecordMapper.xml 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/resources/mapper/zgyw/TContractMapper.xml 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-pojo/src/main/java/com/ycl/platform/domain/entity/ContractRuleRecord.java
@@ -5,6 +5,7 @@
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import java.math.BigDecimal;
import java.util.Date;
/**
@@ -27,7 +28,7 @@
    /** 点位在线率 */
    @Excel(name = "点位在线率")
    private Integer siteOnline;
    private BigDecimal siteOnline;
    /** 创建时间 */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
ycl-server/src/main/java/com/ycl/platform/mapper/ContractRuleRecordMapper.java
@@ -11,8 +11,11 @@
 * @author ruoyi
 * @date 2024-08-21
 */
public interface ContractRuleRecordMapper
{
public interface ContractRuleRecordMapper {
    public void insertBatch(@Param("list") List<ContractRuleRecord> list);
    public List<ContractRuleRecord> selectMonth(@Param("startTime") String startTime, @Param("endTime") String endTime);
    /**
     * 查询合同规则记录
     *
@@ -37,7 +40,6 @@
     */
    public int insertContractRuleRecord(ContractRuleRecord contractRuleRecord);
    public void insertBatch(@Param("list") List<ContractRuleRecord> list);
    /**
     * 修改合同规则记录
ycl-server/src/main/java/com/ycl/platform/mapper/ContractScoreMapper.java
@@ -2,6 +2,7 @@
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ycl.platform.domain.entity.ContractScore;
import org.apache.ibatis.annotations.Param;
import java.util.List;
@@ -13,6 +14,7 @@
 */
public interface ContractScoreMapper extends BaseMapper<ContractScore>
{
    /**
     * 查询合同打分
     *
ycl-server/src/main/java/com/ycl/platform/service/impl/ContractScoreServiceImpl.java
@@ -16,6 +16,7 @@
import java.io.Serializable;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;
@@ -62,12 +63,14 @@
        contractScore.setAuditingStatus(AuditingStatus.WAIT);
        contractScore.setRuleIds(Arrays.stream(contractScore.getRuleIdsArray()).map(String::valueOf).collect(Collectors.joining(",")));
        contractScore.setRuleIdsArray(Arrays.stream(contractScore.getRuleIds().split(",")).map(Long::parseLong).toArray(Long[]::new));
        contractScore.setUpdateTime(new Date());
        return super.save(contractScore);
    }
    @Override
    public boolean updateById(ContractScore contractScore) {
        contractScore.setRuleIds(Arrays.stream(contractScore.getRuleIdsArray()).map(String::valueOf).collect(Collectors.joining(",")));
        contractScore.setUpdateTime(new Date());
        return super.updateById(contractScore);
    }
ycl-server/src/main/java/com/ycl/plus/CustomMetaObjectHandler.java
@@ -2,6 +2,7 @@
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import com.ycl.utils.SecurityUtils;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;
@@ -14,6 +15,7 @@
 * @date 2024/3/4
 */
@Component
@Slf4j
public class CustomMetaObjectHandler implements MetaObjectHandler {
    /**
@@ -23,7 +25,13 @@
     */
    @Override
    public void insertFill(MetaObject metaObject) {
        String username = SecurityUtils.getLoginUser().getUsername();
        String username = null;
        try {
            username = SecurityUtils.getLoginUser().getUsername();
        } catch (Exception e) {
            log.error(e.getMessage());
        }
        this.setFieldValByName("updateTime", new Date(), metaObject);
        this.setFieldValByName("createTime", new Date(), metaObject);
        this.setFieldValByName("createUser", username, metaObject);
@@ -38,7 +46,12 @@
     */
    @Override
    public void updateFill(MetaObject metaObject) {
        String username = SecurityUtils.getLoginUser().getUsername();
        String username = null;
        try {
            username = SecurityUtils.getLoginUser().getUsername();
        } catch (Exception e) {
            log.error(e.getMessage());
        }
        this.setFieldValByName("updateTime", new Date(), metaObject);
        this.setFieldValByName("updateBy",username,metaObject);
        this.setFieldValByName("updateUser",username,metaObject);
ycl-server/src/main/java/com/ycl/task/ContractTask.java
@@ -3,20 +3,20 @@
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.mongodb.client.result.DeleteResult;
import com.ycl.platform.domain.entity.ContractRuleRecord;
import com.ycl.platform.domain.entity.Report;
import com.ycl.platform.domain.entity.TMonitor;
import com.ycl.platform.domain.entity.YwPoint;
import com.ycl.platform.domain.entity.*;
import com.ycl.platform.domain.result.HK.SnapshotDataMonitorResult;
import com.ycl.platform.domain.result.UY.VideoOnlineResult;
import com.ycl.platform.domain.vo.CalculateRuleVO;
import com.ycl.platform.domain.vo.ContractVO;
import com.ycl.platform.domain.vo.ReportVO;
import com.ycl.platform.mapper.*;
import com.ycl.platform.service.IContractScoreService;
import com.ycl.utils.DateUtils;
import constant.ApiConstants;
import constant.RedisConstant;
import enumeration.ContractRule;
import enumeration.general.AuditingStatus;
import enumeration.general.RuleDeductCategoryEnum;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoTemplate;
@@ -52,10 +52,13 @@
    private ReportMapper reportMapper;
    @Autowired
    private ContractRuleRecordMapper recordMapper;
    @Autowired
    private IContractScoreService contractScoreService;
    private static final Integer Online = 1;
    private static final Integer Offline = -1;
    private static final String AuditStatus_Pass = "1";
    private static final String Remark = "系统生成";
    /**
     * 合同考核 在线率每日任务检测
@@ -66,9 +69,10 @@
     * 月底计算平均值,根据在线率和合同标准扣减分数
     */
    public void onlineCheck() {
        log.info("开始计算合同点位在线率");
        List<CalculateRuleVO> ruleVos = contractMapper.selectByRuleName(ContractRule.CONTRACT_RULE_Online.getName(), null, new Date());
        List<Integer> unitIds = ruleVos.stream().map(CalculateRuleVO::getUnitId).collect(Collectors.toList());
        List<YwPoint> ywPoints = ywPointMapper.selectList(new QueryWrapper<YwPoint>().in("unitId", unitIds));
        List<YwPoint> ywPoints = ywPointMapper.selectList(new QueryWrapper<YwPoint>().in("unit_id", unitIds));
        //key是unitId value是设备编码集合
        Map<Long, List<String>> unitMap = ywPoints.stream()
                .collect(Collectors.groupingBy(
@@ -116,13 +120,85 @@
                    onlineSite++;
                }
            }
            BigDecimal online = new BigDecimal(onlineSite).divide(new BigDecimal(totalSite), 2, RoundingMode.DOWN);
            ContractRuleRecord contractRuleRecord = new ContractRuleRecord();
            contractRuleRecord.setSiteOnline( onlineSite / totalSite);
            contractRuleRecord.setSiteOnline(online);
            contractRuleRecord.setCreateTime(new Date());
            contractRuleRecord.setUnitId(unitId);
            ruleRecordList.add(contractRuleRecord);
        });
        //存储结果
        recordMapper.insertBatch(ruleRecordList);
        log.info("结束计算合同点位在线率");
    }
    //月底计算在线率分数
    public void calculateOnlineScore() {
        log.info("开始计算合同点位在线率分数");
        //如果是月底,需要统计平均在线率然后进行积分扣除
//        String now = DateUtils.getDate();
        String mouthStart = DateUtils.getMouthStart(new Date());
        String mouthEnd = DateUtils.getMouthEnd(new Date());
//        if (now.equals(mouthEnd)) {
            //查一个月的记录
            List<ContractRuleRecord> ruleMonthRecords = recordMapper.selectMonth(mouthStart, mouthEnd);
            //通过unitId分单位
            Map<Long, List<ContractRuleRecord>> unitMap = ruleMonthRecords.stream().collect(Collectors.groupingBy(ContractRuleRecord::getUnitId));
            //查在线率规则
            List<CalculateRuleVO> ruleVos = contractMapper.selectByRuleName(ContractRule.CONTRACT_RULE_Online.getName(), null, new Date());
            //获取key为合同id,value为在线率规则的map
            Map<Integer, List<CalculateRuleVO>> contractMap = ruleVos.stream().collect(Collectors.groupingBy(CalculateRuleVO::getContractId));
            //准备批量打分的集合
            List<ContractScore> contractScoreList = new ArrayList<>();
            contractMap.forEach((contractId, ruleList) -> {
                //一个合同对应一个单位,因此unitId都相同
                CalculateRuleVO calculateRuleVO = ruleList.get(0);
                Integer unitId = calculateRuleVO.getUnitId();
                List<ContractRuleRecord> ruleRecordList = unitMap.get(Long.parseLong(unitId + ""));
                if (!CollectionUtils.isEmpty(ruleMonthRecords)) {
                    BigDecimal siteOnlineTotal = ruleRecordList.stream().map(ContractRuleRecord::getSiteOnline).reduce(BigDecimal.ZERO, BigDecimal::add);
                    BigDecimal siteOnline = siteOnlineTotal.divide(new BigDecimal(ruleRecordList.size()), 2, RoundingMode.DOWN);
                    for (CalculateRuleVO ruleVO : ruleList) {
                        Double max = ruleVO.getMax();
                        Double min = ruleVO.getMin();
                        //判断范围在哪个区间
                        if (checkRange(min, max, siteOnline.multiply(new BigDecimal(100)))) {
                            //需要扣除的分数
                            Double deductScore = ruleVO.getCalcFraction();
                            ContractScore contractScore = new ContractScore();
                            contractScore.setContractId(Long.parseLong(contractId + ""));
                            contractScore.setAuditingStatus(AuditingStatus.WAIT);
                            contractScore.setUnitId(Long.parseLong(unitId + ""));
                            contractScore.setRuleId(Long.parseLong(ruleVO.getId() + ""));
                            contractScore.setRuleIds("0," + ruleVO.getId());
                            contractScore.setNum(siteOnline + "");
                            contractScore.setDeductCategory(ruleVO.getDeductCategory().getDesc());
                            contractScore.setScore(new BigDecimal(deductScore));
                            contractScore.setRuleName(ruleVO.getRuleName() + "/" + ruleVO.getRuleCondition());
                            contractScore.setCreateTime(new Date());
                            contractScore.setUpdateTime(new Date());
                            contractScore.setRemark(Remark);
                            contractScoreList.add(contractScore);
                        }
                    }
                }
            });
//        }
        contractScoreService.saveBatch(contractScoreList);
        log.info("结束计算合同点位在线率分数");
    }
    private boolean checkRange(Double min, Double max, BigDecimal siteOnline) {
        if (siteOnline == null) {
            return false;
        }
        if (max != null && siteOnline.compareTo(new BigDecimal(max)) > 0) {
            return false;
        }
        if (min != null && siteOnline.compareTo(new BigDecimal(min)) < 0) {
            return false;
        }
        return true;
    }
}
ycl-server/src/main/resources/mapper/zgyw/ContractRuleRecordMapper.xml
@@ -17,6 +17,11 @@
        from t_contract_rule_record
    </sql>
    <select id="selectMonth" resultMap="ContractRuleRecordResult">
        select id, unit_id, site_online, create_time, deleted
        from t_contract_rule_record
        where DATE(create_time) between #{startTime} and #{endTime}
    </select>
    <select id="selectContractRuleRecordList" resultMap="ContractRuleRecordResult">
        <include refid="selectContractRuleRecordVo"/>
        <where>
@@ -48,7 +53,7 @@
    </insert>
    <insert id="insertBatch">
        inner into t_contract_rule_record (unit_id,site_online,create_time)
        insert into t_contract_rule_record (unit_id,site_online,create_time)
        values
        <foreach collection="list" item="item" separator=",">
            (#{item.unitId},#{item.siteOnline},#{item.createTime})
ycl-server/src/main/resources/mapper/zgyw/TContractMapper.xml
@@ -41,12 +41,12 @@
        from t_contract tc
        left join t_calculate_rule tcr on tc.id = tcr.contract_id
        <where>
            tc.deleted =0 and #{time} between tc.start_time and tc.end_time
            tc.deleted =0 and #{date} between tc.start_time and tc.end_time
            <if test="ruleName !=null and ruleName!=''">
                tcr.rule_name = #{ruleName}
                and tcr.rule_name = #{ruleName}
            </if>
            <if test="ruleCondition !=null and ruleCondition!=''">
                tcr.rule_condition = #{ruleCondition}
                and tcr.rule_condition = #{ruleCondition}
            </if>
        </where>