From f77a9d8f16bae6b4cf809891f037c038070e81ed Mon Sep 17 00:00:00 2001
From: zxl <763096477@qq.com>
Date: 星期四, 19 六月 2025 17:12:50 +0800
Subject: [PATCH] 工单,数据中心用户查看数据的权限,合同考核每日,以及导出每日和按月

---
 ycl-server/src/main/java/com/ycl/platform/service/impl/CalculateReportServiceImpl.java |  192 ++++++++++++++++++++++++++++++++++++++---------
 1 files changed, 154 insertions(+), 38 deletions(-)

diff --git a/ycl-server/src/main/java/com/ycl/platform/service/impl/CalculateReportServiceImpl.java b/ycl-server/src/main/java/com/ycl/platform/service/impl/CalculateReportServiceImpl.java
index b599917..9202248 100644
--- a/ycl-server/src/main/java/com/ycl/platform/service/impl/CalculateReportServiceImpl.java
+++ b/ycl-server/src/main/java/com/ycl/platform/service/impl/CalculateReportServiceImpl.java
@@ -1,27 +1,50 @@
 package com.ycl.platform.service.impl;
 
+import com.alibaba.excel.EasyExcel;
+import com.alibaba.excel.ExcelWriter;
+import com.alibaba.excel.write.metadata.WriteSheet;
+import com.alibaba.excel.write.style.column.LongestMatchColumnWidthStyleStrategy;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ycl.platform.domain.entity.CalculateRecord;
 import com.ycl.platform.domain.entity.CalculateReport;
+import com.ycl.platform.domain.entity.CalculateRule;
+import com.ycl.platform.domain.excel.CalculateExport;
+import com.ycl.platform.domain.form.CalculateReportBackfillForm;
+import com.ycl.platform.domain.form.CalculateReportForm;
+import com.ycl.platform.domain.query.CalculateReportQuery;
+import com.ycl.platform.domain.vo.CalculateReportDetailVO;
+import com.ycl.platform.domain.vo.CalculateReportVO;
+import com.ycl.platform.domain.vo.ContractResultVO;
+import com.ycl.platform.mapper.CalculateRecordMapper;
 import com.ycl.platform.mapper.CalculateReportMapper;
 import com.ycl.platform.service.CalculateReportService;
+import com.ycl.platform.service.ICalculateRuleService;
 import com.ycl.system.Result;
-import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.ycl.platform.domain.form.CalculateReportForm;
-import com.ycl.platform.domain.vo.CalculateReportVO;
-import com.ycl.platform.domain.query.CalculateReportQuery;
-import java.util.List;
-import org.apache.commons.lang3.StringUtils;
-import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.ycl.system.entity.SysRole;
+import com.ycl.system.entity.SysUser;
 import com.ycl.system.page.PageUtil;
-import org.springframework.stereotype.Service;
-import org.springframework.security.core.context.SecurityContextHolder;
+import com.ycl.utils.SecurityUtils;
+import enumeration.general.CalculateReportStatusEnum;
+import enumeration.general.PublishType;
+import jakarta.servlet.http.HttpServletResponse;
+import lombok.RequiredArgsConstructor;
+import lombok.SneakyThrows;
 import org.springframework.beans.BeanUtils;
+import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.Assert;
-import java.util.ArrayList;
+import org.springframework.util.CollectionUtils;
+
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.net.URLEncoder;
+import java.nio.charset.StandardCharsets;
+import java.util.Date;
+import java.util.List;
+import java.util.Objects;
 import java.util.stream.Collectors;
-import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper;
-import lombok.RequiredArgsConstructor;
 
 /**
  * 鏍哥畻鎶ュ憡 鏈嶅姟瀹炵幇绫�
@@ -33,7 +56,8 @@
 @RequiredArgsConstructor
 public class CalculateReportServiceImpl extends ServiceImpl<CalculateReportMapper, CalculateReport> implements CalculateReportService {
 
-    private final CalculateReportMapper calculateReportMapper;
+    private final ICalculateRuleService calculateRuleService;
+    private final CalculateRecordMapper calculateRecordMapper;
 
     /**
      * 娣诲姞
@@ -43,6 +67,9 @@
     @Override
     public Result add(CalculateReportForm form) {
         CalculateReport entity = CalculateReportForm.getEntityByForm(form, null);
+        Date now = new Date();
+        entity.setCreateTime(now);
+        entity.setUpdateTime(now);
         if(baseMapper.insert(entity) > 0) {
             return Result.ok("娣诲姞鎴愬姛");
         }
@@ -58,10 +85,11 @@
     public Result update(CalculateReportForm form) {
 
         CalculateReport entity = baseMapper.selectById(form.getId());
-
         // 涓虹┖鎶汭llegalArgumentException锛屽仛鍏ㄥ眬寮傚父澶勭悊
         Assert.notNull(entity, "璁板綍涓嶅瓨鍦�");
         BeanUtils.copyProperties(form, entity);
+        Date now = new Date();
+        entity.setUpdateTime(now);
         if (baseMapper.updateById(entity) > 0) {
             return Result.ok("淇敼鎴愬姛");
         }
@@ -74,7 +102,7 @@
      * @return
      */
     @Override
-    public Result remove(List<String> ids) {
+    public Result remove(List<Long> ids) {
         if(baseMapper.deleteBatchIds(ids) > 0) {
             return Result.ok("鍒犻櫎鎴愬姛");
         }
@@ -87,7 +115,7 @@
      * @return
      */
     @Override
-    public Result removeById(String id) {
+    public Result removeById(Long id) {
         if(baseMapper.deleteById(id) > 0) {
             return Result.ok("鍒犻櫎鎴愬姛");
         }
@@ -101,33 +129,47 @@
      */
     @Override
     public Result page(CalculateReportQuery query) {
-
-        IPage<CalculateReport> page = new LambdaQueryChainWrapper<>(baseMapper)
-                .orderByDesc(CalculateReport::getCreateTime)
-                .page(PageUtil.getPage(query, CalculateReport.class));
-
-        List<CalculateReportVO> vos = page.getRecords().stream()
-                .map(
-                        entity -> CalculateReportVO.getVoByEntity(entity, null)
-                )
-                .collect(Collectors.toList());
-        return Result.ok().data(vos).total(page.getTotal());
+        IPage<CalculateReportVO> page = PageUtil.getPage(query, CalculateReportVO.class);
+        //鍙兘鐪嬭嚜宸卞崟浣�
+        query.setUnitId(SecurityUtils.getUnitId());
+        //鍙兘鐪嬪凡鍙戝竷
+        roleControl(query);
+        baseMapper.page(query, page);
+        page.getRecords().stream().forEach(item -> {
+            if (Objects.isNull(item)) {
+                item.setCanPublish(Boolean.FALSE);
+            } else {
+                item.setCanPublish(Boolean.TRUE);
+            }
+        });
+        return Result.ok().data(page.getRecords()).total(page.getTotal());
     }
 
     /**
      * 鏍规嵁id鏌ユ壘
-     * @param id
+     * @param
      * @return
      */
     @Override
-    public Result detail(String id) {
-
-        CalculateReport entity = baseMapper.selectById(id);
-        Assert.notNull(entity, "璁板綍涓嶅瓨鍦�");
-        CalculateReportVO vo = CalculateReportVO.getVoByEntity(entity, null);
-        return Result.ok().data(vo);
+    public Result detail(CalculateReportQuery query) {
+        roleControl(query);
+        // 鏄庣粏鍒楄〃
+        CalculateReportDetailVO detail = baseMapper.getById(query);
+        return Result.ok().data(detail);
     }
 
+    private void roleControl(CalculateReportQuery query) {
+        List<SysRole> roles = SecurityUtils.getLoginUser().getUser().getRoles();
+        SysUser user = SecurityUtils.getLoginUser().getUser();
+        if (!user.isAdmin()) {
+            for (SysRole role : roles) {
+                //鑿滃崟鐨勫湴鏂瑰鍔犱簡涓�涓寜閽紝瑙掕壊鏉冮檺缂栬緫濡傛灉鍕句笂浜嗚鏄庡彧鑳芥煡鐪嬪凡鍙戝竷
+                if (role.getPermissions().contains("check:contract:role:publish")) {
+                    query.setStatus(PublishType.PUBLISHED.getCode());
+                }
+            }
+        }
+    }
     /**
      * 鍒楄〃
      * @return
@@ -136,10 +178,84 @@
     public Result all() {
         List<CalculateReport> entities = baseMapper.selectList(null);
         List<CalculateReportVO> vos = entities.stream()
-                .map(
-                        entity -> CalculateReportVO.getVoByEntity(entity, null)
-                )
+                .map(entity -> CalculateReportVO.getVoByEntity(entity, null))
                 .collect(Collectors.toList());
         return Result.ok().data(vos);
     }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Result backfill(CalculateReportBackfillForm form) {
+//        CalculateReport report = baseMapper.selectById(form.getId());
+//        if (Objects.isNull(report)) {
+//            throw new RuntimeException("璇ユ牳绠楁姤鍛婁笉瀛樺湪");
+//        }
+//        if (CalculateReportStatusEnum.PUBLISHED.equals(report.getStatus())) {
+//            throw new RuntimeException("鏈�鏂颁竴娆℃牳绠楁姤鍛婂凡缁忓彂甯冿紝鏃犳硶淇敼");
+//        }
+//        CalculateReportBackfillForm.RecordForm latestRecord = form.getRecordList().get(0);
+//        CalculateRecord beforeRecord = calculateRecordMapper.selectById(latestRecord.getId());
+//        if (Objects.isNull(beforeRecord)) {
+//            throw new RuntimeException("鏈�杩戜竴娆℃牳绠楄褰曚笉瀛樺湪");
+//        }
+//        // 璁$畻寰楀埌鎵f鎬婚锛堝彧绠楁渶杩戜竴鏉★級
+//        BigDecimal totalDeduct = report.getDeductMoney().subtract(latestRecord.getDeductMoney()).add(latestRecord.getDeductMoney());
+//        report.setDeductMoney(totalDeduct);
+//        baseMapper.updateById(report);
+//
+//        beforeRecord.setDeductMoney(latestRecord.getDeductMoney());
+//        calculateRecordMapper.updateById(beforeRecord);
+        List<CalculateReportBackfillForm.RecordForm> recordList = form.getRecordList();
+        if(!CollectionUtils.isEmpty(recordList)) calculateRecordMapper.updateBatch(recordList);
+        return Result.ok("鎿嶄綔鎴愬姛");
+    }
+
+    @Override
+    public Result updatePublishStatus(Integer contractId,Integer whichYear) {
+
+        calculateRecordMapper.batchPublish(contractId,whichYear);
+        return Result.ok("鎿嶄綔鎴愬姛");
+    }
+
+    @Override
+    public Result updatePublishStatusById(Integer id, String status) {
+        calculateRecordMapper.updatePublishById(id,status);
+        return Result.ok("鎿嶄綔鎴愬姛");
+    }
+
+    @Override
+    @SneakyThrows
+    public void export(Integer whichYear,Integer whichMonth,Integer whichDay,Integer contractId, HttpServletResponse response) {
+        // 鑾峰彇鏁版嵁
+        List<CalculateExport> list = baseMapper.exportData(whichYear,whichMonth,whichDay,contractId);
+        CalculateExport calculateExport = new CalculateExport();
+        calculateExport.setRuleName("鍚堣");
+        calculateExport.setNum(list.stream().mapToInt(CalculateExport::getNum).sum());
+
+        calculateExport.setScore(list.stream()
+                .map(CalculateExport::getScore)
+                .reduce(BigDecimal.ZERO, BigDecimal::add) // 璁$畻鎬诲拰
+                .add(BigDecimal.valueOf(100)) // 鍔犱笂100
+                .setScale(1, RoundingMode.HALF_UP));
+        list.add(calculateExport);
+        list.forEach(item->{
+            if("纭繚褰曞儚瀹屾暣涓嶅畾鏈熷鎵�鏈夌偣浣嶅綍鍍忓畬鏁存�ф娊鏌�".equals(item.getRuleName())){
+                item.setNum(item.getScore().abs().divide(item.getCalcFraction(),0,RoundingMode.HALF_UP).intValue());
+            }
+        });
+        // 鑾峰彇瑙勫垯
+        List<CalculateRule> ruleList = calculateRuleService.list(new LambdaQueryWrapper<CalculateRule>().eq(CalculateRule::getContractId, contractId));
+        // 杈撳嚭鏂囦欢
+        response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
+        response.setCharacterEncoding("utf-8");
+        String fileName = URLEncoder.encode("鏍哥畻鎶ュ憡", StandardCharsets.UTF_8).replace("\\+", "%20");
+        response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");
+        // 澧炲姞sheet
+        try (ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream()).build()){
+            WriteSheet sheet = EasyExcel.writerSheet(0, "鏍哥畻鎶ュ憡").head(CalculateExport.class).build();
+            excelWriter.write(list, sheet);
+            WriteSheet sheet2 = EasyExcel.writerSheet(1, "鏍哥畻瑙勫垯").head(CalculateRule.class).registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()).build();
+            excelWriter.write(ruleList, sheet2);
+        }
+    }
 }

--
Gitblit v1.8.0