sangwenwei před 1 rokem
rodič
revize
7fda4757e9
17 změnil soubory, kde provedl 718 přidání a 11 odebrání
  1. 5 0
      jeeplus-api/jeeplus-system-api/src/main/java/com/jeeplus/flowable/factory/FinanceApiFallbackFactory.java
  2. 7 0
      jeeplus-api/jeeplus-system-api/src/main/java/com/jeeplus/flowable/feign/IFinanceApi.java
  3. 83 0
      jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/projectRecords/controller/CwProjectRecordsController.java
  4. 15 0
      jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/projectRecords/domain/CwProjectPlan.java
  5. 53 0
      jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/projectRecords/domain/CwProjectPlanDetails.java
  6. 12 0
      jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/projectRecords/mapper/CwProjectPlanDetailsMapper.java
  7. 9 0
      jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/projectRecords/mapper/CwProjectPlanMapper.java
  8. 26 0
      jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/projectRecords/mapper/CwProjectRecordsMapper.java
  9. 101 0
      jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/projectRecords/mapper/xml/CwProjectRecordsMapper.xml
  10. 9 0
      jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/projectRecords/service/CwProjectPlanDetailsService.java
  11. 9 0
      jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/projectRecords/service/CwProjectPlanService.java
  12. 209 7
      jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/projectRecords/service/CwProjectRecordsService.java
  13. 13 0
      jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/projectRecords/service/dto/CwProjectRecordsDTO.java
  14. 19 0
      jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/projectRecords/service/dto/CwTreeUserDto.java
  15. 46 0
      jeeplus-modules/jeeplus-xxl-job-executor-sample/src/main/java/com/jeeplus/domain/CwProjectPlanDetails.java
  16. 9 0
      jeeplus-modules/jeeplus-xxl-job-executor-sample/src/main/java/com/xxl/job/executor/feign/PlanDetailFeignApi.java
  17. 93 4
      jeeplus-modules/jeeplus-xxl-job-executor-sample/src/main/java/com/xxl/job/executor/service/jobhandler/SampleXxlJob.java

+ 5 - 0
jeeplus-api/jeeplus-system-api/src/main/java/com/jeeplus/flowable/factory/FinanceApiFallbackFactory.java

@@ -42,6 +42,11 @@ public class FinanceApiFallbackFactory implements FallbackFactory<IFinanceApi> {
 
             }
 
+            @Override
+            public String getPlanDetails() {
+                return null;
+            }
+
         };
     }
 }

+ 7 - 0
jeeplus-api/jeeplus-system-api/src/main/java/com/jeeplus/flowable/feign/IFinanceApi.java

@@ -29,4 +29,11 @@ public interface IFinanceApi {
 
     @RequestMapping(value = "/cwProjectRecords/insertMembers", method = RequestMethod.POST)
     void insertMembers(@RequestParam(value = "projectId")String projectId,@RequestParam(value = "membersId")String membersId,@RequestParam(value = "userId")String userId);
+
+    /**
+     * 查询项目计划信息
+     * @return
+     */
+    @GetMapping(value = "/cwProjectRecords/getPlanDetails")
+    String getPlanDetails();
 }

+ 83 - 0
jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/projectRecords/controller/CwProjectRecordsController.java

@@ -2,14 +2,19 @@ package com.jeeplus.finance.projectRecords.controller;
 
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.extra.spring.SpringUtil;
+import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.jeeplus.common.excel.ExcelOptions;
 import com.jeeplus.common.excel.annotation.ExportMode;
 import com.jeeplus.common.utils.ResponseUtil;
 import com.jeeplus.finance.invoice.util.EasyPoiUtil;
+import com.jeeplus.finance.projectRecords.domain.CwProjectPlan;
+import com.jeeplus.finance.projectRecords.domain.CwProjectPlanDetails;
+import com.jeeplus.finance.projectRecords.domain.CwProjectRecords;
 import com.jeeplus.finance.projectRecords.service.CwProjectRecordsService;
 import com.jeeplus.finance.projectRecords.service.dto.CwProjectRecordsDTO;
+import com.jeeplus.finance.projectRecords.service.dto.CwTreeUserDto;
 import com.jeeplus.logging.annotation.ApiLog;
 import com.jeeplus.logging.constant.enums.LogTypeEnum;
 //import com.jeeplus.sys.utils.DictUtils;
@@ -265,6 +270,84 @@ public class CwProjectRecordsController {
         return ResponseEntity.ok(reportList);
     }
 
+    /**
+     * 查询财务项目计划详情
+     * @param id
+     * @return
+     */
+    @ApiLog("查询财务项目计划详情")
+//    @PreAuthorize ("hasAnyAuthority('cwProjectRecords:view','cwProjectRecords:add','cwProjectRecords:edit')")
+    @GetMapping("queryPlanById")
+    public ResponseEntity queryPlanById(@RequestParam("id") String id) {
+        CwProjectRecordsDTO cwProjectRecordsDTO = cwProjectRecordsService.queryPlanById ( id );
+        return ResponseEntity.ok (cwProjectRecordsDTO);
+    }
+
+    /**
+     * 导出项目计划数据
+     *
+     * @param cwProjectRecordsDTO
+     * @param page
+     * @param response
+     * @throws Exception
+     */
+    @ApiLog(value = "导出项目计划数据", type = LogTypeEnum.EXPORT)
+    @GetMapping("exportPlan")
+//    @PreAuthorize ("hasAuthority('cwProjectRecords:export')")
+    @ApiOperation(value = "导出项目计划数据")
+    public void exportPlan(CwProjectRecordsDTO cwProjectRecordsDTO,  ExcelOptions options, HttpServletResponse response) throws Exception {
+        CwProjectRecords records = cwProjectRecordsService.getById(cwProjectRecordsDTO.getId());
+        String fileName = records.getProjectName()+"-项目计划.xlsx";
+        String sheetName = records.getProjectName()+"-项目计划.xlsx";
+        List<CwProjectPlanDetails> result = new ArrayList<>();
+        if (ExportMode.selected.equals ( options.getMode() )) {
+            result = cwProjectRecordsService.findPlanList(cwProjectRecordsDTO.getId());
+        }
+
+        EasyPoiUtil.exportExcel ( result, sheetName,  sheetName, CwProjectPlanDetails.class, fileName, response );
+
+    }
+
+    @ApiOperation(value = "用户树形")
+    @GetMapping(value = "/userTree")
+    public ResponseEntity<List<CwTreeUserDto>> userTree(@RequestParam String name,@RequestParam String id) {
+        List<CwTreeUserDto> list = cwProjectRecordsService.userTree(name,id);
+        return ResponseEntity.ok(list);
+    }
+
+    /**
+     * 保存财务项目计划信息
+     * @param cwProjectRecordsDTO
+     * @return
+     */
+    @ApiLog(value = "修改/新增财务项目计划信息", type = LogTypeEnum.SAVE)
+//    @PreAuthorize("hasAnyAuthority('cwProjectRecords:add','cwProjectRecords:edit')")
+    @PostMapping("savePlanForm")
+    public ResponseEntity savePlanForm(@Valid @RequestBody CwProjectRecordsDTO cwProjectRecordsDTO) throws Exception {
+        cwProjectRecordsService.savePlanForm(cwProjectRecordsDTO);
+        return ResponseEntity.ok ("操作成功");
+    }
+
+    /**
+     * 获取项目计划中的任务阶段
+     */
+    @ApiOperation(value = "获取项目计划中的任务阶段")
+    @GetMapping(value = "/getTaskPhase")
+    public List<String> getTaskPhase(){
+        List<String> data = cwProjectRecordsService.getTaskPhase();
+        return data;
+    }
+
+    /**
+     * 获取项目计划详情
+     */
+    @ApiOperation(value = "获取项目计划详情")
+    @GetMapping(value = "/getPlanDetails")
+    public String getPlanDetails(){
+       List<CwProjectPlanDetails> list= cwProjectRecordsService.getPlanDetails();
+       return JSON.toJSONString(list);
+    }
+
 
 
 

+ 15 - 0
jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/projectRecords/domain/CwProjectPlan.java

@@ -0,0 +1,15 @@
+package com.jeeplus.finance.projectRecords.domain;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.jeeplus.core.domain.BaseEntity;
+import lombok.Data;
+
+@Data
+@TableName("cw_project_plan")
+public class CwProjectPlan extends BaseEntity {
+
+    //项目id
+    private String projectId;
+    
+
+}

+ 53 - 0
jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/projectRecords/domain/CwProjectPlanDetails.java

@@ -0,0 +1,53 @@
+package com.jeeplus.finance.projectRecords.domain;
+
+import cn.afterturn.easypoi.excel.annotation.Excel;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.jeeplus.core.domain.BaseEntity;
+import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.util.Date;
+
+@Data
+@TableName("cw_project_plan_details")
+public class CwProjectPlanDetails extends BaseEntity {
+
+    //任务阶段
+    @Excel(name = "任务阶段",width = 25,orderNum = "0")
+    private String taskPhase;
+
+    //计划开始时间
+    @Excel(name = "计划开始时间",width = 25,orderNum = "1")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date planStartDate;
+
+    //计划结束时间
+    @Excel(name = "计划结束时间",width = 25,orderNum = "2")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date planEndDate;
+
+    //提醒人
+    private String warnUser;
+
+    //完成人
+    private String achiever;
+
+    //计划表id
+    private String planId;
+
+    @TableField(exist = false)
+    @Excel(name = "提醒人",width = 25,orderNum = "3")
+    private String warnName;
+
+    @TableField(exist = false)
+    @Excel(name = "完成人",width = 25,orderNum = "4")
+    private String achieverName;
+    @TableField(exist = false)
+    private String projectId;
+    @TableField(exist = false)
+    private String projectName;
+}

+ 12 - 0
jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/projectRecords/mapper/CwProjectPlanDetailsMapper.java

@@ -0,0 +1,12 @@
+package com.jeeplus.finance.projectRecords.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.jeeplus.finance.projectRecords.domain.CwProjectPlanDetails;
+import org.apache.ibatis.annotations.Mapper;
+
+import java.util.List;
+
+@Mapper
+public interface CwProjectPlanDetailsMapper extends BaseMapper<CwProjectPlanDetails> {
+
+}

+ 9 - 0
jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/projectRecords/mapper/CwProjectPlanMapper.java

@@ -0,0 +1,9 @@
+package com.jeeplus.finance.projectRecords.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.jeeplus.finance.projectRecords.domain.CwProjectPlan;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface CwProjectPlanMapper extends BaseMapper<CwProjectPlan> {
+}

+ 26 - 0
jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/projectRecords/mapper/CwProjectRecordsMapper.java

@@ -6,9 +6,12 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.Constants;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.jeeplus.finance.projectRecords.domain.CwProjectPlanDetails;
 import com.jeeplus.finance.projectRecords.domain.CwProjectRecords;
 import com.jeeplus.finance.projectRecords.service.dto.CwProjectClientInfoDTO;
 import com.jeeplus.finance.projectRecords.service.dto.CwProjectRecordsDTO;
+import com.jeeplus.finance.projectRecords.service.dto.CwTreeUserDto;
+import com.jeeplus.sys.domain.WorkAttachmentInfo;
 import com.jeeplus.sys.service.dto.UserDTO;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
@@ -90,4 +93,27 @@ public interface CwProjectRecordsMapper extends BaseMapper<CwProjectRecords> {
 
     List<String> findAllList(@Param("id") String id);
 
+    CwProjectRecordsDTO queryPlanById(@Param("id")String id);
+
+    List<CwProjectPlanDetails> findPlanList(@Param("id") String id);
+
+    List<CwTreeUserDto> findOfficeList();
+
+    List<CwTreeUserDto> findUserList(@Param("name") String name, @Param("s") String s);
+
+    /**
+     * 查询项目组成员id
+     * @param id
+     * @return
+     */
+    List<String> getMemberId(@Param("id") String id);
+
+    List<CwProjectPlanDetails> getListByPlanId(@Param("planId") String planId);
+
+    List<WorkAttachmentInfo> getFileList(@Param("id") String id);
+
+    //获取任务阶段
+    List<String> getTaskPhase();
+    @InterceptorIgnore(tenantLine = "true")
+    List<CwProjectPlanDetails> getPlanDetails();
 }

+ 101 - 0
jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/projectRecords/mapper/xml/CwProjectRecordsMapper.xml

@@ -286,6 +286,7 @@
         cw_wci.payment_method,
         cw_wcb.name as client_contacts_name,
         cw_pbt.name as business_type_name,
+        cw_pp.id as planId,
         b.member_count,
         prnl.report_no
         from cw_project_records a
@@ -305,6 +306,7 @@
         left join sys_user_manage_office sumo on sumo.office_id = sub.office_id
         LEFT JOIN cw_project_report pr on pr.project_id=a.id and pr.del_flag = '0'
         LEFT JOIN cw_project_report_new_line prnl on pr.id=prnl.report_id and prnl.del_flag = '0'
+        left join cw_project_plan cw_pp on cw_pp.project_id = a.id and cw_pp.del_flag = '0'
         ${ew.customSqlSegment}
         ORDER BY a.create_time DESC
     </select>
@@ -540,5 +542,104 @@
         select id from cw_project_records where create_by_id = #{id} and del_flag=0
     </select>
 
+    <select id="queryPlanById" resultType="com.jeeplus.finance.projectRecords.service.dto.CwProjectRecordsDTO">
+        select
+            a.id,
+            a.create_by_id,
+            a.create_time,
+            a.project_number,
+            a.plan_start_date,
+            a.plan_end_date,
+            a.project_name,
+            su.name as createName,
+            cw_pp.id as planId
+        from cw_project_records a
+        left join sys_user su on su.id = a.create_by_id and su.del_flag = '0'
+        left join cw_project_plan cw_pp on cw_pp.project_id = a.id and cw_pp.del_flag = '0'
+        where a.id = #{id}
+    </select>
+
+    <select id="findPlanList" resultType="com.jeeplus.finance.projectRecords.domain.CwProjectPlanDetails">
+        select
+            a.task_phase,
+            a.plan_start_date,
+            a.plan_end_date,
+            a.warn_user,
+            a.achiever,
+            su.name as warnName,
+            su1.name as achieverName
+        from cw_project_records pr
+        left join cw_project_plan cw_pp on cw_pp.project_id = pr.id
+        left join cw_project_plan_details a on cw_pp.id = a.plan_id
+        left join sys_user su on su.id = a.warn_user
+        left join sys_user su1 on su1.id = a.achiever
+        where pr.id = #{id}
+    </select>
+
+    <select id="findOfficeList"
+            resultType="com.jeeplus.finance.projectRecords.service.dto.CwTreeUserDto">
+		SELECT so.id,so.`name`,so.parent_id FROM sys_office so left join sys_user su WHERE so.del_flag = 0
+	</select>
+    <select id="findUserList"
+            resultType="com.jeeplus.finance.projectRecords.service.dto.CwTreeUserDto">
+        SELECT
+        a.id,
+        a.`name`,
+        a.office_id AS parent_id,
+        b.`name` AS office_name,
+        true AS is_user
+        FROM
+        sys_user a
+        LEFT JOIN sys_office b ON a.office_id = b.id
+        WHERE
+        a.del_flag = 0 and a.id = #{s}
+        <if test="name != null and name != ''">
+            and a.`name` LIKE CONCAT ('%', #{name}, '%')
+        </if>
+    </select>
+
+    <select id="getMemberId" resultType="java.lang.String">
+        SELECT  user_id FROM cw_project_members
+        <where>
+            del_flag=0
+            and project_id = #{id}
+        </where>
+    </select>
+
+    <select id="getListByPlanId" resultType="com.jeeplus.finance.projectRecords.domain.CwProjectPlanDetails">
+        select
+            a.task_phase,
+            a.plan_start_date,
+            a.plan_end_date,
+            a.warn_user,
+            a.achiever,
+            su.name as warnName,
+            su1.name as achieverName
+        from cw_project_plan_details a
+        left join sys_user su on su.id = a.warn_user
+        left join sys_user su1 on su1.id = a.achiever
+        where a.plan_id = #{planId} and a.del_flag = '0'
+
+    </select>
+
+    <select id="getTaskPhase" resultType="string">
+        select task_phase from cw_project_plan_details
+    </select>
+
+    <select id="getPlanDetails" resultType="com.jeeplus.finance.projectRecords.domain.CwProjectPlanDetails">
+        select
+            a.id,
+            a.task_phase,
+            a.plan_start_date,
+            a.plan_end_date,
+            a.warn_user,
+            a.achiever,
+            pr.id as projectId,
+            pr.project_name
+        from cw_project_records pr
+        left join cw_project_plan cw_pp on cw_pp.project_id = pr.id
+        left join cw_project_plan_details a on cw_pp.id = a.plan_id
+        where a.del_flag = '0'
+    </select>
 
 </mapper>

+ 9 - 0
jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/projectRecords/service/CwProjectPlanDetailsService.java

@@ -0,0 +1,9 @@
+package com.jeeplus.finance.projectRecords.service;
+
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+@Service
+@Transactional
+public class CwProjectPlanDetailsService {
+}

+ 9 - 0
jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/projectRecords/service/CwProjectPlanService.java

@@ -0,0 +1,9 @@
+package com.jeeplus.finance.projectRecords.service;
+
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+@Service
+@Transactional
+public class CwProjectPlanService {
+}

+ 209 - 7
jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/projectRecords/service/CwProjectRecordsService.java

@@ -19,15 +19,12 @@ import com.jeeplus.common.redis.RedisUtils;
 import com.jeeplus.core.query.QueryWrapperGenerator;
 import com.jeeplus.finance.contractRegistration.domain.ContractInfo;
 import com.jeeplus.finance.contractRegistration.mapper.ContractInfoMapper;
-import com.jeeplus.finance.projectRecords.domain.CwProjectClientContact;
-import com.jeeplus.finance.projectRecords.domain.CwProjectMembers;
-import com.jeeplus.finance.projectRecords.domain.CwProjectRecords;
+import com.jeeplus.finance.projectRecords.domain.*;
 import com.jeeplus.finance.projectRecords.mapper.CwProjectClientContactMapper;
+import com.jeeplus.finance.projectRecords.mapper.CwProjectPlanDetailsMapper;
+import com.jeeplus.finance.projectRecords.mapper.CwProjectPlanMapper;
 import com.jeeplus.finance.projectRecords.mapper.CwProjectRecordsMapper;
-import com.jeeplus.finance.projectRecords.service.dto.CwProjectClientContactDTO;
-import com.jeeplus.finance.projectRecords.service.dto.CwProjectClientInfoDTO;
-import com.jeeplus.finance.projectRecords.service.dto.CwProjectMembersDTO;
-import com.jeeplus.finance.projectRecords.service.dto.CwProjectRecordsDTO;
+import com.jeeplus.finance.projectRecords.service.dto.*;
 import com.jeeplus.finance.projectRecords.service.mapstruct.CwProjectClientContactWrapper;
 import com.jeeplus.finance.projectRecords.service.mapstruct.CwProjectMembersWrapper;
 import com.jeeplus.finance.projectRecords.service.mapstruct.CwProjectRecordsWrapper;
@@ -35,6 +32,7 @@ import com.jeeplus.finance.workClientInfo.domain.CwWorkClientContact;
 import com.jeeplus.finance.workClientInfo.service.CwWorkClientContactService;
 import com.jeeplus.finance.workClientInfo.service.dto.CwWorkClientBaseDTO;
 import com.jeeplus.sys.domain.User;
+import com.jeeplus.sys.domain.WorkAttachmentInfo;
 import com.jeeplus.sys.feign.IUserApi;
 import com.jeeplus.sys.feign.IWorkAttachmentApi;
 import com.jeeplus.sys.service.dto.UserDTO;
@@ -78,6 +76,11 @@ public class CwProjectRecordsService extends ServiceImpl<CwProjectRecordsMapper,
     private CwWorkClientContactService cwWorkClientContactService;
     @Resource
     private CwProjectMembersService cwProjectMembersService;
+    @Resource
+    private CwProjectPlanMapper cwProjectPlanMapper;
+    @Resource
+    private CwProjectPlanDetailsMapper cwProjectPlanDetailsMapper;
+
 
 
     /**
@@ -171,6 +174,14 @@ public class CwProjectRecordsService extends ServiceImpl<CwProjectRecordsMapper,
                     }
                 }
             }
+            //根据项目id查询项目计划表中的数据
+            CwProjectPlan cwProjectPlan = cwProjectPlanMapper.selectOne(new QueryWrapper<CwProjectPlan>().eq("project_id", li.getId()).eq("del_flag", 0));
+            if (ObjectUtil.isEmpty(cwProjectPlan)){
+                li.setIsHavePlan("0");
+            }else {
+                li.setIsHavePlan("1");
+            }
+
 
         });
         return list;
@@ -698,4 +709,195 @@ public class CwProjectRecordsService extends ServiceImpl<CwProjectRecordsMapper,
     public List<String> findAllList(String id) {
         return cwProjectRecordsMapper.findAllList(id);
     }
+
+    /**
+     * 查询项目计划详情
+     * @param id
+     * @return
+     */
+    public CwProjectRecordsDTO queryPlanById(String id) {
+        CwProjectRecordsDTO cwProjectRecordsDTO = cwProjectRecordsMapper.queryPlanById(id);
+        //根据项目表中的计划id查询计划详情信息
+        if (StringUtils.isNotBlank(cwProjectRecordsDTO.getPlanId())){
+            List<CwProjectPlanDetails> planDetailsList = cwProjectRecordsMapper.getListByPlanId(cwProjectRecordsDTO.getPlanId());
+            cwProjectRecordsDTO.setPlanDetailsList(planDetailsList);
+            //查询附件信息
+            List<WorkAttachmentInfo> list=cwProjectRecordsMapper.getFileList(cwProjectRecordsDTO.getPlanId());
+            cwProjectRecordsDTO.setPlanFileList(list);
+        }
+
+        return cwProjectRecordsDTO;
+    }
+
+    /**
+     * 导出项目计划详情
+     * @param id
+     * @return
+     */
+    public List<CwProjectPlanDetails> findPlanList(String id) {
+        List<CwProjectPlanDetails> cwProjectPlanDetails=cwProjectRecordsMapper.findPlanList(id);
+        return cwProjectPlanDetails;
+    }
+
+    /**
+     * 项目组成员树形
+     * @param name
+     * @return
+     */
+    public List<CwTreeUserDto> userTree(String name,String id) {
+        List<CwTreeUserDto> userList = new ArrayList<>();
+        //根据项目id查询项目组成员
+        List<String> membersId = cwProjectRecordsMapper.getMemberId(id);
+        if (CollectionUtil.isNotEmpty(membersId)){
+            for (String s : membersId) {
+                // 查询用户
+                List<CwTreeUserDto> treeUserDtoList = cwProjectRecordsMapper.findUserList(name,s);
+                if (CollectionUtils.isNotEmpty(treeUserDtoList)) {
+                    userList.addAll(treeUserDtoList);
+                }
+            }
+        }
+        // 查询部门
+        List<CwTreeUserDto> officeList = cwProjectRecordsMapper.findOfficeList();
+        List<CwTreeUserDto> list = new ArrayList<>();
+        list =disposeUserTree(userList, officeList);
+        //去重
+        List<CwTreeUserDto> newList = list.stream().collect(Collectors.collectingAndThen(
+                Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(CwTreeUserDto::getId))), ArrayList::new)
+        );
+        return newList;
+    }
+
+    /**
+     * 用户树形数据处理
+     * @param userList
+     * @param officeList
+     * @return
+     */
+    public List<CwTreeUserDto> disposeUserTree(List<CwTreeUserDto> userList, List<CwTreeUserDto> officeList){
+        List<CwTreeUserDto> list = new ArrayList<>();
+        for (CwTreeUserDto userDto : userList) {
+
+            for (CwTreeUserDto officeDto : officeList) {
+                if(StringUtils.isNotBlank(userDto.getParentId()) && userDto.getParentId().equals(officeDto.getId())){
+                    list.add(officeDto);
+                    list.add(userDto);
+                    List<CwTreeUserDto> treeUserDtos = disposeOfficeTree(officeDto, officeList);
+                    if(null!= treeUserDtos && treeUserDtos.size()>0){
+                        list.addAll(treeUserDtos);
+                    }
+                }
+            }
+        }
+        return list;
+    }
+
+    /**
+     * 用户树形数据处理
+     * @param officeInfo
+     * @param officeList
+     * @return
+     */
+    public List<CwTreeUserDto> disposeOfficeTree(CwTreeUserDto officeInfo, List<CwTreeUserDto> officeList){
+        List<CwTreeUserDto> listAll = Lists.newArrayList();
+        for (CwTreeUserDto officeDto : officeList) {
+            if(officeInfo.getParentId().equals(officeDto.getId())){
+                listAll.add(officeDto);
+                disposeOfficeTree(officeDto,officeList);
+            }
+        }
+        return listAll;
+    }
+
+    /**
+     * 保存项目计划信息
+     * @param cwProjectRecordsDTO
+     * @return
+     * @throws Exception
+     */
+
+    public ResponseEntity savePlanForm(CwProjectRecordsDTO cwProjectRecordsDTO) throws Exception{
+        CwProjectRecordsDTO projectRecordsDTO = cwProjectRecordsMapper.queryPlanById(cwProjectRecordsDTO.getId());
+        String planId = UUID.randomUUID().toString().replace("-", "");
+        //如果计划id不为空,则将详情表中原来的数据进行逻辑删除,然后新增新的计划信息
+        if (StringUtils.isNotBlank(projectRecordsDTO.getPlanId())){
+            //将原来的数据进行删除
+            List<CwProjectPlanDetails> cwProjectPlanDetails = cwProjectPlanDetailsMapper.selectList(new QueryWrapper<CwProjectPlanDetails>().eq("plan_id", projectRecordsDTO.getPlanId()));
+            for (CwProjectPlanDetails cwProjectPlanDetail : cwProjectPlanDetails) {
+                cwProjectPlanDetailsMapper.deleteById(cwProjectPlanDetail.getId());
+            }
+            //将新的计划信息添加到表中
+            for (CwProjectPlanDetails projectPlanDetails : cwProjectRecordsDTO.getPlanDetailsList()) {
+                CwProjectPlanDetails details = new CwProjectPlanDetails();
+                details.setAchiever(projectPlanDetails.getAchiever());
+                details.setTaskPhase(projectPlanDetails.getTaskPhase());
+                details.setPlanStartDate(projectPlanDetails.getPlanStartDate());
+                details.setPlanEndDate(projectPlanDetails.getPlanEndDate());
+                details.setWarnUser(projectPlanDetails.getWarnUser());
+                details.setPlanId(projectRecordsDTO.getPlanId());
+                cwProjectPlanDetailsMapper.insert(details);
+            }
+            planId=projectRecordsDTO.getPlanId();
+        }else {
+            //在计划表中新增一条数据
+            CwProjectPlan cwProjectPlan = new CwProjectPlan();
+            cwProjectPlan.setProjectId(cwProjectRecordsDTO.getId());
+            cwProjectPlan.setId(planId);
+            cwProjectPlanMapper.insert(cwProjectPlan);
+            //往计划明细表中添加数据
+            for (CwProjectPlanDetails projectPlanDetails : cwProjectRecordsDTO.getPlanDetailsList()) {
+                CwProjectPlanDetails details = new CwProjectPlanDetails();
+                details.setAchiever(projectPlanDetails.getAchiever());
+                details.setTaskPhase(projectPlanDetails.getTaskPhase());
+                details.setPlanStartDate(projectPlanDetails.getPlanStartDate());
+                details.setPlanEndDate(projectPlanDetails.getPlanEndDate());
+                details.setWarnUser(projectPlanDetails.getWarnUser());
+                details.setPlanId(planId);
+                cwProjectPlanDetailsMapper.insert(details);
+            }
+        }
+        //修改项目表中的计划开始时间和结束时间
+        CwProjectRecords cwProjectRecords = new CwProjectRecords();
+        cwProjectRecords.setId(cwProjectRecordsDTO.getId());
+        cwProjectRecords.setPlanStartDate(cwProjectRecordsDTO.getPlanStartDate());
+        cwProjectRecords.setPlanEndDate(cwProjectRecordsDTO.getPlanEndDate());
+        cwProjectRecordsMapper.updateById(cwProjectRecords);
+        //保存附件
+        if (CollectionUtil.isNotEmpty(cwProjectRecordsDTO.getPlanFileList())){
+            Map<String,String> map = new HashMap<>();
+            String fileList = JSON.toJSONString((cwProjectRecordsDTO.getPlanFileList()));
+            String attachmentId = planId;
+            String attachmentFlag = "cw_project_plan";
+            map.put("fileList",fileList);
+            map.put("attachmentId",attachmentId);
+            map.put("attachmentFlag",attachmentFlag);
+            map.put("currentToken", TokenProvider.getCurrentToken ( ));
+            SpringUtil.getBean ( IWorkAttachmentApi.class ).saveOrUpdateFileList(map);
+        }
+
+
+        return ResponseEntity.ok("保存成功");
+    }
+
+    /**
+     * 获取所有的任务阶段
+     * @return
+     */
+    public List<String> getTaskPhase() {
+        List<String> data = cwProjectRecordsMapper.getTaskPhase();
+        //去重
+        List<String> uniqueData = new ArrayList<>(new LinkedHashSet<>(data));
+        // 对去重后的数据进行排序
+        List<String> sortedUniqueData = uniqueData.stream().sorted().collect(Collectors.toList());
+        return sortedUniqueData;
+    }
+
+    /**
+     * 获取项目计划详情
+     * @return
+     */
+    public List<CwProjectPlanDetails> getPlanDetails() {
+        List<CwProjectPlanDetails> list=cwProjectRecordsMapper.getPlanDetails();
+        return list;
+    }
 }

+ 13 - 0
jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/projectRecords/service/dto/CwProjectRecordsDTO.java

@@ -6,6 +6,7 @@ import com.fasterxml.jackson.annotation.JsonFormat;
 import com.jeeplus.core.query.Query;
 import com.jeeplus.core.query.QueryType;
 import com.jeeplus.core.service.dto.BaseDTO;
+import com.jeeplus.finance.projectRecords.domain.CwProjectPlanDetails;
 import com.jeeplus.finance.workClientInfo.service.dto.CwWorkClientBaseDTO;
 import com.jeeplus.sys.domain.WorkAttachmentInfo;
 import com.jeeplus.sys.service.dto.OfficeDTO;
@@ -256,6 +257,18 @@ public class CwProjectRecordsDTO extends BaseDTO {
     private String loginName;
     private String reportId;
 
+    //是否存在项目计划
+    private String isHavePlan;
+
+    //计划表id
+    private String planId;
+    //计划详情
+    private List<CwProjectPlanDetails> planDetailsList;
+    /**
+     * 计划附件
+     */
+    private List<WorkAttachmentInfo> planFileList;
+
 
 
 }

+ 19 - 0
jeeplus-modules/jeeplus-finance/src/main/java/com/jeeplus/finance/projectRecords/service/dto/CwTreeUserDto.java

@@ -0,0 +1,19 @@
+package com.jeeplus.finance.projectRecords.service.dto;
+
+import com.jeeplus.core.domain.BaseEntity;
+import lombok.Data;
+
+@Data
+public class CwTreeUserDto extends BaseEntity {
+
+    private String name;
+
+    private String parentId;
+
+    private String officeName;
+
+    private Boolean disable = false;
+
+    private Boolean isUser = false;
+
+}

+ 46 - 0
jeeplus-modules/jeeplus-xxl-job-executor-sample/src/main/java/com/jeeplus/domain/CwProjectPlanDetails.java

@@ -0,0 +1,46 @@
+package com.jeeplus.domain;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.jeeplus.core.domain.BaseEntity;
+import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.util.Date;
+
+@Data
+public class CwProjectPlanDetails extends BaseEntity {
+
+    //任务阶段
+    private String taskPhase;
+
+    //计划开始时间
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date planStartDate;
+
+    //计划结束时间
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date planEndDate;
+
+    //提醒人
+    private String warnUser;
+
+    //完成人
+    private String achiever;
+
+    //计划表id
+    private String planId;
+
+    @TableField(exist = false)
+    private String warnName;
+
+    @TableField(exist = false)
+    private String achieverName;
+
+    private String projectId;
+
+    private String projectName;
+}

+ 9 - 0
jeeplus-modules/jeeplus-xxl-job-executor-sample/src/main/java/com/xxl/job/executor/feign/PlanDetailFeignApi.java

@@ -0,0 +1,9 @@
+package com.xxl.job.executor.feign;
+
+import com.jeeplus.common.constant.AppNameConstants;
+import com.jeeplus.flowable.feign.IFinanceApi;
+import org.springframework.cloud.openfeign.FeignClient;
+
+@FeignClient(contextId = "PlanDetailFeignApi", name = AppNameConstants.APP_FINANCE_MODULES)
+public interface PlanDetailFeignApi extends IFinanceApi {
+}

+ 93 - 4
jeeplus-modules/jeeplus-xxl-job-executor-sample/src/main/java/com/xxl/job/executor/service/jobhandler/SampleXxlJob.java

@@ -15,10 +15,7 @@ import com.jeeplus.sys.service.dto.RoleDTO;
 import com.jeeplus.sys.service.dto.UserDTO;
 import com.xxl.job.core.context.XxlJobHelper;
 import com.xxl.job.core.handler.annotation.XxlJob;
-import com.xxl.job.executor.feign.AssessFeignApi;
-import com.xxl.job.executor.feign.FinanceFeignApi;
-import com.xxl.job.executor.feign.HumanFeignApi;
-import com.xxl.job.executor.feign.UserFeignApi;
+import com.xxl.job.executor.feign.*;
 import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -66,6 +63,98 @@ public class SampleXxlJob {
     }
 
     /**
+     * 项目计划通知提醒
+     */
+    @XxlJob("projectPlan")
+    public void projectPlan() throws Exception {
+        //
+        String json = SpringUtil.getBean (PlanDetailFeignApi.class).getPlanDetails();
+        List<CwProjectPlanDetails> infos = JSON.parseObject(json, new TypeReference<List<CwProjectPlanDetails>>() {});
+
+        for (CwProjectPlanDetails info : infos) {
+            //对数据进行发送通知
+            String taskName = null;
+            String titleStr = null;
+
+            SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
+            String format = simpleDateFormat.format(new Date());
+            String begin = simpleDateFormat.format(info.getPlanStartDate());
+            String end = simpleDateFormat.format(info.getPlanEndDate());
+            //获取当前时间
+            if (begin.equals(format)){
+                taskName = "项目计划通知";
+                titleStr = "项目-"+info.getProjectName()+"任务阶段["+info.getTaskPhase()+"]已开始";
+            }
+            if (end.equals(format)){
+                taskName = "项目计划通知";
+                titleStr = "项目-"+info.getProjectName()+"任务阶段["+info.getTaskPhase()+"]已结束";
+            }
+            if (StringUtils.isNotBlank(titleStr)){
+                Set<String> noticeUserSet = new HashSet<String>();
+                if(StringUtils.isNotBlank(info.getWarnUser())){
+
+                    String s = SpringUtil.getBean(IUserApi.class).getByIdForXXL(info.getWarnUser());
+                    UserDTO createUser = JSON.parseObject(s, new TypeReference<UserDTO>() {});
+                    noticeUserSet.add(createUser.getId());
+                }
+                List<String> noticeUserList = new ArrayList<String>(noticeUserSet);
+                if(noticeUserList.size()>0){
+                    MyNoticeList myNotice = new MyNoticeList();
+                    myNotice.setCreateById("1");
+                    myNotice.setCreateTime(new Date());
+                    myNotice.setUpdateById("1");
+                    myNotice.setUpdateTime(new Date());
+                    myNotice.setDelFlag(0);
+                    //根据procInsId获取taskId
+//                String currentTask = SpringUtil.getBean(IFlowableApi.class).getTaskIdByprocInstId(info.getProcInsId());
+                    myNotice.setTaskId("");
+                    myNotice.setDefId(info.getProjectId());
+                    myNotice.setTitle(titleStr);
+                    myNotice.setTaskName(taskName);
+                    myNotice.setLink("结束");
+                    myNotice.setType("0");
+                    myNotice.setCreateUser("管理员");
+                    myNotice.setCreateTime(new Date());
+
+                    for (String noticeUserId : noticeUserList) {
+                        myNotice.setNoticeId(noticeUserId);
+                        String s = SpringUtil.getBean(IUserApi.class).getByIdForXXL(info.getWarnUser());
+                        UserDTO createUser = JSON.parseObject(s, new TypeReference<UserDTO>() {});
+                        myNotice.setNoticeName(createUser.getName());
+                        //根据taskName和通知人 查询重复数量
+                        String myNoticeInfo = JSON.toJSONString(myNotice);
+                        Map<String,String> map = new HashMap();
+                        map.put("myNoticeInfo", myNoticeInfo);
+                        String jsonInfo = SpringUtil.getBean(IFlowableApi.class).getRepetitionCountBymyNoticeTitle(map);
+                        MyNoticeList repetitionCountBymyNotice = JSON.parseObject(jsonInfo, new TypeReference<MyNoticeList>() {});
+
+                        if(null == repetitionCountBymyNotice){
+                            // 生成id
+                            String id = UUID.randomUUID().toString().replace("-", "");
+                            myNotice.setId(id);
+                            myNotice.setRepetitionCount(0);
+
+                            myNoticeInfo = JSON.toJSONString(myNotice);
+                            map.put("myNoticeInfo", myNoticeInfo);
+                            SpringUtil.getBean ( IFlowableApi.class ).insertMyNotice(map);
+                        }else{
+                            myNotice.setId(repetitionCountBymyNotice.getId());
+                            myNotice.setRepetitionCount(repetitionCountBymyNotice.getRepetitionCount()+1);
+
+                            myNoticeInfo = JSON.toJSONString(myNotice);
+                            map.put("myNoticeInfo", myNoticeInfo);
+                            SpringUtil.getBean ( IFlowableApi.class ).updateMyNotice(map);
+                        }
+                    }
+                }
+            }
+
+
+        }
+    }
+
+
+    /**
      * 4、冻结账号发送短信(Bean模式)
      */
     @XxlJob("freezeAccount")