yys
maven
2 天以前 7f616cfc0eeb35dd08cbd070b81661d351386c95
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
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<LaborIssue> listPage = laborIssueService.listPage(page, laborIssue);
        return AjaxResult.success(listPage);
    }
 
    @GetMapping("/statisticsList")
    @Log(title = "劳保发放-统计查询", businessType = BusinessType.OTHER)
    @ApiOperation("劳保发放-统计查询")
    public AjaxResult statisticsList(LaborIssue laborIssue){
        List<Map<String, Object>> listPage = laborIssueService.statisticsList(laborIssue);
        return AjaxResult.success(listPage);
    }
 
    /**
     * 根据 dictId 分组统计领用数量(num)总和
     * @param laborIssueList 原始数据列表
     * @return key: dictId, value: 该字典下的总领用数量
     */
    public Map<String, Long> statisticsByDictId(List<LaborIssueDto> 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> sysDictData = iSysDictDataService.selectDictDataList(dictData);
        Map<String, Long> 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<LaborIssue>()
                    .gt(LaborIssue::getCreateTime, dateTime.getStartDate())
                    .lt(LaborIssue::getCreateTime, dateTime.getEndDate()));
            String formattedCount = String.format("%03d", approveId + 1);
            laborIssue1.setOrderNo(today + formattedCount);
            List<LaborIssue> laborIssues = lavorIssueMapper.selectList(new LambdaQueryWrapper<LaborIssue>()
                    .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<SysDictData> 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<Long> 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<String, Object> list = laborIssueService.progressTotal(laborIssue);
        return AjaxResult.success(list);
    }
 
    @ApiOperation("领取进度占比")
    @GetMapping("/progressPercent")
    public AjaxResult progressPercent(LaborIssue laborIssue) throws Exception {
        Map<String, Object> list = laborIssueService.progressPercent(laborIssue);
        return AjaxResult.success(list);
    }
 
    @ApiOperation("进度分布")
    @GetMapping("/progressDistribution")
    public AjaxResult progressDistribution(LaborIssue laborIssue) throws Exception {
        Map<String, Object> 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<LaborIssue> util = new ExcelUtil<LaborIssue>(LaborIssue.class);
        List<LaborIssue> 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);
    }
 
}