package com.ruoyi.lavorissue.controller; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.approve.pojo.ApproveProcess; import com.ruoyi.approve.utils.DailyRedisCounter; import com.ruoyi.approve.utils.StartAndEndDateDto; import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.framework.aspectj.lang.annotation.Log; import com.ruoyi.framework.aspectj.lang.enums.BusinessType; import com.ruoyi.framework.web.controller.BaseController; import com.ruoyi.framework.web.domain.AjaxResult; import com.ruoyi.lavorissue.dto.LaborIssueDto; import com.ruoyi.lavorissue.dto.StatisticsLaborIssue; import com.ruoyi.lavorissue.mapper.LavorIssueMapper; import com.ruoyi.lavorissue.pojo.LaborIssue; import com.ruoyi.lavorissue.service.LavorIssueService; import com.ruoyi.project.system.domain.SysDept; import com.ruoyi.project.system.domain.SysDictData; import com.ruoyi.project.system.mapper.SysDeptMapper; import com.ruoyi.project.system.service.ISysDictDataService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; import javax.servlet.http.HttpServletResponse; import java.io.UnsupportedEncodingException; import java.text.SimpleDateFormat; import java.time.LocalDate; import java.time.format.DateTimeFormatter; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; /** * @author :yys * @date : 2025/8/13 11:19 */ @RestController @Api(tags = "劳保发放") @RequestMapping("/lavorIssue") public class LavorIssueController extends BaseController { @Autowired private LavorIssueService laborIssueService; @Autowired private LavorIssueMapper lavorIssueMapper; @Autowired private SysDeptMapper sysDeptMapper; @Autowired private ISysDictDataService iSysDictDataService; @GetMapping("/listPage") @Log(title = "劳保发放-分页查询", businessType = BusinessType.OTHER) @ApiOperation("劳保发放-分页查询") public AjaxResult listPage(Page page, LaborIssue laborIssue){ IPage listPage = laborIssueService.listPage(page, laborIssue); return AjaxResult.success(listPage); } @GetMapping("/statisticsList") @Log(title = "劳保发放-统计查询", businessType = BusinessType.OTHER) @ApiOperation("劳保发放-统计查询") public AjaxResult statisticsList(LaborIssue laborIssue){ List> listPage = laborIssueService.statisticsList(laborIssue); return AjaxResult.success(listPage); } /** * 根据 dictId 分组统计领用数量(num)总和 * @param laborIssueList 原始数据列表 * @return key: dictId, value: 该字典下的总领用数量 */ public Map statisticsByDictId(List laborIssueList) { // 空值校验,避免空指针异常 if (laborIssueList == null || laborIssueList.isEmpty()) { return new HashMap<>(); // 低版本可用 new HashMap<>() } // 核心分组统计逻辑 return laborIssueList.stream() // 过滤掉无效数据(dictId为空 或 num为空/小于0的情况) .filter(dto -> dto.getDictId() != null && !dto.getDictId().isEmpty()) .filter(dto -> dto.getNum() != null && dto.getNum() >= 0) // 按 dictId 分组,累加 num 数量 .collect(Collectors.groupingBy( LaborIssueDto::getDictId, // 分组依据:dictId Collectors.summingLong(LaborIssueDto::getNum) // 求和:num )); } @PostMapping("/add") @Log(title = "劳保发放-添加", businessType = BusinessType.INSERT) @ApiOperation("劳保发放-添加") @Transactional(rollbackFor = Exception.class) public AjaxResult add(@RequestBody LaborIssue laborIssue){ SysDictData dictData = new SysDictData(); dictData.setDictType("sys_lavor_issue"); List sysDictData = iSysDictDataService.selectDictDataList(dictData); Map stringLongMap = statisticsByDictId(laborIssue.getLaborIssueList()); // 判断库存是否充足 for (SysDictData sysDictDatum : sysDictData) { Long aLong = stringLongMap.get(sysDictDatum.getDictValue()); if (aLong != null && aLong > sysDictDatum.getNum()) { throw new RuntimeException("库存不足"); } } for (LaborIssueDto issue : laborIssue.getLaborIssueList()) { LaborIssue laborIssue1 = new LaborIssue(); BeanUtils.copyProperties(laborIssue, laborIssue1); BeanUtils.copyProperties(issue, laborIssue1); String today = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd")); StartAndEndDateDto dateTime = DailyRedisCounter.getDateTime(); Long approveId = lavorIssueMapper.selectCount(new LambdaQueryWrapper() .gt(LaborIssue::getCreateTime, dateTime.getStartDate()) .lt(LaborIssue::getCreateTime, dateTime.getEndDate())); String formattedCount = String.format("%03d", approveId + 1); laborIssue1.setOrderNo(today + formattedCount); List laborIssues = lavorIssueMapper.selectList(new LambdaQueryWrapper() .like(LaborIssue::getOrderNo, today) .orderByDesc(LaborIssue::getOrderNo) .last("LIMIT 1")); if(!CollectionUtils.isEmpty(laborIssues)){ LaborIssue laborIssue2 = laborIssues.get(0); // 当laborIssue2的编号大于laborIssue1的编号,则使用laborIssue2的编号加1 long l = Long.parseLong(laborIssue2.getOrderNo()); long l1 = Long.parseLong(laborIssue1.getOrderNo()); if(l >= l1){ laborIssue1.setOrderNo(l + 1 + ""); } } laborIssueService.save(laborIssue1); // 减库存 List collect = sysDictData .stream() .filter(item -> item.getDictValue().equals(issue.getDictId())) .collect(Collectors.toList()); if(!CollectionUtils.isEmpty(collect)){ SysDictData sysDictData1 = collect.get(0); sysDictData1.setNum(sysDictData1.getNum() - issue.getNum()); iSysDictDataService.updateDictData(sysDictData1); } } return AjaxResult.success(); } @PostMapping("/update") @Log(title = "劳保发放-修改", businessType = BusinessType.UPDATE) @ApiOperation("劳保发放-修改") @Transactional(rollbackFor = Exception.class) public AjaxResult update(@RequestBody LaborIssue laborIssue){ boolean update = laborIssueService.updateById(laborIssue); return update ? AjaxResult.success() : AjaxResult.error(); } @DeleteMapping("/delete") @Log(title = "劳保发放-删除", businessType = BusinessType.DELETE) @ApiOperation("劳保发放-删除") @Transactional(rollbackFor = Exception.class) public AjaxResult delete(@RequestBody List ids){ boolean delete = laborIssueService.removeBatchByIds(ids); return delete ? AjaxResult.success() : AjaxResult.error(); } @GetMapping("/statistics") @ApiOperation("劳保发放-统计") public AjaxResult statistics(StatisticsLaborIssue req) throws Exception { StatisticsLaborIssue statisticsLaborIssue = laborIssueService.statistics(req); return AjaxResult.success(statisticsLaborIssue); } @ApiOperation("发放进度-总计") @GetMapping("/progressTotal") public AjaxResult progressTotal(LaborIssue laborIssue) throws Exception { Map list = laborIssueService.progressTotal(laborIssue); return AjaxResult.success(list); } @ApiOperation("领取进度占比") @GetMapping("/progressPercent") public AjaxResult progressPercent(LaborIssue laborIssue) throws Exception { Map list = laborIssueService.progressPercent(laborIssue); return AjaxResult.success(list); } @ApiOperation("进度分布") @GetMapping("/progressDistribution") public AjaxResult progressDistribution(LaborIssue laborIssue) throws Exception { Map list = laborIssueService.progressDistribution(laborIssue); return AjaxResult.success(list); } /** * 劳保发放-导出 */ @Log(title = "劳保发放-导出", businessType = BusinessType.EXPORT) @PostMapping("/export") @ApiOperation("劳保发放-导出") public void export(HttpServletResponse response) { Long tenantId = SecurityUtils.getLoginUser().getTenantId(); ExcelUtil util = new ExcelUtil(LaborIssue.class); List list = lavorIssueMapper.list(new LaborIssue()); SysDept sysDept = sysDeptMapper.selectDeptById(tenantId); if(sysDept == null){ throw new RuntimeException("部门不存在!"); } list.forEach(item -> { item.setDeptName(sysDept.getDeptName()); }); util.exportExcel(response, list , "劳保台账"); } /** * 劳保发放-导出 */ @Log(title = "劳保发放-导出", businessType = BusinessType.EXPORT) @PostMapping("/exportCopy") @ApiOperation("劳保发放-导出") public void exportCopy(HttpServletResponse response,LaborIssue laborIssue) throws UnsupportedEncodingException { laborIssueService.exportCopy(response,laborIssue); } }