diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/assigntasks/AssignTasksController.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/assigntasks/AssignTasksController.java index 5a9f7e8..4c67452 100644 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/assigntasks/AssignTasksController.java +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/assigntasks/AssignTasksController.java @@ -1,21 +1,22 @@ package com.zteits.urbanops.module.garden.controller.admin.assigntasks; import cn.hutool.core.collection.CollectionUtil; -import cn.hutool.core.util.StrUtil; import com.zteits.urbanops.framework.apilog.core.annotation.ApiAccessLog; import com.zteits.urbanops.framework.common.pojo.CommonResult; import com.zteits.urbanops.framework.common.pojo.PageParam; import com.zteits.urbanops.framework.common.pojo.PageResult; import com.zteits.urbanops.framework.common.util.object.BeanUtils; import com.zteits.urbanops.framework.excel.core.util.ExcelUtils; -import com.zteits.urbanops.framework.translate.core.TranslateUtils; import com.zteits.urbanops.module.garden.controller.admin.assigntasks.vo.AssignTasksPageReqVO; import com.zteits.urbanops.module.garden.controller.admin.assigntasks.vo.AssignTasksRespVO; import com.zteits.urbanops.module.garden.controller.admin.assigntasks.vo.AssignTasksSaveReqVO; +import com.zteits.urbanops.module.garden.controller.admin.unitintegraltotal.vo.UnitIntegralRespVO; +import com.zteits.urbanops.module.garden.convert.AssignTaskConvert; import com.zteits.urbanops.module.garden.dal.dataobject.assigntasks.AssignTasksDO; import com.zteits.urbanops.module.garden.dal.dataobject.assigntasksinfo.AssignTasksInfoDO; import com.zteits.urbanops.module.garden.service.assigntasks.AssignTasksService; import com.zteits.urbanops.module.garden.service.assigntasksinfo.AssignTasksInfoService; +import com.zteits.urbanops.module.garden.service.unitintegraltotal.UnitIntegralService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; @@ -46,6 +47,9 @@ public class AssignTasksController { @Resource private AssignTasksInfoService asignTasksInfoService; + @Resource + private UnitIntegralService unitIntegralService; + @PostMapping("/create") @Operation(summary = "创建派单任务主表(记录派单任务基本信息)") @PreAuthorize("@ss.hasPermission('garden:assign-tasks:create')") @@ -90,7 +94,13 @@ public class AssignTasksController { } AssignTasksRespVO assignTasksRespVO = BeanUtils.toBean(assignTasks, AssignTasksRespVO.class); List assignTaskInfoList = asignTasksInfoService.getAssignTasksInfos(assignTasks.getId()); - assignTasksRespVO.setAssignTaskInfoList(assignTaskInfoList); + //add by 20260307 convert 转换获取任务积分 + List taskIds = assignTaskInfoList.stream() + .map(AssignTasksInfoDO::getId) + .distinct() // 去重重复的taskId + .collect(Collectors.toList()); + List unitIntegralList = unitIntegralService.queryIntegralByRelatedTaskIds(taskIds); + assignTasksRespVO.setAssignTaskInfoList(AssignTaskConvert.INSTANCE.buildTaskInfo(assignTaskInfoList, unitIntegralList)); //获取单位集合 List companyIds = CollectionUtil.isEmpty(assignTaskInfoList) ? Collections.emptyList() diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/assigntasks/vo/AssignTasksRespVO.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/assigntasks/vo/AssignTasksRespVO.java index c8843cc..fb22771 100644 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/assigntasks/vo/AssignTasksRespVO.java +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/assigntasks/vo/AssignTasksRespVO.java @@ -3,8 +3,7 @@ package com.zteits.urbanops.module.garden.controller.admin.assigntasks.vo; import cn.idev.excel.annotation.ExcelIgnoreUnannotated; import cn.idev.excel.annotation.ExcelProperty; import com.fasterxml.jackson.annotation.JsonFormat; -import com.fhs.core.trans.vo.VO; -import com.zteits.urbanops.module.garden.dal.dataobject.assigntasksinfo.AssignTasksInfoDO; +import com.zteits.urbanops.module.garden.controller.admin.assigntasksinfo.vo.AssignTasksInfoRespVO; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; @@ -64,7 +63,7 @@ public class AssignTasksRespVO { private String updater; private List companyIds; - private List assignTaskInfoList; + private List assignTaskInfoList; public void setParentFinish(Integer parentFinish) { this.parentFinish = parentFinish; diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/assigntasksinfo/AssignTasksInfoController.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/assigntasksinfo/AssignTasksInfoController.java index 030467c..8f8c315 100644 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/assigntasksinfo/AssignTasksInfoController.java +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/assigntasksinfo/AssignTasksInfoController.java @@ -10,11 +10,13 @@ import com.zteits.urbanops.module.garden.controller.admin.assigntasksinfo.vo.Ass import com.zteits.urbanops.module.garden.controller.admin.assigntasksinfo.vo.AssignTasksInfoRespVO; import com.zteits.urbanops.module.garden.controller.admin.assigntasksinfo.vo.AssignTasksInfoSaveReqVO; import com.zteits.urbanops.module.garden.controller.admin.assigntasksinfo.vo.AssignTasksInfoUpdReqVO; +import com.zteits.urbanops.module.garden.controller.admin.unitintegraltotal.vo.UnitIntegralRespVO; import com.zteits.urbanops.module.garden.convert.AssignTaskConvert; import com.zteits.urbanops.module.garden.dal.dataobject.assigntasks.AssignTasksDO; import com.zteits.urbanops.module.garden.dal.dataobject.assigntasksinfo.AssignTasksInfoDO; import com.zteits.urbanops.module.garden.service.assigntasks.AssignTasksService; import com.zteits.urbanops.module.garden.service.assigntasksinfo.AssignTasksInfoService; +import com.zteits.urbanops.module.garden.service.unitintegraltotal.UnitIntegralService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; @@ -26,7 +28,9 @@ import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import java.io.IOException; +import java.util.ArrayList; import java.util.List; +import java.util.stream.Collectors; import static com.zteits.urbanops.framework.apilog.core.enums.OperateTypeEnum.EXPORT; import static com.zteits.urbanops.framework.common.pojo.CommonResult.success; @@ -42,6 +46,8 @@ public class AssignTasksInfoController { private AssignTasksInfoService assignTasksInfoService; @Resource private AssignTasksService assignTasksService; + @Resource + private UnitIntegralService unitIntegralService; @PostMapping("/create") @Operation(summary = "创建派单任务-单位关联表(记录单位接收派单后的执行详情)") @@ -83,7 +89,11 @@ public class AssignTasksInfoController { public CommonResult getAssignTasksInfo(@RequestParam("id") Long id) { AssignTasksInfoDO assignTasksInfo = assignTasksInfoService.getAssignTasksInfo(id); AssignTasksDO tasksDO = assignTasksService.getAssignTasks(assignTasksInfo.getTaskId()); - return success(AssignTaskConvert.INSTANCE.buildTask(assignTasksInfo, tasksDO)); + //add by 20260307 convert 转换获取任务积分 + List taskIds = new ArrayList<>(); + taskIds.add(assignTasksInfo.getId()); + List unitIntegralList = unitIntegralService.queryIntegralByRelatedTaskIds(taskIds); + return success(AssignTaskConvert.INSTANCE.buildTask(assignTasksInfo, tasksDO, unitIntegralList)); //return success(BeanUtils.toBean(assignTasksInfo, AssignTasksInfoRespVO.class)); } @@ -93,26 +103,16 @@ public class AssignTasksInfoController { public CommonResult> getAssignTasksInfoPage(@Valid AssignTasksInfoPageReqVO pageReqVO) { pageReqVO.setCompanyId(getCompanyId()); PageResult pageResult = assignTasksInfoService.getAssignTasksInfoPage(pageReqVO); -// if (pageResult == null || pageResult.getList() == null || pageResult.getList().isEmpty()) { -// return success(BeanUtils.toBean(pageResult, AssignTasksInfoRespVO.class)); -// } -// List assignIds = pageResult.getList().stream() -// .map(AssignTasksInfoDO::getTaskId) -// .distinct() -// .collect(Collectors.toList()); -// List taskList = assignTasksService.getAssignTasksList(assignIds); -// if (CollectionUtils.isNotEmpty(taskList)) { -// Map taskMap = taskList.stream() -// .collect(Collectors.toMap( -// AssignTasksDO::getId, // Key:任务ID -// task -> task, -// (existing, replacement) -> replacement -// )); -// return success(AssignTaskConvert.INSTANCE.buildTaskPage(pageResult, taskMap)); -// } else { -// return CommonResult.error(BAD_REQUEST.getCode(), "派单数据异常"); -// } - return success(BeanUtils.toBean(pageResult, AssignTasksInfoRespVO.class)); + if (pageResult == null || pageResult.getList() == null || pageResult.getList().isEmpty()) { + return success(BeanUtils.toBean(pageResult, AssignTasksInfoRespVO.class)); + } + //add by 20260307 convert 转换获取任务积分 + List taskIds = pageResult.getList().stream() + .map(AssignTasksInfoDO::getId) + .distinct() // 去重重复的taskId + .collect(Collectors.toList()); + List unitIntegralList = unitIntegralService.queryIntegralByRelatedTaskIds(taskIds); + return success(AssignTaskConvert.INSTANCE.buildTaskPage(pageResult, unitIntegralList)); } @GetMapping("/list") @Operation(summary = "获得派单任务-单位关联表(记录单位接收派单后的执行详情)分页") @@ -120,26 +120,13 @@ public class AssignTasksInfoController { public CommonResult> list(@Valid AssignTasksInfoPageReqVO pageReqVO) { pageReqVO.setCompanyId(getCompanyId()); PageResult pageResult = assignTasksInfoService.getAssignTasksInfoPage(pageReqVO); -// if (pageResult == null || pageResult.getList() == null || pageResult.getList().isEmpty()) { -// return success(BeanUtils.toBean(pageResult, AssignTasksInfoRespVO.class)); -// } -// List assignIds = pageResult.getList().stream() -// .map(AssignTasksInfoDO::getTaskId) -// .distinct() -// .collect(Collectors.toList()); -// List taskList = assignTasksService.getAssignTasksList(assignIds); -// if (CollectionUtils.isNotEmpty(taskList)) { -// Map taskMap = taskList.stream() -// .collect(Collectors.toMap( -// AssignTasksDO::getId, // Key:任务ID -// task -> task, -// (existing, replacement) -> replacement -// )); -// return success(AssignTaskConvert.INSTANCE.buildTaskPage(pageResult, taskMap)); -// } else { -// return CommonResult.error(BAD_REQUEST.getCode(), "派单数据异常"); -// } - return success(BeanUtils.toBean(pageResult, AssignTasksInfoRespVO.class)); + //add by 20260307 convert 转换获取任务积分 + List taskIds = pageResult.getList().stream() + .map(AssignTasksInfoDO::getId) + .distinct() // 去重重复的taskId + .collect(Collectors.toList()); + List unitIntegralList = unitIntegralService.queryIntegralByRelatedTaskIds(taskIds); + return success(AssignTaskConvert.INSTANCE.buildTaskPage(pageResult, unitIntegralList)); } @GetMapping("/export-excel") @Operation(summary = "导出派单任务-单位关联表(记录单位接收派单后的执行详情) Excel") diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/assigntasksinfo/vo/AssignTasksInfoRespVO.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/assigntasksinfo/vo/AssignTasksInfoRespVO.java index 9dd99c8..95bba4d 100644 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/assigntasksinfo/vo/AssignTasksInfoRespVO.java +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/assigntasksinfo/vo/AssignTasksInfoRespVO.java @@ -139,4 +139,9 @@ public class AssignTasksInfoRespVO { @TableField(typeHandler = JacksonTypeHandler.class) private List templateFile; + + /*当前积分*/ + private Integer totalIntegral; + + } diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/unitintegraladd/UnitIntegralAddController.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/unitintegraladd/UnitIntegralAddController.java new file mode 100644 index 0000000..7dc5d4b --- /dev/null +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/unitintegraladd/UnitIntegralAddController.java @@ -0,0 +1,104 @@ +package com.zteits.urbanops.module.garden.controller.admin.unitintegraladd; + +import org.springframework.web.bind.annotation.*; +import jakarta.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.security.access.prepost.PreAuthorize; +import io.swagger.v3.oas.annotations.tags.Tag; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Operation; + +import jakarta.validation.constraints.*; +import jakarta.validation.*; +import jakarta.servlet.http.*; +import java.util.*; +import java.io.IOException; + +import com.zteits.urbanops.framework.common.pojo.PageParam; +import com.zteits.urbanops.framework.common.pojo.PageResult; +import com.zteits.urbanops.framework.common.pojo.CommonResult; +import com.zteits.urbanops.framework.common.util.object.BeanUtils; +import static com.zteits.urbanops.framework.common.pojo.CommonResult.success; + +import com.zteits.urbanops.framework.excel.core.util.ExcelUtils; + +import com.zteits.urbanops.framework.apilog.core.annotation.ApiAccessLog; +import static com.zteits.urbanops.framework.apilog.core.enums.OperateTypeEnum.*; + +import com.zteits.urbanops.module.garden.controller.admin.unitintegraladd.vo.*; +import com.zteits.urbanops.module.garden.dal.dataobject.unitintegraladd.UnitIntegralAddDO; +import com.zteits.urbanops.module.garden.service.unitintegraladd.UnitIntegralAddService; + +@Tag(name = "管理后台 - 积分增加记录") +@RestController +@RequestMapping("/garden/unit-integral-add") +@Validated +public class UnitIntegralAddController { + + @Resource + private UnitIntegralAddService unitIntegralAddService; + + @PostMapping("/create") + @Operation(summary = "创建积分增加记录") + @PreAuthorize("@ss.hasPermission('garden:unit-integral-add:create')") + public CommonResult createUnitIntegralAdd(@Valid @RequestBody UnitIntegralAddSaveReqVO createReqVO) { + return success(unitIntegralAddService.createUnitIntegralAdd(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新积分增加记录") + @PreAuthorize("@ss.hasPermission('garden:unit-integral-add:update')") + public CommonResult updateUnitIntegralAdd(@Valid @RequestBody UnitIntegralAddSaveReqVO updateReqVO) { + unitIntegralAddService.updateUnitIntegralAdd(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除积分增加记录") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('garden:unit-integral-add:delete')") + public CommonResult deleteUnitIntegralAdd(@RequestParam("id") Long id) { + unitIntegralAddService.deleteUnitIntegralAdd(id); + return success(true); + } + + @DeleteMapping("/delete-list") + @Parameter(name = "ids", description = "编号", required = true) + @Operation(summary = "批量删除积分增加记录") + @PreAuthorize("@ss.hasPermission('garden:unit-integral-add:delete')") + public CommonResult deleteUnitIntegralAddList(@RequestParam("ids") List ids) { + unitIntegralAddService.deleteUnitIntegralAddListByIds(ids); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得积分增加记录") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('garden:unit-integral-add:query')") + public CommonResult getUnitIntegralAdd(@RequestParam("id") Long id) { + UnitIntegralAddDO unitIntegralAdd = unitIntegralAddService.getUnitIntegralAdd(id); + return success(BeanUtils.toBean(unitIntegralAdd, UnitIntegralAddRespVO.class)); + } + + @GetMapping("/page") + @Operation(summary = "获得积分增加记录分页") + @PreAuthorize("@ss.hasPermission('garden:unit-integral-add:query')") + public CommonResult> getUnitIntegralAddPage(@Valid UnitIntegralAddPageReqVO pageReqVO) { + PageResult pageResult = unitIntegralAddService.getUnitIntegralAddPage(pageReqVO); + return success(BeanUtils.toBean(pageResult, UnitIntegralAddRespVO.class)); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出积分增加记录 Excel") + @PreAuthorize("@ss.hasPermission('garden:unit-integral-add:export')") + @ApiAccessLog(operateType = EXPORT) + public void exportUnitIntegralAddExcel(@Valid UnitIntegralAddPageReqVO pageReqVO, + HttpServletResponse response) throws IOException { + pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); + List list = unitIntegralAddService.getUnitIntegralAddPage(pageReqVO).getList(); + // 导出 Excel + ExcelUtils.write(response, "积分增加记录.xls", "数据", UnitIntegralAddRespVO.class, + BeanUtils.toBean(list, UnitIntegralAddRespVO.class)); + } + +} \ No newline at end of file diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/unitintegraladd/vo/UnitIntegralAddPageReqVO.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/unitintegraladd/vo/UnitIntegralAddPageReqVO.java new file mode 100644 index 0000000..d491e90 --- /dev/null +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/unitintegraladd/vo/UnitIntegralAddPageReqVO.java @@ -0,0 +1,56 @@ +package com.zteits.urbanops.module.garden.controller.admin.unitintegraladd.vo; + +import lombok.*; +import java.util.*; +import io.swagger.v3.oas.annotations.media.Schema; +import com.zteits.urbanops.framework.common.pojo.PageParam; +import org.springframework.format.annotation.DateTimeFormat; +import java.time.LocalDateTime; + +import static com.zteits.urbanops.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 积分增加记录分页 Request VO") +@Data +public class UnitIntegralAddPageReqVO extends PageParam { + + @Schema(description = "来源类型 01:派单", example = "1") + private String sourceType; + + @Schema(description = "单位类型:01:公司 02:班组 03:个人", example = "1") + private String unitType; + + @Schema(description = "单位ID(部门表 id)", example = "26490") + private String unitId; + + @Schema(description = "单位名称(冗余,避免联表查询)", example = "芋艿") + private String unitName; + + @Schema(description = "关联ID(关联业务表主键)", example = "24947") + private Long relatedTaskId; + + @Schema(description = "业务名称(冗余)", example = "张三") + private String relatedTaskName; + + @Schema(description = "本次增加积分(正数)") + private Integer addIntegral; + + @Schema(description = "增加原因(如:到期前上报奖励、到期后上报奖励等)", example = "不好") + private String addReason; + + @Schema(description = "增加前总积分(对账用)") + private Integer beforeIntegral; + + @Schema(description = "增加后总积分(对账用)") + private Integer afterIntegral; + + @Schema(description = "工单号") + private String workNo; + + @Schema(description = "备注(补充积分增加的特殊说明)", example = "你说的对") + private String remark; + + @Schema(description = "积分增加操作时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + +} \ No newline at end of file diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/unitintegraladd/vo/UnitIntegralAddRespVO.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/unitintegraladd/vo/UnitIntegralAddRespVO.java new file mode 100644 index 0000000..b983f46 --- /dev/null +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/unitintegraladd/vo/UnitIntegralAddRespVO.java @@ -0,0 +1,71 @@ +package com.zteits.urbanops.module.garden.controller.admin.unitintegraladd.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import org.springframework.format.annotation.DateTimeFormat; +import java.time.LocalDateTime; +import cn.idev.excel.annotation.*; + +@Schema(description = "管理后台 - 积分增加记录 Response VO") +@Data +@ExcelIgnoreUnannotated +public class UnitIntegralAddRespVO { + + @Schema(description = "主键ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "12471") + @ExcelProperty("主键ID") + private Long id; + + @Schema(description = "来源类型 01:派单", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @ExcelProperty("来源类型 01:派单") + private String sourceType; + + @Schema(description = "单位类型:01:公司 02:班组 03:个人", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @ExcelProperty("单位类型:01:公司 02:班组 03:个人") + private String unitType; + + @Schema(description = "单位ID(部门表 id)", requiredMode = Schema.RequiredMode.REQUIRED, example = "26490") + @ExcelProperty("单位ID(部门表 id)") + private String unitId; + + @Schema(description = "单位名称(冗余,避免联表查询)", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋艿") + @ExcelProperty("单位名称(冗余,避免联表查询)") + private String unitName; + + @Schema(description = "关联ID(关联业务表主键)", requiredMode = Schema.RequiredMode.REQUIRED, example = "24947") + @ExcelProperty("关联ID(关联业务表主键)") + private Long relatedTaskId; + + @Schema(description = "业务名称(冗余)", example = "张三") + @ExcelProperty("业务名称(冗余)") + private String relatedTaskName; + + @Schema(description = "本次增加积分(正数)", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("本次增加积分(正数)") + private Integer addIntegral; + + @Schema(description = "增加原因(如:到期前上报奖励、到期后上报奖励等)", requiredMode = Schema.RequiredMode.REQUIRED, example = "不好") + @ExcelProperty("增加原因(如:到期前上报奖励、到期后上报奖励等)") + private String addReason; + + @Schema(description = "增加前总积分(对账用)") + @ExcelProperty("增加前总积分(对账用)") + private Integer beforeIntegral; + + @Schema(description = "增加后总积分(对账用)") + @ExcelProperty("增加后总积分(对账用)") + private Integer afterIntegral; + + @Schema(description = "工单号") + @ExcelProperty("工单号") + private String workNo; + + @Schema(description = "备注(补充积分增加的特殊说明)", example = "你说的对") + @ExcelProperty("备注(补充积分增加的特殊说明)") + private String remark; + + @Schema(description = "积分增加操作时间", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("积分增加操作时间") + private LocalDateTime createTime; + +} \ No newline at end of file diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/unitintegraladd/vo/UnitIntegralAddSaveReqVO.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/unitintegraladd/vo/UnitIntegralAddSaveReqVO.java new file mode 100644 index 0000000..19b2978 --- /dev/null +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/unitintegraladd/vo/UnitIntegralAddSaveReqVO.java @@ -0,0 +1,58 @@ +package com.zteits.urbanops.module.garden.controller.admin.unitintegraladd.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import jakarta.validation.constraints.*; + +@Schema(description = "管理后台 - 积分增加记录新增/修改 Request VO") +@Data +public class UnitIntegralAddSaveReqVO { + + @Schema(description = "主键ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "12471") + private Long id; + + @Schema(description = "来源类型 01:派单", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotEmpty(message = "来源类型 01:派单不能为空") + private String sourceType; + + @Schema(description = "单位类型:01:公司 02:班组 03:个人", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotEmpty(message = "单位类型:01:公司 02:班组 03:个人不能为空") + private String unitType; + + @Schema(description = "单位ID(部门表 id)", requiredMode = Schema.RequiredMode.REQUIRED, example = "26490") + @NotEmpty(message = "单位ID(部门表 id)不能为空") + private String unitId; + + @Schema(description = "单位名称(冗余,避免联表查询)", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋艿") + @NotEmpty(message = "单位名称(冗余,避免联表查询)不能为空") + private String unitName; + + @Schema(description = "关联ID(关联业务表主键)", requiredMode = Schema.RequiredMode.REQUIRED, example = "24947") + @NotNull(message = "关联ID(关联业务表主键)不能为空") + private Long relatedTaskId; + + @Schema(description = "业务名称(冗余)", example = "张三") + private String relatedTaskName; + + @Schema(description = "本次增加积分(正数)", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "本次增加积分(正数)不能为空") + private Integer addIntegral; + + @Schema(description = "增加原因(如:到期前上报奖励、到期后上报奖励等)", requiredMode = Schema.RequiredMode.REQUIRED, example = "不好") + @NotEmpty(message = "增加原因(如:到期前上报奖励、到期后上报奖励等)不能为空") + private String addReason; + + @Schema(description = "增加前总积分(对账用)") + private Integer beforeIntegral; + + @Schema(description = "增加后总积分(对账用)") + private Integer afterIntegral; + + @Schema(description = "工单号") + private String workNo; + + @Schema(description = "备注(补充积分增加的特殊说明)", example = "你说的对") + private String remark; + +} \ No newline at end of file diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/unitintegralsub/UnitIntegralSubController.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/unitintegralsub/UnitIntegralSubController.java new file mode 100644 index 0000000..cbedea6 --- /dev/null +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/unitintegralsub/UnitIntegralSubController.java @@ -0,0 +1,104 @@ +package com.zteits.urbanops.module.garden.controller.admin.unitintegralsub; + +import org.springframework.web.bind.annotation.*; +import jakarta.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.security.access.prepost.PreAuthorize; +import io.swagger.v3.oas.annotations.tags.Tag; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Operation; + +import jakarta.validation.constraints.*; +import jakarta.validation.*; +import jakarta.servlet.http.*; +import java.util.*; +import java.io.IOException; + +import com.zteits.urbanops.framework.common.pojo.PageParam; +import com.zteits.urbanops.framework.common.pojo.PageResult; +import com.zteits.urbanops.framework.common.pojo.CommonResult; +import com.zteits.urbanops.framework.common.util.object.BeanUtils; +import static com.zteits.urbanops.framework.common.pojo.CommonResult.success; + +import com.zteits.urbanops.framework.excel.core.util.ExcelUtils; + +import com.zteits.urbanops.framework.apilog.core.annotation.ApiAccessLog; +import static com.zteits.urbanops.framework.apilog.core.enums.OperateTypeEnum.*; + +import com.zteits.urbanops.module.garden.controller.admin.unitintegralsub.vo.*; +import com.zteits.urbanops.module.garden.dal.dataobject.unitintegralsub.UnitIntegralSubDO; +import com.zteits.urbanops.module.garden.service.unitintegralsub.UnitIntegralSubService; + +@Tag(name = "管理后台 - 积分扣减记录") +@RestController +@RequestMapping("/garden/unit-integral-sub") +@Validated +public class UnitIntegralSubController { + + @Resource + private UnitIntegralSubService unitIntegralSubService; + + @PostMapping("/create") + @Operation(summary = "创建积分扣减记录") + @PreAuthorize("@ss.hasPermission('garden:unit-integral-sub:create')") + public CommonResult createUnitIntegralSub(@Valid @RequestBody UnitIntegralSubSaveReqVO createReqVO) { + return success(unitIntegralSubService.createUnitIntegralSub(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新积分扣减记录") + @PreAuthorize("@ss.hasPermission('garden:unit-integral-sub:update')") + public CommonResult updateUnitIntegralSub(@Valid @RequestBody UnitIntegralSubSaveReqVO updateReqVO) { + unitIntegralSubService.updateUnitIntegralSub(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除积分扣减记录") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('garden:unit-integral-sub:delete')") + public CommonResult deleteUnitIntegralSub(@RequestParam("id") Long id) { + unitIntegralSubService.deleteUnitIntegralSub(id); + return success(true); + } + + @DeleteMapping("/delete-list") + @Parameter(name = "ids", description = "编号", required = true) + @Operation(summary = "批量删除积分扣减记录") + @PreAuthorize("@ss.hasPermission('garden:unit-integral-sub:delete')") + public CommonResult deleteUnitIntegralSubList(@RequestParam("ids") List ids) { + unitIntegralSubService.deleteUnitIntegralSubListByIds(ids); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得积分扣减记录") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('garden:unit-integral-sub:query')") + public CommonResult getUnitIntegralSub(@RequestParam("id") Long id) { + UnitIntegralSubDO unitIntegralSub = unitIntegralSubService.getUnitIntegralSub(id); + return success(BeanUtils.toBean(unitIntegralSub, UnitIntegralSubRespVO.class)); + } + + @GetMapping("/page") + @Operation(summary = "获得积分扣减记录分页") + @PreAuthorize("@ss.hasPermission('garden:unit-integral-sub:query')") + public CommonResult> getUnitIntegralSubPage(@Valid UnitIntegralSubPageReqVO pageReqVO) { + PageResult pageResult = unitIntegralSubService.getUnitIntegralSubPage(pageReqVO); + return success(BeanUtils.toBean(pageResult, UnitIntegralSubRespVO.class)); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出积分扣减记录 Excel") + @PreAuthorize("@ss.hasPermission('garden:unit-integral-sub:export')") + @ApiAccessLog(operateType = EXPORT) + public void exportUnitIntegralSubExcel(@Valid UnitIntegralSubPageReqVO pageReqVO, + HttpServletResponse response) throws IOException { + pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); + List list = unitIntegralSubService.getUnitIntegralSubPage(pageReqVO).getList(); + // 导出 Excel + ExcelUtils.write(response, "积分扣减记录.xls", "数据", UnitIntegralSubRespVO.class, + BeanUtils.toBean(list, UnitIntegralSubRespVO.class)); + } + +} \ No newline at end of file diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/unitintegralsub/vo/UnitIntegralSubPageReqVO.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/unitintegralsub/vo/UnitIntegralSubPageReqVO.java new file mode 100644 index 0000000..1f867e3 --- /dev/null +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/unitintegralsub/vo/UnitIntegralSubPageReqVO.java @@ -0,0 +1,56 @@ +package com.zteits.urbanops.module.garden.controller.admin.unitintegralsub.vo; + +import lombok.*; +import java.util.*; +import io.swagger.v3.oas.annotations.media.Schema; +import com.zteits.urbanops.framework.common.pojo.PageParam; +import org.springframework.format.annotation.DateTimeFormat; +import java.time.LocalDateTime; + +import static com.zteits.urbanops.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 积分扣减记录分页 Request VO") +@Data +public class UnitIntegralSubPageReqVO extends PageParam { + + @Schema(description = "来源类型 01:派单", example = "1") + private String sourceType; + + @Schema(description = "单位类型:01:公司 02:班组 03:个人", example = "1") + private String unitType; + + @Schema(description = "单位ID(部门表 id)", example = "13254") + private String unitId; + + @Schema(description = "单位名称(冗余,避免联表查询)", example = "芋艿") + private String unitName; + + @Schema(description = "关联任务ID(外键,关联业务表主键)", example = "21804") + private Long relatedTaskId; + + @Schema(description = "业务名称(冗余)", example = "芋艿") + private String relatedTaskName; + + @Schema(description = "本次扣减积分(正数,存储扣减数值)") + private Integer subIntegral; + + @Schema(description = "扣减原因(如:任务打回等)", example = "不香") + private String subReason; + + @Schema(description = "扣减前总积分(对账用)") + private Integer beforeIntegral; + + @Schema(description = "扣减后总积分(对账用)") + private Integer afterIntegral; + + @Schema(description = "工单号") + private String workNo; + + @Schema(description = "备注(补充扣减的特殊说明)", example = "随便") + private String remark; + + @Schema(description = "积分扣减操作时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + +} \ No newline at end of file diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/unitintegralsub/vo/UnitIntegralSubRespVO.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/unitintegralsub/vo/UnitIntegralSubRespVO.java new file mode 100644 index 0000000..dfa67ae --- /dev/null +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/unitintegralsub/vo/UnitIntegralSubRespVO.java @@ -0,0 +1,71 @@ +package com.zteits.urbanops.module.garden.controller.admin.unitintegralsub.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import org.springframework.format.annotation.DateTimeFormat; +import java.time.LocalDateTime; +import cn.idev.excel.annotation.*; + +@Schema(description = "管理后台 - 积分扣减记录 Response VO") +@Data +@ExcelIgnoreUnannotated +public class UnitIntegralSubRespVO { + + @Schema(description = "主键ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "499") + @ExcelProperty("主键ID") + private Long id; + + @Schema(description = "来源类型 01:派单", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @ExcelProperty("来源类型 01:派单") + private String sourceType; + + @Schema(description = "单位类型:01:公司 02:班组 03:个人", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @ExcelProperty("单位类型:01:公司 02:班组 03:个人") + private String unitType; + + @Schema(description = "单位ID(部门表 id)", requiredMode = Schema.RequiredMode.REQUIRED, example = "13254") + @ExcelProperty("单位ID(部门表 id)") + private String unitId; + + @Schema(description = "单位名称(冗余,避免联表查询)", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋艿") + @ExcelProperty("单位名称(冗余,避免联表查询)") + private String unitName; + + @Schema(description = "关联任务ID(外键,关联业务表主键)", requiredMode = Schema.RequiredMode.REQUIRED, example = "21804") + @ExcelProperty("关联任务ID(外键,关联业务表主键)") + private Long relatedTaskId; + + @Schema(description = "业务名称(冗余)", example = "芋艿") + @ExcelProperty("业务名称(冗余)") + private String relatedTaskName; + + @Schema(description = "本次扣减积分(正数,存储扣减数值)", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("本次扣减积分(正数,存储扣减数值)") + private Integer subIntegral; + + @Schema(description = "扣减原因(如:任务打回等)", requiredMode = Schema.RequiredMode.REQUIRED, example = "不香") + @ExcelProperty("扣减原因(如:任务打回等)") + private String subReason; + + @Schema(description = "扣减前总积分(对账用)") + @ExcelProperty("扣减前总积分(对账用)") + private Integer beforeIntegral; + + @Schema(description = "扣减后总积分(对账用)") + @ExcelProperty("扣减后总积分(对账用)") + private Integer afterIntegral; + + @Schema(description = "工单号") + @ExcelProperty("工单号") + private String workNo; + + @Schema(description = "备注(补充扣减的特殊说明)", example = "随便") + @ExcelProperty("备注(补充扣减的特殊说明)") + private String remark; + + @Schema(description = "积分扣减操作时间", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("积分扣减操作时间") + private LocalDateTime createTime; + +} \ No newline at end of file diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/unitintegralsub/vo/UnitIntegralSubSaveReqVO.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/unitintegralsub/vo/UnitIntegralSubSaveReqVO.java new file mode 100644 index 0000000..6c1e700 --- /dev/null +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/unitintegralsub/vo/UnitIntegralSubSaveReqVO.java @@ -0,0 +1,58 @@ +package com.zteits.urbanops.module.garden.controller.admin.unitintegralsub.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import jakarta.validation.constraints.*; + +@Schema(description = "管理后台 - 积分扣减记录新增/修改 Request VO") +@Data +public class UnitIntegralSubSaveReqVO { + + @Schema(description = "主键ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "499") + private Long id; + + @Schema(description = "来源类型 01:派单", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotEmpty(message = "来源类型 01:派单不能为空") + private String sourceType; + + @Schema(description = "单位类型:01:公司 02:班组 03:个人", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotEmpty(message = "单位类型:01:公司 02:班组 03:个人不能为空") + private String unitType; + + @Schema(description = "单位ID(部门表 id)", requiredMode = Schema.RequiredMode.REQUIRED, example = "13254") + @NotEmpty(message = "单位ID(部门表 id)不能为空") + private String unitId; + + @Schema(description = "单位名称(冗余,避免联表查询)", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋艿") + @NotEmpty(message = "单位名称(冗余,避免联表查询)不能为空") + private String unitName; + + @Schema(description = "关联任务ID(外键,关联业务表主键)", requiredMode = Schema.RequiredMode.REQUIRED, example = "21804") + @NotNull(message = "关联任务ID(外键,关联业务表主键)不能为空") + private Long relatedTaskId; + + @Schema(description = "业务名称(冗余)", example = "芋艿") + private String relatedTaskName; + + @Schema(description = "本次扣减积分(正数,存储扣减数值)", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "本次扣减积分(正数,存储扣减数值)不能为空") + private Integer subIntegral; + + @Schema(description = "扣减原因(如:任务打回等)", requiredMode = Schema.RequiredMode.REQUIRED, example = "不香") + @NotEmpty(message = "扣减原因(如:任务打回等)不能为空") + private String subReason; + + @Schema(description = "扣减前总积分(对账用)") + private Integer beforeIntegral; + + @Schema(description = "扣减后总积分(对账用)") + private Integer afterIntegral; + + @Schema(description = "工单号") + private String workNo; + + @Schema(description = "备注(补充扣减的特殊说明)", example = "随便") + private String remark; + +} \ No newline at end of file diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/unitintegraltotal/UnitIntegralTotalController.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/unitintegraltotal/UnitIntegralTotalController.java new file mode 100644 index 0000000..c57a2c0 --- /dev/null +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/unitintegraltotal/UnitIntegralTotalController.java @@ -0,0 +1,141 @@ +package com.zteits.urbanops.module.garden.controller.admin.unitintegraltotal; + +import com.zteits.urbanops.module.garden.service.unitintegraltotal.UnitIntegralService; +import org.springframework.web.bind.annotation.*; +import jakarta.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.security.access.prepost.PreAuthorize; +import io.swagger.v3.oas.annotations.tags.Tag; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Operation; + +import jakarta.validation.constraints.*; +import jakarta.validation.*; +import jakarta.servlet.http.*; +import java.util.*; +import java.io.IOException; + +import com.zteits.urbanops.framework.common.pojo.PageParam; +import com.zteits.urbanops.framework.common.pojo.PageResult; +import com.zteits.urbanops.framework.common.pojo.CommonResult; +import com.zteits.urbanops.framework.common.util.object.BeanUtils; +import static com.zteits.urbanops.framework.common.pojo.CommonResult.success; + +import com.zteits.urbanops.framework.excel.core.util.ExcelUtils; + +import com.zteits.urbanops.framework.apilog.core.annotation.ApiAccessLog; +import static com.zteits.urbanops.framework.apilog.core.enums.OperateTypeEnum.*; + +import com.zteits.urbanops.module.garden.controller.admin.unitintegraltotal.vo.*; +import com.zteits.urbanops.module.garden.dal.dataobject.unitintegraltotal.UnitIntegralTotalDO; +import com.zteits.urbanops.module.garden.service.unitintegraltotal.UnitIntegralTotalService; + +@Tag(name = "管理后台 - 单位积分累计") +@RestController +@RequestMapping("/garden/unit-integral-total") +@Validated +public class UnitIntegralTotalController { + + @Resource + private UnitIntegralTotalService unitIntegralTotalService; + + @Resource + private UnitIntegralService unitIntegralService; + + @PostMapping("/create") + @Operation(summary = "创建单位积分累计") + @PreAuthorize("@ss.hasPermission('garden:unit-integral-total:create')") + public CommonResult createUnitIntegralTotal(@Valid @RequestBody UnitIntegralTotalSaveReqVO createReqVO) { + return success(unitIntegralTotalService.createUnitIntegralTotal(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新单位积分累计") + @PreAuthorize("@ss.hasPermission('garden:unit-integral-total:update')") + public CommonResult updateUnitIntegralTotal(@Valid @RequestBody UnitIntegralTotalSaveReqVO updateReqVO) { + unitIntegralTotalService.updateUnitIntegralTotal(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除单位积分累计") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('garden:unit-integral-total:delete')") + public CommonResult deleteUnitIntegralTotal(@RequestParam("id") Long id) { + unitIntegralTotalService.deleteUnitIntegralTotal(id); + return success(true); + } + + @DeleteMapping("/delete-list") + @Parameter(name = "ids", description = "编号", required = true) + @Operation(summary = "批量删除单位积分累计") + @PreAuthorize("@ss.hasPermission('garden:unit-integral-total:delete')") + public CommonResult deleteUnitIntegralTotalList(@RequestParam("ids") List ids) { + unitIntegralTotalService.deleteUnitIntegralTotalListByIds(ids); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得单位积分累计") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('garden:unit-integral-total:query')") + public CommonResult getUnitIntegralTotal(@RequestParam("id") Long id) { + UnitIntegralTotalDO unitIntegralTotal = unitIntegralTotalService.getUnitIntegralTotal(id); + return success(BeanUtils.toBean(unitIntegralTotal, UnitIntegralTotalRespVO.class)); + } + + @GetMapping("/page") + @Operation(summary = "获得单位积分累计分页") + @PreAuthorize("@ss.hasPermission('garden:unit-integral-total:query')") + public CommonResult> getUnitIntegralTotalPage(@Valid UnitIntegralTotalPageReqVO pageReqVO) { + PageResult pageResult = unitIntegralTotalService.getUnitIntegralTotalPage(pageReqVO); + return success(BeanUtils.toBean(pageResult, UnitIntegralTotalRespVO.class)); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出单位积分累计 Excel") + @PreAuthorize("@ss.hasPermission('garden:unit-integral-total:export')") + @ApiAccessLog(operateType = EXPORT) + public void exportUnitIntegralTotalExcel(@Valid UnitIntegralTotalPageReqVO pageReqVO, + HttpServletResponse response) throws IOException { + pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); + List list = unitIntegralTotalService.getUnitIntegralTotalPage(pageReqVO).getList(); + // 导出 Excel + ExcelUtils.write(response, "单位积分累计.xls", "数据", UnitIntegralTotalRespVO.class, + BeanUtils.toBean(list, UnitIntegralTotalRespVO.class)); + } + + @PostMapping ("/unitIntegralCreate") + public void testCreate() { + unitIntegralService.createUnitIntegral("01", "200", "测试"); + } + + @PostMapping ("/unitIntegralAdd") + public void testAdd() { + UnitIntegralSaveReqVO updateReqVO = new UnitIntegralSaveReqVO(); + updateReqVO.setTotalIntegral(100); + updateReqVO.setUnitType("01"); + updateReqVO.setUnitId("100"); + updateReqVO.setUnitName("西城园林"); + updateReqVO.setSourceType("01"); + updateReqVO.setReason("测试"); + updateReqVO.setRelatedTaskId(11111111111L); + updateReqVO.setRelatedTaskName("任务派发"); + + unitIntegralService.addUnitIntegral(updateReqVO); + } + @PostMapping ("/unitIntegralSub") + public void testSub() { + UnitIntegralSaveReqVO updateReqVO = new UnitIntegralSaveReqVO(); + updateReqVO.setTotalIntegral(100); + updateReqVO.setUnitType("01"); + updateReqVO.setUnitId("100"); + updateReqVO.setUnitName("西城园林"); + updateReqVO.setSourceType("01"); + updateReqVO.setReason("测试"); + updateReqVO.setRelatedTaskId(11111111112L); + updateReqVO.setRelatedTaskName("任务派发"); + + unitIntegralService.subUnitIntegral(updateReqVO); + } +} diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/unitintegraltotal/vo/UnitIntegralRespVO.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/unitintegraltotal/vo/UnitIntegralRespVO.java new file mode 100644 index 0000000..b6e12c9 --- /dev/null +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/unitintegraltotal/vo/UnitIntegralRespVO.java @@ -0,0 +1,19 @@ +package com.zteits.urbanops.module.garden.controller.admin.unitintegraltotal.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +@Schema(description = "管理后台 - 单位积分累计新增/修改 Request VO") +@Data +public class UnitIntegralRespVO { + @Schema(description = "来源类型 01:派单", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + private String sourceType; + + @Schema(description = "关联ID(关联业务表主键)", requiredMode = Schema.RequiredMode.REQUIRED, example = "24947") + private Long relatedTaskId; + + @Schema(description = "当前总积分") + private Integer totalIntegral; + + +} diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/unitintegraltotal/vo/UnitIntegralSaveReqVO.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/unitintegraltotal/vo/UnitIntegralSaveReqVO.java new file mode 100644 index 0000000..3328dc6 --- /dev/null +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/unitintegraltotal/vo/UnitIntegralSaveReqVO.java @@ -0,0 +1,62 @@ +package com.zteits.urbanops.module.garden.controller.admin.unitintegraltotal.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; +import lombok.Data; +import org.apache.commons.lang3.StringUtils; + +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; + +@Schema(description = "管理后台 - 单位积分累计新增/修改 Request VO") +@Data +public class UnitIntegralSaveReqVO { + @Schema(description = "查询日期", requiredMode = Schema.RequiredMode.REQUIRED, example = "yyyy") + private String statDate; + + @Schema(description = "单位类型:01:公司 02:班组 03:个人", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotEmpty(message = "单位类型:01:公司 02:班组 03:个人不能为空") + private String unitType; + + @Schema(description = "单位ID(部门表 id)", requiredMode = Schema.RequiredMode.REQUIRED, example = "22785") + @NotEmpty(message = "单位ID(部门表 id)不能为空") + private String unitId; + + @Schema(description = "单位名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "西城") + @NotEmpty(message = "单位名称不能为空") + private String unitName; + + @Schema(description = "当前总积分") + private Integer totalIntegral; + + @Schema(description = "来源类型 01:派单", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotEmpty(message = "来源类型 01:派单不能为空") + private String sourceType; + + @Schema(description = "关联ID(关联业务表主键)", requiredMode = Schema.RequiredMode.REQUIRED, example = "24947") + @NotNull(message = "关联ID(关联业务表主键)不能为空") + private Long relatedTaskId; + + @Schema(description = "业务名称(冗余)", example = "张三") + private String relatedTaskName; + + @Schema(description = "原因", requiredMode = Schema.RequiredMode.REQUIRED, example = "不好") + private String reason; + + @Schema(description = "工单号") + private String workNo; + + public String getStatDate() { + if (StringUtils.isBlank(statDate)) { + // 获取当前年份,转为字符串(如 2026) + return LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy")); + } + // 2. 若有值,直接返回(兼容传入的年份) + return statDate; + } + + public void setStatDate(String statDate) { + this.statDate = statDate; + } +} diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/unitintegraltotal/vo/UnitIntegralTotalPageReqVO.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/unitintegraltotal/vo/UnitIntegralTotalPageReqVO.java new file mode 100644 index 0000000..e0c185e --- /dev/null +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/unitintegraltotal/vo/UnitIntegralTotalPageReqVO.java @@ -0,0 +1,44 @@ +package com.zteits.urbanops.module.garden.controller.admin.unitintegraltotal.vo; + +import lombok.*; +import java.util.*; +import io.swagger.v3.oas.annotations.media.Schema; +import com.zteits.urbanops.framework.common.pojo.PageParam; +import org.springframework.format.annotation.DateTimeFormat; +import java.time.LocalDateTime; + +import static com.zteits.urbanops.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - 单位积分累计分页 Request VO") +@Data +public class UnitIntegralTotalPageReqVO extends PageParam { + + @Schema(description = "积分汇总的统计日期(格式:YYYY)") + private String statDate; + + @Schema(description = "单位类型:01:公司 02:班组 03:个人", example = "1") + private String unitType; + + @Schema(description = "单位ID(部门表 id)", example = "22785") + private String unitId; + + @Schema(description = "单位名称", example = "王五") + private String unitName; + + @Schema(description = "当前总积分(累计增加-累计扣减)") + private Integer totalIntegral; + + @Schema(description = "累计增加积分") + private Integer totalAdd; + + @Schema(description = "累计扣减积分") + private Integer totalSub; + + @Schema(description = "备注", example = "你猜") + private String remark; + + @Schema(description = "关联记录创建时间(派单给单位的时间)") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + +} diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/unitintegraltotal/vo/UnitIntegralTotalRespVO.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/unitintegraltotal/vo/UnitIntegralTotalRespVO.java new file mode 100644 index 0000000..3d61ebb --- /dev/null +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/unitintegraltotal/vo/UnitIntegralTotalRespVO.java @@ -0,0 +1,55 @@ +package com.zteits.urbanops.module.garden.controller.admin.unitintegraltotal.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import org.springframework.format.annotation.DateTimeFormat; +import java.time.LocalDateTime; +import cn.idev.excel.annotation.*; + +@Schema(description = "管理后台 - 单位积分累计 Response VO") +@Data +@ExcelIgnoreUnannotated +public class UnitIntegralTotalRespVO { + + @Schema(description = "主键ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "640") + @ExcelProperty("主键ID") + private Long id; + + @Schema(description = "积分汇总的统计日期(格式:YYYY)", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("积分汇总的统计日期(格式:YYYY)") + private String statDate; + + @Schema(description = "单位类型:01:公司 02:班组 03:个人", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @ExcelProperty("单位类型:01:公司 02:班组 03:个人") + private String unitType; + + @Schema(description = "单位ID(部门表 id)", requiredMode = Schema.RequiredMode.REQUIRED, example = "22785") + @ExcelProperty("单位ID(部门表 id)") + private String unitId; + + @Schema(description = "单位名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "王五") + @ExcelProperty("单位名称") + private String unitName; + + @Schema(description = "当前总积分(累计增加-累计扣减)") + @ExcelProperty("当前总积分(累计增加-累计扣减)") + private Integer totalIntegral; + + @Schema(description = "累计增加积分") + @ExcelProperty("累计增加积分") + private Integer totalAdd; + + @Schema(description = "累计扣减积分") + @ExcelProperty("累计扣减积分") + private Integer totalSub; + + @Schema(description = "备注", example = "你猜") + @ExcelProperty("备注") + private String remark; + + @Schema(description = "关联记录创建时间(派单给单位的时间)", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("关联记录创建时间(派单给单位的时间)") + private LocalDateTime createTime; + +} \ No newline at end of file diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/unitintegraltotal/vo/UnitIntegralTotalSaveReqVO.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/unitintegraltotal/vo/UnitIntegralTotalSaveReqVO.java new file mode 100644 index 0000000..51d6072 --- /dev/null +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/unitintegraltotal/vo/UnitIntegralTotalSaveReqVO.java @@ -0,0 +1,43 @@ +package com.zteits.urbanops.module.garden.controller.admin.unitintegraltotal.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; +import java.util.*; +import jakarta.validation.constraints.*; + +@Schema(description = "管理后台 - 单位积分累计新增/修改 Request VO") +@Data +public class UnitIntegralTotalSaveReqVO { + + @Schema(description = "主键ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "640") + private Long id; + + @Schema(description = "积分汇总的统计日期(格式:YYYY)", requiredMode = Schema.RequiredMode.REQUIRED) + @NotEmpty(message = "积分汇总的统计日期(格式:YYYY)不能为空") + private String statDate; + + @Schema(description = "单位类型:01:公司 02:班组 03:个人", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotEmpty(message = "单位类型:01:公司 02:班组 03:个人不能为空") + private String unitType; + + @Schema(description = "单位ID(部门表 id)", requiredMode = Schema.RequiredMode.REQUIRED, example = "22785") + @NotEmpty(message = "单位ID(部门表 id)不能为空") + private String unitId; + + @Schema(description = "单位名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "王五") + @NotEmpty(message = "单位名称不能为空") + private String unitName; + + @Schema(description = "当前总积分(累计增加-累计扣减)") + private Integer totalIntegral; + + @Schema(description = "累计增加积分") + private Integer totalAdd; + + @Schema(description = "累计扣减积分") + private Integer totalSub; + + @Schema(description = "备注", example = "你猜") + private String remark; + +} \ No newline at end of file diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/convert/AssignTaskConvert.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/convert/AssignTaskConvert.java index 0fc0bf0..a507a7a 100644 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/convert/AssignTaskConvert.java +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/convert/AssignTaskConvert.java @@ -2,16 +2,18 @@ package com.zteits.urbanops.module.garden.convert; import com.zteits.urbanops.framework.common.pojo.PageResult; -import com.zteits.urbanops.framework.common.util.collection.CollectionUtils; import com.zteits.urbanops.framework.common.util.object.BeanUtils; import com.zteits.urbanops.module.garden.controller.admin.assigntasksinfo.vo.AssignTasksInfoRespVO; +import com.zteits.urbanops.module.garden.controller.admin.unitintegraltotal.vo.UnitIntegralRespVO; import com.zteits.urbanops.module.garden.dal.dataobject.assigntasks.AssignTasksDO; import com.zteits.urbanops.module.garden.dal.dataobject.assigntasksinfo.AssignTasksInfoDO; import org.mapstruct.Mapper; import org.mapstruct.factory.Mappers; +import java.util.Collections; import java.util.List; import java.util.Map; +import java.util.stream.Collectors; /** * @Classname AssignTaskConvert @@ -23,25 +25,94 @@ import java.util.Map; public interface AssignTaskConvert { AssignTaskConvert INSTANCE = Mappers.getMapper(AssignTaskConvert.class); - default PageResult buildTaskPage(PageResult pageResult, Map taskMap) { - List taskVOList = CollectionUtils.convertList(pageResult.getList(), task -> { - AssignTasksInfoRespVO taskVO = BeanUtils.toBean(task, AssignTasksInfoRespVO.class); - AssignTasksDO tasksDO = taskMap.get(taskVO.getTaskId()); - if (tasksDO != null) { - taskVO.setTaskName(tasksDO.getTaskName()); - taskVO.setTaskType(tasksDO.getTaskType()); - taskVO.setDeadline(tasksDO.getDeadline()); - } - return taskVO; - }); + default PageResult buildTaskPage(PageResult pageResult, List unitIntegralList) { + //1.源列表为空直接返回空列表 + if (org.apache.commons.collections4.CollectionUtils.isEmpty(pageResult.getList())) { + return new PageResult<>(Collections.emptyList(), pageResult.getTotal()); + } + //2、构建积分Map:Key为String类型的任务ID(匹配relatedTaskId的类型),避免类型不匹配 + Map integralMap = org.apache.commons.collections4.CollectionUtils.isEmpty(pageResult.getList()) + ? Collections.emptyMap() : unitIntegralList.stream() + .collect( + Collectors.toMap(UnitIntegralRespVO::getRelatedTaskId, + integral -> integral, + (existing, replacement) -> replacement + ) + ); + // 3. 转换任务DO为VO,并绑定积分 + List taskVOList = pageResult.getList().stream() + .map(taskDO -> { + // 转换DO到VO + AssignTasksInfoRespVO taskVO = new AssignTasksInfoRespVO(); + BeanUtils.copyProperties(taskDO, taskVO); + + // 4. 匹配积分:将Long类型的taskId转为String,匹配Map的Key + Long taskIdStr = taskDO.getId() == null ? null : taskDO.getId(); + UnitIntegralRespVO integralVO = integralMap.get(taskIdStr); + + // 5. 积分赋值:无积分则设为0 + taskVO.setTotalIntegral(integralVO != null ? integralVO.getTotalIntegral() : 0); + + return taskVO; + }) + .collect(Collectors.toList()); + return new PageResult<>(taskVOList, pageResult.getTotal()); } - default AssignTasksInfoRespVO buildTask(AssignTasksInfoDO tasksInfoDO, AssignTasksDO tasksDO) { + default AssignTasksInfoRespVO buildTask(AssignTasksInfoDO tasksInfoDO, AssignTasksDO tasksDO, List unitIntegralList) { AssignTasksInfoRespVO taskVO = BeanUtils.toBean(tasksInfoDO, AssignTasksInfoRespVO.class); if (tasksDO != null) { taskVO.setTemplateFile(tasksDO.getTemplateFile()); } + //2、构建积分Map:Key为String类型的任务ID(匹配relatedTaskId的类型),避免类型不匹配 + Map integralMap = org.apache.commons.collections4.CollectionUtils.isEmpty(unitIntegralList) + ? Collections.emptyMap() : unitIntegralList.stream() + .collect( + Collectors.toMap(UnitIntegralRespVO::getRelatedTaskId, + integral -> integral, + (existing, replacement) -> replacement + ) + ); + // 4. 匹配积分:将Long类型的taskId转为String,匹配Map的Key + Long taskIdStr = tasksInfoDO.getId() == null ? null : tasksInfoDO.getId(); + UnitIntegralRespVO integralVO = integralMap.get(taskIdStr); + // 5. 积分赋值:无积分则设为0 + taskVO.setTotalIntegral(integralVO != null ? integralVO.getTotalIntegral() : 0); return taskVO; } + default List buildTaskInfo(List assignTaskInfoList, List unitIntegralList) { + //1.源列表为空直接返回空列表 + if (org.apache.commons.collections4.CollectionUtils.isEmpty(assignTaskInfoList)) { + return Collections.emptyList(); + } + //2、构建积分Map:Key为String类型的任务ID(匹配relatedTaskId的类型),避免类型不匹配 + Map integralMap = org.apache.commons.collections4.CollectionUtils.isEmpty(unitIntegralList) + ? Collections.emptyMap() : unitIntegralList.stream() + .collect( + Collectors.toMap(UnitIntegralRespVO::getRelatedTaskId, + integral -> integral, + (existing, replacement) -> replacement + ) + ); + // 3. 转换任务DO为VO,并绑定积分 + List taskVOList = assignTaskInfoList.stream() + .map(taskDO -> { + // 转换DO到VO + AssignTasksInfoRespVO taskVO = new AssignTasksInfoRespVO(); + BeanUtils.copyProperties(taskDO, taskVO); + + // 4. 匹配积分:将Long类型的taskId转为String,匹配Map的Key + Long taskIdStr = taskDO.getId() == null ? null : taskDO.getId(); + UnitIntegralRespVO integralVO = integralMap.get(taskIdStr); + + // 5. 积分赋值:无积分则设为0 + taskVO.setTotalIntegral(integralVO != null ? integralVO.getTotalIntegral() : 0); + + return taskVO; + }) + .collect(Collectors.toList()); + + return taskVOList; + } } diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/dataobject/unitintegraladd/UnitIntegralAddDO.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/dataobject/unitintegraladd/UnitIntegralAddDO.java new file mode 100644 index 0000000..3d58252 --- /dev/null +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/dataobject/unitintegraladd/UnitIntegralAddDO.java @@ -0,0 +1,80 @@ +package com.zteits.urbanops.module.garden.dal.dataobject.unitintegraladd; + +import lombok.*; +import java.util.*; +import java.time.LocalDateTime; +import java.time.LocalDateTime; +import com.baomidou.mybatisplus.annotation.*; +import com.zteits.urbanops.framework.mybatis.core.dataobject.BaseDO; + +/** + * 积分增加记录 DO + * + * @author 超级管理员 + */ +@TableName("garden_unit_integral_add") +@KeySequence("garden_unit_integral_add_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class UnitIntegralAddDO extends BaseDO { + + /** + * 主键ID + */ + @TableId + private Long id; + /** + * 来源类型 01:派单 + */ + private String sourceType; + /** + * 单位类型:01:公司 02:班组 03:个人 + */ + private String unitType; + /** + * 单位ID(部门表 id) + */ + private String unitId; + /** + * 单位名称(冗余,避免联表查询) + */ + private String unitName; + /** + * 关联ID(关联业务表主键) + */ + private Long relatedTaskId; + /** + * 业务名称(冗余) + */ + private String relatedTaskName; + /** + * 本次增加积分(正数) + */ + private Integer addIntegral; + /** + * 增加原因(如:到期前上报奖励、到期后上报奖励等) + */ + private String addReason; + /** + * 增加前总积分(对账用) + */ + private Integer beforeIntegral; + /** + * 增加后总积分(对账用) + */ + private Integer afterIntegral; + /** + * 工单号 + */ + private String workNo; + /** + * 备注(补充积分增加的特殊说明) + */ + private String remark; + + +} \ No newline at end of file diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/dataobject/unitintegralsub/UnitIntegralSubDO.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/dataobject/unitintegralsub/UnitIntegralSubDO.java new file mode 100644 index 0000000..9ff17da --- /dev/null +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/dataobject/unitintegralsub/UnitIntegralSubDO.java @@ -0,0 +1,80 @@ +package com.zteits.urbanops.module.garden.dal.dataobject.unitintegralsub; + +import lombok.*; +import java.util.*; +import java.time.LocalDateTime; +import java.time.LocalDateTime; +import com.baomidou.mybatisplus.annotation.*; +import com.zteits.urbanops.framework.mybatis.core.dataobject.BaseDO; + +/** + * 积分扣减记录 DO + * + * @author 超级管理员 + */ +@TableName("garden_unit_integral_sub") +@KeySequence("garden_unit_integral_sub_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class UnitIntegralSubDO extends BaseDO { + + /** + * 主键ID + */ + @TableId + private Long id; + /** + * 来源类型 01:派单 + */ + private String sourceType; + /** + * 单位类型:01:公司 02:班组 03:个人 + */ + private String unitType; + /** + * 单位ID(部门表 id) + */ + private String unitId; + /** + * 单位名称(冗余,避免联表查询) + */ + private String unitName; + /** + * 关联任务ID(外键,关联业务表主键) + */ + private Long relatedTaskId; + /** + * 业务名称(冗余) + */ + private String relatedTaskName; + /** + * 本次扣减积分(正数,存储扣减数值) + */ + private Integer subIntegral; + /** + * 扣减原因(如:任务打回等) + */ + private String subReason; + /** + * 扣减前总积分(对账用) + */ + private Integer beforeIntegral; + /** + * 扣减后总积分(对账用) + */ + private Integer afterIntegral; + /** + * 工单号 + */ + private String workNo; + /** + * 备注(补充扣减的特殊说明) + */ + private String remark; + + +} \ No newline at end of file diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/dataobject/unitintegraltotal/UnitIntegralTotalDO.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/dataobject/unitintegraltotal/UnitIntegralTotalDO.java new file mode 100644 index 0000000..f61250e --- /dev/null +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/dataobject/unitintegraltotal/UnitIntegralTotalDO.java @@ -0,0 +1,64 @@ +package com.zteits.urbanops.module.garden.dal.dataobject.unitintegraltotal; + +import lombok.*; +import java.util.*; +import java.time.LocalDateTime; +import java.time.LocalDateTime; +import com.baomidou.mybatisplus.annotation.*; +import com.zteits.urbanops.framework.mybatis.core.dataobject.BaseDO; + +/** + * 单位积分累计 DO + * + * @author 超级管理员 + */ +@TableName("garden_unit_integral_total") +@KeySequence("garden_unit_integral_total_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class UnitIntegralTotalDO extends BaseDO { + + /** + * 主键ID + */ + @TableId + private Long id; + /** + * 积分汇总的统计日期(格式:YYYY) + */ + private String statDate; + /** + * 单位类型:01:公司 02:班组 03:个人 + */ + private String unitType; + /** + * 单位ID(部门表 id) + */ + private String unitId; + /** + * 单位名称 + */ + private String unitName; + /** + * 当前总积分(累计增加-累计扣减) + */ + private Integer totalIntegral; + /** + * 累计增加积分 + */ + private Integer totalAdd; + /** + * 累计扣减积分 + */ + private Integer totalSub; + /** + * 备注 + */ + private String remark; + + +} \ No newline at end of file diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/mysql/unitintegraladd/UnitIntegralAddMapper.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/mysql/unitintegraladd/UnitIntegralAddMapper.java new file mode 100644 index 0000000..f4e178d --- /dev/null +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/mysql/unitintegraladd/UnitIntegralAddMapper.java @@ -0,0 +1,38 @@ +package com.zteits.urbanops.module.garden.dal.mysql.unitintegraladd; + +import java.util.*; + +import com.zteits.urbanops.framework.common.pojo.PageResult; +import com.zteits.urbanops.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.zteits.urbanops.framework.mybatis.core.mapper.BaseMapperX; +import com.zteits.urbanops.module.garden.dal.dataobject.unitintegraladd.UnitIntegralAddDO; +import org.apache.ibatis.annotations.Mapper; +import com.zteits.urbanops.module.garden.controller.admin.unitintegraladd.vo.*; + +/** + * 积分增加记录 Mapper + * + * @author 超级管理员 + */ +@Mapper +public interface UnitIntegralAddMapper extends BaseMapperX { + + default PageResult selectPage(UnitIntegralAddPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(UnitIntegralAddDO::getSourceType, reqVO.getSourceType()) + .eqIfPresent(UnitIntegralAddDO::getUnitType, reqVO.getUnitType()) + .eqIfPresent(UnitIntegralAddDO::getUnitId, reqVO.getUnitId()) + .likeIfPresent(UnitIntegralAddDO::getUnitName, reqVO.getUnitName()) + .eqIfPresent(UnitIntegralAddDO::getRelatedTaskId, reqVO.getRelatedTaskId()) + .likeIfPresent(UnitIntegralAddDO::getRelatedTaskName, reqVO.getRelatedTaskName()) + .eqIfPresent(UnitIntegralAddDO::getAddIntegral, reqVO.getAddIntegral()) + .eqIfPresent(UnitIntegralAddDO::getAddReason, reqVO.getAddReason()) + .eqIfPresent(UnitIntegralAddDO::getBeforeIntegral, reqVO.getBeforeIntegral()) + .eqIfPresent(UnitIntegralAddDO::getAfterIntegral, reqVO.getAfterIntegral()) + .eqIfPresent(UnitIntegralAddDO::getWorkNo, reqVO.getWorkNo()) + .eqIfPresent(UnitIntegralAddDO::getRemark, reqVO.getRemark()) + .betweenIfPresent(UnitIntegralAddDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(UnitIntegralAddDO::getId)); + } + +} \ No newline at end of file diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/mysql/unitintegralsub/UnitIntegralSubMapper.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/mysql/unitintegralsub/UnitIntegralSubMapper.java new file mode 100644 index 0000000..caf2283 --- /dev/null +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/mysql/unitintegralsub/UnitIntegralSubMapper.java @@ -0,0 +1,38 @@ +package com.zteits.urbanops.module.garden.dal.mysql.unitintegralsub; + +import java.util.*; + +import com.zteits.urbanops.framework.common.pojo.PageResult; +import com.zteits.urbanops.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.zteits.urbanops.framework.mybatis.core.mapper.BaseMapperX; +import com.zteits.urbanops.module.garden.dal.dataobject.unitintegralsub.UnitIntegralSubDO; +import org.apache.ibatis.annotations.Mapper; +import com.zteits.urbanops.module.garden.controller.admin.unitintegralsub.vo.*; + +/** + * 积分扣减记录 Mapper + * + * @author 超级管理员 + */ +@Mapper +public interface UnitIntegralSubMapper extends BaseMapperX { + + default PageResult selectPage(UnitIntegralSubPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(UnitIntegralSubDO::getSourceType, reqVO.getSourceType()) + .eqIfPresent(UnitIntegralSubDO::getUnitType, reqVO.getUnitType()) + .eqIfPresent(UnitIntegralSubDO::getUnitId, reqVO.getUnitId()) + .likeIfPresent(UnitIntegralSubDO::getUnitName, reqVO.getUnitName()) + .eqIfPresent(UnitIntegralSubDO::getRelatedTaskId, reqVO.getRelatedTaskId()) + .likeIfPresent(UnitIntegralSubDO::getRelatedTaskName, reqVO.getRelatedTaskName()) + .eqIfPresent(UnitIntegralSubDO::getSubIntegral, reqVO.getSubIntegral()) + .eqIfPresent(UnitIntegralSubDO::getSubReason, reqVO.getSubReason()) + .eqIfPresent(UnitIntegralSubDO::getBeforeIntegral, reqVO.getBeforeIntegral()) + .eqIfPresent(UnitIntegralSubDO::getAfterIntegral, reqVO.getAfterIntegral()) + .eqIfPresent(UnitIntegralSubDO::getWorkNo, reqVO.getWorkNo()) + .eqIfPresent(UnitIntegralSubDO::getRemark, reqVO.getRemark()) + .betweenIfPresent(UnitIntegralSubDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(UnitIntegralSubDO::getId)); + } + +} \ No newline at end of file diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/mysql/unitintegraltotal/UnitIntegralTotalMapper.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/mysql/unitintegraltotal/UnitIntegralTotalMapper.java new file mode 100644 index 0000000..1a45cfb --- /dev/null +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/mysql/unitintegraltotal/UnitIntegralTotalMapper.java @@ -0,0 +1,43 @@ +package com.zteits.urbanops.module.garden.dal.mysql.unitintegraltotal; + +import java.util.*; + +import com.zteits.urbanops.framework.common.pojo.PageResult; +import com.zteits.urbanops.framework.mybatis.core.query.LambdaQueryWrapperX; +import com.zteits.urbanops.framework.mybatis.core.mapper.BaseMapperX; +import com.zteits.urbanops.module.garden.dal.dataobject.unitintegraltotal.UnitIntegralTotalDO; +import org.apache.ibatis.annotations.Mapper; +import com.zteits.urbanops.module.garden.controller.admin.unitintegraltotal.vo.*; +import org.apache.ibatis.annotations.Param; + +/** + * 单位积分累计 Mapper + * + * @author 超级管理员 + */ +@Mapper +public interface UnitIntegralTotalMapper extends BaseMapperX { + + default PageResult selectPage(UnitIntegralTotalPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(UnitIntegralTotalDO::getStatDate, reqVO.getStatDate()) + .eqIfPresent(UnitIntegralTotalDO::getUnitType, reqVO.getUnitType()) + .eqIfPresent(UnitIntegralTotalDO::getUnitId, reqVO.getUnitId()) + .likeIfPresent(UnitIntegralTotalDO::getUnitName, reqVO.getUnitName()) + .eqIfPresent(UnitIntegralTotalDO::getTotalIntegral, reqVO.getTotalIntegral()) + .eqIfPresent(UnitIntegralTotalDO::getTotalAdd, reqVO.getTotalAdd()) + .eqIfPresent(UnitIntegralTotalDO::getTotalSub, reqVO.getTotalSub()) + .eqIfPresent(UnitIntegralTotalDO::getRemark, reqVO.getRemark()) + .betweenIfPresent(UnitIntegralTotalDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(UnitIntegralTotalDO::getId)); + } + + + /** + * 根据任务ID列表统计总积分 + * @param relatedTaskIds 关联任务ID列表 + * @return 积分统计结果 + */ + List queryIntegralByRelatedTaskIds(@Param("relatedTaskIds") List relatedTaskIds); + +} diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/enums/CommonConstants.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/enums/CommonConstants.java index 7f8b04b..0bf87a0 100644 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/enums/CommonConstants.java +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/enums/CommonConstants.java @@ -14,4 +14,16 @@ public interface CommonConstants { public static final String QUERY_TYPE_SOURCE_ID = "source_id"; + /*单位*/ + public static final String UNIT_INTEGRAL_UNIT_TYPE_01 = "01"; + + /*班组*/ + public static final String UNIT_INTEGRAL_UNIT_TYPE_02 = "02"; + + /*个人*/ + public static final String UNIT_INTEGRAL_UNIT_TYPE_03 = "03"; + + + /*积分来源 01:任务反馈*/ + public static final String UNIT_INTEGRAL_SOURCE_TYPE_01 = "01"; } diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/enums/ErrorCodeConstants.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/enums/ErrorCodeConstants.java index 7e000f8..fc9e478 100644 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/enums/ErrorCodeConstants.java +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/enums/ErrorCodeConstants.java @@ -137,6 +137,9 @@ public interface ErrorCodeConstants { ErrorCode ROAD_MANAGER_NOT_EXISTS = new ErrorCode(1-100-006-001, "道路管理不存在"); + ErrorCode DEVICE_CLOCK_RECORD_NOT_EXISTS = new ErrorCode(1-100-011-001, ""); + ErrorCode UNIT_INTEGRAL_TOTAL_NOT_EXISTS = new ErrorCode(1-100-012-001, "单位积分累计不存在"); + ErrorCode UNIT_INTEGRAL_ADD_NOT_EXISTS = new ErrorCode(1-100-012-002, "积分增加记录不存在"); - + ErrorCode UNIT_INTEGRAL_SUB_NOT_EXISTS = new ErrorCode(1-100-012-003, "积分扣减记录不存在"); } diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/assigntasksinfo/AssignTasksInfoServiceImpl.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/assigntasksinfo/AssignTasksInfoServiceImpl.java index d1cd72f..63e928b 100644 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/assigntasksinfo/AssignTasksInfoServiceImpl.java +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/assigntasksinfo/AssignTasksInfoServiceImpl.java @@ -7,11 +7,14 @@ import com.zteits.urbanops.framework.common.util.object.BeanUtils; import com.zteits.urbanops.module.garden.controller.admin.assigntasksinfo.vo.AssignTasksInfoPageReqVO; import com.zteits.urbanops.module.garden.controller.admin.assigntasksinfo.vo.AssignTasksInfoSaveReqVO; import com.zteits.urbanops.module.garden.controller.admin.assigntasksinfo.vo.AssignTasksInfoUpdReqVO; +import com.zteits.urbanops.module.garden.controller.admin.unitintegraltotal.vo.UnitIntegralSaveReqVO; import com.zteits.urbanops.module.garden.dal.dataobject.assigntasks.AssignTasksDO; import com.zteits.urbanops.module.garden.dal.dataobject.assigntasksinfo.AssignTasksInfoDO; import com.zteits.urbanops.module.garden.dal.mysql.assigntasks.AssignTasksMapper; import com.zteits.urbanops.module.garden.dal.mysql.assigntasksinfo.AssignTasksInfoMapper; import com.zteits.urbanops.module.garden.enums.AssignTasksConstants; +import com.zteits.urbanops.module.garden.enums.CommonConstants; +import com.zteits.urbanops.module.garden.service.unitintegraltotal.UnitIntegralService; import com.zteits.urbanops.module.system.api.dept.DeptApi; import com.zteits.urbanops.module.system.api.dept.dto.DeptRespDTO; import com.zteits.urbanops.module.system.api.permission.RoleApi; @@ -19,24 +22,29 @@ import com.zteits.urbanops.module.system.api.sms.SmsCodeApi; import com.zteits.urbanops.module.system.api.sms.dto.code.SmsCodeSendReqDTO; import com.zteits.urbanops.module.system.api.user.AdminUserApi; import com.zteits.urbanops.module.system.api.user.dto.AdminUserRespDTO; -import com.zteits.urbanops.module.system.dal.dataobject.permission.RoleDO; import jakarta.annotation.Resource; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.CollectionUtils; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.annotation.Validated; import java.time.LocalDateTime; import java.time.ZoneId; import java.time.format.DateTimeFormatter; -import java.util.*; +import java.time.temporal.ChronoUnit; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; import java.util.stream.Collectors; import static com.zteits.urbanops.framework.common.exception.enums.GlobalErrorCodeConstants.BAD_REQUEST; import static com.zteits.urbanops.framework.common.exception.util.ServiceExceptionUtil.exception; import static com.zteits.urbanops.framework.common.exception.util.ServiceExceptionUtil.exception0; import static com.zteits.urbanops.framework.common.util.servlet.ServletUtils.getClientIP; -import static com.zteits.urbanops.framework.security.core.util.SecurityFrameworkUtils.*; +import static com.zteits.urbanops.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; +import static com.zteits.urbanops.framework.security.core.util.SecurityFrameworkUtils.getLoginUserNickname; import static com.zteits.urbanops.module.garden.enums.ErrorCodeConstants.*; /** @@ -65,6 +73,9 @@ public class AssignTasksInfoServiceImpl implements AssignTasksInfoService { @Resource private SmsCodeApi smsCodeApi; + @Resource + private UnitIntegralService unitIntegralService; + // 时间格式常量(与之前保持一致) public static final String FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND = "yyyy-MM-dd HH:mm:ss"; @@ -156,6 +167,8 @@ public class AssignTasksInfoServiceImpl implements AssignTasksInfoService { assignTaskInfo.setTaskType(assignTasks.getTaskType()); assignTaskInfo.setDeadline(assignTasks.getDeadline()); assignTasksInfoMapper.insert(assignTaskInfo); + // add by 20260307 初始化单位积分 + unitIntegralService.createUnitIntegral(CommonConstants.UNIT_INTEGRAL_UNIT_TYPE_01, String.valueOf(companyId), assignTaskInfo.getCompanyName()); } } } @@ -170,6 +183,7 @@ public class AssignTasksInfoServiceImpl implements AssignTasksInfoService { //派单驳回 @Override + @Transactional public int rejectAssignTaskCompany(AssignTasksInfoUpdReqVO tdAssignTaskCompany) { AssignTasksInfoDO assignTaskInfo = assignTasksInfoMapper.selectById(tdAssignTaskCompany.getId()); //单位任务完成状态(0:未完成,1:已完成) @@ -181,6 +195,19 @@ public class AssignTasksInfoServiceImpl implements AssignTasksInfoService { updateAssignTaskInfo.setIsReject(AssignTasksConstants.ASSIGN_TASK_REJECT_1); updateAssignTaskInfo.setRejectRemark(tdAssignTaskCompany.getRejectRemark()); updateAssignTaskInfo.setNewFlag(AssignTasksConstants.ASSIGN_TASK_NEWFLAG_0); + + //add bt 20260307 驳回积分扣减 + UnitIntegralSaveReqVO updateReqVO = new UnitIntegralSaveReqVO(); + updateReqVO.setUnitType(CommonConstants.UNIT_INTEGRAL_UNIT_TYPE_01); + updateReqVO.setUnitId(String.valueOf(updateAssignTaskInfo.getCompanyId())); + updateReqVO.setUnitName(updateAssignTaskInfo.getCompanyName()); + updateReqVO.setSourceType(CommonConstants.UNIT_INTEGRAL_SOURCE_TYPE_01); + updateReqVO.setRelatedTaskId(assignTaskInfo.getId()); + updateReqVO.setRelatedTaskName(updateAssignTaskInfo.getTaskName()); + updateReqVO.setTotalIntegral(getUnitCurIngeral(assignTaskInfo.getDeadline())); + updateReqVO.setReason("任务上报驳回积分扣减"); + unitIntegralService.subUnitIntegral(updateReqVO); + return assignTasksInfoMapper.updateById(updateAssignTaskInfo); } else { throw exception(ASSIGN_TASKS_INFO_TASKID_REJECT); @@ -266,6 +293,7 @@ public class AssignTasksInfoServiceImpl implements AssignTasksInfoService { } @Override + @Transactional public int feedbackAssignTaskCompany(AssignTasksInfoUpdReqVO tdAssignTaskCompany) { AssignTasksInfoDO assignTaskInfo = assignTasksInfoMapper.selectById(tdAssignTaskCompany.getId()); if (assignTaskInfo != null) { @@ -280,9 +308,55 @@ public class AssignTasksInfoServiceImpl implements AssignTasksInfoService { updateAssignTaskInfo.setWritePersonId(String.valueOf(user.getId())); updateAssignTaskInfo.setWritePerson(getLoginUserNickname()); updateAssignTaskInfo.setWritePersonPhone(user.getMobile()); + + // add 增加单位积分 + UnitIntegralSaveReqVO updateReqVO = new UnitIntegralSaveReqVO(); + updateReqVO.setUnitType(CommonConstants.UNIT_INTEGRAL_UNIT_TYPE_01); + updateReqVO.setUnitId(String.valueOf(updateAssignTaskInfo.getCompanyId())); + updateReqVO.setUnitName(updateAssignTaskInfo.getCompanyName()); + updateReqVO.setSourceType(CommonConstants.UNIT_INTEGRAL_SOURCE_TYPE_01); + updateReqVO.setRelatedTaskId(assignTaskInfo.getId()); + updateReqVO.setRelatedTaskName(updateAssignTaskInfo.getTaskName()); + + updateReqVO.setTotalIntegral(getUnitCurIngeral(assignTaskInfo.getDeadline())); + if (1 == updateReqVO.getTotalIntegral()) { + updateReqVO.setReason("超时任务上报"); + } + updateReqVO.setReason("任务上报"); + unitIntegralService.addUnitIntegral(updateReqVO); + return assignTasksInfoMapper.updateById(updateAssignTaskInfo); } else { throw exception(ASSIGN_TASKS_INFO_NOT_EXISTS); } } + /** + * @Author wangqian + * @Description 获取单位当前积分 + * 1、已填报&未超期 展示3分 + * + * 2、已填报&超期 展示1分 + * + * 3、未填报 展示0分 + * @Date 2026/3/8 13:23 + * @Param + * @Return java.lang.Integer + */ + private Integer getUnitCurIngeral(LocalDateTime deadline){ + if (deadline == null) { + throw exception0(BAD_REQUEST.getCode(), "截止时间为null"); + } + LocalDateTime now = LocalDateTime.now().truncatedTo(ChronoUnit.SECONDS); + boolean isOverdue = deadline.isBefore(now); + log.info("截止时间:{},当前时间:{},超期判定:{},返回积分:{}", + deadline, now, isOverdue, isOverdue ? 1 : 3); + return isOverdue ? 1 : 3; + } + // 测试方法(验证逻辑正确性) + public static void main(String[] args) { + AssignTasksInfoServiceImpl uitl = new AssignTasksInfoServiceImpl(); + // 测试1:未超期(截止时间为1小时后) + LocalDateTime notOverdue = LocalDateTime.now().plusHours(1); + System.out.println(uitl.getUnitCurIngeral(notOverdue)); // 输出3 + } } diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/unitintegraladd/UnitIntegralAddService.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/unitintegraladd/UnitIntegralAddService.java new file mode 100644 index 0000000..9aa78ca --- /dev/null +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/unitintegraladd/UnitIntegralAddService.java @@ -0,0 +1,62 @@ +package com.zteits.urbanops.module.garden.service.unitintegraladd; + +import java.util.*; +import jakarta.validation.*; +import com.zteits.urbanops.module.garden.controller.admin.unitintegraladd.vo.*; +import com.zteits.urbanops.module.garden.dal.dataobject.unitintegraladd.UnitIntegralAddDO; +import com.zteits.urbanops.framework.common.pojo.PageResult; +import com.zteits.urbanops.framework.common.pojo.PageParam; + +/** + * 积分增加记录 Service 接口 + * + * @author 超级管理员 + */ +public interface UnitIntegralAddService { + + /** + * 创建积分增加记录 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createUnitIntegralAdd(@Valid UnitIntegralAddSaveReqVO createReqVO); + + /** + * 更新积分增加记录 + * + * @param updateReqVO 更新信息 + */ + void updateUnitIntegralAdd(@Valid UnitIntegralAddSaveReqVO updateReqVO); + + /** + * 删除积分增加记录 + * + * @param id 编号 + */ + void deleteUnitIntegralAdd(Long id); + + /** + * 批量删除积分增加记录 + * + * @param ids 编号 + */ + void deleteUnitIntegralAddListByIds(List ids); + + /** + * 获得积分增加记录 + * + * @param id 编号 + * @return 积分增加记录 + */ + UnitIntegralAddDO getUnitIntegralAdd(Long id); + + /** + * 获得积分增加记录分页 + * + * @param pageReqVO 分页查询 + * @return 积分增加记录分页 + */ + PageResult getUnitIntegralAddPage(UnitIntegralAddPageReqVO pageReqVO); + +} \ No newline at end of file diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/unitintegraladd/UnitIntegralAddServiceImpl.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/unitintegraladd/UnitIntegralAddServiceImpl.java new file mode 100644 index 0000000..49862d6 --- /dev/null +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/unitintegraladd/UnitIntegralAddServiceImpl.java @@ -0,0 +1,85 @@ +package com.zteits.urbanops.module.garden.service.unitintegraladd; + +import cn.hutool.core.collection.CollUtil; +import org.springframework.stereotype.Service; +import jakarta.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.transaction.annotation.Transactional; + +import java.util.*; +import com.zteits.urbanops.module.garden.controller.admin.unitintegraladd.vo.*; +import com.zteits.urbanops.module.garden.dal.dataobject.unitintegraladd.UnitIntegralAddDO; +import com.zteits.urbanops.framework.common.pojo.PageResult; +import com.zteits.urbanops.framework.common.pojo.PageParam; +import com.zteits.urbanops.framework.common.util.object.BeanUtils; + +import com.zteits.urbanops.module.garden.dal.mysql.unitintegraladd.UnitIntegralAddMapper; + +import static com.zteits.urbanops.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.zteits.urbanops.framework.common.util.collection.CollectionUtils.convertList; +import static com.zteits.urbanops.framework.common.util.collection.CollectionUtils.diffList; +import static com.zteits.urbanops.module.garden.enums.ErrorCodeConstants.*; + +/** + * 积分增加记录 Service 实现类 + * + * @author 超级管理员 + */ +@Service +@Validated +public class UnitIntegralAddServiceImpl implements UnitIntegralAddService { + + @Resource + private UnitIntegralAddMapper unitIntegralAddMapper; + + @Override + public Long createUnitIntegralAdd(UnitIntegralAddSaveReqVO createReqVO) { + // 插入 + UnitIntegralAddDO unitIntegralAdd = BeanUtils.toBean(createReqVO, UnitIntegralAddDO.class); + unitIntegralAddMapper.insert(unitIntegralAdd); + + // 返回 + return unitIntegralAdd.getId(); + } + + @Override + public void updateUnitIntegralAdd(UnitIntegralAddSaveReqVO updateReqVO) { + // 校验存在 + validateUnitIntegralAddExists(updateReqVO.getId()); + // 更新 + UnitIntegralAddDO updateObj = BeanUtils.toBean(updateReqVO, UnitIntegralAddDO.class); + unitIntegralAddMapper.updateById(updateObj); + } + + @Override + public void deleteUnitIntegralAdd(Long id) { + // 校验存在 + validateUnitIntegralAddExists(id); + // 删除 + unitIntegralAddMapper.deleteById(id); + } + + @Override + public void deleteUnitIntegralAddListByIds(List ids) { + // 删除 + unitIntegralAddMapper.deleteByIds(ids); + } + + + private void validateUnitIntegralAddExists(Long id) { + if (unitIntegralAddMapper.selectById(id) == null) { + throw exception(UNIT_INTEGRAL_ADD_NOT_EXISTS); + } + } + + @Override + public UnitIntegralAddDO getUnitIntegralAdd(Long id) { + return unitIntegralAddMapper.selectById(id); + } + + @Override + public PageResult getUnitIntegralAddPage(UnitIntegralAddPageReqVO pageReqVO) { + return unitIntegralAddMapper.selectPage(pageReqVO); + } + +} \ No newline at end of file diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/unitintegralsub/UnitIntegralSubService.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/unitintegralsub/UnitIntegralSubService.java new file mode 100644 index 0000000..4044baf --- /dev/null +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/unitintegralsub/UnitIntegralSubService.java @@ -0,0 +1,62 @@ +package com.zteits.urbanops.module.garden.service.unitintegralsub; + +import java.util.*; +import jakarta.validation.*; +import com.zteits.urbanops.module.garden.controller.admin.unitintegralsub.vo.*; +import com.zteits.urbanops.module.garden.dal.dataobject.unitintegralsub.UnitIntegralSubDO; +import com.zteits.urbanops.framework.common.pojo.PageResult; +import com.zteits.urbanops.framework.common.pojo.PageParam; + +/** + * 积分扣减记录 Service 接口 + * + * @author 超级管理员 + */ +public interface UnitIntegralSubService { + + /** + * 创建积分扣减记录 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createUnitIntegralSub(@Valid UnitIntegralSubSaveReqVO createReqVO); + + /** + * 更新积分扣减记录 + * + * @param updateReqVO 更新信息 + */ + void updateUnitIntegralSub(@Valid UnitIntegralSubSaveReqVO updateReqVO); + + /** + * 删除积分扣减记录 + * + * @param id 编号 + */ + void deleteUnitIntegralSub(Long id); + + /** + * 批量删除积分扣减记录 + * + * @param ids 编号 + */ + void deleteUnitIntegralSubListByIds(List ids); + + /** + * 获得积分扣减记录 + * + * @param id 编号 + * @return 积分扣减记录 + */ + UnitIntegralSubDO getUnitIntegralSub(Long id); + + /** + * 获得积分扣减记录分页 + * + * @param pageReqVO 分页查询 + * @return 积分扣减记录分页 + */ + PageResult getUnitIntegralSubPage(UnitIntegralSubPageReqVO pageReqVO); + +} \ No newline at end of file diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/unitintegralsub/UnitIntegralSubServiceImpl.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/unitintegralsub/UnitIntegralSubServiceImpl.java new file mode 100644 index 0000000..ab4b134 --- /dev/null +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/unitintegralsub/UnitIntegralSubServiceImpl.java @@ -0,0 +1,85 @@ +package com.zteits.urbanops.module.garden.service.unitintegralsub; + +import cn.hutool.core.collection.CollUtil; +import org.springframework.stereotype.Service; +import jakarta.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.transaction.annotation.Transactional; + +import java.util.*; +import com.zteits.urbanops.module.garden.controller.admin.unitintegralsub.vo.*; +import com.zteits.urbanops.module.garden.dal.dataobject.unitintegralsub.UnitIntegralSubDO; +import com.zteits.urbanops.framework.common.pojo.PageResult; +import com.zteits.urbanops.framework.common.pojo.PageParam; +import com.zteits.urbanops.framework.common.util.object.BeanUtils; + +import com.zteits.urbanops.module.garden.dal.mysql.unitintegralsub.UnitIntegralSubMapper; + +import static com.zteits.urbanops.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.zteits.urbanops.framework.common.util.collection.CollectionUtils.convertList; +import static com.zteits.urbanops.framework.common.util.collection.CollectionUtils.diffList; +import static com.zteits.urbanops.module.garden.enums.ErrorCodeConstants.*; + +/** + * 积分扣减记录 Service 实现类 + * + * @author 超级管理员 + */ +@Service +@Validated +public class UnitIntegralSubServiceImpl implements UnitIntegralSubService { + + @Resource + private UnitIntegralSubMapper unitIntegralSubMapper; + + @Override + public Long createUnitIntegralSub(UnitIntegralSubSaveReqVO createReqVO) { + // 插入 + UnitIntegralSubDO unitIntegralSub = BeanUtils.toBean(createReqVO, UnitIntegralSubDO.class); + unitIntegralSubMapper.insert(unitIntegralSub); + + // 返回 + return unitIntegralSub.getId(); + } + + @Override + public void updateUnitIntegralSub(UnitIntegralSubSaveReqVO updateReqVO) { + // 校验存在 + validateUnitIntegralSubExists(updateReqVO.getId()); + // 更新 + UnitIntegralSubDO updateObj = BeanUtils.toBean(updateReqVO, UnitIntegralSubDO.class); + unitIntegralSubMapper.updateById(updateObj); + } + + @Override + public void deleteUnitIntegralSub(Long id) { + // 校验存在 + validateUnitIntegralSubExists(id); + // 删除 + unitIntegralSubMapper.deleteById(id); + } + + @Override + public void deleteUnitIntegralSubListByIds(List ids) { + // 删除 + unitIntegralSubMapper.deleteByIds(ids); + } + + + private void validateUnitIntegralSubExists(Long id) { + if (unitIntegralSubMapper.selectById(id) == null) { + throw exception(UNIT_INTEGRAL_SUB_NOT_EXISTS); + } + } + + @Override + public UnitIntegralSubDO getUnitIntegralSub(Long id) { + return unitIntegralSubMapper.selectById(id); + } + + @Override + public PageResult getUnitIntegralSubPage(UnitIntegralSubPageReqVO pageReqVO) { + return unitIntegralSubMapper.selectPage(pageReqVO); + } + +} \ No newline at end of file diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/unitintegraltotal/UnitIntegralService.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/unitintegraltotal/UnitIntegralService.java new file mode 100644 index 0000000..25b2286 --- /dev/null +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/unitintegraltotal/UnitIntegralService.java @@ -0,0 +1,69 @@ +package com.zteits.urbanops.module.garden.service.unitintegraltotal; + +import com.zteits.urbanops.module.garden.controller.admin.unitintegraladd.vo.UnitIntegralAddRespVO; +import com.zteits.urbanops.module.garden.controller.admin.unitintegraltotal.vo.UnitIntegralRespVO; +import com.zteits.urbanops.module.garden.controller.admin.unitintegraltotal.vo.UnitIntegralSaveReqVO; +import com.zteits.urbanops.module.garden.dal.dataobject.unitintegraladd.UnitIntegralAddDO; +import jakarta.validation.Valid; + +import java.util.List; +import java.util.Map; + +/** + * @Classname UnitIntegralService + * @Description 单位积分操作 + * @Date 2026/3/6 12:17 + * @Created by wangqian + */ +public interface UnitIntegralService { + + /** + * @Author wangqian + * @Description 单位积分表初始化 + * @Date 2026/3/7 11:10 + * @Param unitType + * @Param unitId + * @param unitName + * @Return void + */ + void createUnitIntegral(String unitType, String unitId, String unitName); + + /** + * @Author wangqian + * @Description 根据关联表id查询单位积分 + * @Date 2026/3/8 11:34 + * @Param relatedTaskId + * @Return java.util.List + */ + List queryIntegralByRelatedTaskIds(@Valid List relatedTaskIds); + + /** + * @Author wangqian + * @Description 获取最后一条增加的积分 + * @Date 2026/3/8 13:39 + */ + UnitIntegralAddRespVO queryLastIntegralByRelatedTaskId(@Valid Long relatedTaskId); + + /** + * @Author wangqian + * @Description 增加积分 + * @Date 2026/3/6 12:20 + * @Param updateReqVO + * @Return void + */ + void addUnitIntegral(@Valid UnitIntegralSaveReqVO reqVO); + + + /** + * @Author wangqian + * @Description 扣减积分 + * @Date 2026/3/6 12:20 + * @Param updateReqVO + * @Return void + */ + void subUnitIntegral(@Valid UnitIntegralSaveReqVO reqVO); + + + + +} diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/unitintegraltotal/UnitIntegralServiceImpl.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/unitintegraltotal/UnitIntegralServiceImpl.java new file mode 100644 index 0000000..7c03d27 --- /dev/null +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/unitintegraltotal/UnitIntegralServiceImpl.java @@ -0,0 +1,316 @@ +package com.zteits.urbanops.module.garden.service.unitintegraltotal; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.zteits.urbanops.framework.common.util.object.BeanUtils; +import com.zteits.urbanops.module.garden.controller.admin.unitintegraladd.vo.UnitIntegralAddRespVO; +import com.zteits.urbanops.module.garden.controller.admin.unitintegraladd.vo.UnitIntegralAddSaveReqVO; +import com.zteits.urbanops.module.garden.controller.admin.unitintegralsub.vo.UnitIntegralSubSaveReqVO; +import com.zteits.urbanops.module.garden.controller.admin.unitintegraltotal.vo.UnitIntegralRespVO; +import com.zteits.urbanops.module.garden.controller.admin.unitintegraltotal.vo.UnitIntegralSaveReqVO; +import com.zteits.urbanops.module.garden.dal.dataobject.unitintegraladd.UnitIntegralAddDO; +import com.zteits.urbanops.module.garden.dal.dataobject.unitintegraltotal.UnitIntegralTotalDO; +import com.zteits.urbanops.module.garden.dal.mysql.unitintegraladd.UnitIntegralAddMapper; +import com.zteits.urbanops.module.garden.dal.mysql.unitintegraltotal.UnitIntegralTotalMapper; +import com.zteits.urbanops.module.garden.service.unitintegraladd.UnitIntegralAddService; +import com.zteits.urbanops.module.garden.service.unitintegralsub.UnitIntegralSubService; +import jakarta.annotation.Resource; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.redisson.api.RLock; +import org.redisson.api.RedissonClient; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.List; +import java.util.concurrent.TimeUnit; + +import static com.zteits.urbanops.framework.common.exception.enums.GlobalErrorCodeConstants.BAD_REQUEST; +import static com.zteits.urbanops.framework.common.exception.enums.GlobalErrorCodeConstants.INTERNAL_SERVER_ERROR; +import static com.zteits.urbanops.framework.common.exception.util.ServiceExceptionUtil.exception0; +import static com.zteits.urbanops.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; + +/** + * @Classname UnitIntegralServiceImpl + * @Description 单位积分操作 + * @Date 2026/3/6 12:39 + * @Created by wangqian + */ +@Service +@Slf4j +public class UnitIntegralServiceImpl implements UnitIntegralService{ + + @Resource + private UnitIntegralTotalMapper unitIntegralTotalMapper; + @Resource + private UnitIntegralAddMapper unitIntegralAddMapper; + + @Resource + private UnitIntegralSubService unitIntegralSubService; + + @Resource + private UnitIntegralAddService unitIntegralAddService; + @Resource + private RedissonClient redissonClient; + + // 锁前缀(区分加/减积分锁) + private static final String LOCK_PREFIX_INTEGRAL = "integral:"; + + // 统一构建锁Key + private String buildLockKey(String unitId, String statDate) { + return LOCK_PREFIX_INTEGRAL + unitId + ":" + statDate; + } + /** + * 初始化积分表 + */ + @Override + public void createUnitIntegral(String unitType, String unitId, String unitName) { + String statDate = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy")); + // 1. 参数校验 + if (StringUtils.isEmpty(unitType)) { + throw exception0(BAD_REQUEST.getCode(),"单位类型不能为空"); + } + if (StringUtils.isEmpty(unitId)) { + throw exception0(BAD_REQUEST.getCode(),"单位编码不能为空"); + } + LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery(UnitIntegralTotalDO.class) + .eq(UnitIntegralTotalDO::getUnitType, unitType) + .eq(UnitIntegralTotalDO::getStatDate, statDate) + .eq(UnitIntegralTotalDO::getUnitId, unitId) + .eq(UnitIntegralTotalDO::getDeleted, 0); + UnitIntegralTotalDO unitIntegralTotalDO = unitIntegralTotalMapper.selectOne(queryWrapper); + if (unitIntegralTotalDO != null) { + String errorMsg = String.format("初始化单位积分,单位ID:%s,已存在", unitId); + throw exception0(BAD_REQUEST.getCode(),errorMsg); + } + UnitIntegralTotalDO saveDO = new UnitIntegralTotalDO(); + saveDO.setStatDate(statDate); + saveDO.setTotalAdd(0); // 累计增加 = 本次增加 + saveDO.setTotalSub(0); // 初始扣减为0 + saveDO.setTotalIntegral(0); // 初始总积分 = 本次增加 + saveDO.setUnitType(unitType); + saveDO.setUnitId(unitId); + if (StringUtils.isEmpty(unitName)) { + //数据库查询补全 + } else { + saveDO.setUnitName(unitName); + } + unitIntegralTotalMapper.insert(saveDO); + } + + @Override + public List queryIntegralByRelatedTaskIds(List relatedTaskIds) { + return unitIntegralTotalMapper.queryIntegralByRelatedTaskIds(relatedTaskIds); + } + + @Override + public UnitIntegralAddRespVO queryLastIntegralByRelatedTaskId(Long relatedTaskId) { + LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery(UnitIntegralAddDO.class) + .eq(UnitIntegralAddDO::getRelatedTaskId, relatedTaskId) + .eq(UnitIntegralAddDO::getDeleted, 0) + .orderByDesc(UnitIntegralAddDO::getId) + .last("LIMIT 1"); // 取第一条(MyBatis-Plus通用写法,兼容多数数据库) + UnitIntegralAddDO unitIntegralAddDO = unitIntegralAddMapper.selectOne(queryWrapper); + if (unitIntegralAddDO == null) { + return null; + } + return BeanUtils.toBean(unitIntegralAddDO, UnitIntegralAddRespVO.class); + } + + /** + * 增加单位积分(核心方法) + * @param reqVO 积分增加请求(注意:totalIntegral 为「本次增加积分」) + */ + @Override + @Transactional(rollbackFor = Exception.class) + public void addUnitIntegral(UnitIntegralSaveReqVO reqVO){ + // 1. 参数校验 + if (reqVO.getTotalIntegral() <= 0) { + throw exception0(BAD_REQUEST.getCode(),"本次增加积分必须为正数"); + } + + // 2. 构建细粒度锁Key:单位ID + 统计日期 + 操作类型 + String lockKey = buildLockKey(reqVO.getUnitId(), reqVO.getStatDate()); + RLock lock = redissonClient.getLock(lockKey); + + // 3. 获取锁(非阻塞,避免线程等待;3秒获取超时,10秒自动过期防死锁) + boolean lockAcquired = false; + try { + lockAcquired = lock.tryLock(3, 10, TimeUnit.SECONDS); + if (!lockAcquired) { + String errorMsg = String.format("获取积分增加锁失败,单位ID:%s,统计日期:%s(请稍后重试)", reqVO.getUnitId(), reqVO.getStatDate()); + log.error(errorMsg); + throw exception0(INTERNAL_SERVER_ERROR.getCode(), errorMsg); + } + + // 2. 构建查询条件 + LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery(UnitIntegralTotalDO.class) + .eq(UnitIntegralTotalDO::getUnitType, reqVO.getUnitType()) + .eq(UnitIntegralTotalDO::getStatDate, reqVO.getStatDate()) + .eq(UnitIntegralTotalDO::getUnitId, reqVO.getUnitId()) + .eq(UnitIntegralTotalDO::getDeleted, 0); + + // 3. 可加行锁(FOR UPDATE)防止多线程同时扣减,保证数据一致性 + UnitIntegralTotalDO unitIntegralTotalDO = unitIntegralTotalMapper.selectOne(queryWrapper); + + // 4. 初始化变量(语义清晰,避免冗余) + int beforeIntegral = 0; // 本次增加前的累计增加积分 + int afterIntegral = 0; // 本次增加后的累计增加积分 + int currentAdd = reqVO.getTotalIntegral(); // 本次增加积分(重命名,语义更准) + + // 5. 新增/更新总积分表(核心逻辑) + if (unitIntegralTotalDO != null) { + // 5.1 已有记录:更新积分 + beforeIntegral = unitIntegralTotalDO.getTotalAdd(); + int newTotalAdd = beforeIntegral + currentAdd; + // 更新累计增加积分 + 当前总积分(累计增加 - 累计扣减) + unitIntegralTotalDO.setTotalAdd(newTotalAdd); + unitIntegralTotalDO.setTotalIntegral(newTotalAdd - unitIntegralTotalDO.getTotalSub()); + unitIntegralTotalDO.setUpdateTime(LocalDateTime.now()); + unitIntegralTotalDO.setUpdater(String.valueOf(getLoginUserId())); + unitIntegralTotalMapper.updateById(unitIntegralTotalDO); + afterIntegral = newTotalAdd; + + log.info("更新单位积分成功,单位ID:{},统计日期:{},本次增加:{},累计增加:{}", + reqVO.getUnitId(), reqVO.getStatDate(), currentAdd, newTotalAdd); + } else { + // 5.2 无记录:插入新记录 + UnitIntegralTotalDO saveDO = new UnitIntegralTotalDO(); + BeanUtils.copyProperties(reqVO, saveDO); + saveDO.setTotalAdd(currentAdd); // 累计增加 = 本次增加 + saveDO.setTotalSub(0); // 初始扣减为0 + saveDO.setTotalIntegral(currentAdd); // 初始总积分 = 本次增加 + unitIntegralTotalMapper.insert(saveDO); + afterIntegral = currentAdd; + + log.info("新增单位积分成功,单位ID:{},统计日期:{},本次增加:{}", + reqVO.getUnitId(), reqVO.getStatDate(), currentAdd); + } + // 5. 新增积分明细 + createAddDetail(reqVO, beforeIntegral, afterIntegral, currentAdd); + log.info("积分增加成功,单位ID:{},本次增加:{}", reqVO.getUnitId(), currentAdd); + + } catch (InterruptedException e) { + log.error("获取锁被中断,单位ID:{}", reqVO.getUnitId(), e); + Thread.currentThread().interrupt(); // 恢复中断状态 + throw exception0(INTERNAL_SERVER_ERROR.getCode(), "积分增加操作被中断,请重试"); + } finally { + // 6. 释放锁(仅当前线程持有锁时释放,避免误删) + if (lockAcquired && lock.isHeldByCurrentThread()) { + lock.unlock(); + log.debug("释放积分增加锁,锁Key:{}", lockKey); + } + } + } + /** + * 封装增加明细创建逻辑 + */ + private void createAddDetail(UnitIntegralSaveReqVO reqVO, int before, int after, int currentAdd) { + UnitIntegralAddSaveReqVO detailVO = new UnitIntegralAddSaveReqVO(); + BeanUtils.copyProperties(reqVO, detailVO); + detailVO.setAddIntegral(currentAdd); // 本次增加积分 + detailVO.setBeforeIntegral(before); // 增加前累计扣减积分 + detailVO.setAfterIntegral(after); // 增加后累计扣减积分 + detailVO.setAddReason(reqVO.getReason()); + unitIntegralAddService.createUnitIntegralAdd(detailVO); + } + /** + * 扣减单位积分(核心方法) + * @param reqVO 积分扣减请求(totalIntegral 为「本次扣减积分」) + */ + @Override + @Transactional(rollbackFor = Exception.class) + public void subUnitIntegral(UnitIntegralSaveReqVO reqVO){ + // 1. 前置参数校验 + if (reqVO.getTotalIntegral() <= 0) { + throw exception0(BAD_REQUEST.getCode(),"本次增加积分必须为正数"); + } + + // 2. 构建细粒度锁Key:单位ID + 统计日期 + String lockKey = buildLockKey(reqVO.getUnitId(), reqVO.getStatDate()); + RLock lock = redissonClient.getLock(lockKey); + + // 3. 获取锁(非阻塞,避免线程等待;3秒获取超时,10秒自动过期防死锁) + boolean lockAcquired = false; + try { + lockAcquired = lock.tryLock(3, 10, TimeUnit.SECONDS); + if (!lockAcquired) { + String errorMsg = String.format("获取积分增加锁失败,单位ID:%s,统计日期:%s(请稍后重试)", reqVO.getUnitId(), reqVO.getStatDate()); + log.error(errorMsg); + throw exception0(INTERNAL_SERVER_ERROR.getCode(), errorMsg); + } + // 2. 构建查询条件 + LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery(UnitIntegralTotalDO.class) + .eq(UnitIntegralTotalDO::getUnitType, reqVO.getUnitType()) + .eq(UnitIntegralTotalDO::getStatDate, reqVO.getStatDate()) + .eq(UnitIntegralTotalDO::getUnitId, reqVO.getUnitId()) + .eq(UnitIntegralTotalDO::getDeleted, 0); // 排除已删除的积分记录 + + // 3. 可加行锁(FOR UPDATE)防止多线程同时扣减,保证数据一致性 + //UnitIntegralTotalDO unitIntegralTotalDO = unitIntegralTotalMapper.selectOne(queryWrapper.last("FOR UPDATE")); + UnitIntegralTotalDO unitIntegralTotalDO = unitIntegralTotalMapper.selectOne(queryWrapper); + // 4. 校验积分记录是否存在 + if (unitIntegralTotalDO == null) { + String errorMsg = String.format("单位积分记录不存在,单位ID:%s,统计日期:%s", + reqVO.getUnitId(), reqVO.getStatDate()); + log.error(errorMsg); + throw exception0(BAD_REQUEST.getCode(),errorMsg); + } + + // 5. 初始化核心变量 + int currentSub = reqVO.getTotalIntegral(); // 本次扣减积分 + int beforeSub = unitIntegralTotalDO.getTotalSub(); // 扣减前累计扣减积分 + int afterSub = beforeSub + currentSub; // 扣减后累计扣减积分 + int currentTotalIntegral = unitIntegralTotalDO.getTotalAdd() - afterSub; // 扣减后总积分 + + // 6. 业务规则校验:扣减后总积分不能为负数 + if (currentTotalIntegral < 0) { + String errorMsg = String.format("单位积分扣减失败,扣减后总积分为负!单位ID:%s,当前累计增加:%s,本次扣减:%s,累计扣减:%s", + reqVO.getUnitId(), unitIntegralTotalDO.getTotalAdd(), currentSub, beforeSub); + log.error(errorMsg); + throw exception0(BAD_REQUEST.getCode(),errorMsg); + } + + // 7. 更新积分总表(核心扣减逻辑) + unitIntegralTotalDO.setTotalSub(afterSub); // 更新累计扣减积分 + unitIntegralTotalDO.setTotalIntegral(currentTotalIntegral); // 更新当前总积分 + unitIntegralTotalDO.setUpdateTime(LocalDateTime.now()); + unitIntegralTotalDO.setUpdater(String.valueOf(getLoginUserId())); + unitIntegralTotalMapper.updateById(unitIntegralTotalDO); + + log.info("单位积分扣减成功,单位ID:{},统计日期:{},本次扣减:{},扣减前累计扣减:{},扣减后累计扣减:{},扣减后总积分:{}", + reqVO.getUnitId(), reqVO.getStatDate(), currentSub, beforeSub, afterSub, currentTotalIntegral); + + // 8. 新增扣减明细 + // 新增减积分明细 + createSubDetail(reqVO, beforeSub, afterSub, currentSub); + log.info("单位{}减积分成功,本次减{},累计减{},剩余{}", + reqVO.getUnitId(), currentSub, afterSub, currentSub); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + throw exception0(INTERNAL_SERVER_ERROR.getCode(), "积分操作被中断,请重试"); + } finally { + if (lockAcquired && lock.isHeldByCurrentThread()) { + lock.unlock(); + } + } + } + + /** + * 封装扣减明细创建逻辑 + */ + private void createSubDetail(UnitIntegralSaveReqVO updateReqVO, int beforeSub, int afterSub, int currentSub) { + UnitIntegralSubSaveReqVO detailVO = new UnitIntegralSubSaveReqVO(); + BeanUtils.copyProperties(updateReqVO, detailVO); + detailVO.setSubIntegral(currentSub); // 本次扣减积分 + detailVO.setBeforeIntegral(beforeSub); // 扣减前累计扣减积分 + detailVO.setAfterIntegral(afterSub); // 扣减后累计扣减积分 + detailVO.setSubReason(updateReqVO.getReason()); + unitIntegralSubService.createUnitIntegralSub(detailVO); + log.info("新增积分扣减明细成功,单位ID:{},明细ID:{}", updateReqVO.getUnitId(), detailVO.getId()); + } + +} diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/unitintegraltotal/UnitIntegralTotalService.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/unitintegraltotal/UnitIntegralTotalService.java new file mode 100644 index 0000000..f1e8f9e --- /dev/null +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/unitintegraltotal/UnitIntegralTotalService.java @@ -0,0 +1,62 @@ +package com.zteits.urbanops.module.garden.service.unitintegraltotal; + +import java.util.*; +import jakarta.validation.*; +import com.zteits.urbanops.module.garden.controller.admin.unitintegraltotal.vo.*; +import com.zteits.urbanops.module.garden.dal.dataobject.unitintegraltotal.UnitIntegralTotalDO; +import com.zteits.urbanops.framework.common.pojo.PageResult; +import com.zteits.urbanops.framework.common.pojo.PageParam; + +/** + * 单位积分累计 Service 接口 + * + * @author 超级管理员 + */ +public interface UnitIntegralTotalService { + + /** + * 创建单位积分累计 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createUnitIntegralTotal(@Valid UnitIntegralTotalSaveReqVO createReqVO); + + /** + * 更新单位积分累计 + * + * @param updateReqVO 更新信息 + */ + void updateUnitIntegralTotal(@Valid UnitIntegralTotalSaveReqVO updateReqVO); + + /** + * 删除单位积分累计 + * + * @param id 编号 + */ + void deleteUnitIntegralTotal(Long id); + + /** + * 批量删除单位积分累计 + * + * @param ids 编号 + */ + void deleteUnitIntegralTotalListByIds(List ids); + + /** + * 获得单位积分累计 + * + * @param id 编号 + * @return 单位积分累计 + */ + UnitIntegralTotalDO getUnitIntegralTotal(Long id); + + /** + * 获得单位积分累计分页 + * + * @param pageReqVO 分页查询 + * @return 单位积分累计分页 + */ + PageResult getUnitIntegralTotalPage(UnitIntegralTotalPageReqVO pageReqVO); + +} \ No newline at end of file diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/unitintegraltotal/UnitIntegralTotalServiceImpl.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/unitintegraltotal/UnitIntegralTotalServiceImpl.java new file mode 100644 index 0000000..20b003d --- /dev/null +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/unitintegraltotal/UnitIntegralTotalServiceImpl.java @@ -0,0 +1,85 @@ +package com.zteits.urbanops.module.garden.service.unitintegraltotal; + +import cn.hutool.core.collection.CollUtil; +import org.springframework.stereotype.Service; +import jakarta.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.transaction.annotation.Transactional; + +import java.util.*; +import com.zteits.urbanops.module.garden.controller.admin.unitintegraltotal.vo.*; +import com.zteits.urbanops.module.garden.dal.dataobject.unitintegraltotal.UnitIntegralTotalDO; +import com.zteits.urbanops.framework.common.pojo.PageResult; +import com.zteits.urbanops.framework.common.pojo.PageParam; +import com.zteits.urbanops.framework.common.util.object.BeanUtils; + +import com.zteits.urbanops.module.garden.dal.mysql.unitintegraltotal.UnitIntegralTotalMapper; + +import static com.zteits.urbanops.framework.common.exception.util.ServiceExceptionUtil.exception; +import static com.zteits.urbanops.framework.common.util.collection.CollectionUtils.convertList; +import static com.zteits.urbanops.framework.common.util.collection.CollectionUtils.diffList; +import static com.zteits.urbanops.module.garden.enums.ErrorCodeConstants.*; + +/** + * 单位积分累计 Service 实现类 + * + * @author 超级管理员 + */ +@Service +@Validated +public class UnitIntegralTotalServiceImpl implements UnitIntegralTotalService { + + @Resource + private UnitIntegralTotalMapper unitIntegralTotalMapper; + + @Override + public Long createUnitIntegralTotal(UnitIntegralTotalSaveReqVO createReqVO) { + // 插入 + UnitIntegralTotalDO unitIntegralTotal = BeanUtils.toBean(createReqVO, UnitIntegralTotalDO.class); + unitIntegralTotalMapper.insert(unitIntegralTotal); + + // 返回 + return unitIntegralTotal.getId(); + } + + @Override + public void updateUnitIntegralTotal(UnitIntegralTotalSaveReqVO updateReqVO) { + // 校验存在 + validateUnitIntegralTotalExists(updateReqVO.getId()); + // 更新 + UnitIntegralTotalDO updateObj = BeanUtils.toBean(updateReqVO, UnitIntegralTotalDO.class); + unitIntegralTotalMapper.updateById(updateObj); + } + + @Override + public void deleteUnitIntegralTotal(Long id) { + // 校验存在 + validateUnitIntegralTotalExists(id); + // 删除 + unitIntegralTotalMapper.deleteById(id); + } + + @Override + public void deleteUnitIntegralTotalListByIds(List ids) { + // 删除 + unitIntegralTotalMapper.deleteByIds(ids); + } + + + private void validateUnitIntegralTotalExists(Long id) { + if (unitIntegralTotalMapper.selectById(id) == null) { + throw exception(UNIT_INTEGRAL_TOTAL_NOT_EXISTS); + } + } + + @Override + public UnitIntegralTotalDO getUnitIntegralTotal(Long id) { + return unitIntegralTotalMapper.selectById(id); + } + + @Override + public PageResult getUnitIntegralTotalPage(UnitIntegralTotalPageReqVO pageReqVO) { + return unitIntegralTotalMapper.selectPage(pageReqVO); + } + +} \ No newline at end of file diff --git a/urbanops-module-garden/src/main/resources/mapper/unitintegraltotal/UnitIntegralTotalMapper.xml b/urbanops-module-garden/src/main/resources/mapper/unitintegraltotal/UnitIntegralTotalMapper.xml new file mode 100644 index 0000000..da25ab7 --- /dev/null +++ b/urbanops-module-garden/src/main/resources/mapper/unitintegraltotal/UnitIntegralTotalMapper.xml @@ -0,0 +1,37 @@ + + + + + + + +