| | |
| | | import com.baomidou.mybatisplus.annotation.TableName; |
| | | import lombok.Data; |
| | | |
| | | import java.math.BigDecimal; |
| | | import java.util.Date; |
| | | |
| | | /** |
| | |
| | | public class ContractResultRecord { |
| | | |
| | | @TableId |
| | | private Integer id; |
| | | private Integer resultId; |
| | | private Long id; |
| | | private Long resultId; |
| | | private String ruleIds; |
| | | private String ruleName; |
| | | private String deductCategory; |
| | | private String num; |
| | | private Double score; |
| | | private BigDecimal score; |
| | | private Date createTime; |
| | | private Date auditTime; |
| | | @TableLogic |
| | | private String deleted; |
| | | |
| | |
| | | @Excel(name = "规则") |
| | | private String ruleName; |
| | | |
| | | @Excel(name = "扣减方式") |
| | | private String deductCategory; |
| | | |
| | | @Excel(name = "指标") |
| | | private String num; |
| | | |
| | |
| | | /** |
| | | * 开始时间 |
| | | */ |
| | | @JsonFormat(pattern = "yyyy-MM-dd hh-mm-ss") |
| | | @JsonFormat(pattern = "yyyy-MM-dd") |
| | | @NotNull |
| | | private Date startTime; |
| | | |
| | | /** |
| | | * 结束时间 |
| | | */ |
| | | @JsonFormat(pattern = "yyyy-MM-dd hh-mm-ss") |
| | | @JsonFormat(pattern = "yyyy-MM-dd") |
| | | @NotNull |
| | | private Date endTime; |
| | | |
| | |
| | | package com.ycl.platform.domain.vo; |
| | | |
| | | import annotation.Excel; |
| | | import com.fasterxml.jackson.annotation.JsonFormat; |
| | | import com.ycl.platform.domain.entity.CheckResult; |
| | | import lombok.Data; |
| | |
| | | |
| | | private Long unitId; |
| | | |
| | | @Excel(name = "考核对象") |
| | | private String unitName; |
| | | |
| | | private Long contractId; |
| | | |
| | | @Excel(name = "运维合同") |
| | | private String contractName; |
| | | |
| | | private Long publishId; |
| | | |
| | | @Excel(name = "考核分数", scale = 2) |
| | | private BigDecimal score; |
| | | |
| | | @Excel(name = "是否发布", readConverterExp = "0=未发布,1=已发布") |
| | | private Integer publish; |
| | | |
| | | @JsonFormat(pattern = "yyyy-MM-dd") |
| | | @Excel(name = "考核时间", width = 30, dateFormat = "yyyy-MM-dd") |
| | | private Date checkTime; |
| | | |
| | | private String deleted; |
| | | |
| | | @JsonFormat(pattern = "yyyy-MM-dd") |
| | | private Date updateTime; |
| | | |
| | | @JsonFormat(pattern = "yyyy-MM-dd") |
| | | private Date createStartTime; |
| | | |
| | | @JsonFormat(pattern = "yyyy-MM-dd") |
| | | private Date createEndTime; |
| | | |
| | | public static CheckResultVO getVoByEntity(@NonNull CheckResult entity, CheckResultVO vo) { |
| | | if (vo == null) { |
| | | vo = new CheckResultVO(); |
| | |
| | | |
| | | import annotation.Log; |
| | | import com.ycl.platform.domain.entity.CheckResult; |
| | | import com.ycl.platform.domain.entity.ContractResultRecord; |
| | | import com.ycl.platform.domain.vo.CheckResultVO; |
| | | import com.ycl.platform.service.ICheckResultService; |
| | | import com.ycl.system.AjaxResult; |
| | |
| | | * 查询考核结果列表 |
| | | */ |
| | | @PreAuthorize("@ss.hasPermi('system:result:list')") |
| | | @GetMapping("/list") |
| | | public TableDataInfo list(CheckResult checkResult) |
| | | @PostMapping("/list") |
| | | public TableDataInfo list(@RequestBody CheckResultVO checkResult) |
| | | { |
| | | startPage(); |
| | | List<CheckResultVO> list = checkResultService.selectCheckResultList(checkResult); |
| | | return getDataTable(list); |
| | | } |
| | | |
| | | /** |
| | | * 查询考核结果列表 |
| | | */ |
| | | @PreAuthorize("@ss.hasPermi('system:result:query')") |
| | | @GetMapping("/record/list") |
| | | public TableDataInfo recordList(Long resultId) |
| | | { |
| | | List<ContractResultRecord> list = checkResultService.selectCheckResultRecordList(resultId); |
| | | return getDataTable(list); |
| | | } |
| | | |
| | |
| | | @PreAuthorize("@ss.hasPermi('system:result:export')") |
| | | @Log(title = "考核结果", businessType = BusinessType.EXPORT) |
| | | @PostMapping("/export") |
| | | public void export(HttpServletResponse response, CheckResult checkResult) |
| | | public void export(HttpServletResponse response, CheckResultVO checkResult) |
| | | { |
| | | List<CheckResult> list = checkResultService.selectCheckResult(checkResult); |
| | | ExcelUtil<CheckResult> util = new ExcelUtil<>(CheckResult.class); |
| | | List<CheckResultVO> list = checkResultService.selectCheckResultList(checkResult); |
| | | ExcelUtil<CheckResultVO> util = new ExcelUtil<>(CheckResultVO.class); |
| | | util.exportExcel(response, list, "考核结果数据"); |
| | | } |
| | | |
| | |
| | | } |
| | | |
| | | /** |
| | | * 发布考核结果 |
| | | */ |
| | | @PreAuthorize("@ss.hasPermi('system:result:publish')") |
| | | @PutMapping("/publish/{id}") |
| | | public AjaxResult publish(@PathVariable("id") Long id) |
| | | { |
| | | return toAjax(checkResultService.publish(id)); |
| | | } |
| | | |
| | | /** |
| | | * 删除考核结果 |
| | | */ |
| | | @PreAuthorize("@ss.hasPermi('system:result:remove')") |
| | |
| | | * @param unitId 运维单位 |
| | | * @return 数据 |
| | | */ |
| | | List<CalculateRuleCascaderVO> getRuleListByUnitId(Integer unitId); |
| | | List<CalculateRuleCascaderVO> getRuleListByUnitId(Integer unitId, String now); |
| | | } |
| | |
| | | |
| | | import com.baomidou.mybatisplus.core.mapper.BaseMapper; |
| | | import com.ycl.platform.domain.entity.CheckResult; |
| | | import com.ycl.platform.domain.vo.CheckResultVO; |
| | | |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * 考核结果Mapper接口 |
| | |
| | | * @date 2024-04-01 |
| | | */ |
| | | public interface CheckResultMapper extends BaseMapper<CheckResult> { |
| | | List<CheckResultVO> selectCheckResultList(CheckResultVO checkResult); |
| | | } |
| | |
| | | |
| | | import com.baomidou.mybatisplus.core.mapper.BaseMapper; |
| | | import com.ycl.platform.domain.entity.ContractResultRecord; |
| | | import org.apache.ibatis.annotations.Param; |
| | | |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * @author gonghl |
| | | */ |
| | | public interface ContractResultRecordMapper extends BaseMapper<ContractResultRecord> { |
| | | |
| | | /** |
| | | * 批量保存考核结果 |
| | | * @param contractResultRecord 集合 |
| | | */ |
| | | void saveBatch(List<ContractResultRecord> contractResultRecord); |
| | | } |
| | | |
| | | |
| | |
| | | import com.baomidou.mybatisplus.core.mapper.BaseMapper; |
| | | import com.ycl.platform.domain.entity.TContract; |
| | | |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * 【请填写功能名称】Mapper接口 |
| | | * |
| | |
| | | * @date 2024-03-12 |
| | | */ |
| | | public interface TContractMapper extends BaseMapper<TContract> { |
| | | List<TContract> selectAll(); |
| | | } |
| | |
| | | * @param checkResult 考核结果 |
| | | * @return 考核结果集合 |
| | | */ |
| | | public List<CheckResultVO> selectCheckResultList(CheckResult checkResult); |
| | | public List<CheckResult> selectCheckResult(CheckResult checkResult); |
| | | public List<CheckResultVO> selectCheckResultList(CheckResultVO checkResult); |
| | | |
| | | /** |
| | | * 新增考核结果 |
| | |
| | | * @param contractResultRecord 集合 |
| | | */ |
| | | void saveBatchRecord(List<ContractResultRecord> contractResultRecord); |
| | | |
| | | /** |
| | | * 根据考核结果查询记录 |
| | | * @param resultId 考核结果id |
| | | * @return 考核结果记录 |
| | | */ |
| | | List<ContractResultRecord> selectCheckResultRecordList(Long resultId); |
| | | |
| | | Boolean publish(Long id); |
| | | } |
| | |
| | | |
| | | @Override |
| | | public List<CalculateRuleCascaderVO> getRuleListByUnitId(Integer unitId) { |
| | | return TreeUtils.build(calculateRuleMapper.getRuleListByUnitId(unitId), 0L); |
| | | return TreeUtils.build(calculateRuleMapper.getRuleListByUnitId(unitId, DateUtils.getDate()), 0L); |
| | | } |
| | | } |
| | |
| | | package com.ycl.platform.service.impl; |
| | | |
| | | import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper; |
| | | import com.baomidou.mybatisplus.extension.conditions.update.LambdaUpdateChainWrapper; |
| | | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; |
| | | import com.ycl.platform.domain.entity.CheckResult; |
| | | import com.ycl.platform.domain.entity.ContractResultRecord; |
| | |
| | | import com.ycl.platform.service.ICheckResultService; |
| | | import com.ycl.platform.service.ITContractService; |
| | | import com.ycl.platform.service.YwUnitService; |
| | | import com.ycl.utils.SecurityUtils; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.stereotype.Service; |
| | | import utils.DateUtils; |
| | |
| | | * @return 考核结果 |
| | | */ |
| | | @Override |
| | | public List<CheckResultVO> selectCheckResultList(CheckResult checkResult) { |
| | | return checkResultMapper.selectList(null).stream().map( |
| | | item -> { |
| | | CheckResultVO checkResultVO = CheckResultVO.getVoByEntity(item, null); |
| | | checkResultVO.setUnitName(unitService.getById(item.getUnitId()).getUnitName()); |
| | | checkResultVO.setContractName(contractService.getById(item.getContractId()).getName()); |
| | | return checkResultVO; |
| | | } |
| | | ).toList(); |
| | | } |
| | | |
| | | @Override |
| | | public List<CheckResult> selectCheckResult(CheckResult checkResult) { |
| | | return checkResultMapper.selectList(null); |
| | | public List<CheckResultVO> selectCheckResultList(CheckResultVO checkResult) { |
| | | return checkResultMapper.selectCheckResultList(checkResult); |
| | | } |
| | | |
| | | /** |
| | |
| | | |
| | | @Override |
| | | public void saveBatchRecord(List<ContractResultRecord> contractResultRecord) { |
| | | // contractResultRecordMapper |
| | | if (!contractResultRecord.isEmpty()) { |
| | | contractResultRecordMapper.saveBatch(contractResultRecord); |
| | | } |
| | | } |
| | | |
| | | @Override |
| | | public List<ContractResultRecord> selectCheckResultRecordList(Long resultId) { |
| | | return new LambdaQueryChainWrapper<>(contractResultRecordMapper) |
| | | .eq(ContractResultRecord::getResultId, resultId) |
| | | .list(); |
| | | } |
| | | |
| | | @Override |
| | | public Boolean publish(Long id) { |
| | | return new LambdaUpdateChainWrapper<>(checkResultMapper) |
| | | .eq(CheckResult::getId, id) |
| | | .set(CheckResult::getPublish, 1) |
| | | .set(CheckResult::getPublishId, SecurityUtils.getLoginUser().getUserId()) |
| | | .update(); |
| | | } |
| | | } |
| | |
| | | */ |
| | | @Override |
| | | public List<ContractScore> selectDefaultScoreList(ContractScore contractScore) { |
| | | return new LambdaQueryChainWrapper<>(contractScoreMapper) |
| | | .eq(ObjectUtils.isNotEmpty(contractScore.getUnitId()), ContractScore::getUnitId, contractScore.getUnitId()) |
| | | .between(ObjectUtils.isNotEmpty(contractScore.getCreateStartTime()), ContractScore::getCreateTime, contractScore.getCreateStartTime(), contractScore.getCreateEndTime()) |
| | | .between(ObjectUtils.isNotEmpty(contractScore.getAuditingStartTime()), ContractScore::getAuditingTime, contractScore.getAuditingStartTime(), contractScore.getAuditingEndTime()) |
| | | .eq(ObjectUtils.isNotEmpty(contractScore.getAuditingStatus()), ContractScore::getAuditingStatus, contractScore.getAuditingStatus()) |
| | | .orderByDesc(ContractScore::getCreateTime) |
| | | .list() |
| | | .stream().peek( |
| | | item -> { |
| | | item.setUnitName(ywunitMapper.selectById(item.getUnitId()).getUnitName()); |
| | | item.setContractName(contractMapper.selectById(item.getContractId()).getName()); |
| | | } |
| | | ).toList(); |
| | | return contractScoreMapper.selectDefaultScoreList(contractScore); |
| | | } |
| | | |
| | | @Override |
| | |
| | | |
| | | @Override |
| | | public List<TContract> selectAll() { |
| | | return list(new LambdaQueryWrapper<TContract>() |
| | | .orderByDesc(TContract::getCreateTime)) |
| | | .stream().peek( |
| | | tContract -> tContract.setUnitName(ywUnitService.getById(tContract.getUnitId()).getUnitName()) |
| | | ).toList(); |
| | | return baseMapper.selectAll(); |
| | | } |
| | | |
| | | @Override |
| | |
| | | @Override |
| | | public List<TContract> selectUsingContract() { |
| | | return new LambdaQueryChainWrapper<>(baseMapper) |
| | | .gt(TContract::getStartTime, DateUtils.getNowDate()) |
| | | .lt(TContract::getEndTime, DateUtils.getNowDate()) |
| | | .le(TContract::getStartTime, DateUtils.getDate()) |
| | | .ge(TContract::getEndTime, DateUtils.getDate()) |
| | | .list(); |
| | | } |
| | | } |
| | |
| | | import com.ycl.platform.service.ITContractService; |
| | | import com.ycl.utils.DateUtils; |
| | | import com.ycl.utils.bean.BeanUtils; |
| | | import jakarta.annotation.PostConstruct; |
| | | import lombok.Data; |
| | | import org.springframework.scheduling.annotation.Scheduled; |
| | | import org.springframework.stereotype.Component; |
| | | import org.springframework.transaction.annotation.Transactional; |
| | | |
| | | import java.math.BigDecimal; |
| | | import java.time.LocalDate; |
| | | import java.time.format.DateTimeFormatter; |
| | | import java.util.ArrayList; |
| | | import java.util.List; |
| | | |
| | | /** |
| | |
| | | private String endTime; |
| | | |
| | | /** |
| | | * 每个月1号执行 |
| | | * 每个月1号执行,统计考核结果 |
| | | */ |
| | | @Scheduled(cron = "0 0 0 1 * ?") |
| | | // @PostConstruct |
| | | // 多表 |
| | | @Transactional |
| | | // @PostConstruct //启动时执行一次 |
| | | public void contractResultTask() { |
| | | // 查询有效期内的合同 |
| | | List<TContract> list = contractService.selectUsingContract(); |
| | |
| | | // 上个月扣分记录 |
| | | List<ContractScore> contractScore = contractScoreService.getDateRangeScoreByContractId(tContract.getId(), startTime, endTime); |
| | | // 新增考核结果 |
| | | CheckResult checkResult = getCheckResult(tContract, contractScore); |
| | | checkResultService.save(checkResult); |
| | | // 新增考核结果记录 |
| | | List<ContractResultRecord> contractResultRecord = getContractResultRecord(contractScore, checkResult); |
| | | checkResultService.saveBatchRecord(contractResultRecord); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 保存考核记录 |
| | | * |
| | | * @param contractScore 扣分 |
| | | * @param checkResult 考核结果 |
| | | * @return 考核记录 |
| | | */ |
| | | private List<ContractResultRecord> getContractResultRecord(List<ContractScore> contractScore, CheckResult checkResult) { |
| | | return contractScore.stream().map( |
| | | item -> { |
| | | ContractResultRecord record = new ContractResultRecord(); |
| | | BeanUtils.copyProperties(item, record); |
| | | record.setResultId(checkResult.getId()); |
| | | record.setCreateTime(DateUtils.getNowDate()); |
| | | return record; |
| | | } |
| | | ).toList(); |
| | | } |
| | | |
| | | /** |
| | | * 计算考核结果 |
| | | * |
| | | * @param tContract 合同 |
| | | * @param contractScore 扣分 |
| | | * @return 考核结果 |
| | | */ |
| | | private CheckResult getCheckResult(TContract tContract, List<ContractScore> contractScore) { |
| | | CheckResult checkResult = new CheckResult(); |
| | | checkResult.setUnitId(tContract.getUnitId()); |
| | | checkResult.setContractId(tContract.getId()); |
| | | checkResult.setPublish(0); |
| | | checkResult.setDeleted("0"); |
| | | checkResult.setCheckTime(DateUtils.getNowDate()); |
| | | checkResultService.save(checkResult); |
| | | // 新增考核结果记录 |
| | | List<ContractResultRecord> contractResultRecord = new ArrayList<>(); |
| | | BeanUtils.copyBeanProp(contractResultRecord, contractScore); |
| | | checkResultService.saveBatchRecord(contractResultRecord); |
| | | } |
| | | checkResult.setScore(contractScore.isEmpty() ? new BigDecimal("100") : new BigDecimal("100").subtract(contractScore.stream().map(ContractScore::getScore).reduce(BigDecimal::add).get())); |
| | | return checkResult; |
| | | } |
| | | |
| | | |
| | |
| | | from t_calculate_rule |
| | | where deleted = 0 |
| | | and contract_id |
| | | in (select id from t_contract where unit_id = #{unitId} and deleted = 0 and start_time <![CDATA[ <= ]]> now() and end_time >= now() ) |
| | | in (select id from t_contract where unit_id = #{unitId} and deleted = 0 and start_time <![CDATA[ <= ]]> #{now} and end_time >= #{now} ) |
| | | </select> |
| | | |
| | | <insert id="insertDefaultRule" useGeneratedKeys="true" keyProperty="id"> |
| | |
| | | <mapper namespace="com.ycl.platform.mapper.CheckResultMapper"> |
| | | |
| | | |
| | | <select id="selectCheckResultList" resultType="com.ycl.platform.domain.vo.CheckResultVO"> |
| | | SELECT c.*, |
| | | u.unit_name AS unitName, |
| | | ct.name AS contractName |
| | | FROM t_contract_result c |
| | | LEFT JOIN |
| | | t_yw_unit u ON c.unit_id = u.id and u.deleted = '0' |
| | | LEFT JOIN |
| | | t_contract ct ON c.contract_id = ct.id and ct.deleted = '0' |
| | | where |
| | | c.deleted = '0' |
| | | <if test="unitId != null"> |
| | | AND c.unit_id = #{unitId} |
| | | </if> |
| | | <if test="createStartTime != null"> |
| | | AND c.check_time BETWEEN #{createStartTime} AND #{createEndTime} |
| | | </if> |
| | | <if test="publish != null"> |
| | | AND c.publish = #{publish} |
| | | </if> |
| | | </select> |
| | | </mapper> |
| | |
| | | select id, publish_id, template_id, num, score, create_user, create_user_name, update_user, update_user_name, create_time, update_time from t_contract_score |
| | | </sql> |
| | | |
| | | <select id="selectDefaultScoreList" resultMap="DefaultScoreResult"> |
| | | <include refid="selectDefaultScoreVo"/> |
| | | <where> |
| | | <if test="publishId != null "> and publish_id = #{publishId}</if> |
| | | <if test="templateId != null "> and template_id = #{templateId}</if> |
| | | </where> |
| | | <select id="selectDefaultScoreList" resultType="com.ycl.platform.domain.entity.ContractScore"> |
| | | SELECT |
| | | cs.*, |
| | | u.unit_name AS unitName, |
| | | c.name AS contractName |
| | | FROM |
| | | t_contract_score cs |
| | | LEFT JOIN |
| | | t_yw_unit u ON cs.unit_id = u.id and u.deleted = '0' |
| | | LEFT JOIN |
| | | t_contract c ON cs.contract_id = c.id and c.deleted = '0' |
| | | where |
| | | cs.deleted = '0' |
| | | <if test="unitId != null"> |
| | | AND cs.unit_id = #{unitId} |
| | | </if> |
| | | <if test="createStartTime != null"> |
| | | AND cs.create_time BETWEEN #{createStartTime} AND #{createEndTime} |
| | | </if> |
| | | <if test="auditingStartTime != null"> |
| | | AND cs.auditing_time BETWEEN #{auditingStartTime} AND #{auditingEndTime} |
| | | </if> |
| | | <if test="auditingStatus != null"> |
| | | AND cs.auditing_status = #{auditingStatus} |
| | | </if> |
| | | ORDER BY |
| | | cs.create_time DESC |
| | | </select> |
| | | |
| | | <select id="selectDefaultScoreById" resultMap="DefaultScoreResult"> |
| | |
| | | "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> |
| | | <mapper namespace="com.ycl.platform.mapper.TContractMapper"> |
| | | |
| | | <select id="selectAll" resultType="com.ycl.platform.domain.entity.TContract"> |
| | | select a.*, b.unit_name |
| | | from t_contract a |
| | | left join t_yw_unit b on a.unit_id = b.id and b.deleted = '0' |
| | | where a.deleted = '0' |
| | | order by create_time desc |
| | | </select> |
| | | |
| | | </mapper> |
| | |
| | | "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> |
| | | <mapper namespace="com.ycl.platform.mapper.ContractResultRecordMapper"> |
| | | |
| | | <insert id="saveBatch"> |
| | | insert into t_contract_result_record(rule_name, create_time, rule_ids, result_id, num, score, deleted, deduct_category) values |
| | | <foreach collection="contractResultRecord" item="item" separator=","> |
| | | (#{item.ruleName}, #{item.createTime}, #{item.ruleIds}, #{item.resultId}, #{item.num}, #{item.score}, 0, #{item.deductCategory}) |
| | | </foreach> |
| | | </insert> |
| | | |
| | | </mapper> |