xuhy
2025-10-14 453ee097563df5788f96e102b38249f0ca70d82a
诊所和供应商首页统计
21个文件已修改
6个文件已添加
957 ■■■■■ 已修改文件
ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/DataStatisticsController.java 295 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TSysAppUserController.java 36 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TSysChronicDiseaseController.java 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TSysEducationalInfoController.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TSysInspectionController.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TSysLiveController.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TSysProductIntroductionController.java 74 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/task/TaskUtil.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/constant/Constants.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/mapper/TErpProcurementMapper.java 53 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/mapper/TSysOrderMapper.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/model/TSysInspection.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/model/TSysOrderGoods.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/query/DataStatisticsQuery.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/service/TErpProcurementService.java 53 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/service/TSysOrderService.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TErpProcurementServiceImpl.java 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TSysOrderServiceImpl.java 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/vo/ClinicSalesStatisticsGoodsCountVO.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/vo/ClinicSalesStatisticsGoodsTypeVO.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/vo/ClinicSalesStatisticsVO.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/vo/SupplierSalesStatisticsGoodsCountVO.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/vo/SupplierSalesStatisticsGoodsTypeVO.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/vo/SupplierSalesStatisticsVO.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/resources/mapper/system/TErpProcurementMapper.xml 72 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/resources/mapper/system/TSysOrderGoodsMapper.xml 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/resources/mapper/system/TSysOrderMapper.xml 67 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/DataStatisticsController.java
@@ -7,8 +7,7 @@
import com.ruoyi.system.model.*;
import com.ruoyi.system.query.DataStatisticsQuery;
import com.ruoyi.system.service.*;
import com.ruoyi.system.vo.SupplierThirtyMoneyProcurementStatisticsVO;
import com.ruoyi.system.vo.SupplierThirtyProcurementStatisticsVO;
import com.ruoyi.system.vo.*;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
@@ -38,9 +37,10 @@
    private final TCrmClinicService crmClinicService;
    private final TSysAppUserService sysAppUserService;
    private final TCrmClinicPointsService crmClinicPointsService;
    private final TSysOrderService sysOrderService;
    @Autowired
    public DataStatisticsController(TErpProcurementService erpProcurementService, TokenService tokenService, ISysUserService sysUserService, TCrmSupplierService crmSupplierService, TCrmClinicService crmClinicService, TSysAppUserService sysAppUserService, TCrmClinicPointsService crmClinicPointsService) {
    public DataStatisticsController(TErpProcurementService erpProcurementService, TokenService tokenService, ISysUserService sysUserService, TCrmSupplierService crmSupplierService, TCrmClinicService crmClinicService, TSysAppUserService sysAppUserService, TCrmClinicPointsService crmClinicPointsService, TSysOrderService sysOrderService) {
        this.erpProcurementService = erpProcurementService;
        this.tokenService = tokenService;
        this.sysUserService = sysUserService;
@@ -48,6 +48,7 @@
        this.crmClinicService = crmClinicService;
        this.sysAppUserService = sysAppUserService;
        this.crmClinicPointsService = crmClinicPointsService;
        this.sysOrderService = sysOrderService;
    }
    /**
@@ -75,7 +76,7 @@
                endTime = LocalDate.now() + " 23:59:59";
                break;
            case 4:
                startTime = LocalDate.now().minusMonths(6) + " 00:00:00";
                startTime = LocalDate.now().minusMonths(5) + " 00:00:00";
                endTime = LocalDate.now() + " 23:59:59";
                break;
            case 5:
@@ -216,8 +217,292 @@
        return R.ok(map);
    }
    /**
     * 供应商销售统计总类总数
     */
    @ApiOperation(value = "供应商销售统计总类总数",notes = "typeTotalCount:总类,totalCount:总数")
    @PostMapping(value = "/supplierSalesStatisticsSum")
    public R<Map<String,Integer>> supplierSalesStatisticsSum() {
        Long userId = tokenService.getLoginUser().getUserId();
        TCrmSupplier crmSupplier = crmSupplierService.getOne(Wrappers.lambdaQuery(TCrmSupplier.class)
                .eq(TCrmSupplier::getUserId, userId));
        // 查询药品总类和总数
        Integer typeTotalCount = erpProcurementService.supplierSalesStatisticsTypeCount(crmSupplier.getId());
        Integer totalCount = erpProcurementService.supplierSalesStatisticsCount(crmSupplier.getId());
        Map<String,Integer> map = new HashMap<>();
        map.put("typeTotalCount", typeTotalCount);
        map.put("totalCount", totalCount);
        return R.ok(map);
    }
    /**
     * 供应商销售统计
     */
    @ApiOperation(value = "供应商销售统计")
    @PostMapping(value = "/supplierSalesStatistics")
    public R<SupplierSalesStatisticsVO> supplierSalesStatistics(@Validated @RequestBody DataStatisticsQuery query) {
        Long userId = tokenService.getLoginUser().getUserId();
        String startTime = null;
        String endTime = null;
        switch (query.getTimeType()){
            case 1:
                startTime = LocalDate.now() + " 00:00:00";
                endTime = LocalDate.now() + " 23:59:59";
                break;
            case 2:
                startTime = LocalDate.now().minusDays(1) + " 00:00:00";
                endTime = LocalDate.now().minusDays(1) + " 23:59:59";
                break;
            case 3:
                startTime = LocalDate.now().minusDays(6) + " 00:00:00";
                endTime = LocalDate.now() + " 23:59:59";
                break;
            case 4:
                startTime = LocalDate.now().minusMonths(5).withDayOfMonth(1) + " 00:00:00";
                endTime = LocalDate.now() + " 23:59:59";
                break;
            case 5:
                startTime = LocalDate.now().minusYears(1).withDayOfMonth(1) + " 00:00:00";
                endTime = LocalDate.now() + " 23:59:59";
                break;
        }
        TCrmSupplier crmSupplier = crmSupplierService.getOne(Wrappers.lambdaQuery(TCrmSupplier.class)
                .eq(TCrmSupplier::getUserId, userId));
        SupplierSalesStatisticsVO supplierSalesStatisticsVO = new SupplierSalesStatisticsVO();
        // 销售金额
        BigDecimal totalMoney = erpProcurementService.supplierSalesStatisticsMoney(crmSupplier.getId(), startTime, endTime);
        supplierSalesStatisticsVO.setSalesMoney(totalMoney);
        // 查询销售前十占比
        List<SupplierSalesStatisticsGoodsTypeVO> supplierSalesStatisticsGoodsTypeVOS = erpProcurementService.supplierSalesStatisticsGoodsType(crmSupplier.getId(), startTime, endTime);
        supplierSalesStatisticsVO.setSupplierSalesStatisticsGoodsTypeVOS(supplierSalesStatisticsGoodsTypeVOS);
        // 查询30天销售统计
        List<SupplierSalesStatisticsGoodsCountVO> supplierSalesStatisticsGoodsCountVOS;
        if(query.getTimeType() == 1 || query.getTimeType() == 2 || query.getTimeType() == 3){
            supplierSalesStatisticsGoodsCountVOS = erpProcurementService.supplierSalesStatisticsGoodsCount(crmSupplier.getId(), startTime, endTime,query.getGoodsName());
        }else {
            supplierSalesStatisticsGoodsCountVOS = erpProcurementService.supplierSalesStatisticsGoodsCountMonth(crmSupplier.getId(), startTime, endTime,query.getGoodsName());
        }
        SimpleDateFormat format = new SimpleDateFormat("MM.dd");
        SimpleDateFormat formatMonth = new SimpleDateFormat("yyyy.MM");
        switch (query.getTimeType()){
            case 1:
                if(CollectionUtils.isEmpty(supplierSalesStatisticsGoodsCountVOS)){
                    SupplierSalesStatisticsGoodsCountVO supplierSalesStatisticsGoodsCountVO = new SupplierSalesStatisticsGoodsCountVO();
                    String time = format.format(DateUtils.localDateTimeToDate(LocalDateTime.now()));
                    supplierSalesStatisticsGoodsCountVO.setTime(time);
                    supplierSalesStatisticsGoodsCountVO.setGoodsCount(0);
                    supplierSalesStatisticsGoodsCountVOS.add(supplierSalesStatisticsGoodsCountVO);
                }
                break;
            case 2:
                if(CollectionUtils.isEmpty(supplierSalesStatisticsGoodsCountVOS)){
                    SupplierSalesStatisticsGoodsCountVO supplierSalesStatisticsGoodsCountVO = new SupplierSalesStatisticsGoodsCountVO();
                    String time = format.format(DateUtils.localDateTimeToDate(LocalDateTime.now().minusDays(1)));
                    supplierSalesStatisticsGoodsCountVO.setTime(time);
                    supplierSalesStatisticsGoodsCountVO.setGoodsCount(0);
                    supplierSalesStatisticsGoodsCountVOS.add(supplierSalesStatisticsGoodsCountVO);
                }
                break;
            case 3:
                LocalDateTime days = LocalDateTime.now().minusDays(6);
                for (int i = 0; i < 7; i++) {
                    LocalDateTime timeNow = days.plusDays(i);
                    List<SupplierSalesStatisticsGoodsCountVO> vos = supplierSalesStatisticsGoodsCountVOS.stream().filter(vo -> timeNow.toLocalDate().isEqual(vo.getPayTime())).collect(Collectors.toList());
                    if(CollectionUtils.isEmpty(vos)){
                        SupplierSalesStatisticsGoodsCountVO vo = new SupplierSalesStatisticsGoodsCountVO();
                        String time = format.format(DateUtils.localDateTimeToDate(timeNow));
                        vo.setTime(time);
                        vo.setGoodsCount(0);
                        supplierSalesStatisticsGoodsCountVOS.add(vo);
                    }
                }
                supplierSalesStatisticsGoodsCountVOS.sort(Comparator.comparing(SupplierSalesStatisticsGoodsCountVO::getTime));
                break;
            case 4:
                LocalDateTime month = LocalDateTime.now().minusMonths(5);
                for (int i = 0; i < 6; i++) {
                    LocalDateTime timeNow = month.plusMonths(i);
                    Date date = DateUtils.localDateTimeToDate(timeNow);
                    String time = formatMonth.format(date);
                    List<SupplierSalesStatisticsGoodsCountVO> vos = supplierSalesStatisticsGoodsCountVOS.stream().filter(vo -> time.equals(vo.getTime())).collect(Collectors.toList());
                    if(CollectionUtils.isEmpty(vos)){
                        SupplierSalesStatisticsGoodsCountVO vo = new SupplierSalesStatisticsGoodsCountVO();
                        vo.setTime(time);
                        vo.setGoodsCount(0);
                        supplierSalesStatisticsGoodsCountVOS.add(vo);
                    }
                }
                supplierSalesStatisticsGoodsCountVOS.sort(Comparator.comparing(SupplierSalesStatisticsGoodsCountVO::getTime));
                break;
            case 5:
                LocalDateTime years = LocalDateTime.now().minusYears(1);
                for (int i = 0; i < 12; i++) {
                    LocalDateTime timeNow = years.plusMonths(i);
                    Date date = DateUtils.localDateTimeToDate(timeNow);
                    String time = formatMonth.format(date);
                    List<SupplierSalesStatisticsGoodsCountVO> vos = supplierSalesStatisticsGoodsCountVOS.stream().filter(vo -> time.equals(vo.getTime())).collect(Collectors.toList());
                    if(CollectionUtils.isEmpty(vos)){
                        SupplierSalesStatisticsGoodsCountVO vo = new SupplierSalesStatisticsGoodsCountVO();
                        vo.setTime(time);
                        vo.setGoodsCount(0);
                        supplierSalesStatisticsGoodsCountVOS.add(vo);
                    }
                }
                supplierSalesStatisticsGoodsCountVOS.sort(Comparator.comparing(SupplierSalesStatisticsGoodsCountVO::getTime));
                break;
        }
        supplierSalesStatisticsVO.setSupplierSalesStatisticsGoodsCountVOS(supplierSalesStatisticsGoodsCountVOS);
        return R.ok(supplierSalesStatisticsVO);
    }
    /**
     * 诊所销售统计总类总数
     */
    @ApiOperation(value = "诊所销售统计总类总数",notes = "typeTotalCount:总类,totalCount:总数")
    @PostMapping(value = "/clinicSalesStatisticsSum")
    public R<Map<String,Integer>> clinicSalesStatisticsSum() {
        Long userId = tokenService.getLoginUser().getUserId();
        TCrmClinic crmClinic = crmClinicService.getOne(Wrappers.lambdaQuery(TCrmClinic.class)
                .eq(TCrmClinic::getUserId, userId));
        // 查询药品总类和总数
        Integer typeTotalCount = sysOrderService.clinicSalesStatisticsTypeCount(crmClinic.getId());
        Integer totalCount = sysOrderService.clinicSalesStatisticsCount(crmClinic.getId());
        Map<String,Integer> map = new HashMap<>();
        map.put("typeTotalCount", typeTotalCount);
        map.put("totalCount", totalCount);
        return R.ok(map);
    }
    /**
     * 诊所销售统计
     */
    @ApiOperation(value = "诊所销售统计")
    @PostMapping(value = "/clinicSalesStatistics")
    public R<ClinicSalesStatisticsVO> clinicSalesStatistics(@Validated @RequestBody DataStatisticsQuery query) {
        Long userId = tokenService.getLoginUser().getUserId();
        String startTime = null;
        String endTime = null;
        switch (query.getTimeType()){
            case 1:
                startTime = LocalDate.now() + " 00:00:00";
                endTime = LocalDate.now() + " 23:59:59";
                break;
            case 2:
                startTime = LocalDate.now().minusDays(1) + " 00:00:00";
                endTime = LocalDate.now().minusDays(1) + " 23:59:59";
                break;
            case 3:
                startTime = LocalDate.now().minusDays(6) + " 00:00:00";
                endTime = LocalDate.now() + " 23:59:59";
                break;
            case 4:
                startTime = LocalDate.now().minusMonths(5).withDayOfMonth(1) + " 00:00:00";
                endTime = LocalDate.now() + " 23:59:59";
                break;
            case 5:
                startTime = LocalDate.now().minusYears(1).withDayOfMonth(1) + " 00:00:00";
                endTime = LocalDate.now() + " 23:59:59";
                break;
        }
        TCrmClinic crmClinic = crmClinicService.getOne(Wrappers.lambdaQuery(TCrmClinic.class)
                .eq(TCrmClinic::getUserId, userId));
        ClinicSalesStatisticsVO clinicSalesStatisticsVO = new ClinicSalesStatisticsVO();
        // 销售金额
        BigDecimal totalMoney = sysOrderService.clinicSalesStatisticsMoney(crmClinic.getId(), startTime, endTime);
        clinicSalesStatisticsVO.setSalesMoney(totalMoney);
        // 查询销售前十占比
        List<ClinicSalesStatisticsGoodsTypeVO> clinicSalesStatisticsGoodsTypeVOS = sysOrderService.supplierSalesStatisticsGoodsType(crmClinic.getId(), startTime, endTime);
        clinicSalesStatisticsVO.setClinicSalesStatisticsGoodsTypeVOS(clinicSalesStatisticsGoodsTypeVOS);
        // 查询30天销售统计
        List<ClinicSalesStatisticsGoodsCountVO> clinicSalesStatisticsGoodsCountVOS;
        if(query.getTimeType() == 1 || query.getTimeType() == 2 || query.getTimeType() == 3){
            clinicSalesStatisticsGoodsCountVOS = sysOrderService.supplierSalesStatisticsGoodsCount(crmClinic.getId(), startTime, endTime,query.getGoodsName());
        }else {
            clinicSalesStatisticsGoodsCountVOS = sysOrderService.supplierSalesStatisticsGoodsCountMonth(crmClinic.getId(), startTime, endTime,query.getGoodsName());
        }
        SimpleDateFormat format = new SimpleDateFormat("MM.dd");
        SimpleDateFormat formatMonth = new SimpleDateFormat("yyyy.MM");
        switch (query.getTimeType()){
            case 1:
                if(CollectionUtils.isEmpty(clinicSalesStatisticsGoodsCountVOS)){
                    ClinicSalesStatisticsGoodsCountVO clinicSalesStatisticsGoodsCountVO = new ClinicSalesStatisticsGoodsCountVO();
                    String time = format.format(DateUtils.localDateTimeToDate(LocalDateTime.now()));
                    clinicSalesStatisticsGoodsCountVO.setTime(time);
                    clinicSalesStatisticsGoodsCountVO.setGoodsCount(0);
                    clinicSalesStatisticsGoodsCountVOS.add(clinicSalesStatisticsGoodsCountVO);
                }
                break;
            case 2:
                if(CollectionUtils.isEmpty(clinicSalesStatisticsGoodsCountVOS)){
                    ClinicSalesStatisticsGoodsCountVO clinicSalesStatisticsGoodsCountVO = new ClinicSalesStatisticsGoodsCountVO();
                    String time = format.format(DateUtils.localDateTimeToDate(LocalDateTime.now().minusDays(1)));
                    clinicSalesStatisticsGoodsCountVO.setTime(time);
                    clinicSalesStatisticsGoodsCountVO.setGoodsCount(0);
                    clinicSalesStatisticsGoodsCountVOS.add(clinicSalesStatisticsGoodsCountVO);
                }
                break;
            case 3:
                LocalDateTime days = LocalDateTime.now().minusDays(6);
                for (int i = 0; i < 7; i++) {
                    LocalDateTime timeNow = days.plusDays(i);
                    List<ClinicSalesStatisticsGoodsCountVO> vos = clinicSalesStatisticsGoodsCountVOS.stream().filter(vo -> timeNow.toLocalDate().isEqual(vo.getPayTime())).collect(Collectors.toList());
                    if(CollectionUtils.isEmpty(vos)){
                        ClinicSalesStatisticsGoodsCountVO vo = new ClinicSalesStatisticsGoodsCountVO();
                        String time = format.format(DateUtils.localDateTimeToDate(timeNow));
                        vo.setTime(time);
                        vo.setGoodsCount(0);
                        clinicSalesStatisticsGoodsCountVOS.add(vo);
                    }
                }
                clinicSalesStatisticsGoodsCountVOS.sort(Comparator.comparing(ClinicSalesStatisticsGoodsCountVO::getTime));
                break;
            case 4:
                LocalDateTime month = LocalDateTime.now().minusMonths(5);
                for (int i = 0; i < 6; i++) {
                    LocalDateTime timeNow = month.plusMonths(i);
                    Date date = DateUtils.localDateTimeToDate(timeNow);
                    String time = formatMonth.format(date);
                    List<ClinicSalesStatisticsGoodsCountVO> vos = clinicSalesStatisticsGoodsCountVOS.stream().filter(vo -> time.equals(vo.getTime())).collect(Collectors.toList());
                    if(CollectionUtils.isEmpty(vos)){
                        ClinicSalesStatisticsGoodsCountVO vo = new ClinicSalesStatisticsGoodsCountVO();
                        vo.setTime(time);
                        vo.setGoodsCount(0);
                        clinicSalesStatisticsGoodsCountVOS.add(vo);
                    }
                }
                clinicSalesStatisticsGoodsCountVOS.sort(Comparator.comparing(ClinicSalesStatisticsGoodsCountVO::getTime));
                break;
            case 5:
                LocalDateTime years = LocalDateTime.now().minusYears(1);
                for (int i = 0; i < 12; i++) {
                    LocalDateTime timeNow = years.plusMonths(i);
                    Date date = DateUtils.localDateTimeToDate(timeNow);
                    String time = formatMonth.format(date);
                    List<ClinicSalesStatisticsGoodsCountVO> vos = clinicSalesStatisticsGoodsCountVOS.stream().filter(vo -> time.equals(vo.getTime())).collect(Collectors.toList());
                    if(CollectionUtils.isEmpty(vos)){
                        ClinicSalesStatisticsGoodsCountVO vo = new ClinicSalesStatisticsGoodsCountVO();
                        vo.setTime(time);
                        vo.setGoodsCount(0);
                        clinicSalesStatisticsGoodsCountVOS.add(vo);
                    }
                }
                clinicSalesStatisticsGoodsCountVOS.sort(Comparator.comparing(ClinicSalesStatisticsGoodsCountVO::getTime));
                break;
        }
        clinicSalesStatisticsVO.setClinicSalesStatisticsGoodsCountVOS(clinicSalesStatisticsGoodsCountVOS);
        return R.ok(clinicSalesStatisticsVO);
    }
    public static void main(String[] args) {
        System.out.println(LocalDate.now().minusDays(30));
        System.out.println(LocalDate.now().minusMonths(6));
    }
}
ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TSysAppUserController.java
@@ -11,14 +11,12 @@
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.WebUtils;
import com.ruoyi.framework.web.service.TokenService;
import com.ruoyi.system.export.TCrmClinicAuditExport;
import com.ruoyi.system.export.TSysAppUserClinicExport;
import com.ruoyi.system.export.TSysAppUserExport;
import com.ruoyi.system.export.TSysAppUserListExport;
import com.ruoyi.system.model.TSysAppUser;
import com.ruoyi.system.model.TSysChronicDisease;
import com.ruoyi.system.model.TSysInspection;
import com.ruoyi.system.model.TSysMessageTemplate;
import com.ruoyi.system.model.*;
import com.ruoyi.system.query.TCrmClinicQuery;
import com.ruoyi.system.query.TSysAppUserQuery;
import com.ruoyi.system.service.*;
@@ -30,6 +28,7 @@
import org.apache.poi.ss.usermodel.Workbook;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.CollectionUtils;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
@@ -42,6 +41,7 @@
import java.time.LocalDateTime;
import java.time.temporal.ChronoUnit;
import java.util.*;
import java.util.stream.Collectors;
/**
 * <p>
@@ -62,14 +62,18 @@
    private final TSysChronicDiseaseService sysChronicDiseaseService;
    private final MsgUtils msgUtils;
    private final TSysMessageTemplateService sysMessageTemplateService;
    private final TCrmClinicService crmClinicService;
    private final TokenService tokenService;
    @Autowired
    public TSysAppUserController(TSysAppUserService sysAppUserService, TSysInspectionService sysInspectionService, TSysOrderService sysOrderService, TSysChronicDiseaseService sysChronicDiseaseService, MsgUtils msgUtils, TSysMessageTemplateService sysMessageTemplateService) {
    public TSysAppUserController(TSysAppUserService sysAppUserService, TSysInspectionService sysInspectionService, TSysOrderService sysOrderService, TSysChronicDiseaseService sysChronicDiseaseService, MsgUtils msgUtils, TSysMessageTemplateService sysMessageTemplateService, TCrmClinicService crmClinicService, TokenService tokenService) {
        this.sysAppUserService = sysAppUserService;
        this.sysInspectionService = sysInspectionService;
        this.sysOrderService = sysOrderService;
        this.sysChronicDiseaseService = sysChronicDiseaseService;
        this.msgUtils = msgUtils;
        this.sysMessageTemplateService = sysMessageTemplateService;
        this.crmClinicService = crmClinicService;
        this.tokenService = tokenService;
    }
    /**
@@ -135,6 +139,10 @@
        if (sysAppUserService.isExit(dto)) {
            return R.fail("用户管理信息已存在");
        }
        Long userId = tokenService.getLoginUser().getUserId();
        TCrmClinic crmClinic = crmClinicService.getOne(Wrappers.lambdaQuery(TCrmClinic.class)
                .eq(TCrmClinic::getUserId, userId));
        dto.setClinicId(crmClinic.getId());
        return R.ok(sysAppUserService.save(dto));
    }
@@ -169,6 +177,24 @@
        }
        // 查询检测信息
        List<TSysInspection> sysInspections = sysInspectionService.list(Wrappers.lambdaQuery(TSysInspection.class).eq(TSysInspection::getAppUserId, id));
        if(!CollectionUtils.isEmpty(sysInspections)){
            List<String> clinicIds = sysInspections.stream().map(TSysInspection::getClinicId).collect(Collectors.toList());
            List<TCrmClinic> clinicList = crmClinicService.list(Wrappers.lambdaQuery(TCrmClinic.class).in(TCrmClinic::getId, clinicIds));
            List<TSysOrder> sysOrderList = sysOrderService.list(Wrappers.lambdaQuery(TSysOrder.class).in(TSysOrder::getClinicId, clinicIds));
            for (TSysInspection sysInspection : sysInspections) {
                TCrmClinic clinic = clinicList.stream().filter(c -> c.getId().equals(sysInspection.getClinicId())).findFirst().orElse(null);
                if(clinic != null){
                    sysInspection.setClinicName(clinic.getClinicName());
                }
                List<TSysOrder> sysOrders = sysOrderList.stream().filter(c -> sysInspection.getId().equals(c.getInspectionId())).collect(Collectors.toList());
                if(CollectionUtils.isEmpty(sysOrders)){
                    sysInspection.setIsPrescribeMedicine(0);
                }else {
                    sysInspection.setIsPrescribeMedicine(1);
                    sysInspection.setOrderId(sysOrders.get(0).getId());
                }
            }
        }
        sysAppUserVO.setSysInspections(sysInspections);
        // 订单信息
        List<TSysOrderVO> sysOrders = sysOrderService.queryListByAppUserId(id);
ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TSysChronicDiseaseController.java
@@ -6,8 +6,11 @@
import com.ruoyi.common.basic.PageInfo;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.system.model.TSysAppUser;
import com.ruoyi.system.model.TSysChronicDisease;
import com.ruoyi.system.query.TSysChronicDiseaseQuery;
import com.ruoyi.system.service.TSysAppUserService;
import com.ruoyi.system.service.TSysChronicDiseaseService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
@@ -15,6 +18,7 @@
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import java.util.Arrays;
import java.util.List;
/**
@@ -31,9 +35,11 @@
public class TSysChronicDiseaseController {
    private final TSysChronicDiseaseService sysChronicDiseaseService;
    private final TSysAppUserService sysAppUserService;
    @Autowired
    public TSysChronicDiseaseController(TSysChronicDiseaseService sysChronicDiseaseService) {
    public TSysChronicDiseaseController(TSysChronicDiseaseService sysChronicDiseaseService, TSysAppUserService sysAppUserService) {
        this.sysChronicDiseaseService = sysChronicDiseaseService;
        this.sysAppUserService = sysAppUserService;
    }
    /**
@@ -53,6 +59,29 @@
    public R<List<TSysChronicDisease>> list() {
        return R.ok(sysChronicDiseaseService.list(Wrappers.lambdaQuery(TSysChronicDisease.class).orderByDesc(TSysChronicDisease::getCreateTime)));
    }
    /**
     * 获取慢性病管理管理列表
     */
    @ApiOperation(value = "通过用户id获取慢性病管理列表")
    @GetMapping(value = "/listByAppUserId")
    public R<List<TSysChronicDisease>> listByAppUserId(@RequestParam String appUserId) {
        TSysAppUser sysAppUser = sysAppUserService.getById(appUserId);
        if (sysAppUser == null) {
            return R.fail("用户不存在");
        }
        String chronicDiseaseId = sysAppUser.getChronicDiseaseId();
        if(StringUtils.isNotBlank(chronicDiseaseId)){
            String[] split = chronicDiseaseId.split(",");
            List<TSysChronicDisease> sysChronicDiseases = sysChronicDiseaseService.list(Wrappers.lambdaQuery(TSysChronicDisease.class)
                    .notIn(TSysChronicDisease::getId, Arrays.asList(split))
                    .orderByDesc(TSysChronicDisease::getCreateTime));
            return R.ok(sysChronicDiseases);
        }else {
            return R.ok(sysChronicDiseaseService.list(Wrappers.lambdaQuery(TSysChronicDisease.class).orderByDesc(TSysChronicDisease::getCreateTime)));
        }
    }
    /**
     * 添加慢性病管理管理
ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TSysEducationalInfoController.java
@@ -35,8 +35,8 @@
@RestController
@RequestMapping("/t-sys-educational-info")
public class TSysEducationalInfoController {
    private final TSysEducationalInfoService sysEducationalInfoService;
    private final TokenService tokenService;
    private final RedisCache redisCache;
    @Autowired
ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TSysInspectionController.java
@@ -5,7 +5,10 @@
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.framework.web.service.TokenService;
import com.ruoyi.system.model.TCrmClinic;
import com.ruoyi.system.model.TSysInspection;
import com.ruoyi.system.service.TCrmClinicService;
import com.ruoyi.system.service.TSysInspectionService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
@@ -13,6 +16,8 @@
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
/**
@@ -29,9 +34,13 @@
public class TSysInspectionController {
    private final TSysInspectionService sysInspectionService;
    private final TokenService tokenService;
    private final TCrmClinicService crmClinicService;
    @Autowired
    public TSysInspectionController(TSysInspectionService sysInspectionService) {
    public TSysInspectionController(TSysInspectionService sysInspectionService, TokenService tokenService, TCrmClinicService crmClinicService) {
        this.sysInspectionService = sysInspectionService;
        this.tokenService = tokenService;
        this.crmClinicService = crmClinicService;
    }
//    /**
@@ -60,6 +69,13 @@
    @PostMapping(value = "/add")
    public R<Boolean> add(@Validated @RequestBody TSysInspection dto) {
        dto.setIsPay(1);
        String checkTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());
        dto.setCheckTime(checkTime);
        Long userId = tokenService.getLoginUser().getUserId();
        TCrmClinic crmClinic = crmClinicService.getOne(Wrappers.lambdaQuery(TCrmClinic.class)
                .eq(TCrmClinic::getUserId, userId)
                .last("LIMIT 1"));
        dto.setClinicId(crmClinic.getId());
        return R.ok(sysInspectionService.save(dto));
    }
ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TSysLiveController.java
@@ -124,7 +124,7 @@
            Long userId = tokenService.getLoginUser().getUserId();
            Set<Long> clickCount = new HashSet<>();
            clickCount.add(userId);
            redisCache.setCacheSet(Constants.SYS_LIVE_COUNT+id,clickCount);
            redisCache.setCacheSet(Constants.SYS_LIVE_CLICK_COUNT+id,clickCount);
        }
        return R.ok(sysLive);
    }
ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TSysProductIntroductionController.java
@@ -9,8 +9,14 @@
import com.ruoyi.common.core.redis.RedisCache;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.framework.web.service.TokenService;
import com.ruoyi.system.model.TSysActivity;
import com.ruoyi.system.model.TSysEducationalInfo;
import com.ruoyi.system.model.TSysLive;
import com.ruoyi.system.model.TSysProductIntroduction;
import com.ruoyi.system.query.TSysProductIntroductionQuery;
import com.ruoyi.system.service.TSysActivityService;
import com.ruoyi.system.service.TSysEducationalInfoService;
import com.ruoyi.system.service.TSysLiveService;
import com.ruoyi.system.service.TSysProductIntroductionService;
import com.ruoyi.system.vo.TSysProductIntroductionVO;
import io.swagger.annotations.Api;
@@ -19,9 +25,7 @@
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.*;
/**
 * <p>
@@ -39,11 +43,17 @@
    private final TSysProductIntroductionService sysProductIntroductionService;
    private final TokenService tokenService;
    private final RedisCache redisCache;
    private final TSysEducationalInfoService sysEducationalInfoService;
    private final TSysActivityService sysActivityService;
    private final TSysLiveService sysLiveService;
    @Autowired
    public TSysProductIntroductionController(TSysProductIntroductionService sysProductIntroductionService, TokenService tokenService, RedisCache redisCache) {
    public TSysProductIntroductionController(TSysProductIntroductionService sysProductIntroductionService, TokenService tokenService, RedisCache redisCache, TSysEducationalInfoService sysEducationalInfoService, TSysActivityService sysActivityService, TSysLiveService sysLiveService) {
        this.sysProductIntroductionService = sysProductIntroductionService;
        this.tokenService = tokenService;
        this.redisCache = redisCache;
        this.sysEducationalInfoService = sysEducationalInfoService;
        this.sysActivityService = sysActivityService;
        this.sysLiveService = sysLiveService;
    }
    /**
@@ -148,5 +158,61 @@
        return R.ok();
    }
    
    /**
     * 热门推荐统计数量
     */
    @ApiOperation(value = "热门推荐统计数量")
    @GetMapping(value = "/recommendationsCount")
    public R<Map<String,Integer>> recommendationsCount() {
        Long userId = tokenService.getLoginUser().getUserId();
        // 查询教育资讯
        List<TSysEducationalInfo> sysEducationalInfos = sysEducationalInfoService.list(Wrappers.<TSysEducationalInfo>lambdaQuery()
                .eq(TSysEducationalInfo::getStatus, 1));
        int educationalCount = sysEducationalInfos.size();
        for (TSysEducationalInfo sysEducationalInfo : sysEducationalInfos) {
            Set<Long> userIds = redisCache.getCacheSet(Constants.SYS_EDUCATION_CLICK_COUNT+sysEducationalInfo.getId());
            if(userIds.contains(userId)){
                educationalCount = educationalCount - 1;
            }
        }
        // 查询产品介绍
        List<TSysProductIntroduction> sysProductIntroductions = sysProductIntroductionService.list(Wrappers.lambdaQuery(TSysProductIntroduction.class)
                .eq(TSysProductIntroduction::getStatus, 1));
        int productCount = sysProductIntroductions.size();
        for (TSysProductIntroduction sysProductIntroduction : sysProductIntroductions) {
            Set<Long> userIds = redisCache.getCacheSet(Constants.SYS_PRODUCT_CLICK_COUNT+sysProductIntroduction.getId());
            if(userIds.contains(userId)){
                productCount = productCount - 1;
            }
        }
        // 查询热门活动
        List<TSysActivity> sysActivities = sysActivityService.list(Wrappers.lambdaQuery(TSysActivity.class)
                .eq(TSysActivity::getStatus, 1));
        int activityCount = sysActivities.size();
        for (TSysActivity sysActivity : sysActivities) {
            Set<Long> userIds = redisCache.getCacheSet(Constants.SYS_ACTIVITY_CLICK_COUNT+sysActivity.getId());
            if(userIds.contains(userId)){
                activityCount = activityCount - 1;
            }
        }
        // 查询直播
        List<TSysLive> sysLives = sysLiveService.list();
        int liveCount = sysLives.size();
        for (TSysLive sysLive : sysLives) {
            Set<Long> userIds = redisCache.getCacheSet(Constants.SYS_LIVE_CLICK_COUNT+sysLive.getId());
            if(userIds.contains(userId)){
                liveCount = liveCount - 1;
            }
        }
        Map<String,Integer> map = new HashMap<>();
        map.put("educationalCount",educationalCount);
        map.put("productCount",productCount);
        map.put("activityCount",activityCount);
        map.put("liveCount",liveCount);
        return R.ok(map);
    }
}
ruoyi-admin/src/main/java/com/ruoyi/web/controller/task/TaskUtil.java
@@ -60,7 +60,7 @@
        }
    }
    @Scheduled(cron = "10 0 0 * * ?")
    @Scheduled(cron = "0 0 0 L * ?")
    public void monthUpdateClinicPerformance() {
        try {
            // 判断哪些诊所本月没有业绩达标
ruoyi-common/src/main/java/com/ruoyi/common/constant/Constants.java
@@ -193,7 +193,7 @@
    /**
     * 直播点击缓存
     */
    public static final String SYS_LIVE_COUNT = "sys_live_count:";
    public static final String SYS_LIVE_CLICK_COUNT = "sys_live_click_count:";
ruoyi-system/src/main/java/com/ruoyi/system/mapper/TErpProcurementMapper.java
@@ -6,12 +6,10 @@
import com.ruoyi.system.model.TErpProcurement;
import com.ruoyi.system.query.TErpGoodsQuery;
import com.ruoyi.system.query.TErpProcurementQuery;
import com.ruoyi.system.vo.SupplierThirtyMoneyProcurementStatisticsVO;
import com.ruoyi.system.vo.SupplierThirtyProcurementStatisticsVO;
import com.ruoyi.system.vo.TErpGoodsVO;
import com.ruoyi.system.vo.TErpProcurementVo;
import com.ruoyi.system.vo.*;
import org.apache.ibatis.annotations.Param;
import java.math.BigDecimal;
import java.util.List;
/**
@@ -42,4 +40,51 @@
                                                                                              @Param("endTime")String endTime,
                                                                                              @Param("roleType")Integer roleType);
    /**
     * 供应商销售统计-类型
     * @param supplierId
     * @return
     */
    Integer supplierSalesStatisticsTypeCount(@Param("supplierId")String supplierId);
    /**
     * 供应商销售统计-数量
     * @param supplierId
     * @return
     */
    Integer supplierSalesStatisticsCount(@Param("supplierId")String supplierId);
    /**
     * 供应商销售统计-金额
     * @param supplierId
     * @return
     */
    BigDecimal supplierSalesStatisticsMoney(@Param("supplierId")String supplierId,
                                            @Param("startTime")String startTime,
                                            @Param("endTime")String endTime);
    /**
     * 供应商销售统计-商品类型
     * @param supplierId
     * @return
     */
    List<SupplierSalesStatisticsGoodsTypeVO> supplierSalesStatisticsGoodsType(@Param("supplierId")String supplierId,
                                                                              @Param("startTime")String startTime,
                                                                              @Param("endTime")String endTime);
    /**
     * 供应商销售统计-商品数量
     * @param supplierId
     * @return
     */
    List<SupplierSalesStatisticsGoodsCountVO> supplierSalesStatisticsGoodsCount(@Param("supplierId")String supplierId,
                                                                                @Param("startTime")String startTime,
                                                                                @Param("endTime")String endTime,
                                                                                @Param("goodsName")String goodsName);
    List<SupplierSalesStatisticsGoodsCountVO> supplierSalesStatisticsGoodsCountMonth(@Param("supplierId")String supplierId,
                                                                                     @Param("startTime")String startTime,
                                                                                     @Param("endTime")String endTime,
                                                                                     @Param("goodsName")String goodsName);
}
ruoyi-system/src/main/java/com/ruoyi/system/mapper/TSysOrderMapper.java
@@ -4,10 +4,13 @@
import com.ruoyi.common.basic.PageInfo;
import com.ruoyi.system.model.TSysOrder;
import com.ruoyi.system.query.TSysOrderQuery;
import com.ruoyi.system.vo.ClinicSalesStatisticsGoodsCountVO;
import com.ruoyi.system.vo.ClinicSalesStatisticsGoodsTypeVO;
import com.ruoyi.system.vo.TSysOrderPageVo;
import com.ruoyi.system.vo.TSysOrderVO;
import org.apache.ibatis.annotations.Param;
import java.math.BigDecimal;
import java.util.List;
/**
@@ -31,4 +34,25 @@
    List<TSysOrderPageVo> pageList(@Param("page") PageInfo<TSysOrderPageVo> page, @Param("query") TSysOrderQuery query, @Param("sTime") String sTime, @Param("eTime") String eTime);
    Integer clinicSalesStatisticsCount(@Param("clinicId")String clinicId);
    Integer clinicSalesStatisticsTypeCount(@Param("clinicId")String clinicId);
    BigDecimal clinicSalesStatisticsMoney(@Param("clinicId")String clinicId,
                                          @Param("startTime")String startTime,
                                          @Param("endTime")String endTime);
    List<ClinicSalesStatisticsGoodsTypeVO> supplierSalesStatisticsGoodsType(@Param("clinicId")String clinicId,
                                                                            @Param("startTime")String startTime,
                                                                            @Param("endTime")String endTime);
    List<ClinicSalesStatisticsGoodsCountVO> supplierSalesStatisticsGoodsCount(@Param("clinicId")String clinicId,
                                                                              @Param("startTime")String startTime,
                                                                              @Param("endTime")String endTime,
                                                                              @Param("goodsName")String goodsName);
    List<ClinicSalesStatisticsGoodsCountVO> supplierSalesStatisticsGoodsCountMonth(@Param("clinicId")String clinicId,
                                                                                   @Param("startTime")String startTime,
                                                                                   @Param("endTime")String endTime,
                                                                                   @Param("goodsName")String goodsName);
}
ruoyi-system/src/main/java/com/ruoyi/system/model/TSysInspection.java
@@ -120,5 +120,15 @@
    @ApiModelProperty(value = "是否已支付 1=是 0=否")
    @TableField("is_pay")
    private Integer isPay;
    @ApiModelProperty(value = "诊所名称")
    @TableField(exist = false)
    private String clinicName;
    @ApiModelProperty(value = "是否已开药 1=是 0=否")
    @TableField(exist = false)
    private Integer isPrescribeMedicine;
    @ApiModelProperty(value = "订单id")
    @TableField(exist = false)
    private String orderId;
}
ruoyi-system/src/main/java/com/ruoyi/system/model/TSysOrderGoods.java
@@ -33,6 +33,9 @@
    @ApiModelProperty(value = "订单id")
    @TableField("order_id")
    private String orderId;
    @ApiModelProperty(value = "商品id")
    @TableField("goods_id")
    private String goodsId;
    @ApiModelProperty(value = "商品名称")
    @TableField("goods_name")
ruoyi-system/src/main/java/com/ruoyi/system/query/DataStatisticsQuery.java
@@ -16,4 +16,7 @@
    @ApiModelProperty(value = "时间类型 1=今日 2=昨天 3=最近七天 4=最近半年 5=最近一年")
    private Integer timeType;
    @ApiModelProperty(value = "药品名称")
    private String goodsName;
}
ruoyi-system/src/main/java/com/ruoyi/system/service/TErpProcurementService.java
@@ -11,6 +11,7 @@
import com.ruoyi.system.vo.*;
import javax.validation.Valid;
import java.math.BigDecimal;
import java.util.List;
/**
@@ -59,4 +60,56 @@
     * @return
     */
    List<SupplierThirtyMoneyProcurementStatisticsVO> supplierThirtyMoneyProcurementStatistics(String supplierAndClinicId, String startTime, String endTime,Integer roleType);
    /**
     * 供应商30天采购总类统计
     * @param supplierId
     * @return
     */
    Integer supplierSalesStatisticsTypeCount(String supplierId);
    /**
     * 供应商30天采购总数统计
     * @param supplierId
     * @return
     */
    Integer supplierSalesStatisticsCount(String supplierId);
    /**
     * 供应商30天采购金额统计
     * @param supplierId
     * @param startTime
     * @param endTime
     * @return
     */
    BigDecimal supplierSalesStatisticsMoney(String supplierId, String startTime, String endTime);
    /**
     * 供应商30天销售占比
     * @param supplierId
     * @param startTime
     * @param endTime
     * @return
     */
    List<SupplierSalesStatisticsGoodsTypeVO> supplierSalesStatisticsGoodsType(String supplierId, String startTime, String endTime);
    /**
     * 供应商30天销售商品统计
     * @param supplierId
     * @param startTime
     * @param endTime
     * @param goodsName
     * @return
     */
    List<SupplierSalesStatisticsGoodsCountVO> supplierSalesStatisticsGoodsCount(String supplierId, String startTime, String endTime, String goodsName);
    /**
     * 供应商30天销售商品统计
     * @param supplierId
     * @param startTime
     * @param endTime
     * @param goodsName
     * @return
     */
    List<SupplierSalesStatisticsGoodsCountVO> supplierSalesStatisticsGoodsCountMonth(String supplierId, String startTime, String endTime, String goodsName);
}
ruoyi-system/src/main/java/com/ruoyi/system/service/TSysOrderService.java
@@ -6,10 +6,13 @@
import com.ruoyi.system.model.TCrmClinic;
import com.ruoyi.system.model.TSysOrder;
import com.ruoyi.system.query.TSysOrderQuery;
import com.ruoyi.system.vo.ClinicSalesStatisticsGoodsCountVO;
import com.ruoyi.system.vo.ClinicSalesStatisticsGoodsTypeVO;
import com.ruoyi.system.vo.TSysOrderPageVo;
import com.ruoyi.system.vo.TSysOrderVO;
import javax.validation.Valid;
import java.math.BigDecimal;
import java.util.List;
/**
@@ -34,4 +37,15 @@
    void add(TSysOrderDto dto, TCrmClinic crmClinic);
    Integer clinicSalesStatisticsCount(String clinicId);
    Integer clinicSalesStatisticsTypeCount(String clinicId);
    BigDecimal clinicSalesStatisticsMoney(String clinicId, String startTime, String endTime);
    List<ClinicSalesStatisticsGoodsTypeVO> supplierSalesStatisticsGoodsType(String clinicId, String startTime, String endTime);
    List<ClinicSalesStatisticsGoodsCountVO> supplierSalesStatisticsGoodsCount(String clinicId, String startTime, String endTime, String goodsName);
    List<ClinicSalesStatisticsGoodsCountVO> supplierSalesStatisticsGoodsCountMonth(String clinicId, String startTime, String endTime, String goodsName);
}
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TErpProcurementServiceImpl.java
@@ -577,4 +577,34 @@
        return this.baseMapper.supplierThirtyMoneyProcurementStatistics(supplierAndClinicId, startTime, endTime, roleType);
    }
    @Override
    public Integer supplierSalesStatisticsTypeCount(String supplierId) {
        return this.baseMapper.supplierSalesStatisticsTypeCount(supplierId);
    }
    @Override
    public Integer supplierSalesStatisticsCount(String supplierId) {
        return this.baseMapper.supplierSalesStatisticsCount(supplierId);
    }
    @Override
    public BigDecimal supplierSalesStatisticsMoney(String supplierId, String startTime, String endTime) {
        return this.baseMapper.supplierSalesStatisticsMoney(supplierId,startTime, endTime);
    }
    @Override
    public List<SupplierSalesStatisticsGoodsTypeVO> supplierSalesStatisticsGoodsType(String supplierId, String startTime, String endTime) {
        return this.baseMapper.supplierSalesStatisticsGoodsType(supplierId,startTime, endTime);
    }
    @Override
    public List<SupplierSalesStatisticsGoodsCountVO> supplierSalesStatisticsGoodsCount(String supplierId, String startTime, String endTime, String goodsName) {
        return this.baseMapper.supplierSalesStatisticsGoodsCount(supplierId,startTime, endTime,goodsName);
    }
    @Override
    public List<SupplierSalesStatisticsGoodsCountVO> supplierSalesStatisticsGoodsCountMonth(String supplierId, String startTime, String endTime, String goodsName) {
        return this.baseMapper.supplierSalesStatisticsGoodsCountMonth(supplierId,startTime, endTime,goodsName);
    }
}
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TSysOrderServiceImpl.java
@@ -12,6 +12,8 @@
import com.ruoyi.system.service.TCrmClinicService;
import com.ruoyi.system.service.TErpClinicOutboundService;
import com.ruoyi.system.service.TSysOrderService;
import com.ruoyi.system.vo.ClinicSalesStatisticsGoodsCountVO;
import com.ruoyi.system.vo.ClinicSalesStatisticsGoodsTypeVO;
import com.ruoyi.system.vo.TSysOrderPageVo;
import com.ruoyi.system.vo.TSysOrderVO;
import org.springframework.beans.factory.annotation.Autowired;
@@ -69,7 +71,7 @@
        for (TSysOrderVO sysOrderVO : sysOrderVOS) {
            sysOrderVO.setSysOrderGoods(sysOrderGoodsList.stream().filter(sysOrderGoods -> sysOrderGoods.getOrderId().equals(sysOrderVO.getId())).collect(Collectors.toList()));
        }
        return this.baseMapper.queryListByAppUserId(id);
        return sysOrderVOS;
    }
    @Override
@@ -116,6 +118,7 @@
            tSysOrderGoods1.setBatchId(tErpClinicWarehousingBatch.getId());
            tSysOrderGoods1.setBatchNumber(tErpClinicWarehousingBatch.getBatchNumber());
            tSysOrderGoods1.setRemainingQuantity(sysOrderNextDto.getRemainingQuantity());
            tSysOrderGoods1.setGoodsId(goods.getId());
            tSysOrderGoods.add(tSysOrderGoods1);
@@ -156,4 +159,34 @@
        }
    }
    @Override
    public Integer clinicSalesStatisticsCount(String clinicId) {
        return this.baseMapper.clinicSalesStatisticsCount(clinicId);
    }
    @Override
    public Integer clinicSalesStatisticsTypeCount(String clinicId) {
        return this.baseMapper.clinicSalesStatisticsTypeCount(clinicId);
    }
    @Override
    public BigDecimal clinicSalesStatisticsMoney(String clinicId, String startTime, String endTime) {
        return this.baseMapper.clinicSalesStatisticsMoney(clinicId,startTime,endTime);
    }
    @Override
    public List<ClinicSalesStatisticsGoodsTypeVO> supplierSalesStatisticsGoodsType(String clinicId, String startTime, String endTime) {
        return this.baseMapper.supplierSalesStatisticsGoodsType(clinicId,startTime,endTime);
    }
    @Override
    public List<ClinicSalesStatisticsGoodsCountVO> supplierSalesStatisticsGoodsCount(String clinicId, String startTime, String endTime, String goodsName) {
        return this.baseMapper.supplierSalesStatisticsGoodsCount(clinicId,startTime,endTime,goodsName);
    }
    @Override
    public List<ClinicSalesStatisticsGoodsCountVO> supplierSalesStatisticsGoodsCountMonth(String clinicId, String startTime, String endTime, String goodsName) {
        return this.baseMapper.supplierSalesStatisticsGoodsCountMonth(clinicId,startTime,endTime,goodsName);
    }
}
ruoyi-system/src/main/java/com/ruoyi/system/vo/ClinicSalesStatisticsGoodsCountVO.java
New file
@@ -0,0 +1,23 @@
package com.ruoyi.system.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDate;
@Data
@ApiModel(value = "诊所30天销售统计视图对象ClinicSalesStatisticsGoodsCountVO")
public class ClinicSalesStatisticsGoodsCountVO implements Serializable {
    @ApiModelProperty(value = "时间")
    private String time;
    @ApiModelProperty(value = "商品数")
    private Integer goodsCount;
    @ApiModelProperty(value = "支付时间,前端忽略")
    private LocalDate payTime;
}
ruoyi-system/src/main/java/com/ruoyi/system/vo/ClinicSalesStatisticsGoodsTypeVO.java
New file
@@ -0,0 +1,17 @@
package com.ruoyi.system.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
@Data
@ApiModel(value = "诊所销售统计销售前十占比ClinicSalesStatisticsGoodsTypeVO")
public class ClinicSalesStatisticsGoodsTypeVO implements Serializable {
    @ApiModelProperty(value = "类型名称")
    private String typeName;
    @ApiModelProperty(value = "商品数量")
    private Integer goodsCount;
}
ruoyi-system/src/main/java/com/ruoyi/system/vo/ClinicSalesStatisticsVO.java
New file
@@ -0,0 +1,23 @@
package com.ruoyi.system.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.List;
@Data
@ApiModel(value = "诊所销售统计ClinicSalesStatisticsVO")
public class ClinicSalesStatisticsVO implements Serializable {
    @ApiModelProperty(value = "销售金额")
    private BigDecimal salesMoney;
    @ApiModelProperty(value = "销售前十占比")
    private List<ClinicSalesStatisticsGoodsTypeVO> clinicSalesStatisticsGoodsTypeVOS;
    @ApiModelProperty(value = "销售商品")
    private List<ClinicSalesStatisticsGoodsCountVO> clinicSalesStatisticsGoodsCountVOS;
}
ruoyi-system/src/main/java/com/ruoyi/system/vo/SupplierSalesStatisticsGoodsCountVO.java
New file
@@ -0,0 +1,23 @@
package com.ruoyi.system.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDate;
@Data
@ApiModel(value = "供应商30天销售统计视图对象SupplierSalesStatisticsGoodsCountVO")
public class SupplierSalesStatisticsGoodsCountVO implements Serializable {
    @ApiModelProperty(value = "时间")
    private String time;
    @ApiModelProperty(value = "商品数")
    private Integer goodsCount;
    @ApiModelProperty(value = "支付时间,前端忽略")
    private LocalDate payTime;
}
ruoyi-system/src/main/java/com/ruoyi/system/vo/SupplierSalesStatisticsGoodsTypeVO.java
New file
@@ -0,0 +1,18 @@
package com.ruoyi.system.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
@Data
@ApiModel(value = "供应商销售统计销售前十占比SupplierSalesStatisticsGoodsTypeVO")
public class SupplierSalesStatisticsGoodsTypeVO implements Serializable {
    @ApiModelProperty(value = "类型名称")
    private String typeName;
    @ApiModelProperty(value = "商品数量")
    private Integer goodsCount;
}
ruoyi-system/src/main/java/com/ruoyi/system/vo/SupplierSalesStatisticsVO.java
New file
@@ -0,0 +1,24 @@
package com.ruoyi.system.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import io.swagger.annotations.License;
import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.List;
@Data
@ApiModel(value = "供应商销售统计SupplierSalesStatisticsVO")
public class SupplierSalesStatisticsVO implements Serializable {
    @ApiModelProperty(value = "销售金额")
    private BigDecimal salesMoney;
    @ApiModelProperty(value = "销售前十占比")
    private List<SupplierSalesStatisticsGoodsTypeVO> supplierSalesStatisticsGoodsTypeVOS;
    @ApiModelProperty(value = "销售商品")
    private List<SupplierSalesStatisticsGoodsCountVO> supplierSalesStatisticsGoodsCountVOS;
}
ruoyi-system/src/main/resources/mapper/system/TErpProcurementMapper.xml
@@ -144,5 +144,77 @@
            </if>
        group by date_format(t1.pay_time, '%m.%d')
    </select>
    <select id="supplierSalesStatisticsTypeCount" resultType="java.lang.Integer">
        select count(1)
        from t_erp_procurement tep
        left join t_erp_procurement_goods tepg on tep.id = tepg.procurement_id
        left join t_erp_goods teg on tepg.goods_id = teg.id
        where tep.disabled = ${@com.ruoyi.common.enums.DisabledEnum@NO.getCode()}
        and tep.status in (3,4,5)
        and tep.supplier_id = #{supplierId}
        group by teg.type_id
    </select>
    <select id="supplierSalesStatisticsCount" resultType="java.lang.Integer">
        select count(1)
        from t_erp_procurement tep
         left join t_erp_procurement_goods tepg on tep.id = tepg.procurement_id
        where tep.disabled = ${@com.ruoyi.common.enums.DisabledEnum@NO.getCode()}
          and tep.status in (3,4,5)
          and tep.supplier_id = #{supplierId}
    </select>
    <select id="supplierSalesStatisticsMoney" resultType="java.math.BigDecimal">
        select sum(pay_money) from t_erp_procurement
        where disabled = ${@com.ruoyi.common.enums.DisabledEnum@NO.getCode()}
          and status in (3,4,5)
          and pay_time between #{startTime} and #{endTime}
          and supplier_id = #{supplierId}
    </select>
    <select id="supplierSalesStatisticsGoodsType"
            resultType="com.ruoyi.system.vo.SupplierSalesStatisticsGoodsTypeVO">
        select count(1), tegt.type_name
        from t_erp_procurement tep
                 left join t_erp_procurement_goods tepg on tep.id = tepg.procurement_id
                 left join t_erp_goods teg on tepg.goods_id = teg.id
                 left join t_erp_goods_type tegt on teg.type_id = tegt.id
        where tep.disabled = ${@com.ruoyi.common.enums.DisabledEnum@NO.getCode()}
          and tep.status in (3,4,5)
          and tep.pay_time between #{startTime} and #{endTime}
          and tep.supplier_id = #{supplierId}
        group by teg.type_id
        order by count(1) desc
    </select>
    <select id="supplierSalesStatisticsGoodsCount"
            resultType="com.ruoyi.system.vo.SupplierSalesStatisticsGoodsCountVO">
        select
        date_format(t1.pay_time, '%m.%d') as `time`,
        date_format(t1.pay_time, '%Y-%m-%d') as payTime,
        sum(t2.purchase_count) as goodsCount
        from t_erp_procurement t1
        left join t_erp_procurement_goods t2 on t1.id = t2.procurement_id
        where t1.disabled = ${@com.ruoyi.common.enums.DisabledEnum@NO.getCode()}
        and t1.status in (3,4,5)
        and t1.pay_time between #{startTime} and #{endTime}
        and t1.supplier_id = #{supplierId}
        <if test="goodsName != null and goodsName != ''">
            and t2.goods_name like concat('%',#{goodsName},'%')
        </if>
        group by date_format(t1.pay_time, '%m.%d')
    </select>
    <select id="supplierSalesStatisticsGoodsCountMonth"
            resultType="com.ruoyi.system.vo.SupplierSalesStatisticsGoodsCountVO">
        select
        date_format(t1.pay_time, '%Y.%m') as `time`,
        sum(t2.purchase_count) as goodsCount
        from t_erp_procurement t1
        left join t_erp_procurement_goods t2 on t1.id = t2.procurement_id
        where t1.disabled = ${@com.ruoyi.common.enums.DisabledEnum@NO.getCode()}
        and t1.status in (3,4,5)
        and t1.pay_time between #{startTime} and #{endTime}
        and t1.supplier_id = #{supplierId}
        <if test="goodsName != null and goodsName != ''">
            and t2.goods_name like concat('%',#{goodsName},'%')
        </if>
        group by date_format(t1.pay_time, '%Y.%m')
    </select>
</mapper>
ruoyi-system/src/main/resources/mapper/system/TSysOrderGoodsMapper.xml
@@ -6,6 +6,7 @@
    <resultMap id="BaseResultMap" type="com.ruoyi.system.model.TSysOrderGoods">
        <id column="id" property="id" />
        <result column="order_id" property="orderId" />
        <result column="goods_id" property="goodsId" />
        <result column="goods_name" property="goodsName" />
        <result column="type_name" property="typeName" />
        <result column="quasi_number" property="quasiNumber" />
@@ -21,7 +22,7 @@
    <!-- 通用查询结果列 -->
    <sql id="Base_Column_List">
        id, order_id, goods_name, type_name, quasi_number, goods_unit, sale_count, sale_amount, create_time, update_time, create_by, update_by, disabled
        id, order_id,goods_id, goods_name, type_name, quasi_number, goods_unit, sale_count, sale_amount, create_time, update_time, create_by, update_by, disabled
    </sql>
</mapper>
ruoyi-system/src/main/resources/mapper/system/TSysOrderMapper.xml
@@ -45,5 +45,72 @@
        order by t1.create_time desc
    </select>
    <select id="clinicSalesStatisticsCount" resultType="java.lang.Integer">
        select count(1)
        from t_sys_order tso
                 left join t_sys_order_goods tsog on tso.id = tsog.order_id
                 left join t_erp_goods teg on tepg.goods_id = teg.id
        where tso.disabled = ${@com.ruoyi.common.enums.DisabledEnum@NO.getCode()}
          and tso.clinic_id = #{clinicId}
    </select>
    <select id="clinicSalesStatisticsTypeCount" resultType="java.lang.Integer">
        select count(1)
        from t_sys_order tso
                 left join t_sys_order_goods tsog on tso.id = tsog.order_id
                 left join t_erp_goods teg on tepg.goods_id = teg.id
        where tso.disabled = ${@com.ruoyi.common.enums.DisabledEnum@NO.getCode()}
          and tso.clinic_id = #{clinicId}
        group by teg.type_id
    </select>
    <select id="clinicSalesStatisticsMoney" resultType="java.math.BigDecimal">
        select sum(total_money) from t_sys_order
        where disabled = ${@com.ruoyi.common.enums.DisabledEnum@NO.getCode()}
          and pay_time between #{startTime} and #{endTime}
          and clinic_id = #{clinicId}
    </select>
    <select id="supplierSalesStatisticsGoodsType"
            resultType="com.ruoyi.system.vo.ClinicSalesStatisticsGoodsTypeVO">
        select count(1), tegt.type_name
        from t_sys_order tso
                 left join t_sys_order_goods tsog on tso.id = tsog.order_id
                 left join t_erp_goods teg on tsog.goods_id = teg.id
                 left join t_erp_goods_type tegt on teg.type_id = tegt.id
        where tso.disabled = ${@com.ruoyi.common.enums.DisabledEnum@NO.getCode()}
          and tso.pay_time between #{startTime} and #{endTime}
          and tso.clinic_id = #{clinicId}
        group by teg.type_id
        order by count(1) desc
    </select>
    <select id="supplierSalesStatisticsGoodsCount"
            resultType="com.ruoyi.system.vo.ClinicSalesStatisticsGoodsCountVO">
        select
        date_format(t1.pay_time, '%m.%d') as `time`,
        date_format(t1.pay_time, '%Y-%m-%d') as payTime,
        sum(t2.purchase_count) as goodsCount
        from t_sys_order t1
        left join t_sys_order_goods t2 on t1.id = t2.order_id
        where t1.disabled = ${@com.ruoyi.common.enums.DisabledEnum@NO.getCode()}
        and t1.pay_time between #{startTime} and #{endTime}
        and t1.clinic_id = #{clinicId}
        <if test="goodsName != null and goodsName != ''">
            and t2.goods_name like concat('%',#{goodsName},'%')
        </if>
        group by date_format(t1.pay_time, '%m.%d')
    </select>
    <select id="supplierSalesStatisticsGoodsCountMonth"
            resultType="com.ruoyi.system.vo.ClinicSalesStatisticsGoodsCountVO">
        select
        date_format(t1.pay_time, '%Y.%m') as `time`,
        sum(t2.purchase_count) as goodsCount
        from t_sys_order t1
        left join t_sys_order_goods t2 on t1.id = t2.order_id
        where t1.disabled = ${@com.ruoyi.common.enums.DisabledEnum@NO.getCode()}
        and t1.pay_time between #{startTime} and #{endTime}
        and t1.clinic_id = #{clinicId}
        <if test="goodsName != null and goodsName != ''">
            and t2.goods_name like concat('%',#{goodsName},'%')
        </if>
        group by date_format(t1.pay_time, '%Y.%m')
    </select>
</mapper>