Procházet zdrojové kódy

Merge remote-tracking branch 'origin/master'

user5 před 2 roky
rodič
revize
64b468ea97
40 změnil soubory, kde provedl 1593 přidání a 86 odebrání
  1. 13 0
      jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/cw/projectReport/controller/CwProjectReportController.java
  2. 10 0
      jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/cw/projectReport/domain/CwProjectReportData.java
  3. 6 1
      jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/cw/projectReport/mapper/xml/CwProjectReportMapper.xml
  4. 31 2
      jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/cw/projectReport/service/CwProjectReportService.java
  5. 7 2
      jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/cw/projectReportArchive/mapper/xml/CwProjectReportArchiveMapper.xml
  6. 23 6
      jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/cw/projectReportArchive/service/CwProjectReportArchiveService.java
  7. 115 17
      jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/cw/reimbursementApproval/approvalType/service/CwReimbursementTypeService.java
  8. 16 5
      jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/cw/reportCancellApply/mapper/xml/ReportCancellApplyMapper.xml
  9. 3 0
      jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/cw/reportCancellApply/service/ReportCancellApplyService.java
  10. 12 0
      jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/cw/reportCancellApply/service/dto/ReportInfoDto.java
  11. 38 3
      jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/cw/reportCancellApplyArchived/mapper/xml/ReportCancellApplyArchivedMapper.xml
  12. 3 0
      jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/cw/reportCancellApplyArchived/service/ReportCancellApplyArchivedService.java
  13. 13 0
      jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/cw/reportCancellApplyArchived/service/dto/ArchivedReportInfoDto.java
  14. 1 1
      jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/materialManagement/materialType/controller/MaterialTypeController.java
  15. 112 12
      jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/materialManagement/materialType/service/MaterialTypeService.java
  16. 46 0
      jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/program/configuration/projectList/domain/ProgramMembers.java
  17. 2 0
      jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/program/configuration/projectList/domain/ProgramProjectListMember.java
  18. 17 0
      jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/program/configuration/projectList/mapper/ProgramMembersMapper.java
  19. 27 0
      jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/program/configuration/projectList/mapper/xml/ProgramMembersMapper.xml
  20. 54 0
      jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/program/configuration/projectList/service/ProgramMembersService.java
  21. 99 0
      jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/program/configuration/projectList/service/ProjectListService.java
  22. 46 0
      jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/program/configuration/projectList/service/dto/ProgramMembersDto.java
  23. 17 0
      jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/program/configuration/projectList/service/mapstruct/ProgramMembersWrapper.java
  24. 39 16
      jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/roster/controller/RosterBaseController.java
  25. 20 0
      jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/roster/mapper/xml/RosterBaseMapper.xml
  26. 160 15
      jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/roster/service/RosterBaseService.java
  27. 42 4
      jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/roster/service/dto/RosterBaseDTO.java
  28. 336 0
      jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/roster/service/dto/RosterBaseExportDTO.java
  29. 10 0
      jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/zs/zsReimbursement/approvalInfo/controller/ZsReimbursementInfoController.java
  30. 7 0
      jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/zs/zsReimbursement/approvalInfo/service/dto/ZsRetureListDto.java
  31. 9 2
      jeeplus-platform/jeeplus-admin/src/main/java/com/jeeplus/core/excel/ExcelDiceAddressListHandlerImpl.java
  32. 5 0
      jeeplus-platform/jeeplus-admin/src/main/java/com/jeeplus/sys/mapper/UserMapper.java
  33. 8 0
      jeeplus-platform/jeeplus-admin/src/main/java/com/jeeplus/sys/mapper/xml/UserMapper.xml
  34. 13 0
      jeeplus-platform/jeeplus-admin/src/main/java/com/jeeplus/sys/service/UserService.java
  35. 5 0
      jeeplus-plugins/jeeplus-flowable/src/main/java/com/jeeplus/flowable/mapper/FlowMapper.java
  36. 16 0
      jeeplus-plugins/jeeplus-flowable/src/main/java/com/jeeplus/flowable/mapper/xml/FlowMapper.xml
  37. 164 0
      jeeplus-plugins/jeeplus-flowable/src/main/java/com/jeeplus/flowable/service/FlowTaskService.java
  38. 15 0
      jeeplus-plugins/jeeplus-flowable/src/main/java/com/jeeplus/flowable/vo/AssigneeDto.java
  39. 23 0
      jeeplus-plugins/jeeplus-notify/src/main/java/com/jeeplus/notify/controller/NotifyController.java
  40. 10 0
      jeeplus-plugins/jeeplus-notify/src/main/java/com/jeeplus/notify/service/dto/NotifyDTO.java

+ 13 - 0
jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/cw/projectReport/controller/CwProjectReportController.java

@@ -464,4 +464,17 @@ public class CwProjectReportController {
         projectReportService.saveReportArchive(reportId);
         return ResponseEntity.ok("操作成功");
     }
+
+    /**
+     * 撤回签章
+     * @param reportId
+     * @return
+     * @throws Exception
+     */
+    @GetMapping("rebackSign")
+    @ApiOperation(value = "撤回签章")
+    public ResponseEntity rebackSign(String reportId) throws Exception {
+        projectReportService.rebackSign(reportId);
+        return ResponseEntity.ok("操作成功");
+    }
 }

+ 10 - 0
jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/cw/projectReport/domain/CwProjectReportData.java

@@ -414,4 +414,14 @@ public class CwProjectReportData extends BaseDTO {
     List<ReviewUser> reviewBys;
 
     private String reviewBy;
+
+    /**
+     * 项目经理2id
+     */
+    private String projectMaster2Id;
+
+    /**
+     * 项目经理2name
+     */
+    private String projectMaster2Name;
 }

+ 6 - 1
jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/cw/projectReport/mapper/xml/CwProjectReportMapper.xml

@@ -65,6 +65,8 @@
         d.name as userName,
         a.audit_fees,
         e.name as projectMasterName,
+        b.real_header as projectMaster2Id,
+        f.name as projectMaster2Name,
         cw_prs1.proc_ins_id as proc_ins_id1,
         cw_prs1.process_definition_id as process_definition_id1,
         cw_prs1.status as status1,
@@ -79,12 +81,14 @@
         cw_prs3.id as sid3,
         ifnull(cw_rev.review_status,'0') as reviewStatus,
         cw_rev.proc_ins_id as procInsId3,
-        new_line.report_no as reportNo
+        new_line.report_no as reportNo,
+        cwcb.name as servedUnitName
         FROM cw_project_report a
         left join cw_project_records b on a.project_id = b.id
         LEFT JOIN sys_office c on a.office_id = c.id
         LEFT JOIN sys_user d on a.create_by = d.id
         LEFT JOIN sys_user e on b.project_master_id = e.id
+        LEFT JOIN sys_user f on b.real_header = f.id
         LEFT JOIN cw_project_report_signature cw_prs1 on cw_prs1.report_id = a.id and cw_prs1.type = '1' and cw_prs1.del_flag = '0'
         LEFT JOIN cw_project_report_signature cw_prs2 on cw_prs2.report_id = a.id and cw_prs2.type = '2' and cw_prs2.del_flag = '0'
         LEFT JOIN cw_project_report_signature cw_prs3 on cw_prs3.report_id = a.id and cw_prs3.type = '3' and cw_prs3.del_flag = '0'
@@ -93,6 +97,7 @@
         left join cw_project_members cpm on b.id = cpm.project_id
         left join sys_user sub on cpm.user_id = sub.id
         left join sys_user_manage_office sumo on sumo.office_id = sub.office_id
+        left join cw_work_client_base cwcb on new_line.served_unit_id = cwcb.id
         ${ew.customSqlSegment}
         ORDER BY a.create_date DESC
     </select>

+ 31 - 2
jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/cw/projectReport/service/CwProjectReportService.java

@@ -70,7 +70,7 @@ import java.util.concurrent.atomic.AtomicInteger;
  * @create: 2022-11-16 14:17
  **/
 @Service
-@Transactional
+@Transactional(rollbackFor = Exception.class)
 public class CwProjectReportService extends ServiceImpl<CwProjectReportMapper, CwProjectReport> {
 
     private static final String HTTPTOP = Global.getConfig("signature_http_top");
@@ -438,6 +438,9 @@ public class CwProjectReportService extends ServiceImpl<CwProjectReportMapper, C
         if (StringUtils.isNotEmpty(projectReportData.getProjectMasterId())) {
             queryWrapper.eq("b.project_master_id", projectReportData.getProjectMasterId());
         }
+        if (StringUtils.isNotEmpty(projectReportData.getProjectMaster2Id())) {
+            queryWrapper.eq("b.real_header", projectReportData.getProjectMaster2Id());
+        }
         if (StringUtils.isNotEmpty(projectReportData.getCreateBy().getId())) {
             queryWrapper.like("a.create_by", projectReportData.getCreateBy().getId());
         }
@@ -1867,7 +1870,7 @@ public class CwProjectReportService extends ServiceImpl<CwProjectReportMapper, C
         QueryWrapper<CwWorkClientBase> queryWrapper = QueryWrapperGenerator.buildQueryCondition ( CwWorkClientBaseWrapper.INSTANCE.toEntity(cwWorkClientBaseDTO), CwWorkClientBase.class );
         queryWrapper.eq("cw_wcb.del_flag","0");
         queryWrapper.eq("cw_pro.id",projectId);
-        queryWrapper.orderByDesc("cw_wcb.create_date");
+
         if (ObjectUtil.isNotEmpty(cwWorkClientBaseDTO)) {
             if (ArrayUtil.isNotEmpty(cwWorkClientBaseDTO.getCreateDates())) {
                 queryWrapper.between("cw_wcb.create_date", cwWorkClientBaseDTO.getCreateDates()[0], cwWorkClientBaseDTO.getCreateDates()[1]);
@@ -1878,6 +1881,13 @@ public class CwProjectReportService extends ServiceImpl<CwProjectReportMapper, C
                 }
             }
         }
+        if (StringUtils.isNotEmpty(cwWorkClientBaseDTO.getName())){
+            queryWrapper.eq("cw_wcb.name", cwWorkClientBaseDTO.getName());
+        }
+        if (StringUtils.isNotEmpty(cwWorkClientBaseDTO.getNo())){
+            queryWrapper.eq("cw_wcb.no", cwWorkClientBaseDTO.getNo());
+        }
+        queryWrapper.orderByDesc("cw_wcb.create_date");
         IPage<CwWorkClientBaseDTO> list = reportMapper.findClineList(page, queryWrapper);
         return list;
     }
@@ -2641,4 +2651,23 @@ public class CwProjectReportService extends ServiceImpl<CwProjectReportMapper, C
         cwProjectReportArchive.setFileNumber(fileNumber);
         cwProjectReportArchiveMapper.insert(cwProjectReportArchive);
     }
+
+    /**
+     * 根据报告id,撤回签章
+     * @param reportId
+     */
+    public void rebackSign (String reportId) {
+        // 通过报告id获取签章数据
+        List<CwProjectReportSignature> signList = cwProjectReportSignatureMapper.selectList(new QueryWrapper<CwProjectReportSignature>().lambda().eq(CwProjectReportSignature::getReportId, reportId));
+        // 将签章数据的状态改为初始值
+        if (CollectionUtil.isNotEmpty(signList)) {
+            signList.stream().forEach(item -> {
+                item.setStatus("0"); // 签章流程的状态改为:未发起
+                item.setSignatureAnnotator1Status("0"); // 签字注师1签章状态改为:未签章
+                item.setSignatureAnnotator2Status("0"); // 签字注师2签章状态改为:未签章
+                item.setSealAdminStatus("0"); // 盖章管理员签章状态改为:未签章
+                cwProjectReportSignatureMapper.updateById(item); // 将修改的数据保存
+            });
+        }
+    }
 }

+ 7 - 2
jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/cw/projectReportArchive/mapper/xml/CwProjectReportArchiveMapper.xml

@@ -83,6 +83,8 @@
         <result property="contractNum" column="contract_num" jdbcType="VARCHAR"/>
         <result property="payerSubject" column="payer_subject" jdbcType="VARCHAR"/>
         <result property="paymentMethod" column="payment_method" jdbcType="VARCHAR"/>
+        <result property="realHeader" column="real_header" jdbcType="VARCHAR"/>
+        <result property="realHeaderName" column="real_header_name" jdbcType="VARCHAR"/>
     </resultMap>
 
     <sql id="Base_Column_List">
@@ -170,7 +172,8 @@
         cw_pr.proc_ins_id,
         cw_pr.status,
         cw_pr.process_definition_id,
-        cw_pr.contract_id
+        cw_pr.contract_id,
+        cw_pr.real_header
     </sql>
 
     <select id="getProject" resultMap="ProjectResultMap">
@@ -182,11 +185,13 @@
         cw_wci.payer_subject,
         cw_wci.payment_method,
         su.name as user_name,
-        su2.name as project_master_name
+        su2.name as project_master_name,
+        su3.name as real_header_name
         from cw_project_records cw_pr
         left join cw_work_contract_info cw_wci on cw_wci.id = cw_pr.contract_id and cw_wci.del_flag = '0'
         left join sys_user su on su.id = cw_pr.create_by and su.del_flag = '0'
         left join sys_user su2 on su2.id = cw_pr.project_master_id and su2.del_flag = '0'
+        left join sys_user su3 on su3.id = cw_pr.real_header and su3.del_flag = '0'
         where cw_pr.del_flag = '0' and cw_pr.id = #{id}
     </select>
     <select id="getReportList" resultType="com.jeeplus.test.cw.projectReportArchive.service.dto.CwProjectReportArchiveReportDTO">

+ 23 - 6
jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/cw/projectReportArchive/service/CwProjectReportArchiveService.java

@@ -3,6 +3,7 @@ package com.jeeplus.test.cw.projectReportArchive.service;
 import cn.hutool.core.collection.CollectionUtil;
 import cn.hutool.core.util.ArrayUtil;
 import cn.hutool.core.util.ObjectUtil;
+import com.alibaba.druid.sql.dialect.odps.ast.OdpsStatisticClause;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
@@ -81,20 +82,36 @@ public class CwProjectReportArchiveService extends ServiceImpl<CwProjectReportAr
                 // 项目名称
                 if (StringUtils.isNotBlank(cwProjectReportArchiveDTO.getCwProjectRecordsDTO().getProjectName())){
                     List<CwProjectRecords> cwProjectRecords = cwProjectRecordsMapper.selectList(new QueryWrapper<CwProjectRecords>().lambda().like(CwProjectRecords::getProjectName, cwProjectReportArchiveDTO.getCwProjectRecordsDTO().getProjectName()));
-                    List<String> ids = cwProjectRecords.stream().distinct().map(CwProjectRecords::getId).collect(Collectors.toList());
+                    List<String> ids = cwProjectRecords.stream().map(CwProjectRecords::getId).collect(Collectors.toList()).stream().distinct().collect(Collectors.toList());
                     if(CollectionUtil.isNotEmpty(ids)) {
                         queryWrapper.in("cw_pa.project_id",ids);
                     }else{
                         return new Page<>();
                     }
                 }
-                // 项目经理
+                // 项目经理1
                 if (StringUtils.isNotBlank(cwProjectReportArchiveDTO.getCwProjectRecordsDTO().getProjectMasterName())){
                     List<User> userList = userMapper.selectList(new QueryWrapper<User>().lambda().like(User::getName, cwProjectReportArchiveDTO.getCwProjectRecordsDTO().getProjectMasterName()));
-                    List<String> userIdList = userList.stream().distinct().map(User::getId).collect(Collectors.toList());
+                    List<String> userIdList = userList.stream().map(User::getId).collect(Collectors.toList()).stream().distinct().collect(Collectors.toList());
                     if (CollectionUtil.isNotEmpty(userIdList)){
                         List<CwProjectRecords> cwProjectRecords = cwProjectRecordsMapper.selectList(new QueryWrapper<CwProjectRecords>().lambda().in(CwProjectRecords::getProjectMasterId, userIdList));
-                        List<String> projectIds = cwProjectRecords.stream().distinct().map(CwProjectRecords::getId).collect(Collectors.toList());
+                        List<String> projectIds = cwProjectRecords.stream().map(CwProjectRecords::getId).collect(Collectors.toList()).stream().distinct().collect(Collectors.toList());
+                        if (CollectionUtil.isNotEmpty(projectIds)){
+                            queryWrapper.in("cw_pa.project_id",projectIds);
+                        }else{
+                            return new Page<>();
+                        }
+                    }else{
+                        return new Page<>();
+                    }
+                }
+                // 项目经理2
+                if (StringUtils.isNotBlank(cwProjectReportArchiveDTO.getCwProjectRecordsDTO().getRealHeaderName())){
+                    List<User> userList = userMapper.selectList(new QueryWrapper<User>().lambda().like(User::getName, cwProjectReportArchiveDTO.getCwProjectRecordsDTO().getRealHeaderName()));
+                    List<String> userIdList = userList.stream().map(User::getId).collect(Collectors.toList()).stream().distinct().collect(Collectors.toList());
+                    if (CollectionUtil.isNotEmpty(userIdList)){
+                        List<CwProjectRecords> cwProjectRecords = cwProjectRecordsMapper.selectList(new QueryWrapper<CwProjectRecords>().lambda().in(CwProjectRecords::getRealHeader, userIdList));
+                        List<String> projectIds = cwProjectRecords.stream().map(CwProjectRecords::getId).collect(Collectors.toList()).stream().distinct().collect(Collectors.toList());
                         if (CollectionUtil.isNotEmpty(projectIds)){
                             queryWrapper.in("cw_pa.project_id",projectIds);
                         }else{
@@ -116,7 +133,7 @@ public class CwProjectReportArchiveService extends ServiceImpl<CwProjectReportAr
                 if (ObjectUtil.isNotEmpty(cwProjectReportArchiveDTO.getCreateBy())){
                     if (StringUtils.isNotBlank(cwProjectReportArchiveDTO.getCreateBy().getName())){
                         List<User> userList = userMapper.selectList(new QueryWrapper<User>().lambda().like(User::getName, cwProjectReportArchiveDTO.getCreateBy().getName()));
-                        List<String> ids = userList.stream().distinct().map(User::getId).collect(Collectors.toList());
+                        List<String> ids = userList.stream().map(User::getId).collect(Collectors.toList()).stream().distinct().collect(Collectors.toList());
                         if (CollectionUtil.isNotEmpty(ids)){
                             queryWrapper.in("cw_pa.create_by",ids);
                         }else{
@@ -211,7 +228,7 @@ public class CwProjectReportArchiveService extends ServiceImpl<CwProjectReportAr
                 return true;
             }
             return false;
-        }).distinct().map(CwProjectReportArchive::getReportId).collect(Collectors.toList());
+        }).map(CwProjectReportArchive::getReportId).collect(Collectors.toList()).stream().distinct().collect(Collectors.toList());
         QueryWrapper<ReportDTO> queryWrapper = new QueryWrapper<>();
         queryWrapper.eq("cw_pr.del_flag","0");
         queryWrapper.orderByDesc("cw_pr.create_date");

+ 115 - 17
jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/cw/reimbursementApproval/approvalType/service/CwReimbursementTypeService.java

@@ -1,7 +1,9 @@
 package com.jeeplus.test.cw.reimbursementApproval.approvalType.service;
 
+import cn.hutool.core.collection.CollectionUtil;
 import cn.hutool.core.util.ObjectUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.jeeplus.core.domain.BaseEntity;
 import com.jeeplus.flowable.common.handler.CollectionUtils;
 import com.jeeplus.sys.service.dto.OfficeDTO;
@@ -14,14 +16,13 @@ import com.jeeplus.test.cw.reimbursementApproval.approvalType.domain.CwReimburse
 import com.jeeplus.test.cw.reimbursementApproval.approvalType.domain.OfficeDomain;
 import com.jeeplus.test.cw.reimbursementApproval.approvalType.mapper.CwReimbursementTypeMapper;
 import com.jeeplus.test.cw.workClientInfo.domain.CwWorkClientContact;
+import com.jeeplus.test.materialManagement.materialType.domain.MaterialTypeInfo;
 import org.apache.commons.compress.utils.Lists;
 import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
-import java.util.Collections;
-import java.util.Date;
-import java.util.List;
-import java.util.UUID;
+import java.util.*;
+import java.util.stream.Collectors;
 
 /**
  * @author: 王强
@@ -35,17 +36,67 @@ public class CwReimbursementTypeService {
 
     public List<CwReimbursementTypeInfo> bxList2(CwReimbursementTypeInfo info) {
         LambdaQueryWrapper<CwReimbursementTypeInfo> wrapper = new LambdaQueryWrapper<>();
-        if (StringUtils.isNotEmpty(info.getName())) {
-            wrapper.like(CwReimbursementTypeInfo::getName, info.getName());
+        if(StringUtils.isNotBlank(info.getName())){
+            //根据type模糊查询
+            List<CwReimbursementTypeInfo> cwReimbursementTypeInfoList = mapper.selectList(new QueryWrapper<CwReimbursementTypeInfo>().lambda()
+                    .like(StringUtils.isNotBlank(info.getName()), CwReimbursementTypeInfo::getName, info.getName())
+            );
+            List<String> collect = cwReimbursementTypeInfoList.stream().map(CwReimbursementTypeInfo::getId).collect(Collectors.toList());
+            //materialTypeInfoList的父级id全部获取
+            List<String> cupIdList = cwReimbursementTypeInfoList.stream().map(CwReimbursementTypeInfo::getParentId).collect(Collectors.toList()).stream().distinct().collect(Collectors.toList());
+            //获取materialTypeInfoList的父级id的父级id
+            List<String> cupIdPList = new ArrayList<>();
+            if (CollectionUtil.isNotEmpty(cupIdList)) {
+                cupIdList.stream().forEach(item -> {
+                    CwReimbursementTypeInfo byId = mapper.selectById(item);
+                    if (ObjectUtil.isNotEmpty(byId)) {
+                        if (StringUtils.isNotBlank(byId.getParentId())) {
+                            cupIdPList.add(byId.getParentId());
+                        }
+                    }
+                });
+            }
+            //获取collect的下级id
+            List<String> childIdList = new ArrayList<>();
+            collect.stream().forEach(item -> {
+                List<CwReimbursementTypeInfo> list = mapper.selectList(new LambdaQueryWrapper<CwReimbursementTypeInfo>().eq(CwReimbursementTypeInfo::getParentId, item));
+                if (CollectionUtil.isNotEmpty(list)) {
+                    List<String> collect1 = list.stream().map(CwReimbursementTypeInfo::getId).collect(Collectors.toList()).stream().distinct().collect(Collectors.toList());
+                    if (CollectionUtil.isNotEmpty(collect1)) {
+                        childIdList.addAll(collect1);
+                        //获取collect的下级的下级的id
+                        collect1.stream().forEach(i -> {
+                            List<CwReimbursementTypeInfo> l = mapper.selectList(new LambdaQueryWrapper<CwReimbursementTypeInfo>().eq(CwReimbursementTypeInfo::getParentId, i));
+                            if (CollectionUtil.isNotEmpty(l)) {
+                                List<String> collect2 = l.stream().map(CwReimbursementTypeInfo::getId).collect(Collectors.toList()).stream().distinct().collect(Collectors.toList());
+                                if (CollectionUtil.isNotEmpty(collect2)) {
+                                    childIdList.addAll(collect2);
+                                }
+                            }
+                        });
+                    }
+                }
+            });
+            //将获取到的这几个id集合融合到一起并去重,然后根据id查询,即可得到结果
+            collect.addAll(cupIdList);
+            collect.addAll(cupIdPList);
+            collect.addAll(childIdList);
+
+            List<String> idList = collect.stream().distinct().collect(Collectors.toList());
+            if(CollectionUtil.isNotEmpty(idList)){
+                wrapper.in(CwReimbursementTypeInfo::getId,idList);
+            }else{
+                return new ArrayList<>();
+            }
         }
         if (ObjectUtil.isNotEmpty(info)) {
             if (StringUtils.isNotBlank(info.getLike())){
                 wrapper.likeRight(CwReimbursementTypeInfo::getSort,info.getLike());
             }
         }
-        if (info.getSort() != null) {
-            wrapper.like(CwReimbursementTypeInfo::getSort, info.getSort());
-        }
+//        if (info.getSort() != null) {
+//            wrapper.like(CwReimbursementTypeInfo::getSort, info.getSort());
+//        }
 
         wrapper.eq(BaseEntity::getDelFlag, 0);
         wrapper.orderByAsc(CwReimbursementTypeInfo::getSort);
@@ -74,17 +125,64 @@ public class CwReimbursementTypeService {
     }
 
     public List<CwReimbursementTypeInfo> list(CwReimbursementTypeInfo info) {
-        LambdaQueryWrapper<CwReimbursementTypeInfo> wrapper = new LambdaQueryWrapper<>();
-        if (StringUtils.isNotEmpty(info.getName())) {
-            wrapper.like(CwReimbursementTypeInfo::getName, info.getName());
-        }
-        if (info.getSort() != null) {
-            wrapper.like(CwReimbursementTypeInfo::getSort, info.getSort());
+        QueryWrapper<CwReimbursementTypeInfo> wrapper = new QueryWrapper<>();
+        if(StringUtils.isNotBlank(info.getName())){
+            //根据type模糊查询
+            List<CwReimbursementTypeInfo> cwReimbursementTypeInfoList = mapper.selectList(new QueryWrapper<CwReimbursementTypeInfo>().lambda()
+                    .like(StringUtils.isNotBlank(info.getName()), CwReimbursementTypeInfo::getName, info.getName())
+            );
+            List<String> collect = cwReimbursementTypeInfoList.stream().map(CwReimbursementTypeInfo::getId).collect(Collectors.toList());
+            //materialTypeInfoList的父级id全部获取
+            List<String> cupIdList = cwReimbursementTypeInfoList.stream().map(CwReimbursementTypeInfo::getParentId).collect(Collectors.toList()).stream().distinct().collect(Collectors.toList());
+            //获取materialTypeInfoList的父级id的父级id
+            List<String> cupIdPList = new ArrayList<>();
+            if (CollectionUtil.isNotEmpty(cupIdList)) {
+                cupIdList.stream().forEach(item -> {
+                    CwReimbursementTypeInfo byId = mapper.selectById(item);
+                    if (ObjectUtil.isNotEmpty(byId)) {
+                        if (StringUtils.isNotBlank(byId.getParentId())) {
+                            cupIdPList.add(byId.getParentId());
+                        }
+                    }
+                });
+            }
+            //获取collect的下级id
+            List<String> childIdList = new ArrayList<>();
+            collect.stream().forEach(item -> {
+                List<CwReimbursementTypeInfo> list = mapper.selectList(new LambdaQueryWrapper<CwReimbursementTypeInfo>().eq(CwReimbursementTypeInfo::getParentId, item));
+                if (CollectionUtil.isNotEmpty(list)) {
+                    List<String> collect1 = list.stream().map(CwReimbursementTypeInfo::getId).collect(Collectors.toList()).stream().distinct().collect(Collectors.toList());
+                    if (CollectionUtil.isNotEmpty(collect1)) {
+                        childIdList.addAll(collect1);
+                        //获取collect的下级的下级的id
+                        collect1.stream().forEach(i -> {
+                            List<CwReimbursementTypeInfo> l = mapper.selectList(new LambdaQueryWrapper<CwReimbursementTypeInfo>().eq(CwReimbursementTypeInfo::getParentId, i));
+                            if (CollectionUtil.isNotEmpty(l)) {
+                                List<String> collect2 = l.stream().map(CwReimbursementTypeInfo::getId).collect(Collectors.toList()).stream().distinct().collect(Collectors.toList());
+                                if (CollectionUtil.isNotEmpty(collect2)) {
+                                    childIdList.addAll(collect2);
+                                }
+                            }
+                        });
+                    }
+                }
+            });
+            //将获取到的这几个id集合融合到一起并去重,然后根据id查询,即可得到结果
+            collect.addAll(cupIdList);
+            collect.addAll(cupIdPList);
+            collect.addAll(childIdList);
+
+            List<String> idList = collect.stream().distinct().collect(Collectors.toList());
+            if(CollectionUtil.isNotEmpty(idList)){
+                wrapper.in("a.id",idList);
+            }else{
+                return new ArrayList<>();
+            }
         }
 //        wrapper.eq(CwReimbursementTypeInfo::getBusinessType, "1");
 
-        wrapper.eq(BaseEntity::getDelFlag, 0);
-        wrapper.orderByAsc(CwReimbursementTypeInfo::getSort);
+        wrapper.eq("a.del_flag", 0);
+        wrapper.orderByAsc("a.sort");
         return mapper.findList(wrapper);
     }
 

+ 16 - 5
jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/cw/reportCancellApply/mapper/xml/ReportCancellApplyMapper.xml

@@ -7,8 +7,12 @@
          su3.name as reportSponsor,
         b.report_no,
         cw_re.review_status,
-        c.project_name,c.project_master_id,su.name as user_name,
+        c.project_name,
+        c.project_master_id,
+        c.real_header as project_master2_id,
+        su.name as user_name,
         su2.name as project_master_name,
+        suu.name as project_master2_name,
         b.id as report_new_line_id
         FROM cw_project_report a
         left join cw_project_report_new_line b
@@ -17,6 +21,7 @@
         on a.project_id = c.id and c.del_flag = '0'
         left join cw_project_report_review cw_re on a.id = cw_re.id and cw_re.del_flag = '0'
         left join sys_user su on su.id = a.create_by and su.del_flag = '0'
+        left join sys_user suu on suu.id = c.real_header and suu.del_flag = '0'
         left join sys_user su2 on su2.id = c.project_master_id and su2.del_flag = '0'
         left join sys_user su3 on su3.id = a.create_by and su3.del_flag = '0'
         ${ew.customSqlSegment}
@@ -27,10 +32,12 @@
         a.cancellate_reason,a.report_no,a.proc_ins_id,a.status,a.process_definition_id,
         c.document_no,case c.`status` WHEN '5' THEN '已完成' END as documentStatus,
         su3.name as reportSponsor,
-        d.project_name,d.project_master_id,
+        d.project_name,
+        d.project_master_id,
+        d.real_header as project_master2_id,
         su.name as user_name,
-        su2.name as project_master_name
-
+        su2.name as project_master_name,
+        suu.name as project_master2_name
         FROM cw_project_report_cancell_apply a
         LEFT JOIN cw_project_report_new_line b
         on a.report_new_line_id = b.id
@@ -40,6 +47,7 @@
         on c.project_id = d.id
         left join sys_user su on su.id = a.create_by and su.del_flag = '0'
         left join sys_user su2 on su2.id = d.project_master_id and su2.del_flag = '0'
+        left join sys_user suu on suu.id = d.real_header and suu.del_flag = '0'
         left join sys_user su3 on su3.id = c.create_by and su3.del_flag = '0'
         where a.del_flag = '0' and a.id = #{id}
     </select>
@@ -67,7 +75,9 @@
 				h.name as reportSponsor,
 				d.project_master_id as projectMasterId,
 				cw_ar.proc_ins_id as cwProcInsId,
-				cw_ar.process_definition_id as cwProDefId
+				cw_ar.process_definition_id as cwProDefId,
+				d.real_header as projectMaster2Id,
+                k.name as projectMaster2Name
 
 				FROM cw_project_report_cancell_apply a
 				LEFT JOIN cw_project_report_new_line b
@@ -83,6 +93,7 @@
         left join sys_user_manage_office sumo on sumo.office_id = f.office_id
 				LEFT JOIN sys_user g
         on d.project_master_id = g.id
+        LEFT JOIN sys_user k on d.real_header = k.id
         LEFT JOIN sys_user h
         on c.create_by = h.id
         left join cw_project_report_cancell_apply_archived cw_ar

+ 3 - 0
jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/cw/reportCancellApply/service/ReportCancellApplyService.java

@@ -84,6 +84,9 @@ public class ReportCancellApplyService extends ServiceImpl<ReportCancellApplyMap
         if (StringUtils.isNotEmpty(projectReportData.getProjectMasterId())) {
             queryWrapper.eq("d.project_master_id", projectReportData.getProjectMasterId());
         }
+        if (StringUtils.isNotEmpty(projectReportData.getProjectMaster2Id())) {
+            queryWrapper.eq("d.real_header", projectReportData.getProjectMaster2Id());
+        }
         if (StringUtils.isNotEmpty(projectReportData.getCreateBy().getId())) {
             queryWrapper.like("a.create_by", projectReportData.getCreateBy().getId());
         }

+ 12 - 0
jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/cw/reportCancellApply/service/dto/ReportInfoDto.java

@@ -111,4 +111,16 @@ public class ReportInfoDto extends BaseDTO {
      */
     @TableField(exist = false)
     private String cwProDefId;
+
+    /**
+     * 项目经理2id
+     */
+    @TableField(exist = false)
+    private String projectMaster2Id;
+
+    /**
+     * 项目经理2name
+     */
+    @TableField(exist = false)
+    private String projectMaster2Name;
 }

+ 38 - 3
jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/cw/reportCancellApplyArchived/mapper/xml/ReportCancellApplyArchivedMapper.xml

@@ -75,6 +75,8 @@
 				g.name as projectMasterName,
 				h.name as reportSponsor,
 				d.project_master_id as projectMasterId,
+				d.real_header as projectMaster2Id,
+                k.name as projectMaster2Name,
 				cw_ar.proc_ins_id as cwProcInsId,
 				cw_ar.process_definition_id as cwProDefId
 
@@ -90,8 +92,8 @@
 				LEFT JOIN sys_user f
         on a.create_by = f.id
         left join sys_user_manage_office sumo on sumo.office_id = f.office_id
-				LEFT JOIN sys_user g
-        on d.project_master_id = g.id
+				LEFT JOIN sys_user g on d.project_master_id = g.id
+                LEFT JOIN sys_user k on d.real_header = k.id
         LEFT JOIN sys_user h
         on c.create_by = h.id
         left join cw_project_report_cancell_apply_archived cw_ar
@@ -245,9 +247,42 @@
         select * from cw_project_report_cancell_apply_archived where archive_id = #{bfId}
     </select>
     <select id="getProjectByNewLineId" resultType="com.jeeplus.test.cw.projectRecords.service.dto.CwProjectRecordsDTO">
-        select cw.* from cw_project_records cw
+        select
+            <include refid="Project_Column_List"></include>,
+            su2.name as project_master_name,
+            su3.name as real_header_name
+        from cw_project_records cw
         left join cw_project_report cw_p on cw.id = cw_p.project_id
         left join cw_project_report_new_line cw_n on cw_p.id = cw_n.report_id
+        left join sys_user su2 on su2.id = cw.project_master_id and su2.del_flag = '0'
+        left join sys_user su3 on su3.id = cw.real_header and su3.del_flag = '0'
         where cw_n.id = #{reportNewLineId}
     </select>
+    <sql id="Project_Column_List">
+        cw.id,
+        cw.create_by,
+        cw.create_date,
+        cw.update_by,
+        cw.update_date,
+        cw.del_flag,
+        cw.remarks,
+        cw.project_number,
+        cw.project_name,
+        cw.office_id,
+        cw.project_money,
+        cw.audit_year,
+        cw.plan_start_date,
+        cw.plan_end_date,
+        cw.project_master_id,
+        cw.project_leader_id,
+        cw.proc_ins_id,
+        cw.status,
+        cw.process_definition_id,
+        cw.contract_id,
+        cw.business_type,
+        cw.risk_level,
+        cw.real_header,
+        cw.report_type,
+        cw.report_review
+    </sql>
 </mapper>

+ 3 - 0
jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/cw/reportCancellApplyArchived/service/ReportCancellApplyArchivedService.java

@@ -92,6 +92,9 @@ public class ReportCancellApplyArchivedService extends ServiceImpl<ReportCancell
         if (StringUtils.isNotEmpty(projectReportData.getProjectMasterId())) {
             queryWrapper.eq("d.project_master_id", projectReportData.getProjectMasterId());
         }
+        if (StringUtils.isNotEmpty(projectReportData.getProjectMaster2Id())) {
+            queryWrapper.eq("d.real_header", projectReportData.getProjectMaster2Id());
+        }
         if (StringUtils.isNotEmpty(projectReportData.getCreateBy().getId())) {
             queryWrapper.like("a.create_by", projectReportData.getCreateBy().getId());
         }

+ 13 - 0
jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/cw/reportCancellApplyArchived/service/dto/ArchivedReportInfoDto.java

@@ -114,4 +114,17 @@ public class ArchivedReportInfoDto extends BaseDTO {
      */
     @TableField(exist = false)
     private String cwProDefId;
+
+    /**
+     * 项目经理2id
+     */
+    @TableField(exist = false)
+    private String projectMaster2Id;
+
+    /**
+     * 项目经理2name
+     */
+    @TableField(exist = false)
+    private String projectMaster2Name;
+
 }

+ 1 - 1
jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/materialManagement/materialType/controller/MaterialTypeController.java

@@ -74,7 +74,7 @@ public class MaterialTypeController {
     @ApiOperation(value = "新增/修改")
     @PostMapping("/save")
     public ResponseEntity<String> save(@RequestBody MaterialTypeInfo info) {
-        String s = service.save(info);
+        String s = service.saveM(info);
         return ResponseEntity.ok(s);
     }
 

+ 112 - 12
jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/materialManagement/materialType/service/MaterialTypeService.java

@@ -1,40 +1,95 @@
 package com.jeeplus.test.materialManagement.materialType.service;
 
+import cn.hutool.core.collection.CollectionUtil;
 import cn.hutool.core.util.ObjectUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.jeeplus.core.domain.BaseEntity;
 import com.jeeplus.sys.service.dto.OfficeDTO;
 import com.jeeplus.sys.service.dto.UserDTO;
 import com.jeeplus.sys.utils.StringUtils;
 import com.jeeplus.sys.utils.UserUtils;
+import com.jeeplus.test.cw.projectBusinessType.domain.CwProjectBusinessType;
 import com.jeeplus.test.materialManagement.materialType.domain.MaterialTypeInfo;
 import com.jeeplus.test.materialManagement.materialType.mapper.MaterialTypeMapper;
+import com.jeeplus.test.program.configuration.typeDict.domain.ProgramTypeDict;
 import org.apache.commons.compress.utils.Lists;
 import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
+import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
 import java.util.UUID;
+import java.util.stream.Collectors;
 
 /**
  * @author: 王强
  * @create: 2022-11-25 09:13
  **/
 @Service
-public class MaterialTypeService {
+public class MaterialTypeService extends ServiceImpl<MaterialTypeMapper,MaterialTypeInfo> {
 
     @Resource
     private MaterialTypeMapper mapper;
 
     public List<MaterialTypeInfo> list(MaterialTypeInfo info) {
         LambdaQueryWrapper<MaterialTypeInfo> wrapper = new LambdaQueryWrapper<>();
-        if (StringUtils.isNotEmpty(info.getName())) {
-            wrapper.like(MaterialTypeInfo::getName, info.getName());
-        }
-        if (info.getSort() != null) {
-            wrapper.like(MaterialTypeInfo::getSort, info.getSort());
+        if(StringUtils.isNotBlank(info.getName())){
+            //根据type模糊查询
+            List<MaterialTypeInfo> materialTypeInfoList = this.list(new QueryWrapper<MaterialTypeInfo>().lambda()
+                    .like(StringUtils.isNotBlank(info.getName()), MaterialTypeInfo::getName, info.getName())
+            );
+            List<String> collect = materialTypeInfoList.stream().map(MaterialTypeInfo::getId).collect(Collectors.toList());
+            //materialTypeInfoList的父级id全部获取
+            List<String> cupIdList = materialTypeInfoList.stream().map(MaterialTypeInfo::getParentId).collect(Collectors.toList()).stream().distinct().collect(Collectors.toList());
+            //获取materialTypeInfoList的父级id的父级id
+            List<String> cupIdPList = new ArrayList<>();
+            if (CollectionUtil.isNotEmpty(cupIdList)) {
+                cupIdList.stream().forEach(item -> {
+                    MaterialTypeInfo byId = this.getById(item);
+                    if (ObjectUtil.isNotEmpty(byId)) {
+                        if (StringUtils.isNotBlank(byId.getParentId())) {
+                            cupIdPList.add(byId.getParentId());
+                        }
+                    }
+                });
+            }
+            //获取collect的下级id
+            List<String> childIdList = new ArrayList<>();
+            collect.stream().forEach(item -> {
+                List<MaterialTypeInfo> list = this.list(new LambdaQueryWrapper<MaterialTypeInfo>().eq(MaterialTypeInfo::getParentId, item));
+                if (CollectionUtil.isNotEmpty(list)) {
+                    List<String> collect1 = list.stream().map(MaterialTypeInfo::getId).collect(Collectors.toList()).stream().distinct().collect(Collectors.toList());
+                    if (CollectionUtil.isNotEmpty(collect1)) {
+                        childIdList.addAll(collect1);
+                        //获取collect的下级的下级的id
+                        collect1.stream().forEach(i -> {
+                            List<MaterialTypeInfo> l = this.list(new LambdaQueryWrapper<MaterialTypeInfo>().eq(MaterialTypeInfo::getParentId, i));
+                            if (CollectionUtil.isNotEmpty(l)) {
+                                List<String> collect2 = l.stream().map(MaterialTypeInfo::getId).collect(Collectors.toList()).stream().distinct().collect(Collectors.toList());
+                                if (CollectionUtil.isNotEmpty(collect2)) {
+                                    childIdList.addAll(collect2);
+                                }
+                            }
+                        });
+                    }
+                }
+            });
+            //将获取到的这几个id集合融合到一起并去重,然后根据id查询,即可得到结果
+            collect.addAll(cupIdList);
+            collect.addAll(cupIdPList);
+            collect.addAll(childIdList);
+
+            List<String> idList = collect.stream().distinct().collect(Collectors.toList());
+            if(CollectionUtil.isNotEmpty(idList)){
+                wrapper.in(MaterialTypeInfo::getId,idList);
+            }
         }
+//        if (info.getSort() != null) {
+//            wrapper.like(MaterialTypeInfo::getSort, info.getSort());
+//        }
 //        wrapper.eq(CwReimbursementTypeInfo::getBusinessType, "1");
 
         wrapper.eq(BaseEntity::getDelFlag, 0);
@@ -69,11 +124,56 @@ public class MaterialTypeService {
 
     public List<MaterialTypeInfo> cgList(MaterialTypeInfo info) {
         LambdaQueryWrapper<MaterialTypeInfo> wrapper = new LambdaQueryWrapper<>();
-        if (StringUtils.isNotEmpty(info.getName())) {
-            wrapper.like(MaterialTypeInfo::getName, info.getName());
-        }
-        if (info.getSort() != null) {
-            wrapper.like(MaterialTypeInfo::getSort, info.getSort());
+        if(StringUtils.isNotBlank(info.getName())){
+            //根据type模糊查询
+            List<MaterialTypeInfo> materialTypeInfoList = this.list(new QueryWrapper<MaterialTypeInfo>().lambda()
+                    .like(StringUtils.isNotBlank(info.getName()), MaterialTypeInfo::getName, info.getName())
+            );
+            List<String> collect = materialTypeInfoList.stream().map(MaterialTypeInfo::getId).collect(Collectors.toList());
+            //materialTypeInfoList的父级id全部获取
+            List<String> cupIdList = materialTypeInfoList.stream().map(MaterialTypeInfo::getParentId).collect(Collectors.toList()).stream().distinct().collect(Collectors.toList());
+            //获取materialTypeInfoList的父级id的父级id
+            List<String> cupIdPList = new ArrayList<>();
+            if (CollectionUtil.isNotEmpty(cupIdList)) {
+                cupIdList.stream().forEach(item -> {
+                    MaterialTypeInfo byId = this.getById(item);
+                    if (ObjectUtil.isNotEmpty(byId)) {
+                        if (StringUtils.isNotBlank(byId.getParentId())) {
+                            cupIdPList.add(byId.getParentId());
+                        }
+                    }
+                });
+            }
+            //获取collect的下级id
+            List<String> childIdList = new ArrayList<>();
+            collect.stream().forEach(item -> {
+                List<MaterialTypeInfo> list = this.list(new LambdaQueryWrapper<MaterialTypeInfo>().eq(MaterialTypeInfo::getParentId, item));
+                if (CollectionUtil.isNotEmpty(list)) {
+                    List<String> collect1 = list.stream().map(MaterialTypeInfo::getId).collect(Collectors.toList()).stream().distinct().collect(Collectors.toList());
+                    if (CollectionUtil.isNotEmpty(collect1)) {
+                        childIdList.addAll(collect1);
+                        //获取collect的下级的下级的id
+                        collect1.stream().forEach(i -> {
+                            List<MaterialTypeInfo> l = this.list(new LambdaQueryWrapper<MaterialTypeInfo>().eq(MaterialTypeInfo::getParentId, i));
+                            if (CollectionUtil.isNotEmpty(l)) {
+                                List<String> collect2 = l.stream().map(MaterialTypeInfo::getId).collect(Collectors.toList()).stream().distinct().collect(Collectors.toList());
+                                if (CollectionUtil.isNotEmpty(collect2)) {
+                                    childIdList.addAll(collect2);
+                                }
+                            }
+                        });
+                    }
+                }
+            });
+            //将获取到的这几个id集合融合到一起并去重,然后根据id查询,即可得到结果
+            collect.addAll(cupIdList);
+            collect.addAll(cupIdPList);
+            collect.addAll(childIdList);
+
+            List<String> idList = collect.stream().distinct().collect(Collectors.toList());
+            if(CollectionUtil.isNotEmpty(idList)){
+                wrapper.in(MaterialTypeInfo::getId,idList);
+            }
         }
 
         wrapper.eq(BaseEntity::getDelFlag, 0);
@@ -81,7 +181,7 @@ public class MaterialTypeService {
         return mapper.selectList(wrapper);
     }
 
-    public String save(MaterialTypeInfo info) {
+    public String saveM(MaterialTypeInfo info) {
         // parentId未传值,则表示一级菜单
         if(StringUtils.isEmpty(info.getParentId())) {
             info.setParentId("0");

+ 46 - 0
jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/program/configuration/projectList/domain/ProgramMembers.java

@@ -0,0 +1,46 @@
+package com.jeeplus.test.program.configuration.projectList.domain;
+
+import java.io.Serializable;
+import java.util.Date;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.jeeplus.core.domain.BaseEntity;
+import lombok.Data;
+
+/**
+ * 评估-项目管理-项目组成员
+ * @TableName program_members
+ */
+@TableName(value ="program_members")
+@Data
+public class ProgramMembers extends BaseEntity implements Serializable {
+
+    /**
+     * 备注
+     */
+    private String remarks;
+
+    /**
+     * 项目id
+     */
+    private String projectId;
+
+    /**
+     * 人员id
+     */
+    private String userId;
+
+    /**
+     * 状态  0为正常  1为移除
+     */
+    private String status;
+
+    /**
+     * 项目主要成员  1为主要成员 
+     */
+    private String isImportant;
+
+    @TableField(exist = false)
+    private static final long serialVersionUID = 1L;
+}

+ 2 - 0
jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/program/configuration/projectList/domain/ProgramProjectListMember.java

@@ -18,4 +18,6 @@ public class ProgramProjectListMember extends BaseEntity {
 
     private String job;
 
+    private String userId;
+
 }

+ 17 - 0
jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/program/configuration/projectList/mapper/ProgramMembersMapper.java

@@ -0,0 +1,17 @@
+package com.jeeplus.test.program.configuration.projectList.mapper;
+
+import com.jeeplus.test.program.configuration.projectList.domain.ProgramMembers;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * @Entity com.jeeplus.test.program.configuration.projectList.domain.ProgramMembers
+ */
+@Mapper
+public interface ProgramMembersMapper extends BaseMapper<ProgramMembers> {
+
+}
+
+
+
+

+ 27 - 0
jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/program/configuration/projectList/mapper/xml/ProgramMembersMapper.xml

@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.jeeplus.test.program.configuration.projectList.mapper.ProgramMembersMapper">
+
+    <resultMap id="BaseResultMap" type="com.jeeplus.test.program.configuration.projectList.service.dto.ProgramMembersDto">
+            <id property="id" column="id" jdbcType="VARCHAR"/>
+            <result property="createBy.id" column="create_by" jdbcType="VARCHAR"/>
+            <result property="createDate" column="create_date" jdbcType="TIMESTAMP"/>
+            <result property="updateBy.id" column="update_by" jdbcType="VARCHAR"/>
+            <result property="updateDate" column="update_date" jdbcType="TIMESTAMP"/>
+            <result property="delFlag" column="del_flag" jdbcType="INTEGER"/>
+            <result property="remarks" column="remarks" jdbcType="VARCHAR"/>
+            <result property="projectId" column="project_id" jdbcType="VARCHAR"/>
+            <result property="userId" column="user_id" jdbcType="VARCHAR"/>
+            <result property="status" column="status" jdbcType="VARCHAR"/>
+            <result property="isImportant" column="is_important" jdbcType="VARCHAR"/>
+    </resultMap>
+
+    <sql id="Base_Column_List">
+        id,create_by,create_date,
+        update_by,update_date,del_flag,
+        remarks,project_id,user_id,
+        status,is_important
+    </sql>
+</mapper>

+ 54 - 0
jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/program/configuration/projectList/service/ProgramMembersService.java

@@ -0,0 +1,54 @@
+package com.jeeplus.test.program.configuration.projectList.service;
+
+import cn.hutool.core.collection.CollectionUtil;
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.jeeplus.core.query.QueryWrapperGenerator;
+import com.jeeplus.flowable.service.FlowTaskService;
+import com.jeeplus.sys.service.dto.DictValueDTO;
+import com.jeeplus.sys.service.dto.UserDTO;
+import com.jeeplus.sys.utils.DictUtils;
+import com.jeeplus.sys.utils.StringUtils;
+import com.jeeplus.sys.utils.UserUtils;
+import com.jeeplus.test.mould.service.SerialnumTplService;
+import com.jeeplus.test.oss.domain.WorkAttachment;
+import com.jeeplus.test.oss.mapper.OssServiceMapper;
+import com.jeeplus.test.oss.service.OssService;
+import com.jeeplus.test.program.configuration.projectList.domain.*;
+import com.jeeplus.test.program.configuration.projectList.mapper.*;
+import com.jeeplus.test.program.configuration.projectList.service.dto.*;
+import com.jeeplus.test.program.configuration.projectList.service.mapstruct.ProgramAuditAssessPeopleWrapper;
+import com.jeeplus.test.program.configuration.projectList.service.mapstruct.ProgramAuditWrapper;
+import com.jeeplus.test.proofread.domain.ProofreadDetail;
+import com.jeeplus.test.proofread.domain.ProofreadIssued;
+import com.jeeplus.test.proofread.service.ProofreadInfoService;
+import com.jeeplus.test.proofread.service.ProofreadIssuedService;
+import com.jeeplus.test.proofread.service.dto.ProofreadInfoDto;
+import com.jeeplus.test.workContract.domain.WorkContractInfo;
+import com.jeeplus.test.workContract.mapper.WorkContractInfoMapper;
+import com.jeeplus.test.workContract.service.WorkContractService;
+import com.jeeplus.test.workContract.service.dto.WorkAttachmentDto;
+import com.jeeplus.test.workContract.service.dto.WorkContractInfoDto;
+import org.apache.commons.compress.utils.Lists;
+import org.flowable.bpmn.model.FlowNode;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.text.SimpleDateFormat;
+import java.util.*;
+
+@Service
+public class ProgramMembersService extends ServiceImpl<ProgramMembersMapper, ProgramMembers> {
+
+    @Autowired
+    private ProgramMembersMapper programMembersMapper;
+}

+ 99 - 0
jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/program/configuration/projectList/service/ProjectListService.java

@@ -10,6 +10,8 @@ import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.jeeplus.core.query.QueryWrapperGenerator;
 import com.jeeplus.flowable.service.FlowTaskService;
+import com.jeeplus.sys.domain.User;
+import com.jeeplus.sys.service.UserService;
 import com.jeeplus.sys.service.dto.DictValueDTO;
 import com.jeeplus.sys.service.dto.UserDTO;
 import com.jeeplus.sys.utils.DictUtils;
@@ -79,6 +81,10 @@ public class ProjectListService {
 
     @Resource
     private FlowTaskService flowTaskService;
+    @Resource
+    private ProgramMembersService programMembersService;
+    @Resource
+    private UserService userService;
 
     public String save(ProjectListDto dto,String tabType) throws Exception{
         if (StringUtils.isNotEmpty(dto.getId())) {
@@ -135,6 +141,10 @@ public class ProjectListService {
                 projectLinkMapper.insert(link);
             }
         }
+        // 非主要项目组成员id集合
+        List<String> memberIds = new ArrayList<>();
+        // 要进行保存的项目组成员集合
+        List<ProgramMembers> programMembers = new ArrayList<>();
         // 保存项目管理列表成员信息
         if (CollectionUtils.isNotEmpty(dto.getMembers())) {
             for (ProgramProjectListMember member : dto.getMembers()) {
@@ -146,8 +156,46 @@ public class ProjectListService {
                 member.setUpdateDate(new Date());
                 member.setDelFlag(0);
                 projectMemberMapper.insert(member);
+                if (StringUtils.isNotBlank(member.getUserId())) {
+//                    成员的user_id不是"项目负责人"、"项目创建人"的添加到非主要项目组成员id集合中
+                    if (!member.getUserId().equals(info.getProjectManager()) && !member.getUserId().equals(info.getCreateBy())) {
+                        memberIds.add(member.getUserId());
+                    }
+                }
             }
         }
+        // 非主要项目组成员id集合去重后添加到项目组成员集合中
+        if (CollectionUtil.isNotEmpty(memberIds)) {
+            List<String> mids = memberIds.stream().distinct().collect(Collectors.toList());
+            mids.stream().forEach(item -> {
+                ProgramMembers p = new ProgramMembers();
+                p.setIsImportant("0");  // 非主要成员
+                p.setProjectId(id);
+                p.setStatus("0");
+                p.setUserId(item);  //  项目创建人
+                programMembers.add(p);
+            });
+        }
+        // 主要项目组成员去重后添加到项目组成员集合中
+        ProgramMembers p = new ProgramMembers();
+        p.setIsImportant("1");  // 主要成员
+        p.setProjectId(id);
+        p.setStatus("0");
+        p.setUserId(info.getCreateBy());  //  项目创建人
+        programMembers.add(p);
+        if (StringUtils.isNotBlank(info.getProjectManager())) {
+            if (!info.getCreateBy().equals(info.getProjectManager())) { // 项目创建人,项目负责人去重一下
+                ProgramMembers m = new ProgramMembers();
+                m.setIsImportant("1");  // 主要成员
+                m.setProjectId(id);
+                m.setStatus("0");
+                m.setUserId(info.getProjectManager()); // 项目负责人
+                programMembers.add(m);
+            }
+        }
+        // 保存项目组成员
+        programMembersService.saveBatch(programMembers);
+
         // 保存附件信息
         if (CollectionUtils.isNotEmpty(dto.getFiles())) {
             workContractService.saveFiles(dto.getFiles(), userDTO, id);
@@ -317,6 +365,12 @@ public class ProjectListService {
                 projectLinkMapper.insert(link);
             }
         }
+        // 非主要项目组成员id集合
+        List<String> memberIds = new ArrayList<>();
+        // 要进行保存的项目组成员集合
+        List<ProgramMembers> programMembers = new ArrayList<>();
+        //  删除此项目的项目组成员信息(先删除原有数据,再保存)
+        programMembersService.remove(new QueryWrapper<ProgramMembers>().lambda().eq(ProgramMembers::getProjectId,dto.getId()));
         // 修改项目管理列表成员信息(先删除原有数据,再保存)
         projectMemberMapper.deleteByInfoId(dto.getId());
         if (CollectionUtils.isNotEmpty(dto.getMembers())) {
@@ -329,8 +383,47 @@ public class ProjectListService {
                 member.setUpdateDate(new Date());
                 member.setDelFlag(0);
                 projectMemberMapper.insert(member);
+                if (StringUtils.isNotBlank(member.getUserId())) {
+//                    成员的user_id不是"项目负责人"、"项目创建人"的添加到非主要项目组成员id集合中
+                    if (!member.getUserId().equals(info.getProjectManager()) && !member.getUserId().equals(info.getCreateBy())) {
+                        memberIds.add(member.getUserId());
+                    }
+                }
+            }
+        }
+        // 非主要项目组成员id集合去重后添加到项目组成员集合中
+        if (CollectionUtil.isNotEmpty(memberIds)) {
+            List<String> mids = memberIds.stream().distinct().collect(Collectors.toList());
+            mids.stream().forEach(item -> {
+                ProgramMembers p = new ProgramMembers();
+                p.setIsImportant("0");  // 非主要成员
+                p.setProjectId(dto.getId());
+                p.setStatus("0");
+                p.setUserId(item);  //  项目创建人
+                programMembers.add(p);
+            });
+        }
+        // 主要项目组成员去重后添加到项目组成员集合中
+        ProgramMembers p = new ProgramMembers();
+        p.setIsImportant("1");  // 主要成员
+        p.setProjectId(dto.getId());
+        p.setStatus("0");
+        p.setUserId(info.getCreateBy());  //  项目创建人
+        programMembers.add(p);
+        if (StringUtils.isNotBlank(info.getProjectManager())) {
+            ProgramProjectListInfo byId = projectListMapper.getById(dto.getId());
+            if (!byId.getCreateBy().equals(info.getProjectManager())) { // 项目创建人,项目负责人去重一下
+                ProgramMembers m = new ProgramMembers();
+                m.setIsImportant("1");  // 主要成员
+                m.setProjectId(dto.getId());
+                m.setStatus("0");
+                m.setUserId(info.getProjectManager()); // 项目负责人
+                programMembers.add(m);
             }
         }
+        // 保存项目组成员
+        programMembersService.saveBatch(programMembers);
+
         // 修改附件信息
         if (CollectionUtils.isNotEmpty(dto.getFiles())) {
             workContractService.updateFiles(dto.getFiles(), userDTO, dto.getId());
@@ -387,6 +480,12 @@ public class ProjectListService {
         memberWrapper.eq(ProgramProjectListMember::getDelFlag, 0);
         List<ProgramProjectListMember> members = projectMemberMapper.selectList(memberWrapper);
         if (CollectionUtils.isNotEmpty(members)) {
+            members.stream().forEach(member -> {
+                if (StringUtils.isNotBlank(member.getUserId())) {
+                    User byId = userService.getById(member.getUserId());
+                    member.setName(byId.getName());
+                }
+            });
             dto.setMembers(members);
         }
         // 查询附件信息

+ 46 - 0
jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/program/configuration/projectList/service/dto/ProgramMembersDto.java

@@ -0,0 +1,46 @@
+package com.jeeplus.test.program.configuration.projectList.service.dto;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.jeeplus.core.domain.BaseEntity;
+import com.jeeplus.core.service.dto.BaseDTO;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * 评估-项目管理-项目组成员
+ * @TableName program_members
+ */
+@TableName(value ="program_members")
+@Data
+public class ProgramMembersDto extends BaseDTO implements Serializable {
+
+    /**
+     * 备注
+     */
+    private String remarks;
+
+    /**
+     * 项目id
+     */
+    private String projectId;
+
+    /**
+     * 人员id
+     */
+    private String userId;
+
+    /**
+     * 状态  0为正常  1为移除
+     */
+    private String status;
+
+    /**
+     * 项目主要成员  1为主要成员 
+     */
+    private String isImportant;
+
+    @TableField(exist = false)
+    private static final long serialVersionUID = 1L;
+}

+ 17 - 0
jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/program/configuration/projectList/service/mapstruct/ProgramMembersWrapper.java

@@ -0,0 +1,17 @@
+package com.jeeplus.test.program.configuration.projectList.service.mapstruct;
+
+import com.jeeplus.core.mapstruct.EntityWrapper;
+import com.jeeplus.test.program.configuration.projectList.domain.ProgramArchive;
+import com.jeeplus.test.program.configuration.projectList.domain.ProgramMembers;
+import com.jeeplus.test.program.configuration.projectList.service.dto.ProgramArchiveDto;
+import com.jeeplus.test.program.configuration.projectList.service.dto.ProgramMembersDto;
+import org.mapstruct.Mapper;
+import org.mapstruct.ReportingPolicy;
+import org.mapstruct.factory.Mappers;
+
+@Mapper(componentModel = "spring", unmappedTargetPolicy = ReportingPolicy.IGNORE, uses = {})
+public interface ProgramMembersWrapper extends EntityWrapper<ProgramMembersDto, ProgramMembers>{
+
+        ProgramMembersWrapper INSTANCE = Mappers.getMapper(ProgramMembersWrapper.class);
+
+}

+ 39 - 16
jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/roster/controller/RosterBaseController.java

@@ -3,6 +3,7 @@ package com.jeeplus.test.roster.controller;
 import cn.hutool.core.collection.CollectionUtil;
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -10,6 +11,8 @@ import com.google.common.collect.Lists;
 import com.jeeplus.aop.demo.annotation.DemoMode;
 import com.jeeplus.aop.logging.annotation.ApiLog;
 import com.jeeplus.common.beanvalidator.BeanValidators;
+import com.jeeplus.core.excel.ExcelOptions;
+import com.jeeplus.core.excel.ExportMode;
 import com.jeeplus.core.excel.utils.EasyPoiUtil;
 import com.jeeplus.core.query.QueryWrapperGenerator;
 import com.jeeplus.security.util.SecurityUtils;
@@ -35,9 +38,12 @@ import com.jeeplus.test.rank.service.dto.RankDTO;
 import com.jeeplus.test.rank.service.dto.RankSequenceDTO;
 import com.jeeplus.test.rank.service.mapstruct.RankSequenceWrapper;
 import com.jeeplus.test.rank.service.mapstruct.RankWrapper;
+import com.jeeplus.test.reimbursement.reimbursementInfo.service.dto.QueryListDto;
+import com.jeeplus.test.reimbursement.reimbursementInfo.service.dto.RetureListDto;
 import com.jeeplus.test.roster.domain.RosterBase;
 import com.jeeplus.test.roster.service.RosterBaseService;
 import com.jeeplus.test.roster.service.dto.RosterBaseDTO;
+import com.jeeplus.test.roster.service.dto.RosterBaseExportDTO;
 import com.jeeplus.test.roster.service.mapstruct.RosterBaseWrapper;
 import com.jeeplus.test.user.service.dto.FileUrlDto;
 import io.swagger.annotations.Api;
@@ -85,20 +91,7 @@ public class RosterBaseController {
     @PreAuthorize("hasAuthority('roster:base:list')")
     @GetMapping("list")
     public ResponseEntity<IPage<RosterBaseDTO>> data(RosterBaseDTO rosterBaseDTO, Page<RosterBaseDTO> page) throws Exception {
-        RosterBase rosterBase = RosterBaseWrapper.INSTANCE.toEntity(rosterBaseDTO);
-        QueryWrapper<RosterBase> queryWrapper = QueryWrapperGenerator.buildQueryCondition ( rosterBase, RosterBase.class );
-        if(ObjectUtil.isNotEmpty(rosterBaseDTO)){
-            if(StringUtils.isNotBlank(rosterBaseDTO.getCompanyId())){
-                List<Office> list = officeService.list(new QueryWrapper<Office>().lambda().like(Office::getParentIds, rosterBaseDTO.getCompanyId()).eq(Office::getDelFlag, '0'));
-                List<String> ids = list.stream().map(Office::getId).collect(Collectors.toList());
-                queryWrapper.in("so.id",ids);
-            }else if(StringUtils.isNotBlank(rosterBaseDTO.getOfficeId())){
-                List<Office> list = officeService.list(new QueryWrapper<Office>().lambda().eq(Office::getId, rosterBaseDTO.getOfficeId()).eq(Office::getDelFlag, '0'));
-                List<String> ids = list.stream().map(Office::getId).collect(Collectors.toList());
-                queryWrapper.in("so.id",ids);
-            }
-        }
-        IPage<RosterBaseDTO> result = rosterBaseService.findList (page,queryWrapper);
+        IPage<RosterBaseDTO> result = rosterBaseService.findList (page,rosterBaseDTO);
         return ResponseEntity.ok (result);
     }
 
@@ -180,8 +173,8 @@ public class RosterBaseController {
     @ApiOperation(value = "下载模板")
     public void importFileTemplate(HttpServletResponse response) {
         String fileName = "花名册数据导入模板.xlsx";
-        List<RosterBaseDTO> list = Lists.newArrayList();
-        EasyPoiUtil.exportExcel ( list, "花名册数据",  "花名册数据", RosterBaseDTO.class, fileName, response );
+        List<RosterBaseExportDTO> list = Lists.newArrayList();
+        EasyPoiUtil.exportExcel ( list, "花名册数据",  "花名册数据", RosterBaseExportDTO.class, fileName, response );
     }
 
     /**
@@ -197,4 +190,34 @@ public class RosterBaseController {
         return rosterBaseService.importFile(file);
     }
 
+    /**
+     * 花名册数据导出
+     * @param rosterBaseDTO
+     * @param page
+     * @param options
+     * @param response
+     * @throws Exception
+     */
+    @ApiLog(value = "花名册导出", type = LogTypeEnum.EXPORT)
+    @GetMapping("exportFile")
+    @ApiOperation(value = "花名册导出")
+    public void exportFile(RosterBaseDTO rosterBaseDTO, Page <RosterBaseDTO> page, ExcelOptions options, HttpServletResponse response) throws Exception {
+        String fileName = options.getFilename();
+        String sheetName = options.getSheetName();
+        List<RosterBaseDTO> result = new ArrayList<>();
+        if ( ExportMode.current.equals ( options.getMode() ) ) {
+            result = rosterBaseService.findList (page,rosterBaseDTO).getRecords();
+        } else if (ExportMode.selected.equals ( options.getMode() )) {
+            result = rosterBaseService.findList (page,rosterBaseDTO).getRecords().stream ( ).filter ( item ->
+                    options.getSelectIds ( ).contains ( item.getId ( ) )
+            ).collect ( Collectors.toList ( ) );
+        } else {
+            page.setSize (-1);
+            page.setCurrent (0);
+            result = rosterBaseService.findList (page,rosterBaseDTO).getRecords();
+        }
+        EasyPoiUtil.exportExcel ( result, sheetName,  sheetName, RosterBaseDTO.class, fileName, response );
+
+    }
+
 }

+ 20 - 0
jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/roster/mapper/xml/RosterBaseMapper.xml

@@ -58,6 +58,8 @@
     <collection property="rosterFamilyDTOList" ofType="com.jeeplus.test.roster.service.dto.RosterFamilyDTO" column="id" select="getFamilyList"></collection>
     <collection property="rosterCertificateDTOList" ofType="com.jeeplus.test.roster.service.dto.RosterCertificateDTO" column="id" select="getCertificateList"></collection>
     <collection property="rosterFilesDTOList" ofType="com.jeeplus.test.roster.service.dto.RosterFilesDTO" column="id" select="getFilesList"></collection>
+    <collection property="postList" ofType="com.jeeplus.sys.domain.Post" column="id" select="getPostList"></collection>
+    <collection property="roleList" ofType="com.jeeplus.sys.domain.Role" column="id" select="getRoleList"></collection>
   </resultMap>
 
   <sql id="Base_Column_List">
@@ -234,6 +236,24 @@
     rw.post_description
   </sql>
 
+  <select id="getPostList" resultType="com.jeeplus.sys.domain.Post">
+      select
+          distinct sp.id,
+          sp.name
+      from sys_user su
+      left join sys_user_post sup on su.id = sup.user_id
+      left join sys_post sp on sp.id = sup.post_id and sp.del_flag = '0'
+      where su.roster_id = #{id} and su.del_flag = '0'
+  </select>
+  <select id="getRoleList" resultType="com.jeeplus.sys.domain.Role">
+        select
+            distinct sr.id,
+            sr.name
+        from sys_user su
+        left join sys_user_role sur on su.id = sur.user_id
+        left join sys_role sr on sr.id = sur.role_id and sr.del_flag = '0'
+        where su.roster_id = #{id} and su.del_flag = '0'
+  </select>
   <select id="getContractDTO" resultType="com.jeeplus.test.roster.service.dto.RosterContractDTO">
     select
     <include refid="Contract_Column_List"></include>

+ 160 - 15
jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/roster/service/RosterBaseService.java

@@ -3,16 +3,17 @@ package com.jeeplus.test.roster.service;
 import cn.hutool.core.collection.CollectionUtil;
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.jeeplus.core.excel.utils.EasyPoiUtil;
+import com.jeeplus.core.query.QueryWrapperGenerator;
 import com.jeeplus.security.util.SecurityUtils;
 import com.jeeplus.sys.constant.enums.OfficeTypeEnum;
-import com.jeeplus.sys.domain.Cert;
-import com.jeeplus.sys.domain.Office;
-import com.jeeplus.sys.domain.User;
+import com.jeeplus.sys.domain.*;
 import com.jeeplus.sys.mapper.UserMapper;
 import com.jeeplus.sys.service.CertService;
 import com.jeeplus.sys.service.OfficeService;
@@ -98,14 +99,65 @@ public class RosterBaseService extends ServiceImpl<RosterBaseMapper, RosterBase>
     @Autowired
     private CertService certService;
 
-    public IPage<RosterBaseDTO> findList(Page<RosterBaseDTO> page, QueryWrapper<RosterBase> queryWrapper){
+    public IPage<RosterBaseDTO> findList(Page<RosterBaseDTO> page, RosterBaseDTO rosterBaseDTO) throws Exception {
+        RosterBase rosterBase = RosterBaseWrapper.INSTANCE.toEntity(rosterBaseDTO);
+        QueryWrapper<RosterBase> queryWrapper = QueryWrapperGenerator.buildQueryCondition ( rosterBase, RosterBase.class );
         queryWrapper.eq("rb.del_flag","0");
+        if(ObjectUtil.isNotEmpty(rosterBaseDTO)){
+            if(StringUtils.isNotBlank(rosterBaseDTO.getCompanyId())){
+                List<Office> list = officeService.list(new QueryWrapper<Office>().lambda().like(Office::getParentIds, rosterBaseDTO.getCompanyId()).eq(Office::getDelFlag, '0'));
+                List<String> ids = list.stream().map(Office::getId).collect(Collectors.toList());
+                queryWrapper.in("so.id",ids);
+            }else if(StringUtils.isNotBlank(rosterBaseDTO.getOfficeId())){
+                List<Office> list = officeService.list(new QueryWrapper<Office>().lambda().eq(Office::getId, rosterBaseDTO.getOfficeId()).eq(Office::getDelFlag, '0'));
+                List<String> ids = list.stream().map(Office::getId).collect(Collectors.toList());
+                queryWrapper.in("so.id",ids);
+            }
+            if (StringUtils.isNotBlank(rosterBaseDTO.getOfficeSelect())) {
+                //  根据部门筛选
+                List<User> userList = userService.list(new LambdaQueryWrapper<User>().eq(User::getOfficeId, rosterBaseDTO.getOfficeSelect()));
+                List<String> ids = userList.stream().distinct().map(User::getRosterId).collect(Collectors.toList());
+                queryWrapper.in("rb.id",ids);
+            }
+            if (StringUtils.isNotBlank(rosterBaseDTO.getPostSelect())) {
+                //  根据岗位筛选
+                List<User> userByPost = userService.getUserIdByPost(rosterBaseDTO.getPostSelect());
+                List<String> ids = userByPost.stream().distinct().map(User::getRosterId).collect(Collectors.toList());
+                queryWrapper.in("rb.id",ids);
+            }
+            if (ObjectUtil.isNotEmpty(rosterBaseDTO.getDates())) {
+                queryWrapper.between("rb.onboarding_date", rosterBaseDTO.getDates()[0], rosterBaseDTO.getDates()[1]);
+            }
+        }
         IPage<RosterBaseDTO> rosterBaseDTOIPage = rosterBaseMapper.findList(page, queryWrapper);
         if(CollectionUtil.isNotEmpty(rosterBaseDTOIPage.getRecords())){
             rosterBaseDTOIPage.getRecords().stream().forEach(item->{
-                if(StringUtils.isNotBlank(item.getHeadshot())){
-                    String fileTemporaryLookUrl = ossService.getFileTemporaryLookUrl(item.getHeadshot());
-                    item.setHeadshotLsUrl(fileTemporaryLookUrl);
+//                头像获取到新的临时地址展示
+//                if(StringUtils.isNotBlank(item.getHeadshot())){
+//                    String fileTemporaryLookUrl = ossService.getFileTemporaryLookUrl(item.getHeadshot());
+//                    item.setHeadshotLsUrl(fileTemporaryLookUrl);
+//                }
+                if (CollectionUtil.isNotEmpty(item.getPostList())) {
+                    String postNames = item.getPostList().stream().filter(filter ->{
+                        if(ObjectUtil.isNotEmpty(filter)) {
+                            if (StringUtils.isNotBlank(filter.getName())) {
+                                return true;
+                            }
+                        }
+                        return false;
+                    }).map(Post::getName).collect(Collectors.joining(","));
+                    item.setPostNames(postNames);
+                }
+                if (CollectionUtil.isNotEmpty(item.getRoleList())) {
+                    String roleNames = item.getRoleList().stream().filter(filter ->{
+                        if(ObjectUtil.isNotEmpty(filter)) {
+                            if (StringUtils.isNotBlank(filter.getName())) {
+                                return true;
+                            }
+                        }
+                        return false;
+                    }).map(Role::getName).collect(Collectors.joining(","));
+                    item.setRoleNames(roleNames);
                 }
             });
         }
@@ -200,8 +252,11 @@ public class RosterBaseService extends ServiceImpl<RosterBaseMapper, RosterBase>
         if(ObjectUtil.isNotEmpty(rosterBaseDTO)){
             if(StringUtils.isNotBlank(rosterBaseDTO.getId())){
                 RosterBase byId = this.getById(rosterBaseDTO.getId());
-                // 原数据的人员类型为员工,现在要修改成游客,那么就要将原数据关联的用户删除掉
+                // 原数据的人员类型为员工,现在要修改成游客,
+                // 原数据关联的用户删除掉
+                // 删除原数据关联表的数据,删除与游客无关的数据
                 if ("1".equals(byId.getPersonType()) && "2".equals(rosterBaseDTO.getPersonType())) {
+                    // 原数据关联的用户删除掉
                     // 通过花名册id查询用户
                     List<User> ulist = userService.list(new QueryWrapper<User>().lambda().eq(User::getRosterId, rosterBaseDTO.getId()));
                     if (CollectionUtil.isNotEmpty(ulist)) {
@@ -218,7 +273,8 @@ public class RosterBaseService extends ServiceImpl<RosterBaseMapper, RosterBase>
                             userMapper.deleteUserRole(i.getId());
                         });
                     }
-
+                    //  删除原数据关联表的数据,清空与游客无关的字段
+                    rosterBaseDTO = this.deleteRosterWorker(rosterBaseDTO);
                 }
                 // 身份证号唯一验证(排除自己)
                 if(StringUtils.isNotBlank(rosterBaseDTO.getIdCard())){
@@ -235,11 +291,6 @@ public class RosterBaseService extends ServiceImpl<RosterBaseMapper, RosterBase>
                     }
                 }
             }else{
-                //获取当前登录人信息
-                UserDTO userDTO = UserUtils.getCurrentUserDTO();
-                //工号生成
-                String serialNum = serialnumTplService.genSerialNum(userDTO.getCompanyDTO().getId(), RosterBaseDTO.BIZ_CODE);
-                rosterBaseDTO.setJobNo(serialNum);
                 // 身份证号唯一验证
                 if(StringUtils.isNotBlank(rosterBaseDTO.getIdCard())){
                     List<RosterBase> rosterBaseList = this.list(new QueryWrapper<RosterBase>().eq("id_card", rosterBaseDTO.getIdCard()));
@@ -255,11 +306,27 @@ public class RosterBaseService extends ServiceImpl<RosterBaseMapper, RosterBase>
                     }
                 }
             }
-
+            if ("1".equals(rosterBaseDTO.getPersonType())) { // 当前人员是员工时
+                //获取当前登录人信息
+                UserDTO userDTO = UserUtils.getCurrentUserDTO();
+                //工号生成
+                String serialNum = serialnumTplService.genSerialNum(userDTO.getCompanyDTO().getId(), RosterBaseDTO.BIZ_CODE);
+                if (StringUtils.isNotBlank(rosterBaseDTO.getId())) {
+                    RosterBase byId = this.getById(rosterBaseDTO.getId());
+                    if (StringUtils.isBlank(byId.getJobNo())) {
+                        rosterBaseDTO.setJobNo(serialNum);  // 游客转员工,保存时,生成工号
+                    }
+                } else {
+                    rosterBaseDTO.setJobNo(serialNum);  // 员工新增生成工号
+                }
+            }
         }
 
+
         RosterBase rosterBase = RosterBaseWrapper.INSTANCE.toEntity(rosterBaseDTO);
 
+
+
         // 新增或修改花名册数据
         this.saveOrUpdate(rosterBase);
 
@@ -275,6 +342,8 @@ public class RosterBaseService extends ServiceImpl<RosterBaseMapper, RosterBase>
                 rosterContract.setBaseId(rosterBase.getId());
                 rosterContractService.remove(new QueryWrapper<RosterContract>().eq("base_id",rosterBase.getId()));
                 rosterContractService.saveOrUpdate(rosterContract);
+            } else {
+                rosterContractService.remove(new QueryWrapper<RosterContract>().eq("base_id",rosterBase.getId()));
             }
             //保存银行卡信息
             if(CollectionUtil.isNotEmpty(rosterBaseDTO.getRosterBankCardsDTOList())){
@@ -614,4 +683,80 @@ public class RosterBaseService extends ServiceImpl<RosterBaseMapper, RosterBase>
         });
         return ResponseEntity.ok ("删除花名册成功");
     }
+
+    public RosterBaseDTO deleteRosterWorker (RosterBaseDTO rosterBaseDTO) {
+//        删除原数据关联表的数据
+        rosterBaseDTO.setRosterContractDTO(null);  // 删除合同信息
+        rosterBaseDTO.setRosterBankCardsDTOList(null);  // 删除银行卡信息
+        rosterBaseDTO.setRosterEducateDTOList(null);  // 删除教育经历
+        rosterBaseDTO.setRosterWorkDTOList(null);  // 删除工作经历
+        rosterBaseDTO.setRosterFamilyDTOList(null);  // 删除家庭成员
+        rosterBaseDTO.setRosterCertificateDTOList(null);  // 删除员工证书
+        rosterBaseDTO.setRosterLeadershipDTO(null);  // 删除直属领导
+        rosterBaseDTO.setCertDTOList(null);  //  关联用户的资质
+        rosterBaseDTO.setRoleIdList(null);  // 关联用户的角色
+        rosterBaseDTO.setPostIdList(null);  //  关联用户的岗位
+        rosterBaseDTO.setManageOfficeIds(null);  //  关联用户的管理部门
+        // 与游客无关字段置空
+        rosterBaseDTO.setOfficeId("");
+        rosterBaseDTO.setJobPositionId("");
+        rosterBaseDTO.setPositionId("");
+        rosterBaseDTO.setRankId("");
+        rosterBaseDTO.setJobNo("");
+        rosterBaseDTO.setContractType("");
+        rosterBaseDTO.setWorkerType("");
+        rosterBaseDTO.setOnboardingDate(null);
+        rosterBaseDTO.setSeniority("");
+        rosterBaseDTO.setContractCompany("");
+        rosterBaseDTO.setBirthDate(null);
+        rosterBaseDTO.setWorkPlace("");
+        rosterBaseDTO.setContactAddress("");
+        rosterBaseDTO.setEmploymentSituation("");
+        rosterBaseDTO.setWorkingHour("");
+        rosterBaseDTO.setAccountType("");
+        rosterBaseDTO.setAccountAddr("");
+        rosterBaseDTO.setOrigin("");
+        rosterBaseDTO.setLiveAddr("");
+        rosterBaseDTO.setHighestEducation("");
+        rosterBaseDTO.setPoliticalFace("");
+        rosterBaseDTO.setMaritalStatus("");
+        rosterBaseDTO.setEmergencyContactName("");
+        rosterBaseDTO.setEmergencyContactTel("");
+        rosterBaseDTO.setSpouseName("");
+        rosterBaseDTO.setChildName("");
+        rosterBaseDTO.setHeadshot("");
+        // 表删除无关字段
+        UpdateWrapper<RosterBase> wrapper = new UpdateWrapper<>();
+        wrapper.lambda()
+                .set(RosterBase::getOfficeId,null)
+                .set(RosterBase::getJobPositionId,null)
+                .set(RosterBase::getPositionId,null)
+                .set(RosterBase::getRankId,null)
+                .set(RosterBase::getJobNo,null)
+                .set(RosterBase::getContractType,null)
+                .set(RosterBase::getWorkerType,null)
+                .set(RosterBase::getOnboardingDate,null)
+                .set(RosterBase::getSeniority,null)
+                .set(RosterBase::getContractCompany,null)
+                .set(RosterBase::getBirthDate,null)
+                .set(RosterBase::getWorkPlace,null)
+                .set(RosterBase::getContactAddress,null)
+                .set(RosterBase::getEmploymentSituation,null)
+                .set(RosterBase::getWorkingHour,null)
+                .set(RosterBase::getAccountType,null)
+                .set(RosterBase::getAccountAddr,null)
+                .set(RosterBase::getOrigin,null)
+                .set(RosterBase::getLiveAddr,null)
+                .set(RosterBase::getHighestEducation,null)
+                .set(RosterBase::getPoliticalFace,null)
+                .set(RosterBase::getMaritalStatus,null)
+                .set(RosterBase::getEmergencyContactName,null)
+                .set(RosterBase::getEmergencyContactTel,null)
+                .set(RosterBase::getSpouseName,null)
+                .set(RosterBase::getChildName,null)
+                .set(RosterBase::getHeadshot,null)
+                .eq(RosterBase::getId,rosterBaseDTO.getId());
+        this.update(wrapper);
+        return rosterBaseDTO;
+    }
 }

+ 42 - 4
jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/roster/service/dto/RosterBaseDTO.java

@@ -9,6 +9,8 @@ import com.jeeplus.core.domain.BaseEntity;
 import com.jeeplus.core.query.Query;
 import com.jeeplus.core.query.QueryType;
 import com.jeeplus.core.service.dto.BaseDTO;
+import com.jeeplus.sys.domain.Post;
+import com.jeeplus.sys.domain.Role;
 import com.jeeplus.sys.service.dto.CertDTO;
 import com.jeeplus.sys.service.dto.OfficeDTO;
 import com.jeeplus.sys.service.dto.PostDTO;
@@ -75,13 +77,13 @@ public class RosterBaseDTO extends BaseDTO {
     /**
      * 证件类型
      */
-    @Excel(name="证件类型",width = 25,orderNum = "3",dict = "certificates_type",addressList = true)
+    @Excel(name="证件类型",width = 25,orderNum = "6",dict = "certificates_type")
     private String certificatesType;
 
     /**
      * 证件号
      */
-    @Excel(name="证件号",width = 25,orderNum = "4")
+    @Excel(name="证件号",width = 25,orderNum = "7")
     private String idCard;
 
     /**
@@ -118,12 +120,13 @@ public class RosterBaseDTO extends BaseDTO {
     /**
      * 员工类型
      */
-    @Excel(name="员工类型",width = 25,orderNum = "6",dict = "worker_type",addressList = true)
+    @Excel(name="员工类型",width = 25,orderNum = "9",dict = "worker_type")
     private String workerType;
 
     /**
      * 入职日期
      */
+    @Excel(name="入职日期",width = 25,orderNum = "10",exportFormat = "yyyy-MM-dd")
     private Date onboardingDate;
 
     /**
@@ -305,7 +308,7 @@ public class RosterBaseDTO extends BaseDTO {
     /**
      * 人员类型  1员工  2游客
      */
-    @Excel(name="人员类型",width = 25,orderNum = "7",dict = "roster_person_type",addressList = true)
+    @Excel(name="人员类型",width = 25,orderNum = "8",dict = "roster_person_type")
     private String personType;
 
     /**
@@ -328,7 +331,42 @@ public class RosterBaseDTO extends BaseDTO {
      */
     private String manageOfficeIds;
 
+    /**
+     * 列表页面筛选条件:部门
+     */
+    private String officeSelect;
+
+    /**
+     * 列表页面筛选条件:岗位
+     */
+    private String postSelect;
 
+    /**
+     * 列表页面筛选条件:入职时间(区间)
+     */
+    private String[] dates;
+
+    /**
+     * 岗位
+     */
+    private List<Post> postList;
+
+    /**
+     * 角色
+     */
+    private List<Role> roleList;
+
+    /**
+     * 岗位名称(逗号分隔)
+     */
+    @Excel(name="岗位",width = 25,orderNum = "4")
+    private String postNames;
+
+    /**
+     * 角色名称(逗号分隔)
+     */
+    @Excel(name="角色",width = 25,orderNum = "3")
+    private String roleNames;
 
     private static final long serialVersionUID = 1L;
 }

+ 336 - 0
jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/roster/service/dto/RosterBaseExportDTO.java

@@ -0,0 +1,336 @@
+package com.jeeplus.test.roster.service.dto;
+
+import cn.afterturn.easypoi.excel.annotation.Excel;
+import com.jeeplus.core.service.dto.BaseDTO;
+import com.jeeplus.sys.service.dto.CertDTO;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * roster_base
+ * @author 
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class RosterBaseExportDTO extends BaseDTO {
+
+    public static final String BIZ_CODE = "3";
+
+    /**
+     * 备注信息
+     */
+    private String remarks;
+
+    /**
+     * 姓名
+     */
+    @Excel(name="姓名",width = 25,orderNum = "1")
+    private String name;
+
+    /**
+     * 部门id
+     */
+    private String officeId;
+
+    /**
+     * 公司id
+     */
+    private String companyId;
+
+    /**
+     * 职位id
+     */
+    private String jobPositionId;
+
+    /**
+     * 职务id
+     */
+    private String positionId;
+
+    /**
+     * 职级id
+     */
+    private String rankId;
+
+    /**
+     * 工号
+     */
+    private String jobNo;
+
+    /**
+     * 证件类型
+     */
+    @Excel(name="证件类型",width = 25,orderNum = "3",dict = "certificates_type",addressList = true)
+    private String certificatesType;
+
+    /**
+     * 证件号
+     */
+    @Excel(name="证件号",width = 25,orderNum = "4")
+    private String idCard;
+
+    /**
+     * 证件照正面
+     */
+    private String certificatesFront;
+
+    /**
+     * 证件照正面
+     */
+    private String certificatesFrontLsUrl;
+
+    /**
+     * 证件照反面
+     */
+    private String certificatesBack;
+
+    /**
+     * 证件照反面
+     */
+    private String certificatesBackLsUrl;
+
+    /**
+     * 手机号码
+     */
+    @Excel(name="电话号码",width = 25,orderNum = "5")
+    private String mobile;
+
+    /**
+     * 合同类型
+     */
+    private String contractType;
+
+    /**
+     * 员工类型
+     */
+    @Excel(name="员工类型",width = 25,orderNum = "6",dict = "worker_type",addressList = true)
+    private String workerType;
+
+    /**
+     * 入职日期
+     */
+    private Date onboardingDate;
+
+    /**
+     * 历史工龄
+     */
+    private String seniority;
+
+    /**
+     * 合同公司
+     */
+    private String contractCompany;
+
+    /**
+     * 性别
+     */
+    private String sex;
+
+    /**
+     * 出生日期
+     */
+    private Date birthDate;
+
+    /**
+     * 工作地点
+     */
+    private String workPlace;
+
+    /**
+     * 联系地址
+     */
+    private String contactAddress;
+
+    /**
+     * 入职年度就业情形
+     */
+    private String employmentSituation;
+
+    /**
+     * 工时制度
+     */
+    private String workingHour;
+
+    /**
+     * 民族
+     */
+    private String ethnic;
+
+    /**
+     * 户口类型
+     */
+    private String accountType;
+
+    /**
+     * 户口所在地
+     */
+    private String accountAddr;
+
+    /**
+     * 籍贯
+     */
+    private String origin;
+
+    /**
+     * 居住地址
+     */
+    private String liveAddr;
+
+    /**
+     * 最高学历
+     */
+    private String highestEducation;
+
+    /**
+     * 政治面貌
+     */
+    private String politicalFace;
+
+    /**
+     * 婚姻状况
+     */
+    private String maritalStatus;
+
+    /**
+     * 血型
+     */
+    private String bloodType;
+
+    /**
+     * 紧急联系人姓名
+     */
+    private String emergencyContactName;
+
+    /**
+     * 紧急联系人电话
+     */
+    private String emergencyContactTel;
+
+    /**
+     * 配偶姓名
+     */
+    private String spouseName;
+
+    /**
+     * 孩子姓名
+     */
+    private String childName;
+
+    /**
+     * QQ
+     */
+    private String qq;
+
+    /**
+     * 微信
+     */
+    private String wechat;
+
+    /**
+     * 个人邮箱
+     */
+    private String email;
+
+    /**
+     * 合同信息
+     */
+    private RosterContractDTO rosterContractDTO;
+
+    /**
+     * 银行卡信息
+     */
+    private List<RosterBankCardsDTO> rosterBankCardsDTOList;
+
+    /**
+     * 教育经历
+     */
+    private List<RosterEducateDTO> rosterEducateDTOList;
+
+    /**
+     * 工作经历
+     */
+    private List<RosterWorkDTO> rosterWorkDTOList;
+
+    /**
+     * 家庭成员
+     */
+    private List<RosterFamilyDTO> rosterFamilyDTOList;
+
+    /**
+     * 员工证书
+     */
+    private List<RosterCertificateDTO> rosterCertificateDTOList;
+
+    /**
+     * 附件
+     */
+    private List<RosterFilesDTO> rosterFilesDTOList;
+
+    /**
+     * 头像
+     */
+    private String headshot;
+
+    /**
+     * 头像
+     */
+    private String headshotLsUrl;
+
+    /**
+     * 直属领导
+     */
+    private RosterLeadershipDTO rosterLeadershipDTO;
+
+    /**
+     * 所属部门
+     */
+    @Excel(name = "部门",width = 25,orderNum = "2")
+    private String officeName;
+
+    /**
+     * 人员类型  1员工  2游客
+     */
+    @Excel(name="人员类型",width = 25,orderNum = "7",dict = "roster_person_type",addressList = true)
+    private String personType;
+
+    /**
+     * 执业资格证列表
+     */
+    private List<CertDTO> certDTOList;
+
+    /**
+     * 角色信息
+     */
+    private List<String> roleIdList;
+
+    /**
+     * 岗位信息
+     */
+    private List<String> postIdList;
+
+    /**
+     * 管理的部门名称
+     */
+    private String manageOfficeIds;
+
+    /**
+     * 列表页面筛选条件:部门
+     */
+    private String officeSelect;
+
+    /**
+     * 列表页面筛选条件:岗位
+     */
+    private String postSelect;
+
+    /**
+     * 列表页面筛选条件:入职时间(区间)
+     */
+    private String[] dates;
+
+
+    private static final long serialVersionUID = 1L;
+}

+ 10 - 0
jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/zs/zsReimbursement/approvalInfo/controller/ZsReimbursementInfoController.java

@@ -7,7 +7,9 @@ import com.jeeplus.common.utils.ResponseUtil;
 import com.jeeplus.core.excel.ExcelOptions;
 import com.jeeplus.core.excel.ExportMode;
 import com.jeeplus.core.excel.utils.EasyPoiUtil;
+import com.jeeplus.flowable.service.FlowTaskService;
 import com.jeeplus.sys.constant.enums.LogTypeEnum;
+import com.jeeplus.sys.utils.StringUtils;
 import com.jeeplus.test.cw.invoice.service.dto.CwFinanceInvoiceDTO;
 import com.jeeplus.test.cw.reimbursementApproval.approvalInfo.service.dto.*;
 import com.jeeplus.test.program.configuration.projectList.domain.ProgramProjectListInfo;
@@ -40,6 +42,9 @@ public class ZsReimbursementInfoController {
     @Resource
     private ZsReimbursementInfoService service;
 
+    @Resource
+    private FlowTaskService flowTaskService;
+
     /**
      * 报告号查询
      * @param dto
@@ -61,6 +66,11 @@ public class ZsReimbursementInfoController {
     @GetMapping("/list")
     public ResponseEntity<IPage<ZsRetureListDto>> list(Page<ZsRetureListDto> page, QueryListDto dto) throws Exception{
         IPage<ZsRetureListDto> iPage = service.list(page, dto);
+        iPage.getRecords().stream().forEach(i -> {
+            if (StringUtils.isNotBlank(i.getProcInsId()) && StringUtils.isNotBlank(i.getTaskId())) {
+                i.setAuditUserIds(flowTaskService.getTaskAuditUsers(i.getProcInsId(), i.getTaskId()));  // 获取数据审核人
+            }
+        });
         return ResponseEntity.ok(iPage);
     }
 

+ 7 - 0
jeeplus-module/jeeplus-test/src/main/java/com/jeeplus/test/zs/zsReimbursement/approvalInfo/service/dto/ZsRetureListDto.java

@@ -2,10 +2,12 @@ package com.jeeplus.test.zs.zsReimbursement.approvalInfo.service.dto;
 
 import cn.afterturn.easypoi.excel.annotation.Excel;
 import com.fasterxml.jackson.annotation.JsonFormat;
+import liquibase.pro.packaged.S;
 import lombok.Data;
 
 import java.math.BigDecimal;
 import java.util.Date;
+import java.util.List;
 
 @Data
 public class ZsRetureListDto {
@@ -115,4 +117,9 @@ public class ZsRetureListDto {
     private String purchaseNo;
 
     private String purchaseId;
+
+    /**
+     * 数据审核人
+     */
+    private List<String> auditUserIds;
 }

+ 9 - 2
jeeplus-platform/jeeplus-admin/src/main/java/com/jeeplus/core/excel/ExcelDiceAddressListHandlerImpl.java

@@ -1,6 +1,7 @@
 package com.jeeplus.core.excel;
 
 import cn.afterturn.easypoi.handler.inter.IExcelDictHandler;
+import cn.hutool.core.util.ObjectUtil;
 import com.jeeplus.sys.service.dto.DictValueDTO;
 import com.jeeplus.sys.utils.DictUtils;
 
@@ -49,11 +50,17 @@ public class ExcelDiceAddressListHandlerImpl implements IExcelDictHandler {
 
     @Override
     public String toName(String dict, Object obj, String name, Object value) {
-        return DictUtils.getDictLabel (value.toString (), dict, null);
+        if (ObjectUtil.isNotEmpty(value)) {
+            return DictUtils.getDictLabel (value.toString (), dict, null);
+        }
+        return "";
     }
 
     @Override
     public String toValue(String dict, Object obj, String name, Object value) {
-        return DictUtils.getDictLabel (value.toString (), dict, null);
+        if (ObjectUtil.isNotEmpty(value)) {
+            return DictUtils.getDictLabel (value.toString (), dict, null);
+        }
+        return "";
     }
 }

+ 5 - 0
jeeplus-platform/jeeplus-admin/src/main/java/com/jeeplus/sys/mapper/UserMapper.java

@@ -222,4 +222,9 @@ public interface UserMapper extends BaseMapper<User> {
      * 修改用户的管理部门
      */
     void updateUserManageOffice(@Param("officeIds") String officeIds,@Param("userId") String userId);
+
+    /**
+     * 根据岗位id获取用户
+     */
+    List<User> getUserByPost(String postId);
 }

+ 8 - 0
jeeplus-platform/jeeplus-admin/src/main/java/com/jeeplus/sys/mapper/xml/UserMapper.xml

@@ -389,4 +389,12 @@
 		update sys_user set manage_office_ids = #{officeIds} where id = #{userId}
 	</update>
 
+	<select id="getUserByPost" resultType="com.jeeplus.sys.domain.User">
+		select
+		distinct u.id,
+		u.roster_id
+		from sys_user_post sup
+		left join sys_user u on u.id = sup.user_id and u.del_flag = 0
+		where sup.post_id = #{postId}
+	</select>
 </mapper>

+ 13 - 0
jeeplus-platform/jeeplus-admin/src/main/java/com/jeeplus/sys/service/UserService.java

@@ -515,12 +515,20 @@ public class UserService  extends ServiceImpl<UserMapper, User> {
 		User u = this.getById(user.getId());
 		if (StringUtils.isNotBlank(u.getRosterId())) {
 			r.setId(u.getRosterId()); // 花名册id
+			r.setWorkerType("1");  //  员工类型: 全职
+			RosterBaseC roster = rosterBaseCService.getById(u.getRosterId());
+			if (ObjectUtil.isNotEmpty(roster)) {
+				if (StringUtils.isNotBlank(roster.getWorkerType())) {
+					r.setWorkerType(roster.getWorkerType());  //  如果花名册的员工类型有值,则不修改花名册的员工类型
+				}
+			}
 		} else {
 			UserDTO userDTO = UserUtils.getCurrentUserDTO();
 			String serialNum = serialnumTplCService.genSerialNum(userDTO.getCompanyDTO().getId(), "3");
 			r.setJobNo(serialNum); // 花名册工号
 			user.setNo(serialNum); // 用户工号
 			r.setPersonType("1");  //  人员类型: 员工
+			r.setWorkerType("1");  //  员工类型: 全职
 		}
 		// 保存花名册数据
 		rosterBaseCService.saveOrUpdate(r);
@@ -544,4 +552,9 @@ public class UserService  extends ServiceImpl<UserMapper, User> {
 	public List<Cert> getCertListByUserId(String userId) {
 		return certService.list(new QueryWrapper<Cert>().lambda().eq(Cert::getUserId,userId));
 	}
+
+	// 根据岗位id查询用户
+	public List<User> getUserIdByPost(String postId) {
+		return userMapper.getUserByPost(postId);
+	}
 }

+ 5 - 0
jeeplus-plugins/jeeplus-flowable/src/main/java/com/jeeplus/flowable/mapper/FlowMapper.java

@@ -7,6 +7,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.jeeplus.flowable.model.ActHiIdentitylink;
 import com.jeeplus.flowable.model.ActRuTaskInfo;
 import com.jeeplus.flowable.model.Flow;
+import com.jeeplus.flowable.vo.AssigneeDto;
 
 import java.util.List;
 
@@ -35,4 +36,8 @@ public interface FlowMapper extends BaseMapper <Flow> {
     ActRuTaskInfo getTaskInfoByTaskId(String taskId);
 
     String getTaskIdByprocInstId(String procInsId);
+
+    List<AssigneeDto> getAssigneeDtoByTaskId(String taskId);
+
+    String getStarterByProcInsId(String procInsId);
 }

+ 16 - 0
jeeplus-plugins/jeeplus-flowable/src/main/java/com/jeeplus/flowable/mapper/xml/FlowMapper.xml

@@ -71,4 +71,20 @@
 		select ID_ from act_hi_procinst where PROC_INST_ID_ = #{procInstId}
 	</select>
 
+	<select id="getAssigneeDtoByTaskId" resultType="com.jeeplus.flowable.vo.AssigneeDto">
+		select
+			aea.type,
+			aea.assign_value
+		from act_ru_task art
+		left join act_extension_taskdef aet on art.TASK_DEF_KEY_ = aet.task_def_id and aet.del_flag = 0
+		left join act_extension_assignee aea on aet.id = aea.task_def_id and aet.del_flag = 0
+		where art.ID_ = #{taskId}
+	</select>
+
+	<select id="getStarterByProcInsId" resultType="string">
+		select
+			ari.USER_ID_
+		from act_ru_identitylink ari
+		where ari.PROC_INST_ID_ = #{procInsId} and ari.TYPE_ = 'starter'
+	</select>
 </mapper>

+ 164 - 0
jeeplus-plugins/jeeplus-flowable/src/main/java/com/jeeplus/flowable/service/FlowTaskService.java

@@ -3,6 +3,7 @@
  */
 package com.jeeplus.flowable.service;
 
+import cn.hutool.core.collection.CollectionUtil;
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.StrUtil;
 import cn.hutool.extra.spring.SpringUtil;
@@ -10,6 +11,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
 import com.jeeplus.common.utils.Collections3;
+import com.jeeplus.extension.service.dto.FlowAssigneeDTO;
 import com.jeeplus.flowable.constant.FlowableConstant;
 import com.jeeplus.flowable.model.ActHiIdentitylink;
 import com.jeeplus.flowable.model.ActRuTaskInfo;
@@ -21,6 +23,8 @@ import com.jeeplus.flowable.mapper.FlowMapper;
 import com.jeeplus.flowable.service.converter.json.FlowModelService;
 import com.jeeplus.flowable.utils.FlowableUtils;
 import com.jeeplus.flowable.utils.ProcessDefCache;
+import com.jeeplus.sys.domain.User;
+import com.jeeplus.sys.service.UserService;
 import com.jeeplus.sys.service.dto.UserDTO;
 import com.jeeplus.sys.utils.StringUtils;
 import com.jeeplus.sys.utils.UserUtils;
@@ -994,4 +998,164 @@ public class FlowTaskService {
         return flowMapper.getTaskIdByprocInstId(procInsId);
     }
 
+    /**
+     * 获取数据的全部审核人
+     */
+    public List<String> getTaskAuditUsers(String procInsId, String taskId) {
+        // 获取当前节点的所有审核人配置
+        List<AssigneeDto> assigneeDtoList = flowMapper.getAssigneeDtoByTaskId(taskId);
+        // 获取当前流程的发起人id
+        String startUserId = flowMapper.getStarterByProcInsId(procInsId);
+
+        HashSet<String> candidateUserIds = new LinkedHashSet<> ();
+        for (AssigneeDto flowAssignee : assigneeDtoList) {
+            switch (flowAssignee.getType ()) {
+                case "user":
+                    candidateUserIds.addAll (Arrays.asList (flowAssignee.getAssignValue ().split (",")));
+                    break;
+                case "post":
+                    if( StrUtil.isNotBlank (flowAssignee.getAssignValue ())){
+                        String postId = flowAssignee.getAssignValue ();
+                        List<UserDTO> userList = SpringUtil.getBean ( UserService.class).findListByPostId (postId  );
+                        candidateUserIds.addAll ( com.jeeplus.flowable.common.handler.CollectionUtils.extractToList (userList, "id"));
+                    }
+
+                    break;
+                case "company":
+                    if(StrUtil.isNotBlank (flowAssignee.getAssignValue ())){
+                        String companyId = flowAssignee.getAssignValue ();
+                        List<User> userList = SpringUtil.getBean (UserService.class).lambdaQuery ().eq ( User::getCompanyId, companyId ).list ();
+                        candidateUserIds.addAll (com.jeeplus.flowable.common.handler.CollectionUtils.extractToList (userList, "id"));
+                    }
+
+                    break;
+                case "depart":
+                    if(StrUtil.isNotBlank (flowAssignee.getAssignValue ())){
+                        String officeId = flowAssignee.getAssignValue ();
+                        List<User> userList = SpringUtil.getBean (UserService.class).lambdaQuery ().eq ( User::getOfficeId, officeId ).list ();
+                        candidateUserIds.addAll (com.jeeplus.flowable.common.handler.CollectionUtils.extractToList (userList, "id"));
+                    }
+
+                    break;
+                case "role":
+                    if(StrUtil.isNotBlank (flowAssignee.getAssignValue ())){
+                        String[] roleIds = flowAssignee.getAssignValue ().split (",");
+                        for(String roleId: roleIds){
+                            List<UserDTO> userList = SpringUtil.getBean (UserService.class).findListByRoleId ( roleId );
+                            candidateUserIds.addAll (com.jeeplus.flowable.common.handler.CollectionUtils.extractToList (userList, "id"));
+                        }
+                    }
+                    break;
+                case "applyUserId":
+                    candidateUserIds.add (flowAssignee.getAssignValue ());
+                    break;
+                case "previousExecutor":
+                    HistoricTaskInstance lastHisTask = SpringUtil.getBean (HistoryService.class).createHistoricTaskInstanceQuery ().processInstanceId (procInsId).finished ()
+                            .includeProcessVariables ().orderByHistoricTaskInstanceEndTime ().desc ().list ().get (0);
+
+                    candidateUserIds.add(lastHisTask.getAssignee ());
+                    break;
+                case "currentUserId":
+                    candidateUserIds.add( UserUtils.getCurrentUserDTO ().getId ());
+                    break;
+                case "sql":
+                    Map userMap = SpringUtil.getBean (JdbcTemplate.class).queryForMap (flowAssignee.getAssignValue ());
+                    candidateUserIds.add(userMap.get ("id").toString ());
+                    break;
+                case "custom":
+                    //根据你的自定义标记,请自行实现
+
+                    //如果字符串中包含 "currentUserSql:" 则进行如下代码替换和处理
+                    if(flowAssignee.getAssignValue ().contains("currentUserSql:")){
+                        //对应sql为:select su.* from sys_user_role a left join sys_role sr on sr.id = a.role_id left join sys_user su on su.id = a.user_id left join sys_office so on so.id = su.office_id where sr.en_name= 'bmzr' and so.id = (select office_id from sys_user where id = @currentUser.id)
+                        //用于查询当前登录人的部门主任人员信息
+                        UserDTO currentUserDTO = UserUtils.getCurrentUserDTO();
+                        String sql = flowAssignee.getAssignValue ();
+                        if(sql.contains("@currentUser.id")){
+                            //将标志进行去除
+                            sql = sql.replaceAll("currentUserSql:","");
+                            //将判断条件进行替换
+                            sql = sql.replaceAll("@currentUser.id","'" + currentUserDTO.getId() + "'");
+                        }
+                        List<Map<String, Object>> maps = SpringUtil.getBean(JdbcTemplate.class).queryForList(sql);
+                        for (Map<String, Object> map : maps) {
+                            candidateUserIds.add(map.get ("id").toString ());
+                        }
+                    }
+                    //如果字符串中包含 "cwCurrentUserSql:" 则进行如下代码替换和处理
+                    if(flowAssignee.getAssignValue ().contains("cwCurrentUserSql:")){
+                        //对应sql为:select su.* from sys_user_role a left join sys_role sr on sr.id = a.role_id left join sys_user su on su.id = a.user_id left join sys_office so on so.id = su.office_id where sr.en_name= 'bmzr' and so.id = (select office_id from sys_user where id = @currentUser.id)
+                        //用于查询当前登录人的部门主任人员信息
+                        UserDTO currentUserDTO = UserUtils.getCurrentUserDTO();
+                        String sql = flowAssignee.getAssignValue ();
+                        if(sql.contains("@currentUser.id")){
+                            //将标志进行去除
+                            sql = sql.replaceAll("cwCurrentUserSql:","");
+                            //将判断条件进行替换
+                            sql = sql.replaceAll("@currentUser.id","'" + currentUserDTO.getId() + "'");
+                        }
+                        if(sql.contains("@currentUser.officeDTO.name")){
+                            //将标志进行去除
+                            sql = sql.replaceAll("cwCurrentUserSql:","");
+                            //将判断条件进行替换
+                            sql = sql.replaceAll("@currentUser.officeDTO.name","'" + currentUserDTO.getOfficeDTO().getName() + "'");
+                        }
+                        List<Map<String, Object>> maps = SpringUtil.getBean(JdbcTemplate.class).queryForList(sql);
+                        for (Map<String, Object> map : maps) {
+                            candidateUserIds.add(map.get ("id").toString ());
+                        }
+                    }
+                    if(flowAssignee.getAssignValue ().contains("zsbxCurrentUserSql:")){
+                        //对应sql为:select su.* from sys_user_role a left join sys_role sr on sr.id = a.role_id left join sys_user su on su.id = a.user_id left join sys_office so on so.id = su.office_id where sr.en_name= 'bmzr' and so.id = (select office_id from sys_user where id = @currentUser.id)
+                        //用于查询当前登录人的部门主任人员信息
+                        UserDTO currentUserDTO = UserUtils.getCurrentUserDTO();
+                        String sql = flowAssignee.getAssignValue ();
+                        if(sql.contains("@currentUser.id")){
+                            //将标志进行去除
+                            sql = sql.replaceAll("zsbxCurrentUserSql:","");
+                            //将判断条件进行替换
+                            sql = sql.replaceAll("@currentUser.id","'" + currentUserDTO.getId() + "'");
+                        }
+                        if(sql.contains("@currentUser.officeDTO.name")){
+                            //将标志进行去除
+                            sql = sql.replaceAll("zsbxCurrentUserSql:","");
+                            //将判断条件进行替换
+                            sql = sql.replaceAll("@currentUser.officeDTO.name","'" + currentUserDTO.getOfficeDTO().getName() + "'");
+                        }
+                        List<Map<String, Object>> maps = SpringUtil.getBean(JdbcTemplate.class).queryForList(sql);
+                        for (Map<String, Object> map : maps) {
+                            candidateUserIds.add(map.get ("id").toString ());
+                        }
+                    }
+                    //如果字符串中包含 "gsldbxCurrentUserSql:" 则进行如下代码替换和处理
+                    if(flowAssignee.getAssignValue ().contains("gsldbxCurrentUserSql:")){
+                        String sql = flowAssignee.getAssignValue ();
+                        if(StringUtils.isNotBlank(startUserId)){
+                            //通过查询流程发起人确认发起人所在部门以及部门分管领导信息
+                            if(sql.contains("@currentUser.id")){
+                                //将标志进行去除
+                                sql = sql.replaceAll("gsldbxCurrentUserSql:","");
+                                //将判断条件进行替换
+                                sql = sql.replaceAll("@currentUser.id","'" + startUserId + "'");
+                            }
+                        } else {
+                            //如果找不到发起人信息 则审核人默认为 角色 总经办人员信息
+                            sql = "SELECT su.* FROM sys_user_role a LEFT JOIN sys_role sr ON sr.id = a.role_id LEFT JOIN sys_user su ON su.id = a.user_id LEFT JOIN sys_office so ON so.id = su.office_id WHERE sr.en_name = 'zjb'";
+                        }
+                        //设定部门分管领导为审核人
+                        List<Map<String, Object>> maps = SpringUtil.getBean(JdbcTemplate.class).queryForList(sql);
+                        if(null == maps || maps.size()==0){
+                            sql = "SELECT su.* FROM sys_user_role a LEFT JOIN sys_role sr ON sr.id = a.role_id LEFT JOIN sys_user su ON su.id = a.user_id LEFT JOIN sys_office so ON so.id = su.office_id WHERE sr.en_name = 'zjb'";
+                            maps = SpringUtil.getBean(JdbcTemplate.class).queryForList(sql);
+                        }
+                        for (Map<String, Object> map : maps) {
+                            candidateUserIds.add(map.get ("id").toString ());
+                        }
+                    }
+                    break;
+            }
+        }
+        List<String> candidateIds = new ArrayList<> (candidateUserIds);
+        return candidateIds;
+    }
 }

+ 15 - 0
jeeplus-plugins/jeeplus-flowable/src/main/java/com/jeeplus/flowable/vo/AssigneeDto.java

@@ -0,0 +1,15 @@
+package com.jeeplus.flowable.vo;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+public class AssigneeDto {
+
+    private String type;
+
+    private String assignValue;
+}

+ 23 - 0
jeeplus-plugins/jeeplus-notify/src/main/java/com/jeeplus/notify/controller/NotifyController.java

@@ -3,6 +3,8 @@
  */
 package com.jeeplus.notify.controller;
 
+import cn.hutool.core.util.ArrayUtil;
+import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
@@ -16,6 +18,8 @@ import com.jeeplus.notify.service.NotifyService;
 import com.jeeplus.notify.service.dto.NotifyDTO;
 import com.jeeplus.notify.service.dto.NotifyRecordDTO;
 import com.jeeplus.sys.constant.CommonConstants;
+import com.jeeplus.sys.service.UserService;
+import com.jeeplus.sys.utils.StringUtils;
 import com.jeeplus.sys.utils.UserUtils;
 import com.jeeplus.test.cw.workClientInfo.service.dto.CwWorkClientBaseDTO;
 import com.jeeplus.test.knowledge.domain.KnowledgeShareComment;
@@ -41,6 +45,9 @@ public class NotifyController {
     @Autowired
     private NotifyService notifyService;
 
+    @Autowired
+    private UserService userService;
+
     /**
      * 通告列表数据
      * 若对该方法进行调整则需要同步调整下边的 myNotifyData 方法
@@ -48,6 +55,14 @@ public class NotifyController {
     @GetMapping("list")
     public ResponseEntity data(NotifyDTO notifyDTO, boolean isSelf, Page <NotifyDTO> page) throws Exception {
         QueryWrapper <NotifyDTO> queryWrapper = QueryWrapperGenerator.buildQueryCondition ( notifyDTO, NotifyDTO.class );
+        if (ObjectUtil.isNotEmpty(notifyDTO)) {
+            if (StringUtils.isNotBlank(notifyDTO.getCreateName())) {
+                queryWrapper.like("u.name",notifyDTO.getCreateName());
+            }
+            if (ArrayUtil.isNotEmpty(notifyDTO.getCreateDates())) {
+                queryWrapper.between("a.create_date", notifyDTO.getCreateDates()[0], notifyDTO.getCreateDates()[1]);
+            }
+        }
         IPage <NotifyDTO> result = notifyService.findPage ( page, UserUtils.getCurrentUserDTO ( ).getId ( ), isSelf, null, queryWrapper );
         return ResponseEntity.ok ( result );
     }
@@ -58,6 +73,14 @@ public class NotifyController {
     @GetMapping("myNotifyList")
     public ResponseEntity myNotifyData(NotifyDTO notifyDTO, boolean isSelf, Page <NotifyDTO> page) throws Exception {
         QueryWrapper <NotifyDTO> queryWrapper = QueryWrapperGenerator.buildQueryCondition ( notifyDTO, NotifyDTO.class );
+        if (ObjectUtil.isNotEmpty(notifyDTO)) {
+            if (StringUtils.isNotBlank(notifyDTO.getCreateName())) {
+                queryWrapper.like("u.name",notifyDTO.getCreateName());
+            }
+            if (ArrayUtil.isNotEmpty(notifyDTO.getCreateDates())) {
+                queryWrapper.between("a.create_date", notifyDTO.getCreateDates()[0], notifyDTO.getCreateDates()[1]);
+            }
+        }
         IPage <NotifyDTO> result = notifyService.myNotifyDataFindPage ( page, UserUtils.getCurrentUserDTO ( ).getId ( ), isSelf, null, queryWrapper );
         return ResponseEntity.ok ( result );
     }

+ 10 - 0
jeeplus-plugins/jeeplus-notify/src/main/java/com/jeeplus/notify/service/dto/NotifyDTO.java

@@ -114,6 +114,16 @@ public class NotifyDTO extends BaseDTO {
     private String isClose;
 
     /**
+     * 筛选条件:发布者
+     */
+    private String createName;
+
+    /**
+     * 筛选条件:创建时间
+     */
+    private String[] createDates;
+
+    /**
      * 附件
      */
     private List<WorkAttachmentDto> workAttachmentDtoList;