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>