shenyijian
2024-06-15 1a3f1e1aa0651b96fe347ce47591fd0af956d305
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
package cn.gistack.sm.sg.service.impl;
 
import cn.gistack.sm.sg.DO.*;
import cn.gistack.sm.sg.DTO.ApprovalDTO;
import cn.gistack.sm.sg.DTO.ProjectSearchDTO;
import cn.gistack.sm.sg.VO.SgProgressReportVO;
import cn.gistack.sm.sg.mapper.*;
import cn.gistack.sm.sg.service.SgProgressReportService;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper;
import com.baomidou.mybatisplus.extension.conditions.update.LambdaUpdateChainWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springblade.core.log.exception.ServiceException;
import org.springblade.core.secure.utils.AuthUtil;
import org.springblade.core.tool.utils.DateUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
 
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
 
/**
 * <p>
 * 施工进度上报表 服务实现类
 * </p>
 *
 * @author shenyijian
 * @since 2024-06-15 10:22:08
 */
@Service
public class SgProgressReportServiceImpl extends ServiceImpl<SgProgressReportMapper, SgProgressReportDO> implements SgProgressReportService {
    @Autowired
    private SgProgressReportMapper sgProgressReportMapper;
 
    @Autowired
    private SgProjectPersonConfigMapper sgProjectPersonConfigMapper;
 
 
    @Autowired
    private SgGxConfigMapper sgGxConfigMapper;
 
    @Autowired
    private SgDeviceMapper sgDeviceMapper;
 
    @Autowired
    private SgReportUserMapper sgReportUserMapper;
 
    @Autowired
    private SgGxStepMapper sgGxStepMapper;
    @Override
    public IPage<SgProgressReportVO> queryPageList(IPage<SgProgressReportVO> page, ProjectSearchDTO searchDTO) {
        List<SgProgressReportVO> list = sgProgressReportMapper.queryPageList(page,searchDTO);
        return page.setRecords(list);
    }
 
    @Override
    @Transactional
    public void add(SgProgressReportDO sgProgressReportDO) {
        Long gxDeviceId = sgProgressReportDO.getGxDeviceId();
        Long gxStepId = sgProgressReportDO.getGxStepId();
        List<SgGxStepDO> list= sgGxStepMapper.selectByGxInfoId(gxDeviceId);
        SgGxStepDO sgGxStepDO = sgGxStepMapper.selectById(gxDeviceId);
        for (SgGxStepDO gxStepDO : list) {
            if (Integer.parseInt(sgGxStepDO.getGxStepNum()) - Integer.parseInt(gxStepDO.getGxStepNum())==1 ){
                LambdaQueryChainWrapper<SgProgressReportDO> wrapper = new LambdaQueryChainWrapper<>(sgProgressReportMapper).eq(SgProgressReportDO::getGxStepId, gxStepDO.getId());
                SgProgressReportDO one = sgProgressReportMapper.selectOne(wrapper);
                if (one!=null && one.getStatus()!=3){
                    throw new ServiceException("请先完成"+gxStepDO.getGxStepName()+"的审批!");
                }
            }
        }
        Long userId = AuthUtil.getUserId();
        sgProgressReportDO.setStatus(0);
        sgProgressReportDO.setReportUser(userId);
        sgProgressReportMapper.insert(sgProgressReportDO);
        String deviceType = sgDeviceMapper.selectById(gxDeviceId).getDeviceType();
        List<SgGxConfigDO> sgGxConfigDOS = new LambdaQueryChainWrapper<>(sgGxConfigMapper)
            .eq(SgGxConfigDO::getGxDeviceType,deviceType).eq(SgGxConfigDO::getGxStepId,gxStepId).list();
        List<String> roIds = sgGxConfigDOS.stream().map(SgGxConfigDO::getRoleId).collect(Collectors.toList());
        List<SgProjectPersonConfigDO> personConfigDOS = new LambdaQueryChainWrapper<>(sgProjectPersonConfigMapper).in(SgProjectPersonConfigDO::getRoldId, roIds).list();
        Map<Long, Long> userMap = personConfigDOS.stream().collect(Collectors.toMap(SgProjectPersonConfigDO::getRoldId, SgProjectPersonConfigDO::getUserId));
        Date now = DateUtil.now();
        sgReportUserMapper.insert(SgReportUserDO.builder().reportId(sgProgressReportDO.getId()).userId(sgProgressReportDO.getReportUser()).approvalContent("提交审批").approvalStatus(0).approvalOrder(0).approvalTime(now).build()) ;
        for (SgGxConfigDO sgGxConfigDO : sgGxConfigDOS) {
            sgGxConfigDO.setUser(userMap.get(Long.parseLong(sgGxConfigDO.getRoleId())));
            sgReportUserMapper.insert(SgReportUserDO.builder().reportId(sgProgressReportDO.getId()).userId(sgGxConfigDO.getUser()).approvalStatus(0).approvalOrder(sgGxConfigDO.getSgOrder()).build());
            if (sgGxConfigDO.getSgOrder()==1){
                sgProgressReportDO.setAuditPerson(String.valueOf(sgGxConfigDO.getUser()));
                sgProgressReportMapper.updateById(sgProgressReportDO);
            }
        }
    }
 
    @Override
    public SgProgressReportVO detail(String id) {
        SgProgressReportVO sgProgressReportVO = sgProgressReportMapper.queryById(id);
        List<SgReportUserDO> list = new LambdaQueryChainWrapper<>(sgReportUserMapper).eq(SgReportUserDO::getReportId, id).orderByAsc(SgReportUserDO::getApprovalTime).list();
        sgProgressReportVO.setSgReportUserDOS(list);
        return sgProgressReportVO;
    }
 
    /**
     * 审批
     * @param approvalDTO
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void approval(ApprovalDTO approvalDTO) {
        Long id = approvalDTO.getId();
        List<SgReportUserDO> list = new LambdaQueryChainWrapper<>(sgReportUserMapper).eq(SgReportUserDO::getReportId, id).eq(SgReportUserDO::getIsHis,0)
            .eq(SgReportUserDO::getApprovalStatus, 0).orderByDesc(SgReportUserDO::getApprovalOrder).list();
        SgReportUserDO sgReportUserDO = list.stream().filter(s -> s.getUserId().equals(approvalDTO.getUserId())).findFirst().get();
        Date date = new Date();
        LambdaUpdateChainWrapper<SgProgressReportDO> updateChainWrapper = new LambdaUpdateChainWrapper<>(sgProgressReportMapper).eq(SgProgressReportDO::getId, id);
        LambdaUpdateChainWrapper<SgReportUserDO> userUpdate = new LambdaUpdateChainWrapper<>(sgReportUserMapper)
            .eq(SgReportUserDO::getId, sgReportUserDO.getId()).set(SgReportUserDO::getApprovalContent,approvalDTO.getApprovalContent()).set(SgReportUserDO::getApprovalTime,date);
        if (approvalDTO.getStatus()==1){
            userUpdate.set(SgReportUserDO::getApprovalStatus,1).update();
            if (sgReportUserDO.getId()==list.get(0).getId()){
                updateChainWrapper.set(SgProgressReportDO::getStatus,3).set(SgProgressReportDO::getAuditPerson,null).update();
            }else {
                SgReportUserDO nextUser = list.stream().filter(s -> s.getApprovalOrder()==sgReportUserDO.getApprovalOrder()+1).findFirst().get();
                updateChainWrapper.set(SgProgressReportDO::getStatus,1).set(SgProgressReportDO::getAuditPerson,nextUser.getUserId()).update();
            }
        }else {
            updateChainWrapper.set(SgProgressReportDO::getStatus,0);
            List<SgReportUserDO> sgReportUserDOS = new LambdaQueryChainWrapper<>(sgReportUserMapper).eq(SgReportUserDO::getReportId, id).eq(SgReportUserDO::getIsHis,0)
                .orderByAsc(SgReportUserDO::getApprovalOrder).list()
//                .stream().distinct()
//                .stream().filter(s->s.getApprovalOrder()!=0 && s.getApprovalOrder()<= sgReportUserDO.getApprovalOrder()).collect(Collectors.toList())
                ;
            userUpdate.set(SgReportUserDO::getApprovalStatus,2).update();
            for (SgReportUserDO reportUserDO : sgReportUserDOS) {
                if (reportUserDO.getApprovalOrder()<=sgReportUserDO.getApprovalOrder()&&reportUserDO.getApprovalOrder()!=0){
                    //更新为历史数据
                    new LambdaUpdateChainWrapper<>(sgReportUserMapper).eq(SgReportUserDO::getId,reportUserDO.getId()).set(SgReportUserDO::getIsHis,1).update();
                    reportUserDO.setId(null);
                    reportUserDO.setApprovalStatus(0);
                    reportUserDO.setIsHis(0);
                    reportUserDO.setApprovalTime(date);
                    sgReportUserMapper.insert(reportUserDO);
                }else if (reportUserDO.getApprovalOrder()>sgReportUserDO.getApprovalOrder()){
                    reportUserDO.setApprovalTime(date);
                    sgReportUserMapper.updateById(reportUserDO);
                }
                if (reportUserDO.getApprovalOrder()==1){
                    updateChainWrapper.set(SgProgressReportDO::getAuditPerson,reportUserDO.getUserId());
                }
            }
            updateChainWrapper.update();
        }
    }
}