src/main/java/com/ruoyi/approve/bean/dto/ApprovalInstanceDto.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,12 @@ package com.ruoyi.approve.bean.dto; import com.ruoyi.approve.pojo.ApprovalInstance; import lombok.Data; @Data public class ApprovalInstanceDto extends ApprovalInstance { private String approveAction; private String approveComment; } src/main/java/com/ruoyi/approve/bean/dto/ApprovalTemplateDto.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,12 @@ package com.ruoyi.approve.bean.dto; import com.ruoyi.approve.pojo.ApprovalTemplate; import lombok.Data; import java.util.List; @Data public class ApprovalTemplateDto extends ApprovalTemplate { private List<ApprovalTemplateNodeDto> nodes; } src/main/java/com/ruoyi/approve/bean/dto/ApprovalTemplateNodeApproverDto.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,8 @@ package com.ruoyi.approve.bean.dto; import com.ruoyi.approve.pojo.ApprovalTemplateNodeApprover; import lombok.Data; @Data public class ApprovalTemplateNodeApproverDto extends ApprovalTemplateNodeApprover { } src/main/java/com/ruoyi/approve/bean/dto/ApprovalTemplateNodeDto.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,12 @@ package com.ruoyi.approve.bean.dto; import com.ruoyi.approve.pojo.ApprovalTemplateNode; import lombok.Data; import java.util.List; @Data public class ApprovalTemplateNodeDto extends ApprovalTemplateNode { private List<ApprovalTemplateNodeApproverDto> approvers; } src/main/java/com/ruoyi/approve/bean/vo/ApprovalInstanceVo.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,25 @@ package com.ruoyi.approve.bean.vo; import com.ruoyi.approve.pojo.ApprovalInstance; import com.ruoyi.approve.pojo.ApprovalRecord; import com.ruoyi.approve.pojo.ApprovalTask; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import java.util.List; @Data public class ApprovalInstanceVo extends ApprovalInstance { //å½åç¨æ·æ¯å¦å¯ä»¥å®¡æ¹ @Schema(description = "å½åç¨æ·æ¯å¦å¯ä»¥å®¡æ¹") private Boolean isApprove; //å®¡æ¹æµç¨ private List<ApprovalTask> tasks; //审æ¹è®°å½ private List<ApprovalRecord> records; @Schema(description = "ä¸å¡åç§°") private String businessName; } src/main/java/com/ruoyi/approve/bean/vo/ApprovalTemplateNodeApproverVo.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,9 @@ package com.ruoyi.approve.bean.vo; import com.ruoyi.approve.pojo.ApprovalTemplateNodeApprover; import lombok.Data; @Data public class ApprovalTemplateNodeApproverVo extends ApprovalTemplateNodeApprover { } src/main/java/com/ruoyi/approve/bean/vo/ApprovalTemplateNodeVo.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,13 @@ package com.ruoyi.approve.bean.vo; import com.ruoyi.approve.pojo.ApprovalTemplateNode; import lombok.Data; import java.util.List; @Data public class ApprovalTemplateNodeVo extends ApprovalTemplateNode { private List<ApprovalTemplateNodeApproverVo> approvers; } src/main/java/com/ruoyi/approve/bean/vo/ApprovalTemplateVo.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,14 @@ package com.ruoyi.approve.bean.vo; import com.ruoyi.approve.pojo.ApprovalTemplate; import lombok.Data; import java.util.List; @Data public class ApprovalTemplateVo extends ApprovalTemplate { private List<ApprovalTemplateNodeVo> nodes; private String createdUserName; } src/main/java/com/ruoyi/approve/controller/ApprovalInstanceController.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,59 @@ package com.ruoyi.approve.controller; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.approve.bean.dto.ApprovalInstanceDto; import com.ruoyi.approve.bean.vo.ApprovalInstanceVo; import com.ruoyi.approve.service.ApprovalInstanceService; import com.ruoyi.framework.web.domain.R; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.AllArgsConstructor; import org.springframework.web.bind.annotation.*; import java.util.List; /** * <p> * 审æ¹å®ä¾è¡¨ å端æ§å¶å¨ * </p> * * @author è¯å¯¼è½¯ä»¶ï¼æ±èï¼æéå ¬å¸ * @since 2026-05-18 03:27:46 */ @RestController @RequestMapping("/approvalInstance") @Tag(name = "审æ¹å®ä¾è¡¨") @AllArgsConstructor public class ApprovalInstanceController { private final ApprovalInstanceService approvalInstanceService; @GetMapping("/listPage") @Operation(summary = "å页æ¥è¯¢") public R listPage(Page<ApprovalInstanceVo> page, ApprovalInstanceDto approvalInstanceDto) { return approvalInstanceService.listPage(page, approvalInstanceDto); } @PostMapping("/save") @Operation(summary = "ä¿å") public R save(@RequestBody ApprovalInstanceDto approvalInstanceDto) { return approvalInstanceService.add(approvalInstanceDto) ? R.ok() : R.fail(); } @PutMapping("/update") @Operation(summary = "æ´æ°") public R update(@RequestBody ApprovalInstanceDto approvalInstanceDto) { return approvalInstanceService.updateById(approvalInstanceDto) ? R.ok() : R.fail(); } @DeleteMapping("/delete") @Operation(summary = "å é¤") public R delete(@RequestBody List<Long> ids) { return approvalInstanceService.delete(ids) ? R.ok() : R.fail(); } @Operation(summary = "审æ¹") @PostMapping("/approve") public R approve(@RequestBody ApprovalInstanceDto approvalInstanceDto) { return approvalInstanceService.approve(approvalInstanceDto); } } src/main/java/com/ruoyi/approve/controller/ApprovalInstanceNodeController.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,18 @@ package com.ruoyi.approve.controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; /** * <p> * 审æ¹èç¹å®ä¾è¡¨ å端æ§å¶å¨ * </p> * * @author è¯å¯¼è½¯ä»¶ï¼æ±èï¼æéå ¬å¸ * @since 2026-05-18 03:27:54 */ @RestController @RequestMapping("/approvalInstanceNode") public class ApprovalInstanceNodeController { } src/main/java/com/ruoyi/approve/controller/ApprovalRecordController.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,18 @@ package com.ruoyi.approve.controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; /** * <p> * 审æ¹è®°å½è¡¨ å端æ§å¶å¨ * </p> * * @author è¯å¯¼è½¯ä»¶ï¼æ±èï¼æéå ¬å¸ * @since 2026-05-18 03:28:21 */ @RestController @RequestMapping("/approvalRecord") public class ApprovalRecordController { } src/main/java/com/ruoyi/approve/controller/ApprovalTaskController.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,18 @@ package com.ruoyi.approve.controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; /** * <p> * 审æ¹ä»»å¡è¡¨ å端æ§å¶å¨ * </p> * * @author è¯å¯¼è½¯ä»¶ï¼æ±èï¼æéå ¬å¸ * @since 2026-05-18 03:32:37 */ @RestController @RequestMapping("/approvalTask") public class ApprovalTaskController { } src/main/java/com/ruoyi/approve/controller/ApprovalTemplateController.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,66 @@ package com.ruoyi.approve.controller; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.approve.bean.dto.ApprovalTemplateDto; import com.ruoyi.approve.bean.vo.ApprovalTemplateVo; import com.ruoyi.approve.service.ApprovalTemplateService; import com.ruoyi.framework.web.domain.R; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.AllArgsConstructor; import org.springframework.web.bind.annotation.*; import java.util.List; /** * <p> * å®¡æ¹æ¨¡æ¿è¡¨ å端æ§å¶å¨ * </p> * * @author èéè½¯ä»¶ï¼æ±èï¼æéå ¬å¸ * @since 2026-05-18 11:20:08 */ @RestController @RequestMapping("/approvalTemplate") @Tag(name = "å®¡æ¹æ¨¡æ¿è¡¨") @AllArgsConstructor public class ApprovalTemplateController { private final ApprovalTemplateService approvalTemplateService; @GetMapping("/listPage") @Operation(summary = "å页æ¥è¯¢") public R listPage(Page<ApprovalTemplateVo> page, ApprovalTemplateDto approvalTemplateDto) { return R.ok(approvalTemplateService.listPage(page, approvalTemplateDto)); } @PostMapping("/add") @Operation(summary = "æ·»å ") public R add(@RequestBody ApprovalTemplateDto approvalTemplateDto) { return R.ok(approvalTemplateService.saveApprovalTemplateDto(approvalTemplateDto)); } @PutMapping("/update") @Operation(summary = "ä¿®æ¹") public R update(@RequestBody ApprovalTemplateDto approvalTemplateDto) { return R.ok(approvalTemplateService.updateApprovalTemplateDto(approvalTemplateDto)); } @PostMapping("/delete") @Operation(summary = "å é¤") public R delete(@RequestBody List<Long> ids) { return R.ok(approvalTemplateService.delete(ids)); } @GetMapping("/list/{type}") @Operation(summary = "æ¥è¯¢ææå®¡æ¹æ¨¡æ¿") public R list(@PathVariable("type") Integer type) { return R.ok(approvalTemplateService.listApprovalTemplateVo(type)); } @GetMapping("/detail/{id}") @Operation(summary = "æ¥è¯¢å®¡æ¹æ¨¡æ¿è¯¦æ ") public R detail(@PathVariable("id") Long id) { return R.ok(approvalTemplateService.getApprovalTemplateVoById(id)); } } src/main/java/com/ruoyi/approve/controller/ApprovalTemplateNodeApproverController.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,18 @@ package com.ruoyi.approve.controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; /** * <p> * å®¡æ¹æ¨¡æ¿èç¹å®¡æ¹äººè¡¨ å端æ§å¶å¨ * </p> * * @author è¯å¯¼è½¯ä»¶ï¼æ±èï¼æéå ¬å¸ * @since 2026-05-18 11:20:30 */ @RestController @RequestMapping("/approvalTemplateNodeApprover") public class ApprovalTemplateNodeApproverController { } src/main/java/com/ruoyi/approve/controller/ApprovalTemplateNodeController.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,18 @@ package com.ruoyi.approve.controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; /** * <p> * å®¡æ¹æ¨¡æ¿èç¹è¡¨ å端æ§å¶å¨ * </p> * * @author è¯å¯¼è½¯ä»¶ï¼æ±èï¼æéå ¬å¸ * @since 2026-05-18 11:20:19 */ @RestController @RequestMapping("/approvalTemplateNode") public class ApprovalTemplateNodeController { } src/main/java/com/ruoyi/approve/mapper/ApprovalInstanceMapper.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,24 @@ package com.ruoyi.approve.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.approve.bean.dto.ApprovalInstanceDto; import com.ruoyi.approve.bean.vo.ApprovalInstanceVo; import com.ruoyi.approve.pojo.ApprovalInstance; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; /** * <p> * 审æ¹å®ä¾è¡¨ Mapper æ¥å£ * </p> * * @author è¯å¯¼è½¯ä»¶ï¼æ±èï¼æéå ¬å¸ * @since 2026-05-18 03:27:46 */ @Mapper public interface ApprovalInstanceMapper extends BaseMapper<ApprovalInstance> { IPage<ApprovalInstanceVo> listPage(Page<ApprovalInstanceVo> page,@Param("ew") ApprovalInstanceDto approvalInstanceDto); } src/main/java/com/ruoyi/approve/mapper/ApprovalInstanceNodeMapper.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,18 @@ package com.ruoyi.approve.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.ruoyi.approve.pojo.ApprovalInstanceNode; import org.apache.ibatis.annotations.Mapper; /** * <p> * 审æ¹èç¹å®ä¾è¡¨ Mapper æ¥å£ * </p> * * @author è¯å¯¼è½¯ä»¶ï¼æ±èï¼æéå ¬å¸ * @since 2026-05-18 03:27:54 */ @Mapper public interface ApprovalInstanceNodeMapper extends BaseMapper<ApprovalInstanceNode> { } src/main/java/com/ruoyi/approve/mapper/ApprovalRecordMapper.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,18 @@ package com.ruoyi.approve.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.ruoyi.approve.pojo.ApprovalRecord; import org.apache.ibatis.annotations.Mapper; /** * <p> * 审æ¹è®°å½è¡¨ Mapper æ¥å£ * </p> * * @author è¯å¯¼è½¯ä»¶ï¼æ±èï¼æéå ¬å¸ * @since 2026-05-18 03:28:21 */ @Mapper public interface ApprovalRecordMapper extends BaseMapper<ApprovalRecord> { } src/main/java/com/ruoyi/approve/mapper/ApprovalTaskMapper.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,18 @@ package com.ruoyi.approve.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.ruoyi.approve.pojo.ApprovalTask; import org.apache.ibatis.annotations.Mapper; /** * <p> * 审æ¹ä»»å¡è¡¨ Mapper æ¥å£ * </p> * * @author è¯å¯¼è½¯ä»¶ï¼æ±èï¼æéå ¬å¸ * @since 2026-05-18 03:32:37 */ @Mapper public interface ApprovalTaskMapper extends BaseMapper<ApprovalTask> { } src/main/java/com/ruoyi/approve/mapper/ApprovalTemplateMapper.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,24 @@ package com.ruoyi.approve.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.approve.bean.dto.ApprovalTemplateDto; import com.ruoyi.approve.bean.vo.ApprovalTemplateVo; import com.ruoyi.approve.pojo.ApprovalTemplate; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; /** * <p> * å®¡æ¹æ¨¡æ¿è¡¨ Mapper æ¥å£ * </p> * * @author è¯å¯¼è½¯ä»¶ï¼æ±èï¼æéå ¬å¸ * @since 2026-05-18 11:20:08 */ @Mapper public interface ApprovalTemplateMapper extends BaseMapper<ApprovalTemplate> { IPage<ApprovalTemplateVo> listPage(Page<ApprovalTemplateVo> page,@Param("ew") ApprovalTemplateDto approvalTemplateDto); } src/main/java/com/ruoyi/approve/mapper/ApprovalTemplateNodeApproverMapper.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,18 @@ package com.ruoyi.approve.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.ruoyi.approve.pojo.ApprovalTemplateNodeApprover; import org.apache.ibatis.annotations.Mapper; /** * <p> * å®¡æ¹æ¨¡æ¿èç¹å®¡æ¹äººè¡¨ Mapper æ¥å£ * </p> * * @author è¯å¯¼è½¯ä»¶ï¼æ±èï¼æéå ¬å¸ * @since 2026-05-18 11:20:30 */ @Mapper public interface ApprovalTemplateNodeApproverMapper extends BaseMapper<ApprovalTemplateNodeApprover> { } src/main/java/com/ruoyi/approve/mapper/ApprovalTemplateNodeMapper.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,18 @@ package com.ruoyi.approve.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.ruoyi.approve.pojo.ApprovalTemplateNode; import org.apache.ibatis.annotations.Mapper; /** * <p> * å®¡æ¹æ¨¡æ¿èç¹è¡¨ Mapper æ¥å£ * </p> * * @author è¯å¯¼è½¯ä»¶ï¼æ±èï¼æéå ¬å¸ * @since 2026-05-18 11:20:19 */ @Mapper public interface ApprovalTemplateNodeMapper extends BaseMapper<ApprovalTemplateNode> { } src/main/java/com/ruoyi/approve/pojo/ApprovalInstance.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,148 @@ package com.ruoyi.approve.pojo; import com.baomidou.mybatisplus.annotation.*; import io.swagger.annotations.ApiModel; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Getter; import lombok.Setter; import lombok.ToString; import java.io.Serializable; import java.time.LocalDateTime; /** * <p> * 审æ¹å®ä¾è¡¨ * </p> * * @author è¯å¯¼è½¯ä»¶ï¼æ±èï¼æéå ¬å¸ * @since 2026-05-18 03:27:46 */ @Getter @Setter @ToString @TableName("approval_instance") @ApiModel(value = "ApprovalInstance对象", description = "审æ¹å®ä¾è¡¨") public class ApprovalInstance implements Serializable { private static final long serialVersionUID = 1L; /** * 审æ¹å®ä¾ID */ @Schema(description ="审æ¹å®ä¾ID") @TableId(value = "id", type = IdType.AUTO) private Long id; /** * 审æ¹ç¼å· */ @Schema(description ="审æ¹ç¼å·") private String instanceNo; /** * 模æ¿ID */ @Schema(description ="模æ¿ID") private Long templateId; /** * 模æ¿åç§° */ @Schema(description ="模æ¿åç§°") private String templateName; /** * ä¸å¡ID */ @Schema(description ="ä¸å¡ID") private Long businessId; /** * ä¸å¡ç±»å */ @Schema(description ="ä¸å¡ç±»å") private Long businessType; /** * å®¡æ¹æ é¢ */ @Schema(description ="å®¡æ¹æ é¢") private String title; /** * 审æ¹ç¶æ */ @Schema(description ="审æ¹ç¶æ PENDING - å¾ å®¡æ¹/è¿è¡ä¸ APPROVED - å·²éè¿/已宿 REJECTED - 已驳å") private String status; /** * å½å审æ¹çº§å« */ @Schema(description ="å½å审æ¹çº§å«") private Integer currentLevel; /** * ç³è¯·äººID */ @Schema(description ="ç³è¯·äººID") private Long applicantId; /** * ç³è¯·äººåç§° */ @Schema(description ="ç³è¯·äººåç§°") private String applicantName; /** * ç³è¯·æ¶é´ */ @Schema(description ="ç³è¯·æ¶é´") private LocalDateTime applyTime; /** * 宿æ¶é´ */ @Schema(description ="宿æ¶é´") private LocalDateTime finishTime; /** * å建人 */ @Schema(description ="å建人") @TableField(fill = FieldFill.INSERT) private Long createUser; /** * å建æ¶é´ */ @Schema(description ="å建æ¶é´") @TableField(fill = FieldFill.INSERT) private LocalDateTime createTime; /** * æ´æ°äºº */ @Schema(description ="æ´æ°äºº") @TableField(fill = FieldFill.INSERT_UPDATE) private Long updateUser; /** * æ´æ°æ¶é´ */ @Schema(description ="æ´æ°æ¶é´") @TableField(fill = FieldFill.INSERT_UPDATE) private LocalDateTime updateTime; @TableField(fill = FieldFill.INSERT) private Long deptId; /** * é»è¾å é¤ */ @Schema(description ="é»è¾å é¤") private Byte deleted; @Schema(description = "è¡¨åæ°æ®") private String formConfig; } src/main/java/com/ruoyi/approve/pojo/ApprovalInstanceNode.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,106 @@ package com.ruoyi.approve.pojo; import com.baomidou.mybatisplus.annotation.*; import io.swagger.annotations.ApiModel; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Getter; import lombok.Setter; import lombok.ToString; import java.io.Serializable; import java.time.LocalDateTime; /** * <p> * 审æ¹èç¹å®ä¾è¡¨ * </p> * * @author è¯å¯¼è½¯ä»¶ï¼æ±èï¼æéå ¬å¸ * @since 2026-05-18 03:27:54 */ @Getter @Setter @ToString @TableName("approval_instance_node") @ApiModel(value = "ApprovalInstanceNode对象", description = "审æ¹èç¹å®ä¾è¡¨") public class ApprovalInstanceNode implements Serializable { private static final long serialVersionUID = 1L; /** * èç¹å®ä¾ID */ @Schema(description ="èç¹å®ä¾ID") @TableId(value = "id", type = IdType.AUTO) private Long id; /** * 审æ¹å®ä¾ID */ @Schema(description ="审æ¹å®ä¾ID") private Long instanceId; /** * 审æ¹çº§å« */ @Schema(description ="审æ¹çº§å«") private Integer levelNo; /** * 审æ¹ç±»å */ @Schema(description ="审æ¹ç±»å") private String approveType; /** * èç¹ç¶æ */ @Schema(description ="èç¹ç¶æ PENDING - å¾ å¤ç APPROVED - å·²éè¿ REJECTED - 已驳å") private String status; /** * å¼å§æ¶é´ */ @Schema(description ="å¼å§æ¶é´") private LocalDateTime startTime; /** * 宿æ¶é´ */ @Schema(description ="宿æ¶é´") private LocalDateTime finishTime; /** * å建人 */ @Schema(description ="å建人") @TableField(fill = FieldFill.INSERT) private Long createUser; /** * å建æ¶é´ */ @Schema(description ="å建æ¶é´") @TableField(fill = FieldFill.INSERT) private LocalDateTime createTime; /** * æ´æ°äºº */ @Schema(description ="æ´æ°äºº") @TableField(fill = FieldFill.INSERT_UPDATE) private Long updateUser; /** * æ´æ°æ¶é´ */ @Schema(description ="æ´æ°æ¶é´") @TableField(fill = FieldFill.INSERT_UPDATE) private LocalDateTime updateTime; /** * é»è¾å é¤ */ @Schema(description ="é»è¾å é¤") private Byte deleted; } src/main/java/com/ruoyi/approve/pojo/ApprovalRecord.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,98 @@ package com.ruoyi.approve.pojo; import com.baomidou.mybatisplus.annotation.*; import io.swagger.annotations.ApiModel; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Getter; import lombok.Setter; import lombok.ToString; import java.io.Serializable; import java.time.LocalDateTime; /** * <p> * 审æ¹è®°å½è¡¨ * </p> * * @author è¯å¯¼è½¯ä»¶ï¼æ±èï¼æéå ¬å¸ * @since 2026-05-18 03:28:21 */ @Getter @Setter @ToString @TableName("approval_record") @ApiModel(value = "ApprovalRecord对象", description = "审æ¹è®°å½è¡¨") public class ApprovalRecord implements Serializable { private static final long serialVersionUID = 1L; /** * 审æ¹è®°å½ID */ @Schema(description ="审æ¹è®°å½ID") @TableId(value = "id", type = IdType.AUTO) private Long id; /** * 审æ¹å®ä¾ID */ @Schema(description ="审æ¹å®ä¾ID") private Long instanceId; /** * èç¹å®ä¾ID */ @Schema(description ="èç¹å®ä¾ID") private Long nodeId; /** * 审æ¹ä»»å¡ID */ @Schema(description ="审æ¹ä»»å¡ID") private Long taskId; /** * æä½äººID */ @Schema(description ="æä½äººID") private Long operatorId; /** * æä½äººåç§° */ @Schema(description ="æä½äººåç§°") private String operatorName; /** * æä½ç±»å */ @Schema(description ="æä½ç±»å") private String action; /** * å®¡æ¹æè§ */ @Schema(description ="å®¡æ¹æè§") private String comment; /** * å建人 */ @Schema(description ="å建人") @TableField(fill = FieldFill.INSERT) private Long createUser; /** * å建æ¶é´ */ @Schema(description ="å建æ¶é´") @TableField(fill = FieldFill.INSERT) private LocalDateTime createTime; /** * é»è¾å é¤ */ @Schema(description ="é»è¾å é¤") private Byte deleted; } src/main/java/com/ruoyi/approve/pojo/ApprovalTask.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,128 @@ package com.ruoyi.approve.pojo; import com.baomidou.mybatisplus.annotation.*; import io.swagger.annotations.ApiModel; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Getter; import lombok.Setter; import lombok.ToString; import java.io.Serializable; import java.time.LocalDateTime; /** * <p> * 审æ¹ä»»å¡è¡¨ * </p> * * @author è¯å¯¼è½¯ä»¶ï¼æ±èï¼æéå ¬å¸ * @since 2026-05-18 03:32:37 */ @Getter @Setter @ToString @TableName("approval_task") @ApiModel(value = "ApprovalTask对象", description = "审æ¹ä»»å¡è¡¨") public class ApprovalTask implements Serializable { private static final long serialVersionUID = 1L; /** * 审æ¹ä»»å¡ID */ @Schema(description ="审æ¹ä»»å¡ID") @TableId(value = "id", type = IdType.AUTO) private Long id; /** * 审æ¹å®ä¾ID */ @Schema(description ="审æ¹å®ä¾ID") private Long instanceId; /** * èç¹å®ä¾ID */ @Schema(description ="èç¹å®ä¾ID") private Long nodeId; /** * 审æ¹çº§å« */ @Schema(description ="审æ¹çº§å«") private Integer levelNo; /** * 审æ¹äººID */ @Schema(description ="审æ¹äººID") private Long approverId; /** * 审æ¹äººåç§° */ @Schema(description ="审æ¹äººåç§°") private String approverName; /** * ä»»å¡ç¶æ */ @Schema(description ="ä»»å¡ç¶æ PENDING - å¾ å®¡æ¹ APPROVED - å·²åæ REJECTED - å·²æç»") private String taskStatus; /** * å®¡æ¹æ¶é´ */ @Schema(description ="å®¡æ¹æ¶é´") private LocalDateTime approveTime; /** * å®¡æ¹æè§ */ @Schema(description ="å®¡æ¹æè§") private String comment; /** * æ¯å¦å·²è¯» */ @Schema(description ="æ¯å¦å·²è¯»") private Byte isRead; /** * å建人 */ @Schema(description ="å建人") @TableField(fill = FieldFill.INSERT) private Long createUser; /** * å建æ¶é´ */ @Schema(description ="å建æ¶é´") @TableField(fill = FieldFill.INSERT) private LocalDateTime createTime; /** * æ´æ°äºº */ @Schema(description ="æ´æ°äºº") @TableField(fill = FieldFill.INSERT_UPDATE) private Long updateUser; /** * æ´æ°æ¶é´ */ @Schema(description ="æ´æ°æ¶é´") @TableField(fill = FieldFill.INSERT_UPDATE) private LocalDateTime updateTime; /** * é»è¾å é¤ */ @Schema(description ="é»è¾å é¤") private Byte deleted; @Schema(description ="é¨é¨ID") @TableField(fill = FieldFill.INSERT) private Long deptId; } src/main/java/com/ruoyi/approve/pojo/ApprovalTemplate.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,107 @@ package com.ruoyi.approve.pojo; import com.baomidou.mybatisplus.annotation.*; import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.annotations.ApiModel; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Getter; import lombok.Setter; import lombok.ToString; import org.springframework.format.annotation.DateTimeFormat; import java.io.Serializable; import java.time.LocalDateTime; /** * <p> * å®¡æ¹æ¨¡æ¿è¡¨ * </p> * * @author è¯å¯¼è½¯ä»¶ï¼æ±èï¼æéå ¬å¸ * @since 2026-05-18 11:20:08 */ @Getter @Setter @ToString @TableName("approval_template") @ApiModel(value = "ApprovalTemplate对象", description = "å®¡æ¹æ¨¡æ¿è¡¨") public class ApprovalTemplate implements Serializable { private static final long serialVersionUID = 1L; /** * 模æ¿ID */ @Schema(description ="模æ¿ID") @TableId(value = "id", type = IdType.AUTO) private Long id; /** * 模æ¿åç§° */ @Schema(description ="模æ¿åç§°") private String templateName; /** * å¯ç¨ç¶æï¼1å¯ç¨ï¼0åç¨ */ @Schema(description ="å¯ç¨ç¶æï¼1å¯ç¨ï¼0åç¨") private Byte enabled; /** * 模æ¿è¯´æ */ @Schema(description ="模æ¿è¯´æ") private String description; /** * å建人 */ @Schema(description ="å建人") @TableField(fill = FieldFill.INSERT) private Long createUser; /** * å建æ¶é´ */ @Schema(description ="å建æ¶é´") @TableField(fill = FieldFill.INSERT) @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") private LocalDateTime createTime; /** * æ´æ°äºº */ @Schema(description ="æ´æ°äºº") @TableField(fill = FieldFill.UPDATE) private Long updateUser; /** * æ´æ°æ¶é´ */ @Schema(description ="æ´æ°æ¶é´") @TableField(fill = FieldFill.UPDATE) @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") private LocalDateTime updateTime; /** * é»è¾å é¤ï¼0å¦ï¼1æ¯ */ @Schema(description ="é»è¾å é¤ï¼0å¦ï¼1æ¯") private Integer deleted; @TableField(fill = FieldFill.INSERT) private Long deptId; @Schema(description = "表åé ç½®") private String formConfig; @Schema(description = "模æ¿ç±»åï¼0ç³»ç»å ç½®ï¼1èªå®ä¹") private Integer templateType; @Schema(description = "ä¸å¡ç±»å") private Long businessType; } src/main/java/com/ruoyi/approve/pojo/ApprovalTemplateNode.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,66 @@ package com.ruoyi.approve.pojo; import com.baomidou.mybatisplus.annotation.*; import io.swagger.annotations.ApiModel; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Getter; import lombok.Setter; import lombok.ToString; import java.io.Serializable; import java.time.LocalDateTime; /** * <p> * å®¡æ¹æ¨¡æ¿èç¹è¡¨ * </p> * * @author è¯å¯¼è½¯ä»¶ï¼æ±èï¼æéå ¬å¸ * @since 2026-05-18 11:20:19 */ @Getter @Setter @ToString @TableName("approval_template_node") @ApiModel(value = "ApprovalTemplateNode对象", description = "å®¡æ¹æ¨¡æ¿èç¹è¡¨") public class ApprovalTemplateNode implements Serializable { private static final long serialVersionUID = 1L; /** * èç¹ID */ @Schema(description ="èç¹ID") @TableId(value = "id", type = IdType.AUTO) private Long id; /** * å®¡æ¹æ¨¡æ¿ID */ @Schema(description ="å®¡æ¹æ¨¡æ¿ID") private Long templateId; /** * 审æ¹çº§å«ï¼ä»1å¼å§ */ @Schema(description ="审æ¹çº§å«ï¼ä»1å¼å§") private Integer levelNo; /** * å®¡æ¹æ¹å¼ï¼ANDä¼ç¾ï¼ORæç¾ */ @Schema(description ="å®¡æ¹æ¹å¼ï¼ANDä¼ç¾ï¼ORæç¾") private String approveType; @TableField(fill = FieldFill.INSERT) private Long createUser; @TableField(fill = FieldFill.INSERT) private LocalDateTime createTime; @TableField(fill = FieldFill.UPDATE) private LocalDateTime updateTime; @TableField(fill = FieldFill.INSERT) private Long deptId; } src/main/java/com/ruoyi/approve/pojo/ApprovalTemplateNodeApprover.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,76 @@ package com.ruoyi.approve.pojo; import com.baomidou.mybatisplus.annotation.*; import io.swagger.annotations.ApiModel; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Getter; import lombok.Setter; import lombok.ToString; import java.io.Serializable; import java.time.LocalDateTime; /** * <p> * å®¡æ¹æ¨¡æ¿èç¹å®¡æ¹äººè¡¨ * </p> * * @author è¯å¯¼è½¯ä»¶ï¼æ±èï¼æéå ¬å¸ * @since 2026-05-18 11:20:30 */ @Getter @Setter @ToString @TableName("approval_template_node_approver") @ApiModel(value = "ApprovalTemplateNodeApprover对象", description = "å®¡æ¹æ¨¡æ¿èç¹å®¡æ¹äººè¡¨") public class ApprovalTemplateNodeApprover implements Serializable { private static final long serialVersionUID = 1L; /** * 主é®ID */ @Schema(description = "主é®ID") @TableId(value = "id", type = IdType.AUTO) private Long id; /** * 审æ¹èç¹ID */ @Schema(description ="审æ¹èç¹ID") private Long nodeId; /** * å®¡æ¹æ¨¡æ¿ID */ @Schema(description ="å®¡æ¹æ¨¡æ¿ID") private Long templateId; /** * 审æ¹äººID */ @Schema(description ="审æ¹äººID") private Long approverId; /** * 审æ¹äººåç§°åä½ */ @Schema(description ="审æ¹äººåç§°åä½") private String approverName; /** * 审æ¹äººæåº */ @Schema(description ="审æ¹äººæåº") private Integer sortNo; @TableField(fill = FieldFill.INSERT) private LocalDateTime createTime; @TableField(fill = FieldFill.INSERT) private Long createUser; @TableField(fill = FieldFill.INSERT) private Long deleted ; @TableField(fill = FieldFill.INSERT) private Long deptId; } src/main/java/com/ruoyi/approve/service/ApprovalInstanceNodeService.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,16 @@ package com.ruoyi.approve.service; import com.ruoyi.approve.pojo.ApprovalInstanceNode; import com.baomidou.mybatisplus.extension.service.IService; /** * <p> * 审æ¹èç¹å®ä¾è¡¨ æå¡ç±» * </p> * * @author è¯å¯¼è½¯ä»¶ï¼æ±èï¼æéå ¬å¸ * @since 2026-05-18 03:27:54 */ public interface ApprovalInstanceNodeService extends IService<ApprovalInstanceNode> { } src/main/java/com/ruoyi/approve/service/ApprovalInstanceService.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,29 @@ package com.ruoyi.approve.service; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.approve.bean.dto.ApprovalInstanceDto; import com.ruoyi.approve.bean.vo.ApprovalInstanceVo; import com.ruoyi.approve.pojo.ApprovalInstance; import com.baomidou.mybatisplus.extension.service.IService; import com.ruoyi.framework.web.domain.R; import java.util.List; /** * <p> * 审æ¹å®ä¾è¡¨ æå¡ç±» * </p> * * @author è¯å¯¼è½¯ä»¶ï¼æ±èï¼æéå ¬å¸ * @since 2026-05-18 03:27:46 */ public interface ApprovalInstanceService extends IService<ApprovalInstance> { R listPage(Page<ApprovalInstanceVo> page, ApprovalInstanceDto approvalInstanceDto); Boolean add(ApprovalInstanceDto approvalInstanceDto); Boolean delete(List<Long> ids); R approve(ApprovalInstanceDto approvalInstanceDto); } src/main/java/com/ruoyi/approve/service/ApprovalRecordService.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,16 @@ package com.ruoyi.approve.service; import com.ruoyi.approve.pojo.ApprovalRecord; import com.baomidou.mybatisplus.extension.service.IService; /** * <p> * 审æ¹è®°å½è¡¨ æå¡ç±» * </p> * * @author è¯å¯¼è½¯ä»¶ï¼æ±èï¼æéå ¬å¸ * @since 2026-05-18 03:28:21 */ public interface ApprovalRecordService extends IService<ApprovalRecord> { } src/main/java/com/ruoyi/approve/service/ApprovalTaskService.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,16 @@ package com.ruoyi.approve.service; import com.ruoyi.approve.pojo.ApprovalTask; import com.baomidou.mybatisplus.extension.service.IService; /** * <p> * 审æ¹ä»»å¡è¡¨ æå¡ç±» * </p> * * @author è¯å¯¼è½¯ä»¶ï¼æ±èï¼æéå ¬å¸ * @since 2026-05-18 03:32:37 */ public interface ApprovalTaskService extends IService<ApprovalTask> { } src/main/java/com/ruoyi/approve/service/ApprovalTemplateNodeApproverService.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,16 @@ package com.ruoyi.approve.service; import com.ruoyi.approve.pojo.ApprovalTemplateNodeApprover; import com.baomidou.mybatisplus.extension.service.IService; /** * <p> * å®¡æ¹æ¨¡æ¿èç¹å®¡æ¹äººè¡¨ æå¡ç±» * </p> * * @author è¯å¯¼è½¯ä»¶ï¼æ±èï¼æéå ¬å¸ * @since 2026-05-18 11:20:30 */ public interface ApprovalTemplateNodeApproverService extends IService<ApprovalTemplateNodeApprover> { } src/main/java/com/ruoyi/approve/service/ApprovalTemplateNodeService.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,20 @@ package com.ruoyi.approve.service; import com.ruoyi.approve.bean.dto.ApprovalTemplateNodeDto; import com.ruoyi.approve.pojo.ApprovalTemplateNode; import com.baomidou.mybatisplus.extension.service.IService; import java.util.List; /** * <p> * å®¡æ¹æ¨¡æ¿èç¹è¡¨ æå¡ç±» * </p> * * @author è¯å¯¼è½¯ä»¶ï¼æ±èï¼æéå ¬å¸ * @since 2026-05-18 11:20:19 */ public interface ApprovalTemplateNodeService extends IService<ApprovalTemplateNode> { Boolean saveApprovalTemplateNode(Long id, List<ApprovalTemplateNodeDto> nodes); } src/main/java/com/ruoyi/approve/service/ApprovalTemplateService.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,34 @@ package com.ruoyi.approve.service; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.approve.bean.dto.ApprovalTemplateDto; import com.ruoyi.approve.bean.vo.ApprovalTemplateVo; import com.ruoyi.approve.pojo.ApprovalTemplate; import com.baomidou.mybatisplus.extension.service.IService; import java.util.List; /** * <p> * å®¡æ¹æ¨¡æ¿è¡¨ æå¡ç±» * </p> * * @author è¯å¯¼è½¯ä»¶ï¼æ±èï¼æéå ¬å¸ * @since 2026-05-18 11:20:08 */ public interface ApprovalTemplateService extends IService<ApprovalTemplate> { IPage<ApprovalTemplateVo> listPage(Page<ApprovalTemplateVo> page, ApprovalTemplateDto approvalTemplateDto); Boolean saveApprovalTemplateDto(ApprovalTemplateDto approvalTemplateDto); Boolean updateApprovalTemplateDto(ApprovalTemplateDto approvalTemplateDto); Boolean delete(List<Long> ids); List<ApprovalTemplateVo> listApprovalTemplateVo(Integer type); ApprovalTemplateVo getApprovalTemplateVoById(Long id); } src/main/java/com/ruoyi/approve/service/impl/ApprovalInstanceNodeServiceImpl.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,20 @@ package com.ruoyi.approve.service.impl; import com.ruoyi.approve.pojo.ApprovalInstanceNode; import com.ruoyi.approve.mapper.ApprovalInstanceNodeMapper; import com.ruoyi.approve.service.ApprovalInstanceNodeService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.springframework.stereotype.Service; /** * <p> * 审æ¹èç¹å®ä¾è¡¨ æå¡å®ç°ç±» * </p> * * @author è¯å¯¼è½¯ä»¶ï¼æ±èï¼æéå ¬å¸ * @since 2026-05-18 03:27:54 */ @Service public class ApprovalInstanceNodeServiceImpl extends ServiceImpl<ApprovalInstanceNodeMapper, ApprovalInstanceNode> implements ApprovalInstanceNodeService { } src/main/java/com/ruoyi/approve/service/impl/ApprovalInstanceServiceImpl.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,507 @@ package com.ruoyi.approve.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.approve.bean.dto.ApprovalInstanceDto; import com.ruoyi.approve.bean.vo.ApprovalInstanceVo; import com.ruoyi.approve.mapper.ApprovalInstanceMapper; import com.ruoyi.approve.mapper.ApprovalTemplateMapper; import com.ruoyi.approve.pojo.*; import com.ruoyi.approve.service.*; import com.ruoyi.approve.utils.ApproveProcessConfigNodeUtils; import com.ruoyi.common.enums.*; import com.ruoyi.common.utils.OrderUtils; import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.framework.security.LoginUser; import com.ruoyi.framework.web.domain.R; import com.ruoyi.procurementrecord.utils.StockUtils; import com.ruoyi.project.system.service.ISysNoticeService; import com.ruoyi.purchase.mapper.PurchaseLedgerMapper; import com.ruoyi.purchase.pojo.PurchaseLedger; import com.ruoyi.quality.mapper.QualityInspectMapper; import com.ruoyi.quality.mapper.QualityInspectParamMapper; import com.ruoyi.quality.mapper.QualityTestStandardMapper; import com.ruoyi.quality.mapper.QualityTestStandardParamMapper; import com.ruoyi.quality.utils.QualityInspectHelper; import com.ruoyi.sales.mapper.SalesLedgerProductMapper; import com.ruoyi.sales.mapper.SalesQuotationMapper; import com.ruoyi.sales.mapper.ShippingInfoMapper; import com.ruoyi.sales.pojo.SalesLedgerProduct; import com.ruoyi.sales.pojo.SalesQuotation; import com.ruoyi.sales.pojo.ShippingInfo; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.StringUtils; import java.time.LocalDateTime; import java.util.*; import java.util.stream.Collectors; /** * <p> * 审æ¹å®ä¾æå¡å®ç°ç±» * </p> * * @since 2026-05-18 03:27:46 */ @Service @RequiredArgsConstructor public class ApprovalInstanceServiceImpl extends ServiceImpl<ApprovalInstanceMapper, ApprovalInstance> implements ApprovalInstanceService { private final ApprovalInstanceMapper approvalInstanceMapper; private final ApproveProcessConfigNodeUtils approveProcessConfigNodeUtils; private final ApprovalInstanceNodeService approvalInstanceNodeService; private final ApprovalTaskService approvalTaskService; private final ApprovalRecordService approvalRecordService; private final ApprovalTemplateNodeService approvalTemplateNodeService; private final ApprovalTemplateNodeApproverService approvalTemplateNodeApproverService; private final ISysNoticeService sysNoticeService; private final PurchaseLedgerMapper purchaseLedgerMapper; private final SalesLedgerProductMapper salesLedgerProductMapper; private final StockUtils stockUtils; private final QualityInspectMapper qualityInspectMapper; private final QualityTestStandardMapper qualityTestStandardMapper; private final QualityTestStandardParamMapper qualityTestStandardParamMapper; private final QualityInspectParamMapper qualityInspectParamMapper; private final SalesQuotationMapper salesQuotationMapper; private final ShippingInfoMapper shippingInfoMapper; private final ApprovalTemplateMapper approvalTemplateMapper; private final QualityInspectHelper qualityInspectHelper; @Override public R listPage(Page<ApprovalInstanceVo> page, ApprovalInstanceDto approvalInstanceDto) { IPage<ApprovalInstanceVo> approvalInstanceVoIPage = approvalInstanceMapper.listPage(page, approvalInstanceDto); List<ApprovalInstanceVo> records = approvalInstanceVoIPage.getRecords(); if (records == null || records.isEmpty()) { return R.ok(approvalInstanceVoIPage); } records.forEach(vo -> { vo.setBusinessName(TypeEnums.getLabelByValue(vo.getBusinessType())); }); Long currentUserId = SecurityUtils.getUserId(); List<Long> instanceIds = records.stream() .map(ApprovalInstanceVo::getId) .filter(id -> id != null) .distinct() .collect(Collectors.toList()); if (!instanceIds.isEmpty()) { Map<Long, List<ApprovalRecord>> recordMap = approvalRecordService.list( Wrappers.<ApprovalRecord>lambdaQuery() .in(ApprovalRecord::getInstanceId, instanceIds) .eq(ApprovalRecord::getDeleted, 0) ).stream().collect(Collectors.groupingBy(ApprovalRecord::getInstanceId)); Map<Long, List<ApprovalTask>> taskMap = approvalTaskService.list( Wrappers.<ApprovalTask>lambdaQuery() .in(ApprovalTask::getInstanceId, instanceIds) .eq(ApprovalTask::getDeleted, 0) ).stream().collect(Collectors.groupingBy(ApprovalTask::getInstanceId)); for (ApprovalInstanceVo vo : records) { vo.setIsApprove(approveProcessConfigNodeUtils.isCurrentApprover(vo.getId(), currentUserId)); vo.setRecords(recordMap.getOrDefault(vo.getId(), new ArrayList<>())); vo.setTasks(taskMap.getOrDefault(vo.getId(), new ArrayList<>())); } } return R.ok(approvalInstanceVoIPage); } @Override @Transactional(rollbackFor = Exception.class) public Boolean add(ApprovalInstanceDto approvalInstanceDto) { String instanceNo = OrderUtils.countTodayByCreateTime(approvalInstanceMapper, "SP", "instance_no"); approvalInstanceDto.setInstanceNo(instanceNo); approvalInstanceDto.setStatus("PENDING"); approvalInstanceDto.setCurrentLevel(1); boolean saved = this.save(approvalInstanceDto); if (!saved) { return false; } approveProcessConfigNodeUtils.createCurrentNodeAndTasks(approvalInstanceDto); sendApproveNotice(approvalInstanceDto, approveProcessConfigNodeUtils.getCurrentPendingTasks(approvalInstanceDto.getId())); return true; } @Override @Transactional(rollbackFor = Exception.class) public Boolean delete(List<Long> ids) { if (ids == null || ids.isEmpty()) { return false; } int instanceRows = approvalInstanceMapper.update( null, Wrappers.<ApprovalInstance>lambdaUpdate() .in(ApprovalInstance::getId, ids) .eq(ApprovalInstance::getDeleted, 0) .set(ApprovalInstance::getDeleted, (byte) 1) ); LambdaUpdateWrapper<ApprovalInstanceNode> nodeUpdateWrapper = Wrappers.lambdaUpdate(); nodeUpdateWrapper.in(ApprovalInstanceNode::getInstanceId, ids) .eq(ApprovalInstanceNode::getDeleted, 0) .set(ApprovalInstanceNode::getDeleted, (byte) 1); approvalInstanceNodeService.update(nodeUpdateWrapper); LambdaUpdateWrapper<ApprovalTask> taskUpdateWrapper = Wrappers.lambdaUpdate(); taskUpdateWrapper.in(ApprovalTask::getInstanceId, ids) .eq(ApprovalTask::getDeleted, 0) .set(ApprovalTask::getDeleted, (byte) 1); approvalTaskService.update(taskUpdateWrapper); LambdaUpdateWrapper<ApprovalRecord> recordUpdateWrapper = Wrappers.lambdaUpdate(); recordUpdateWrapper.in(ApprovalRecord::getInstanceId, ids) .eq(ApprovalRecord::getDeleted, 0) .set(ApprovalRecord::getDeleted, (byte) 1); approvalRecordService.update(recordUpdateWrapper); return instanceRows > 0; } @Override @Transactional(rollbackFor = Exception.class) public R approve(ApprovalInstanceDto approvalInstanceDto) { if (approvalInstanceDto == null || approvalInstanceDto.getId() == null) { return R.fail("审æ¹å®ä¾ ID ä¸è½ä¸ºç©º"); } String approveAction = normalizeApproveAction(approvalInstanceDto.getApproveAction()); if (approveAction == null) { return R.fail("审æ¹å¨ä½åªæ¯æ APPROVED æ REJECTED"); } ApprovalInstance instance = getPendingApprovalInstance(approvalInstanceDto.getId()); if (instance == null) { return R.fail("审æ¹å®ä¾ä¸åå¨"); } ApprovalInstanceNode currentNode = approveProcessConfigNodeUtils.getCurrentNode(instance.getId()); if (currentNode == null) { return R.fail("å½å没æå¾ å¤çç审æ¹èç¹"); } Long currentUserId = SecurityUtils.getUserId(); ApprovalTask currentTask = approveProcessConfigNodeUtils.getCurrentUserTask(instance.getId(), currentUserId); if (currentTask == null) { return R.fail("å½åç¨æ·æ²¡æå¯å®¡æ¹ä»»å¡"); } LoginUser loginUser = SecurityUtils.getLoginUser(); String operatorName = loginUser.getUser() != null ? loginUser.getUser().getNickName() : SecurityUtils.getUsername(); LocalDateTime now = LocalDateTime.now(); if (!updateCurrentTask(approvalInstanceDto, approveAction, currentTask, now)) { return R.fail("å½åä»»å¡å·²è¢«å¤çï¼è¯·å·æ°åéè¯"); } saveApprovalRecord( instance.getId(), currentNode.getId(), currentTask.getId(), currentUserId, operatorName, approveAction, approvalInstanceDto.getApproveComment() ); if ("REJECTED".equals(approveAction)) { return rejectCurrentNode(instance, currentNode, now); } if (!approveProcessConfigNodeUtils.canProceedToNextLevel(instance.getId(), currentNode.getApproveType())) { return R.ok("å®¡æ¹æåï¼çå¾ å ¶ä»å®¡æ¹äººå¤ç"); } return approveAndMoveNext(instance, currentNode, approvalInstanceDto, now); } private String normalizeApproveAction(String approveAction) { if (!StringUtils.hasText(approveAction)) { return null; } String normalizedAction = approveAction.trim().toUpperCase(Locale.ROOT); return "APPROVED".equals(normalizedAction) || "REJECTED".equals(normalizedAction) ? normalizedAction : null; } private ApprovalInstance getPendingApprovalInstance(Long instanceId) { return this.getOne( new LambdaQueryWrapper<ApprovalInstance>() .eq(ApprovalInstance::getId, instanceId) .eq(ApprovalInstance::getDeleted, 0) .last("LIMIT 1") ); } private boolean updateCurrentTask(ApprovalInstanceDto approvalInstanceDto, String approveAction, ApprovalTask currentTask, LocalDateTime now) { // ä» å è®¸å¾ å®¡æ¹ä»»å¡è¢«æåå¤ç䏿¬¡ï¼é¿å å¹¶åä¸éå¤å®¡æ¹æåã return approvalTaskService.update( Wrappers.<ApprovalTask>lambdaUpdate() .eq(ApprovalTask::getId, currentTask.getId()) .eq(ApprovalTask::getTaskStatus, "PENDING") .eq(ApprovalTask::getDeleted, 0) .set(ApprovalTask::getTaskStatus, approveAction) .set(ApprovalTask::getComment, approvalInstanceDto.getApproveComment()) .set(ApprovalTask::getApproveTime, now) .set(ApprovalTask::getIsRead, (byte) 1) ); } private R rejectCurrentNode(ApprovalInstance instance, ApprovalInstanceNode currentNode, LocalDateTime now) { if (!updateCurrentNodeStatus(currentNode.getId(), "REJECTED", now)) { return R.ok("å½åèç¹å·²å¤ç宿"); } closePendingTasks(instance.getId(), currentNode.getId()); instance.setStatus("REJECTED"); instance.setFinishTime(now); this.updateById(instance); return R.ok("审æ¹å·²é©³å"); } private R approveAndMoveNext(ApprovalInstance instance, ApprovalInstanceNode currentNode, ApprovalInstanceDto approvalInstanceDto, LocalDateTime now) { if (!updateCurrentNodeStatus(currentNode.getId(), "APPROVED", now)) { return R.ok("å½åèç¹å·²å¤ç宿"); } closePendingTasks(instance.getId(), currentNode.getId()); int nextLevel = currentNode.getLevelNo() + 1; ApprovalTemplateNode nextTemplateNode = approvalTemplateNodeService.getOne( new LambdaQueryWrapper<ApprovalTemplateNode>() .eq(ApprovalTemplateNode::getTemplateId, instance.getTemplateId()) .eq(ApprovalTemplateNode::getLevelNo, nextLevel) .orderByAsc(ApprovalTemplateNode::getId) .last("LIMIT 1") ); if (nextTemplateNode == null) { instance.setStatus("APPROVED"); instance.setFinishTime(now); this.updateById(instance); handleBusinessAfterApprovalFinished(instance); return R.ok("审æ¹å·²å®æ"); } instance.setCurrentLevel(nextLevel); instance.setStatus("PENDING"); this.updateById(instance); approveProcessConfigNodeUtils.createCurrentNodeAndTasks(instance, false); sendApproveNotice(instance, approveProcessConfigNodeUtils.getCurrentPendingTasks(approvalInstanceDto.getId())); return R.ok("å®¡æ¹æåï¼å·²æµè½¬å°ä¸ä¸èç¹"); } private boolean updateCurrentNodeStatus(Long nodeId, String targetStatus, LocalDateTime now) { // ä» å 许ä¸ä¸ªè¯·æ±å°å½åèç¹ä»å¾ å¤çæ¨è¿å°ç®æ ç¶æï¼é¿å é夿µè½¬ã return approvalInstanceNodeService.update( Wrappers.<ApprovalInstanceNode>lambdaUpdate() .eq(ApprovalInstanceNode::getId, nodeId) .eq(ApprovalInstanceNode::getStatus, "PENDING") .eq(ApprovalInstanceNode::getDeleted, 0) .set(ApprovalInstanceNode::getStatus, targetStatus) .set(ApprovalInstanceNode::getFinishTime, now) ); } private void handleBusinessAfterApprovalFinished(ApprovalInstance instance) { String status = instance.getStatus(); Long businessType = instance.getBusinessType(); if (TypeEnums.PURCHASE_APPROVAL.getCode().equals(businessType)) { handlePurchaseApprovalFinished(instance, status); return; } if (TypeEnums.QUOTATION_APPROVAL.getCode().equals(businessType)) { handleSalesQuotationApprovalFinished(instance, status); return; } if (TypeEnums.SHIPPING_APPROVAL.getCode().equals(businessType)) { handleShippingApprovalFinished(instance, status); } } private void handlePurchaseApprovalFinished(ApprovalInstance instance, String status) { PurchaseLedger purchaseLedger = purchaseLedgerMapper.selectOne( new LambdaQueryWrapper<PurchaseLedger>() .eq(PurchaseLedger::getPurchaseContractNumber, instance.getTitle()) .last("limit 1") ); if (purchaseLedger == null) { return; } if ("APPROVED".equals(status)) { purchaseLedger.setApprovalStatus(ApprovalStatusEnum.APPROVED.getCode()); List<SalesLedgerProduct> salesLedgerProducts = salesLedgerProductMapper.selectList( new QueryWrapper<SalesLedgerProduct>().lambda() .eq(SalesLedgerProduct::getSalesLedgerId, purchaseLedger.getId()) .eq(SalesLedgerProduct::getType, 2) ); for (SalesLedgerProduct salesLedgerProduct : salesLedgerProducts) { if (salesLedgerProduct.getIsChecked()) { qualityInspectHelper.addQualityInspect(purchaseLedger, salesLedgerProduct); } else { stockUtils.addStockWithBatchNo( salesLedgerProduct.getProductModelId(), salesLedgerProduct.getQuantity(), StockInQualifiedRecordTypeEnum.PURCHASE_STOCK_IN.getCode(), purchaseLedger.getId(), purchaseLedger.getPurchaseContractNumber() + "-" + salesLedgerProduct.getId() ); } } } else if ("REJECTED".equals(status)) { purchaseLedger.setApprovalStatus(ApprovalStatusEnum.REJECTED.getCode()); } else if ("PENDING".equals(status)) { purchaseLedger.setApprovalStatus(ApprovalStatusEnum.IN_PROGRESS.getCode()); } purchaseLedgerMapper.updateById(purchaseLedger); } private void handleSalesQuotationApprovalFinished(ApprovalInstance instance, String status) { SalesQuotation salesQuote = salesQuotationMapper.selectOne( new LambdaQueryWrapper<SalesQuotation>() .eq(SalesQuotation::getQuotationNo, instance.getTitle()) .last("limit 1") ); if (salesQuote == null) { return; } if ("APPROVED".equals(status)) { salesQuote.setStatus(SalesQuotationStatusEnum.APPROVED.getCode()); } else if ("REJECTED".equals(status)) { salesQuote.setStatus(SalesQuotationStatusEnum.REJECTED.getCode()); } else if ("PENDING".equals(status)) { salesQuote.setStatus(SalesQuotationStatusEnum.IN_PROGRESS.getCode()); } salesQuotationMapper.updateById(salesQuote); } private void handleShippingApprovalFinished(ApprovalInstance instance, String status) { ShippingInfo shippingInfo = shippingInfoMapper.selectOne( new LambdaQueryWrapper<ShippingInfo>() .eq(ShippingInfo::getShippingNo, instance.getTitle()) .orderByDesc(ShippingInfo::getCreateTime) .last("limit 1") ); if (shippingInfo == null) { return; } if ("APPROVED".equals(status)) { shippingInfo.setStatus(ShippingStatusEnum.APPROVED.getCode()); shippingInfo.setShippingDate(new Date()); stockUtils.shipmentStatus(StockOutQualifiedRecordTypeEnum.SALE_SHIP_STOCK_OUT.getCode(), shippingInfo.getId()); } else if ("REJECTED".equals(status)) { stockUtils.deleteStockOutRecord(shippingInfo.getId(), StockOutQualifiedRecordTypeEnum.SALE_SHIP_STOCK_OUT.getCode()); shippingInfo.setStatus(ShippingStatusEnum.REJECTED.getCode()); } else if ("PENDING".equals(status)) { shippingInfo.setStatus(ShippingStatusEnum.IN_PROGRESS.getCode()); } shippingInfoMapper.updateById(shippingInfo); } private List<ApprovalTask> createNodeAndTasks(ApprovalInstance instance, ApprovalTemplateNode templateNode) { List<ApprovalTemplateNodeApprover> approvers = approvalTemplateNodeApproverService.list( new LambdaQueryWrapper<ApprovalTemplateNodeApprover>() .eq(ApprovalTemplateNodeApprover::getTemplateId, instance.getTemplateId()) .eq(ApprovalTemplateNodeApprover::getNodeId, templateNode.getId()) .eq(ApprovalTemplateNodeApprover::getDeleted, 0L) .orderByAsc(ApprovalTemplateNodeApprover::getSortNo) ); if (approvers == null || approvers.isEmpty()) { throw new RuntimeException("ä¸ä¸å®¡æ¹èç¹æªé 置审æ¹äºº"); } ApprovalInstanceNode instanceNode = new ApprovalInstanceNode(); instanceNode.setInstanceId(instance.getId()); instanceNode.setLevelNo(templateNode.getLevelNo()); instanceNode.setApproveType(templateNode.getApproveType()); instanceNode.setStatus("PENDING"); instanceNode.setStartTime(LocalDateTime.now()); instanceNode.setDeleted((byte) 0); approvalInstanceNodeService.save(instanceNode); List<ApprovalTask> taskList = new ArrayList<>(approvers.size()); for (ApprovalTemplateNodeApprover approver : approvers) { ApprovalTask task = new ApprovalTask(); task.setInstanceId(instance.getId()); task.setNodeId(instanceNode.getId()); task.setLevelNo(instanceNode.getLevelNo()); task.setApproverId(approver.getApproverId()); task.setApproverName(approver.getApproverName()); task.setTaskStatus("PENDING"); task.setIsRead((byte) 0); task.setDeleted((byte) 0); taskList.add(task); } approvalTaskService.saveBatch(taskList); return taskList; } private void sendApproveNotice(ApprovalInstance instance, List<ApprovalTask> tasks) { if (instance == null || tasks == null || tasks.isEmpty()) { return; } List<Long> approverIds = tasks.stream() .map(ApprovalTask::getApproverId) .filter(id -> id != null && id > 0) .distinct() .collect(Collectors.toList()); if (approverIds.isEmpty()) { return; } String title = StringUtils.hasText(instance.getTemplateName()) ? instance.getTemplateName() : "å®¡æ¹æé"; String message = "审æ¹åå· " + instance.getInstanceNo() + " éè¦æ¨å®¡æ¹"; String jumpPath = "/approvalInstance?id=" + instance.getId(); sysNoticeService.simpleNoticeByUser(title, message, approverIds, jumpPath); } private void closePendingTasks(Long instanceId, Long nodeId) { LambdaUpdateWrapper<ApprovalTask> updateWrapper = Wrappers.lambdaUpdate(); updateWrapper.eq(ApprovalTask::getInstanceId, instanceId) .eq(ApprovalTask::getNodeId, nodeId) .eq(ApprovalTask::getTaskStatus, "PENDING") .eq(ApprovalTask::getDeleted, 0) .set(ApprovalTask::getDeleted, (byte) 1); approvalTaskService.update(updateWrapper); } private void saveApprovalRecord(Long instanceId, Long nodeId, Long taskId, Long operatorId, String operatorName, String action, String comment) { ApprovalRecord record = new ApprovalRecord(); record.setInstanceId(instanceId); record.setNodeId(nodeId); record.setTaskId(taskId); record.setOperatorId(operatorId); record.setOperatorName(operatorName); record.setAction(action); record.setComment(comment); record.setDeleted((byte) 0); approvalRecordService.save(record); } } src/main/java/com/ruoyi/approve/service/impl/ApprovalRecordServiceImpl.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,20 @@ package com.ruoyi.approve.service.impl; import com.ruoyi.approve.pojo.ApprovalRecord; import com.ruoyi.approve.mapper.ApprovalRecordMapper; import com.ruoyi.approve.service.ApprovalRecordService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.springframework.stereotype.Service; /** * <p> * 审æ¹è®°å½è¡¨ æå¡å®ç°ç±» * </p> * * @author è¯å¯¼è½¯ä»¶ï¼æ±èï¼æéå ¬å¸ * @since 2026-05-18 03:28:21 */ @Service public class ApprovalRecordServiceImpl extends ServiceImpl<ApprovalRecordMapper, ApprovalRecord> implements ApprovalRecordService { } src/main/java/com/ruoyi/approve/service/impl/ApprovalTaskServiceImpl.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,20 @@ package com.ruoyi.approve.service.impl; import com.ruoyi.approve.pojo.ApprovalTask; import com.ruoyi.approve.mapper.ApprovalTaskMapper; import com.ruoyi.approve.service.ApprovalTaskService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.springframework.stereotype.Service; /** * <p> * 审æ¹ä»»å¡è¡¨ æå¡å®ç°ç±» * </p> * * @author è¯å¯¼è½¯ä»¶ï¼æ±èï¼æéå ¬å¸ * @since 2026-05-18 03:32:37 */ @Service public class ApprovalTaskServiceImpl extends ServiceImpl<ApprovalTaskMapper, ApprovalTask> implements ApprovalTaskService { } src/main/java/com/ruoyi/approve/service/impl/ApprovalTemplateNodeApproverServiceImpl.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,20 @@ package com.ruoyi.approve.service.impl; import com.ruoyi.approve.pojo.ApprovalTemplateNodeApprover; import com.ruoyi.approve.mapper.ApprovalTemplateNodeApproverMapper; import com.ruoyi.approve.service.ApprovalTemplateNodeApproverService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.springframework.stereotype.Service; /** * <p> * å®¡æ¹æ¨¡æ¿èç¹å®¡æ¹äººè¡¨ æå¡å®ç°ç±» * </p> * * @author è¯å¯¼è½¯ä»¶ï¼æ±èï¼æéå ¬å¸ * @since 2026-05-18 11:20:30 */ @Service public class ApprovalTemplateNodeApproverServiceImpl extends ServiceImpl<ApprovalTemplateNodeApproverMapper, ApprovalTemplateNodeApprover> implements ApprovalTemplateNodeApproverService { } src/main/java/com/ruoyi/approve/service/impl/ApprovalTemplateNodeServiceImpl.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,62 @@ package com.ruoyi.approve.service.impl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.approve.bean.dto.ApprovalTemplateNodeApproverDto; import com.ruoyi.approve.bean.dto.ApprovalTemplateNodeDto; import com.ruoyi.approve.mapper.ApprovalTemplateNodeMapper; import com.ruoyi.approve.pojo.ApprovalTemplateNode; import com.ruoyi.approve.pojo.ApprovalTemplateNodeApprover; import com.ruoyi.approve.service.ApprovalTemplateNodeApproverService; import com.ruoyi.approve.service.ApprovalTemplateNodeService; import lombok.RequiredArgsConstructor; import org.springframework.beans.BeanUtils; import org.springframework.stereotype.Service; import java.util.ArrayList; import java.util.List; /** * <p> * å®¡æ¹æ¨¡æ¿èç¹è¡¨ æå¡å®ç°ç±» * </p> * * @author è¯å¯¼è½¯ä»¶ï¼æ±èï¼æéå ¬å¸ * @since 2026-05-18 11:20:19 */ @Service @RequiredArgsConstructor public class ApprovalTemplateNodeServiceImpl extends ServiceImpl<ApprovalTemplateNodeMapper, ApprovalTemplateNode> implements ApprovalTemplateNodeService { private final ApprovalTemplateNodeMapper approvalTemplateNodeMapper; private final ApprovalTemplateNodeApproverService approvalTemplateNodeApproverService; @Override public Boolean saveApprovalTemplateNode(Long templateId, List<ApprovalTemplateNodeDto> nodes) { if (nodes == null || nodes.isEmpty()) { throw new RuntimeException("èç¹å表ä¸è½ä¸ºç©º"); } List<ApprovalTemplateNodeApprover> approverList = new ArrayList<>(); for (ApprovalTemplateNodeDto nodeDto : nodes) { ApprovalTemplateNode node = new ApprovalTemplateNode(); BeanUtils.copyProperties(nodeDto, node); node.setTemplateId(templateId); approvalTemplateNodeMapper.insert(node); List<ApprovalTemplateNodeApproverDto> approvers = nodeDto.getApprovers(); if (approvers == null || approvers.isEmpty()) { throw new RuntimeException("èç¹å®¡æ¹äººä¸è½ä¸ºç©º"); } for (ApprovalTemplateNodeApproverDto approverDto : approvers) { ApprovalTemplateNodeApprover approver = new ApprovalTemplateNodeApprover(); BeanUtils.copyProperties(approverDto, approver); approver.setNodeId(node.getId()); approver.setTemplateId(templateId); approver.setDeleted(0L); approverList.add(approver); } } approvalTemplateNodeApproverService.saveBatch(approverList); return true; } } src/main/java/com/ruoyi/approve/service/impl/ApprovalTemplateServiceImpl.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,251 @@ package com.ruoyi.approve.service.impl; import cn.hutool.core.collection.CollUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.approve.bean.dto.ApprovalTemplateDto; import com.ruoyi.approve.bean.vo.ApprovalTemplateNodeApproverVo; import com.ruoyi.approve.bean.vo.ApprovalTemplateNodeVo; import com.ruoyi.approve.bean.vo.ApprovalTemplateVo; import com.ruoyi.approve.mapper.ApprovalTemplateMapper; import com.ruoyi.approve.mapper.ApprovalTemplateNodeApproverMapper; import com.ruoyi.approve.pojo.ApprovalTemplate; import com.ruoyi.approve.pojo.ApprovalTemplateNode; import com.ruoyi.approve.pojo.ApprovalTemplateNodeApprover; import com.ruoyi.approve.service.ApprovalTemplateNodeService; import com.ruoyi.approve.service.ApprovalTemplateService; import lombok.RequiredArgsConstructor; import org.springframework.beans.BeanUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.Collections; import java.util.Comparator; import java.util.List; import java.util.Map; import java.util.stream.Collectors; /** * <p> * å®¡æ¹æ¨¡æ¿æå¡å®ç°ç±» * </p> * * @since 2026-05-18 11:20:08 */ @Service @RequiredArgsConstructor public class ApprovalTemplateServiceImpl extends ServiceImpl<ApprovalTemplateMapper, ApprovalTemplate> implements ApprovalTemplateService { private final ApprovalTemplateMapper approvalTemplateMapper; private final ApprovalTemplateNodeService approvalTemplateNodeService; private final ApprovalTemplateNodeApproverMapper approvalTemplateNodeApproverMapper; @Override public IPage<ApprovalTemplateVo> listPage(Page<ApprovalTemplateVo> page, ApprovalTemplateDto approvalTemplateDto) { IPage<ApprovalTemplateVo> approvalTemplateVoIPage = approvalTemplateMapper.listPage(page, approvalTemplateDto); fillTemplateVoNodes(approvalTemplateVoIPage.getRecords()); return approvalTemplateVoIPage; } @Override @Transactional(rollbackFor = Exception.class) public Boolean saveApprovalTemplateDto(ApprovalTemplateDto approvalTemplateDto) { approvalTemplateMapper.insert(approvalTemplateDto); approvalTemplateNodeService.remove( new LambdaQueryWrapper<ApprovalTemplateNode>() .eq(ApprovalTemplateNode::getTemplateId, approvalTemplateDto.getId()) ); approvalTemplateNodeApproverMapper.delete( new LambdaQueryWrapper<ApprovalTemplateNodeApprover>() .eq(ApprovalTemplateNodeApprover::getTemplateId, approvalTemplateDto.getId()) ); return approvalTemplateNodeService.saveApprovalTemplateNode( approvalTemplateDto.getId(), approvalTemplateDto.getNodes() ); } @Override public Boolean updateApprovalTemplateDto(ApprovalTemplateDto approvalTemplateDto) { approvalTemplateMapper.updateById(approvalTemplateDto); approvalTemplateNodeService.remove( new LambdaQueryWrapper<ApprovalTemplateNode>() .eq(ApprovalTemplateNode::getTemplateId, approvalTemplateDto.getId()) ); approvalTemplateNodeApproverMapper.delete( new LambdaQueryWrapper<ApprovalTemplateNodeApprover>() .eq(ApprovalTemplateNodeApprover::getTemplateId, approvalTemplateDto.getId()) ); return approvalTemplateNodeService.saveApprovalTemplateNode( approvalTemplateDto.getId(), approvalTemplateDto.getNodes() ); } @Transactional(rollbackFor = Exception.class) public Boolean delete(List<Long> ids) { if (ids == null || ids.isEmpty()) { return false; } ApprovalTemplate updateEntity = new ApprovalTemplate(); updateEntity.setDeleted(1); LambdaUpdateWrapper<ApprovalTemplate> updateWrapper = Wrappers.lambdaUpdate(); updateWrapper.in(ApprovalTemplate::getId, ids) .eq(ApprovalTemplate::getDeleted, 0); int rows = approvalTemplateMapper.update(updateEntity, updateWrapper); return rows == ids.size(); } @Override public List<ApprovalTemplateVo> listApprovalTemplateVo(Integer type) { List<ApprovalTemplate> templateList = this.list( new LambdaQueryWrapper<ApprovalTemplate>() .eq(ApprovalTemplate::getDeleted, 0) .eq(ApprovalTemplate::getEnabled, 1) .eq(type != null, ApprovalTemplate::getTemplateType, type) .orderByDesc(ApprovalTemplate::getTemplateType) .orderByDesc(ApprovalTemplate::getId) ); if (CollUtil.isEmpty(templateList)) { return Collections.emptyList(); } List<ApprovalTemplateVo> templateVos = templateList.stream() .map(template -> { ApprovalTemplateVo templateVo = new ApprovalTemplateVo(); BeanUtils.copyProperties(template, templateVo); return templateVo; }) .collect(Collectors.toList()); fillTemplateVoNodes(templateVos); return templateVos; } @Override public ApprovalTemplateVo getApprovalTemplateVoById(Long id) { if (id == null) { throw new IllegalArgumentException("åæ° id ä¸è½ä¸ºç©º"); } ApprovalTemplate template = this.getOne( new LambdaQueryWrapper<ApprovalTemplate>() .eq(ApprovalTemplate::getId, id) .eq(ApprovalTemplate::getDeleted, 0) ); if (template == null) { throw new IllegalArgumentException("模æ¿ä¸åå¨"); } List<ApprovalTemplateNode> nodeList = approvalTemplateNodeService.list( new LambdaQueryWrapper<ApprovalTemplateNode>() .eq(ApprovalTemplateNode::getTemplateId, id) .orderByAsc(ApprovalTemplateNode::getLevelNo) ); List<ApprovalTemplateNodeApprover> approverList = approvalTemplateNodeApproverMapper.selectList( new LambdaQueryWrapper<ApprovalTemplateNodeApprover>() .eq(ApprovalTemplateNodeApprover::getTemplateId, id) .eq(ApprovalTemplateNodeApprover::getDeleted, 0L) ); Map<Long, List<ApprovalTemplateNode>> nodeMap = nodeList.stream() .collect(Collectors.groupingBy(ApprovalTemplateNode::getTemplateId)); Map<Long, List<ApprovalTemplateNodeApprover>> approverMap = approverList.stream() .collect(Collectors.groupingBy(ApprovalTemplateNodeApprover::getNodeId)); return buildTemplateVo(template, nodeMap, approverMap); } /** * æ¹éå¡«å æ¨¡æ¿èç¹åèç¹å®¡æ¹äººï¼é¿å å¾ªç¯æ¥åºã */ private void fillTemplateVoNodes(List<ApprovalTemplateVo> templateVos) { if (CollUtil.isEmpty(templateVos)) { return; } List<Long> templateIds = templateVos.stream() .map(ApprovalTemplateVo::getId) .collect(Collectors.toList()); List<ApprovalTemplateNode> nodeList = approvalTemplateNodeService.list( new LambdaQueryWrapper<ApprovalTemplateNode>() .in(ApprovalTemplateNode::getTemplateId, templateIds) .orderByAsc(ApprovalTemplateNode::getLevelNo) ); List<ApprovalTemplateNodeApprover> approverList = approvalTemplateNodeApproverMapper.selectList( new LambdaQueryWrapper<ApprovalTemplateNodeApprover>() .in(ApprovalTemplateNodeApprover::getTemplateId, templateIds) .eq(ApprovalTemplateNodeApprover::getDeleted, 0L) ); Map<Long, List<ApprovalTemplateNode>> nodeMap = nodeList.stream() .collect(Collectors.groupingBy(ApprovalTemplateNode::getTemplateId)); Map<Long, List<ApprovalTemplateNodeApprover>> approverMap = approverList.stream() .collect(Collectors.groupingBy(ApprovalTemplateNodeApprover::getNodeId)); templateVos.forEach(templateVo -> templateVo.setNodes( nodeMap.getOrDefault(templateVo.getId(), Collections.emptyList()) .stream() .sorted(Comparator.comparing( ApprovalTemplateNode::getLevelNo, Comparator.nullsLast(Integer::compareTo) )) .map(node -> buildNodeVo(node, approverMap)) .collect(Collectors.toList()) )); } private ApprovalTemplateVo buildTemplateVo(ApprovalTemplate template, Map<Long, List<ApprovalTemplateNode>> nodeMap, Map<Long, List<ApprovalTemplateNodeApprover>> approverMap) { ApprovalTemplateVo templateVo = new ApprovalTemplateVo(); BeanUtils.copyProperties(template, templateVo); List<ApprovalTemplateNodeVo> nodeVos = nodeMap .getOrDefault(template.getId(), Collections.emptyList()) .stream() .sorted(Comparator.comparing( ApprovalTemplateNode::getLevelNo, Comparator.nullsLast(Integer::compareTo) )) .map(node -> buildNodeVo(node, approverMap)) .collect(Collectors.toList()); templateVo.setNodes(nodeVos); return templateVo; } private ApprovalTemplateNodeVo buildNodeVo(ApprovalTemplateNode node, Map<Long, List<ApprovalTemplateNodeApprover>> approverMap) { ApprovalTemplateNodeVo nodeVo = new ApprovalTemplateNodeVo(); BeanUtils.copyProperties(node, nodeVo); List<ApprovalTemplateNodeApproverVo> approverVos = approverMap .getOrDefault(node.getId(), Collections.emptyList()) .stream() .sorted(Comparator.comparing( ApprovalTemplateNodeApprover::getSortNo, Comparator.nullsLast(Integer::compareTo) )) .map(this::buildApproverVo) .collect(Collectors.toList()); nodeVo.setApprovers(approverVos); return nodeVo; } private ApprovalTemplateNodeApproverVo buildApproverVo(ApprovalTemplateNodeApprover approver) { ApprovalTemplateNodeApproverVo approverVo = new ApprovalTemplateNodeApproverVo(); BeanUtils.copyProperties(approver, approverVo); return approverVo; } } src/main/java/com/ruoyi/approve/utils/ApproveProcessConfigNodeUtils.java
@@ -1,9 +1,370 @@ package com.ruoyi.approve.utils; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.ruoyi.approve.pojo.ApprovalInstance; import com.ruoyi.approve.pojo.ApprovalInstanceNode; import com.ruoyi.approve.pojo.ApprovalRecord; import com.ruoyi.approve.pojo.ApprovalTask; import com.ruoyi.approve.pojo.ApprovalTemplateNode; import com.ruoyi.approve.pojo.ApprovalTemplateNodeApprover; import com.ruoyi.approve.service.ApprovalInstanceNodeService; import com.ruoyi.approve.service.ApprovalRecordService; import com.ruoyi.approve.service.ApprovalTaskService; import com.ruoyi.approve.service.ApprovalTemplateNodeApproverService; import com.ruoyi.approve.service.ApprovalTemplateNodeService; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; import java.time.LocalDateTime; import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; /** * å®¡æ¹æµç¨èç¹å·¥å ·ç±» */ @Component @RequiredArgsConstructor public class ApproveProcessConfigNodeUtils { private final ApprovalInstanceNodeService instanceNodeService; private final ApprovalTaskService approvalTaskService; private final ApprovalRecordService approvalRecordService; private final ApprovalTemplateNodeService approvalTemplateNodeService; private final ApprovalTemplateNodeApproverService approvalTemplateNodeApproverService; /** * æå½åå±çº§å建审æ¹èç¹å审æ¹ä»»å¡ã * 该éè½½ä¼åæ¶åå ¥ä¸æ¡å起审æ¹è®°å½ã */ @Transactional(rollbackFor = Exception.class) public ApprovalInstanceNode createCurrentNodeAndTasks(ApprovalInstance instance) { return createCurrentNodeAndTasks(instance, true); } /** * æå½åå±çº§å建审æ¹èç¹å审æ¹ä»»å¡ã * * @param instance 审æ¹å®ä¾ * @param createSubmitRecord æ¯å¦å建å起审æ¹è®°å½ * @return å建åºçå½åèç¹å®ä¾ */ @Transactional(rollbackFor = Exception.class) public ApprovalInstanceNode createCurrentNodeAndTasks(ApprovalInstance instance, boolean createSubmitRecord) { if (instance == null || instance.getId() == null) { throw new RuntimeException("审æ¹å®ä¾ä¸è½ä¸ºç©º"); } if (instance.getTemplateId() == null) { throw new RuntimeException("å®¡æ¹æ¨¡æ¿ä¸è½ä¸ºç©º"); } Integer currentLevel = instance.getCurrentLevel() == null ? 1 : instance.getCurrentLevel(); ApprovalInstanceNode existsNode = instanceNodeService.getOne( new LambdaQueryWrapper<ApprovalInstanceNode>() .eq(ApprovalInstanceNode::getInstanceId, instance.getId()) .eq(ApprovalInstanceNode::getLevelNo, currentLevel) .eq(ApprovalInstanceNode::getDeleted, 0) .last("LIMIT 1") ); if (existsNode != null) { return existsNode; } ApprovalTemplateNode templateNode = approvalTemplateNodeService.getOne( new LambdaQueryWrapper<ApprovalTemplateNode>() .eq(ApprovalTemplateNode::getTemplateId, instance.getTemplateId()) .eq(ApprovalTemplateNode::getLevelNo, currentLevel) .orderByAsc(ApprovalTemplateNode::getId) .last("LIMIT 1") ); if (templateNode == null) { throw new RuntimeException("æªæ¾å°å½åå±çº§å¯¹åºçå®¡æ¹æ¨¡æ¿èç¹"); } List<ApprovalTemplateNodeApprover> approvers = approvalTemplateNodeApproverService.list( new LambdaQueryWrapper<ApprovalTemplateNodeApprover>() .eq(ApprovalTemplateNodeApprover::getTemplateId, instance.getTemplateId()) .eq(ApprovalTemplateNodeApprover::getNodeId, templateNode.getId()) .eq(ApprovalTemplateNodeApprover::getDeleted, 0L) .orderByAsc(ApprovalTemplateNodeApprover::getSortNo) ); if (approvers == null || approvers.isEmpty()) { throw new RuntimeException("å½å审æ¹èç¹æªé 置审æ¹äºº"); } ApprovalInstanceNode instanceNode = new ApprovalInstanceNode(); instanceNode.setInstanceId(instance.getId()); instanceNode.setLevelNo(templateNode.getLevelNo()); instanceNode.setApproveType(templateNode.getApproveType()); instanceNode.setStatus("PENDING"); instanceNode.setStartTime(LocalDateTime.now()); instanceNode.setDeleted((byte) 0); instanceNodeService.save(instanceNode); List<ApprovalTask> taskList = new ArrayList<>(approvers.size()); for (ApprovalTemplateNodeApprover approver : approvers) { ApprovalTask task = new ApprovalTask(); task.setInstanceId(instance.getId()); task.setNodeId(instanceNode.getId()); task.setLevelNo(instanceNode.getLevelNo()); task.setApproverId(approver.getApproverId()); task.setApproverName(approver.getApproverName()); task.setTaskStatus("PENDING"); task.setIsRead((byte) 0); task.setDeleted((byte) 0); taskList.add(task); } approvalTaskService.saveBatch(taskList); if (createSubmitRecord) { ApprovalRecord record = new ApprovalRecord(); record.setInstanceId(instance.getId()); record.setNodeId(instanceNode.getId()); record.setOperatorId(instance.getApplicantId()); record.setOperatorName(instance.getApplicantName()); record.setAction("SUBMIT"); record.setComment("å起审æ¹"); record.setDeleted((byte) 0); approvalRecordService.save(record); } return instanceNode; } /** * æ¥è¯¢å½åå¾ å¤çèç¹ã */ public ApprovalInstanceNode getCurrentNode(Long instanceId) { if (instanceId == null) { return null; } return instanceNodeService.getOne( new LambdaQueryWrapper<ApprovalInstanceNode>() .eq(ApprovalInstanceNode::getInstanceId, instanceId) .eq(ApprovalInstanceNode::getStatus, "PENDING") .eq(ApprovalInstanceNode::getDeleted, 0) .orderByAsc(ApprovalInstanceNode::getLevelNo) .last("LIMIT 1") ); } /** * æ¥è¯¢å½å审æ¹å±çº§ã */ public Integer getCurrentLevel(Long instanceId) { ApprovalInstanceNode currentNode = getCurrentNode(instanceId); return currentNode != null ? currentNode.getLevelNo() : null; } /** * æ¥è¯¢å½åèç¹ä¸çå¾ å®¡æ¹ä»»å¡ã */ public List<ApprovalTask> getCurrentPendingTasks(Long instanceId) { if (instanceId == null) { return List.of(); } ApprovalInstanceNode currentNode = getCurrentNode(instanceId); if (currentNode == null) { return List.of(); } return approvalTaskService.list( new LambdaQueryWrapper<ApprovalTask>() .eq(ApprovalTask::getInstanceId, instanceId) .eq(ApprovalTask::getNodeId, currentNode.getId()) .eq(ApprovalTask::getTaskStatus, "PENDING") .eq(ApprovalTask::getDeleted, 0) .orderByAsc(ApprovalTask::getLevelNo) ); } /** * æ¥è¯¢å½åç¨æ·å¨å½åèç¹ä¸çå¾ å®¡æ¹ä»»å¡ã */ public ApprovalTask getCurrentUserTask(Long instanceId, Long userId) { if (instanceId == null || userId == null) { return null; } ApprovalInstanceNode currentNode = getCurrentNode(instanceId); if (currentNode == null) { return null; } return approvalTaskService.getOne( new LambdaQueryWrapper<ApprovalTask>() .eq(ApprovalTask::getInstanceId, instanceId) .eq(ApprovalTask::getNodeId, currentNode.getId()) .eq(ApprovalTask::getApproverId, userId) .eq(ApprovalTask::getTaskStatus, "PENDING") .eq(ApprovalTask::getDeleted, 0) .last("LIMIT 1") ); } /** * 夿å½åç¨æ·æ¯å¦æ¯å½å审æ¹äººã */ public boolean isCurrentApprover(Long instanceId, Long userId) { return getCurrentUserTask(instanceId, userId) != null; } /** * æ¥è¯¢å½åèç¹ç审æ¹äºº ID å表ã */ public List<Long> getCurrentNodeApproverIds(Long instanceId) { return getCurrentPendingTasks(instanceId).stream() .map(ApprovalTask::getApproverId) .distinct() .collect(Collectors.toList()); } /** * æ¥è¯¢å½åèç¹å©ä½å¾ 审æ¹äººæ°ã */ public int getRemainingApproverCount(Long instanceId) { return getCurrentPendingTasks(instanceId).size(); } /** * æ¥è¯¢å½åèç¹å·²åæäººæ°ã */ public int getApprovedCount(Long instanceId) { if (instanceId == null) { return 0; } ApprovalInstanceNode currentNode = getCurrentNode(instanceId); if (currentNode == null) { return 0; } return Math.toIntExact(approvalTaskService.count( new LambdaQueryWrapper<ApprovalTask>() .eq(ApprovalTask::getInstanceId, instanceId) .eq(ApprovalTask::getNodeId, currentNode.getId()) .eq(ApprovalTask::getTaskStatus, "APPROVED") .eq(ApprovalTask::getDeleted, 0) )); } /** * æ¥è¯¢å½åèç¹å·²æç»äººæ°ã */ public int getRejectedCount(Long instanceId) { if (instanceId == null) { return 0; } ApprovalInstanceNode currentNode = getCurrentNode(instanceId); if (currentNode == null) { return 0; } return Math.toIntExact(approvalTaskService.count( new LambdaQueryWrapper<ApprovalTask>() .eq(ApprovalTask::getInstanceId, instanceId) .eq(ApprovalTask::getNodeId, currentNode.getId()) .eq(ApprovalTask::getTaskStatus, "REJECTED") .eq(ApprovalTask::getDeleted, 0) )); } /** * 夿å½åèç¹æ¯å¦å¯ä»¥æµè½¬å°ä¸ä¸å±ã */ public boolean canProceedToNextLevel(Long instanceId, String approveType) { if (instanceId == null || approveType == null) { return false; } if (getRejectedCount(instanceId) > 0) { return false; } int totalApproverCount = getCurrentPendingTasks(instanceId).size() + getApprovedCount(instanceId); int approvedCount = getApprovedCount(instanceId); if ("AND".equalsIgnoreCase(approveType)) { return approvedCount > 0 && approvedCount == totalApproverCount; } if ("OR".equalsIgnoreCase(approveType)) { return approvedCount > 0; } return false; } /** * æ¥è¯¢å½åç¨æ·å¨å½åèç¹ä¸çä»»å¡ç¶æã */ public String getUserTaskStatus(Long instanceId, Long userId) { if (instanceId == null || userId == null) { return null; } ApprovalInstanceNode currentNode = getCurrentNode(instanceId); if (currentNode == null) { return null; } ApprovalTask task = approvalTaskService.getOne( new LambdaQueryWrapper<ApprovalTask>() .eq(ApprovalTask::getInstanceId, instanceId) .eq(ApprovalTask::getNodeId, currentNode.getId()) .eq(ApprovalTask::getApproverId, userId) .eq(ApprovalTask::getDeleted, 0) .last("LIMIT 1") ); return task != null ? task.getTaskStatus() : null; } /** * æ¥è¯¢æå®ç¨æ·çå ¨é¨å¾ 审æ¹ä»»å¡ã */ public List<ApprovalTask> getUserAllPendingTasks(Long userId) { if (userId == null) { return List.of(); } return approvalTaskService.list( new LambdaQueryWrapper<ApprovalTask>() .eq(ApprovalTask::getApproverId, userId) .eq(ApprovalTask::getTaskStatus, "PENDING") .eq(ApprovalTask::getDeleted, 0) .orderByDesc(ApprovalTask::getCreateTime) ); } /** * æ¥è¯¢å®¡æ¹å®ä¾çè¿åº¦æè¦ã */ public String getApprovalProgress(Long instanceId) { if (instanceId == null) { return "æ æç审æ¹å®ä¾"; } ApprovalInstanceNode currentNode = getCurrentNode(instanceId); if (currentNode == null) { return "审æ¹å·²å®ææå°æªå¼å§"; } int approvedCount = getApprovedCount(instanceId); int rejectedCount = getRejectedCount(instanceId); int pendingCount = getRemainingApproverCount(instanceId); int totalCount = approvedCount + rejectedCount + pendingCount; return String.format( "第%d级审æ¹ï¼æ»äººæ°=%dï¼å·²åæ=%dï¼å·²æç»=%dï¼å¾ 审æ¹=%d", currentNode.getLevelNo(), totalCount, approvedCount, rejectedCount, pendingCount ); } } src/main/java/com/ruoyi/basic/enums/RecordTypeEnum.java
@@ -205,7 +205,9 @@ SALES_RECEIPT_RETURN("sales_receipt_return"), ACCOUNT_EXPENSE("account_expense"), FIN_VOUCHER("fin_voucher"), ACCOUNT_FILE("account_file"); ACCOUNT_FILE("account_file"), APPROVAL_INSTANCE("approval_instance"); private final String type; RecordTypeEnum(String type) { this.type = type; } src/main/java/com/ruoyi/common/enums/ApprovalStatusEnum.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,48 @@ package com.ruoyi.common.enums; import lombok.AllArgsConstructor; import lombok.Getter; /** * 审æ¹ç¶ææä¸¾ */ @Getter @AllArgsConstructor public enum ApprovalStatusEnum implements BaseEnum<Integer> { DRAFT(0, "è稿"), PENDING(1, "å¾ å®¡æ¹"), IN_PROGRESS(2, "审æ¹ä¸"), APPROVED(3, "å·²éè¿"), REJECTED(4, "已驳å"); private final Integer value; private final String label; @Override public Integer getCode() { return value; } @Override public String getValue() { return label; } public static ApprovalStatusEnum fromValue(Integer value) { if (value == null) { return null; } for (ApprovalStatusEnum status : values()) { if (status.getCode().equals(value)) { return status; } } return null; } public static String getLabelByValue(Integer value) { ApprovalStatusEnum statusEnum = fromValue(value); return statusEnum != null ? statusEnum.getValue() : "æªç¥ç¶æ"; } } src/main/java/com/ruoyi/common/enums/SalesQuotationStatusEnum.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,43 @@ package com.ruoyi.common.enums; import lombok.AllArgsConstructor; import lombok.Getter; /** * é宿¥ä»·ç¶ææä¸¾ */ @Getter @AllArgsConstructor public enum SalesQuotationStatusEnum implements BaseEnum<String> { DRAFT("è稿", "è稿"), PENDING("å¾ å®¡æ¹", "å¾ å®¡æ¹"), IN_PROGRESS("å®¡æ ¸ä¸", "å®¡æ ¸ä¸"), APPROVED("éè¿", "éè¿"), REJECTED("æç»", "æç»"); private final String value; private final String label; @Override public String getCode() { return value; } @Override public String getValue() { return label; } public static SalesQuotationStatusEnum fromValue(String value) { if (value == null) { return null; } for (SalesQuotationStatusEnum status : values()) { if (status.getCode().equals(value)) { return status; } } return null; } } src/main/java/com/ruoyi/common/enums/ShippingStatusEnum.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,42 @@ package com.ruoyi.common.enums; import lombok.AllArgsConstructor; import lombok.Getter; /** * å货审æ¹ç¶ææä¸¾ */ @Getter @AllArgsConstructor public enum ShippingStatusEnum implements BaseEnum<String> { PENDING("å¾ ç¡®è®¤", "å¾ ç¡®è®¤"), IN_PROGRESS("å®¡æ ¸ä¸", "å®¡æ ¸ä¸"), APPROVED("å®¡æ ¸éè¿", "å®¡æ ¸éè¿"), REJECTED("å®¡æ ¸æç»", "å®¡æ ¸æç»"); private final String value; private final String label; @Override public String getCode() { return value; } @Override public String getValue() { return label; } public static ShippingStatusEnum fromValue(String value) { if (value == null) { return null; } for (ShippingStatusEnum status : values()) { if (status.getCode().equals(value)) { return status; } } return null; } } src/main/java/com/ruoyi/common/enums/TypeEnums.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,70 @@ package com.ruoyi.common.enums; import lombok.AllArgsConstructor; import lombok.Getter; @Getter @AllArgsConstructor public enum TypeEnums implements BaseEnum<Long> { PUBLIC_OUT(1L, "å ¬åºç®¡ç"), LEAVE(2L, "请å管ç"), BUSINESS_TRIP(3L, "åºå·®ç®¡ç"), REIMBURSEMENT(4L, "æ¥é管ç"), PURCHASE_APPROVAL(5L, "éè´å®¡æ¹"), QUOTATION_APPROVAL(6L, "æ¥ä»·å®¡æ¹"), SHIPPING_APPROVAL(7L, "å货审æ¹"), DANGEROUS_OPERATION(8L, "å±é©ä½ä¸å®¡æ¹"), OFFICE_SUPPLIES(9L, "åå ¬ç¨å审æ¹"), REGULARIZATION_APPROVAL(10L, "转æ£å®¡æ¹"), TRANSFER_APPROVAL(11L, "è°å¨å®¡æ¹"), RESIGNATION_APPROVAL(12L, "离è审æ¹"), WORK_HANDOVER_APPROVAL(13L, "å·¥ä½äº¤æ¥å®¡æ¹"), LEAVE_APPROVAL(14L, "请å审æ¹"), OVERTIME_APPROVAL(15L, "å ç审æ¹"), TRAVEL_REIMBURSEMENT_APPROVAL(16L, "åºå·®æ¥é审æ¹"), EXPENSE_APPROVAL(17L, "è´¹ç¨å®¡æ¹"), ENTERPRISE_NEWS_APPROVAL(18L, "ä¼ä¸æ°é»å®¡æ¹"); private final Long value; private final String label; @Override public Long getCode() { return value; } @Override public String getValue() { return label; } /** * æ ¹æ®å¼è·å对åºçæä¸¾ * @param value ä¸å¡ç±»åå¼ * @return 对åºçæä¸¾ï¼æªå¹é è¿ånull */ public static TypeEnums fromValue(Long value) { if (value == null) { return null; } for (TypeEnums type : values()) { if (type.getCode().equals(value)) { return type; } } return null; } /** * æ ¹æ®å¼è·åæè¿° * @param value ä¸å¡ç±»åå¼ * @return ä¸å¡ç±»åæè¿°ï¼æªå¹é è¿å"èªå®ä¹å®¡æ¹" */ public static String getLabelByValue(Long value) { TypeEnums typeEnum = fromValue(value); return typeEnum != null ? typeEnum.getValue() : "èªå®ä¹å®¡æ¹"; } } src/main/java/com/ruoyi/production/controller/ProductionOrderRoutingController.java
@@ -39,7 +39,7 @@ @PostMapping("/updateRouteItem") @Operation(summary = "ä¿®æ¹ç产订åçå·¥èºè·¯çº¿è¯¦æ ") public R updateRouteItem(@RequestBody ProductionOrderRoutingOperation productionOrderRoutingOperation) { return R.ok(productionOrderRoutingOperationService.updateById(productionOrderRoutingOperation)); return R.ok(productionOrderRoutingOperationService.updateRouteItem(productionOrderRoutingOperation)); } @DeleteMapping("/deleteRouteItem/{id}") src/main/java/com/ruoyi/production/service/ProductionOrderRoutingOperationService.java
@@ -11,4 +11,6 @@ R deleteRouteItem(Long id); int sortRouteItem(ProductionOrderRoutingOperation productionOrderRoutingOperation); Boolean updateRouteItem(ProductionOrderRoutingOperation productionOrderRoutingOperation); } src/main/java/com/ruoyi/production/service/impl/ProductionOrderRoutingOperationServiceImpl.java
@@ -182,4 +182,11 @@ } return 0; } @Override public Boolean updateRouteItem(ProductionOrderRoutingOperation productionOrderRoutingOperation) { //æ ¹æ®æ¯å¦çäº§å¤ææ¯å¦éè¦å é¤å¯¹åºçå·¥å return null; } } src/main/java/com/ruoyi/purchase/pojo/PurchaseLedger.java
@@ -166,4 +166,7 @@ @TableField(fill = FieldFill.INSERT) private Long deptId; @Schema(description = "模æ¿id") private Long templateId; } src/main/java/com/ruoyi/purchase/service/impl/PurchaseLedgerServiceImpl.java
@@ -6,8 +6,12 @@ import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.approve.bean.dto.ApprovalInstanceDto; import com.ruoyi.approve.bean.vo.ApproveProcessVO; import com.ruoyi.approve.mapper.ApprovalTemplateMapper; import com.ruoyi.approve.pojo.ApprovalInstance; import com.ruoyi.approve.pojo.ApproveProcess; import com.ruoyi.approve.service.ApprovalInstanceService; import com.ruoyi.approve.service.impl.ApproveProcessServiceImpl; import com.ruoyi.basic.enums.ApplicationTypeEnum; import com.ruoyi.basic.enums.RecordTypeEnum; @@ -112,6 +116,8 @@ private final ApproveProcessServiceImpl approveProcessService; private final ProcurementRecordMapper procurementRecordStorageMapper; private final FileUtil fileUtil; private final ApprovalInstanceService approvalInstanceService; private final ApprovalTemplateMapper approvalTemplateMapper; @Override public List<PurchaseLedger> selectPurchaseLedgerList(PurchaseLedger purchaseLedger) { @@ -162,7 +168,7 @@ if (purchaseLedger.getId() == null) { purchaseLedgerMapper.insert(purchaseLedger); } else { // å é¤éè´å®¡æ ¸ï¼éæ°æäº¤ // // å é¤éè´å®¡æ ¸ï¼éæ°æäº¤ ApproveProcess one = approveProcessService.getOne(new LambdaQueryWrapper<ApproveProcess>() .eq(ApproveProcess::getApproveType, 5) .eq(ApproveProcess::getApproveReason, purchaseLedger.getPurchaseContractNumber()) @@ -172,8 +178,22 @@ approveProcessService.delByIds(Collections.singletonList(one.getId())); } purchaseLedgerMapper.updateById(purchaseLedger); //å 餿°éè´å®¡æ¹ approvalInstanceService.remove(new LambdaQueryWrapper<ApprovalInstance>().eq(ApprovalInstance::getBusinessId, purchaseLedger.getId()).eq(ApprovalInstance::getBusinessType, 5)); } //æ°éè´å®¡æ¹ ApprovalInstanceDto approvalInstanceDto = new ApprovalInstanceDto(); approvalInstanceDto.setTemplateId(purchaseLedger.getTemplateId()); approvalInstanceDto.setBusinessId(purchaseLedger.getId()); approvalInstanceDto.setBusinessType(5L); approvalInstanceDto.setTitle("éè´ååå·ï¼" + purchaseLedger.getPurchaseContractNumber()); approvalInstanceDto.setApplicantId(SecurityUtils.getUserId()); approvalInstanceDto.setTemplateId(purchaseLedger.getTemplateId()); approvalInstanceDto.setTemplateName(approvalTemplateMapper.selectById(purchaseLedger.getTemplateId()).getTemplateName()); approvalInstanceDto.setApplicantName(SecurityUtils.getLoginUser().getNickName()); approvalInstanceDto.setApplyTime(LocalDateTime.now()); approvalInstanceService.add(approvalInstanceDto); // 4. å¤çåè¡¨æ°æ® List<SalesLedgerProduct> productList = purchaseLedgerDto.getProductData(); if (productList != null && !productList.isEmpty()) { @@ -493,10 +513,29 @@ @Override public IPage<PurchaseLedgerDto> selectPurchaseLedgerListPage(IPage ipage, PurchaseLedgerDto purchaseLedger) { IPage<PurchaseLedgerDto> purchaseLedgerDtoIPage = purchaseLedgerMapper.selectPurchaseLedgerListPage(ipage, purchaseLedger); purchaseLedgerDtoIPage.getRecords().forEach(purchaseLedgerDto -> { List<CommonFile> commonFiles = commonFileMapper.selectList(new LambdaQueryWrapper<CommonFile>().eq(CommonFile::getCommonId, purchaseLedgerDto.getId()).eq(CommonFile::getType, FileNameType.PURCHASE.getValue())); purchaseLedgerDto.setSalesLedgerFiles(commonFiles); }); List<PurchaseLedgerDto> records = purchaseLedgerDtoIPage.getRecords(); if (records == null || records.isEmpty()) { return purchaseLedgerDtoIPage; } // æ¹éæ¥è¯¢æä»¶ï¼é¿å N+1 é®é¢ List<Long> ledgerIds = records.stream() .map(PurchaseLedgerDto::getId) .filter(Objects::nonNull) .collect(Collectors.toList()); if (!ledgerIds.isEmpty()) { List<CommonFile> allFiles = commonFileMapper.selectList( new LambdaQueryWrapper<CommonFile>() .in(CommonFile::getCommonId, ledgerIds) .eq(CommonFile::getType, FileNameType.PURCHASE.getValue()) ); Map<Long, List<CommonFile>> fileMap = allFiles.stream() .collect(Collectors.groupingBy(CommonFile::getCommonId)); records.forEach(dto -> dto.setSalesLedgerFiles(fileMap.getOrDefault(dto.getId(), new ArrayList<>()))); } return purchaseLedgerDtoIPage; } @@ -642,9 +681,9 @@ return AjaxResult.success("å¯¼å ¥æå"); } catch (Exception e) { e.printStackTrace(); log.error("PurchaseLedgerServiceImpl importData error", e); return AjaxResult.error("å¯¼å ¥å¤±è´¥: " + e.getMessage()); } return AjaxResult.success("å¯¼å ¥å¤±è´¥"); } @Override src/main/java/com/ruoyi/quality/utils/QualityInspectHelper.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,73 @@ package com.ruoyi.quality.utils; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.ruoyi.common.utils.bean.BeanUtils; import com.ruoyi.purchase.pojo.PurchaseLedger; import com.ruoyi.quality.mapper.QualityInspectMapper; import com.ruoyi.quality.mapper.QualityInspectParamMapper; import com.ruoyi.quality.mapper.QualityTestStandardMapper; import com.ruoyi.quality.mapper.QualityTestStandardParamMapper; import com.ruoyi.quality.pojo.QualityInspect; import com.ruoyi.quality.pojo.QualityInspectParam; import com.ruoyi.quality.pojo.QualityTestStandard; import com.ruoyi.quality.pojo.QualityTestStandardParam; import com.ruoyi.sales.pojo.SalesLedgerProduct; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Component; import java.util.List; /** * è´¨æ£ååå»ºå·¥å ·ç±» */ @Component @RequiredArgsConstructor public class QualityInspectHelper { private final QualityInspectMapper qualityInspectMapper; private final QualityTestStandardMapper qualityTestStandardMapper; private final QualityTestStandardParamMapper qualityTestStandardParamMapper; private final QualityInspectParamMapper qualityInspectParamMapper; /** * å建质æ£å * @param purchaseLedger éè´å°è´¦ * @param saleProduct éè´äº§å */ public void addQualityInspect(PurchaseLedger purchaseLedger, SalesLedgerProduct saleProduct) { QualityInspect qualityInspect = new QualityInspect(); qualityInspect.setInspectType(0); qualityInspect.setSupplier(purchaseLedger.getSupplierName()); qualityInspect.setPurchaseLedgerId(purchaseLedger.getId()); qualityInspect.setProductId(saleProduct.getProductId()); qualityInspect.setProductName(saleProduct.getProductCategory()); qualityInspect.setModel(saleProduct.getSpecificationModel()); qualityInspect.setProductModelId(saleProduct.getProductModelId()); qualityInspect.setUnit(saleProduct.getUnit()); qualityInspect.setQuantity(saleProduct.getQuantity()); qualityInspectMapper.insert(qualityInspect); List<QualityTestStandard> qualityTestStandardList = qualityTestStandardMapper .getQualityTestStandardByProductId(saleProduct.getProductId(), 0, null); if (qualityTestStandardList.isEmpty()) { return; } QualityTestStandard firstStandard = qualityTestStandardList.get(0); qualityInspect.setTestStandardId(firstStandard.getId()); qualityInspectMapper.updateById(qualityInspect); List<QualityTestStandardParam> standardParams = qualityTestStandardParamMapper.selectList( Wrappers.<QualityTestStandardParam>lambdaQuery() .eq(QualityTestStandardParam::getTestStandardId, firstStandard.getId())); for (QualityTestStandardParam standardParam : standardParams) { QualityInspectParam param = new QualityInspectParam(); BeanUtils.copyProperties(standardParam, param); param.setId(null); param.setInspectId(qualityInspect.getId()); qualityInspectParamMapper.insert(param); } } } src/main/java/com/ruoyi/sales/controller/ShippingInfoController.java
@@ -2,7 +2,10 @@ import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.approve.bean.dto.ApprovalInstanceDto; import com.ruoyi.approve.bean.vo.ApproveProcessVO; import com.ruoyi.approve.mapper.ApprovalTemplateMapper; import com.ruoyi.approve.service.ApprovalInstanceService; import com.ruoyi.approve.service.impl.ApproveProcessServiceImpl; import com.ruoyi.common.utils.OrderUtils; import com.ruoyi.common.utils.SecurityUtils; @@ -26,6 +29,7 @@ import java.io.IOException; import java.time.LocalDate; import java.time.LocalDateTime; import java.util.List; /** @@ -38,6 +42,8 @@ @AllArgsConstructor public class ShippingInfoController extends BaseController { private final ApprovalTemplateMapper approvalTemplateMapper; private final ApprovalInstanceService approvalInstanceService; private ShippingInfoService shippingInfoService; private ApproveProcessServiceImpl approveProcessService; private ShippingInfoMapper shippingInfoMapper; @@ -66,6 +72,19 @@ approveProcessVO.setApproveUser(loginUser.getUserId()); approveProcessVO.setApproveTime(LocalDate.now().toString()); approveProcessService.addApprove(approveProcessVO); ApprovalInstanceDto approvalInstanceDto = new ApprovalInstanceDto(); approvalInstanceDto.setTemplateId(req.getTemplateId()); approvalInstanceDto.setBusinessId(req.getId()); approvalInstanceDto.setBusinessType(7L); approvalInstanceDto.setTitle("åè´§ç¼å·ï¼" + sh); approvalInstanceDto.setApplicantId(SecurityUtils.getUserId()); approvalInstanceDto.setTemplateId(req.getTemplateId()); approvalInstanceDto.setTemplateName(approvalTemplateMapper.selectById(req.getTemplateId()).getTemplateName()); approvalInstanceDto.setApplicantName(SecurityUtils.getLoginUser().getNickName()); approvalInstanceDto.setApplyTime(LocalDateTime.now()); approvalInstanceService.add(approvalInstanceDto); // æ·»å åè´§æ¶æ¯ req.setShippingNo(sh); req.setStatus("å¾ å®¡æ ¸"); src/main/java/com/ruoyi/sales/dto/SalesQuotationDto.java
@@ -17,4 +17,6 @@ */ // 审æ¹äºº private String approveUserIds; private Long templateId; } src/main/java/com/ruoyi/sales/dto/ShippingInfoDto.java
@@ -47,5 +47,9 @@ //åè´§æ°é private BigDecimal totalQuantity; private Long templateId; private String templateName; } src/main/java/com/ruoyi/sales/service/impl/SalesQuotationServiceImpl.java
@@ -7,10 +7,13 @@ import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.approve.pojo.ApproveProcess; import com.ruoyi.approve.service.impl.ApproveProcessServiceImpl; import com.ruoyi.approve.bean.dto.ApprovalInstanceDto; import com.ruoyi.approve.bean.vo.ApproveGetAndUpdateVo; import com.ruoyi.approve.bean.vo.ApproveProcessVO; import com.ruoyi.approve.mapper.ApprovalTemplateMapper; import com.ruoyi.approve.pojo.ApproveProcess; import com.ruoyi.approve.service.ApprovalInstanceService; import com.ruoyi.approve.service.impl.ApproveProcessServiceImpl; import com.ruoyi.basic.mapper.CustomerMapper; import com.ruoyi.basic.pojo.Customer; import com.ruoyi.common.enums.IsDeleteEnum; @@ -30,8 +33,8 @@ import org.springframework.transaction.annotation.Transactional; import java.time.LocalDate; import java.util.Collections; import java.util.List; import java.time.LocalDateTime; import java.util.*; import java.util.stream.Collectors; @Service @@ -44,6 +47,8 @@ private final ApproveProcessServiceImpl approveProcessService; private final CustomerMapper customerMapper; private final ApprovalTemplateMapper approvalTemplateMapper; private final ApprovalInstanceService approvalInstanceService; @Override public IPage<SalesQuotationDto> listPage(Page page, SalesQuotationDto salesQuotationDto) { @@ -51,10 +56,26 @@ if(CollectionUtils.isEmpty(salesQuotationDtoIPage.getRecords())){ return salesQuotationDtoIPage; } salesQuotationDtoIPage.getRecords().forEach(record -> { List<SalesQuotationProduct> products = salesQuotationProductMapper.selectBySalesQuotationId(record.getId()); record.setProducts(products); }); // æ¹éæ¥è¯¢äº§åï¼é¿å N+1 é®é¢ List<Long> quotationIds = salesQuotationDtoIPage.getRecords().stream() .map(SalesQuotationDto::getId) .filter(Objects::nonNull) .collect(Collectors.toList()); if (!quotationIds.isEmpty()) { List<SalesQuotationProduct> allProducts = salesQuotationProductMapper.selectList( new LambdaQueryWrapper<SalesQuotationProduct>() .in(SalesQuotationProduct::getSalesQuotationId, quotationIds) ); Map<Long, List<SalesQuotationProduct>> productMap = allProducts.stream() .collect(Collectors.groupingBy(SalesQuotationProduct::getSalesQuotationId)); salesQuotationDtoIPage.getRecords().forEach(record -> record.setProducts(productMap.getOrDefault(record.getId(), new ArrayList<>())) ); } return salesQuotationDtoIPage; } @@ -94,9 +115,20 @@ try { approveProcessService.addApprove(approveProcessVO); }catch (Exception e){ log.error("SalesQuotationServiceImpl error:{}", e); throw new RuntimeException("审æ¹å¤±è´¥"); log.error("SalesQuotationServiceImpl approve error for quotationNo: {}", e); throw new RuntimeException("审æ¹å¤±è´¥: " + e.getMessage(), e); } // æ¥ä»·å®¡æ¹ ApprovalInstanceDto approvalInstanceDto = new ApprovalInstanceDto(); approvalInstanceDto.setTemplateId(salesQuotationDto.getTemplateId()); approvalInstanceDto.setBusinessId(salesQuotationDto.getId()); approvalInstanceDto.setBusinessType(7L); approvalInstanceDto.setTitle("æ¥ä»·ç¼å·ï¼" + quotationNo); approvalInstanceDto.setApplicantId(SecurityUtils.getUserId()); approvalInstanceDto.setTemplateName(approvalTemplateMapper.selectById(salesQuotationDto.getTemplateId()).getTemplateName()); approvalInstanceDto.setApplicantName(SecurityUtils.getLoginUser().getNickName()); approvalInstanceDto.setApplyTime(LocalDateTime.now()); approvalInstanceService.add(approvalInstanceDto); return true; } @Override src/main/resources/mapper/approve/ApprovalInstanceMapper.xml
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,42 @@ <?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.ruoyi.approve.mapper.ApprovalInstanceMapper"> <!-- éç¨æ¥è¯¢æ å°ç»æ --> <resultMap id="BaseResultMap" type="com.ruoyi.approve.pojo.ApprovalInstance"> <id column="id" property="id" /> <result column="instance_no" property="instanceNo" /> <result column="template_id" property="templateId" /> <result column="template_name" property="templateName" /> <result column="business_id" property="businessId" /> <result column="business_type" property="businessType" /> <result column="title" property="title" /> <result column="status" property="status" /> <result column="current_level" property="currentLevel" /> <result column="applicant_id" property="applicantId" /> <result column="applicant_name" property="applicantName" /> <result column="apply_time" property="applyTime" /> <result column="finish_time" property="finishTime" /> <result column="create_user" property="createUser" /> <result column="create_time" property="createTime" /> <result column="update_user" property="updateUser" /> <result column="update_time" property="updateTime" /> <result column="deleted" property="deleted" /> </resultMap> <select id="listPage" resultType="com.ruoyi.approve.bean.vo.ApprovalInstanceVo"> select ai.*,su.nick_name as create_user_name from approval_instance ai left join sys_user su on ai.create_user = su.user_id <where> deleted = 0 <if test="ew.instanceNo != null"> and instance_no like concat('%',#{ew.instanceNo},'%') </if> <if test="ew.templateName != null"> and template_name like concat('%',#{ew.templateName},'%') </if> </where> order by ai.id desc </select> </mapper> src/main/resources/mapper/approve/ApprovalInstanceNodeMapper.xml
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,21 @@ <?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.ruoyi.approve.mapper.ApprovalInstanceNodeMapper"> <!-- éç¨æ¥è¯¢æ å°ç»æ --> <resultMap id="BaseResultMap" type="com.ruoyi.approve.pojo.ApprovalInstanceNode"> <id column="id" property="id" /> <result column="instance_id" property="instanceId" /> <result column="level_no" property="levelNo" /> <result column="approve_type" property="approveType" /> <result column="status" property="status" /> <result column="start_time" property="startTime" /> <result column="finish_time" property="finishTime" /> <result column="create_user" property="createUser" /> <result column="create_time" property="createTime" /> <result column="update_user" property="updateUser" /> <result column="update_time" property="updateTime" /> <result column="deleted" property="deleted" /> </resultMap> </mapper> src/main/resources/mapper/approve/ApprovalRecordMapper.xml
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,20 @@ <?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.ruoyi.approve.mapper.ApprovalRecordMapper"> <!-- éç¨æ¥è¯¢æ å°ç»æ --> <resultMap id="BaseResultMap" type="com.ruoyi.approve.pojo.ApprovalRecord"> <id column="id" property="id" /> <result column="instance_id" property="instanceId" /> <result column="node_id" property="nodeId" /> <result column="task_id" property="taskId" /> <result column="operator_id" property="operatorId" /> <result column="operator_name" property="operatorName" /> <result column="action" property="action" /> <result column="comment" property="comment" /> <result column="create_user" property="createUser" /> <result column="create_time" property="createTime" /> <result column="deleted" property="deleted" /> </resultMap> </mapper> src/main/resources/mapper/approve/ApprovalTaskMapper.xml
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,24 @@ <?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.ruoyi.approve.mapper.ApprovalTaskMapper"> <!-- éç¨æ¥è¯¢æ å°ç»æ --> <resultMap id="BaseResultMap" type="com.ruoyi.approve.pojo.ApprovalTask"> <id column="id" property="id" /> <result column="instance_id" property="instanceId" /> <result column="node_id" property="nodeId" /> <result column="level_no" property="levelNo" /> <result column="approver_id" property="approverId" /> <result column="approver_name" property="approverName" /> <result column="task_status" property="taskStatus" /> <result column="approve_time" property="approveTime" /> <result column="comment" property="comment" /> <result column="is_read" property="isRead" /> <result column="create_user" property="createUser" /> <result column="create_time" property="createTime" /> <result column="update_user" property="updateUser" /> <result column="update_time" property="updateTime" /> <result column="deleted" property="deleted" /> </resultMap> </mapper> src/main/resources/mapper/approve/ApprovalTemplateMapper.xml
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,33 @@ <?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.ruoyi.approve.mapper.ApprovalTemplateMapper"> <!-- éç¨æ¥è¯¢æ å°ç»æ --> <resultMap id="BaseResultMap" type="com.ruoyi.approve.pojo.ApprovalTemplate"> <id column="id" property="id" /> <result column="template_name" property="templateName" /> <result column="enabled" property="enabled" /> <result column="description" property="description" /> <result column="deleted" property="deleted" /> <result column="dept_id" property="deptId" /> </resultMap> <select id="listPage" resultType="com.ruoyi.approve.bean.vo.ApprovalTemplateVo"> select at.*,su.nick_name as create_user_name from approval_template at left join sys_user su on at.create_user = su.user_id <where> deleted = 0 <if test="ew.templateName != null"> and template_name like concat('%',#{ew.templateName},'%') </if> <if test="ew.templateType != null"> and template_type = #{ew.templateType} </if> <if test="ew.enabled != null"> and enabled = #{ew.enabled} </if> </where> order by at.id desc </select> </mapper> src/main/resources/mapper/approve/ApprovalTemplateNodeApproverMapper.xml
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,16 @@ <?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.ruoyi.approve.mapper.ApprovalTemplateNodeApproverMapper"> <!-- éç¨æ¥è¯¢æ å°ç»æ --> <resultMap id="BaseResultMap" type="com.ruoyi.approve.pojo.ApprovalTemplateNodeApprover"> <id column="id" property="id" /> <result column="node_id" property="nodeId" /> <result column="template_id" property="templateId" /> <result column="approver_id" property="approverId" /> <result column="approver_name" property="approverName" /> <result column="sort_no" property="sortNo" /> <result column="created_time" property="createdTime" /> </resultMap> </mapper> src/main/resources/mapper/approve/ApprovalTemplateNodeMapper.xml
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,15 @@ <?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.ruoyi.approve.mapper.ApprovalTemplateNodeMapper"> <!-- éç¨æ¥è¯¢æ å°ç»æ --> <resultMap id="BaseResultMap" type="com.ruoyi.approve.pojo.ApprovalTemplateNode"> <id column="id" property="id" /> <result column="template_id" property="templateId" /> <result column="level_no" property="levelNo" /> <result column="approve_type" property="approveType" /> <result column="created_time" property="createdTime" /> <result column="updated_time" property="updatedTime" /> </resultMap> </mapper>