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 index 28b6f15..3f4142f 100644 --- 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 @@ -32,6 +32,43 @@ public enum DateTimeEnum implements BaseEnum { private String desc; private String timePattern; + /** + * 获取指定年月的第一天开始时间 + * @param year 年份 + * @param month 月份 (1-12) + * @return 该月第一天的00:00:00 + */ + public static LocalDateTime getMonthStart(Integer year, Integer month) { + if (year == null || month == null) { + throw new IllegalArgumentException("年份和月份不能为空"); + } + if (month < 1 || month > 12) { + throw new IllegalArgumentException("月份必须在1-12之间"); + } + return LocalDateTime.of(year, month, 1, 0, 0, 0); + } + + /** + * 获取指定年月的最后一天结束时间 + * @param year 年份 + * @param month 月份 (1-12) + * @return 该月最后一天的23:59:59 + */ + public static LocalDateTime getMonthEnd(Integer year, Integer month) { + if (year == null || month == null) { + throw new IllegalArgumentException("年份和月份不能为空"); + } + if (month < 1 || month > 12) { + throw new IllegalArgumentException("月份必须在1-12之间"); + } + // 获取下个月的第一天,然后减去1秒就是本月的最后时刻 + if (month == 12) { + return LocalDateTime.of(year + 1, 1, 1, 0, 0, 0).minusSeconds(1); + } else { + return LocalDateTime.of(year, month + 1, 1, 0, 0, 0).minusSeconds(1); + } + } + @Override public Integer getValue() { return value; diff --git a/yun-admin/src/main/java/net/lab1024/sa/admin/common/enums/ReviewEnum.java b/yun-admin/src/main/java/net/lab1024/sa/admin/common/enums/ReviewEnum.java index 36e9800..9b07deb 100644 --- a/yun-admin/src/main/java/net/lab1024/sa/admin/common/enums/ReviewEnum.java +++ b/yun-admin/src/main/java/net/lab1024/sa/admin/common/enums/ReviewEnum.java @@ -7,8 +7,6 @@ public enum ReviewEnum implements BaseEnum { APPROVAL(1, "待审核"), - REVIEW(2, "审核中"), - PASS(3, "已通过"), REFUSE(4, "拒绝"); diff --git a/yun-admin/src/main/java/net/lab1024/sa/admin/module/cost/controller/FirmReportsController.java b/yun-admin/src/main/java/net/lab1024/sa/admin/module/cost/controller/FirmReportsController.java index 86fad5b..a8ea526 100644 --- a/yun-admin/src/main/java/net/lab1024/sa/admin/module/cost/controller/FirmReportsController.java +++ b/yun-admin/src/main/java/net/lab1024/sa/admin/module/cost/controller/FirmReportsController.java @@ -3,22 +3,22 @@ package net.lab1024.sa.admin.module.cost.controller; import net.lab1024.sa.admin.module.cost.domain.form.FirmReportsAddForm; import net.lab1024.sa.admin.module.cost.domain.form.FirmReportsQueryForm; import net.lab1024.sa.admin.module.cost.domain.form.FirmReportsUpdateForm; +import net.lab1024.sa.admin.module.cost.domain.vo.FirmReportsCountVO; import net.lab1024.sa.admin.module.cost.domain.vo.FirmReportsVO; import net.lab1024.sa.admin.module.cost.service.FirmReportsService; +import net.lab1024.sa.admin.util.DateTimeUtil; import net.lab1024.sa.base.common.domain.ValidateList; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.*; import cn.dev33.satoken.annotation.SaCheckPermission; import net.lab1024.sa.base.common.domain.ResponseDTO; import net.lab1024.sa.base.common.domain.PageResult; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RestController; import io.swagger.v3.oas.annotations.tags.Tag; import io.swagger.v3.oas.annotations.Operation; import javax.annotation.Resource; import javax.validation.Valid; +import java.time.LocalDate; +import java.time.Month; /** * 律师事务所年度经营报表 Controller @@ -34,6 +34,19 @@ public class FirmReportsController { @Resource private FirmReportsService firmReportsService; + @Operation(summary = "查询有无填报 @author wzh") + @GetMapping("/firmReports/query") + public ResponseDTO query() { + //根据当前时间去推理去上一个月的月份和年度,考虑到跨年情况 + LocalDate now = LocalDate.now(); + LocalDate previousMonth = now.minusMonths(1); + + int previousYear = previousMonth.getYear(); + int previousMonthValue = previousMonth.getMonthValue(); + + + return firmReportsService.query(previousMonthValue, previousYear); + } @Operation(summary = "分页查询 @author wzh") @PostMapping("/firmReports/queryPage") @@ -76,4 +89,94 @@ public class FirmReportsController { public ResponseDTO commit(@RequestBody ValidateList idList) { return firmReportsService.commit(idList); } + + //查询本年度已经提交的收入和成本 + @Operation(summary = "查询本年度已经提交的收入 @author wzh") + @PostMapping("/firmReports/income") + public ResponseDTO income() { + return ResponseDTO.ok(firmReportsService.income()); + } + //查询本年度已经提交的成本 + @Operation(summary = "查询本年度已经提交的成本 @author wzh") + @PostMapping("/firmReports/cost") + public ResponseDTO firmReportsCost() { + return ResponseDTO.ok(firmReportsService.firmReportsCost()); + } + + /** + * 根据指定年月判断所属季度(已考虑跨年情况) + * @param year 年份 + * @param month 月份 (1-12) + * @return 季度编号(1-4) + */ + private int getQuarterByYearMonth(Integer year, Integer month) { + // 参数验证 + if (year == null || month == null) { + throw new IllegalArgumentException("年份和月份参数不能为空"); + } + + if (month < 1 || month > 12) { + throw new IllegalArgumentException("月份必须在1-12之间"); + } + + // 使用指定的年月创建日期对象进行判断 + Month targetMonth = Month.of(month); + int dayOfMonth = 1; // 默认使用月份第一天进行判断 + + // 第一季度:1月-3月,或4月1日-4月4日 + if (targetMonth.getValue() < 4 || (targetMonth.getValue() == 4 && dayOfMonth < 5)) { + return 1; + } + // 第二季度:4月5日-6月30日,或7月1日-7月4日 + else if ((targetMonth.getValue() == 4 && dayOfMonth >= 5) || + (targetMonth.getValue() > 4 && targetMonth.getValue() < 7) || + (targetMonth.getValue() == 7 && dayOfMonth < 5)) { + return 2; + } + // 第三季度:7月5日-9月30日,或10月1日-10月4日 + else if ((targetMonth.getValue() == 7 && dayOfMonth >= 5) || + (targetMonth.getValue() > 7 && targetMonth.getValue() < 10) || + (targetMonth.getValue() == 10 && dayOfMonth < 5)) { + return 3; + } + // 第四季度:10月5日-12月31日(包含跨年情况) + else { + return 4; + } + } + + /** + * 根据当前日期判断所属季度(已考虑跨年情况) + * 第一季度:1月1日-4月4日 + * 第二季度:4月5日-7月4日 + * 第三季度:7月5日-10月4日 + * 第四季度:10月5日-12月31日 + * @return 季度编号(1-4) + */ + private int getCurrentQuarter() { + LocalDate today = LocalDate.now(); + Month month = today.getMonth(); + int dayOfMonth = today.getDayOfMonth(); + + // 第一季度:1月-3月,或4月1日-4月4日 + if (month.getValue() < 4 || (month.getValue() == 4 && dayOfMonth < 5)) { + return 1; + } + // 第二季度:4月5日-6月30日,或7月1日-7月4日 + else if ((month.getValue() == 4 && dayOfMonth >= 5) || + (month.getValue() > 4 && month.getValue() < 7) || + (month.getValue() == 7 && dayOfMonth < 5)) { + return 2; + } + // 第三季度:7月5日-9月30日,或10月1日-10月4日 + else if ((month.getValue() == 7 && dayOfMonth >= 5) || + (month.getValue() > 7 && month.getValue() < 10) || + (month.getValue() == 10 && dayOfMonth < 5)) { + return 3; + } + // 第四季度:10月5日-12月31日(包含跨年情况) + else { + return 4; + } + } } diff --git a/yun-admin/src/main/java/net/lab1024/sa/admin/module/cost/dao/FirmReportsDao.java b/yun-admin/src/main/java/net/lab1024/sa/admin/module/cost/dao/FirmReportsDao.java index 81cbb21..a0ea796 100644 --- a/yun-admin/src/main/java/net/lab1024/sa/admin/module/cost/dao/FirmReportsDao.java +++ b/yun-admin/src/main/java/net/lab1024/sa/admin/module/cost/dao/FirmReportsDao.java @@ -3,9 +3,11 @@ package net.lab1024.sa.admin.module.cost.dao; import java.util.List; import net.lab1024.sa.admin.module.cost.domain.entity.FirmReportsEntity; import net.lab1024.sa.admin.module.cost.domain.form.FirmReportsQueryForm; +import net.lab1024.sa.admin.module.cost.domain.vo.FirmReportsCountVO; import net.lab1024.sa.admin.module.cost.domain.vo.FirmReportsVO; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import net.lab1024.sa.base.common.domain.ResponseDTO; import net.lab1024.sa.base.common.domain.ValidateList; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -49,4 +51,16 @@ public interface FirmReportsDao extends BaseMapper { FirmReportsEntity selectList(@Param("declareQuarter") String declareQuarter, @Param("declareYear") Integer declareYear, @Param("firmId") Integer firmId); + + /* + * 查询当前律所有没有填报的报表 + */ + boolean query(@Param("currentQuarter")Integer currentQuarter, + @Param("currentYear")Integer currentYear, + @Param("departmentId") Long departmentId); + + + FirmReportsCountVO income(@Param("departmentId") Long departmentId, @Param("currentYear") Integer currentYear); + + Long firmReportsCost(@Param("departmentId") Long departmentId,@Param("currentYear") Integer currentYear); } diff --git a/yun-admin/src/main/java/net/lab1024/sa/admin/module/cost/domain/entity/FirmReportsEntity.java b/yun-admin/src/main/java/net/lab1024/sa/admin/module/cost/domain/entity/FirmReportsEntity.java index 026ef00..f092947 100644 --- a/yun-admin/src/main/java/net/lab1024/sa/admin/module/cost/domain/entity/FirmReportsEntity.java +++ b/yun-admin/src/main/java/net/lab1024/sa/admin/module/cost/domain/entity/FirmReportsEntity.java @@ -46,7 +46,10 @@ public class FirmReportsEntity { * 报表所属季度 */ private String declareQuarter; - + /** + * 所属月份 + */ + private Integer declareMonth; /** * 营业收入(单位:万元) */ diff --git a/yun-admin/src/main/java/net/lab1024/sa/admin/module/cost/domain/form/FirmReportsAddForm.java b/yun-admin/src/main/java/net/lab1024/sa/admin/module/cost/domain/form/FirmReportsAddForm.java index 4787a81..62325bd 100644 --- a/yun-admin/src/main/java/net/lab1024/sa/admin/module/cost/domain/form/FirmReportsAddForm.java +++ b/yun-admin/src/main/java/net/lab1024/sa/admin/module/cost/domain/form/FirmReportsAddForm.java @@ -31,7 +31,7 @@ public class FirmReportsAddForm { * 报表所属季度 */ private String declareQuarter; - + private Integer declareMonth; /** * 营业收入(单位:万元) */ diff --git a/yun-admin/src/main/java/net/lab1024/sa/admin/module/cost/domain/form/FirmReportsQueryForm.java b/yun-admin/src/main/java/net/lab1024/sa/admin/module/cost/domain/form/FirmReportsQueryForm.java index 678d7d0..2a11e40 100644 --- a/yun-admin/src/main/java/net/lab1024/sa/admin/module/cost/domain/form/FirmReportsQueryForm.java +++ b/yun-admin/src/main/java/net/lab1024/sa/admin/module/cost/domain/form/FirmReportsQueryForm.java @@ -38,7 +38,7 @@ public class FirmReportsQueryForm extends PageParam { */ private String declareQuarter; - + private Integer declareMonth; /** * 审批状态(存储当前审批人姓名,"-"表示待审批) */ diff --git a/yun-admin/src/main/java/net/lab1024/sa/admin/module/cost/domain/vo/FirmReportsCountVO.java b/yun-admin/src/main/java/net/lab1024/sa/admin/module/cost/domain/vo/FirmReportsCountVO.java new file mode 100644 index 0000000..1f07f82 --- /dev/null +++ b/yun-admin/src/main/java/net/lab1024/sa/admin/module/cost/domain/vo/FirmReportsCountVO.java @@ -0,0 +1,27 @@ +package net.lab1024.sa.admin.module.cost.domain.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.math.BigDecimal; +import java.time.LocalDateTime; + +/** + * 成本列表VO + * + * @Author wzh + * @Date 2026-01-07 15:57:43 + * @Copyright 1.0 + */ + +@Data +public class FirmReportsCountVO { + + + @Schema(description = "营业收入(单位:万元)") + private BigDecimal revenue; + + @Schema(description = "总成本支出(单位:万元)") + private BigDecimal totalCost; + +} diff --git a/yun-admin/src/main/java/net/lab1024/sa/admin/module/cost/domain/vo/FirmReportsVO.java b/yun-admin/src/main/java/net/lab1024/sa/admin/module/cost/domain/vo/FirmReportsVO.java index 0678fab..e0b1d7a 100644 --- a/yun-admin/src/main/java/net/lab1024/sa/admin/module/cost/domain/vo/FirmReportsVO.java +++ b/yun-admin/src/main/java/net/lab1024/sa/admin/module/cost/domain/vo/FirmReportsVO.java @@ -30,7 +30,7 @@ public class FirmReportsVO { @Schema(description = "报表所属年份") private Integer declareYear; - + private Integer declareMonth; @Schema(description = "报表所属季度") private String declareQuarter; diff --git a/yun-admin/src/main/java/net/lab1024/sa/admin/module/cost/service/FirmReportsService.java b/yun-admin/src/main/java/net/lab1024/sa/admin/module/cost/service/FirmReportsService.java index 4af33ce..72ca834 100644 --- a/yun-admin/src/main/java/net/lab1024/sa/admin/module/cost/service/FirmReportsService.java +++ b/yun-admin/src/main/java/net/lab1024/sa/admin/module/cost/service/FirmReportsService.java @@ -10,12 +10,14 @@ import net.lab1024.sa.admin.module.cost.domain.entity.FirmReportsEntity; import net.lab1024.sa.admin.module.cost.domain.form.FirmReportsAddForm; import net.lab1024.sa.admin.module.cost.domain.form.FirmReportsQueryForm; import net.lab1024.sa.admin.module.cost.domain.form.FirmReportsUpdateForm; +import net.lab1024.sa.admin.module.cost.domain.vo.FirmReportsCountVO; import net.lab1024.sa.admin.module.cost.domain.vo.FirmReportsVO; import net.lab1024.sa.admin.module.system.department.service.DepartmentService; import net.lab1024.sa.admin.module.system.login.domain.RequestEmployee; import net.lab1024.sa.admin.module.system.role.domain.vo.RoleVO; import net.lab1024.sa.admin.module.system.role.service.RoleEmployeeService; import net.lab1024.sa.admin.util.AdminRequestUtil; +import net.lab1024.sa.admin.util.DateTimeUtil; import net.lab1024.sa.base.common.code.UnexpectedErrorCode; import net.lab1024.sa.base.common.code.UserErrorCode; import net.lab1024.sa.base.common.domain.RequestUser; @@ -96,7 +98,7 @@ public class FirmReportsService { */ public ResponseDTO add(FirmReportsAddForm addForm) { // 使用lambda表达式和Optional来检查重复数据 - FirmReportsEntity existing = firmReportsDao.selectList(addForm.getDeclareQuarter(), addForm.getDeclareYear(), addForm.getFirmId()); + FirmReportsEntity existing = firmReportsDao.selectList(String.valueOf(addForm.getDeclareMonth()), addForm.getDeclareYear(), addForm.getFirmId()); if (existing != null ) { return ResponseDTO.userErrorParam(UnexpectedErrorCode.DATA_EXIST.getMsg()); } @@ -116,7 +118,7 @@ public class FirmReportsService { */ public ResponseDTO update(FirmReportsUpdateForm updateForm) { // 检查除当前记录外是否还存在相同季度、年度、律所的记录 - FirmReportsEntity existing = firmReportsDao.selectList(updateForm.getDeclareQuarter(), updateForm.getDeclareYear(), updateForm.getFirmId()); + FirmReportsEntity existing = firmReportsDao.selectList(String.valueOf(updateForm.getDeclareMonth()), updateForm.getDeclareYear(), updateForm.getFirmId()); if (existing != null && !existing.getId().equals(updateForm.getId())) { return ResponseDTO.userErrorParam(UnexpectedErrorCode.DATA_EXIST.getMsg()); } @@ -154,4 +156,37 @@ public class FirmReportsService { firmReportsDao.commit(idList); return ResponseDTO.ok(); } + + /** + * 查询当前用户是否可以填报报表 + * @return true-可以填报,false-不可以填报 + */ + public ResponseDTO query(Integer month, Integer Year) { + RequestEmployee requestUser = AdminRequestUtil.getRequestUser(); + List roleIdList = roleEmployeeService.getRoleIdList(requestUser.getEmployeeId()); + String roleCode = roleIdList.get(0).getRoleCode(); + + // 只有律所管理员(CTO)可以填报 + boolean canReport = UserTypeEnum.CTO.getDesc().equals(roleCode); + if (canReport){ + canReport = firmReportsDao.query(month, Year, requestUser.getDepartmentId()); + } + return ResponseDTO.ok(canReport); + } + + public FirmReportsCountVO income() { + // 获取当前用户 + RequestEmployee requestUser = AdminRequestUtil.getRequestUser(); + //本年度 + Integer currentYear = DateTimeUtil.getCurrentYear(); + return firmReportsDao.income(requestUser.getDepartmentId(), currentYear); + } + + public Long firmReportsCost() { + // 获取当前用户 + RequestEmployee requestUser = AdminRequestUtil.getRequestUser(); + //本年度 + Integer currentYear = DateTimeUtil.getCurrentYear(); + return firmReportsDao.firmReportsCost(requestUser.getDepartmentId(), currentYear); + } } \ No newline at end of file diff --git a/yun-admin/src/main/java/net/lab1024/sa/admin/module/letter/controller/LetterController.java b/yun-admin/src/main/java/net/lab1024/sa/admin/module/letter/controller/LetterController.java index 7d8ae15..60d1116 100644 --- a/yun-admin/src/main/java/net/lab1024/sa/admin/module/letter/controller/LetterController.java +++ b/yun-admin/src/main/java/net/lab1024/sa/admin/module/letter/controller/LetterController.java @@ -44,6 +44,11 @@ public class LetterController { public ResponseDTO isLetter(@PathVariable Long userId) { return ResponseDTO.ok(letterService.isLetter(userId)); } + @Operation(summary = "是否签署律所承诺书 @author wzh") + @GetMapping("/letter/isLetterDept/{userId}") + public ResponseDTO isLetterDept(@PathVariable Long userId) { + return ResponseDTO.ok(letterService.isLetterDept(userId)); + } @Operation(summary = "签署承诺书 @author wzh") @PostMapping("/letter/add") diff --git a/yun-admin/src/main/java/net/lab1024/sa/admin/module/letter/service/LetterService.java b/yun-admin/src/main/java/net/lab1024/sa/admin/module/letter/service/LetterService.java index 68614d0..2e26e50 100644 --- a/yun-admin/src/main/java/net/lab1024/sa/admin/module/letter/service/LetterService.java +++ b/yun-admin/src/main/java/net/lab1024/sa/admin/module/letter/service/LetterService.java @@ -86,7 +86,7 @@ public class LetterService { /** - * 是否签署承诺书 + * 是否签署律师承诺书 * @param userId * @return */ @@ -100,14 +100,15 @@ public class LetterService { //构建查询条件:按用户ID和当前年份查询 LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper() .eq(LetterEntity::getUserId, userId) + .eq(LetterEntity::getLetterType, UserTypeEnum.USER.getDesc()) .apply("YEAR(create_time) = {0}", currentYear); - if (UserTypeEnum.USER.getDesc().equals(roleCode)) { - //普通律师:只需要签署一份承诺书 + if (!UserTypeEnum.CEO.getDesc().equals(roleCode)) { + //只需要签署一份承诺书 List letterList = letterDao.selectList(queryWrapper); return !letterList.isEmpty(); - } else if (UserTypeEnum.CTO.getDesc().equals(roleCode)) { + } /*else if (UserTypeEnum.CTO.getDesc().equals(roleCode)) { //律所主任:需要签署两份承诺书(USER类型和CTO类型各一份) List letterList = letterDao.selectList(queryWrapper); @@ -122,13 +123,39 @@ public class LetterService { //两种类型都需要至少一份才能算签约成功 return userTypeCount > 0 && ctoTypeCount > 0; - } else { + }*/ else { //其他角色使用原有逻辑 int letterCount = letterDao.isLetter(userId); return letterCount > 0; } } + /** + * 是否签署律协承诺书 + * @param userId + * @return + */ + public Boolean isLetterDept(Long userId) { + //获取当前年份 + Calendar cal = Calendar.getInstance(); + int currentYear = cal.get(Calendar.YEAR); + + String roleCode = getRoleCode(); + + //构建查询条件:按用户ID和当前年份查询 + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper() + .eq(LetterEntity::getUserId, userId) + .eq(LetterEntity::getLetterType, UserTypeEnum.CTO.getDesc()) + .apply("YEAR(create_time) = {0}", currentYear); + + if (!UserTypeEnum.CEO.getDesc().equals(roleCode)) { + //只需要签署一份承诺书 + List letterList = letterDao.selectList(queryWrapper); + return !letterList.isEmpty(); + + } + return false; + } /** * 新增 */ diff --git a/yun-admin/src/main/java/net/lab1024/sa/admin/module/penalty/dao/PenaltyLawyerDao.java b/yun-admin/src/main/java/net/lab1024/sa/admin/module/penalty/dao/PenaltyLawyerDao.java index f4dede2..f74370e 100644 --- a/yun-admin/src/main/java/net/lab1024/sa/admin/module/penalty/dao/PenaltyLawyerDao.java +++ b/yun-admin/src/main/java/net/lab1024/sa/admin/module/penalty/dao/PenaltyLawyerDao.java @@ -34,4 +34,6 @@ public interface PenaltyLawyerDao extends BaseMapper { List queryPage(Page page, @Param("queryForm") PenaltyLawyerQueryForm queryForm); List selectLawyerPunishList(@Param("licenseNo") String licenseNo); + + List queryNoName(@Param("departmentName") String departmentName); } diff --git a/yun-admin/src/main/java/net/lab1024/sa/admin/module/penalty/domain/entity/PenaltyApplyEntity.java b/yun-admin/src/main/java/net/lab1024/sa/admin/module/penalty/domain/entity/PenaltyApplyEntity.java index 25f76b2..7f0586e 100644 --- a/yun-admin/src/main/java/net/lab1024/sa/admin/module/penalty/domain/entity/PenaltyApplyEntity.java +++ b/yun-admin/src/main/java/net/lab1024/sa/admin/module/penalty/domain/entity/PenaltyApplyEntity.java @@ -74,4 +74,8 @@ public class PenaltyApplyEntity { */ private Integer deletedFlag; + /** + * 类型 + */ + private String type; } diff --git a/yun-admin/src/main/java/net/lab1024/sa/admin/module/penalty/domain/form/PenaltyApplyAddForm.java b/yun-admin/src/main/java/net/lab1024/sa/admin/module/penalty/domain/form/PenaltyApplyAddForm.java index ffdcb07..d4cea77 100644 --- a/yun-admin/src/main/java/net/lab1024/sa/admin/module/penalty/domain/form/PenaltyApplyAddForm.java +++ b/yun-admin/src/main/java/net/lab1024/sa/admin/module/penalty/domain/form/PenaltyApplyAddForm.java @@ -20,4 +20,6 @@ public class PenaltyApplyAddForm { @Schema(description = "申请人用途", requiredMode = Schema.RequiredMode.REQUIRED) @NotNull(message = "申请人用途 不能为空") private String usePurpose; + + private String type; } \ No newline at end of file diff --git a/yun-admin/src/main/java/net/lab1024/sa/admin/module/penalty/domain/form/PenaltyApplyQueryForm.java b/yun-admin/src/main/java/net/lab1024/sa/admin/module/penalty/domain/form/PenaltyApplyQueryForm.java index 9af6504..bc8181a 100644 --- a/yun-admin/src/main/java/net/lab1024/sa/admin/module/penalty/domain/form/PenaltyApplyQueryForm.java +++ b/yun-admin/src/main/java/net/lab1024/sa/admin/module/penalty/domain/form/PenaltyApplyQueryForm.java @@ -49,4 +49,5 @@ public class PenaltyApplyQueryForm extends PageParam { private String userType; private Long userId; + private String type; } diff --git a/yun-admin/src/main/java/net/lab1024/sa/admin/module/penalty/domain/form/PenaltyApplyUpdateForm.java b/yun-admin/src/main/java/net/lab1024/sa/admin/module/penalty/domain/form/PenaltyApplyUpdateForm.java index 17e19e1..343a803 100644 --- a/yun-admin/src/main/java/net/lab1024/sa/admin/module/penalty/domain/form/PenaltyApplyUpdateForm.java +++ b/yun-admin/src/main/java/net/lab1024/sa/admin/module/penalty/domain/form/PenaltyApplyUpdateForm.java @@ -24,4 +24,6 @@ public class PenaltyApplyUpdateForm { @Schema(description = "律协审批状态(0-未提交,1-已提交,2-审核中,3-已批准,5-已驳回)") private Integer auditStatus; + + private String type; } \ No newline at end of file diff --git a/yun-admin/src/main/java/net/lab1024/sa/admin/module/penalty/domain/vo/PenaltyApplyVO.java b/yun-admin/src/main/java/net/lab1024/sa/admin/module/penalty/domain/vo/PenaltyApplyVO.java index 6f6ed14..4bb5919 100644 --- a/yun-admin/src/main/java/net/lab1024/sa/admin/module/penalty/domain/vo/PenaltyApplyVO.java +++ b/yun-admin/src/main/java/net/lab1024/sa/admin/module/penalty/domain/vo/PenaltyApplyVO.java @@ -50,4 +50,5 @@ public class PenaltyApplyVO { @Schema(description = "删除标志(0-正常,1-已删除)") private Integer deletedFlag; + private String type; } diff --git a/yun-admin/src/main/java/net/lab1024/sa/admin/module/penalty/service/PenaltyApplyService.java b/yun-admin/src/main/java/net/lab1024/sa/admin/module/penalty/service/PenaltyApplyService.java index d6e9f2d..62fd6a6 100644 --- a/yun-admin/src/main/java/net/lab1024/sa/admin/module/penalty/service/PenaltyApplyService.java +++ b/yun-admin/src/main/java/net/lab1024/sa/admin/module/penalty/service/PenaltyApplyService.java @@ -11,6 +11,7 @@ import net.lab1024.sa.admin.module.penalty.domain.form.PenaltyApplyAddForm; import net.lab1024.sa.admin.module.penalty.domain.form.PenaltyApplyQueryForm; import net.lab1024.sa.admin.module.penalty.domain.form.PenaltyApplyUpdateForm; import net.lab1024.sa.admin.module.penalty.domain.vo.PenaltyApplyVO; +import net.lab1024.sa.admin.module.system.department.domain.vo.DepartmentVO; 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; @@ -55,6 +56,8 @@ public class PenaltyApplyService { private RoleEmployeeService roleEmployeeService; @Resource private LetterService letterService; + @Resource + private DepartmentService departmentService; /** * 分页查询 */ @@ -84,10 +87,20 @@ public class PenaltyApplyService { Long userId = AdminRequestUtil.getRequestUser().getUserId(); EmployeeEntity entity = employeeService.getById(userId); //判断有没有处罚 - Boolean query = penaltyLawyerService.query(entity.getActualName()); - if (query){ - return ResponseDTO.error(UserErrorCode.FORM_REPEAT_SUBMIT_PENALTY); + if (UserTypeEnum.USER.getDesc().equals(addForm.getType())){ + Boolean query = penaltyLawyerService.query(entity.getActualName()); + if (query){ + return ResponseDTO.error(UserErrorCode.FORM_REPEAT_SUBMIT_PENALTY); + } + }else { + //查询机构名称 + DepartmentVO departmentById = departmentService.getDepartmentById(entity.getDepartmentId()); + Boolean query = penaltyLawyerService.queryNoName(departmentById.getDepartmentName()); + if (query){ + return ResponseDTO.error(UserErrorCode.FORM_REPEAT_SUBMIT_PENALTY); + } } + PenaltyApplyEntity penaltyApplyEntity = SmartBeanUtil.copy(addForm, PenaltyApplyEntity.class); penaltyApplyEntity.setUserId(userId); String roleCode = letterService.getRoleCode(); diff --git a/yun-admin/src/main/java/net/lab1024/sa/admin/module/penalty/service/PenaltyLawyerService.java b/yun-admin/src/main/java/net/lab1024/sa/admin/module/penalty/service/PenaltyLawyerService.java index a76aab9..ecfb8ed 100644 --- a/yun-admin/src/main/java/net/lab1024/sa/admin/module/penalty/service/PenaltyLawyerService.java +++ b/yun-admin/src/main/java/net/lab1024/sa/admin/module/penalty/service/PenaltyLawyerService.java @@ -95,4 +95,12 @@ public class PenaltyLawyerService { } return false; } + + public Boolean queryNoName(String departmentName) { + List penaltyLawyerEntities = penaltyLawyerDao.queryNoName(departmentName); + if (CollectionUtils.isNotEmpty(penaltyLawyerEntities)) { + return true; + } + return false; + } } 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 3e7655a..95baf96 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 @@ -138,7 +138,7 @@ public class ServiceApplicationsController { @Operation(summary = "律师统计信息 @author wzh") @PostMapping("/serviceApplications/statistics") //@SaCheckPermission("serviceApplications:statistics") - public ResponseDTO> getLawyerStatistics(@RequestBody @Valid LawyerStatisticsQueryForm queryForm) { + public ResponseDTO> getLawyerStatistics(@RequestBody @Valid LawyerStatisticsQueryForm queryForm) { return ResponseDTO.ok(serviceApplicationsService.getLawyerStatistics(queryForm)); } @@ -175,6 +175,7 @@ public class ServiceApplicationsController { public ResponseDTO getServiceApplicationsCost(@RequestBody ServiceLawyerQueryForm queryForm) { return ResponseDTO.ok(serviceApplicationsService.getServiceApplicationsCost(queryForm)); } + //部门id批量审核 @Operation(summary = "部门id批量审核部门下数据 @author wzh") @PostMapping("/serviceApplications/batchReviewByDepartmentId") 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 e83fa00..d023a33 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 @@ -139,5 +139,15 @@ public interface ServiceApplicationsDao extends BaseMapper getLawyerAmountStatistics(@Param("queryForm") LawyerStatisticsQueryForm queryForm); + List selectByRecordNoNotMy(@Param("userId") Long userId, @Param("recordNo") String recordNo); } \ No newline at end of file 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 index 63fbd6c..30a110a 100644 --- 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 @@ -14,7 +14,7 @@ import java.time.LocalDateTime; */ @Data @Schema(description = "律师统计查询表单") -public class LawyerStatisticsQueryForm extends PageParam { +public class LawyerStatisticsQueryForm{ @Schema(description = "季度,1,2,3,4") private Integer quarter; diff --git a/yun-admin/src/main/java/net/lab1024/sa/admin/module/service/domain/form/ServiceLawyerQueryForm.java b/yun-admin/src/main/java/net/lab1024/sa/admin/module/service/domain/form/ServiceLawyerQueryForm.java index 718c628..95ace3e 100644 --- a/yun-admin/src/main/java/net/lab1024/sa/admin/module/service/domain/form/ServiceLawyerQueryForm.java +++ b/yun-admin/src/main/java/net/lab1024/sa/admin/module/service/domain/form/ServiceLawyerQueryForm.java @@ -15,7 +15,7 @@ public class ServiceLawyerQueryForm { @Schema(description = "季度,Q1,Q2,Q3,Q4") private Integer quarter; - + private Integer month; @Schema(description = "年度,格式:yyyy") private Integer year; diff --git a/yun-admin/src/main/java/net/lab1024/sa/admin/module/service/domain/vo/ServiceApplicationsVO.java b/yun-admin/src/main/java/net/lab1024/sa/admin/module/service/domain/vo/ServiceApplicationsVO.java index 891e601..cdec1cd 100644 --- a/yun-admin/src/main/java/net/lab1024/sa/admin/module/service/domain/vo/ServiceApplicationsVO.java +++ b/yun-admin/src/main/java/net/lab1024/sa/admin/module/service/domain/vo/ServiceApplicationsVO.java @@ -98,6 +98,9 @@ public class ServiceApplicationsVO { @Schema(description = "更新时间") private LocalDateTime updateTime; + @Schema(description = "提交时间") + private LocalDateTime reportTime; + @Schema(description = "职业证号") private String certificateNumber; 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 ffbbb6a..8974364 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 @@ -7,7 +7,19 @@ import com.alibaba.excel.write.metadata.holder.WriteSheetHolder; import com.alibaba.excel.write.metadata.holder.WriteWorkbookHolder; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import lombok.extern.slf4j.Slf4j; +import net.lab1024.sa.base.common.code.UserErrorCode; +import net.lab1024.sa.base.common.domain.PageResult; +import net.lab1024.sa.base.common.domain.RequestUser; +import net.lab1024.sa.base.common.domain.ResponseDTO; +import net.lab1024.sa.base.common.enumeration.UserTypeEnum; +import net.lab1024.sa.base.common.exception.BusinessException; +import net.lab1024.sa.base.common.util.SmartBeanUtil; +import net.lab1024.sa.base.common.util.SmartPageUtil; +import net.lab1024.sa.base.common.util.SmartResponseUtil; +import net.lab1024.sa.base.module.support.dict.domain.entity.DictEntity; +import net.lab1024.sa.base.module.support.dict.service.DictService; import net.lab1024.sa.admin.common.enums.ReviewEnum; +import net.lab1024.sa.admin.common.enums.DateTimeEnum; import net.lab1024.sa.admin.module.business.category.domain.entity.CategoryEntity; import net.lab1024.sa.admin.module.business.category.service.CategoryService; import net.lab1024.sa.admin.module.business.goods.domain.entity.GoodsEntity; @@ -15,8 +27,6 @@ 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.*; import net.lab1024.sa.admin.module.system.datascope.constant.DataScopeViewTypeEnum; import net.lab1024.sa.admin.module.system.datascope.service.DataScopeViewService; @@ -34,17 +44,6 @@ import net.lab1024.sa.admin.util.AdminRequestUtil; import net.lab1024.sa.admin.util.CellStyleStrategy; import net.lab1024.sa.admin.util.DateTimeUtil; import net.lab1024.sa.admin.util.TimeVo; -import net.lab1024.sa.base.common.code.UserErrorCode; -import net.lab1024.sa.base.common.domain.PageResult; -import net.lab1024.sa.base.common.domain.RequestUser; -import net.lab1024.sa.base.common.domain.ResponseDTO; -import net.lab1024.sa.base.common.enumeration.UserTypeEnum; -import net.lab1024.sa.base.common.exception.BusinessException; -import net.lab1024.sa.base.common.util.SmartBeanUtil; -import net.lab1024.sa.base.common.util.SmartPageUtil; -import net.lab1024.sa.base.common.util.SmartResponseUtil; -import net.lab1024.sa.base.module.support.dict.domain.entity.DictEntity; -import net.lab1024.sa.base.module.support.dict.service.DictService; import net.sf.jsqlparser.expression.LongValue; import org.apache.catalina.util.RequestUtil; import org.apache.commons.collections4.CollectionUtils; @@ -776,154 +775,346 @@ public class ServiceApplicationsService { /** * 律所统计 - * @param queryForms - * @return */ public List getLawyerStatisticsByDepartment(@Valid LawyerStatisticsQueryFormList queryForms) { LawyerStatisticsQueryForm queryForm = getQueryForm(queryForms); DictEntity dictItem = dictService.getOne("FILECOST"); - // 第一步:先查询年度统计数据(有条件) + // 获取年度统计数据 + List annualStatistics = getAnnualStatistics(queryForm); + + if (!annualStatistics.isEmpty()) { + // 处理统计数据 + processStatistics(annualStatistics, queryForm, dictItem); + } + + // 屏蔽成本数据 + maskCostDataForUser(annualStatistics); + return annualStatistics; + } + + /** + * 获取年度统计数据 + */ + private List getAnnualStatistics(LawyerStatisticsQueryForm queryForm) { + LawyerStatisticsQueryForm annualQueryForm = createAnnualQueryForm(queryForm); + return serviceApplicationsDao.getdepartmentStatistics(annualQueryForm); + } + + /** + * 创建年度查询表单 + */ + private LawyerStatisticsQueryForm createAnnualQueryForm(LawyerStatisticsQueryForm queryForm) { LawyerStatisticsQueryForm annualQueryForm = new LawyerStatisticsQueryForm(); annualQueryForm.setYear(queryForm.getYear()); + // 如果指定了机构ID,则应用过滤条件 if (queryForm.getFirmId() != null) { annualQueryForm.setFirmId(queryForm.getFirmId()); } + // 设置年度时间范围 String yearStart = queryForm.getYear() + "-01-01"; String yearEnd = queryForm.getYear() + "-12-31"; annualQueryForm.setStartTime(yearStart); annualQueryForm.setEndTime(yearEnd); - // 初始化季度时间变量 - LocalDateTime quarterStart = null; - LocalDateTime quarterEnd = null; + return annualQueryForm; + } + + /** + * 处理统计数据 + */ + private void processStatistics(List annualStatistics, + LawyerStatisticsQueryForm queryForm, + DictEntity dictItem) { + // 获取季度统计数据(如果有季度条件) + List quarterlyStatistics = getQuarterlyStatistics(queryForm); - List annualStatistics = serviceApplicationsDao.getdepartmentStatistics(annualQueryForm); + // 处理每个律所的统计数据 + for (LawyerStatisticsVO annualStat : annualStatistics) { + processDepartmentStatistics(annualStat, queryForm, dictItem, quarterlyStatistics); + } + } + + /** + * 获取季度统计数据 + */ + private List getQuarterlyStatistics(LawyerStatisticsQueryForm queryForm) { + if (queryForm.getQuarter() == null) { + return new ArrayList<>(); + } - if (!annualStatistics.isEmpty()) { - // 第二步:如果有季度条件,查询季度统计数据 - List quarterlyStatistics = new ArrayList<>(); - if (queryForm.getQuarter() != null) { - // 设置季度时间范围 - quarterStart = DateTimeEnum.getQuarterStart(queryForm.getYear(), queryForm.getQuarter()); - quarterEnd = DateTimeEnum.getQuarterEnd(queryForm.getYear(), queryForm.getQuarter()); - annualQueryForm.setStartTime(quarterStart.toString()); - annualQueryForm.setEndTime(quarterEnd.toString()); - quarterlyStatistics = serviceApplicationsDao.getdepartmentStatistics(annualQueryForm); - } + LawyerStatisticsQueryForm quarterlyQueryForm = createQuarterlyQueryForm(queryForm); + return serviceApplicationsDao.getdepartmentStatistics(quarterlyQueryForm); + } + + /** + * 创建季度查询表单 + */ + private LawyerStatisticsQueryForm createQuarterlyQueryForm(LawyerStatisticsQueryForm queryForm) { + LawyerStatisticsQueryForm quarterlyQueryForm = new LawyerStatisticsQueryForm(); + quarterlyQueryForm.setYear(queryForm.getYear()); + quarterlyQueryForm.setFirmId(queryForm.getFirmId()); + + // 设置季度时间范围 + LocalDateTime quarterStart = DateTimeEnum.getQuarterStart(queryForm.getYear(), queryForm.getQuarter()); + LocalDateTime quarterEnd = DateTimeEnum.getQuarterEnd(queryForm.getYear(), queryForm.getQuarter()); + quarterlyQueryForm.setStartTime(quarterStart.toString()); + quarterlyQueryForm.setEndTime(quarterEnd.toString()); + + return quarterlyQueryForm; + } + + /** + * 处理单个律所的统计数据 + */ + private void processDepartmentStatistics(LawyerStatisticsVO annualStat, + LawyerStatisticsQueryForm queryForm, + DictEntity dictItem, + List quarterlyStatistics) { + // 处理年度数据 + processAnnualData(annualStat, queryForm, dictItem); + + // 处理季度数据 + processQuarterlyData(annualStat, queryForm, dictItem, quarterlyStatistics); + + // 处理律师详细数据 + processLawyerDetails(annualStat, queryForm, dictItem); + } + + /** + * 处理年度数据 + */ + private void processAnnualData(LawyerStatisticsVO annualStat, + LawyerStatisticsQueryForm queryForm, + DictEntity dictItem) { + // 计算年度成本 + calculateAnnualCost(annualStat, dictItem); + + // 添加金额类型数据 + addAmountDataToAnnualCost(annualStat, queryForm); + } + + /** + * 计算年度成本 + */ + private void calculateAnnualCost(LawyerStatisticsVO annualStat, DictEntity dictItem) { + BigDecimal annualCost = BigDecimal.valueOf(annualStat.getAnnualServiceDuration() * Long.valueOf(dictItem.getRemark())); + annualStat.setAnnualServiceCost(annualCost); + } + + /** + * 添加金额类型数据到年度成本 + */ + private void addAmountDataToAnnualCost(LawyerStatisticsVO annualStat, LawyerStatisticsQueryForm queryForm) { + LawyerStatisticsQueryForm amountQueryForm = new LawyerStatisticsQueryForm(); + amountQueryForm.setFirmId(annualStat.getFirmId()); + + // 设置年度时间范围 + String yearStart = queryForm.getYear() + "-01-01"; + String yearEnd = queryForm.getYear() + "-12-31"; + amountQueryForm.setStartTime(yearStart); + amountQueryForm.setEndTime(yearEnd); + + BigDecimal annualAmount = serviceApplicationsDao.getServiceAmount(amountQueryForm); + if (annualAmount != null && annualAmount.compareTo(BigDecimal.ZERO) > 0) { + annualStat.setAnnualServiceCost(annualStat.getAnnualServiceCost().add(annualAmount)); + } + } + + /** + * 处理季度数据 + */ + private void processQuarterlyData(LawyerStatisticsVO annualStat, + LawyerStatisticsQueryForm queryForm, + DictEntity dictItem, + List quarterlyStatistics) { + if (queryForm.getQuarter() == null) { + annualStat.setQuarterlyServiceDuration(0.00); + annualStat.setQuarterlyServiceCost(BigDecimal.ZERO); + return; + } + + // 查找对应的季度数据 + LawyerStatisticsVO quarterlyStat = findQuarterlyStatByFirmId(quarterlyStatistics, annualStat.getFirmId()); + + if (quarterlyStat != null) { + annualStat.setQuarterlyServiceDuration(quarterlyStat.getAnnualServiceDuration()); + calculateQuarterlyCost(annualStat, dictItem); + addQuarterlyAmountData(annualStat, queryForm); + } else { + annualStat.setQuarterlyServiceDuration(0.00); + annualStat.setQuarterlyServiceCost(BigDecimal.ZERO); + } + } + + /** + * 根据律所ID查找季度数据 + */ + private LawyerStatisticsVO findQuarterlyStatByFirmId(List quarterlyStatistics, Long firmId) { + return quarterlyStatistics.stream() + .filter(stat -> firmId.equals(stat.getFirmId())) + .findFirst() + .orElse(null); + } + + /** + * 计算季度成本 + */ + private void calculateQuarterlyCost(LawyerStatisticsVO annualStat, DictEntity dictItem) { + BigDecimal quarterlyCost = BigDecimal.valueOf(annualStat.getQuarterlyServiceDuration() * Long.valueOf(dictItem.getRemark())); + annualStat.setQuarterlyServiceCost(quarterlyCost); + } + + /** + * 添加季度金额数据 + */ + private void addQuarterlyAmountData(LawyerStatisticsVO annualStat, LawyerStatisticsQueryForm queryForm) { + LawyerStatisticsQueryForm quarterlyAmountQueryForm = new LawyerStatisticsQueryForm(); + quarterlyAmountQueryForm.setFirmId(annualStat.getFirmId()); + + // 设置季度时间范围 + LocalDateTime quarterStart = DateTimeEnum.getQuarterStart(queryForm.getYear(), queryForm.getQuarter()); + LocalDateTime quarterEnd = DateTimeEnum.getQuarterEnd(queryForm.getYear(), queryForm.getQuarter()); + quarterlyAmountQueryForm.setStartTime(quarterStart.toString()); + quarterlyAmountQueryForm.setEndTime(quarterEnd.toString()); + + BigDecimal quarterlyAmount = serviceApplicationsDao.getServiceAmount(quarterlyAmountQueryForm); + if (quarterlyAmount != null && quarterlyAmount.compareTo(BigDecimal.ZERO) > 0) { + annualStat.setQuarterlyServiceCost(annualStat.getQuarterlyServiceCost().add(quarterlyAmount)); + } + } + + /** + * 处理律师详细数据 + */ + private void processLawyerDetails(LawyerStatisticsVO annualStat, + LawyerStatisticsQueryForm queryForm, + DictEntity dictItem) { + // 查询律师年度统计信息 + List lawyerAnnualStats = getLawyerAnnualStats(annualStat.getFirmId(), queryForm); + + // 查询律师季度统计信息(如果有季度条件) + List lawyerQuarterlyStats = getLawyerQuarterlyStats(annualStat.getFirmId(), queryForm); + + // 处理律师统计数据 + processLawyerStats(lawyerAnnualStats, lawyerQuarterlyStats, queryForm, dictItem); + + annualStat.setLawyerServiceVOList(lawyerAnnualStats); + } + + /** + * 查询律师年度统计信息 + */ + private List getLawyerAnnualStats(Long firmId, LawyerStatisticsQueryForm queryForm) { + ServiceLawyerQueryForm serviceLawyerQueryForm = new ServiceLawyerQueryForm(); + serviceLawyerQueryForm.setFirmId(firmId); + serviceLawyerQueryForm.setYear(queryForm.getYear()); + + // 设置年度时间范围 + String yearStart = queryForm.getYear() + "-01-01"; + String yearEnd = queryForm.getYear() + "-12-31"; + serviceLawyerQueryForm.setStartTime(yearStart); + serviceLawyerQueryForm.setEndTime(yearEnd); + + return serviceApplicationsDao.getLawyerStatisticsWithParam(serviceLawyerQueryForm); + } + + /** + * 查询律师季度统计信息 + */ + private List getLawyerQuarterlyStats(Long firmId, LawyerStatisticsQueryForm queryForm) { + if (queryForm.getQuarter() == null) { + return new ArrayList<>(); + } + + ServiceLawyerQueryForm lawyerQuarterlyQueryForm = new ServiceLawyerQueryForm(); + lawyerQuarterlyQueryForm.setFirmId(firmId); + lawyerQuarterlyQueryForm.setYear(queryForm.getYear()); + + // 设置季度时间范围 + LocalDateTime quarterStart = DateTimeEnum.getQuarterStart(queryForm.getYear(), queryForm.getQuarter()); + LocalDateTime quarterEnd = DateTimeEnum.getQuarterEnd(queryForm.getYear(), queryForm.getQuarter()); + lawyerQuarterlyQueryForm.setStartTime(quarterStart.toString()); + lawyerQuarterlyQueryForm.setEndTime(quarterEnd.toString()); + + return serviceApplicationsDao.getLawyerStatisticsWithParam(lawyerQuarterlyQueryForm); + } + + /** + * 处理律师统计数据 + */ + private void processLawyerStats(List lawyerAnnualStats, + List lawyerQuarterlyStats, + LawyerStatisticsQueryForm queryForm, + DictEntity dictItem) { + Map lawyerQuarterlyMap = lawyerQuarterlyStats.stream() + .collect(Collectors.toMap(ServiceLawyerImportForm::getUserId, Function.identity())); + + for (ServiceLawyerImportForm lawyerAnnual : lawyerAnnualStats) { + // 计算律师年度成本 + calculateLawyerAnnualCost(lawyerAnnual, dictItem, queryForm); + + // 设置律师季度数据 + setLawyerQuarterlyData(lawyerAnnual, lawyerQuarterlyMap, queryForm, dictItem); + } + } + + /** + * 计算律师年度成本 + */ + private void calculateLawyerAnnualCost(ServiceLawyerImportForm lawyerAnnual, + DictEntity dictItem, + LawyerStatisticsQueryForm queryForm) { + BigDecimal lawyerAnnualCost = BigDecimal.valueOf(lawyerAnnual.getAnnualServiceDuration() * Long.valueOf(dictItem.getRemark())); + lawyerAnnual.setAnnualServiceCost(lawyerAnnualCost); + + // 查询律师年度amount类型金额 + LawyerStatisticsQueryForm lawyerAmountQueryForm = new LawyerStatisticsQueryForm(); + lawyerAmountQueryForm.setUserId(lawyerAnnual.getUserId()); + + // 设置年度时间范围 + String yearStart = queryForm.getYear() + "-01-01"; + String yearEnd = queryForm.getYear() + "-12-31"; + lawyerAmountQueryForm.setStartTime(yearStart); + lawyerAmountQueryForm.setEndTime(yearEnd); + + BigDecimal lawyerAnnualAmount = serviceApplicationsDao.getServiceAmount(lawyerAmountQueryForm); + if (lawyerAnnualAmount != null && lawyerAnnualAmount.compareTo(BigDecimal.ZERO) > 0) { + lawyerAnnual.setAnnualServiceCost(lawyerAnnual.getAnnualServiceCost().add(lawyerAnnualAmount)); + } + } + + /** + * 设置律师季度数据 + */ + private void setLawyerQuarterlyData(ServiceLawyerImportForm lawyerAnnual, + Map lawyerQuarterlyMap, + LawyerStatisticsQueryForm queryForm, + DictEntity dictItem) { + ServiceLawyerImportForm lawyerQuarterly = lawyerQuarterlyMap.get(lawyerAnnual.getUserId()); + + if (lawyerQuarterly != null && queryForm.getQuarter() != null) { + lawyerAnnual.setQuarterlyServiceDuration(lawyerQuarterly.getAnnualServiceDuration()); - // 第三步:合并年度和季度数据 - Map quarterlyMap = quarterlyStatistics.stream() - .collect(Collectors.toMap(LawyerStatisticsVO::getFirmId, Function.identity())); + BigDecimal lawyerQuarterlyCost = BigDecimal.valueOf(lawyerQuarterly.getAnnualServiceDuration() * Long.valueOf(dictItem.getRemark())); + lawyerAnnual.setQuarterlyServiceCost(lawyerQuarterlyCost); - for (LawyerStatisticsVO annualStat : annualStatistics) { - // 计算年度成本 - BigDecimal annualCost = BigDecimal.valueOf(annualStat.getAnnualServiceDuration() * Long.valueOf(dictItem.getRemark())); - annualStat.setAnnualServiceCost(annualCost); - - // 查询amount类型的金额并添加到年度成本 - LawyerStatisticsQueryForm amountQueryForm = new LawyerStatisticsQueryForm(); - amountQueryForm.setFirmId(annualStat.getFirmId()); - amountQueryForm.setStartTime(yearStart); - amountQueryForm.setEndTime(yearEnd); - BigDecimal annualAmount = serviceApplicationsDao.getServiceAmount(amountQueryForm); - - // 安全地添加年度特殊金额 - BigDecimal currentAnnualCost = annualStat.getAnnualServiceCost(); - if (currentAnnualCost != null) { - annualStat.setAnnualServiceCost(currentAnnualCost.add(annualAmount != null ? annualAmount : BigDecimal.ZERO)); - } else { - annualStat.setAnnualServiceCost(annualAmount != null ? annualAmount : BigDecimal.ZERO); - } - - // 设置季度数据 - LawyerStatisticsVO quarterlyStat = quarterlyMap.get(annualStat.getFirmId()); - if (quarterlyStat != null && queryForm.getQuarter() != null) { - annualStat.setQuarterlyServiceDuration(quarterlyStat.getAnnualServiceDuration()); - BigDecimal quarterlyCost = BigDecimal.valueOf(quarterlyStat.getAnnualServiceDuration() * Long.valueOf(dictItem.getRemark())); - annualStat.setQuarterlyServiceCost(quarterlyCost); - // 修复:创建独立的季度金额查询表单,避免时间范围污染 - LawyerStatisticsQueryForm quarterlyAmountQueryForm = new LawyerStatisticsQueryForm(); - quarterlyAmountQueryForm.setFirmId(annualStat.getFirmId()); - quarterlyAmountQueryForm.setStartTime(quarterStart.toString()); - quarterlyAmountQueryForm.setEndTime(quarterEnd.toString()); - BigDecimal quarterlyAmount = serviceApplicationsDao.getServiceAmount(quarterlyAmountQueryForm); - annualStat.setQuarterlyServiceCost(annualStat.getQuarterlyServiceCost().add(quarterlyAmount != null ? quarterlyAmount : BigDecimal.ZERO)); - } else { - // 没有季度数据时设置默认值 - annualStat.setQuarterlyServiceDuration(0.00); - annualStat.setQuarterlyServiceCost(BigDecimal.ZERO); - } - - // 查询律所下律师的详细统计信息 - ServiceLawyerQueryForm serviceLawyerQueryForm = new ServiceLawyerQueryForm(); - serviceLawyerQueryForm.setFirmId(annualStat.getFirmId()); - serviceLawyerQueryForm.setYear(queryForm.getYear()); - - // 设置律师年度统计时间范围 - serviceLawyerQueryForm.setStartTime(yearStart); - serviceLawyerQueryForm.setEndTime(yearEnd); - List lawyerAnnualStats = serviceApplicationsDao.getLawyerStatisticsWithParam(serviceLawyerQueryForm); - - // 处理律师季度统计 - List lawyerQuarterlyStats = new ArrayList<>(); - if (queryForm.getQuarter() != null) { - // 为律师季度统计创建独立的查询表单,使用季度时间范围 - ServiceLawyerQueryForm lawyerQuarterlyQueryForm = new ServiceLawyerQueryForm(); - lawyerQuarterlyQueryForm.setFirmId(annualStat.getFirmId()); - lawyerQuarterlyQueryForm.setYear(queryForm.getYear()); - lawyerQuarterlyQueryForm.setStartTime(quarterStart.toString()); - lawyerQuarterlyQueryForm.setEndTime(quarterEnd.toString()); - lawyerQuarterlyStats = serviceApplicationsDao.getLawyerStatisticsWithParam(lawyerQuarterlyQueryForm); - } - - // 合并律师年度和季度数据 - Map lawyerQuarterlyMap = lawyerQuarterlyStats.stream() - .collect(Collectors.toMap(ServiceLawyerImportForm::getUserId, Function.identity())); - - for (ServiceLawyerImportForm lawyerAnnual : lawyerAnnualStats) { - // 计算律师年度成本 - BigDecimal lawyerAnnualCost = BigDecimal.valueOf(lawyerAnnual.getAnnualServiceDuration() * Long.valueOf(dictItem.getRemark())); - lawyerAnnual.setAnnualServiceCost(lawyerAnnualCost); - - // 查询律师年度amount类型金额 - LawyerStatisticsQueryForm lawyerAmountQueryForm = new LawyerStatisticsQueryForm(); - lawyerAmountQueryForm.setUserId(lawyerAnnual.getUserId()); - lawyerAmountQueryForm.setStartTime(yearStart); - lawyerAmountQueryForm.setEndTime(yearEnd); - BigDecimal lawyerAnnualAmount = serviceApplicationsDao.getServiceAmount(lawyerAmountQueryForm); - - // 安全地添加律师年度特殊金额 - BigDecimal currentLawyerAnnualCost = lawyerAnnual.getAnnualServiceCost(); - if (currentLawyerAnnualCost != null) { - lawyerAnnual.setAnnualServiceCost(currentLawyerAnnualCost.add(lawyerAnnualAmount != null ? lawyerAnnualAmount : BigDecimal.ZERO)); - } else { - lawyerAnnual.setAnnualServiceCost(lawyerAnnualAmount != null ? lawyerAnnualAmount : BigDecimal.ZERO); - } - - // 设置律师季度数据 - ServiceLawyerImportForm lawyerQuarterly = lawyerQuarterlyMap.get(lawyerAnnual.getUserId()); - if (lawyerQuarterly != null && queryForm.getQuarter() != null) { - lawyerAnnual.setQuarterlyServiceDuration(lawyerQuarterly.getAnnualServiceDuration()); - BigDecimal lawyerQuarterlyCost = BigDecimal.valueOf(lawyerQuarterly.getAnnualServiceDuration() * Long.valueOf(dictItem.getRemark())); - lawyerAnnual.setQuarterlyServiceCost(lawyerQuarterlyCost); - BigDecimal lawyerQuarterlyAmount = serviceApplicationsDao.getServiceAmount(annualQueryForm); - lawyerAnnual.setQuarterlyServiceCost(lawyerAnnual.getQuarterlyServiceCost().add(lawyerQuarterlyAmount != null ? lawyerQuarterlyAmount : BigDecimal.ZERO)); - } else { - lawyerAnnual.setQuarterlyServiceDuration(0.0); - lawyerAnnual.setQuarterlyServiceCost(BigDecimal.ZERO); - } - } - - annualStat.setLawyerServiceVOList(lawyerAnnualStats); + // 查询律师季度金额类型数据 + LawyerStatisticsQueryForm quarterlyAmountQueryForm = new LawyerStatisticsQueryForm(); + quarterlyAmountQueryForm.setUserId(lawyerAnnual.getUserId()); + quarterlyAmountQueryForm.setStartTime(queryForm.getStartTime()); + quarterlyAmountQueryForm.setEndTime(queryForm.getEndTime()); + + BigDecimal lawyerQuarterlyAmount = serviceApplicationsDao.getServiceAmount(quarterlyAmountQueryForm); + if (lawyerQuarterlyAmount != null && lawyerQuarterlyAmount.compareTo(BigDecimal.ZERO) > 0) { + lawyerAnnual.setQuarterlyServiceCost(lawyerAnnual.getQuarterlyServiceCost().add(lawyerQuarterlyAmount)); } + } else { + lawyerAnnual.setQuarterlyServiceDuration(0.0); + lawyerAnnual.setQuarterlyServiceCost(BigDecimal.ZERO); } - - //屏蔽成本数据 - maskCostDataForUser(annualStatistics); - return annualStatistics; } /** @@ -1089,10 +1280,11 @@ public class ServiceApplicationsService { */ public BigDecimal getServiceApplicationsCost(ServiceLawyerQueryForm queryForm) { // 根据指定的季度设置时间范围 - LocalDateTime quarterStart = DateTimeEnum.getQuarterStart(queryForm.getYear(), queryForm.getQuarter()); - LocalDateTime quarterEnd = DateTimeEnum.getQuarterEnd(queryForm.getYear(), queryForm.getQuarter()); + LocalDateTime quarterStart = DateTimeEnum.getMonthStart(queryForm.getYear(), queryForm.getMonth()); + LocalDateTime quarterEnd = DateTimeEnum.getMonthEnd(queryForm.getYear(), queryForm.getMonth()); queryForm.setStartTime(quarterStart.toString()); queryForm.setEndTime(quarterEnd.toString()); + queryForm.setFirmId(queryForm.getFirmId()); //获取多少小时 Long time = serviceApplicationsDao.getServiceApplicationsCost(queryForm); //获取字典表的设置 @@ -1117,7 +1309,7 @@ public class ServiceApplicationsService { return result; }else { - return BigDecimal.valueOf(0L); + return BigDecimal.ZERO; } } @@ -1360,69 +1552,210 @@ public class ServiceApplicationsService { /** * 获取律师统计信息(带查询参数) */ - public PageResult getLawyerStatistics(LawyerStatisticsQueryForm queryForm) { - Page page = SmartPageUtil.convert2PageQuery(queryForm); - DictEntity one = dictService.getOne("FILECOST"); - //查询下角色 + public List getLawyerStatistics(LawyerStatisticsQueryForm queryForm) { + DictEntity fileCostDict = dictService.getOne("FILECOST"); + + // 应用权限控制 + applyUserPermissionControl(queryForm); + + // 设置年度时间范围 + setAnnualTimeRange(queryForm); + + // 统计当前年度的律师数据(无分页) + List lawyerStatisticsList = serviceApplicationsDao.getLawyerStatisticsWithParamYearNoPage(queryForm); + + // 处理统计数据 + if (!lawyerStatisticsList.isEmpty()) { + // 处理有服务时长类型数据的律师统计 + processLawyersWithServiceDuration(lawyerStatisticsList, queryForm, fileCostDict); + } else { + // 处理只有金额类型数据的律师统计 + processLawyersWithAmountOnly(lawyerStatisticsList, queryForm, fileCostDict); + } + + // 根据用户权限控制成本数据显示 + maskCostDataForUser(lawyerStatisticsList); + return lawyerStatisticsList; + } + + /** + * 应用用户权限控制 + */ + private void applyUserPermissionControl(LawyerStatisticsQueryForm queryForm) { RequestEmployee requestUser = AdminRequestUtil.getRequestUser(); RoleVO roleList = roleEmployeeService.getRoleIdList(requestUser.getEmployeeId()).get(0); - TimeVo yearStartAndEnd = DateTimeUtil.getYearStartAndEnd(queryForm.getYear()); - //根据year拼接年度的开始时间和结束时间 - String yearStart = yearStartAndEnd.getStartTime(); - String yearEnd = yearStartAndEnd.getEndTime(); - queryForm.setStartTime(yearStart); - queryForm.setEndTime(yearEnd); if (UserTypeEnum.CTO.getDesc().equals(roleList.getRoleCode())){ queryForm.setFirmId(requestUser.getDepartmentId()); - } - //统计当前年度的 - List lawyerStatisticsWithParamYear = serviceApplicationsDao.getLawyerStatisticsWithParamYear(page, queryForm); - PageResult lawyerStatisticsVOPageResult = SmartPageUtil.convert2PageResult(page, lawyerStatisticsWithParamYear); - if (!lawyerStatisticsVOPageResult.getList().isEmpty()) { - for (LawyerStatisticsVO statisticsVO : lawyerStatisticsWithParamYear) { - statisticsVO.setAnnualServiceCost(BigDecimal.valueOf(statisticsVO.getAnnualServiceDuration() * Long.valueOf(one.getRemark()))); - //统计金额 - queryForm.setUserId(statisticsVO.getUserId()); - BigDecimal amount = serviceApplicationsDao.getServiceAmount(queryForm); - statisticsVO.setAnnualServiceCost(statisticsVO.getAnnualServiceCost().add(amount)); - - // 直接为每个律师查询季度数据 - LawyerStatisticsQueryForm quarterQueryForm = new LawyerStatisticsQueryForm(); - quarterQueryForm.setYear(queryForm.getYear()); - quarterQueryForm.setQuarter(queryForm.getQuarter()); - quarterQueryForm.setUserId(statisticsVO.getUserId()); - - // 设置季度时间范围 - if (quarterQueryForm.getQuarter() == null) { - TimeVo startQuarter = DateTimeUtil.getStartQuarter(); - quarterQueryForm.setStartTime(startQuarter.getStartTime()); - quarterQueryForm.setEndTime(startQuarter.getEndTime()); - } else { - LocalDateTime quarterStart = DateTimeEnum.getQuarterStart(quarterQueryForm.getYear(), quarterQueryForm.getQuarter()); - LocalDateTime quarterEnd = DateTimeEnum.getQuarterEnd(quarterQueryForm.getYear(), quarterQueryForm.getQuarter()); - quarterQueryForm.setStartTime(quarterStart.toString()); - quarterQueryForm.setEndTime(quarterEnd.toString()); - } + } + + /** + * 设置年度时间范围 + */ + private void setAnnualTimeRange(LawyerStatisticsQueryForm queryForm) { + TimeVo yearStartAndEnd = DateTimeUtil.getYearStartAndEnd(queryForm.getYear()); + queryForm.setStartTime(yearStartAndEnd.getStartTime()); + queryForm.setEndTime(yearStartAndEnd.getEndTime()); + } + + /** + * 处理有服务时长类型数据的律师统计 + */ + private void processLawyersWithServiceDuration(List lawyerStatisticsList, + LawyerStatisticsQueryForm queryForm, + DictEntity fileCostDict) { + for (LawyerStatisticsVO statisticsVO : lawyerStatisticsList) { + // 计算年度服务成本(服务时长 + 金额类型) + calculateAnnualServiceCost(statisticsVO, queryForm, fileCostDict); + + // 只有在有季度查询条件时才计算季度服务成本 + if (queryForm.getQuarter() != null) { + calculateQuarterlyServiceCost(statisticsVO, queryForm, fileCostDict); + } else { + // 没有季度查询条件时,设置季度数据为默认值 + statisticsVO.setQuarterlyServiceDuration(0.0); + statisticsVO.setQuarterlyServiceCost(BigDecimal.ZERO); + } + } + } + + /** + * 计算年度服务成本 + */ + private void calculateAnnualServiceCost(LawyerStatisticsVO statisticsVO, + LawyerStatisticsQueryForm queryForm, + DictEntity fileCostDict) { + // 检查字典项是否为空 + if (fileCostDict == null || fileCostDict.getRemark() == null) { + log.warn("FILECOST字典项为空或remark字段为空,无法计算服务时长成本"); + statisticsVO.setAnnualServiceCost(BigDecimal.ZERO); + } else { + // 基于服务时长计算成本 + BigDecimal serviceDurationCost = BigDecimal.valueOf( + statisticsVO.getAnnualServiceDuration() * Long.valueOf(fileCostDict.getRemark()) + ); + statisticsVO.setAnnualServiceCost(serviceDurationCost); + } + + // 统计金额类型数据 + LawyerStatisticsQueryForm amountQueryForm = createAmountQueryForm(queryForm, statisticsVO.getUserId()); + BigDecimal amount = serviceApplicationsDao.getServiceAmount(amountQueryForm); + if (amount != null && amount.compareTo(BigDecimal.ZERO) > 0) { + statisticsVO.setAnnualServiceCost(statisticsVO.getAnnualServiceCost().add(amount)); + } + } + + /** + * 计算季度服务成本 + */ + private void calculateQuarterlyServiceCost(LawyerStatisticsVO statisticsVO, + LawyerStatisticsQueryForm queryForm, + DictEntity fileCostDict) { + LawyerStatisticsQueryForm quarterQueryForm = createQuarterQueryForm(queryForm, statisticsVO.getUserId()); + + // 查询该律师的季度数据 + LawyerStatisticsVO quarterData = serviceApplicationsDao.getLawyerStatistic(quarterQueryForm); + if (quarterData != null && quarterData.getQuarterlyServiceDuration() != null) { + statisticsVO.setQuarterlyServiceDuration(quarterData.getQuarterlyServiceDuration()); + + // 基于服务时长计算季度成本 + BigDecimal quarterServiceDurationCost = BigDecimal.valueOf( + quarterData.getQuarterlyServiceDuration() * Long.valueOf(fileCostDict.getRemark()) + ); + statisticsVO.setQuarterlyServiceCost(quarterServiceDurationCost); + + // 统计季度金额类型数据 + BigDecimal quarterAmount = serviceApplicationsDao.getServiceAmount(quarterQueryForm); + if (quarterAmount != null) { + statisticsVO.setQuarterlyServiceCost(statisticsVO.getQuarterlyServiceCost().add(quarterAmount)); + } + } else { + // 如果没有季度数据,设置季度成本为0 + statisticsVO.setQuarterlyServiceDuration(0.0); + statisticsVO.setQuarterlyServiceCost(BigDecimal.ZERO); + } + } + + /** + * 处理只有金额类型数据的律师统计 + */ + private void processLawyersWithAmountOnly(List resultList, + LawyerStatisticsQueryForm queryForm, + DictEntity fileCostDict) { + // 查询只有金额类型数据的律师 + List amountOnlyLawyers = findLawyersWithAmountOnly(queryForm); + + if (!amountOnlyLawyers.isEmpty()) { + resultList.addAll(amountOnlyLawyers); + } + } + + /** + * 查找只有金额类型数据的律师 + */ + private List findLawyersWithAmountOnly(LawyerStatisticsQueryForm queryForm) { + // 查询按律师统计的年度金额数据 + List amountOnlyLawyers = serviceApplicationsDao.getLawyerAmountStatistics(queryForm); + + if (!amountOnlyLawyers.isEmpty()) { + log.info("发现 {} 个只有金额类型数据的律师", amountOnlyLawyers.size()); + + // 处理每个律师的季度金额数据 + for (LawyerStatisticsVO lawyer : amountOnlyLawyers) { + // 设置服务时长为0(只有金额类型数据) + lawyer.setAnnualServiceDuration(0.0); + lawyer.setQuarterlyServiceDuration(0.0); - // 查询该律师的季度数据 - LawyerStatisticsVO quarterData = serviceApplicationsDao.getLawyerStatistic(quarterQueryForm); - if (quarterData != null && quarterData.getQuarterlyServiceDuration() != null) { - statisticsVO.setQuarterlyServiceDuration(quarterData.getQuarterlyServiceDuration()); - statisticsVO.setQuarterlyServiceCost(BigDecimal.valueOf(quarterData.getQuarterlyServiceDuration() * Long.valueOf(one.getRemark()))); - // 统计金额 + // 只有在有季度参数时才查询季度金额数据 + if (queryForm.getQuarter() != null) { + LawyerStatisticsQueryForm quarterQueryForm = createQuarterQueryForm(queryForm, lawyer.getUserId()); BigDecimal quarterAmount = serviceApplicationsDao.getServiceAmount(quarterQueryForm); - statisticsVO.setQuarterlyServiceCost(statisticsVO.getQuarterlyServiceCost().add(quarterAmount)); + if (quarterAmount != null && quarterAmount.compareTo(BigDecimal.ZERO) > 0) { + lawyer.setQuarterlyServiceCost(quarterAmount); + } else { + lawyer.setQuarterlyServiceCost(BigDecimal.ZERO); + } } else { - // 如果没有季度数据,设置季度成本为0 - statisticsVO.setQuarterlyServiceDuration(0.0); - statisticsVO.setQuarterlyServiceCost(BigDecimal.ZERO); + lawyer.setQuarterlyServiceCost(BigDecimal.ZERO); } } } - // 根据用户权限控制成本数据显示 - maskCostDataForUser(lawyerStatisticsVOPageResult.getList()); - return lawyerStatisticsVOPageResult; + + return amountOnlyLawyers; + } + + /** + * 创建金额查询表单 + */ + private LawyerStatisticsQueryForm createAmountQueryForm(LawyerStatisticsQueryForm originalForm, Long userId) { + LawyerStatisticsQueryForm amountQueryForm = new LawyerStatisticsQueryForm(); + amountQueryForm.setYear(originalForm.getYear()); + amountQueryForm.setQuarter(originalForm.getQuarter()); + amountQueryForm.setFirmId(originalForm.getFirmId()); + amountQueryForm.setUserId(userId); + amountQueryForm.setStartTime(originalForm.getStartTime()); + amountQueryForm.setEndTime(originalForm.getEndTime()); + return amountQueryForm; + } + + /** + * 创建季度查询表单 + */ + private LawyerStatisticsQueryForm createQuarterQueryForm(LawyerStatisticsQueryForm originalForm, Long userId) { + LawyerStatisticsQueryForm quarterQueryForm = new LawyerStatisticsQueryForm(); + quarterQueryForm.setYear(originalForm.getYear()); + quarterQueryForm.setQuarter(originalForm.getQuarter()); + quarterQueryForm.setUserId(userId); + + // 设置季度时间范围(只有在有季度参数时才设置具体季度范围) + if (quarterQueryForm.getQuarter() != null) { + LocalDateTime quarterStart = DateTimeEnum.getQuarterStart(quarterQueryForm.getYear(), quarterQueryForm.getQuarter()); + LocalDateTime quarterEnd = DateTimeEnum.getQuarterEnd(quarterQueryForm.getYear(), quarterQueryForm.getQuarter()); + quarterQueryForm.setStartTime(quarterStart.toString()); + quarterQueryForm.setEndTime(quarterEnd.toString()); + } + + return quarterQueryForm; } /** @@ -1637,6 +1970,36 @@ public class ServiceApplicationsService { } } } + } else { + // 处理 lawyerStatisticsVOPageResult 和 lawyerStatisticsWithParamYear 都为 null 的情况 + // 但仍可能存在 amount 数据需要处理 + LawyerStatisticsQueryForm queryForm = new LawyerStatisticsQueryForm(); + queryForm.setYear(originalQueryForm.getYear()); + queryForm.setQuarter(originalQueryForm.getQuarter()); + + if (queryForm.getQuarter() == null) { + // 如果没有指定季度,使用上一季度的时间范围 + TimeVo startQuarter = DateTimeUtil.getStartQuarter(); + String quarterStart = startQuarter.getStartTime(); + String quarterEnd = startQuarter.getEndTime(); + queryForm.setStartTime(quarterStart + " 00:00:00"); + queryForm.setEndTime(quarterEnd + " 23:59:59"); + } 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()); + } + + // 即使没有统计数据,也要查询可能存在的 amount 数据 + BigDecimal amount = serviceApplicationsDao.getServiceAmount(queryForm); + if (amount != null && amount.compareTo(BigDecimal.ZERO) > 0) { + log.warn("发现孤立的 amount 数据: {},但没有对应的统计数据", amount); + // 这里可以根据业务需求决定如何处理孤立的 amount 数据 + // 比如可以创建一个特殊的统计记录,或者记录到日志中 + } } } diff --git a/yun-admin/src/main/java/net/lab1024/sa/admin/module/system/login/domain/LoginResultVO.java b/yun-admin/src/main/java/net/lab1024/sa/admin/module/system/login/domain/LoginResultVO.java index e9d450f..fcecf71 100644 --- a/yun-admin/src/main/java/net/lab1024/sa/admin/module/system/login/domain/LoginResultVO.java +++ b/yun-admin/src/main/java/net/lab1024/sa/admin/module/system/login/domain/LoginResultVO.java @@ -39,4 +39,13 @@ public class LoginResultVO extends RequestEmployee { private Boolean agreementSignFlag; private Integer dataScopeView; private String roleCode; + @Schema(description = "律所协议签订状态") + private Boolean lawFirmAgreementSignFlag; + + /** + * 是否有成本查看权限 + */ + private Boolean costVisibleFlag; + + private Boolean penaltyFlag; } diff --git a/yun-admin/src/main/java/net/lab1024/sa/admin/module/system/login/manager/LoginManager.java b/yun-admin/src/main/java/net/lab1024/sa/admin/module/system/login/manager/LoginManager.java index 2c5ded3..9155fbb 100644 --- a/yun-admin/src/main/java/net/lab1024/sa/admin/module/system/login/manager/LoginManager.java +++ b/yun-admin/src/main/java/net/lab1024/sa/admin/module/system/login/manager/LoginManager.java @@ -74,8 +74,12 @@ public class LoginManager { /** * 获取登录的用户信息 */ - @CachePut(value = AdminCacheConst.Login.REQUEST_EMPLOYEE, key = "#employeeEntity.employeeId") + @CachePut(value = AdminCacheConst.Login.REQUEST_EMPLOYEE, key = "#employeeEntity?.employeeId") public RequestEmployee loadLoginInfo(EmployeeEntity employeeEntity) { + if (employeeEntity == null) { + return null; + } + // 基础信息 RequestEmployee requestEmployee = SmartBeanUtil.copy(employeeEntity, RequestEmployee.class); requestEmployee.setUserType(UserTypeEnum.ADMIN_EMPLOYEE); diff --git a/yun-admin/src/main/java/net/lab1024/sa/admin/module/system/login/service/LoginService.java b/yun-admin/src/main/java/net/lab1024/sa/admin/module/system/login/service/LoginService.java index 4b5190c..0408b08 100644 --- a/yun-admin/src/main/java/net/lab1024/sa/admin/module/system/login/service/LoginService.java +++ b/yun-admin/src/main/java/net/lab1024/sa/admin/module/system/login/service/LoginService.java @@ -296,6 +296,8 @@ public class LoginService implements StpInterface { loginResultVO.setCostVisibleFlag(byId.getCostVisibleFlag()); //承诺书签订状态 loginResultVO.setAgreementSignFlag(letterService.isLetter(requestEmployee.getEmployeeId())); + //律所承诺书签订状态 + loginResultVO.setLawFirmAgreementSignFlag(letterService.isLetterDept(requestEmployee.getEmployeeId())); //获取角色 List roleIdList = roleEmployeeService.getRoleIdList(requestEmployee.getEmployeeId()); loginResultVO.setDataScopeView(dataScopeViewService.getOneByRoleId(roleIdList.get(0).getRoleId())); diff --git a/yun-admin/src/main/java/net/lab1024/sa/admin/module/word/WordApplicationsController.java b/yun-admin/src/main/java/net/lab1024/sa/admin/module/word/WordApplicationsController.java index 73b7a66..c47f86e 100644 --- a/yun-admin/src/main/java/net/lab1024/sa/admin/module/word/WordApplicationsController.java +++ b/yun-admin/src/main/java/net/lab1024/sa/admin/module/word/WordApplicationsController.java @@ -8,6 +8,7 @@ import net.lab1024.sa.admin.module.system.department.domain.vo.DepartmentVO; 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.base.common.enumeration.UserTypeEnum; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -270,7 +271,8 @@ public class WordApplicationsController { department.getCreditCode(), employee.getActualName(), employee.getCertificateNumber(), - penaltyApplyEntity.getCreateTime() + penaltyApplyEntity.getCreateTime(), + penaltyApplyEntity.getType() ); } @@ -336,12 +338,19 @@ public class WordApplicationsController { FontMetrics bodyMetrics = g2d.getFontMetrics(); int lineHeight = bodyMetrics.getHeight(); int maxLineWidth = PAGE_WIDTH - LEFT_MARGIN - RIGHT_MARGIN; - + String fullContent = ""; + if (UserTypeEnum.USER.getDesc().equals(data.getType())){ // 构建完整内容 - String fullContent = "兹证明" + data.getCertificateNo() + "(统一社会信用代码:" + - data.getPurpose() + ")" + data.getName() + - "律师(执业证号:" + data.getIdCard() + - ")近五年在我市执业期间未受到律师协会行业处分。"; + fullContent = "兹证明" + data.getCertificateNo() + "(统一社会信用代码:" + + data.getPurpose() + ")" + data.getName() + + "律师(执业证号:" + data.getIdCard() + + ")近五年在我市执业期间未受到律师协会行业处分。"; + }else { + fullContent = "兹证明" + data.getCertificateNo() + "(统一社会信用代码:" + + data.getPurpose() + ")" + + "近五年在我市执业期间未受到律师协会行业处分。"; + } + // 首行缩进(两个全角空格) String indent = "  "; diff --git a/yun-admin/src/main/java/net/lab1024/sa/admin/module/word/WordCertificateService.java b/yun-admin/src/main/java/net/lab1024/sa/admin/module/word/WordCertificateService.java index 96467a0..dd71049 100644 --- a/yun-admin/src/main/java/net/lab1024/sa/admin/module/word/WordCertificateService.java +++ b/yun-admin/src/main/java/net/lab1024/sa/admin/module/word/WordCertificateService.java @@ -250,6 +250,7 @@ public class WordCertificateService { private String name; private String idCard; private LocalDateTime localDateTime; // 修正字段名为驼峰命名 + private String type; } } \ 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 index 49b2ed4..03e81dc 100644 --- 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 @@ -2,6 +2,7 @@ package net.lab1024.sa.admin.util; import java.time.LocalDate; import java.time.LocalDateTime; +import java.time.Month; import java.time.ZoneId; import java.time.format.DateTimeFormatter; import java.util.Calendar; @@ -14,6 +15,43 @@ import java.util.Date; * @create: 2025-12-24 16:24 **/ public class DateTimeUtil { + + + /** + * 根据当前日期判断所属季度 + * 第一季度:1月1日-4月4日 + * 第二季度:4月5日-7月4日 + * 第三季度:7月5日-10月4日 + * 第四季度:10月5日-12月31日 + * @return 季度编号(Q1-Q4) + */ + public static String getCurrentQuarter() { + LocalDate today = LocalDate.now(); + Month month = today.getMonth(); + int dayOfMonth = today.getDayOfMonth(); + + // 判断当前时间是不是小于4月5号,是则为第一季度 + if (month.getValue() < 4 || (month.getValue() == 4 && dayOfMonth < 5)) { + return "Q1"; + } + // 判断当前时间是不是大于4月5号小于7月5号,是则为第二季度 + else if ((month.getValue() == 4 && dayOfMonth >= 5) || + (month.getValue() > 4 && month.getValue() < 7) || + (month.getValue() == 7 && dayOfMonth < 5)) { + return "Q2"; + } + // 判断当前时间是不是大于7月5号小于10月5号,是则为第三季度 + else if ((month.getValue() == 7 && dayOfMonth >= 5) || + (month.getValue() > 7 && month.getValue() < 10) || + (month.getValue() == 10 && dayOfMonth < 5)) { + return "Q3"; + } + // 判断当前时间是不是大于10月5号小于第二年的1月5号,是则为第四季度 + else { + return "Q4"; + } + } + /** * 获取当前日期上一季度 开始时间 * diff --git a/yun-admin/src/main/resources/mapper/cost/FirmReportsMapper.xml b/yun-admin/src/main/resources/mapper/cost/FirmReportsMapper.xml index 27c7e4b..fcd558a 100644 --- a/yun-admin/src/main/resources/mapper/cost/FirmReportsMapper.xml +++ b/yun-admin/src/main/resources/mapper/cost/FirmReportsMapper.xml @@ -18,7 +18,8 @@ t_firm_reports.approver_id as approverId, t_firm_reports.create_time as createTime, t_firm_reports.update_time as updateTime, - t_firm_reports.del_flag as delFlag + t_firm_reports.del_flag as delFlag, + t_firm_reports.declare_month as declareMonth UPDATE t_firm_reports @@ -53,6 +54,9 @@ AND t_firm_reports.declare_quarter = #{queryForm.declareQuarter} + + AND t_firm_reports.declare_month = #{queryForm.declareMonth} + AND t_firm_reports.approval_status = #{queryForm.approvalStatus} @@ -65,10 +69,37 @@ SELECT * FROM t_firm_reports WHERE del_flag = 0 - AND declare_quarter = #{declareQuarter} + AND declare_month = #{declareQuarter} AND declare_year = #{declareYear} AND firm_id = #{firmId} LIMIT 1 + + + diff --git a/yun-admin/src/main/resources/mapper/penaltyapply/PenaltyApplyMapper.xml b/yun-admin/src/main/resources/mapper/penaltyapply/PenaltyApplyMapper.xml index 901b5f4..bee6d99 100644 --- a/yun-admin/src/main/resources/mapper/penaltyapply/PenaltyApplyMapper.xml +++ b/yun-admin/src/main/resources/mapper/penaltyapply/PenaltyApplyMapper.xml @@ -13,7 +13,8 @@ t_penalty_apply.update_time, t_penalty_apply.deleted_flag, t_penalty_apply.department_id, - t_penalty_apply.audit_status + t_penalty_apply.audit_status, + t_penalty_apply.type @@ -29,6 +30,7 @@ tp_apply.deleted_flag as deletedFlag, tp_apply.audit_status as auditStatus, tp_apply.department_id as departmentId, + tp_apply.type, te_employee.actual_name AS userName FROM t_penalty_apply tp_apply left join t_employee te_employee on tp_apply.user_id = te_employee.employee_id diff --git a/yun-admin/src/main/resources/mapper/penaltyapply/PenaltyLawyerMapper.xml b/yun-admin/src/main/resources/mapper/penaltyapply/PenaltyLawyerMapper.xml index e5ebc1d..cbe07d2 100644 --- a/yun-admin/src/main/resources/mapper/penaltyapply/PenaltyLawyerMapper.xml +++ b/yun-admin/src/main/resources/mapper/penaltyapply/PenaltyLawyerMapper.xml @@ -35,6 +35,11 @@ from t_lawyer_punish_people where name = #{licenseNo} and punish_time >= DATE_SUB(CURDATE(), INTERVAL 5 YEAR) + diff --git a/yun-admin/src/main/resources/mapper/service/ServiceApplicationsMapper.xml b/yun-admin/src/main/resources/mapper/service/ServiceApplicationsMapper.xml index a8146b8..889b663 100644 --- a/yun-admin/src/main/resources/mapper/service/ServiceApplicationsMapper.xml +++ b/yun-admin/src/main/resources/mapper/service/ServiceApplicationsMapper.xml @@ -509,12 +509,12 @@ SUM(tsa.service_duration) AS totalServiceCost FROM t_service_applications tsa WHERE tsa.deleted_flag = 0 - AND tsa.association_audit_status = 3 + AND tsa.firm_audit_status = 3 - AND tsa.association_audit_time >= #{queryForm.startTime} + AND tsa.create_time >= #{queryForm.startTime} - AND tsa.association_audit_time <= #{queryForm.endTime} + AND tsa.create_time <= #{queryForm.endTime} AND tsa.firm_id = #{queryForm.firmId} @@ -553,12 +553,12 @@ LEFT JOIN t_department d ON tsa.firm_id = d.department_id tsa.deleted_flag = 0 - AND tsa.association_audit_status = 3 + AND tsa.firm_audit_status = 3 - AND tsa.association_audit_time >= #{queryForm.startTime} + AND tsa.create_time >= #{queryForm.startTime} - AND tsa.association_audit_time <= #{queryForm.endTime} + AND tsa.create_time <= #{queryForm.endTime} and tsa.user_id = #{queryForm.userId} @@ -607,6 +607,64 @@ + + + + \ No newline at end of file diff --git a/yun-base/src/main/java/net/lab1024/sa/base/common/code/UnexpectedErrorCode.java b/yun-base/src/main/java/net/lab1024/sa/base/common/code/UnexpectedErrorCode.java index 4a418d3..009a64b 100644 --- a/yun-base/src/main/java/net/lab1024/sa/base/common/code/UnexpectedErrorCode.java +++ b/yun-base/src/main/java/net/lab1024/sa/base/common/code/UnexpectedErrorCode.java @@ -5,12 +5,6 @@ import lombok.Getter; /** * 未预期的错误码(即发生了不可能发生的事情,此类返回码应该高度重视) - * - * @Author 1024创新实验室-主任: 卓大 - * @Date 2021/09/27 22:10:46 - * @Wechat zhuoda1024 - * @Email lab1024@163.com - * @Copyright 1024创新实验室 */ @Getter @AllArgsConstructor @@ -27,7 +21,7 @@ public enum UnexpectedErrorCode implements ErrorCode { PAY_ORDER_ID_ERROR(20002, "付款单id发生了异常,请联系技术人员排查"), - DATA_EXIST(20003, "当前年度的季度成本填报已存在,请勿重复填报"), + DATA_EXIST(20003, "当前年度的本月成本填报已存在,请勿重复填报,记得提交哦"), ; private final int code;