business/src/main/java/com/ycl/controller/FlowableTypeController.java
@@ -3,6 +3,10 @@ import com.baomidou.mybatisplus.core.metadata.IPage; import com.ycl.common.base.Result; import com.ycl.common.constant.UserConstants; import com.ycl.common.core.controller.BaseController; import com.ycl.common.core.domain.AjaxResult; import com.ycl.common.core.domain.entity.SysMenu; import com.ycl.common.group.Add; import com.ycl.common.group.Update; import com.ycl.domain.entity.FlowableType; @@ -21,6 +25,7 @@ import org.springframework.web.bind.annotation.*; import javax.validation.constraints.NotEmpty; import java.util.Date; import java.util.List; /** @@ -31,7 +36,7 @@ @Api(value = "工作流分类", tags = "工作流分类管理") @RestController @RequestMapping("/flowable_type") public class FlowableTypeController { public class FlowableTypeController extends BaseController { private final FlowableTypeService flowableTypeService; @@ -39,6 +44,10 @@ @ApiOperation(value = "添加", notes = "添加") // @PreAuthorize("hasAuthority('flowableType:add')") public Result add(@RequestBody @Validated(Add.class) FlowableType form) { form.setCreateBy(getUsername()); form.setCreateTime(new Date()); form.setUpdateBy(getUsername()); form.setUpdateTime(new Date()); flowableTypeService.save(form); return Result.ok(); } @@ -60,13 +69,15 @@ } @GetMapping("/page") @ApiOperation(value = "分页", notes = "分页") @GetMapping("/list") // @PreAuthorize("hasAuthority('flowableType:page')") public Result page(AbsQuery query) { IPage<FlowableType> page = PageUtil.getPage(query, FlowableType.class); flowableTypeService.page(page); return Result.ok().data(page.getRecords()).total(page.getTotal()); public Result list(FlowableType flowableType) { List<FlowableType> list = flowableTypeService.selectTypeList(flowableType); return Result.ok().data(list); } @GetMapping("/tree_select") public AjaxResult treeSelect(FlowableType flowableType) { List<FlowableType> list = flowableTypeService.selectTypeList(flowableType); return success(flowableTypeService.buildTreeSelect(list)); } } business/src/main/java/com/ycl/controller/ProjectPlanInfoController.java
@@ -4,8 +4,10 @@ import com.ycl.common.base.Result; import com.ycl.common.group.Add; import com.ycl.common.group.Update; import com.ycl.domain.entity.ProjectPlanInfo; import com.ycl.domain.form.ProjectPlanInfoForm; import com.ycl.domain.query.ProjectPlanInfoQuery; import com.ycl.domain.vo.ProjectPlanInfoRequest; import com.ycl.service.ProjectPlanInfoService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; @@ -34,7 +36,7 @@ @PostMapping @ApiOperation(value = "添加", notes = "添加") @PreAuthorize("hasAuthority('projectPlanInfo:add')") // @PreAuthorize("hasAuthority('projectPlanInfo:add')") public Result add(@RequestBody @Validated(Add.class) ProjectPlanInfoForm form) { return projectPlanInfoService.add(form); } @@ -69,7 +71,7 @@ @GetMapping("/{id}") @ApiOperation(value = "详情", notes = "详情") @PreAuthorize("hasAuthority('projectPlanInfo:detail')") // @PreAuthorize("hasAuthority('projectPlanInfo:detail')") public Result detail(@PathVariable("id") Integer id) { return projectPlanInfoService.detail(id); } @@ -80,4 +82,15 @@ public Result list() { return projectPlanInfoService.all(); } @PostMapping("/addPlanInfo") public Result addPlanInfo(@RequestBody ProjectPlanInfoRequest request) { return projectPlanInfoService.addPlanInfo(request); } @PostMapping("/savePlanInfo") public Result savePlanInfo(@RequestBody ProjectPlanInfo item) { return projectPlanInfoService.savePlanInfo(item); } } business/src/main/java/com/ycl/domain/entity/FlowableType.java
@@ -1,21 +1,28 @@ package com.ycl.domain.entity; import com.baomidou.mybatisplus.annotation.FieldFill; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.annotation.*; import com.fasterxml.jackson.annotation.JsonFormat; import com.ycl.common.core.domain.BaseEntity; import com.ycl.common.core.domain.entity.SysMenu; import com.ycl.system.domain.base.AbsEntity; import lombok.Data; import java.io.Serializable; import java.time.LocalDateTime; import java.util.ArrayList; import java.util.Date; import java.util.List; /** * 流程分类 */ @Data @TableName("t_flowable_type") public class FlowableType extends AbsEntity { public class FlowableType implements Serializable { private static final long serialVersionUID = 1L; @TableId(value = "id", type = IdType.ASSIGN_ID) private Integer id; @TableField(value = "name") private String name; @@ -23,17 +30,43 @@ @TableField(value = "parent_id") private Integer parentId; @TableField(value = "level") private Integer level; @TableField(value = "order_num") private Integer orderNum; @TableField(value = "leaf") private Boolean leaf; // @TableField(value = "level") // private Integer level; // // @TableField(value = "leaf") // private Boolean leaf; /** * 菜单状态(0正常 1停用) */ @TableField(value = "status") private String status; /** 创建者 */ @TableField(value = "create_by") private String createBy; /** 创建时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") @TableField(value = "create_time") private Date createTime; /** 更新者 */ @TableField(value = "update_by") private String updateBy; /** 更新时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") @TableField(value = "update_time") private Date updateTime; /** 备注 */ @TableField(value = "remark") private String remark; @TableField(exist = false) private List<FlowableType> children = new ArrayList<FlowableType>(); } business/src/main/java/com/ycl/domain/entity/ProjectPlanInfo.java
@@ -1,11 +1,13 @@ package com.ycl.domain.entity; import com.baomidou.mybatisplus.annotation.FieldFill; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableName; import com.ycl.system.domain.base.AbsEntity; import lombok.Data; import java.time.LocalDateTime; import java.util.Date; /** * 项目计划项 @@ -33,11 +35,20 @@ @TableField("start_time") /** 计划开始时间 */ private LocalDateTime startTime; private Date startTime; @TableField("end_time") /** 计划完成时间 */ private LocalDateTime endTime; private Date endTime; /** 创建时间 */ @TableField(exist = false) private Date gmtCreate; /** 修改时间 */ @TableField(exist = false) private Date gmtUpdate; @TableField(exist = false) private Integer deleted; } business/src/main/java/com/ycl/domain/vo/ProjectPlanInfoItem.java
New file @@ -0,0 +1,16 @@ package com.ycl.domain.vo; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import java.util.Date; @Data @AllArgsConstructor @NoArgsConstructor public class ProjectPlanInfoItem { private String title; private Date startTime; private Date endTime; } business/src/main/java/com/ycl/domain/vo/ProjectPlanInfoRequest.java
New file @@ -0,0 +1,17 @@ package com.ycl.domain.vo; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import java.math.BigDecimal; import java.util.List; @Data @AllArgsConstructor @NoArgsConstructor public class ProjectPlanInfoRequest { private Integer projectPlanRecordId; private BigDecimal actualInvest; private List<ProjectPlanInfoItem> addList; } business/src/main/java/com/ycl/domain/vo/ProjectPlanInfoResponseVO.java
New file @@ -0,0 +1,17 @@ package com.ycl.domain.vo; import com.ycl.domain.entity.ProjectPlanInfo; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import java.math.BigDecimal; import java.util.List; @Data @AllArgsConstructor @NoArgsConstructor public class ProjectPlanInfoResponseVO { private List<ProjectPlanInfo> list; private BigDecimal actualInvest; } business/src/main/java/com/ycl/mapper/FlowableTypeMapper.java
@@ -4,8 +4,10 @@ import com.ycl.domain.entity.FlowableType; import org.apache.ibatis.annotations.Mapper; import java.util.List; @Mapper public interface FlowableTypeMapper extends BaseMapper<FlowableType> { List<FlowableType> selectTypeList(FlowableType flowableType); } business/src/main/java/com/ycl/mapper/ProjectPlanInfoMapper.java
@@ -31,4 +31,7 @@ */ IPage getPage(IPage page, @Param("query") ProjectPlanInfoQuery query); void batchInsert(@Param("list") List<ProjectPlanInfo> list); void insertOne(ProjectPlanInfo item); } business/src/main/java/com/ycl/service/FlowableTypeService.java
@@ -9,4 +9,7 @@ public interface FlowableTypeService extends IService<FlowableType> { List<FlowableType> selectTypeList(FlowableType flowableType); List<FlowableType> buildTreeSelect(List<FlowableType> list); } business/src/main/java/com/ycl/service/ProjectPlanInfoService.java
@@ -5,6 +5,7 @@ import com.ycl.domain.entity.ProjectPlanInfo; import com.ycl.domain.form.ProjectPlanInfoForm; import com.ycl.domain.query.ProjectPlanInfoQuery; import com.ycl.domain.vo.ProjectPlanInfoRequest; import java.util.List; @@ -59,8 +60,20 @@ Result detail(Integer id); /** * 列表 * 新增计划项 * @return */ Result all(); /** * 新增计划项 * @return */ Result addPlanInfo(ProjectPlanInfoRequest request); /** * 保存计划项 * @return */ Result savePlanInfo(ProjectPlanInfo item); } business/src/main/java/com/ycl/service/impl/FlowableTypeServiceImpl.java
@@ -1,17 +1,14 @@ package com.ycl.service.impl; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ycl.common.base.Result; import com.ycl.domain.entity.FlowableType; import com.ycl.framework.utils.PageUtil; import com.ycl.mapper.FlowableTypeMapper; import com.ycl.service.FlowableTypeService; import lombok.RequiredArgsConstructor; import org.springframework.beans.BeanUtils; import org.springframework.stereotype.Service; import org.springframework.util.Assert; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.stream.Collectors; @@ -20,4 +17,70 @@ @RequiredArgsConstructor public class FlowableTypeServiceImpl extends ServiceImpl<FlowableTypeMapper, FlowableType> implements FlowableTypeService { @Override public List<FlowableType> selectTypeList(FlowableType flowableType) { return baseMapper.selectTypeList(flowableType); } @Override public List<FlowableType> buildTreeSelect(List<FlowableType> list) { List<FlowableType> returnList = new ArrayList<FlowableType>(); List<Integer> tempList = list.stream().map(FlowableType::getId).collect(Collectors.toList()); for (Iterator<FlowableType> iterator = list.iterator(); iterator.hasNext();) { FlowableType type = (FlowableType) iterator.next(); // 如果是顶级节点, 遍历该父节点的所有子节点 if (!tempList.contains(type.getParentId())) { recursionFn(list, type); returnList.add(type); } } if (returnList.isEmpty()) { returnList = list; } return returnList; } private void recursionFn(List<FlowableType> list, FlowableType t) { // 得到子节点列表 List<FlowableType> childList = getChildList(list, t); t.setChildren(childList); for (FlowableType tChild : childList) { if (hasChild(list, tChild)) { recursionFn(list, tChild); } } } /** * 得到子节点列表 */ private List<FlowableType> getChildList(List<FlowableType> list, FlowableType t) { List<FlowableType> tlist = new ArrayList<FlowableType>(); Iterator<FlowableType> it = list.iterator(); while (it.hasNext()) { FlowableType n = (FlowableType) it.next(); if (n.getParentId().longValue() == t.getId().longValue()) { tlist.add(n); } } return tlist; } /** * 判断是否有子节点 */ private boolean hasChild(List<FlowableType> list, FlowableType t) { return getChildList(list, t).size() > 0; } } business/src/main/java/com/ycl/service/impl/ProjectPlanInfoServiceImpl.java
@@ -1,20 +1,27 @@ package com.ycl.service.impl; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper; import com.baomidou.mybatisplus.extension.conditions.update.LambdaUpdateChainWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ycl.common.base.Result; import com.ycl.domain.entity.ProjectPlanInfo; import com.ycl.domain.entity.ProjectPlanRecord; import com.ycl.domain.form.ProjectPlanInfoForm; import com.ycl.domain.query.ProjectPlanInfoQuery; import com.ycl.domain.vo.ProjectPlanInfoRequest; import com.ycl.domain.vo.ProjectPlanInfoResponseVO; import com.ycl.domain.vo.ProjectPlanInfoVO; import com.ycl.framework.utils.PageUtil; import com.ycl.mapper.ProjectPlanInfoMapper; import com.ycl.mapper.ProjectPlanRecordMapper; import com.ycl.service.ProjectPlanInfoService; import lombok.RequiredArgsConstructor; import org.springframework.beans.BeanUtils; import org.springframework.stereotype.Service; import org.springframework.util.Assert; import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; @@ -29,6 +36,7 @@ public class ProjectPlanInfoServiceImpl extends ServiceImpl<ProjectPlanInfoMapper, ProjectPlanInfo> implements ProjectPlanInfoService { private final ProjectPlanInfoMapper projectPlanInfoMapper; private final ProjectPlanRecordMapper projectPlanRecordMapper; /** * 添加 @@ -99,8 +107,9 @@ */ @Override public Result detail(Integer id) { ProjectPlanInfoVO vo = baseMapper.getById(id); Assert.notNull(vo, "记录不存在"); ProjectPlanInfoResponseVO vo = new ProjectPlanInfoResponseVO(); vo.setList(new LambdaQueryChainWrapper<>(baseMapper).eq(ProjectPlanInfo::getProjectPlanRecordId, id).list()); vo.setActualInvest(new LambdaQueryChainWrapper<>(projectPlanRecordMapper).eq(ProjectPlanRecord::getId, id).one().getActualInvest()); return Result.ok().data(vo); } @@ -116,4 +125,48 @@ .collect(Collectors.toList()); return Result.ok().data(vos); } @Override public Result addPlanInfo(ProjectPlanInfoRequest request) { if (request.getAddList() == null || request.getAddList().isEmpty()) {{ return Result.error("请选择要添加的计划项"); }} // 删除原有记录 new LambdaUpdateChainWrapper<>(baseMapper).eq(ProjectPlanInfo::getProjectPlanRecordId, request.getProjectPlanRecordId()).remove(); // 批量插入新记录 List<ProjectPlanInfo> list = new ArrayList<>(); request.getAddList().forEach(item -> { ProjectPlanInfo projectPlanInfo = new ProjectPlanInfo(); projectPlanInfo.setProjectPlanRecordId(request.getProjectPlanRecordId().longValue()); projectPlanInfo.setTitle(item.getTitle()); projectPlanInfo.setProgressStatus(0); projectPlanInfo.setStartTime(item.getStartTime()); projectPlanInfo.setEndTime(item.getEndTime()); list.add(projectPlanInfo); }); baseMapper.batchInsert(list); // 更新计划记录的投资,以及上报状态 new LambdaUpdateChainWrapper<>(projectPlanRecordMapper) .eq(ProjectPlanRecord::getId, request.getProjectPlanRecordId()) .set(ProjectPlanRecord::getActualInvest, request.getActualInvest()) .set(ProjectPlanRecord::getReportStatus, 0) .update(); return Result.ok("添加成功"); } @Override public Result savePlanInfo(ProjectPlanInfo item) { item.setProgressStatus(0); // 判断id是否存在,存在则更新,不存在则新增 if (item.getId() == null) { baseMapper.insertOne(item); } else { new LambdaUpdateChainWrapper<>(baseMapper).eq(ProjectPlanInfo::getId, item.getId()) .set(ProjectPlanInfo::getTitle, item.getTitle()) .set(ProjectPlanInfo::getStartTime, item.getStartTime()) .set(ProjectPlanInfo::getEndTime, item.getEndTime()) .update(); } return Result.ok("保存成功"); } } business/src/main/resources/mapper/FlowableTypeMapper.xml
@@ -53,5 +53,17 @@ WHERE TP.deleted = 0 </select> <select id="selectTypeList" parameterType="com.ycl.domain.entity.FlowableType" resultType="com.ycl.domain.entity.FlowableType"> select * from t_flowable_type <where> <if test="name != null and name != ''"> AND name like concat('%', #{name}, '%') </if> <if test="status != null and status != ''"> AND status = #{status} </if> </where> order by parent_id, order_num </select> </mapper> business/src/main/resources/mapper/ProjectPlanInfoMapper.xml
@@ -10,11 +10,18 @@ <result column="start_time" property="startTime" /> <result column="end_time" property="endTime" /> </resultMap> <insert id="batchInsert"> insert into t_project_plan_info(project_plan_record_id, title, progress_status, start_time, end_time) values <foreach collection="list" item="item" separator=","> (#{item.projectPlanRecordId}, #{item.title}, #{item.progressStatus}, #{item.startTime}, #{item.endTime}) </foreach> </insert> <insert id="insertOne"> insert into t_project_plan_info(project_plan_record_id, title, progress_status, start_time, end_time) values (#{projectPlanRecordId}, #{title}, #{progressStatus}, #{startTime}, #{endTime}) </insert> <select id="getById" resultMap="BaseResultMap">