Ver Fonte

顽症报表

zhuang há 7 meses atrás
pai
commit
ecf407109f

+ 16 - 0
business-common/src/main/java/com/rongwei/bscommon/sys/dao/ZhcxDeptPeopleCountDao.java

@@ -0,0 +1,16 @@
+package com.rongwei.bscommon.sys.dao;
+
+import com.rongwei.bsentity.domain.ZhcxDeptPeopleCountDo;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ * 组织人员统计表 Mapper 接口
+ * </p>
+ *
+ * @author dlc
+ * @since 2024-12-31
+ */
+public interface ZhcxDeptPeopleCountDao extends BaseMapper<ZhcxDeptPeopleCountDo> {
+
+}

+ 34 - 0
business-common/src/main/java/com/rongwei/bscommon/sys/dao/ZhcxPersistentManageDao.java

@@ -2,6 +2,8 @@ package com.rongwei.bscommon.sys.dao;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.rongwei.bsentity.domain.ZhcxPersistentManageDo;
+import com.rongwei.bsentity.vo.OrganizationVo;
+import com.rongwei.bsentity.vo.PersistentVo;
 import com.rongwei.bsentity.vo.ZhcxPersistentWordVO;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Select;
@@ -33,4 +35,36 @@ public interface ZhcxPersistentManageDao extends BaseMapper<ZhcxPersistentManage
             "GROUP BY FIRSTORGNAME ,TYPE"+
             "</script>")
     List<ZhcxPersistentWordVO> groupByList(Map<String, Object> map);
+
+    @Select("SELECT \n" +
+            "    o.ID AS orgId, \n" +
+            "    o.FULLNAME AS orgName, \n" +
+            "    o.PID AS pid ,o.ORGTYPE AS orgType,o.SORT AS sort,\n" +
+            "    COUNT(DISTINCT uo.USERID) AS userCount\n" +
+            "FROM \n" +
+            "    SYS_USER_ORG uo\n" +
+            "JOIN \n" +
+            "    SYS_ORGANIZATION o ON uo.ORGID = o.ID\n" +
+            "LEFT JOIN \n" +
+            "    SYS_USER_ROLE ur ON uo.USERID = ur.USERID\n" +
+            "LEFT JOIN \n" +
+            "    SYS_ROLE r ON ur.ROLEID = r.ID\n" +
+            "WHERE \n" +
+            "    r.CODE !='role080' AND uo.DELETED ='0'\n" +
+            "    AND uo.ORGID IN (SELECT ID FROM SYS_ORGANIZATION WHERE FULLPID like '%${orgPid}%')\n" +
+            "GROUP BY \n" +
+            "    o.ID,o.PID ,o.ORGTYPE , o.FULLNAME,o.SORT  ORDER BY o.SORT desc ")
+    List<OrganizationVo> getOrgUserCount(String id);
+
+    @Select("SELECT BELONGORGID AS orgId,COUNT(BELONGORGID) AS checkNumber,\n" +
+            "SUM(CASE WHEN TYPE =='处罚' AND PUNISHCONFIRMAMOUNT IS NOT NULL AND PUNISHCONFIRMAMOUNT != 0 THEN 1 ELSE 0 END) AS punishNumber,\n" +
+            "SUM(CASE WHEN TYPE =='处罚' THEN PUNISHCONFIRMAMOUNT ELSE 0 END) AS punishTotalAmount\n" +
+            "FROM ZHCX_PERSISTENT_MANAGE \n" +
+            "WHERE DELETED = '0' AND BELONGORGID IS NOT NULL AND YEAR(CHECKDATE) = #{year} AND MONTH(CHECKDATE) =#{month} " +
+            " GROUP BY BELONGORGID,YEAR(CHECKDATE), MONTH(CHECKDATE)")
+    List<PersistentVo> getReportData(String year, String month);
+
+    @Select("SELECT ORGID AS orgId,ORGNAME AS orgName,SORT AS sort,NUM AS userCount \n" +
+            " FROM ZHCX_DEPT_PEOPLE_COUNT WHERE YEAR = #{year} AND MONTH = #{month} AND ORGCODE =#{orgCode}")
+    List<OrganizationVo> getDeptUserCount(String year, String month, String orgCode);
 }

+ 16 - 0
business-common/src/main/java/com/rongwei/bscommon/sys/service/ZhcxDeptPeopleCountService.java

@@ -0,0 +1,16 @@
+package com.rongwei.bscommon.sys.service;
+
+import com.rongwei.bsentity.domain.ZhcxDeptPeopleCountDo;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ * 组织人员统计表 服务类
+ * </p>
+ *
+ * @author dlc
+ * @since 2024-12-31
+ */
+public interface ZhcxDeptPeopleCountService extends IService<ZhcxDeptPeopleCountDo> {
+
+}

+ 6 - 1
business-common/src/main/java/com/rongwei/bscommon/sys/service/ZhcxPersistentManageService.java

@@ -2,7 +2,7 @@ package com.rongwei.bscommon.sys.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.rongwei.bsentity.domain.ZhcxPersistentManageDo;
-import com.rongwei.rwcommon.base.R;
+import com.rongwei.bsentity.dto.ZhcxPersistentReportDto;
 
 import javax.servlet.http.HttpServletResponse;
 import java.util.List;
@@ -13,4 +13,9 @@ public interface ZhcxPersistentManageService extends IService<ZhcxPersistentMana
     void wordExport(Map<String, Object> map, HttpServletResponse response);
 
     void syncWzPlatform(List<String> ids);
+
+    List<ZhcxPersistentReportDto> reportData(Map<String, Object> map);
+
+    void saveDeptUserCount();
+
 }

+ 20 - 0
business-common/src/main/java/com/rongwei/bscommon/sys/service/impl/ZhcxDeptPeopleCountServiceImpl.java

@@ -0,0 +1,20 @@
+package com.rongwei.bscommon.sys.service.impl;
+
+import com.rongwei.bsentity.domain.ZhcxDeptPeopleCountDo;
+import com.rongwei.bscommon.sys.dao.ZhcxDeptPeopleCountDao;
+import com.rongwei.bscommon.sys.service.ZhcxDeptPeopleCountService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 组织人员统计表 服务实现类
+ * </p>
+ *
+ * @author dlc
+ * @since 2024-12-31
+ */
+@Service
+public class ZhcxDeptPeopleCountServiceImpl extends ServiceImpl<ZhcxDeptPeopleCountDao, ZhcxDeptPeopleCountDo> implements ZhcxDeptPeopleCountService {
+
+}

+ 150 - 2
business-common/src/main/java/com/rongwei/bscommon/sys/service/impl/ZhcxPersistentManageServiceImpl.java

@@ -5,19 +5,23 @@ import cn.hutool.core.io.FileUtil;
 import cn.hutool.core.util.ObjectUtil;
 import com.aspose.words.*;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.rongwei.bscommon.sys.dao.ZhcxPersistentManageDao;
+import com.rongwei.bscommon.sys.service.ZhcxDeptPeopleCountService;
 import com.rongwei.bscommon.sys.service.ZhcxPersistentManageService;
-import com.rongwei.bsentity.domain.ZhcxItpProjectNodesDo;
+import com.rongwei.bsentity.domain.ZhcxDeptPeopleCountDo;
 import com.rongwei.bsentity.domain.ZhcxPersistentManageDo;
 import com.rongwei.bsentity.dto.ZhcxPersistentManageDto;
+import com.rongwei.bsentity.dto.ZhcxPersistentReportDto;
 import com.rongwei.bsentity.vo.FormDataVO;
+import com.rongwei.bsentity.vo.OrganizationVo;
+import com.rongwei.bsentity.vo.PersistentVo;
 import com.rongwei.bsentity.vo.ZhcxPersistentWordVO;
 import com.rongwei.rwadmincommon.system.domain.SysOrganizationDo;
 import com.rongwei.rwadmincommon.system.service.SysOrganizationService;
 import com.rongwei.rwcommon.base.exception.CustomException;
+import com.rongwei.rwcommon.utils.SecurityUtil;
 import com.rongwei.rwcommon.utils.StringUtils;
 import com.rongwei.rwcommoncomponent.excel.aspose.ExcelExportUtil;
 import com.rongwei.rwcommoncomponent.excel.utils.WordHelpUtils;
@@ -36,6 +40,7 @@ import javax.servlet.http.HttpServletResponse;
 import java.io.BufferedInputStream;
 import java.lang.reflect.Field;
 import java.math.BigDecimal;
+import java.math.RoundingMode;
 import java.time.DayOfWeek;
 import java.time.LocalDate;
 import java.time.ZoneId;
@@ -59,10 +64,14 @@ public class ZhcxPersistentManageServiceImpl extends ServiceImpl<ZhcxPersistentM
     private SysFileItemService sysFileItemService;
     @Autowired
     private SysOrganizationService sysOrganizationService;
+    @Autowired
+    private ZhcxDeptPeopleCountService zhcxDeptPeopleCountService;
 
     @Value("${wz-provider.syncWzDataUrl}")
     private String syncWzDataUrl;
 
+    private static final String DEPT_CODE = "0900";
+
     @Override
     public void wordExport(Map<String, Object> map, HttpServletResponse response) {
         Object periodObj = map.get("period");
@@ -435,6 +444,145 @@ public class ZhcxPersistentManageServiceImpl extends ServiceImpl<ZhcxPersistentM
 
     }
 
+    @Override
+    public List<ZhcxPersistentReportDto> reportData(Map<String, Object> map) {
+        Object yearObj = map.get("year");
+        Object monthObj = map.get("month");
+        if(ObjectUtil.isEmpty(yearObj) || ObjectUtil.isEmpty(monthObj)){
+            throw new CustomException("缺少查询参数");
+        }
+        String year = (String) yearObj;
+        String month = (String) monthObj;
+        SysOrganizationDo organization = sysOrganizationService.getOne(
+                new LambdaQueryWrapper<SysOrganizationDo>().eq(SysOrganizationDo::getCode, DEPT_CODE));
+
+        // 构造传入日期
+        LocalDate passedDate = LocalDate.of(Integer.parseInt(year), Integer.parseInt(month), 1);
+        // 获取当前日期的年和月
+        LocalDate currentDate = LocalDate.now().withDayOfMonth(1);
+        List<ZhcxPersistentReportDto> reportList = new ArrayList<>();
+        //ZhcxPersistentReportDto dto;
+        List<PersistentVo> reportData = zhcxPersistentManageDao.getReportData(year, month);
+        Map<String, PersistentVo> reportDataMap = reportData.stream()
+                .collect(Collectors.toMap(PersistentVo::getOrgId, data -> data));
+        // 比较当前日期和传入日期
+        if (currentDate.isAfter(passedDate)) {
+            //当前日期大于传入日期
+            processDeptUserCount(year, month, reportDataMap, reportList);
+        } else if (currentDate.isEqual(passedDate)) {
+            processOrgUserCount(organization.getId(),month, reportDataMap, reportList);
+        }
+        reportList.sort(Comparator.comparing(ZhcxPersistentReportDto::getSort,Comparator.reverseOrder()));
+        return reportList;
+    }
+
+    @Override
+    public void saveDeptUserCount() {
+        SysOrganizationDo organization = sysOrganizationService.getOne(
+                new LambdaQueryWrapper<SysOrganizationDo>().eq(SysOrganizationDo::getCode, DEPT_CODE));
+        List<OrganizationVo> orgUserCount = zhcxPersistentManageDao.getOrgUserCount(organization.getId());
+        Map<String, OrganizationVo> parentNodeMap = new HashMap<>();
+        orgUserCount.sort(Comparator.comparing(OrganizationVo::getOrgType));
+        for (OrganizationVo node : orgUserCount) {
+            if ("10".equals(node.getOrgType())) {
+                parentNodeMap.put(node.getOrgId(), node);
+            } else {
+                OrganizationVo parent = parentNodeMap.get(node.getPid());
+                if (parent != null) {
+                    parent.setUserCount(parent.getUserCount() + node.getUserCount());
+                }
+            }
+        }
+        List<ZhcxDeptPeopleCountDo> list = new ArrayList<>();
+        parentNodeMap.forEach((key, value) -> {
+            ZhcxDeptPeopleCountDo deptPeopleCountDo = new ZhcxDeptPeopleCountDo();
+            deptPeopleCountDo.setId(SecurityUtil.getUUID());
+            deptPeopleCountDo.setOrgname(value.getOrgName());
+            deptPeopleCountDo.setOrgid(value.getOrgId());
+            deptPeopleCountDo.setNum(value.getUserCount());
+            deptPeopleCountDo.setYear(String.valueOf(LocalDate.now().getYear()));
+            deptPeopleCountDo.setMonth(String.valueOf(LocalDate.now().getMonthValue()));
+            deptPeopleCountDo.setSort(value.getSort());
+            deptPeopleCountDo.setOrgcode(DEPT_CODE);
+            list.add(deptPeopleCountDo);
+        });
+        LambdaQueryWrapper<ZhcxDeptPeopleCountDo> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(ZhcxDeptPeopleCountDo::getOrgcode, DEPT_CODE);
+        wrapper.eq(ZhcxDeptPeopleCountDo::getYear, String.valueOf(LocalDate.now().getYear()));
+        wrapper.eq(ZhcxDeptPeopleCountDo::getMonth, String.valueOf(LocalDate.now().getMonthValue()));
+        zhcxDeptPeopleCountService.remove(wrapper);
+        zhcxDeptPeopleCountService.saveOrUpdateBatch(list);
+    }
+
+    // 处理部门用户统计数据
+    private void processDeptUserCount(String year, String month, Map<String, PersistentVo> reportDataMap, List<ZhcxPersistentReportDto> reportList) {
+        List<OrganizationVo> deptUserCount = zhcxPersistentManageDao.getDeptUserCount(year, month, DEPT_CODE);
+        for (int i = 0; i < deptUserCount.size(); i++) {
+            OrganizationVo org = deptUserCount.get(i);
+            PersistentVo report = reportDataMap.get(org.getOrgId());
+            ZhcxPersistentReportDto dto = buildReportDto(i + 1, month, org, report);
+            reportList.add(dto);
+        }
+        if(deptUserCount.size() == 0){
+            SysOrganizationDo organization = sysOrganizationService.getOne(
+                    new LambdaQueryWrapper<SysOrganizationDo>().eq(SysOrganizationDo::getCode, DEPT_CODE));
+
+            processOrgUserCount(organization.getId(),month, reportDataMap, reportList);
+        }
+    }
+    // 处理组织用户统计数据
+    private void processOrgUserCount(String orgId,String month, Map<String, PersistentVo> reportDataMap, List<ZhcxPersistentReportDto> reportList) {
+        List<OrganizationVo> orgUserCount = zhcxPersistentManageDao.getOrgUserCount(orgId);
+        Map<String, OrganizationVo> parentNodeMap = new HashMap<>();
+
+        orgUserCount.sort(Comparator.comparing(OrganizationVo::getOrgType)); // 按类型排序,父节点优先
+        for (OrganizationVo node : orgUserCount) {
+            if ("10".equals(node.getOrgType())) {
+                parentNodeMap.put(node.getOrgId(), node);
+            } else {
+                OrganizationVo parent = parentNodeMap.get(node.getPid());
+                if (parent != null) {
+                    parent.setUserCount(parent.getUserCount() + node.getUserCount());
+                }
+            }
+        }
+
+        List<OrganizationVo> filteredNodes = new ArrayList<>(parentNodeMap.values());
+        for (int i = 0; i < filteredNodes.size(); i++) {
+            OrganizationVo org = filteredNodes.get(i);
+            PersistentVo report = reportDataMap.get(org.getOrgId());
+            ZhcxPersistentReportDto dto = buildReportDto(i + 1, month, org, report);
+            reportList.add(dto);
+        }
+    }
+    // 构造 DTO
+    private ZhcxPersistentReportDto buildReportDto(int no, String month, OrganizationVo org, PersistentVo report) {
+        ZhcxPersistentReportDto dto = new ZhcxPersistentReportDto();
+        dto.setNo(no);
+        dto.setMonth(month);
+        dto.setSecondOrgName(org.getOrgName());
+        dto.setSecondOrgId(org.getOrgId());
+        dto.setNumber(org.getUserCount());
+        dto.setSort(org.getSort());
+        if (report != null) {
+            dto.setCheckNumber(report.getCheckNumber());
+            dto.setPunishNumber(report.getPunishNumber());
+            dto.setPunishTotalAmount(report.getPunishTotalAmount());
+            dto.setCheckNumberPer(calculateRatio(report.getCheckNumber(), org.getUserCount()));
+            dto.setPunishNumberPer(calculateRatio(report.getPunishNumber(), org.getUserCount()));
+            dto.setPunishTotalAmountPer(calculateRatio(report.getPunishTotalAmount(), org.getUserCount()));
+        }
+        return dto;
+    }
+    private double calculateRatio(Number numerator, int denominator) {
+        if (denominator == 0) {
+            return 0.0;
+        }
+        return BigDecimal.valueOf(numerator.doubleValue() / denominator)
+                .setScale(1, RoundingMode.HALF_UP)
+                .doubleValue();
+    }
+
     private void initWeekWord(Document[] doc, List<ZhcxPersistentManageDo> rewardListData, String tempId) {
         if(rewardListData.size()>0){
             Map<String, List<ZhcxPersistentManageDo>> collect = rewardListData.stream()

+ 76 - 0
business-entity/src/main/java/com/rongwei/bsentity/domain/ZhcxDeptPeopleCountDo.java

@@ -0,0 +1,76 @@
+package com.rongwei.bsentity.domain;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.rongwei.rwcommon.base.BaseDo;
+import java.util.Date;
+import com.baomidou.mybatisplus.annotation.TableField;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * <p>
+ * 组织人员统计表
+ * </p>
+ *
+ * @author dlc
+ * @since 2024-12-31
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@Accessors(chain = true)
+@TableName("ZHCX_DEPT_PEOPLE_COUNT")
+public class ZhcxDeptPeopleCountDo extends BaseDo {
+
+    private static final long serialVersionUID=1L;
+
+    /**
+     * 主键
+     */
+    @TableField("ID")
+    private String id;
+    /**
+     * 租户id
+     */
+    @TableField("TENANTID")
+    private String tenantid;
+    /**
+     * 扩展json格式配置
+     */
+    @TableField("ROPTION")
+    private String roption;
+    /**
+     * 部门id
+     */
+    @TableField("ORGID")
+    private String orgid;
+    /**
+     * 部门
+     */
+    @TableField("ORGNAME")
+    private String orgname;
+    /**
+     * 年份
+     */
+    @TableField("YEAR")
+    private String year;
+    /**
+     * 月份
+     */
+    @TableField("MONTH")
+    private String month;
+    /**
+     * 人数
+     */
+    @TableField("NUM")
+    private Integer num;
+    /**
+     * 部门CODE
+     */
+    @TableField("ORGCODE")
+    private String orgcode;
+    @TableField("SORT")
+    private Integer sort;
+
+
+}

+ 59 - 0
business-entity/src/main/java/com/rongwei/bsentity/dto/ZhcxPersistentReportDto.java

@@ -0,0 +1,59 @@
+package com.rongwei.bsentity.dto;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import lombok.*;
+
+@Setter
+@Getter
+@NoArgsConstructor
+@AllArgsConstructor
+@Builder
+public class ZhcxPersistentReportDto {
+
+    /**
+     * 序号
+     */
+    private Integer no;
+    /**
+     * 月份
+     */
+    private String month;
+    /**
+     *  二级部门
+     */
+    private String secondOrgName;
+    /**
+     *  二级部门id
+     */
+    private String secondOrgId;
+    /**
+     *  人数
+     */
+    private Integer number;
+    /**
+     * 检查条数
+     */
+    private Integer checkNumber;
+    /**
+     * 检查人均条数
+     */
+    private Double checkNumberPer;
+    /**
+     * 处罚条数
+     */
+    private Integer punishNumber;
+    /**
+     * 处罚人均条数
+     */
+    private Double punishNumberPer;
+    /**
+     * 处罚总金额
+     */
+    private Double punishTotalAmount;
+    /**
+     * 处罚人均金额
+     */
+    private Double punishTotalAmountPer;
+    @JsonIgnore
+    private Integer sort;
+}

+ 23 - 0
business-entity/src/main/java/com/rongwei/bsentity/vo/OrganizationVo.java

@@ -0,0 +1,23 @@
+package com.rongwei.bsentity.vo;
+
+import lombok.*;
+
+@Setter
+@Getter
+@NoArgsConstructor
+@AllArgsConstructor
+@Builder
+public class OrganizationVo {
+
+    private String orgId;
+
+    private String orgName;
+
+    private String pid;
+
+    private String orgType;
+
+    private Integer userCount;
+
+    private Integer sort;
+}

+ 19 - 0
business-entity/src/main/java/com/rongwei/bsentity/vo/PersistentVo.java

@@ -0,0 +1,19 @@
+package com.rongwei.bsentity.vo;
+
+import lombok.*;
+
+@Setter
+@Getter
+@NoArgsConstructor
+@AllArgsConstructor
+@Builder
+public class PersistentVo {
+
+    private String orgId;
+
+    private Integer checkNumber;
+
+    private Integer punishNumber;
+
+    private Double punishTotalAmount;
+}

+ 19 - 0
business-server/src/main/java/com/rongwei/bsserver/controller/ZhcxPersistentController.java

@@ -3,6 +3,7 @@ package com.rongwei.bsserver.controller;
 import com.rongwei.bscommon.sys.service.ZhcxPersistentManageService;
 import com.rongwei.bscommon.sys.service.ZhcxPersistentService;
 import com.rongwei.bsentity.dto.OutsideInspactionSyncReqquest;
+import com.rongwei.bsentity.dto.ZhcxPersistentReportDto;
 import com.rongwei.rwcommon.base.R;
 import com.rongwei.rwcommon.base.exception.CustomException;
 import io.swagger.annotations.Api;
@@ -53,4 +54,22 @@ public class ZhcxPersistentController {
         return R.ok();
     }
 
+    /**
+     * 顽症报表
+     * @param
+     * @return
+     */
+    @PostMapping("/reportData")
+    public R reportData(@RequestBody Map<String,Object> map){
+        List<ZhcxPersistentReportDto> zhcxPersistentReportDtos = zhcxPersistentManageService.reportData(map);
+        return R.ok(zhcxPersistentReportDtos);
+    }
+
+    /**
+     * 定时任务 -获取质量管控部的检验室人数
+     */
+    @PostMapping("/saveDeptUserCount")
+    public void saveDeptUserCount(){
+        zhcxPersistentManageService.saveDeptUserCount();
+    }
 }