From 7c018e4f1a939d0faad4a675af53586e44f8e641 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9Cwangzihua=E2=80=9D?= Date: Thu, 25 Dec 2025 11:17:04 +0800 Subject: [PATCH] =?UTF-8?q?fix:=E6=8A=A5=E8=A1=A8=E7=BB=9F=E8=AE=A1?= =?UTF-8?q?=E5=90=8E=E7=AB=AF=E5=BC=80=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/.gitignore | 10 ++ .idea/.name | 1 + .idea/compiler.xml | 15 +++ .idea/encodings.xml | 14 +++ .idea/jarRepositories.xml | 20 ++++ .idea/misc.xml | 12 ++ .idea/sqldialects.xml | 6 + .idea/vcs.xml | 6 + .../sa/admin/common/enums/DateTimeEnum.java | 92 ++++++++++++++++ .../ServiceApplicationsController.java | 10 ++ .../service/dao/ServiceApplicationsDao.java | 24 ++++ .../entity/ServiceApplicationsEntity.java | 4 + .../form/LawyerStatisticsQueryForm.java | 38 +++++++ .../service/domain/vo/LawyerStatisticsVO.java | 37 +++++++ .../service/ServiceApplicationsService.java | 52 +++++++++ .../lab1024/sa/admin/util/DateTimeUtil.java | 90 +++++++++++++++ .../net/lab1024/sa/admin/util/TimeVo.java | 19 ++++ .../service/ServiceApplicationsMapper.xml | 104 +++++++++++++++++- .../mapper/business/goods/GoodsMapper.xml | 2 +- .../service/ServiceApplicationsMapper.xml | 104 +++++++++++++++++- .../ServiceApplicationsController.class | Bin 6694 -> 7559 bytes .../service/dao/ServiceApplicationsDao.class | Bin 1417 -> 2276 bytes ...onsService$DropdownSheetWriteHandler.class | Bin 7770 -> 7770 bytes .../service/ServiceApplicationsService.class | Bin 19498 -> 22395 bytes 24 files changed, 657 insertions(+), 3 deletions(-) create mode 100644 .idea/.gitignore create mode 100644 .idea/.name create mode 100644 .idea/compiler.xml create mode 100644 .idea/encodings.xml create mode 100644 .idea/jarRepositories.xml create mode 100644 .idea/misc.xml create mode 100644 .idea/sqldialects.xml create mode 100644 .idea/vcs.xml create mode 100644 yun-admin/src/main/java/net/lab1024/sa/admin/common/enums/DateTimeEnum.java create mode 100644 yun-admin/src/main/java/net/lab1024/sa/admin/module/service/domain/form/LawyerStatisticsQueryForm.java create mode 100644 yun-admin/src/main/java/net/lab1024/sa/admin/module/service/domain/vo/LawyerStatisticsVO.java create mode 100644 yun-admin/src/main/java/net/lab1024/sa/admin/util/DateTimeUtil.java create mode 100644 yun-admin/src/main/java/net/lab1024/sa/admin/util/TimeVo.java diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..7bc07ec --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,10 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Editor-based HTTP Client requests +/httpRequests/ +# Environment-dependent path to Maven home directory +/mavenHomeManager.xml +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/.idea/.name b/.idea/.name new file mode 100644 index 0000000..f1f6648 --- /dev/null +++ b/.idea/.name @@ -0,0 +1 @@ +yun-parent \ No newline at end of file diff --git a/.idea/compiler.xml b/.idea/compiler.xml new file mode 100644 index 0000000..63fa2b4 --- /dev/null +++ b/.idea/compiler.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/encodings.xml b/.idea/encodings.xml new file mode 100644 index 0000000..93bc615 --- /dev/null +++ b/.idea/encodings.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml new file mode 100644 index 0000000..b074d70 --- /dev/null +++ b/.idea/jarRepositories.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..2f4db4e --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,12 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/sqldialects.xml b/.idea/sqldialects.xml new file mode 100644 index 0000000..77496bb --- /dev/null +++ b/.idea/sqldialects.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/yun-admin/src/main/java/net/lab1024/sa/admin/common/enums/DateTimeEnum.java b/yun-admin/src/main/java/net/lab1024/sa/admin/common/enums/DateTimeEnum.java new file mode 100644 index 0000000..28b6f15 --- /dev/null +++ b/yun-admin/src/main/java/net/lab1024/sa/admin/common/enums/DateTimeEnum.java @@ -0,0 +1,92 @@ +package net.lab1024.sa.admin.common.enums; + +import lombok.Data; +import net.lab1024.sa.base.common.enumeration.BaseEnum; + +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.LocalTime; +import java.time.format.DateTimeFormatter; + +/** + * 时间枚举 + */ +public enum DateTimeEnum implements BaseEnum { + + Q1_START(1, "第一季度开始时间", "01-01 00:00:00"), + Q1_END(2, "第一季度结束时间", "03-31 23:59:59"), + Q2_START(3, "第二季度开始时间", "04-01 00:00:00"), + Q2_END(4, "第二季度结束时间", "06-30 23:59:59"), + Q3_START(5, "第三季度开始时间", "07-01 00:00:00"), + Q3_END(6, "第三季度结束时间", "09-30 23:59:59"), + Q4_START(7, "第四季度开始时间", "10-01 00:00:00"), + Q4_END(8, "第四季度结束时间", "12-31 23:59:59"); + + DateTimeEnum(Integer value, String desc, String timePattern) { + this.value = value; + this.desc = desc; + this.timePattern = timePattern; + } + + private Integer value; + private String desc; + private String timePattern; + + @Override + public Integer getValue() { + return value; + } + + @Override + public String getDesc() { + return desc; + } + + public String getTimePattern() { + return timePattern; + } + + /** + * 获取指定年份的季度开始时间 + */ + public LocalDateTime getQuarterStartDateTime(int year) { + String dateStr = year + "-" + this.timePattern.substring(0, 5) + " 00:00:00"; + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + return LocalDateTime.parse(dateStr, formatter); + } + + /** + * 获取指定年份的季度结束时间 + */ + public LocalDateTime getQuarterEndDateTime(int year) { + String dateStr = year + "-" + this.timePattern.substring(0, 5) + " 23:59:59"; + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + return LocalDateTime.parse(dateStr, formatter); + } + + /** + * 根据季度编号获取开始时间 + */ + public static LocalDateTime getQuarterStart(int year, int quarter) { + switch (quarter) { + case 1: return Q1_START.getQuarterStartDateTime(year); + case 2: return Q2_START.getQuarterStartDateTime(year); + case 3: return Q3_START.getQuarterStartDateTime(year); + case 4: return Q4_START.getQuarterStartDateTime(year); + default: throw new IllegalArgumentException("无效的季度: " + quarter); + } + } + + /** + * 根据季度编号获取结束时间 + */ + public static LocalDateTime getQuarterEnd(int year, int quarter) { + switch (quarter) { + case 1: return Q1_END.getQuarterEndDateTime(year); + case 2: return Q2_END.getQuarterEndDateTime(year); + case 3: return Q3_END.getQuarterEndDateTime(year); + case 4: return Q4_END.getQuarterEndDateTime(year); + default: throw new IllegalArgumentException("无效的季度: " + quarter); + } + } +} \ No newline at end of file diff --git a/yun-admin/src/main/java/net/lab1024/sa/admin/module/service/controller/ServiceApplicationsController.java b/yun-admin/src/main/java/net/lab1024/sa/admin/module/service/controller/ServiceApplicationsController.java index e5c3974..dfd93f6 100644 --- a/yun-admin/src/main/java/net/lab1024/sa/admin/module/service/controller/ServiceApplicationsController.java +++ b/yun-admin/src/main/java/net/lab1024/sa/admin/module/service/controller/ServiceApplicationsController.java @@ -3,6 +3,8 @@ package net.lab1024.sa.admin.module.service.controller; import net.lab1024.sa.admin.module.service.domain.form.ServiceApplicationsAddForm; import net.lab1024.sa.admin.module.service.domain.form.ServiceApplicationsQueryForm; import net.lab1024.sa.admin.module.service.domain.form.ServiceApplicationsUpdateForm; +import net.lab1024.sa.admin.module.service.domain.form.LawyerStatisticsQueryForm; +import net.lab1024.sa.admin.module.service.domain.vo.LawyerStatisticsVO; import net.lab1024.sa.admin.module.service.domain.vo.ServiceApplicationsVO; import net.lab1024.sa.admin.module.service.service.ServiceApplicationsService; import net.lab1024.sa.base.common.domain.ValidateList; @@ -16,6 +18,7 @@ import org.springframework.web.multipart.MultipartFile; import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; import javax.validation.Valid; +import java.util.List; /** * 服务申报表 Controller @@ -106,4 +109,11 @@ public class ServiceApplicationsController { public void downloadTemplate(HttpServletResponse response) { serviceApplicationsService.downloadTemplate(response); } + + @Operation(summary = "律师统计信息 @author wzh") + @PostMapping("/serviceApplications/statistics") + @SaCheckPermission("serviceApplications:statistics") + public ResponseDTO> getLawyerStatistics(@RequestBody @Valid LawyerStatisticsQueryForm queryForm) { + return ResponseDTO.ok(serviceApplicationsService.getLawyerStatistics(queryForm)); + } } diff --git a/yun-admin/src/main/java/net/lab1024/sa/admin/module/service/dao/ServiceApplicationsDao.java b/yun-admin/src/main/java/net/lab1024/sa/admin/module/service/dao/ServiceApplicationsDao.java index cfb122e..dd96787 100644 --- a/yun-admin/src/main/java/net/lab1024/sa/admin/module/service/dao/ServiceApplicationsDao.java +++ b/yun-admin/src/main/java/net/lab1024/sa/admin/module/service/dao/ServiceApplicationsDao.java @@ -2,7 +2,9 @@ package net.lab1024.sa.admin.module.service.dao; import java.util.List; import net.lab1024.sa.admin.module.service.domain.entity.ServiceApplicationsEntity; +import net.lab1024.sa.admin.module.service.domain.form.LawyerStatisticsQueryForm; import net.lab1024.sa.admin.module.service.domain.form.ServiceApplicationsQueryForm; +import net.lab1024.sa.admin.module.service.domain.vo.LawyerStatisticsVO; import net.lab1024.sa.admin.module.service.domain.vo.ServiceApplicationsVO; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; @@ -41,4 +43,26 @@ public interface ServiceApplicationsDao extends BaseMapper idList,@Param("deletedFlag")boolean deletedFlag); void batchSubmit(@Param("idList")List idList, @Param("deletedFlag")Integer b); + + /** + * 律师统计查询(无参数,保持向后兼容) + */ + List getLawyerStatistics(); + + /** + * 律师统计查询(带参数) + */ + List getLawyerStatisticsWithParam(Page page, @Param("queryForm") LawyerStatisticsQueryForm queryForm); + + /** + * 年度律师统计查询(带参数) + */ + List getLawyerStatisticsWithParamYear(Page page, @Param("queryForm") LawyerStatisticsQueryForm queryForm); + + /** + * 月度统计 + * @param queryForm + * @return + */ + LawyerStatisticsVO getLawyerStatistic(@Param("queryForm") LawyerStatisticsQueryForm queryForm); } diff --git a/yun-admin/src/main/java/net/lab1024/sa/admin/module/service/domain/entity/ServiceApplicationsEntity.java b/yun-admin/src/main/java/net/lab1024/sa/admin/module/service/domain/entity/ServiceApplicationsEntity.java index abdfced..b8d18c9 100644 --- a/yun-admin/src/main/java/net/lab1024/sa/admin/module/service/domain/entity/ServiceApplicationsEntity.java +++ b/yun-admin/src/main/java/net/lab1024/sa/admin/module/service/domain/entity/ServiceApplicationsEntity.java @@ -132,6 +132,10 @@ public class ServiceApplicationsEntity { */ private Integer recordStatus; + /** + * 上报时间 + */ + private LocalDateTime reportTime; /** * 备案时间 */ diff --git a/yun-admin/src/main/java/net/lab1024/sa/admin/module/service/domain/form/LawyerStatisticsQueryForm.java b/yun-admin/src/main/java/net/lab1024/sa/admin/module/service/domain/form/LawyerStatisticsQueryForm.java new file mode 100644 index 0000000..97ce9b6 --- /dev/null +++ b/yun-admin/src/main/java/net/lab1024/sa/admin/module/service/domain/form/LawyerStatisticsQueryForm.java @@ -0,0 +1,38 @@ +package net.lab1024.sa.admin.module.service.domain.form; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import net.lab1024.sa.base.common.domain.PageParam; + +import javax.validation.constraints.Pattern; +import java.time.LocalDateTime; + +/** + * 律师统计查询表单 + * + * @author wzh + */ +@Data +@Schema(description = "律师统计查询表单") +public class LawyerStatisticsQueryForm extends PageParam { + + @Schema(description = "季度,1,2,3,4") + private Integer quarter; + + @Schema(description = "年度,格式:yyyy") + private Integer year; + + @Schema(description = "律师姓名") + private String lawyerName; + + @Schema(description = "律所名称") + private String firmName; + + @Schema(description = "开始时间") + private String startTime; + + @Schema(description = "结束时间") + private String endTime; + + private Long userId; +} \ No newline at end of file diff --git a/yun-admin/src/main/java/net/lab1024/sa/admin/module/service/domain/vo/LawyerStatisticsVO.java b/yun-admin/src/main/java/net/lab1024/sa/admin/module/service/domain/vo/LawyerStatisticsVO.java new file mode 100644 index 0000000..1cc6df6 --- /dev/null +++ b/yun-admin/src/main/java/net/lab1024/sa/admin/module/service/domain/vo/LawyerStatisticsVO.java @@ -0,0 +1,37 @@ +package net.lab1024.sa.admin.module.service.domain.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.math.BigDecimal; + +/** + * 律师统计信息 VO + * + * @Author wzh + */ + +@Data +@Schema(description = "律师统计信息") +public class LawyerStatisticsVO { + + private Long userId; + + @Schema(description = "执业律师姓名") + private String lawyerName; + + @Schema(description = "执业证号") + private String certificateNumber; + + @Schema(description = "季度累计服务时长") + private Double quarterlyServiceDuration; + + @Schema(description = "季度累计服务成本") + private BigDecimal quarterlyServiceCost; + + @Schema(description = "年度累计服务时长") + private Double annualServiceDuration; + + @Schema(description = "年度累计服务成本") + private BigDecimal annualServiceCost; +} \ No newline at end of file diff --git a/yun-admin/src/main/java/net/lab1024/sa/admin/module/service/service/ServiceApplicationsService.java b/yun-admin/src/main/java/net/lab1024/sa/admin/module/service/service/ServiceApplicationsService.java index 1144794..740f1d1 100644 --- a/yun-admin/src/main/java/net/lab1024/sa/admin/module/service/service/ServiceApplicationsService.java +++ b/yun-admin/src/main/java/net/lab1024/sa/admin/module/service/service/ServiceApplicationsService.java @@ -15,10 +15,13 @@ import net.lab1024.sa.admin.module.business.goods.service.GoodsService; import net.lab1024.sa.admin.module.service.dao.ServiceApplicationsDao; import net.lab1024.sa.admin.module.service.domain.entity.ServiceApplicationsEntity; import net.lab1024.sa.admin.module.service.domain.form.*; +import net.lab1024.sa.admin.module.service.domain.form.LawyerStatisticsQueryForm; +import net.lab1024.sa.admin.common.enums.DateTimeEnum; import net.lab1024.sa.admin.module.service.domain.vo.ActivityCategoryConverter; import net.lab1024.sa.admin.module.service.domain.vo.ActivityNameConverter; import net.lab1024.sa.admin.module.service.domain.vo.EmployeeNameConverter; import net.lab1024.sa.admin.module.service.domain.vo.OrganizationNameConverter; +import net.lab1024.sa.admin.module.service.domain.vo.LawyerStatisticsVO; import net.lab1024.sa.admin.module.service.domain.vo.ServiceApplicationsTemplateVO; import net.lab1024.sa.admin.module.service.domain.vo.ServiceApplicationsVO; import net.lab1024.sa.admin.module.system.department.domain.entity.DepartmentEntity; @@ -26,6 +29,7 @@ import net.lab1024.sa.admin.module.system.department.service.DepartmentService; import net.lab1024.sa.admin.module.system.employee.domain.entity.EmployeeEntity; import net.lab1024.sa.admin.module.system.employee.service.EmployeeService; import net.lab1024.sa.admin.util.AdminRequestUtil; +import net.lab1024.sa.admin.util.DateTimeUtil; import net.lab1024.sa.base.common.domain.PageResult; import net.lab1024.sa.base.common.domain.RequestUser; import net.lab1024.sa.base.common.domain.ResponseDTO; @@ -578,4 +582,52 @@ public class ServiceApplicationsService { // 在创建Sheet前执行的逻辑,这里不需要处理 } } + + /** + * 获取律师统计信息 + */ + public List getLawyerStatistics() { + return serviceApplicationsDao.getLawyerStatistics(); + } + + /** + * 获取律师统计信息(带查询参数) + */ + public PageResult getLawyerStatistics(LawyerStatisticsQueryForm queryForm) { + Page page = SmartPageUtil.convert2PageQuery(queryForm); + + //根据year拼接年度的开始时间和结束时间 + String yearStart = DateTimeUtil.getYearStartAndEnd().getStartTime(); + String yearEnd = DateTimeUtil.getYearStartAndEnd().getEndTime(); + queryForm.setStartTime(yearStart); + queryForm.setEndTime(yearEnd); + //统计当前年度的 + List lawyerStatisticsWithParamYear = serviceApplicationsDao.getLawyerStatisticsWithParamYear(page, queryForm); + PageResult lawyerStatisticsVOPageResult = SmartPageUtil.convert2PageResult(page, lawyerStatisticsWithParamYear); + //在统计月度的 + if (queryForm.getQuarter() == null) { + //获取当前月份上一季度的开始时间和结束时间 + String quarterStart = DateTimeUtil.getStartQuarter().getStartTime(); + String quarterEnd = DateTimeUtil.getStartQuarter().getEndTime(); + queryForm.setStartTime(quarterStart.toString()); + queryForm.setEndTime(quarterEnd.toString()); + } else{ + //根据季度获取季度的开发时间和 + LocalDateTime quarterStart = DateTimeEnum.getQuarterStart(queryForm.getYear(), queryForm.getQuarter()); + //结束时间 + LocalDateTime quarterEnd = DateTimeEnum.getQuarterEnd(queryForm.getYear(), queryForm.getQuarter()); + queryForm.setStartTime(quarterStart.toString()); + queryForm.setEndTime(quarterEnd.toString()); + } + + if (!lawyerStatisticsVOPageResult.getList().isEmpty()) { + for (LawyerStatisticsVO statisticsVO : lawyerStatisticsVOPageResult.getList()) { + queryForm.setUserId(statisticsVO.getUserId()); + //季度服务时间范围 + LawyerStatisticsVO quarterStatisticsVO = serviceApplicationsDao.getLawyerStatistic(queryForm); + statisticsVO.setQuarterlyServiceDuration(quarterStatisticsVO.getQuarterlyServiceDuration()); + } + } + return lawyerStatisticsVOPageResult; + } } \ No newline at end of file diff --git a/yun-admin/src/main/java/net/lab1024/sa/admin/util/DateTimeUtil.java b/yun-admin/src/main/java/net/lab1024/sa/admin/util/DateTimeUtil.java new file mode 100644 index 0000000..5b15261 --- /dev/null +++ b/yun-admin/src/main/java/net/lab1024/sa/admin/util/DateTimeUtil.java @@ -0,0 +1,90 @@ +package net.lab1024.sa.admin.util; + +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.ZoneId; +import java.time.format.DateTimeFormatter; +import java.util.Calendar; +import java.util.Date; + +/** + * @program: yun-parent + * @description: 时间工具 + * @author: Mr.Wang + * @create: 2025-12-24 16:24 + **/ +public class DateTimeUtil { + /** + * 获取当前日期上一季度 开始时间 + * + * @return + */ + public static TimeVo getStartQuarter() { + // 获取当前日期 + LocalDate today = LocalDate.now(); + TimeVo timeVo = new TimeVo(); + // 计算上个季度的起始和结束日期 + LocalDate startOfLastQuarter; + LocalDate endOfLastQuarter; + int month = today.getMonthValue(); + int year = today.getYear(); + + if (month >= 1 && month <= 3) { + // 当前是第一季度,上个季度是上一年第四季度 + startOfLastQuarter = LocalDate.of(year - 1, 10, 1); + endOfLastQuarter = LocalDate.of(year - 1, 12, 31); + } else if (month >= 4 && month <= 6) { + // 当前是第二季度,上个季度是上一年第一季度 + startOfLastQuarter = LocalDate.of(year - 1, 1, 1); + endOfLastQuarter = LocalDate.of(year - 1, 3, 31); + } else if (month >= 7 && month <= 9) { + // 当前是第三季度,上个季度是本年第一季度 + startOfLastQuarter = LocalDate.of(year, 1, 1); + endOfLastQuarter = LocalDate.of(year, 3, 31); + } else { + // 当前是第四季度,上个季度是本年第三季度 + startOfLastQuarter = LocalDate.of(year, 7, 1); + endOfLastQuarter = LocalDate.of(year, 9, 30); + } + + // 格式化日期以便输出 + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + + // 输出上个季度的起始和结束日期 + String startTime = startOfLastQuarter.format(formatter); + String endTime = endOfLastQuarter.format(formatter); + timeVo.setStartTime(startTime); + timeVo.setEndTime(endTime); + return timeVo; + } + + /** + * 获取当前年度 + */ + public static Integer getCurrentYear() { + // 获取当前日期 + LocalDate today = LocalDate.now(); + return today.getYear(); + } + + /** + * 当前年度的开始时间和结束时间 + */ + public static TimeVo getYearStartAndEnd() { + TimeVo timeVo = new TimeVo(); + LocalDate currentDate = LocalDate.now(); + LocalDate beginOfYear = currentDate.withDayOfYear(1); + LocalDate endOfYear = currentDate.withDayOfYear(currentDate.lengthOfYear()); + + //格式化 + //DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd hh:mm:ss"); + + // 输出上个季度的起始和结束日期 + //String startTime = beginOfYear.format(formatter); + //String endTime = endOfYear.format(formatter); + + timeVo.setYearStart(beginOfYear.toString()); + timeVo.setYearEnd(endOfYear.toString()); + return timeVo; + } +} diff --git a/yun-admin/src/main/java/net/lab1024/sa/admin/util/TimeVo.java b/yun-admin/src/main/java/net/lab1024/sa/admin/util/TimeVo.java new file mode 100644 index 0000000..966bb9b --- /dev/null +++ b/yun-admin/src/main/java/net/lab1024/sa/admin/util/TimeVo.java @@ -0,0 +1,19 @@ +package net.lab1024.sa.admin.util; + +import lombok.Data; + +/** + * @program: yun-parent + * @description: 时间格式 + * @author: Mr.Wang + * @create: 2025-12-25 09:03 + **/ +@Data +public class TimeVo { + private String startTime; + private String endTime; + + private String yearStart; + + private String yearEnd; +} diff --git a/yun-admin/src/main/resources/mapper/service/ServiceApplicationsMapper.xml b/yun-admin/src/main/resources/mapper/service/ServiceApplicationsMapper.xml index 75605c4..2b47f4f 100644 --- a/yun-admin/src/main/resources/mapper/service/ServiceApplicationsMapper.xml +++ b/yun-admin/src/main/resources/mapper/service/ServiceApplicationsMapper.xml @@ -33,7 +33,8 @@ t_service_applications.certificate_number, t_service_applications.activity_category_id, t_service_applications.activity_name_id, - t_service_applications.attachment_ids + t_service_applications.attachment_ids, + t_service_applications.report_time @@ -103,4 +104,105 @@ + + + + + + + + \ No newline at end of file diff --git a/yun-admin/target/classes/mapper/business/goods/GoodsMapper.xml b/yun-admin/target/classes/mapper/business/goods/GoodsMapper.xml index aeef387..561ac24 100644 --- a/yun-admin/target/classes/mapper/business/goods/GoodsMapper.xml +++ b/yun-admin/target/classes/mapper/business/goods/GoodsMapper.xml @@ -28,7 +28,7 @@ - ORDER BY goods_id DESC + ORDER BY create_time DESC + SELECT + e.actual_name AS lawyerName, + tsa.certificate_number AS certificateNumber, + COALESCE(SUM(CASE WHEN tsa.service_start >= DATE_FORMAT(DATE_SUB(NOW(), INTERVAL 3 MONTH), '%Y-%m-01') THEN tsa.service_duration ELSE 0 END), 0) AS quarterlyServiceDuration, + COALESCE(SUM(CASE WHEN tsa.service_start >= DATE_FORMAT(DATE_SUB(NOW(), INTERVAL 3 MONTH), '%Y-%m-01') THEN tsa.workload_score ELSE 0 END), 0) AS quarterlyServiceCost, + COALESCE(SUM(CASE WHEN YEAR(tsa.service_start) = YEAR(NOW()) THEN tsa.service_duration ELSE 0 END), 0) AS annualServiceDuration, + COALESCE(SUM(CASE WHEN YEAR(tsa.service_start) = YEAR(NOW()) THEN tsa.workload_score ELSE 0 END), 0) AS annualServiceCost + FROM t_service_applications tsa + LEFT JOIN t_employee e ON tsa.user_id = e.employee_id + LEFT JOIN t_department d ON tsa.firm_id = d.department_id + WHERE tsa.deleted_flag = 0 + GROUP BY tsa.user_id, tsa.certificate_number, e.actual_name + ORDER BY e.actual_name + + + + + + + \ No newline at end of file diff --git a/yun-admin/target/classes/net/lab1024/sa/admin/module/service/controller/ServiceApplicationsController.class b/yun-admin/target/classes/net/lab1024/sa/admin/module/service/controller/ServiceApplicationsController.class index 2317ade0ac636c545d83f70dace3d06b8d23176e..69a909fd983934058eb4a2fa7c673e08d0617a67 100644 GIT binary patch literal 7559 zcmc&&TXPi06+SHqi4}`6kYHh%J5B_|9x&J;2xDZ4TUd~+6^b3=#J#(%)u5f3WoCAT zjPW(Lu?PknE}?QUa)l~a9t^1vtoVZ8^E=o@y!k1QDW9Ips&~`_vun91m3n4&y3c(5 zo$s7J-T(dn7qqs;Z1m}72bw-_}%Y$^Db}R}si(8`ZWKeLR2 znPxb$dAq8s_6`D#9qR@OG<6#pMqoig)!D&7W9W5|(tdC~#!*6s%vYs(CisTI$rY1B00ynrDUv{nw znoCiODQQE~3|;Z8AU}EZ6zdu2t)St9qfRw47@TTS&Fa)Hm^jt{J=m#kkH8G~39?hj z*)w`e)$1`)G-OU0?Csove+1SgR70^wX*P@EC~j5^Y6)_+l-@iu9XVs)7OS9X)Epzw zRyz6K-HCsfKfXG3?UR)|X~7;g%$1|B4ik7fVVGIP%A2a59WtrLMh$aB8D%LYrRo{M zw$f)<_5qsDV@EVTr$}=J^u%&M?8ISR}BlI(!Gl^3@^S=7lh#Q!@?`${@c*v#YCz_EA1to0(N9AUYlW z3?W(e^G0S2jW^OvhQNtgk!4pVQ)m3OAPP7751O!JUqtxgxVx>#H<_RfYE z1vmuGKj0aL`tr{=$``L!`?6i?OW#+rf?=Egve{%sm5t(JT>5OHd}T6W#i zirVSnWFe)gHUT<=P014J7!%cz5T`Ct3AF_Dy1r4u8^gNsvgaj z=k}fsAtU*8)HnxRGv?!B>essaaP?R$u}a{@S@>88VeNOmx;S;~T=~*X8E0D}R|b2S zP#A2GQteWw9Iu-433=JS&FA@<$O!tVJ?vN9$ZQPLx*wzMm{&@l{4HdX^72I(zDydRPui2`sc+36@S?xqCUf1pU#{%#-m=mrh@}J^2rrX*uQYz?qcKSGBxh+DU(N zmFftkS;Oj8%~R7>4)}Mw)f}rMi!}}5I0Bn${uF`Y4~{P+JQkI%eN}q*YIP=AEtPkG z(p56i1o}i5w^wO81uKgC;fyh==M0(|U|K%s)GZs_9C6IShDub1Z9A{*#fEzsfAF_y zoqXpy*Yq}R1R{^)(*AU!{MT=8PoA3k`s->=9+z@56XseOEi=0<&N4eeN5`0%cIo@=`#W);*gK_v3e{q;UUgD1wQgJu}BXKwi zeIh3?8M=FRj^YTsUV98kJX%{!PwN`J@Q$-i?7@862;j$Y7M#%_6MAQ{aVoDvb1SA>;K&_|%No zALDgCUQy%Nw&9b4SAy3$>putbPrPY>rP%V$fQBB$Htu$Sc6bb*@Vp0>!yISuPVC*l zd#t|!4I6Gk<0Ld)$7j*TddJ2Rx1VQ&+gt%F(bg)b_i6{=8fb(y_}f|w9*3Xc%});l zv7iIiRqofr1{@FrvIH+b!~ZAne;%Lblim-6N2v$zS^S;Di+S+o1hH)ru*E9aVz3FG zs$kn3#I{Ai_OyWQnF!c0d4ynV4r1FHg6$Wut%9vHh;6%o?O6fajtJN=r-fi^31Zt( z54N2Gwk`qN^AWIhLk~1LlIsolbS}r%C}_4P1lumyjlAu_-macwunYE9nA{g+@|ObI z{Q}yABe@nHG+c6oF9062pxk0X+V+P)>xI4wkQahL`XPxg-B1`1fE=0zGUx!oMJU97 ztwA9DAwce_`xga9UJ`)(I)eWWhx%_`(0?z5V5`x8zY);BETH}EG;OZ`4u|?L9;EG+ z5NP-G-|qzfy&?zV`VXsy5FyPE0?CE|NkgV0Bo-9XkibY*05Uwyi0TLlD;EqhzBqIR zg6*N{1)|l-tUAmEBLqwiGz7y}9wD*o0vm<^B9C2lXZngu7m0|yCh7XSbN delta 1823 zcmbW2$x{^$e1`(5O9JKa6ya&#VxqSARsC#inv5gL|kyi4dad)cicV9f8fER zC8g!TgLkd+U-9bA@_UoiOxIKfmqT9no9^lU&G)_Tj3?hF(%*i4{sJI@*CABlY7k*u z3*kC$gm4pM(z_+$wuCzp@)GV!xF_Mhga;BHN_eE>v5s+TsM4Gm{Ta62R8REHfN5Yl zs&zauP>-iNo*8(K7Y5p}#K20dGSDHR8!rv?VY`8}3}hsICFx-tF>o4ZG*|<*%^$wj zeAnWbOVlc&YY52dY-^ZRu&rflu;s>#5v#*AV|B$bpb;~RU|F^ic-t_EfiYs_rO zyK`gqT$4MyV}-(zP&nHEf`g_YPY!~m2q@nl zjDJL+^%E-IGYP;Isoe)|HP$$AYrSwu1#X=JmvZ6qzACX=#HHKu-TEV*DKo=MYgR9*fzVEbd7IH zF==v)P@XTTQP8VVuMgV}^gARwy(9zJ#leC^yA_f>F3Dax$T>XBK5m7)B>g@llh*k@ zMU(vs$pN(d`M_n0ZoP}DZl!%V{?VBav$0ye9EpHUiiFcB38COnv>fm wWM4xgn2NJL8;@|L@He1b$LEw!Kd)?ffy-UwvH^_RjA8aJG0$;{%Q;;64Sj8#Y5)KL diff --git a/yun-admin/target/classes/net/lab1024/sa/admin/module/service/dao/ServiceApplicationsDao.class b/yun-admin/target/classes/net/lab1024/sa/admin/module/service/dao/ServiceApplicationsDao.class index 3906705462914ccaaeec095764b9b8850c2db331..4833ba01dbf7ed358a5b2cd5a976e95d663c3b9e 100644 GIT binary patch delta 481 zcmeC=ej+G*>ff$?3=9k=3>xeVs_YDE>6#;jc#aQX=+iW zTYgclwdTZl9kH@}eRLH-Yd7mN&tPQan0$g|aXkwogE)f(10w?)FhH3YB!PS>25BG* z!k1y-0E+W50SQJ1P9WwgX5a>@ktITn9D_Vi14us)Ba&_gW~kW;42lebAWM}Pl!1!a JfNE427yw5ddDZ{` delta 70 zcmaDN*vTz?>ff$?3=9k=4D##@GVBbp>Q zMBL6<>!8t|(qx02v-h0Gae){vlE5XBxlB4&$mJ?4XkiVltm7IR!dz!7H`&2$ifN~m z`;>8qa_&;aJsNmOBOQ^oGg2PWMK=RH<|9w|N4El=Da3On@ItBdXdy4PmRBmIS4F(m z4&JDQKJBMphZxW?hE&g>j`LPcyi@oVAJoPtb@D}BjHsJYz2vio`KA%R>nA_lSbn)U ze!CR@xOD!y)e*0gxlO_q$+=>Aw?~1i)fm^HDA%lU?v|omhhp3ljdwi?xjs#FgNk)S zn&3ti@6lB6l^FK1n&sm(-A~p`KTAnIO|yNb=J>TAf(wSamcpDgQsJQHY)Z delta 557 zcmWN}TTISz9LMqR`}6z#Q%cPvwPNLhXc<~1shKTnHWn_L4Hw`Wob?uxnOzjUi<8`cYjfT(akNP>D$axWif2Gcy`z{c3KM6 z?fXIrQQ_Sd5VlzMMCLlnV83N@z;bD{d=6Rx^|pcrE2GIaaM(7}Y*n;aEywK`C#;o| zb}QmLoU+H9wq9Coh_m*Yb2!cu$3>F4Lu{O+gHqlN6x2U9p zUEHOX+w7&21|nJRM^XrruAB*1DRb4r9hKZE1+Gm|u0xaDV@10j#kkj+>;^Q&4JpcuK%gL04)yUl^-N&Nsy+3AVWn#rj`a-Dh%?q%u38uVoR;S SX4)ESZ%jSpC~i(oTmB!#UWtzY diff --git a/yun-admin/target/classes/net/lab1024/sa/admin/module/service/service/ServiceApplicationsService.class b/yun-admin/target/classes/net/lab1024/sa/admin/module/service/service/ServiceApplicationsService.class index f8709d26372ce83573de1ec886a90312f93f28ba..7a9ce44848fc2719d9f129e08429a279ea12d540 100644 GIT binary patch delta 6731 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