This commit is contained in:
lijiaqi 2023-05-30 17:24:00 +08:00
parent a3bb75cdbe
commit f5a7076b91
451 changed files with 6043 additions and 256 deletions

View File

@ -1,5 +1,7 @@
package com.ydool.common.constant; package com.ydool.common.constant;
import com.ydool.integrated.entity.Institution;
public interface UrlConstant { public interface UrlConstant {
/** /**
* 后台根路径 * 后台根路径
@ -28,6 +30,15 @@ public interface UrlConstant {
String JOB = API + "/job"; String JOB = API + "/job";
String DOCUMENT = API + "/document";
String INSTITUTION = API + "/institution";
String STUDY = API + "/study";
String NOTICE = API + "/notice";
String FOODTYPE = API + "/foodType";
String FOODRESERVES = API + "/foodReserves";
String FOODRESERVESLOG = API + "/foodReservesLog";
String WORKFLOW = API + "/workFlow";
String PERSON = API + "/person"; String PERSON = API + "/person";
String EXCHANGE = API + "/exchange"; String EXCHANGE = API + "/exchange";

View File

@ -20,18 +20,18 @@ import com.ydool.common.base.BaseService;
*/ */
public class Generator { public class Generator {
private static String url = "jdbc:mysql://10.0.0.200:3306/lc_oa?useSSL=false&zeroDateTimeBehavior=convertToNull&useUnicode=true&characterEncoding=UTF8&autoReconnect=true&serverTimezone=Asia/Shanghai"; private static String url = "jdbc:mysql://localhost:3306/lc_oa?useSSL=false&zeroDateTimeBehavior=convertToNull&useUnicode=true&characterEncoding=UTF8&autoReconnect=true&serverTimezone=Asia/Shanghai";
private static String username = "lc_oa"; private static String username = "root";
private static String password = "wZxxeSJjtTzT2iAk"; private static String password = "Wang09211108";
private static String driverName = "com.mysql.cj.jdbc.Driver"; private static String driverName = "com.mysql.cj.jdbc.Driver";
public static void main(String[] args) { public static void main(String[] args) {
//表名 //表名
String tableName = "t_lc_personnel_middle"; String tableName = "t_work_flow_notice";
//表前缀 //表前缀
String tablePrefix = "t_lc_"; String tablePrefix = "t_";
//作者 //作者
String author = "msh"; String author = "zhouyuan";
generate(tableName, tablePrefix, author); generate(tableName, tablePrefix, author);
} }
@ -52,7 +52,7 @@ public class Generator {
//带swagger注解 //带swagger注解
gc.setSwagger2(true); gc.setSwagger2(true);
//实现类不要Impl后缀 //实现类不要Impl后缀
// gc.setServiceImplName("%sService"); gc.setServiceImplName("%sService");
mpg.setGlobalConfig(gc); mpg.setGlobalConfig(gc);
//数据源 //数据源
@ -66,10 +66,9 @@ public class Generator {
//包配置 //包配置
PackageConfig pc = new PackageConfig(); PackageConfig pc = new PackageConfig();
pc.setParent("com.ydool.staff"); pc.setParent("com.ydool.oa.workFlow");
pc.setEntity("entity"); pc.setEntity("entity");
pc.setServiceImpl("service"); pc.setServiceImpl("service");
pc.setServiceImpl("service.impl");
pc.setMapper("mapper"); pc.setMapper("mapper");
mpg.setPackageInfo(pc); mpg.setPackageInfo(pc);
@ -99,14 +98,12 @@ public class Generator {
//指定生成模块 //指定生成模块
//可见不是模块null才会生成指定模块 //可见不是模块null才会生成指定模块
TemplateConfig templateConfig = new TemplateConfig(); TemplateConfig templateConfig = new TemplateConfig();
// templateConfig.setController("/templates/controller.java"); templateConfig.setServiceImpl("/templates/service.java");
templateConfig.setServiceImpl("/templates/serviceImpl.java");
templateConfig.setService("/templates/service.java");
templateConfig.setMapper("/templates/mapper.java"); templateConfig.setMapper("/templates/mapper.java");
//只生成实体类mapperService和serviceImpl //只生成实体类mapper和serviceImpl
templateConfig.setController(null); templateConfig.setController(null);
// templateConfig.setService(null); templateConfig.setService(null);
templateConfig.setXml(null); templateConfig.setXml(null);
mpg.setTemplate(templateConfig); mpg.setTemplate(templateConfig);
@ -122,7 +119,6 @@ public class Generator {
strategy.setRestControllerStyle(true); strategy.setRestControllerStyle(true);
//公共父类 //公共父类
strategy.setSuperEntityClass(BaseEntity.class); strategy.setSuperEntityClass(BaseEntity.class);
strategy.setSuperControllerClass(BaseController.class);
strategy.setSuperServiceImplClass(BaseService.class); strategy.setSuperServiceImplClass(BaseService.class);
strategy.setSuperMapperClass("com.github.yulichang.base.MPJBaseMapper"); strategy.setSuperMapperClass("com.github.yulichang.base.MPJBaseMapper");
strategy.setTablePrefix(tablePrefix); strategy.setTablePrefix(tablePrefix);

View File

@ -0,0 +1,88 @@
package com.ydool.grainStorage.controller;
import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
import com.github.xiaoymin.knife4j.annotations.ApiSupport;
import com.github.xiaoymin.knife4j.annotations.DynamicParameter;
import com.github.xiaoymin.knife4j.annotations.DynamicResponseParameters;
import com.ydool.common.base.BaseController;
import com.ydool.common.constant.UrlConstant;
import com.ydool.common.data.dto.AjaxResult;
import com.ydool.grainStorage.dto.FoodReservesDto;
import com.ydool.grainStorage.service.FoodReservesService;
import com.ydool.grainStorage.vo.FoodReservesVo;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping(UrlConstant.FOODRESERVES)
@Api(tags = "粮食储备管理", value = "粮食储备管理")
@ApiSupport(order = 2)
public class FoodReservesController extends BaseController {
@Autowired
private FoodReservesService foodReservesService;
/**
* 操作粮食储备
*
* @param vo
* @return
*/
@PostMapping(value = "operation")
@ApiOperation(value = "操作")
public AjaxResult operationFoodReserves(@Validated @RequestBody FoodReservesVo vo) {
return foodReservesService.operationFoodReserves(vo);
}
/**
* 粮食储备详情
*
* @param id
* @return
*/
@GetMapping(value = "detail")
@ApiOperation(value = "详情")
@ApiOperationSupport(
responses = @DynamicResponseParameters(properties = {
@DynamicParameter(name = "data", dataTypeClass = FoodReservesDto.class)
}), order = 2
)
public AjaxResult foodReservesDetails(String id) {
return foodReservesService.foodReservesDetails(id);
}
/**
* 粮食储备分页列表
*
* @param value
* @param column
* @param orderBy
* @param deptId
* @return
*/
@GetMapping(value = "page")
@ApiOperation(value = "列表")
@ApiImplicitParams({
@ApiImplicitParam(name = "current", value = "当前页", dataType = "Integer"),
@ApiImplicitParam(name = "size", value = "每页条数", dataType = "Integer"),
@ApiImplicitParam(name = "value", value = "搜索框中的内容(只支持字符串类型)"),
@ApiImplicitParam(name = "column", value = "排序字段 字段名"),
@ApiImplicitParam(name = "orderBy", value = "排序顺序 降序desc升序asc"),
@ApiImplicitParam(name = "deptId", value = "部门id 领导专用")
})
@ApiOperationSupport(
responses = @DynamicResponseParameters(properties = {
@DynamicParameter(name = "data", dataTypeClass = FoodReservesDto.class)
}),
order = 3
)
public AjaxResult foodReservesPages(String value, String column, String orderBy, String deptId) {
return foodReservesService.foodReservesPages(getPage(), value, column, orderBy, deptId);
}
}

View File

@ -0,0 +1,79 @@
package com.ydool.grainStorage.controller;
import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
import com.github.xiaoymin.knife4j.annotations.ApiSupport;
import com.github.xiaoymin.knife4j.annotations.DynamicParameter;
import com.github.xiaoymin.knife4j.annotations.DynamicResponseParameters;
import com.ydool.common.base.BaseController;
import com.ydool.common.constant.UrlConstant;
import com.ydool.common.data.dto.AjaxResult;
import com.ydool.grainStorage.dto.FoodReservesDto;
import com.ydool.grainStorage.dto.FoodReservesLogDto;
import com.ydool.grainStorage.service.FoodReservesLogService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping(UrlConstant.FOODRESERVESLOG)
@Api(tags = "粮食变更记录", value = "粮食变更记录")
@ApiSupport(order = 3)
public class FoodReservesLogController extends BaseController {
@Autowired
private FoodReservesLogService foodReservesLogService;
/**
* 粮食变更记录详情
*
* @param id
* @return
*/
@GetMapping(value = "detail")
@ApiOperation(value = "详情")
@ApiOperationSupport(
responses = @DynamicResponseParameters(properties = {
@DynamicParameter(name = "data", dataTypeClass = FoodReservesLogDto.class)
}), order = 1
)
public AjaxResult foodReservesLogDetails(String id) {
return foodReservesLogService.foodReservesLogDetails(id);
}
/**
* 粮食变更记录分页列表
* @param value
* @param column
* @param orderBy
* @param deptId
* @param type
* @return
*/
@GetMapping(value = "page")
@ApiOperation(value = "列表")
@ApiImplicitParams({
@ApiImplicitParam(name = "current", value = "当前页", dataType = "Integer"),
@ApiImplicitParam(name = "size", value = "每页条数", dataType = "Integer"),
@ApiImplicitParam(name = "value", value = "搜索框中的内容(只支持字符串类型)"),
@ApiImplicitParam(name = "column", value = "排序字段 字段名"),
@ApiImplicitParam(name = "orderBy", value = "排序顺序 降序desc升序asc"),
@ApiImplicitParam(name = "deptId", value = "部门id 领导专用"),
@ApiImplicitParam(name = "type", value = "操作类型"),
})
@ApiOperationSupport(
responses = @DynamicResponseParameters(properties = {
@DynamicParameter(name = "data", dataTypeClass = FoodReservesDto.class)
}),
order = 2
)
public AjaxResult foodReservesLogPages(String value, String column, String orderBy, String deptId,
String type){
return foodReservesLogService.foodReservesLogPages(getPage(), value, column, orderBy,deptId,type);
}
}

View File

@ -0,0 +1,131 @@
package com.ydool.grainStorage.controller;
import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
import com.github.xiaoymin.knife4j.annotations.ApiSupport;
import com.github.xiaoymin.knife4j.annotations.DynamicParameter;
import com.github.xiaoymin.knife4j.annotations.DynamicResponseParameters;
import com.ydool.common.base.BaseController;
import com.ydool.common.constant.UrlConstant;
import com.ydool.common.data.dto.AjaxResult;
import com.ydool.grainStorage.dto.FoodTypeDto;
import com.ydool.grainStorage.service.FoodTypeService;
import com.ydool.grainStorage.vo.FoodTypeVo;
import com.ydool.integrated.vo.IdsVo;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping(UrlConstant.FOODTYPE)
@Api(tags = "粮食类型管理", value = "粮食类型管理")
@ApiSupport(order = 1)
public class FoodTypeController extends BaseController {
@Autowired
private FoodTypeService foodTypeService;
/**
* 保存粮食类型
*
* @param vo
* @return
*/
@PostMapping(value = "save")
@ApiOperation(value = "保存")
@ApiOperationSupport(order = 1)
public AjaxResult saveFoodType(@Validated @RequestBody FoodTypeVo vo) {
return foodTypeService.saveFoodType(vo);
}
/**
* 编辑粮食类型
*
* @param id
* @param vo
* @return
*/
@PutMapping(value = "edit")
@ApiOperation(value = "编辑")
@ApiImplicitParam(name = "id", value = "Id")
@ApiOperationSupport(order = 2)
public AjaxResult editFoodType(String id, @Validated @RequestBody FoodTypeVo vo) {
return foodTypeService.editFoodType(id, vo);
}
/**
* 删除粮食类型
*
* @param id
* @return
*/
@DeleteMapping(value = "remove")
@ApiOperation(value = "删除")
@ApiImplicitParam(name = "id", value = "Id")
@ApiOperationSupport(order = 3)
public AjaxResult removeFoodType(String id) {
return foodTypeService.removeFoodType(id);
}
/**
* 批量删除粮食类型
*
* @param vo
* @return
*/
@PutMapping(value = "removeBatch")
@ApiOperation(value = "批量删除")
@ApiOperationSupport(order = 4)
public AjaxResult removeFoodTypes(@Validated @RequestBody IdsVo vo) {
return foodTypeService.removeFoodTypes(vo);
}
/**
* 粮食类型详情
*
* @param id
* @return
*/
@GetMapping(value = "detail")
@ApiOperation(value = "详情")
@ApiOperationSupport(
responses = @DynamicResponseParameters(properties = {
@DynamicParameter(name = "data", dataTypeClass = FoodTypeDto.class)
}), order = 5
)
public AjaxResult foodTypeDetails(String id) {
return foodTypeService.foodTypeDetails(id);
}
/**
* 粮食类型分页列表
*
* @param value
* @param column
* @param orderBy
* @return
*/
@GetMapping(value = "page")
@ApiOperation(value = "列表")
@ApiImplicitParams({
@ApiImplicitParam(name = "current", value = "当前页", dataType = "Integer"),
@ApiImplicitParam(name = "size", value = "每页条数", dataType = "Integer"),
@ApiImplicitParam(name = "value", value = "搜索框中的内容(只支持字符串类型)"),
@ApiImplicitParam(name = "column", value = "排序字段 字段名"),
@ApiImplicitParam(name = "orderBy", value = "排序顺序 降序desc升序asc")
})
@ApiOperationSupport(
responses = @DynamicResponseParameters(properties = {
@DynamicParameter(name = "data", dataTypeClass = FoodTypeDto.class)
}),
order = 6
)
public AjaxResult foodTypePages(String value, String column, String orderBy) {
return foodTypeService.foodTypePages(getPage(), value, column, orderBy);
}
}

View File

@ -0,0 +1,23 @@
package com.ydool.grainStorage.dto;
import com.ydool.grainStorage.entity.FoodReserves;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
@Data
@EqualsAndHashCode(callSuper = true)
public class FoodReservesDto extends FoodReserves {
@ApiModelProperty(value = "粮食类型")
private String foodTypeName;
@ApiModelProperty(value = "粮仓类型")
private String deptName;
@ApiModelProperty(value = "创建人")
private String createdName;
@ApiModelProperty(value = "更新人")
private String updatedName;
}

View File

@ -0,0 +1,22 @@
package com.ydool.grainStorage.dto;
import com.ydool.grainStorage.entity.FoodReservesLog;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
@Data
@EqualsAndHashCode(callSuper = true)
public class FoodReservesLogDto extends FoodReservesLog {
@ApiModelProperty(value = "粮食类型")
private String foodTypeName;
@ApiModelProperty(value = "粮仓类型")
private String deptName;
@ApiModelProperty(value = "创建人")
private String createdName;
@ApiModelProperty(value = "更新人")
private String updatedName;
}

View File

@ -0,0 +1,17 @@
package com.ydool.grainStorage.dto;
import com.ydool.grainStorage.entity.FoodType;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
@Data
@EqualsAndHashCode(callSuper = true)
public class FoodTypeDto extends FoodType {
@ApiModelProperty(value = "创建人")
private String createdName;
@ApiModelProperty(value = "更新人")
private String updatedName;
}

View File

@ -0,0 +1,35 @@
package com.ydool.grainStorage.entity;
import com.baomidou.mybatisplus.annotation.TableName;
import com.ydool.common.base.BaseEntity;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
/**
* <p>
* 粮食储备
* </p>
*
* @author zhouyuan
* @since 2023-05-08
*/
@Data
@EqualsAndHashCode(callSuper = true)
@Accessors(chain = true)
@TableName("t_grain_storage_food_reserves")
@ApiModel(value="FoodReserves对象", description="粮食储备")
public class FoodReserves extends BaseEntity{
private static final long serialVersionUID = 1L;
@ApiModelProperty(value = "粮食类型")
private String foodTypeId;
@ApiModelProperty(value = "粮仓类型")
private String deptId;
@ApiModelProperty(value = "库存")
private Double amount;
}

View File

@ -0,0 +1,38 @@
package com.ydool.grainStorage.entity;
import com.baomidou.mybatisplus.annotation.TableName;
import com.ydool.common.base.BaseEntity;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
/**
* <p>
* 粮食变更记录
* </p>
*
* @author zhouyuan
* @since 2023-05-08
*/
@Data
@EqualsAndHashCode(callSuper = true)
@Accessors(chain = true)
@TableName("t_grain_storage_food_reserves_log")
@ApiModel(value="FoodReservesLog对象", description="粮食变更记录")
public class FoodReservesLog extends BaseEntity{
private static final long serialVersionUID = 1L;
@ApiModelProperty(value = "粮食类型")
private String foodTypeId;
@ApiModelProperty(value = "粮仓类型")
private String deptId;
@ApiModelProperty(value = "变更类型")
private String type;
@ApiModelProperty(value = "变更库存")
private Double amount;
}

View File

@ -0,0 +1,29 @@
package com.ydool.grainStorage.entity;
import com.baomidou.mybatisplus.annotation.TableName;
import com.ydool.common.base.BaseEntity;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
/**
* <p>
* 粮食类型管理
* </p>
*
* @author zhouyuan
* @since 2023-05-08
*/
@Data
@EqualsAndHashCode(callSuper = true)
@Accessors(chain = true)
@TableName("t_grain_storage_food_type")
@ApiModel(value="FoodType对象", description="粮食类型管理")
public class FoodType extends BaseEntity{
private static final long serialVersionUID = 1L;
@ApiModelProperty(value = "粮食类型")
private String type;
}

View File

@ -0,0 +1,18 @@
package com.ydool.grainStorage.mapper;
import com.github.yulichang.base.MPJBaseMapper;
import com.ydool.grainStorage.entity.FoodReservesLog;
import org.apache.ibatis.annotations.Mapper;
/**
* <p>
* 粮食变更记录 Mapper 接口
* </p>
*
* @author zhouyuan
* @since 2023-05-08
*/
@Mapper
public interface FoodReservesLogMapper extends MPJBaseMapper<FoodReservesLog> {
}

View File

@ -0,0 +1,18 @@
package com.ydool.grainStorage.mapper;
import com.github.yulichang.base.MPJBaseMapper;
import com.ydool.grainStorage.entity.FoodReserves;
import org.apache.ibatis.annotations.Mapper;
/**
* <p>
* 粮食储备 Mapper 接口
* </p>
*
* @author zhouyuan
* @since 2023-05-08
*/
@Mapper
public interface FoodReservesMapper extends MPJBaseMapper<FoodReserves> {
}

View File

@ -0,0 +1,18 @@
package com.ydool.grainStorage.mapper;
import com.github.yulichang.base.MPJBaseMapper;
import com.ydool.grainStorage.entity.FoodType;
import org.apache.ibatis.annotations.Mapper;
/**
* <p>
* 粮食类型管理 Mapper 接口
* </p>
*
* @author zhouyuan
* @since 2023-05-08
*/
@Mapper
public interface FoodTypeMapper extends MPJBaseMapper<FoodType> {
}

View File

@ -0,0 +1,102 @@
package com.ydool.grainStorage.service;
import cn.dev33.satoken.stp.StpUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ydool.common.base.BaseService;
import com.ydool.common.cache.ConfigCache;
import com.ydool.common.data.dto.AjaxResult;
import com.ydool.grainStorage.entity.FoodReservesLog;
import com.ydool.grainStorage.mapper.FoodReservesLogMapper;
import com.ydool.grainStorage.wrapper.FoodReservesLogWrapper;
import com.ydool.system.entity.User;
import com.ydool.system.service.impl.UserServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/**
* <p>
* 粮食变更记录 服务类
* </p>
*
* @author zhouyuan
* @since 2023-05-08
*/
@Service
public class FoodReservesLogService extends BaseService<FoodReservesLogMapper, FoodReservesLog> {
@Autowired
private UserServiceImpl userService;
/**
* 粮食变更记录详情
*
* @param id
* @return
*/
public AjaxResult foodReservesLogDetails(String id) {
if (StrUtil.isBlank(id)) return AjaxResult.fail("id不能为空");
FoodReservesLog foodReservesLog = getById(id);
if (ObjectUtil.isNull(foodReservesLog)) return AjaxResult.fail("该粮食储备不存在");
return AjaxResult.ok().data(FoodReservesLogWrapper.INSTANCE.toDto(foodReservesLog));
}
/**
* 粮食变更记录分页列表
* @param page
* @param value
* @param column
* @param orderBy
* @param deptId
* @param type
* @return
*/
public AjaxResult foodReservesLogPages(Page page, String value, String column, String orderBy, String deptId,
String type) {
QueryWrapper<FoodReservesLog> qw = new QueryWrapper<FoodReservesLog>();
qw.lambda().and(
StrUtil.isNotBlank(value), query -> {
query.inSql(FoodReservesLog::getFoodTypeId, "select id from t_grain_storage_food_type where type " +
"like '%" + value + "%'");
}
);
//判断是否为领导
String loginName = ConfigCache.getStr("sys.user.leadership");
User user = userService.getOne(new QueryWrapper<User>().lambda()
.eq(User::getId, StpUtil.getLoginIdAsString())
.last("limit 1")
);
if (loginName.equals(user.getLoginName())) {
qw.lambda().eq(StrUtil.isNotBlank(deptId), FoodReservesLog::getDeptId, deptId);
} else {
qw.lambda().eq(FoodReservesLog::getDeptId, user.getDept());
}
qw.lambda().eq(StrUtil.isNotBlank(type),FoodReservesLog::getType,type)
.inSql(FoodReservesLog::getFoodTypeId,"select id from t_grain_storage_food_type");
if (StrUtil.isBlank(column)) {
qw.lambda().orderByDesc(FoodReservesLog::getCreatedAt);
} else {
if ("desc".equals(orderBy)) {
qw.orderByDesc(StrUtil.toUnderlineCase(column));
}
if ("asc".equals(orderBy)) {
qw.orderByAsc(StrUtil.toUnderlineCase(column));
}
}
Page<FoodReservesLog> pageList = page(page, qw);
return AjaxResult.ok().data(FoodReservesLogWrapper.INSTANCE.toDto(pageList));
}
}

View File

@ -0,0 +1,235 @@
package com.ydool.grainStorage.service;
import cn.dev33.satoken.stp.StpUtil;
import cn.hutool.core.util.ObjUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ydool.common.base.BaseService;
import com.ydool.common.cache.ConfigCache;
import com.ydool.common.data.dto.AjaxResult;
import com.ydool.grainStorage.entity.FoodReserves;
import com.ydool.grainStorage.entity.FoodReservesLog;
import com.ydool.grainStorage.entity.FoodType;
import com.ydool.grainStorage.mapper.FoodReservesMapper;
import com.ydool.grainStorage.vo.FoodReservesVo;
import com.ydool.grainStorage.wrapper.FoodReservesWrapper;
import com.ydool.system.entity.Dept;
import com.ydool.system.entity.User;
import com.ydool.system.service.impl.DeptServiceImpl;
import com.ydool.system.service.impl.UserServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
/**
* <p>
* 粮食储备 服务类
* </p>
*
* @author zhouyuan
* @since 2023-05-08
*/
@Service
public class FoodReservesService extends BaseService<FoodReservesMapper, FoodReserves> {
@Autowired
private FoodReservesLogService foodReservesLogService;
@Autowired
private UserServiceImpl userService;
@Autowired
private FoodTypeService foodTypeService;
@Autowired
private DeptServiceImpl deptService;
/**
* 操作粮食储备
*
* @param vo
* @return
*/
@Transactional(rollbackFor = Exception.class)
public AjaxResult operationFoodReserves(FoodReservesVo vo) {
//判断是否为领导
String loginName = ConfigCache.getStr("sys.user.leadership");
User user = userService.getOne(new QueryWrapper<User>().lambda()
.eq(User::getId, StpUtil.getLoginIdAsString())
.last("limit 1")
);
//不是领导 自动导入所属粮仓
if (!loginName.equals(user.getLoginName())) {
vo.setDeptId(user.getDept());
}
if (StrUtil.isBlank(vo.getDeptId())) {
return AjaxResult.fail("请选择粮仓类型");
}
//判断粮食类型是否存在
FoodType foodType = foodTypeService.getById(vo.getFoodTypeId());
if (ObjUtil.isNull(foodType)) {
return AjaxResult.fail("粮食类型不存在");
}
//判断粮仓类型
Dept dept = deptService.getById(vo.getDeptId());
if (ObjUtil.isNull(dept)) {
return AjaxResult.fail("粮仓类型不存在");
}
FoodReserves foodReserves = getOne(new QueryWrapper<FoodReserves>().lambda()
.eq(FoodReserves::getDeptId, vo.getDeptId())
.eq(FoodReserves::getFoodTypeId, vo.getFoodTypeId())
.last("limit 1")
);
//非新增时粮食储备是否存在
if (!"add".equals(vo.getOperationType()) && ObjUtil.isNull(foodReserves)) {
return AjaxResult.fail("此粮仓内不存在该粮食类型");
}
FoodReservesLog foodReservesLog = new FoodReservesLog();
boolean flag = false;
//添加
if ("add".equals(vo.getOperationType())) {
if (ObjUtil.isNotNull(foodReserves)) return AjaxResult.fail("此粮仓已有该粮食类型,请勿重复添加");
//判断数量
if (vo.getAmount() < 0) {
return AjaxResult.fail("变更数量不得小于0");
}
foodReserves = new FoodReserves();
foodReserves.setFoodTypeId(vo.getFoodTypeId());
foodReserves.setDeptId(vo.getDeptId());
foodReserves.setAmount(vo.getAmount());
flag = save(foodReserves);
foodReservesLog.setFoodTypeId(vo.getFoodTypeId());
foodReservesLog.setDeptId(vo.getDeptId());
foodReservesLog.setAmount(vo.getAmount());
foodReservesLog.setType("新增");
flag = foodReservesLogService.save(foodReservesLog);
}
//删除
if ("delete".equals(vo.getOperationType())) {
flag = removeById(foodReserves.getId());
foodReservesLog.setFoodTypeId(vo.getFoodTypeId());
foodReservesLog.setDeptId(vo.getDeptId());
foodReservesLog.setAmount(foodReserves.getAmount());
foodReservesLog.setType("删除");
flag = foodReservesLogService.save(foodReservesLog);
}
//入库
if ("warehousing".equals(vo.getOperationType())) {
//判断数量
if (vo.getAmount() <= 0) {
return AjaxResult.fail("变更数量必须大于0");
}
foodReserves.setAmount(foodReserves.getAmount() + vo.getAmount());
flag = updateById(foodReserves);
foodReservesLog.setFoodTypeId(vo.getFoodTypeId());
foodReservesLog.setDeptId(vo.getDeptId());
foodReservesLog.setAmount(vo.getAmount());
foodReservesLog.setType("入库");
flag = foodReservesLogService.save(foodReservesLog);
}
//出库
if ("out_of_stock".equals(vo.getOperationType())) {
//判断数量
if (vo.getAmount() <= 0) {
return AjaxResult.fail("变更数量必须大于0");
}
//出库数量是否大于库存数量
if (vo.getAmount() > foodReserves.getAmount()) {
return AjaxResult.fail("出库数量不得大于该粮仓此粮食类型实际库存");
}
foodReserves.setAmount(foodReserves.getAmount() - vo.getAmount());
flag = updateById(foodReserves);
foodReservesLog.setFoodTypeId(vo.getFoodTypeId());
foodReservesLog.setDeptId(vo.getDeptId());
foodReservesLog.setAmount(vo.getAmount());
foodReservesLog.setType("出库");
flag = foodReservesLogService.save(foodReservesLog);
}
return flag ? AjaxResult.ok().msg("操作成功") : AjaxResult.fail("操作失败");
}
/**
* 粮食储备详情
*
* @param id
* @return
*/
public AjaxResult foodReservesDetails(String id) {
if (StrUtil.isBlank(id)) return AjaxResult.fail("id不能为空");
FoodReserves foodReserves = getById(id);
if (ObjectUtil.isNull(foodReserves)) return AjaxResult.fail("该粮食储备不存在");
return AjaxResult.ok().data(FoodReservesWrapper.INSTANCE.toDto(foodReserves));
}
/**
* 粮食储备分页列表
*
* @param page
* @param value
* @param column
* @param orderBy
* @param deptId
* @return
*/
public AjaxResult foodReservesPages(Page page, String value, String column, String orderBy, String deptId) {
QueryWrapper<FoodReserves> qw = new QueryWrapper<FoodReserves>();
qw.lambda().and(
StrUtil.isNotBlank(value), query -> {
query.inSql(FoodReserves::getFoodTypeId, "select id from t_grain_storage_food_type where type " +
"like '%" + value + "%'");
}
);
//判断是否为领导
String loginName = ConfigCache.getStr("sys.user.leadership","");
User user = userService.getOne(new QueryWrapper<User>().lambda()
.eq(User::getId, StpUtil.getLoginIdAsString())
.last("limit 1")
);
if (loginName.equals(user.getLoginName())) {
qw.lambda().eq(StrUtil.isNotBlank(deptId), FoodReserves::getDeptId, deptId);
} else {
qw.lambda().eq(FoodReserves::getDeptId, user.getDept());
}
qw.lambda().inSql(FoodReserves::getFoodTypeId, "select id from t_grain_storage_food_type");
if (StrUtil.isBlank(column)) {
qw.lambda().orderByDesc(FoodReserves::getCreatedAt);
} else {
if ("desc".equals(orderBy)) {
qw.orderByDesc(StrUtil.toUnderlineCase(column));
}
if ("asc".equals(orderBy)) {
qw.orderByAsc(StrUtil.toUnderlineCase(column));
}
}
Page<FoodReserves> pageList = page(page, qw);
return AjaxResult.ok().data(FoodReservesWrapper.INSTANCE.toDto(pageList));
}
}

View File

@ -0,0 +1,159 @@
package com.ydool.grainStorage.service;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ydool.common.base.BaseService;
import com.ydool.common.data.dto.AjaxResult;
import com.ydool.grainStorage.entity.FoodType;
import com.ydool.grainStorage.mapper.FoodTypeMapper;
import com.ydool.grainStorage.vo.FoodTypeVo;
import com.ydool.grainStorage.wrapper.FoodTypeWrapper;
import com.ydool.integrated.vo.IdsVo;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* <p>
* 粮食类型管理 服务类
* </p>
*
* @author zhouyuan
* @since 2023-05-08
*/
@Service
public class FoodTypeService extends BaseService<FoodTypeMapper, FoodType> {
/**
* 校验粮食类型
*
* @param id
* @param vo
* @return
*/
private String checkFoodType(String id, FoodTypeVo vo) {
int count = count(new QueryWrapper<FoodType>().lambda()
.ne(StrUtil.isNotBlank(id), FoodType::getId, id)
.eq(FoodType::getType, vo.getType())
);
if (count > 0) return "粮食类型不能重复";
return null;
}
/**
* 保存粮食类型
*
* @param vo
* @return
*/
public AjaxResult saveFoodType(FoodTypeVo vo) {
String message = checkFoodType("", vo);
if (StrUtil.isNotBlank(message)) return AjaxResult.fail(message);
FoodType foodType = BeanUtil.copyProperties(vo, FoodType.class);
boolean flag = save(foodType);
return flag ? AjaxResult.ok().msg("保存成功") : AjaxResult.fail("保存失败");
}
/**
* 编辑粮食类型
*
* @param id
* @param vo
* @return
*/
public AjaxResult editFoodType(String id, FoodTypeVo vo) {
if (StrUtil.isBlank(id)) return AjaxResult.fail("id不能为空");
String message = checkFoodType(id, vo);
if (StrUtil.isNotBlank(message)) return AjaxResult.fail(message);
FoodType foodType = getById(id);
if (ObjectUtil.isNull(foodType)) return AjaxResult.fail("该粮食类型不存在");
BeanUtil.copyProperties(vo, foodType);
boolean flag = updateById(foodType);
return flag ? AjaxResult.ok().msg("编辑成功") : AjaxResult.fail("编辑失败");
}
/**
* 删除粮食类型
*
* @param id
* @return
*/
public AjaxResult removeFoodType(String id) {
if (StrUtil.isBlank(id)) return AjaxResult.fail("id不能为空");
FoodType foodType = getById(id);
if (ObjectUtil.isNull(foodType)) return AjaxResult.fail("该粮食类型不存在");
return removeById(id) ? AjaxResult.ok().msg("删除成功") : AjaxResult.fail("删除失败");
}
/**
* 批量删除粮食类型
*
* @param vo
* @return
*/
public AjaxResult removeFoodTypes(IdsVo vo) {
List<String> idList = vo.getIds();
if (CollUtil.isEmpty(idList)) {
return AjaxResult.fail("粮食类型Id集合不能为空");
}
List<FoodType> foodTypeList = listByIds(idList);
if (CollUtil.isEmpty(foodTypeList)) {
return AjaxResult.fail("该粮食类型集合全部不存在");
}
return removeByIds(idList) ? AjaxResult.ok().msg("批量删除成功") : AjaxResult.fail("批量删除失败");
}
/**
* 粮食类型详情
*
* @param id
* @return
*/
public AjaxResult foodTypeDetails(String id) {
if (StrUtil.isBlank(id)) return AjaxResult.fail("id不能为空");
FoodType foodType = getById(id);
if (ObjectUtil.isNull(foodType)) return AjaxResult.fail("该粮食类型不存在");
return AjaxResult.ok().data(FoodTypeWrapper.INSTANCE.toDto(foodType));
}
/**
* 粮食类型分页列表
* @param page
* @param value
* @param column
* @param orderBy
* @return
*/
public AjaxResult foodTypePages(Page page, String value, String column, String orderBy) {
QueryWrapper<FoodType> qw = new QueryWrapper<FoodType>();
qw.lambda().and(
StrUtil.isNotBlank(value), query -> {
query.like(FoodType::getType, value);
}
);
if (StrUtil.isBlank(column)) {
qw.lambda().orderByDesc(FoodType::getCreatedAt);
} else {
if ("desc".equals(orderBy)) {
qw.orderByDesc(StrUtil.toUnderlineCase(column));
}
if ("asc".equals(orderBy)) {
qw.orderByAsc(StrUtil.toUnderlineCase(column));
}
}
Page<FoodType> pageList = page(page, qw);
return AjaxResult.ok().data(FoodTypeWrapper.INSTANCE.toDto(pageList));
}
}

View File

@ -0,0 +1,27 @@
package com.ydool.grainStorage.vo;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
@Data
public class FoodReservesVo {
private static final long serialVersionUID = 1L;
@ApiModelProperty(value = "粮食类型")
@NotBlank(message = "粮食类型不能为空")
private String foodTypeId;
@ApiModelProperty(value = "粮仓类型,领导操作时必填,非领导无需填写")
private String deptId;
@ApiModelProperty(value = "操作类型add新增delete删除warehousing入库out_of_stock出库")
@NotBlank(message = "操作类型不能为空")
private String operationType;
@ApiModelProperty(value = "变更库存")
@NotNull(message = "变更库存不能为空")
private Double amount;
}

View File

@ -0,0 +1,15 @@
package com.ydool.grainStorage.vo;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotBlank;
@Data
public class FoodTypeVo {
private static final long serialVersionUID = 1L;
@ApiModelProperty(value = "粮食类型", required = true)
@NotBlank(message = "粮食类型不能为空")
private String type;
}

View File

@ -0,0 +1,46 @@
package com.ydool.grainStorage.wrapper;
import cn.hutool.core.util.ObjUtil;
import cn.hutool.extra.spring.SpringUtil;
import com.ydool.common.base.BaseWrapper;
import com.ydool.grainStorage.dto.FoodReservesLogDto;
import com.ydool.grainStorage.entity.FoodReservesLog;
import com.ydool.grainStorage.entity.FoodType;
import com.ydool.grainStorage.service.FoodTypeService;
import com.ydool.system.entity.Dept;
import com.ydool.system.entity.User;
import com.ydool.system.service.impl.DeptServiceImpl;
import com.ydool.system.service.impl.UserServiceImpl;
import org.apache.ibatis.annotations.Param;
import org.mapstruct.AfterMapping;
import org.mapstruct.Mapper;
import org.mapstruct.MappingTarget;
import org.mapstruct.factory.Mappers;
@Mapper
public interface FoodReservesLogWrapper extends BaseWrapper<FoodReservesLog, FoodReservesLogDto> {
FoodReservesLogWrapper INSTANCE = Mappers.getMapper(FoodReservesLogWrapper.class);
@AfterMapping
default void setOtherField(@Param("obj") FoodReservesLog obj, @MappingTarget @Param("dto") FoodReservesLogDto dto) {
UserServiceImpl userService = SpringUtil.getBean(UserServiceImpl.class);
User createdUser = userService.getById(obj.getCreatedId());
if (ObjUtil.isNotNull(createdUser)) {
dto.setCreatedName(createdUser.getUserName());
}
User updatedUser = userService.getById(obj.getUpdatedId());
if (ObjUtil.isNotNull(updatedUser)) {
dto.setUpdatedName(updatedUser.getUserName());
}
DeptServiceImpl deptService = SpringUtil.getBean(DeptServiceImpl.class);
Dept dept = deptService.getById(obj.getDeptId());
if (ObjUtil.isNotNull(dept)) {
dto.setDeptName(dept.getName());
}
FoodTypeService foodTypeService = SpringUtil.getBean(FoodTypeService.class);
FoodType foodType = foodTypeService.getById(obj.getFoodTypeId());
if (ObjUtil.isNotNull(foodType)) {
dto.setFoodTypeName(foodType.getType());
}
}
}

View File

@ -0,0 +1,46 @@
package com.ydool.grainStorage.wrapper;
import cn.hutool.core.util.ObjUtil;
import cn.hutool.extra.spring.SpringUtil;
import com.ydool.common.base.BaseWrapper;
import com.ydool.grainStorage.dto.FoodReservesDto;
import com.ydool.grainStorage.entity.FoodReserves;
import com.ydool.grainStorage.entity.FoodType;
import com.ydool.grainStorage.service.FoodTypeService;
import com.ydool.system.entity.Dept;
import com.ydool.system.entity.User;
import com.ydool.system.service.impl.DeptServiceImpl;
import com.ydool.system.service.impl.UserServiceImpl;
import org.apache.ibatis.annotations.Param;
import org.mapstruct.AfterMapping;
import org.mapstruct.Mapper;
import org.mapstruct.MappingTarget;
import org.mapstruct.factory.Mappers;
@Mapper
public interface FoodReservesWrapper extends BaseWrapper<FoodReserves, FoodReservesDto> {
FoodReservesWrapper INSTANCE = Mappers.getMapper(FoodReservesWrapper.class);
@AfterMapping
default void setOtherField(@Param("obj") FoodReserves obj, @MappingTarget @Param("dto") FoodReservesDto dto) {
UserServiceImpl userService = SpringUtil.getBean(UserServiceImpl.class);
User createdUser = userService.getById(obj.getCreatedId());
if (ObjUtil.isNotNull(createdUser)) {
dto.setCreatedName(createdUser.getUserName());
}
User updatedUser = userService.getById(obj.getUpdatedId());
if (ObjUtil.isNotNull(updatedUser)) {
dto.setUpdatedName(updatedUser.getUserName());
}
DeptServiceImpl deptService = SpringUtil.getBean(DeptServiceImpl.class);
Dept dept = deptService.getById(obj.getDeptId());
if (ObjUtil.isNotNull(dept)) {
dto.setDeptName(dept.getName());
}
FoodTypeService foodTypeService = SpringUtil.getBean(FoodTypeService.class);
FoodType foodType = foodTypeService.getById(obj.getFoodTypeId());
if (ObjUtil.isNotNull(foodType)) {
dto.setFoodTypeName(foodType.getType());
}
}
}

View File

@ -0,0 +1,32 @@
package com.ydool.grainStorage.wrapper;
import cn.hutool.core.util.ObjUtil;
import cn.hutool.extra.spring.SpringUtil;
import com.ydool.common.base.BaseWrapper;
import com.ydool.grainStorage.dto.FoodTypeDto;
import com.ydool.grainStorage.entity.FoodType;
import com.ydool.system.entity.User;
import com.ydool.system.service.impl.UserServiceImpl;
import org.apache.ibatis.annotations.Param;
import org.mapstruct.AfterMapping;
import org.mapstruct.Mapper;
import org.mapstruct.MappingTarget;
import org.mapstruct.factory.Mappers;
@Mapper
public interface FoodTypeWrapper extends BaseWrapper<FoodType, FoodTypeDto> {
FoodTypeWrapper INSTANCE = Mappers.getMapper(FoodTypeWrapper.class);
@AfterMapping
default void setOtherField(@Param("obj") FoodType obj, @MappingTarget @Param("dto") FoodTypeDto dto) {
UserServiceImpl userService = SpringUtil.getBean(UserServiceImpl.class);
User createdUser = userService.getById(obj.getCreatedId());
if (ObjUtil.isNotNull(createdUser)) {
dto.setCreatedName(createdUser.getUserName());
}
User updatedUser = userService.getById(obj.getUpdatedId());
if (ObjUtil.isNotNull(updatedUser)) {
dto.setUpdatedName(updatedUser.getUserName());
}
}
}

View File

@ -0,0 +1,137 @@
package com.ydool.integrated.controller;
import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
import com.github.xiaoymin.knife4j.annotations.ApiSupport;
import com.github.xiaoymin.knife4j.annotations.DynamicParameter;
import com.github.xiaoymin.knife4j.annotations.DynamicResponseParameters;
import com.ydool.common.base.BaseController;
import com.ydool.common.constant.UrlConstant;
import com.ydool.common.data.dto.AjaxResult;
import com.ydool.integrated.dto.DocumentDto;
import com.ydool.integrated.service.DocumentService;
import com.ydool.integrated.vo.DocumentVo;
import com.ydool.integrated.vo.IdsVo;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping(UrlConstant.DOCUMENT)
@Api(tags = "文件管理", value = "文件管理")
@ApiSupport(order = 1)
public class DocumentController extends BaseController {
@Autowired
private DocumentService documentService;
/**
* 保存文件
*
* @param vo
* @return
*/
@PostMapping(value = "save")
@ApiOperation(value = "保存")
@ApiOperationSupport(order = 1)
public AjaxResult saveDocument(@Validated @RequestBody DocumentVo vo) {
return documentService.saveDocument(vo);
}
/**
* 编辑文件
*
* @param id
* @param vo
* @return
*/
@PutMapping(value = "edit")
@ApiOperation(value = "编辑")
@ApiImplicitParam(name = "id", value = "Id")
@ApiOperationSupport(order = 2)
public AjaxResult editDocument(String id, @Validated @RequestBody DocumentVo vo) {
return documentService.editDocument(id, vo);
}
/**
* 删除文件
*
* @param id
* @return
*/
@DeleteMapping(value = "remove")
@ApiOperation(value = "删除")
@ApiImplicitParam(name = "id", value = "Id")
@ApiOperationSupport(order = 3)
public AjaxResult removeDocument(String id) {
return documentService.removeDocument(id);
}
/**
* 批量删除文件
*
* @param vo
* @return
*/
@PutMapping(value = "removeBatch")
@ApiOperation(value = "批量删除")
@ApiOperationSupport(order = 4)
public AjaxResult removeDocuments(@Validated @RequestBody IdsVo vo) {
return documentService.removeDocuments(vo);
}
/**
* 文件详情
*
* @param id
* @return
*/
@GetMapping(value = "detail")
@ApiOperation(value = "详情")
@ApiOperationSupport(
responses = @DynamicResponseParameters(properties = {
@DynamicParameter(name = "data", dataTypeClass = DocumentDto.class)
}), order = 5
)
public AjaxResult documentDetails(String id) {
return documentService.documentDetails(id);
}
/**
* 文件分页列表
*
* @param value
* @param column
* @param orderBy
* @return
*/
@GetMapping(value = "page")
@ApiOperation(value = "列表")
@ApiImplicitParams({
@ApiImplicitParam(name = "current", value = "当前页", dataType = "Integer"),
@ApiImplicitParam(name = "size", value = "每页条数", dataType = "Integer"),
@ApiImplicitParam(name = "value", value = "搜索框中的内容(只支持字符串类型)"),
@ApiImplicitParam(name = "column", value = "排序字段 字段名"),
@ApiImplicitParam(name = "orderBy", value = "排序顺序 降序desc升序asc")
})
@ApiOperationSupport(
responses = @DynamicResponseParameters(properties = {
@DynamicParameter(name = "data", dataTypeClass = DocumentDto.class)
}),
order = 6
)
public AjaxResult documentPages(String value, String column, String orderBy) {
return documentService.documentPages(getPage(), value, column, orderBy);
}
}

View File

@ -0,0 +1,132 @@
package com.ydool.integrated.controller;
import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
import com.github.xiaoymin.knife4j.annotations.ApiSupport;
import com.github.xiaoymin.knife4j.annotations.DynamicParameter;
import com.github.xiaoymin.knife4j.annotations.DynamicResponseParameters;
import com.ydool.common.base.BaseController;
import com.ydool.common.constant.UrlConstant;
import com.ydool.common.data.dto.AjaxResult;
import com.ydool.integrated.dto.InstitutionDto;
import com.ydool.integrated.service.InstitutionService;
import com.ydool.integrated.vo.IdsVo;
import com.ydool.integrated.vo.InstitutionVo;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping(UrlConstant.INSTITUTION)
@Api(tags = "制度管理", value = "制度管理")
@ApiSupport(order = 2)
public class InstitutionController extends BaseController {
@Autowired
private InstitutionService institutionService;
/**
* 保存制度
*
* @param vo
* @return
*/
@PostMapping(value = "save")
@ApiOperation(value = "保存")
@ApiOperationSupport(order = 1)
public AjaxResult saveInstitution(@Validated @RequestBody InstitutionVo vo) {
return institutionService.saveInstitution(vo);
}
/**
* 编辑制度
*
* @param id
* @param vo
* @return
*/
@PutMapping(value = "edit")
@ApiOperation(value = "编辑")
@ApiImplicitParam(name = "id", value = "Id")
@ApiOperationSupport(order = 2)
public AjaxResult editInstitution(String id, @Validated @RequestBody InstitutionVo vo) {
return institutionService.editInstitution(id, vo);
}
/**
* 删除制度
*
* @param id
* @return
*/
@DeleteMapping(value = "remove")
@ApiOperation(value = "删除")
@ApiImplicitParam(name = "id", value = "Id")
@ApiOperationSupport(order = 3)
public AjaxResult removeInstitution(String id) {
return institutionService.removeInstitution(id);
}
/**
* 批量删除制度
*
* @param vo
* @return
*/
@PutMapping(value = "removeBatch")
@ApiOperation(value = "批量删除")
@ApiOperationSupport(order = 4)
public AjaxResult removeInstitutions(@Validated @RequestBody IdsVo vo) {
return institutionService.removeInstitutions(vo);
}
/**
* 制度详情
*
* @param id
* @return
*/
@GetMapping(value = "detail")
@ApiOperation(value = "详情")
@ApiOperationSupport(
responses = @DynamicResponseParameters(properties = {
@DynamicParameter(name = "data", dataTypeClass = InstitutionDto.class)
}), order = 5
)
public AjaxResult institutionDetails(String id) {
return institutionService.institutionDetails(id);
}
/**
* 制度分页列表
*
* @param value
* @param column
* @param orderBy
* @return
*/
@GetMapping(value = "page")
@ApiOperation(value = "列表")
@ApiImplicitParams({
@ApiImplicitParam(name = "current", value = "当前页", dataType = "Integer"),
@ApiImplicitParam(name = "size", value = "每页条数", dataType = "Integer"),
@ApiImplicitParam(name = "value", value = "搜索框中的内容(只支持字符串类型)"),
@ApiImplicitParam(name = "column", value = "排序字段 字段名"),
@ApiImplicitParam(name = "orderBy", value = "排序顺序 降序desc升序asc")
})
@ApiOperationSupport(
responses = @DynamicResponseParameters(properties = {
@DynamicParameter(name = "data", dataTypeClass = InstitutionDto.class)
}),
order = 6
)
public AjaxResult institutionPages(String value, String column, String orderBy) {
return institutionService.institutionPages(getPage(), value, column, orderBy);
}
}

View File

@ -0,0 +1,132 @@
package com.ydool.integrated.controller;
import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
import com.github.xiaoymin.knife4j.annotations.ApiSupport;
import com.github.xiaoymin.knife4j.annotations.DynamicParameter;
import com.github.xiaoymin.knife4j.annotations.DynamicResponseParameters;
import com.ydool.common.base.BaseController;
import com.ydool.common.constant.UrlConstant;
import com.ydool.common.data.dto.AjaxResult;
import com.ydool.integrated.dto.DocumentDto;
import com.ydool.integrated.service.NoticeService;
import com.ydool.integrated.vo.IdsVo;
import com.ydool.integrated.vo.NoticeVo;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping(UrlConstant.NOTICE)
@Api(tags = "通知管理", value = "通知管理")
@ApiSupport(order = 4)
public class NoticeController extends BaseController {
@Autowired
private NoticeService noticeService;
/**
* 保存通知
*
* @param vo
* @return
*/
@PostMapping(value = "save")
@ApiOperation(value = "保存")
@ApiOperationSupport(order = 1)
public AjaxResult saveNotice(@Validated @RequestBody NoticeVo vo) {
return noticeService.saveNotice(vo);
}
/**
* 编辑通知
*
* @param id
* @param vo
* @return
*/
@PutMapping(value = "edit")
@ApiOperation(value = "编辑")
@ApiImplicitParam(name = "id", value = "Id")
@ApiOperationSupport(order = 2)
public AjaxResult editNotice(String id, @Validated @RequestBody NoticeVo vo) {
return noticeService.editNotice(id, vo);
}
/**
* 删除通知
*
* @param id
* @return
*/
@DeleteMapping(value = "remove")
@ApiOperation(value = "删除")
@ApiImplicitParam(name = "id", value = "Id")
@ApiOperationSupport(order = 3)
public AjaxResult removeNotice(String id) {
return noticeService.removeNotice(id);
}
/**
* 批量删除通知
*
* @param vo
* @return
*/
@PutMapping(value = "removeBatch")
@ApiOperation(value = "批量删除")
@ApiOperationSupport(order = 4)
public AjaxResult removeNotices(@Validated @RequestBody IdsVo vo) {
return noticeService.removeNotices(vo);
}
/**
* 通知详情
*
* @param id
* @return
*/
@GetMapping(value = "detail")
@ApiOperation(value = "详情")
@ApiOperationSupport(
responses = @DynamicResponseParameters(properties = {
@DynamicParameter(name = "data", dataTypeClass = DocumentDto.class)
}), order = 5
)
public AjaxResult noticeDetails(String id) {
return noticeService.noticeDetails(id);
}
/**
* 通知分页列表
*
* @param value
* @param column
* @param orderBy
* @return
*/
@GetMapping(value = "page")
@ApiOperation(value = "列表")
@ApiImplicitParams({
@ApiImplicitParam(name = "current", value = "当前页", dataType = "Integer"),
@ApiImplicitParam(name = "size", value = "每页条数", dataType = "Integer"),
@ApiImplicitParam(name = "value", value = "搜索框中的内容(只支持字符串类型)"),
@ApiImplicitParam(name = "column", value = "排序字段 字段名"),
@ApiImplicitParam(name = "orderBy", value = "排序顺序 降序desc升序asc"),
@ApiImplicitParam(name = "type", value = "user:通知公告dept:通知管理"),
})
@ApiOperationSupport(
responses = @DynamicResponseParameters(properties = {
@DynamicParameter(name = "data", dataTypeClass = DocumentDto.class)
}),
order = 6
)
public AjaxResult noticePages(String value, String column, String orderBy, String type) {
return noticeService.noticePages(getPage(), value, column, orderBy,type);
}
}

View File

@ -0,0 +1,132 @@
package com.ydool.integrated.controller;
import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
import com.github.xiaoymin.knife4j.annotations.ApiSupport;
import com.github.xiaoymin.knife4j.annotations.DynamicParameter;
import com.github.xiaoymin.knife4j.annotations.DynamicResponseParameters;
import com.ydool.common.base.BaseController;
import com.ydool.common.constant.UrlConstant;
import com.ydool.common.data.dto.AjaxResult;
import com.ydool.integrated.dto.StudyDto;
import com.ydool.integrated.service.StudyService;
import com.ydool.integrated.vo.IdsVo;
import com.ydool.integrated.vo.StudyVo;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping(UrlConstant.STUDY)
@Api(tags = "学习管理", value = "学习管理")
@ApiSupport(order = 3)
public class StudyController extends BaseController {
@Autowired
private StudyService studyService;
/**
* 保存学习
*
* @param vo
* @return
*/
@PostMapping(value = "save")
@ApiOperation(value = "保存")
@ApiOperationSupport(order = 1)
public AjaxResult saveStudy(@Validated @RequestBody StudyVo vo) {
return studyService.saveStudy(vo);
}
/**
* 编辑学习
*
* @param id
* @param vo
* @return
*/
@PutMapping(value = "edit")
@ApiOperation(value = "编辑")
@ApiImplicitParam(name = "id", value = "Id")
@ApiOperationSupport(order = 2)
public AjaxResult editStudy(String id, @Validated @RequestBody StudyVo vo) {
return studyService.editStudy(id, vo);
}
/**
* 删除学习
*
* @param id
* @return
*/
@DeleteMapping(value = "remove")
@ApiOperation(value = "删除")
@ApiImplicitParam(name = "id", value = "Id")
@ApiOperationSupport(order = 3)
public AjaxResult removeStudy(String id) {
return studyService.removeStudy(id);
}
/**
* 批量删除学习
*
* @param vo
* @return
*/
@PutMapping(value = "removeBatch")
@ApiOperation(value = "批量删除")
@ApiOperationSupport(order = 4)
public AjaxResult removeStudys(@Validated @RequestBody IdsVo vo) {
return studyService.removeStudys(vo);
}
/**
* 学习详情
*
* @param id
* @return
*/
@GetMapping(value = "detail")
@ApiOperation(value = "详情")
@ApiOperationSupport(
responses = @DynamicResponseParameters(properties = {
@DynamicParameter(name = "data", dataTypeClass = StudyDto.class)
}), order = 5
)
public AjaxResult studyDetails(String id) {
return studyService.studyDetails(id);
}
/**
* 学习分页列表
*
* @param value
* @param column
* @param orderBy
* @return
*/
@GetMapping(value = "page")
@ApiOperation(value = "列表")
@ApiImplicitParams({
@ApiImplicitParam(name = "current", value = "当前页", dataType = "Integer"),
@ApiImplicitParam(name = "size", value = "每页条数", dataType = "Integer"),
@ApiImplicitParam(name = "value", value = "搜索框中的内容(只支持字符串类型)"),
@ApiImplicitParam(name = "column", value = "排序字段 字段名"),
@ApiImplicitParam(name = "orderBy", value = "排序顺序 降序desc升序asc")
})
@ApiOperationSupport(
responses = @DynamicResponseParameters(properties = {
@DynamicParameter(name = "data", dataTypeClass = StudyDto.class)
}),
order = 6
)
public AjaxResult studyPages(String value, String column, String orderBy) {
return studyService.studyPages(getPage(), value, column, orderBy);
}
}

View File

@ -0,0 +1,16 @@
package com.ydool.integrated.dto;
import com.ydool.integrated.entity.Document;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
@EqualsAndHashCode(callSuper = true)
@Data
public class DocumentDto extends Document {
@ApiModelProperty(value = "创建人")
private String createdName;
@ApiModelProperty(value = "更新人")
private String updatedName;
}

View File

@ -0,0 +1,17 @@
package com.ydool.integrated.dto;
import com.ydool.integrated.entity.Institution;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
@EqualsAndHashCode(callSuper = true)
@Data
public class InstitutionDto extends Institution {
@ApiModelProperty(value = "创建人")
private String createdName;
@ApiModelProperty(value = "更新人")
private String updatedName;
}

View File

@ -0,0 +1,19 @@
package com.ydool.integrated.dto;
import com.ydool.integrated.entity.Notice;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
@EqualsAndHashCode(callSuper = true)
@Data
public class NoticeDto extends Notice {
@ApiModelProperty(value = "接收人")
private String userList;
@ApiModelProperty(value = "创建人")
private String createdName;
@ApiModelProperty(value = "更新人")
private String updatedName;
}

View File

@ -0,0 +1,20 @@
package com.ydool.integrated.dto;
import com.ydool.integrated.entity.Study;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
@EqualsAndHashCode(callSuper = true)
@Data
public class StudyDto extends Study {
@ApiModelProperty(value = "参会人员")
private String userList;
@ApiModelProperty(value = "创建人")
private String createdName;
@ApiModelProperty(value = "更新人")
private String updatedName;
}

View File

@ -0,0 +1,38 @@
package com.ydool.integrated.entity;
import com.baomidou.mybatisplus.annotation.TableName;
import com.ydool.common.base.BaseEntity;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
/**
* <p>
* 文件管理
* </p>
*
* @author zhouyuan
* @since 2023-05-06
*/
@Data
@EqualsAndHashCode(callSuper = true)
@Accessors(chain = true)
@TableName("t_integrated_document")
@ApiModel(value="Document对象", description="文件管理")
public class Document extends BaseEntity{
private static final long serialVersionUID = 1L;
@ApiModelProperty(value = "标题")
private String title;
@ApiModelProperty(value = "编号")
private String serialNumber;
@ApiModelProperty(value = "备注")
private String remarks;
@ApiModelProperty(value = "附件")
private String files;
}

View File

@ -0,0 +1,35 @@
package com.ydool.integrated.entity;
import com.baomidou.mybatisplus.annotation.TableName;
import com.ydool.common.base.BaseEntity;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
/**
* <p>
* 制度管理
* </p>
*
* @author zhouyuan
* @since 2023-05-05
*/
@Data
@EqualsAndHashCode(callSuper = true)
@Accessors(chain = true)
@TableName("t_integrated_institution")
@ApiModel(value="Institution对象", description="制度管理")
public class Institution extends BaseEntity{
private static final long serialVersionUID = 1L;
@ApiModelProperty(value = "标题")
private String title;
@ApiModelProperty(value = "内容")
private String content;
@ApiModelProperty(value = "附件")
private String files;
}

View File

@ -0,0 +1,41 @@
package com.ydool.integrated.entity;
import com.baomidou.mybatisplus.annotation.TableName;
import com.ydool.common.base.BaseEntity;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
/**
* <p>
* 通知管理
* </p>
*
* @author zhouyuan
* @since 2023-05-08
*/
@Data
@EqualsAndHashCode(callSuper = true)
@Accessors(chain = true)
@TableName("t_integrated_notice")
@ApiModel(value="Notice对象", description="通知管理")
public class Notice extends BaseEntity{
private static final long serialVersionUID = 1L;
@ApiModelProperty(value = "标题")
private String title;
@ApiModelProperty(value = "内容")
private String content;
@ApiModelProperty(value = "附件")
private String files;
@ApiModelProperty(value = "接收人")
private String userIds;
@ApiModelProperty(value = "发布部门")
private String deptId;
}

View File

@ -0,0 +1,53 @@
package com.ydool.integrated.entity;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ydool.common.base.BaseEntity;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime;
/**
* <p>
* 学习管理
* </p>
*
* @author zhouyuan
* @since 2023-05-06
*/
@Data
@EqualsAndHashCode(callSuper = true)
@Accessors(chain = true)
@TableName("t_integrated_study")
@ApiModel(value="Study对象", description="学习管理")
public class Study extends BaseEntity{
private static final long serialVersionUID = 1L;
@ApiModelProperty(value = "学习主题")
private String subject;
@ApiModelProperty(value = "参加人员")
private String userIds;
@ApiModelProperty(value = "照片记录")
private String photos;
@ApiModelProperty(value = "相关附件")
private String files;
@ApiModelProperty(value = "开始时间")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") // 表示返回时间类型
@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") // 表示接收时间类型
private LocalDateTime startTime;
@ApiModelProperty(value = "结束时间")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") // 表示返回时间类型
@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") // 表示接收时间类型
private LocalDateTime endTime;
}

View File

@ -0,0 +1,18 @@
package com.ydool.integrated.mapper;
import com.github.yulichang.base.MPJBaseMapper;
import com.ydool.integrated.entity.Document;
import org.apache.ibatis.annotations.Mapper;
/**
* <p>
* 文件管理 Mapper 接口
* </p>
*
* @author zhouyuan
* @since 2023-05-06
*/
@Mapper
public interface DocumentMapper extends MPJBaseMapper<Document> {
}

View File

@ -0,0 +1,18 @@
package com.ydool.integrated.mapper;
import com.github.yulichang.base.MPJBaseMapper;
import com.ydool.integrated.entity.Institution;
import org.apache.ibatis.annotations.Mapper;
/**
* <p>
* 制度管理 Mapper 接口
* </p>
*
* @author zhouyuan
* @since 2023-05-05
*/
@Mapper
public interface InstitutionMapper extends MPJBaseMapper<Institution> {
}

View File

@ -0,0 +1,18 @@
package com.ydool.integrated.mapper;
import com.github.yulichang.base.MPJBaseMapper;
import com.ydool.integrated.entity.Notice;
import org.apache.ibatis.annotations.Mapper;
/**
* <p>
* 通知管理 Mapper 接口
* </p>
*
* @author zhouyuan
* @since 2023-05-08
*/
@Mapper
public interface NoticeMapper extends MPJBaseMapper<Notice> {
}

View File

@ -0,0 +1,18 @@
package com.ydool.integrated.mapper;
import com.github.yulichang.base.MPJBaseMapper;
import com.ydool.integrated.entity.Study;
import org.apache.ibatis.annotations.Mapper;
/**
* <p>
* 学习管理 Mapper 接口
* </p>
*
* @author zhouyuan
* @since 2023-05-06
*/
@Mapper
public interface StudyMapper extends MPJBaseMapper<Study> {
}

View File

@ -0,0 +1,172 @@
package com.ydool.integrated.service;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ydool.common.base.BaseService;
import com.ydool.common.data.dto.AjaxResult;
import com.ydool.integrated.entity.Document;
import com.ydool.integrated.mapper.DocumentMapper;
import com.ydool.integrated.vo.DocumentVo;
import com.ydool.integrated.vo.IdsVo;
import com.ydool.integrated.wrapper.DocumentWrapper;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* <p>
* 文件管理 服务类
* </p>
*
* @author zhouyuan
* @since 2023-05-06
*/
@Service
public class DocumentService extends BaseService<DocumentMapper, Document> {
/**
* 校验文件
*
* @param id
* @param vo
* @return
*/
private String checkDocument(String id, DocumentVo vo) {
int count = count(new QueryWrapper<Document>().lambda()
.ne(StrUtil.isNotBlank(id), Document::getId, id)
.eq(Document::getSerialNumber, vo.getSerialNumber())
);
if (count > 0) return "文件编号不允许重复";
return null;
}
/**
* 保存文件
*
* @param vo
* @return
*/
public AjaxResult saveDocument(DocumentVo vo) {
String message = checkDocument("", vo);
if (StrUtil.isNotBlank(message)) return AjaxResult.fail(message);
Document document = BeanUtil.copyProperties(vo, Document.class);
boolean flag = save(document);
return flag ? AjaxResult.ok().msg("保存成功") : AjaxResult.fail("保存失败");
}
/**
* 编辑文件
*
* @param id
* @param vo
* @return
*/
public AjaxResult editDocument(String id, DocumentVo vo) {
if (StrUtil.isBlank(id)) return AjaxResult.fail("id不能为空");
String message = checkDocument(id, vo);
if (StrUtil.isNotBlank(message)) return AjaxResult.fail(message);
Document document = getById(id);
if (ObjectUtil.isNull(document)) return AjaxResult.fail("该文件不存在");
BeanUtil.copyProperties(vo, document);
boolean flag = updateById(document);
return flag ? AjaxResult.ok().msg("编辑成功") : AjaxResult.fail("编辑失败");
}
/**
* 删除文件
*
* @param id
* @return
*/
public AjaxResult removeDocument(String id) {
if (StrUtil.isBlank(id)) return AjaxResult.fail("id不能为空");
Document document = getById(id);
if (ObjectUtil.isNull(document)) return AjaxResult.fail("该文件不存在");
return removeById(id) ? AjaxResult.ok().msg("删除成功") : AjaxResult.fail("删除失败");
}
/**
* 批量删除文件
*
* @param vo
* @return
*/
public AjaxResult removeDocuments(IdsVo vo) {
List<String> idList = vo.getIds();
if (CollUtil.isEmpty(idList)) {
return AjaxResult.fail("文件Id集合不能为空");
}
List<Document> documentList = listByIds(idList);
if (CollUtil.isEmpty(documentList)) {
return AjaxResult.fail("该文件集合全部不存在");
}
return removeByIds(idList) ? AjaxResult.ok().msg("批量删除成功") : AjaxResult.fail("批量删除失败");
}
/**
* 文件详情
*
* @param id
* @return
*/
public AjaxResult documentDetails(String id) {
if (StrUtil.isBlank(id)) return AjaxResult.fail("id不能为空");
Document document = getById(id);
if (ObjectUtil.isNull(document)) return AjaxResult.fail("该文件不存在");
return AjaxResult.ok().data(DocumentWrapper.INSTANCE.toDto(document));
}
/**
* 文件分页列表
*
* @param page
* @param value
* @param column
* @param orderBy
* @return
*/
public AjaxResult documentPages(Page page, String value, String column, String orderBy) {
QueryWrapper<Document> qw = new QueryWrapper<Document>();
qw.lambda().and(
StrUtil.isNotBlank(value), query -> {
query.like(Document::getTitle, value)
.or().like(Document::getRemarks, value)
.or().like(Document::getSerialNumber, value);
}
);
if (StrUtil.isBlank(column)) {
qw.lambda().orderByDesc(Document::getCreatedAt);
} else {
if ("desc".equals(orderBy)) {
qw.orderByDesc(StrUtil.toUnderlineCase(column));
}
if ("asc".equals(orderBy)) {
qw.orderByAsc(StrUtil.toUnderlineCase(column));
}
}
Page<Document> pageList = page(page, qw);
return AjaxResult.ok().data(DocumentWrapper.INSTANCE.toDto(pageList));
}
}

View File

@ -0,0 +1,157 @@
package com.ydool.integrated.service;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ydool.common.base.BaseService;
import com.ydool.common.data.dto.AjaxResult;
import com.ydool.integrated.entity.Institution;
import com.ydool.integrated.mapper.InstitutionMapper;
import com.ydool.integrated.vo.IdsVo;
import com.ydool.integrated.vo.InstitutionVo;
import com.ydool.integrated.wrapper.InstitutionWrapper;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* <p>
* 制度管理 服务类
* </p>
*
* @author zhouyuan
* @since 2023-05-05
*/
@Service
public class InstitutionService extends BaseService<InstitutionMapper, Institution> {
/**
* 保存制度
*
* @param vo
* @return
*/
public AjaxResult saveInstitution(InstitutionVo vo) {
String message = checkInstitution("", vo);
if (StrUtil.isNotBlank(message)) return AjaxResult.fail(message);
Institution institution = BeanUtil.copyProperties(vo, Institution.class);
boolean flag = save(institution);
return flag ? AjaxResult.ok().msg("保存成功") : AjaxResult.fail("保存失败");
}
/**
* 编辑制度
*
* @param id
* @param vo
* @return
*/
public AjaxResult editInstitution(String id, InstitutionVo vo) {
if (StrUtil.isBlank(id)) return AjaxResult.fail("id不能为空");
String message = checkInstitution(id, vo);
if (StrUtil.isNotBlank(message)) return AjaxResult.fail(message);
Institution institution = getById(id);
if (ObjectUtil.isNull(institution)) return AjaxResult.fail("该制度不存在");
BeanUtil.copyProperties(vo, institution);
boolean flag = updateById(institution);
return flag ? AjaxResult.ok().msg("编辑成功") : AjaxResult.fail("编辑失败");
}
/**
* 删除制度
*
* @param id
* @return
*/
public AjaxResult removeInstitution(String id) {
if (StrUtil.isBlank(id)) return AjaxResult.fail("id不能为空");
Institution institution = getById(id);
if (ObjectUtil.isNull(institution)) return AjaxResult.fail("该制度不存在");
return removeById(id) ? AjaxResult.ok().msg("删除成功") : AjaxResult.fail("删除失败");
}
/**
* 批量删除制度
*
* @param vo
* @return
*/
public AjaxResult removeInstitutions(IdsVo vo) {
List<String> idList = vo.getIds();
if (CollUtil.isEmpty(idList)) {
return AjaxResult.fail("制度Id集合不能为空");
}
List<Institution> institutionList = listByIds(idList);
if (CollUtil.isEmpty(institutionList)) {
return AjaxResult.fail("该制度集合全部不存在");
}
return removeByIds(idList) ? AjaxResult.ok().msg("批量删除成功") : AjaxResult.fail("批量删除失败");
}
/**
* 制度详情
*
* @param id
* @return
*/
public AjaxResult institutionDetails(String id) {
if (StrUtil.isBlank(id)) return AjaxResult.fail("id不能为空");
Institution institution = getById(id);
if (ObjectUtil.isNull(institution)) return AjaxResult.fail("该制度不存在");
return AjaxResult.ok().data(InstitutionWrapper.INSTANCE.toDto(institution));
}
/**
* 制度分页列表
*
* @param page
* @param value
* @param column
* @param orderBy
* @return
*/
public AjaxResult institutionPages(Page page, String value, String column, String orderBy) {
QueryWrapper<Institution> qw = new QueryWrapper<Institution>();
qw.lambda().and(
StrUtil.isNotBlank(value), query -> {
query.like(Institution::getTitle, value)
.or().like(Institution::getContent, value);
}
);
if (StrUtil.isBlank(column)) {
qw.lambda().orderByDesc(Institution::getCreatedAt);
} else {
if ("desc".equals(orderBy)) {
qw.orderByDesc(StrUtil.toUnderlineCase(column));
}
if ("asc".equals(orderBy)) {
qw.orderByAsc(StrUtil.toUnderlineCase(column));
}
}
Page<Institution> pageList = page(page, qw);
return AjaxResult.ok().data(InstitutionWrapper.INSTANCE.toDto(pageList));
}
/**
* 校验制度
*
* @param id
* @param vo
* @return
*/
private String checkInstitution(String id, InstitutionVo vo) {
return null;
}
}

View File

@ -0,0 +1,178 @@
package com.ydool.integrated.service;
import cn.dev33.satoken.stp.StpUtil;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ydool.common.base.BaseService;
import com.ydool.common.data.dto.AjaxResult;
import com.ydool.integrated.entity.Notice;
import com.ydool.integrated.mapper.NoticeMapper;
import com.ydool.integrated.vo.IdsVo;
import com.ydool.integrated.vo.NoticeVo;
import com.ydool.integrated.wrapper.NoticeWrapper;
import com.ydool.system.service.impl.UserServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* <p>
* 通知管理 服务类
* </p>
*
* @author zhouyuan
* @since 2023-05-08
*/
@Service
public class NoticeService extends BaseService<NoticeMapper, Notice> {
@Autowired
private UserServiceImpl userService;
/**
* 校验通知
*
* @param id
* @param vo
* @return
*/
private String checkNotice(String id, NoticeVo vo) {
return null;
}
/**
* 保存通知
*
* @param vo
* @return
*/
public AjaxResult saveNotice(NoticeVo vo) {
String message = checkNotice("", vo);
if (StrUtil.isNotBlank(message)) return AjaxResult.fail(message);
Notice notice = BeanUtil.copyProperties(vo, Notice.class);
notice.setDeptId(userService.getById(StpUtil.getLoginIdAsString()).getDept());
boolean flag = save(notice);
return flag ? AjaxResult.ok().msg("保存成功") : AjaxResult.fail("保存失败");
}
/**
* 编辑通知
*
* @param id
* @param vo
* @return
*/
public AjaxResult editNotice(String id, NoticeVo vo) {
if (StrUtil.isBlank(id)) return AjaxResult.fail("id不能为空");
String message = checkNotice(id, vo);
if (StrUtil.isNotBlank(message)) return AjaxResult.fail(message);
Notice notice = getById(id);
if (ObjectUtil.isNull(notice)) return AjaxResult.fail("该通知不存在");
BeanUtil.copyProperties(vo, notice);
boolean flag = updateById(notice);
return flag ? AjaxResult.ok().msg("编辑成功") : AjaxResult.fail("编辑失败");
}
/**
* 删除通知
*
* @param id
* @return
*/
public AjaxResult removeNotice(String id) {
if (StrUtil.isBlank(id)) return AjaxResult.fail("id不能为空");
Notice notice = getById(id);
if (ObjectUtil.isNull(notice)) return AjaxResult.fail("该通知不存在");
return removeById(id) ? AjaxResult.ok().msg("删除成功") : AjaxResult.fail("删除失败");
}
/**
* 批量删除通知
*
* @param vo
* @return
*/
public AjaxResult removeNotices(IdsVo vo) {
List<String> idList = vo.getIds();
if (CollUtil.isEmpty(idList)) {
return AjaxResult.fail("通知Id集合不能为空");
}
List<Notice> noticeList = listByIds(idList);
if (CollUtil.isEmpty(noticeList)) {
return AjaxResult.fail("该通知集合全部不存在");
}
return removeByIds(idList) ? AjaxResult.ok().msg("批量删除成功") : AjaxResult.fail("批量删除失败");
}
/**
* 通知详情
*
* @param id
* @return
*/
public AjaxResult noticeDetails(String id) {
if (StrUtil.isBlank(id)) return AjaxResult.fail("id不能为空");
Notice notice = getById(id);
if (ObjectUtil.isNull(notice)) return AjaxResult.fail("该通知不存在");
return AjaxResult.ok().data(NoticeWrapper.INSTANCE.toDto(notice));
}
/**
* 通知分页列表
*
* @param page
* @param value
* @param column
* @param orderBy
* @return
*/
public AjaxResult noticePages(Page page, String value, String column, String orderBy, String type) {
QueryWrapper<Notice> qw = new QueryWrapper<Notice>();
qw.lambda().and(
StrUtil.isNotBlank(value), query -> {
query.like(Notice::getTitle, value)
.or().like(Notice::getContent, value);
}
);
String loginId = StpUtil.getLoginIdAsString();
//通知管理 只能看到本部门的
if ("user".equals(type)) {
qw.lambda().and((query -> {
query.eq(Notice::getUserIds, "[]")
.or().like(Notice::getUserIds, loginId);
}
));
}
if ("dept".equals(type)) {
qw.lambda().eq(Notice::getDeptId, userService.getById(loginId).getDept());
}
if (StrUtil.isBlank(column)) {
qw.lambda().orderByDesc(Notice::getCreatedAt);
} else {
if ("desc".equals(orderBy)) {
qw.orderByDesc(StrUtil.toUnderlineCase(column));
}
if ("asc".equals(orderBy)) {
qw.orderByAsc(StrUtil.toUnderlineCase(column));
}
}
Page<Notice> pageList = page(page, qw);
return AjaxResult.ok().data(NoticeWrapper.INSTANCE.toDto(pageList));
}
}

View File

@ -0,0 +1,160 @@
package com.ydool.integrated.service;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ydool.common.base.BaseService;
import com.ydool.common.data.dto.AjaxResult;
import com.ydool.integrated.entity.Study;
import com.ydool.integrated.mapper.StudyMapper;
import com.ydool.integrated.vo.IdsVo;
import com.ydool.integrated.vo.StudyVo;
import com.ydool.integrated.wrapper.StudyWrapper;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* <p>
* 学习管理 服务类
* </p>
*
* @author zhouyuan
* @since 2023-05-06
*/
@Service
public class StudyService extends BaseService<StudyMapper, Study> {
/**
* 校验学习
*
* @param id
* @param vo
* @return
*/
private String checkStudy(String id, StudyVo vo) {
List<String> userIds = JSONUtil.toList(vo.getUserIds(), String.class);
if (CollUtil.isEmpty(userIds)) return "参加人员不能为空";
return null;
}
/**
* 保存学习
*
* @param vo
* @return
*/
public AjaxResult saveStudy(StudyVo vo) {
String message = checkStudy("", vo);
if (StrUtil.isNotBlank(message)) return AjaxResult.fail(message);
Study study = BeanUtil.copyProperties(vo, Study.class);
boolean flag = save(study);
return flag ? AjaxResult.ok().msg("保存成功") : AjaxResult.fail("保存失败");
}
/**
* 编辑学习
*
* @param id
* @param vo
* @return
*/
public AjaxResult editStudy(String id, StudyVo vo) {
if (StrUtil.isBlank(id)) return AjaxResult.fail("id不能为空");
String message = checkStudy(id, vo);
if (StrUtil.isNotBlank(message)) return AjaxResult.fail(message);
Study study = getById(id);
if (ObjectUtil.isNull(study)) return AjaxResult.fail("该学习不存在");
BeanUtil.copyProperties(vo, study);
boolean flag = updateById(study);
return flag ? AjaxResult.ok().msg("编辑成功") : AjaxResult.fail("编辑失败");
}
/**
* 删除学习
*
* @param id
* @return
*/
public AjaxResult removeStudy(String id) {
if (StrUtil.isBlank(id)) return AjaxResult.fail("id不能为空");
Study study = getById(id);
if (ObjectUtil.isNull(study)) return AjaxResult.fail("该学习不存在");
return removeById(id) ? AjaxResult.ok().msg("删除成功") : AjaxResult.fail("删除失败");
}
/**
* 批量删除学习
*
* @param vo
* @return
*/
public AjaxResult removeStudys(IdsVo vo) {
List<String> idList = vo.getIds();
if (CollUtil.isEmpty(idList)) {
return AjaxResult.fail("学习Id集合不能为空");
}
List<Study> studyList = listByIds(idList);
if (CollUtil.isEmpty(studyList)) {
return AjaxResult.fail("该学习集合全部不存在");
}
return removeByIds(idList) ? AjaxResult.ok().msg("批量删除成功") : AjaxResult.fail("批量删除失败");
}
/**
* 学习详情
*
* @param id
* @return
*/
public AjaxResult studyDetails(String id) {
if (StrUtil.isBlank(id)) return AjaxResult.fail("id不能为空");
Study study = getById(id);
if (ObjectUtil.isNull(study)) return AjaxResult.fail("该学习不存在");
return AjaxResult.ok().data(StudyWrapper.INSTANCE.toDto(study));
}
/**
* 学习分页列表
*
* @param page
* @param value
* @param column
* @param orderBy
* @return
*/
public AjaxResult studyPages(Page page, String value, String column, String orderBy) {
QueryWrapper<Study> qw = new QueryWrapper<Study>();
qw.lambda().and(
StrUtil.isNotBlank(value), query -> {
query.like(Study::getSubject, value);
}
);
if (StrUtil.isBlank(column)) {
qw.lambda().orderByDesc(Study::getCreatedAt);
} else {
if ("desc".equals(orderBy)) {
qw.orderByDesc(StrUtil.toUnderlineCase(column));
}
if ("asc".equals(orderBy)) {
qw.orderByAsc(StrUtil.toUnderlineCase(column));
}
}
Page<Study> pageList = page(page, qw);
return AjaxResult.ok().data(StudyWrapper.INSTANCE.toDto(pageList));
}
}

View File

@ -0,0 +1,26 @@
package com.ydool.integrated.vo;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotBlank;
@Data
public class DocumentVo {
private static final long serialVersionUID = 1L;
@ApiModelProperty(value = "标题", required = true)
@NotBlank(message = "标题不能为空")
private String title;
@ApiModelProperty(value = "编号", required = true)
@NotBlank(message = "编号不能为空")
private String serialNumber;
@ApiModelProperty(value = "备注")
private String remarks;
@ApiModelProperty(value = "附件 为空请传[]", required = true)
@NotBlank(message = "附件 为空请传[]")
private String files;
}

View File

@ -0,0 +1,17 @@
package com.ydool.integrated.vo;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotNull;
import java.util.List;
@Data
public class IdsVo {
private static final long serialVersionUID = 1L;
@ApiModelProperty(value = "Id集合", required = true)
@NotNull(message = "请输入Id集合")
private List<String> ids;
}

View File

@ -0,0 +1,23 @@
package com.ydool.integrated.vo;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotBlank;
@Data
public class InstitutionVo {
private static final long serialVersionUID = 1L;
@ApiModelProperty(value = "标题", required = true)
@NotBlank(message = "标题不能为空")
private String title;
@ApiModelProperty(value = "内容", required = true)
@NotBlank(message = "内容不能为空")
private String content;
@ApiModelProperty(value = "附件 为空请传[]", required = true)
@NotBlank(message = "附件 为空请传[]")
private String files;
}

View File

@ -0,0 +1,28 @@
package com.ydool.integrated.vo;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotBlank;
@Data
public class NoticeVo {
private static final long serialVersionUID = 1L;
@ApiModelProperty(value = "标题", required = true)
@NotBlank(message = "标题不能为空")
private String title;
@ApiModelProperty(value = "内容", required = true)
@NotBlank(message = "内容不能为空")
private String content;
@ApiModelProperty(value = "附件 为空请传[]", required = true)
@NotBlank(message = "附件 为空请传[]")
private String files;
@ApiModelProperty(value = "接收人 为空请传[]", required = true)
@NotBlank(message = "接收人 为空请传[]")
private String userIds;
}

View File

@ -0,0 +1,43 @@
package com.ydool.integrated.vo;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import java.time.LocalDateTime;
@Data
public class StudyVo {
private static final long serialVersionUID = 1L;
@ApiModelProperty(value = "学习主题", required = true)
@NotBlank(message = "学习主题不能为空")
private String subject;
@ApiModelProperty(value = "参加人员", required = true)
@NotBlank(message = "参加人员 为空请传[]")
private String userIds;
@ApiModelProperty(value = "照片记录 为空请传[]", required = true)
@NotBlank(message = "照片记录 为空请传[]")
private String photos;
@ApiModelProperty(value = "相关附件 为空请传[]", required = true)
@NotBlank(message = "相关附件 为空请传[]")
private String files;
@ApiModelProperty(value = "开始时间", required = true)
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") // 表示返回时间类型
@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") // 表示接收时间类型
@NotNull(message = "开始时间不能为空")
private LocalDateTime startTime;
@ApiModelProperty(value = "结束时间", required = true)
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") // 表示返回时间类型
@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") // 表示接收时间类型
@NotNull(message = "结束时间不能为空")
private LocalDateTime endTime;
}

View File

@ -0,0 +1,32 @@
package com.ydool.integrated.wrapper;
import cn.hutool.core.util.ObjUtil;
import cn.hutool.extra.spring.SpringUtil;
import com.ydool.common.base.BaseWrapper;
import com.ydool.integrated.dto.DocumentDto;
import com.ydool.integrated.entity.Document;
import com.ydool.system.entity.User;
import com.ydool.system.service.impl.UserServiceImpl;
import org.apache.ibatis.annotations.Param;
import org.mapstruct.AfterMapping;
import org.mapstruct.Mapper;
import org.mapstruct.MappingTarget;
import org.mapstruct.factory.Mappers;
@Mapper
public interface DocumentWrapper extends BaseWrapper<Document, DocumentDto> {
DocumentWrapper INSTANCE = Mappers.getMapper(DocumentWrapper.class);
@AfterMapping
default void setOtherField(@Param("obj") Document obj,@MappingTarget @Param("dto") DocumentDto dto){
UserServiceImpl userService = SpringUtil.getBean(UserServiceImpl.class);
User createdUser = userService.getById(obj.getCreatedId());
if (ObjUtil.isNotNull(createdUser)){
dto.setCreatedName(createdUser.getUserName());
}
User updatedUser = userService.getById(obj.getUpdatedId());
if (ObjUtil.isNotNull(updatedUser)){
dto.setUpdatedName(updatedUser.getUserName());
}
}
}

View File

@ -0,0 +1,31 @@
package com.ydool.integrated.wrapper;
import cn.hutool.core.util.ObjUtil;
import cn.hutool.extra.spring.SpringUtil;
import com.ydool.common.base.BaseWrapper;
import com.ydool.integrated.dto.InstitutionDto;
import com.ydool.integrated.entity.Institution;
import com.ydool.system.entity.User;
import com.ydool.system.service.impl.UserServiceImpl;
import org.apache.ibatis.annotations.Param;
import org.mapstruct.AfterMapping;
import org.mapstruct.Mapper;
import org.mapstruct.MappingTarget;
import org.mapstruct.factory.Mappers;
@Mapper
public interface InstitutionWrapper extends BaseWrapper<Institution, InstitutionDto> {
InstitutionWrapper INSTANCE = Mappers.getMapper(InstitutionWrapper.class);
@AfterMapping
default void setOtherField(@Param("obj") Institution obj, @MappingTarget @Param("dto") InstitutionDto dto){
UserServiceImpl userService = SpringUtil.getBean(UserServiceImpl.class);
User createdUser = userService.getById(obj.getCreatedId());
if (ObjUtil.isNotNull(createdUser)){
dto.setCreatedName(createdUser.getUserName());
}
User updatedUser = userService.getById(obj.getUpdatedId());
if (ObjUtil.isNotNull(updatedUser)){
dto.setUpdatedName(updatedUser.getUserName());
}
}
}

View File

@ -0,0 +1,40 @@
package com.ydool.integrated.wrapper;
import cn.hutool.core.util.ObjUtil;
import cn.hutool.extra.spring.SpringUtil;
import cn.hutool.json.JSONUtil;
import com.ydool.common.base.BaseWrapper;
import com.ydool.integrated.dto.NoticeDto;
import com.ydool.integrated.entity.Notice;
import com.ydool.system.entity.User;
import com.ydool.system.service.impl.UserServiceImpl;
import org.apache.ibatis.annotations.Param;
import org.mapstruct.AfterMapping;
import org.mapstruct.Mapper;
import org.mapstruct.MappingTarget;
import org.mapstruct.factory.Mappers;
import java.util.List;
@Mapper
public interface NoticeWrapper extends BaseWrapper<Notice, NoticeDto> {
NoticeWrapper INSTANCE = Mappers.getMapper(NoticeWrapper.class);
@AfterMapping
default void setOtherField(@Param("obj") Notice obj, @MappingTarget @Param("dto") NoticeDto dto) {
UserServiceImpl userService = SpringUtil.getBean(UserServiceImpl.class);
User createdUser = userService.getById(obj.getCreatedId());
if (ObjUtil.isNotNull(createdUser)) {
dto.setCreatedName(createdUser.getUserName());
}
User updatedUser = userService.getById(obj.getUpdatedId());
if (ObjUtil.isNotNull(updatedUser)) {
dto.setUpdatedName(updatedUser.getUserName());
}
List<String> userIds = JSONUtil.toList(obj.getUserIds(), String.class);
List<User> users = userService.listByIds(userIds);
dto.setUserList(JSONUtil.toJsonStr(users));
}
}

View File

@ -0,0 +1,39 @@
package com.ydool.integrated.wrapper;
import cn.hutool.core.util.ObjUtil;
import cn.hutool.extra.spring.SpringUtil;
import cn.hutool.json.JSONUtil;
import com.ydool.common.base.BaseWrapper;
import com.ydool.integrated.dto.StudyDto;
import com.ydool.integrated.entity.Study;
import com.ydool.system.entity.User;
import com.ydool.system.service.impl.UserServiceImpl;
import org.apache.ibatis.annotations.Param;
import org.mapstruct.AfterMapping;
import org.mapstruct.Mapper;
import org.mapstruct.MappingTarget;
import org.mapstruct.factory.Mappers;
import java.util.List;
@Mapper
public interface StudyWrapper extends BaseWrapper<Study, StudyDto> {
StudyWrapper INSTANCE = Mappers.getMapper(StudyWrapper.class);
@AfterMapping
default void setOtherField(@Param("obj") Study obj, @MappingTarget @Param("dto") StudyDto dto) {
UserServiceImpl userService = SpringUtil.getBean(UserServiceImpl.class);
User createdUser = userService.getById(obj.getCreatedId());
if (ObjUtil.isNotNull(createdUser)) {
dto.setCreatedName(createdUser.getUserName());
}
User updatedUser = userService.getById(obj.getUpdatedId());
if (ObjUtil.isNotNull(updatedUser)) {
dto.setUpdatedName(updatedUser.getUserName());
}
List<String> userIds = JSONUtil.toList(obj.getUserIds(), String.class);
List<User> users = userService.listByIds(userIds);
dto.setUserList(JSONUtil.toJsonStr(users));
}
}

View File

@ -0,0 +1,221 @@
package com.ydool.oa.workFlow.controller;
import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
import com.github.xiaoymin.knife4j.annotations.ApiSupport;
import com.github.xiaoymin.knife4j.annotations.DynamicParameter;
import com.github.xiaoymin.knife4j.annotations.DynamicResponseParameters;
import com.ydool.common.base.BaseController;
import com.ydool.common.constant.UrlConstant;
import com.ydool.common.data.dto.AjaxResult;
import com.ydool.oa.workFlow.data.dto.WorkFlowCountDto;
import com.ydool.oa.workFlow.data.dto.WorkFlowDto;
import com.ydool.oa.workFlow.data.entity.WorkFlowNotice;
import com.ydool.oa.workFlow.data.vo.WorkFlowNoticeVo;
import com.ydool.oa.workFlow.data.vo.WorkFlowStepVo;
import com.ydool.oa.workFlow.data.vo.WorkFlowVo;
import com.ydool.oa.workFlow.service.WorkFlowNoticeService;
import com.ydool.oa.workFlow.service.WorkFlowService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping(UrlConstant.WORKFLOW)
@Api(tags = "工作流程申请", value = "工作流程申请")
@ApiSupport(order = 1)
public class WorkFlowController extends BaseController {
@Autowired
private WorkFlowService workFlowService;
@Autowired
private WorkFlowNoticeService workFlowNoticeService;
/**
* 发起流程
*
* @param vo
* @return
*/
@PostMapping(value = "start")
@ApiOperation(value = "发起流程")
@ApiOperationSupport(order = 1)
public AjaxResult startFlow(@RequestBody @Validated WorkFlowVo vo) {
return workFlowService.start(vo);
}
/**
* 删除流程
*
* @param id
* @return
*/
@DeleteMapping(value = "remove")
@ApiOperation(value = "删除流程")
@ApiImplicitParam(name = "id", value = "Id")
@ApiOperationSupport(order = 2)
public AjaxResult removeWorkFlow(String id) {
return workFlowService.removeWorkFlow(id);
}
/**
* 获取流程详情
*
* @param id
* @return
*/
@GetMapping(value = "detail")
@ApiOperation(value = "流程详情")
@ApiOperationSupport(
responses = @DynamicResponseParameters(properties = {
@DynamicParameter(name = "data", dataTypeClass = WorkFlowDto.class)
}), order = 3
)
public AjaxResult flowDetails(String id) {
return workFlowService.flowDetails(id);
}
/**
* 我发起的流程列表
*
* @return
*/
@GetMapping(value = "getCreateFlowList")
@ApiOperation(value = "我发起的流程列表")
@ApiImplicitParams({
@ApiImplicitParam(name = "current", value = "当前页", dataType = "Integer"),
@ApiImplicitParam(name = "size", value = "每页条数", dataType = "Integer")
})
@ApiOperationSupport(
responses = @DynamicResponseParameters(properties = {
@DynamicParameter(name = "data", dataTypeClass = WorkFlowDto.class)
}),
order = 4
)
public AjaxResult getCreateFlowList() {
return workFlowService.getCreateFlowList(getPage());
}
/**
* 待我处理
*/
@GetMapping(value = "getTodoFlowList")
@ApiOperation(value = "待我处理")
@ApiImplicitParams({
@ApiImplicitParam(name = "current", value = "当前页", dataType = "Integer"),
@ApiImplicitParam(name = "size", value = "每页条数", dataType = "Integer")
})
@ApiOperationSupport(
responses = @DynamicResponseParameters(properties = {
@DynamicParameter(name = "data", dataTypeClass = WorkFlowDto.class)
}),
order = 5
)
public AjaxResult getTodoFlowList() {
return workFlowService.getTodoFlowList(getPage());
}
/**
* 待我填写
*/
@GetMapping(value = "getWriteFlowList")
@ApiOperation(value = "待我填写")
@ApiImplicitParams({
@ApiImplicitParam(name = "current", value = "当前页", dataType = "Integer"),
@ApiImplicitParam(name = "size", value = "每页条数", dataType = "Integer")
})
@ApiOperationSupport(
responses = @DynamicResponseParameters(properties = {
@DynamicParameter(name = "data", dataTypeClass = WorkFlowDto.class)
}),
order = 6
)
public AjaxResult getWriteFlowList() {
return workFlowService.getWriteFlowList(getPage());
}
/**
* 获取各流程数量
*
* @param
* @return
*/
@GetMapping(value = "getWorkFlowCount")
@ApiOperation(value = "获取各流程数量")
@ApiOperationSupport(
responses = @DynamicResponseParameters(properties = {
@DynamicParameter(name = "data", dataTypeClass = WorkFlowCountDto.class)
}),
order = 7
)
public AjaxResult getWorkFlowCount() {
return workFlowService.getWorkFlowCount();
}
/**
* 执行流程
*
* @param vo
* @return
*/
@PostMapping(value = "execute")
@ApiOperation(value = "执行流程")
@ApiOperationSupport(order = 8)
public AjaxResult execute(@RequestBody @Validated WorkFlowStepVo vo) {
return workFlowService.execute(vo);
}
/**
* 分页查询自己有关的流程通知
*
* @return
*/
@GetMapping(value = "workFlowNoticePageList")
@ApiOperation(value = "分页查询自己有关的流程通知")
@ApiImplicitParams({
@ApiImplicitParam(name = "current", value = "当前页", dataType = "Integer"),
@ApiImplicitParam(name = "size", value = "每页条数", dataType = "Integer")
})
@ApiOperationSupport(
responses = @DynamicResponseParameters(properties = {
@DynamicParameter(name = "data", dataTypeClass = WorkFlowNotice.class)
}),
order = 9
)
public AjaxResult workFlowNoticePageList() {
return workFlowNoticeService.workFlowNoticePageList(getPage());
}
/**
* 已读
*
* @param vo
* @return
*/
@PostMapping(value = "read")
@ApiOperation(value = "已读")
@ApiOperationSupport(order = 10)
public AjaxResult read(@RequestBody @Validated WorkFlowNoticeVo vo) {
return workFlowNoticeService.read(vo);
}
/**
* 获取未读数量
*
* @return
*/
@GetMapping(value = "getUnReadCount")
@ApiOperation(value = "获取未读通知数量")
@ApiOperationSupport(order = 11)
public AjaxResult getUnReadCount() {
return workFlowNoticeService.getUnReadCount();
}
}

View File

@ -0,0 +1,18 @@
package com.ydool.oa.workFlow.data.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
public class WorkFlowCountDto {
@ApiModelProperty(value = "发起的流程数量")
private Integer createFlowCount;
@ApiModelProperty(value = "待审批的流程数量")
private Integer approvalFlowCount;
@ApiModelProperty(value = "待填写的流程数量")
private Integer writeFlowCount;
}

View File

@ -0,0 +1,48 @@
package com.ydool.oa.workFlow.data.dto;
import com.ydool.oa.workFlow.data.entity.WorkFlow;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.util.List;
@EqualsAndHashCode(callSuper = true)
@Data
public class WorkFlowDto extends WorkFlow {
@ApiModelProperty(value = "发起人")
private String userName;
@ApiModelProperty(value = "流程类型")
private String typeName;
@ApiModelProperty(value = "流程节点类型")
private String stepTypeName;
@ApiModelProperty(value = "状态")
private String statusName;
@ApiModelProperty(value = "创建人")
private String createdName;
@ApiModelProperty(value = "更新人")
private String updatedName;
@ApiModelProperty(value = "流程节点")
private List<WorkFlowStepDto> workFlowSteps;
@ApiModelProperty(value = "流程日志")
private List<WorkFlowStepLogDto> workFlowStepLogs;
@ApiModelProperty(value = "是否审批人")
private Boolean isApprove;
@ApiModelProperty(value = "是否代填写人")
private Boolean isWrite;
@ApiModelProperty(value = "是否能重新发起")
private Boolean isReStart;
}

View File

@ -0,0 +1,26 @@
package com.ydool.oa.workFlow.data.dto;
import com.ydool.oa.workFlow.data.entity.WorkFlowStep;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
@EqualsAndHashCode(callSuper = true)
@Data
public class WorkFlowStepDto extends WorkFlowStep {
@ApiModelProperty(value = "流程节点类型")
private String stepTypeName;
@ApiModelProperty(value = "状态")
private String statusName;
@ApiModelProperty(value = "审批人")
private String userName;
@ApiModelProperty(value = "创建人")
private String createdName;
@ApiModelProperty(value = "更新人")
private String updatedName;
}

View File

@ -0,0 +1,25 @@
package com.ydool.oa.workFlow.data.dto;
import com.ydool.oa.workFlow.data.entity.WorkFlowStepLog;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
@EqualsAndHashCode(callSuper = true)
@Data
public class WorkFlowStepLogDto extends WorkFlowStepLog {
@ApiModelProperty(value = "流程节点类型")
private String stepTypeName;
@ApiModelProperty(value = "状态")
private String statusName;
@ApiModelProperty(value = "审批人")
private String userName;
@ApiModelProperty(value = "创建人")
private String createdName;
@ApiModelProperty(value = "更新人")
private String updatedName;
}

View File

@ -0,0 +1,46 @@
package com.ydool.oa.workFlow.data.entity;
import com.baomidou.mybatisplus.annotation.TableName;
import com.ydool.common.base.BaseEntity;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
/**
* <p>
* 工作流程
* </p>
*
* @author zhouyuan
* @since 2023-05-22
*/
@Data
@EqualsAndHashCode(callSuper = true)
@Accessors(chain = true)
@TableName("t_work_flow")
@ApiModel(value="Flow对象", description="工作流程")
public class WorkFlow extends BaseEntity{
private static final long serialVersionUID = 1L;
@ApiModelProperty(value = "发起人")
private String userId;
@ApiModelProperty(value = "流程类型")
private String type;
@ApiModelProperty(value = "流程节点")
private Integer step;
@ApiModelProperty(value = "流程节点类型")
private String stepType;
@ApiModelProperty(value = "表单数据")
private String data;
@ApiModelProperty(value = "状态")
private String status;
}

View File

@ -0,0 +1,51 @@
package com.ydool.oa.workFlow.data.entity;
import com.baomidou.mybatisplus.annotation.TableName;
import com.ydool.common.base.BaseEntity;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
/**
* <p>
* 流程通知
* </p>
*
* @author zhouyuan
* @since 2023-05-29
*/
@Data
@EqualsAndHashCode(callSuper = true)
@Accessors(chain = true)
@TableName("t_work_flow_notice")
@ApiModel(value="WorkFlowNotice对象", description="流程通知")
public class WorkFlowNotice extends BaseEntity{
private static final long serialVersionUID = 1L;
@ApiModelProperty(value = "标题")
private String title;
@ApiModelProperty(value = "流程类型")
private String flowType;
@ApiModelProperty(value = "流程id")
private String flowId;
@ApiModelProperty(value = "接收人")
private String userId;
@ApiModelProperty(value = "是否已读")
private Boolean status;
public WorkFlowNotice() {
}
public WorkFlowNotice(String title, WorkFlow workFlow, String userId) {
this.title = title;
this.flowType = workFlow.getType();
this.flowId = workFlow.getId();
this.userId = userId;
this.status = false;
}
}

View File

@ -0,0 +1,55 @@
package com.ydool.oa.workFlow.data.entity;
import com.baomidou.mybatisplus.annotation.TableName;
import com.ydool.common.base.BaseEntity;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
/**
* <p>
* 工作流程环节
* </p>
*
* @author zhouyuan
* @since 2023-05-26
*/
@Data
@EqualsAndHashCode(callSuper = true)
@Accessors(chain = true)
@TableName("t_work_flow_step")
@ApiModel(value="WorkFlowStep对象", description="工作流程环节")
public class WorkFlowStep extends BaseEntity{
private static final long serialVersionUID = 1L;
@ApiModelProperty(value = "流程Id")
private String flowId;
@ApiModelProperty(value = "流程节点")
private Integer step;
@ApiModelProperty(value = "节点类型")
private String stepType;
@ApiModelProperty(value = "审批人")
private String userId;
@ApiModelProperty(value = "执行状态")
private String status;
@ApiModelProperty(value = "备注")
private String remarks;
public WorkFlowStep() {
}
public WorkFlowStep(WorkFlow workFlow, String stepType, String userId, String status, String remarks) {
this.flowId = workFlow.getId();
this.step = workFlow.getStep();
this.stepType = stepType;
this.userId = userId;
this.status = status;
this.remarks = remarks;
}
}

View File

@ -0,0 +1,62 @@
package com.ydool.oa.workFlow.data.entity;
import com.baomidou.mybatisplus.annotation.TableName;
import com.ydool.common.base.BaseEntity;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
/**
* <p>
* 工作流程环节日志
* </p>
*
* @author zhouyuan
* @since 2023-05-26
*/
@Data
@EqualsAndHashCode(callSuper = true)
@Accessors(chain = true)
@TableName("t_work_flow_step_log")
@ApiModel(value = "WorkFlowStepLog对象", description = "工作流程环节日志")
public class WorkFlowStepLog extends BaseEntity {
private static final long serialVersionUID = 1L;
@ApiModelProperty(value = "流程Id")
private String flowId;
@ApiModelProperty(value = "表单数据")
private String data;
@ApiModelProperty(value = "流程节点")
private Integer step;
@ApiModelProperty(value = "节点类型")
private String stepType;
@ApiModelProperty(value = "审批人")
private String userId;
@ApiModelProperty(value = "执行状态")
private String status;
@ApiModelProperty(value = "备注")
private String remarks;
public WorkFlowStepLog() {
}
public WorkFlowStepLog(WorkFlowStep workFlowStep,String data) {
this.flowId = workFlowStep.getFlowId();
this.data = data;
this.step = workFlowStep.getStep();
this.stepType = workFlowStep.getStepType();
this.userId = workFlowStep.getUserId();
this.status = workFlowStep.getStatus();
this.remarks = workFlowStep.getRemarks();
}
}

View File

@ -0,0 +1,19 @@
package com.ydool.oa.workFlow.data.vo;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotBlank;
@Data
public class WorkFlowNoticeVo {
private static final long serialVersionUID = 1L;
@ApiModelProperty(value = "类型:all 全部,one 一个")
@NotBlank(message = "类型不能为空")
private String type;
@ApiModelProperty(value = "id")
private String id;
}

View File

@ -0,0 +1,23 @@
package com.ydool.oa.workFlow.data.vo;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotBlank;
@Data
public class WorkFlowStepVo {
@ApiModelProperty(value = "id")
@NotBlank(message = "id不能为空")
private String id;
@ApiModelProperty(value = "表单数据")
private String data;
@ApiModelProperty(value = "执行状态 REFUSE 驳回 PASS 通过 SUBMIT 已提交")
@NotBlank(message = "执行状态不能为空")
private String status;
@ApiModelProperty(value = "备注")
private String remarks;
}

View File

@ -0,0 +1,20 @@
package com.ydool.oa.workFlow.data.vo;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotBlank;
@Data
public class WorkFlowVo {
private static final long serialVersionUID = 1L;
@ApiModelProperty(value = "流程类型")
@NotBlank(message = "流程类型不能为空")
private String type;
@ApiModelProperty(value = "表单数据")
@NotBlank(message = "表单数据不能为空")
private String data;
}

View File

@ -0,0 +1,41 @@
package com.ydool.oa.workFlow.data.wrapper;
import cn.hutool.core.util.ObjUtil;
import cn.hutool.extra.spring.SpringUtil;
import com.ydool.common.base.BaseWrapper;
import com.ydool.oa.workFlow.data.dto.WorkFlowStepLogDto;
import com.ydool.oa.workFlow.data.entity.WorkFlowStepLog;
import com.ydool.oa.workFlow.enums.WorkFlowStepStatusEnum;
import com.ydool.oa.workFlow.enums.WorkFlowStepTypeEnum;
import com.ydool.system.entity.User;
import com.ydool.system.service.impl.UserServiceImpl;
import org.apache.ibatis.annotations.Param;
import org.mapstruct.AfterMapping;
import org.mapstruct.Mapper;
import org.mapstruct.MappingTarget;
import org.mapstruct.factory.Mappers;
@Mapper
public interface WorkFlowStepLogWrapper extends BaseWrapper<WorkFlowStepLog, WorkFlowStepLogDto> {
WorkFlowStepLogWrapper INSTANCE = Mappers.getMapper(WorkFlowStepLogWrapper.class);
@AfterMapping
default void setOtherField(@Param("obj") WorkFlowStepLog obj, @MappingTarget @Param("dto") WorkFlowStepLogDto dto) {
UserServiceImpl userService = SpringUtil.getBean(UserServiceImpl.class);
User createdUser = userService.getById(obj.getCreatedId());
if (ObjUtil.isNotNull(createdUser)) {
dto.setCreatedName(createdUser.getUserName());
}
User updatedUser = userService.getById(obj.getUpdatedId());
if (ObjUtil.isNotNull(updatedUser)) {
dto.setUpdatedName(updatedUser.getUserName());
}
User user = userService.getById(obj.getUserId());
if (ObjUtil.isNotNull(user)) {
dto.setUserName(user.getUserName());
}
dto.setStepTypeName(WorkFlowStepTypeEnum.valueOf(obj.getStepType()).getName());
dto.setStatusName(WorkFlowStepStatusEnum.valueOf(obj.getStatus()).getName());
}
}

View File

@ -0,0 +1,41 @@
package com.ydool.oa.workFlow.data.wrapper;
import cn.hutool.core.util.ObjUtil;
import cn.hutool.extra.spring.SpringUtil;
import com.ydool.common.base.BaseWrapper;
import com.ydool.oa.workFlow.data.dto.WorkFlowStepDto;
import com.ydool.oa.workFlow.data.entity.WorkFlowStep;
import com.ydool.oa.workFlow.enums.WorkFlowStepStatusEnum;
import com.ydool.oa.workFlow.enums.WorkFlowStepTypeEnum;
import com.ydool.system.entity.User;
import com.ydool.system.service.impl.UserServiceImpl;
import org.apache.ibatis.annotations.Param;
import org.mapstruct.AfterMapping;
import org.mapstruct.Mapper;
import org.mapstruct.MappingTarget;
import org.mapstruct.factory.Mappers;
@Mapper
public interface WorkFlowStepWrapper extends BaseWrapper<WorkFlowStep, WorkFlowStepDto> {
WorkFlowStepWrapper INSTANCE = Mappers.getMapper(WorkFlowStepWrapper.class);
@AfterMapping
default void setOtherField(@Param("obj") WorkFlowStep obj, @MappingTarget @Param("dto") WorkFlowStepDto dto) {
UserServiceImpl userService = SpringUtil.getBean(UserServiceImpl.class);
User createdUser = userService.getById(obj.getCreatedId());
if (ObjUtil.isNotNull(createdUser)) {
dto.setCreatedName(createdUser.getUserName());
}
User updatedUser = userService.getById(obj.getUpdatedId());
if (ObjUtil.isNotNull(updatedUser)) {
dto.setUpdatedName(updatedUser.getUserName());
}
User user = userService.getById(obj.getUserId());
if (ObjUtil.isNotNull(user)) {
dto.setUserName(user.getUserName());
}
dto.setStepTypeName(WorkFlowStepTypeEnum.valueOf(obj.getStepType()).getName());
dto.setStatusName(WorkFlowStepStatusEnum.valueOf(obj.getStatus()).getName());
}
}

View File

@ -0,0 +1,99 @@
package com.ydool.oa.workFlow.data.wrapper;
import cn.dev33.satoken.stp.StpUtil;
import cn.hutool.core.util.ObjUtil;
import cn.hutool.extra.spring.SpringUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.ydool.common.base.BaseWrapper;
import com.ydool.oa.workFlow.data.dto.WorkFlowDto;
import com.ydool.oa.workFlow.data.dto.WorkFlowStepDto;
import com.ydool.oa.workFlow.data.dto.WorkFlowStepLogDto;
import com.ydool.oa.workFlow.data.entity.WorkFlow;
import com.ydool.oa.workFlow.data.entity.WorkFlowStep;
import com.ydool.oa.workFlow.data.entity.WorkFlowStepLog;
import com.ydool.oa.workFlow.enums.WorkFlowStatusEnum;
import com.ydool.oa.workFlow.enums.WorkFlowStepStatusEnum;
import com.ydool.oa.workFlow.enums.WorkFlowStepTypeEnum;
import com.ydool.oa.workFlow.enums.WorkFlowTypeEnum;
import com.ydool.oa.workFlow.service.WorkFlowStepLogService;
import com.ydool.oa.workFlow.service.WorkFlowStepService;
import com.ydool.system.entity.User;
import com.ydool.system.service.impl.UserServiceImpl;
import org.apache.ibatis.annotations.Param;
import org.mapstruct.AfterMapping;
import org.mapstruct.Mapper;
import org.mapstruct.MappingTarget;
import org.mapstruct.factory.Mappers;
import java.util.ArrayList;
import java.util.List;
@Mapper
public interface WorkFlowWrapper extends BaseWrapper<WorkFlow, WorkFlowDto> {
WorkFlowWrapper INSTANCE = Mappers.getMapper(WorkFlowWrapper.class);
@AfterMapping
default void setOtherField(@Param("obj") WorkFlow obj, @MappingTarget @Param("dto") WorkFlowDto dto) {
UserServiceImpl userService = SpringUtil.getBean(UserServiceImpl.class);
User createdUser = userService.getById(obj.getCreatedId());
if (ObjUtil.isNotNull(createdUser)) {
dto.setCreatedName(createdUser.getUserName());
}
User updatedUser = userService.getById(obj.getUpdatedId());
if (ObjUtil.isNotNull(updatedUser)) {
dto.setUpdatedName(updatedUser.getUserName());
}
User user = userService.getById(obj.getUserId());
if (ObjUtil.isNotNull(user)) {
dto.setUserName(user.getUserName());
}
dto.setTypeName(WorkFlowTypeEnum.valueOf(obj.getType().toUpperCase()).getName());
dto.setStepTypeName(WorkFlowStepTypeEnum.valueOf(obj.getStepType()).getName());
dto.setStatusName(WorkFlowStatusEnum.valueOf(obj.getStatus()).getName());
WorkFlowStepService workFlowStepService = SpringUtil.getBean(WorkFlowStepService.class);
WorkFlowStepLogService workFlowStepLogService = SpringUtil.getBean(WorkFlowStepLogService.class);
List<WorkFlowStep> workFlowStepList = workFlowStepService.list(new QueryWrapper<WorkFlowStep>().lambda()
.eq(WorkFlowStep::getFlowId, obj.getId())
);
List<WorkFlowStepLog> workFlowStepLogList =
workFlowStepLogService.list(new QueryWrapper<WorkFlowStepLog>().lambda()
.eq(WorkFlowStepLog::getFlowId, obj.getId())
);
List<WorkFlowStepDto> workFlowStepDtoList = WorkFlowStepWrapper.INSTANCE.toDto(workFlowStepList);
dto.setWorkFlowSteps(workFlowStepDtoList);
List<WorkFlowStepLogDto> workFlowStepLogDtoList = WorkFlowStepLogWrapper.INSTANCE.toDto(workFlowStepLogList);
dto.setWorkFlowStepLogs(workFlowStepLogDtoList);
if (WorkFlowStepTypeEnum.END.getType().equals(obj.getStepType()) && WorkFlowStatusEnum.REFUSE.getStatus().equals(obj.getStatus())) {
dto.setIsReStart(true);
} else {
dto.setIsReStart(false);
}
int count = workFlowStepService.count(
new QueryWrapper<WorkFlowStep>().lambda()
.eq(WorkFlowStep::getFlowId, obj.getId())
.eq(WorkFlowStep::getStep, obj.getStep())
.eq(WorkFlowStep::getUserId, StpUtil.getLoginIdAsString())
.eq(WorkFlowStep::getStatus, WorkFlowStepStatusEnum.NOT_START.getStatus())
);
dto.setIsApprove(false);
dto.setIsWrite(false);
if (count > 0 && WorkFlowStepTypeEnum.APPROVAL.getType().equals(obj.getStepType())) {
dto.setIsApprove(true);
}
if (count > 0 && WorkFlowStepTypeEnum.WRITE.getType().equals(obj.getStepType())) {
dto.setIsWrite(true);
}
}
}

View File

@ -0,0 +1,37 @@
package com.ydool.oa.workFlow.engine.factory;
import com.ydool.common.exception.ResultException;
import com.ydool.oa.workFlow.engine.service.IWorkFlowType;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.context.ApplicationListener;
import org.springframework.context.event.ContextRefreshedEvent;
import org.springframework.stereotype.Component;
import java.util.Map;
import java.util.Optional;
import java.util.concurrent.ConcurrentHashMap;
@Component
public class WorkFlowTypeFactory implements ApplicationContextAware, ApplicationListener<ContextRefreshedEvent> {
private Map<String, IWorkFlowType> workFlowTypeMap = new ConcurrentHashMap<>();
private ApplicationContext applicationContext;
public IWorkFlowType getWorkFlowType(String workFlowType) {
return Optional.ofNullable(workFlowTypeMap.get(workFlowType)).orElseThrow(() -> new ResultException("找不到 [" + workFlowType + "] 流程的处理类"));
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.applicationContext = applicationContext;
}
@Override
public void onApplicationEvent(ContextRefreshedEvent contextRefreshedEvent) {
Map<String, IWorkFlowType> beansOfType = applicationContext.getBeansOfType(IWorkFlowType.class);
beansOfType.values().forEach(source -> workFlowTypeMap.put(source.getName(), source));
}
}

View File

@ -0,0 +1,35 @@
package com.ydool.oa.workFlow.engine.service;
import com.ydool.common.data.dto.AjaxResult;
import com.ydool.oa.workFlow.data.entity.WorkFlow;
import com.ydool.oa.workFlow.data.entity.WorkFlowStep;
import com.ydool.oa.workFlow.data.vo.WorkFlowStepVo;
import com.ydool.oa.workFlow.data.vo.WorkFlowVo;
public interface IWorkFlowType {
/**
* 发起流程
*
* @param workFlow
* @return
*/
AjaxResult first(WorkFlow workFlow);
/**
* 执行流程
* @param vo
* @param obj
* @return
*/
AjaxResult execute(WorkFlowStepVo vo, WorkFlow obj);
/**
* 流程类型
*
* @param
* @return
*/
String getName();
}

View File

@ -0,0 +1,203 @@
package com.ydool.oa.workFlow.engine.service.impl;
import cn.dev33.satoken.stp.StpUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.ydool.common.data.dto.AjaxResult;
import com.ydool.oa.workFlow.data.entity.WorkFlow;
import com.ydool.oa.workFlow.data.entity.WorkFlowNotice;
import com.ydool.oa.workFlow.data.entity.WorkFlowStep;
import com.ydool.oa.workFlow.data.entity.WorkFlowStepLog;
import com.ydool.oa.workFlow.data.vo.WorkFlowStepVo;
import com.ydool.oa.workFlow.engine.service.IWorkFlowType;
import com.ydool.oa.workFlow.enums.WorkFlowStatusEnum;
import com.ydool.oa.workFlow.enums.WorkFlowStepStatusEnum;
import com.ydool.oa.workFlow.enums.WorkFlowStepTypeEnum;
import com.ydool.oa.workFlow.enums.WorkFlowTypeEnum;
import com.ydool.oa.workFlow.service.WorkFlowNoticeService;
import com.ydool.oa.workFlow.service.WorkFlowService;
import com.ydool.oa.workFlow.service.WorkFlowStepLogService;
import com.ydool.oa.workFlow.service.WorkFlowStepService;
import com.ydool.system.entity.Config;
import com.ydool.system.entity.Job;
import com.ydool.system.entity.User;
import com.ydool.system.service.impl.ConfigServiceImpl;
import com.ydool.system.service.impl.JobServiceImpl;
import com.ydool.system.service.impl.UserServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@Service
public class LeaveWorkFlowService implements IWorkFlowType {
@Autowired
private WorkFlowService workFlowService;
@Autowired
private WorkFlowStepService workFlowStepService;
@Autowired
private WorkFlowStepLogService workFlowStepLogService;
@Autowired
private WorkFlowNoticeService workFlowNoticeService;
@Autowired
private UserServiceImpl userService;
@Autowired
private JobServiceImpl jobService;
@Autowired
private ConfigServiceImpl configService;
@Override
@Transactional(rollbackFor = Exception.class)
public AjaxResult first(WorkFlow workFlow) {
// 1.流程step+1
workFlow.setStep(workFlow.getStep() + 1);
workFlow.setStepType(WorkFlowStepTypeEnum.APPROVAL.getType());
workFlow.setStatus(WorkFlowStatusEnum.ACTIVE.getStatus());
boolean flag = workFlowService.updateById(workFlow);
// 2.找到上级领导
Job superior = jobService.getOne(new QueryWrapper<Job>().lambda()
.eq(Job::getCode, "superior")
.last("limit 1")
);
User user = userService.getById(StpUtil.getLoginIdAsString());
User superiorUser = userService.getOne(new QueryWrapper<User>().lambda()
.eq(User::getDept, user.getDept())
.eq(User::getJob, superior.getId())
.last("limit 1")
);
// 3.添加下一步流程环节
WorkFlowStep nextWorkFlowStep = new WorkFlowStep(workFlow, WorkFlowStepTypeEnum.APPROVAL.getType(),
superiorUser.getId(), WorkFlowStepStatusEnum.NOT_START.getStatus(), "");
flag = workFlowStepService.save(nextWorkFlowStep);
// 4.通知上级领导
String title =
user.getUserName() + "" + WorkFlowTypeEnum.valueOf(workFlow.getType().toUpperCase()).getName() +
"待您审批";
WorkFlowNotice workFlowNotice = new WorkFlowNotice(title, workFlow, superiorUser.getId());
flag = workFlowNoticeService.save(workFlowNotice);
return flag ? AjaxResult.ok().msg("发起成功") : AjaxResult.fail("发起失败");
}
@Override
@Transactional(rollbackFor = Exception.class)
public AjaxResult execute(WorkFlowStepVo vo, WorkFlow workFlow) {
// 1.查询当前流程环节 并且执行人是当前登录人
WorkFlowStep workFlowStep = workFlowStepService.getOne(new QueryWrapper<WorkFlowStep>().lambda()
.eq(WorkFlowStep::getFlowId, workFlow.getId())
.eq(WorkFlowStep::getStep, workFlow.getStep())
.eq(WorkFlowStep::getUserId, StpUtil.getLoginIdAsString())
.last("limit 1")
);
// 2.判断执行哪个方法
switch (workFlow.getStep()) {
case 2:
// 2.1 请假流程第二步 上级领导审批
return second(vo, workFlow, workFlowStep);
case 3:
// 2.2 请假流程第三步 总经理审批
return third(vo, workFlow, workFlowStep);
default:
return AjaxResult.fail("流程环节错误");
}
}
@Transactional(rollbackFor = Exception.class)
public AjaxResult second(WorkFlowStepVo vo, WorkFlow workFlow, WorkFlowStep workFlowStep) {
// 1.流程环节进行变更
workFlowStep.setStatus(WorkFlowStepStatusEnum.PASS.getStatus());
workFlowStep.setRemarks(vo.getRemarks());
boolean flag = workFlowStepService.updateById(workFlowStep);
// 2.记录流程环节日志
WorkFlowStepLog workFlowStepLog = new WorkFlowStepLog(workFlowStep, workFlow.getData());
flag = workFlowStepLogService.save(workFlowStepLog);
// 3.流程step+1 进入下一步
workFlow.setStep(workFlow.getStep() + 1);
workFlow.setStepType(WorkFlowStepTypeEnum.APPROVAL.getType());
workFlow.setStatus(WorkFlowStatusEnum.ACTIVE.getStatus());
flag = workFlowService.updateById(workFlow);
// 4.找到总经理
Config generalManager = configService.getOne(new QueryWrapper<Config>().lambda()
.eq(Config::getParamKey, "general.manager")
.last("limit 1")
);
User generalManagerUser = userService.getOne(new QueryWrapper<User>().lambda()
.eq(User::getLoginName, generalManager.getParamValue())
.last("limit 1")
);
// 5.添加下一步流程环节
WorkFlowStep nextWorkFlowStep = new WorkFlowStep(workFlow, WorkFlowStepTypeEnum.APPROVAL.getType(),
generalManagerUser.getId(), WorkFlowStepStatusEnum.NOT_START.getStatus(), "");
flag = workFlowStepService.save(nextWorkFlowStep);
// 6.通知总经理
User user = userService.getById(workFlow.getUserId());
String title =
user.getUserName() + "" + WorkFlowTypeEnum.valueOf(workFlow.getType().toUpperCase()).getName() +
"待您审批";
WorkFlowNotice workFlowNotice = new WorkFlowNotice(title, workFlow, generalManagerUser.getId());
flag = workFlowNoticeService.save(workFlowNotice);
return flag ? AjaxResult.ok().msg("审批成功") : AjaxResult.fail("审批失败");
}
public AjaxResult third(WorkFlowStepVo vo, WorkFlow workFlow, WorkFlowStep workFlowStep){
// 1.流程环节进行变更
workFlowStep.setStatus(WorkFlowStepStatusEnum.PASS.getStatus());
workFlowStep.setRemarks(vo.getRemarks());
boolean flag = workFlowStepService.updateById(workFlowStep);
// 2.记录流程环节日志
WorkFlowStepLog workFlowStepLog = new WorkFlowStepLog(workFlowStep, workFlow.getData());
flag = workFlowStepLogService.save(workFlowStepLog);
// 3.流程完结
workFlow.setStep(workFlow.getStep() + 1);
workFlow.setStepType(WorkFlowStepTypeEnum.END.getType());
workFlow.setStatus(WorkFlowStatusEnum.PASS.getStatus());
flag = workFlowService.updateById(workFlow);
// 4.添加完结流程环节
WorkFlowStep doneWorkFlowStep = new WorkFlowStep(workFlow, WorkFlowStepTypeEnum.END.getType(),
StpUtil.getLoginIdAsString(), WorkFlowStepStatusEnum.DONE.getStatus(), "");
flag = workFlowStepService.save(doneWorkFlowStep);
// 5.记录完结流程环节日志
WorkFlowStepLog doneWorkFlowStepLog = new WorkFlowStepLog(doneWorkFlowStep, workFlow.getData());
flag = workFlowStepLogService.save(doneWorkFlowStepLog);
// 6.通知发起人
String title =
"您的" + WorkFlowTypeEnum.valueOf(workFlow.getType().toUpperCase()).getName() +
"已通过审批";
WorkFlowNotice workFlowNotice = new WorkFlowNotice(title, workFlow, workFlow.getUserId());
flag = workFlowNoticeService.save(workFlowNotice);
return flag ? AjaxResult.ok().msg("审批成功") : AjaxResult.fail("审批失败");
}
@Override
public String getName() {
return "leave";
}
}

View File

@ -0,0 +1,40 @@
package com.ydool.oa.workFlow.enums;
public enum WorkFlowStatusEnum {
/**
* 执行中
*/
ACTIVE("ACTIVE", "执行中"),
/**
* 驳回
*/
REFUSE("REFUSE", "驳回"),
/**
* 通过
*/
PASS("PASS", "通过");
/**
* 流程状态
*/
private final String status;
/**
* 流程状态名称
*/
private final String name;
private WorkFlowStatusEnum(String status, String name) {
this.status = status;
this.name = name;
}
public String getStatus() {
return status;
}
public String getName() {
return name;
}
}

View File

@ -0,0 +1,48 @@
package com.ydool.oa.workFlow.enums;
public enum WorkFlowStepStatusEnum {
/**
* 未开始
*/
NOT_START("NOT_START", "未开始"),
/**
* 驳回
*/
REFUSE("REFUSE", "驳回"),
/**
* 通过
*/
PASS("PASS", "通过"),
/**
* 已提交
*/
SUBMIT("SUBMIT", "已提交"),
/**
* 结束
*/
DONE("DONE", "结束");
/**
* 流程状态
*/
private final String status;
/**
* 流程状态名称
*/
private final String name;
private WorkFlowStepStatusEnum(String status, String name) {
this.status = status;
this.name = name;
}
public String getStatus() {
return status;
}
public String getName() {
return name;
}
}

View File

@ -0,0 +1,48 @@
package com.ydool.oa.workFlow.enums;
public enum WorkFlowStepTypeEnum {
/**
* 开始节点
*/
START("START", "开始节点"),
/**
* 审批节点
*/
APPROVAL("APPROVAL", "审批节点"),
/**
* 填写节点
*/
WRITE("WRITE", "填写节点"),
/**
* 结束节点
*/
END("END", "结束节点"),
;
/**
* 节点类型
*/
private final String type;
/**
* 节点名称
*/
private final String name;
private WorkFlowStepTypeEnum(String type, String name) {
this.type = type;
this.name = name;
}
public String getType() {
return type;
}
public String getName() {
return name;
}
}

View File

@ -0,0 +1,60 @@
package com.ydool.oa.workFlow.enums;
public enum WorkFlowTypeEnum {
/**
* 熏蒸申报
*/
FUMIGATION("fumigation", "熏蒸申报"),
/**
* 轮换申报
*/
ROTATION("rotation", "轮换申报"),
/**
* 药剂领用
*/
DRUG("drug", "药剂领用"),
/**
* 维修决算申报
*/
REPAIR("repair", "维修决算申报"),
/**
* 预算申请
*/
BUDGET("budget", "预算申请"),
/**
* 请假申请
*/
LEAVE("leave", "请假申请"),
;
/**
* 流程类型
*/
private final String type;
/**
* 流程名称
*/
private final String name;
private WorkFlowTypeEnum(String type, String name) {
this.type = type;
this.name = name;
}
public String getName() {
return name;
}
public String getType() {
return type;
}
}

View File

@ -0,0 +1,18 @@
package com.ydool.oa.workFlow.mapper;
import com.ydool.oa.workFlow.data.entity.WorkFlow;
import com.github.yulichang.base.MPJBaseMapper;
import org.apache.ibatis.annotations.Mapper;
/**
* <p>
* 工作流程 Mapper 接口
* </p>
*
* @author zhouyuan
* @since 2023-05-22
*/
@Mapper
public interface WorkFlowMapper extends MPJBaseMapper<WorkFlow> {
}

View File

@ -0,0 +1,18 @@
package com.ydool.oa.workFlow.mapper;
import com.ydool.oa.workFlow.data.entity.WorkFlowNotice;
import com.github.yulichang.base.MPJBaseMapper;
import org.apache.ibatis.annotations.Mapper;
/**
* <p>
* 流程通知 Mapper 接口
* </p>
*
* @author zhouyuan
* @since 2023-05-29
*/
@Mapper
public interface WorkFlowNoticeMapper extends MPJBaseMapper<WorkFlowNotice> {
}

View File

@ -0,0 +1,18 @@
package com.ydool.oa.workFlow.mapper;
import com.ydool.oa.workFlow.data.entity.WorkFlowStepLog;
import com.github.yulichang.base.MPJBaseMapper;
import org.apache.ibatis.annotations.Mapper;
/**
* <p>
* 工作流程环节日志 Mapper 接口
* </p>
*
* @author zhouyuan
* @since 2023-05-26
*/
@Mapper
public interface WorkFlowStepLogMapper extends MPJBaseMapper<WorkFlowStepLog> {
}

View File

@ -0,0 +1,18 @@
package com.ydool.oa.workFlow.mapper;
import com.ydool.oa.workFlow.data.entity.WorkFlowStep;
import com.github.yulichang.base.MPJBaseMapper;
import org.apache.ibatis.annotations.Mapper;
/**
* <p>
* 工作流程环节 Mapper 接口
* </p>
*
* @author zhouyuan
* @since 2023-05-26
*/
@Mapper
public interface WorkFlowStepMapper extends MPJBaseMapper<WorkFlowStep> {
}

View File

@ -0,0 +1,84 @@
package com.ydool.oa.workFlow.service;
import cn.dev33.satoken.stp.StpUtil;
import cn.hutool.core.util.ObjUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ydool.common.base.BaseService;
import com.ydool.common.data.dto.AjaxResult;
import com.ydool.oa.workFlow.data.entity.WorkFlowNotice;
import com.ydool.oa.workFlow.data.vo.WorkFlowNoticeVo;
import com.ydool.oa.workFlow.mapper.WorkFlowNoticeMapper;
import org.springframework.stereotype.Service;
/**
* <p>
* 流程通知 服务类
* </p>
*
* @author zhouyuan
* @since 2023-05-29
*/
@Service
public class WorkFlowNoticeService extends BaseService<WorkFlowNoticeMapper, WorkFlowNotice> {
/**
* 分页查询自己有关的流程通知
*
* @param page
* @return
*/
public AjaxResult workFlowNoticePageList(Page page) {
Page<WorkFlowNotice> pageList = page(page, new QueryWrapper<WorkFlowNotice>().lambda()
.eq(WorkFlowNotice::getUserId, StpUtil.getLoginIdAsString())
.orderByDesc(WorkFlowNotice::getCreatedAt)
);
return AjaxResult.ok().data(pageList);
}
/**
* 已读
*
* @param vo
* @return
*/
public AjaxResult read(WorkFlowNoticeVo vo) {
boolean flag = false;
if ("all".equals(vo.getType())) {
flag = update(new UpdateWrapper<WorkFlowNotice>().lambda()
.eq(WorkFlowNotice::getUserId, StpUtil.getLoginIdAsString())
.eq(WorkFlowNotice::getStatus, false)
.set(WorkFlowNotice::getStatus, true)
);
} else {
String id = vo.getId();
if (StrUtil.isBlank(id)) {
return AjaxResult.fail("id不能为空");
}
WorkFlowNotice workFlowNotice = getById(id);
if (ObjUtil.isNull(workFlowNotice)) {
return AjaxResult.fail("该通知不存在");
}
if (workFlowNotice.getStatus()) {
return AjaxResult.fail("该通知已读");
}
workFlowNotice.setStatus(true);
flag = updateById(workFlowNotice);
}
return flag ? AjaxResult.ok().msg("操作成功") : AjaxResult.fail("操作失败");
}
/**
* 获取未读通知数量
*
* @return
*/
public AjaxResult getUnReadCount() {
return AjaxResult.ok().data(count(new QueryWrapper<WorkFlowNotice>().lambda()
.eq(WorkFlowNotice::getUserId, StpUtil.getLoginIdAsString())
.eq(WorkFlowNotice::getStatus, false)
));
}
}

View File

@ -0,0 +1,294 @@
package com.ydool.oa.workFlow.service;
import cn.dev33.satoken.stp.StpUtil;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ydool.common.base.BaseService;
import com.ydool.common.data.dto.AjaxResult;
import com.ydool.oa.workFlow.data.dto.WorkFlowCountDto;
import com.ydool.oa.workFlow.data.entity.WorkFlow;
import com.ydool.oa.workFlow.data.entity.WorkFlowNotice;
import com.ydool.oa.workFlow.data.entity.WorkFlowStep;
import com.ydool.oa.workFlow.data.entity.WorkFlowStepLog;
import com.ydool.oa.workFlow.data.vo.WorkFlowStepVo;
import com.ydool.oa.workFlow.data.vo.WorkFlowVo;
import com.ydool.oa.workFlow.data.wrapper.WorkFlowWrapper;
import com.ydool.oa.workFlow.engine.factory.WorkFlowTypeFactory;
import com.ydool.oa.workFlow.enums.WorkFlowStatusEnum;
import com.ydool.oa.workFlow.enums.WorkFlowStepStatusEnum;
import com.ydool.oa.workFlow.enums.WorkFlowStepTypeEnum;
import com.ydool.oa.workFlow.enums.WorkFlowTypeEnum;
import com.ydool.oa.workFlow.mapper.WorkFlowMapper;
import com.ydool.system.entity.User;
import com.ydool.system.service.impl.UserServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
/**
* <p>
* 工作流程 服务类
* </p>
*
* @author zhouyuan
* @since 2023-05-22
*/
@Service
public class WorkFlowService extends BaseService<WorkFlowMapper, WorkFlow> {
@Autowired
private WorkFlowTypeFactory workFlowTypeFactory;
@Autowired
private WorkFlowStepService workFlowStepService;
@Autowired
private WorkFlowStepLogService workFlowStepLogService;
@Autowired
private WorkFlowNoticeService workFlowNoticeService;
@Autowired
private UserServiceImpl userService;
/**
* 发起流程
*
* @param vo
* @return
*/
@Transactional(rollbackFor = Exception.class)
public AjaxResult start(WorkFlowVo vo) {
// 1.保存流程
WorkFlow workFlow = BeanUtil.copyProperties(vo, WorkFlow.class);
workFlow.setUserId(StpUtil.getLoginIdAsString());
workFlow.setStep(1);
workFlow.setStepType(WorkFlowStepTypeEnum.START.getType());
workFlow.setStatus(WorkFlowStatusEnum.ACTIVE.getStatus());
boolean flag = save(workFlow);
// 2.保存流程步骤
WorkFlowStep workFlowStep = new WorkFlowStep(workFlow, WorkFlowStepTypeEnum.START.getType(),
StpUtil.getLoginIdAsString(), WorkFlowStepStatusEnum.SUBMIT.getStatus(), "");
flag = workFlowStepService.save(workFlowStep);
// 3.保存流程步骤日志
WorkFlowStepLog workFlowStepLog = new WorkFlowStepLog(workFlowStep, workFlow.getData());
flag = workFlowStepLogService.save(workFlowStepLog);
// 4.判断是否进入下一步
return flag ? workFlowTypeFactory.getWorkFlowType(vo.getType()).first(workFlow) : AjaxResult.fail("发起失败");
}
/**
* 执行流程
*
* @param vo
* @return
*/
@Transactional(rollbackFor = Exception.class)
public AjaxResult execute(WorkFlowStepVo vo) {
// 1.基础校验
if (!WorkFlowStepStatusEnum.SUBMIT.getStatus().equals(vo.getStatus()) && StrUtil.isBlank(vo.getRemarks()))
return AjaxResult.fail(
"备注不能为空");
String id = vo.getId();
WorkFlow workFlow = getById(id);
if (ObjectUtil.isNull(workFlow)) return AjaxResult.fail("该流程不存在");
// 2.判断流程是已结束
if (!workFlow.getStatus().equals(WorkFlowStatusEnum.ACTIVE.getStatus())) return AjaxResult.fail("该流程已结束");
// 3.判断是否为当前环节未操作的执行人
int count = workFlowStepService.count(
new QueryWrapper<WorkFlowStep>().lambda()
.eq(WorkFlowStep::getFlowId, id)
.eq(WorkFlowStep::getStep, workFlow.getStep())
.eq(WorkFlowStep::getUserId, StpUtil.getLoginIdAsString())
.eq(WorkFlowStep::getStatus, WorkFlowStepStatusEnum.NOT_START.getStatus())
);
if (count == 0) return AjaxResult.fail("您已操作过该流程或当前环节不是您的操作环节");
// 4.判断执行状态 进行下一步操作
switch (vo.getStatus()) {
case "PASS":
// 4.1 同意
return workFlowTypeFactory.getWorkFlowType(workFlow.getType()).execute(vo, workFlow);
case "REFUSE":
//4.2 驳回
return this.refuse(workFlow, vo.getRemarks());
case "SUBMIT":
// 4.3 提交
return workFlowTypeFactory.getWorkFlowType(workFlow.getType()).execute(vo, workFlow);
default:
return AjaxResult.fail("执行状态类型错误");
}
}
/**
* 驳回流程
*
* @param workFlow
* @return
*/
@Transactional(rollbackFor = Exception.class)
public AjaxResult refuse(WorkFlow workFlow, String remarks) {
// 1.修改流程状态为驳回并直接结束
workFlow.setStepType(WorkFlowStepTypeEnum.END.getType());
workFlow.setStatus(WorkFlowStatusEnum.REFUSE.getStatus());
boolean flag = updateById(workFlow);
// 2.修改流程步骤状态为驳回
WorkFlowStep workFlowStep = workFlowStepService.getOne(new QueryWrapper<WorkFlowStep>().lambda()
.eq(WorkFlowStep::getFlowId, workFlow.getId())
.eq(WorkFlowStep::getStep, workFlow.getStep())
.eq(WorkFlowStep::getUserId, StpUtil.getLoginIdAsString())
.last("limit 1")
);
workFlowStep.setStatus(WorkFlowStepStatusEnum.REFUSE.getStatus());
workFlowStep.setRemarks(remarks);
flag = workFlowStepService.updateById(workFlowStep);
// 3.记录流程日志
WorkFlowStepLog workFlowStepLog = new WorkFlowStepLog(workFlowStep, workFlow.getData());
flag = workFlowStepLogService.save(workFlowStepLog);
// 4.发送消息通知给发起人
User user = userService.getById(StpUtil.getLoginIdAsString());
String title =
"您的" + WorkFlowTypeEnum.valueOf(workFlow.getType().toUpperCase()).getName() + "已被" + user.getUserName() + "驳回";
WorkFlowNotice workFlowNotice = new WorkFlowNotice(title, workFlow, workFlow.getUserId());
flag = workFlowNoticeService.save(workFlowNotice);
return flag ? AjaxResult.ok().msg("操作成功") : AjaxResult.fail("操作失败");
}
/**
* 删除流程
*
* @param id
* @return
*/
public AjaxResult removeWorkFlow(String id) {
if (StrUtil.isBlank(id)) return AjaxResult.fail("id不能为空");
WorkFlow workFlow = getById(id);
if (ObjectUtil.isNull(workFlow)) return AjaxResult.fail("该流程不存在");
return removeById(id) ? AjaxResult.ok().msg("删除成功") : AjaxResult.fail("删除失败");
}
/**
* 获取流程详情
*
* @param id
* @return
*/
public AjaxResult flowDetails(String id) {
if (StrUtil.isBlank(id)) return AjaxResult.fail("id不能为空");
WorkFlow workFlow = getById(id);
if (ObjectUtil.isNull(workFlow)) return AjaxResult.fail("该流程不存在");
return AjaxResult.ok().data(WorkFlowWrapper.INSTANCE.toDto(workFlow));
}
/**
* 我发起的流程列表
*
* @param page
* @return
*/
public AjaxResult getCreateFlowList(Page page) {
Page<WorkFlow> pageList = page(page, new QueryWrapper<WorkFlow>().lambda()
.eq(WorkFlow::getUserId, StpUtil.getLoginIdAsString())
.orderByDesc(WorkFlow::getCreatedAt)
);
return AjaxResult.ok().data(WorkFlowWrapper.INSTANCE.toDto(pageList));
}
/**
* 待我填写
*
* @param page
* @return
*/
public AjaxResult getWriteFlowList(Page page) {
Page<WorkFlow> pageList = page(page, new QueryWrapper<WorkFlow>().lambda()
.eq(WorkFlow::getStatus, WorkFlowStatusEnum.ACTIVE.getStatus())
.eq(WorkFlow::getStepType, WorkFlowStepTypeEnum.WRITE.getType())
.exists(
"select 1 from t_work_flow_step step where t_work_flow.id = step.flow_id and t_work_flow.step" +
" = step.step and step.user_id = '" + StpUtil.getLoginIdAsString()
+ "' and step.status = '" + WorkFlowStepStatusEnum.NOT_START.getStatus() + "'"
)
.orderByDesc(WorkFlow::getCreatedAt)
);
return AjaxResult.ok().data(WorkFlowWrapper.INSTANCE.toDto(pageList));
}
/**
* 待我处理
*
* @param page
* @return
*/
public AjaxResult getTodoFlowList(Page page) {
Page<WorkFlow> pageList = page(page, new QueryWrapper<WorkFlow>().lambda()
.eq(WorkFlow::getStatus, WorkFlowStatusEnum.ACTIVE.getStatus())
.eq(WorkFlow::getStepType, WorkFlowStepTypeEnum.APPROVAL.getType())
.exists(
"select 1 from t_work_flow_step step where t_work_flow.id = step.flow_id and t_work_flow.step" +
" = step.step and step.user_id = '" + StpUtil.getLoginIdAsString()
+ "' and step.status = '" + WorkFlowStepStatusEnum.NOT_START.getStatus() + "'"
)
.orderByDesc(WorkFlow::getCreatedAt)
);
return AjaxResult.ok().data(WorkFlowWrapper.INSTANCE.toDto(pageList));
}
/**
* 获取各流程数量
*
* @param
* @return
*/
public AjaxResult getWorkFlowCount() {
WorkFlowCountDto workFlowCountDto = new WorkFlowCountDto();
// 发起的流程数量
int createFlowCount = count(new QueryWrapper<WorkFlow>().lambda()
.eq(WorkFlow::getUserId, StpUtil.getLoginIdAsString()));
workFlowCountDto.setCreateFlowCount(createFlowCount);
// 待审批的流程数量
int approvalFlowCount = count(new QueryWrapper<WorkFlow>().lambda()
.eq(WorkFlow::getStatus, WorkFlowStatusEnum.ACTIVE.getStatus())
.eq(WorkFlow::getStepType, WorkFlowStepTypeEnum.APPROVAL.getType())
.exists(
"select 1 from t_work_flow_step step where t_work_flow.id = step.flow_id and t_work_flow.step" +
" = step.step and step.user_id = '" + StpUtil.getLoginIdAsString()
+ "' and step.status = '" + WorkFlowStepStatusEnum.NOT_START.getStatus() + "'"
)
);
workFlowCountDto.setApprovalFlowCount(approvalFlowCount);
// 待填写的流程数量
int writeFlowCount = count(new QueryWrapper<WorkFlow>().lambda()
.eq(WorkFlow::getStatus, WorkFlowStatusEnum.ACTIVE.getStatus())
.eq(WorkFlow::getStepType, WorkFlowStepTypeEnum.WRITE.getType())
.exists(
"select 1 from t_work_flow_step step where t_work_flow.id = step.flow_id and t_work_flow.step" +
" = step.step and step.user_id = '" + StpUtil.getLoginIdAsString()
+ "' and step.status = '" + WorkFlowStepStatusEnum.NOT_START.getStatus() + "'"
)
);
workFlowCountDto.setWriteFlowCount(writeFlowCount);
return AjaxResult.ok().data(workFlowCountDto);
}
}

View File

@ -0,0 +1,24 @@
package com.ydool.oa.workFlow.service;
import cn.dev33.satoken.stp.StpUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ydool.common.base.BaseService;
import com.ydool.common.data.dto.AjaxResult;
import com.ydool.oa.workFlow.data.entity.WorkFlowStepLog;
import com.ydool.oa.workFlow.mapper.WorkFlowStepLogMapper;
import org.springframework.stereotype.Service;
/**
* <p>
* 工作流程环节日志 服务类
* </p>
*
* @author zhouyuan
* @since 2023-05-26
*/
@Service
public class WorkFlowStepLogService extends BaseService<WorkFlowStepLogMapper, WorkFlowStepLog> {
}

View File

@ -0,0 +1,20 @@
package com.ydool.oa.workFlow.service;
import com.ydool.oa.workFlow.data.entity.WorkFlowStep;
import com.ydool.common.base.BaseService;
import com.ydool.oa.workFlow.mapper.WorkFlowStepMapper;
import org.springframework.stereotype.Service;
/**
* <p>
* 工作流程环节 服务类
* </p>
*
* @author zhouyuan
* @since 2023-05-26
*/
@Service
public class WorkFlowStepService extends BaseService<WorkFlowStepMapper, WorkFlowStep> {
}

View File

@ -91,6 +91,54 @@ public class SwaggerConfig {
return docket; return docket;
} }
@Bean(value = "defaultApi5")
public Docket defaultApi5() {
String groupName="综合管理";
Docket docket=new Docket(DocumentationType.SWAGGER_2)
.host("http://www.ydool.com/")
.apiInfo(apiInfo())
.groupName(groupName)
.select()
.apis(RequestHandlerSelectors.basePackage("com.ydool.integrated.controller"))
.paths(PathSelectors.any())
.build()
//赋予插件体系
.extensions(openApiExtensionResolver.buildExtensions(groupName));
return docket;
}
@Bean(value = "defaultApi6")
public Docket defaultApi6() {
String groupName="购销仓储";
Docket docket=new Docket(DocumentationType.SWAGGER_2)
.host("http://www.ydool.com/")
.apiInfo(apiInfo())
.groupName(groupName)
.select()
.apis(RequestHandlerSelectors.basePackage("com.ydool.grainStorage.controller"))
.paths(PathSelectors.any())
.build()
//赋予插件体系
.extensions(openApiExtensionResolver.buildExtensions(groupName));
return docket;
}
@Bean(value = "defaultApi7")
public Docket defaultApi7() {
String groupName="流程管理";
Docket docket=new Docket(DocumentationType.SWAGGER_2)
.host("http://www.ydool.com/")
.apiInfo(apiInfo())
.groupName(groupName)
.select()
.apis(RequestHandlerSelectors.basePackage("com.ydool.oa.workFlow.controller"))
.paths(PathSelectors.any())
.build()
//赋予插件体系
.extensions(openApiExtensionResolver.buildExtensions(groupName));
return docket;
}
private ApiInfo apiInfo() { private ApiInfo apiInfo() {
return new ApiInfoBuilder().title("接口文档系统") return new ApiInfoBuilder().title("接口文档系统")
.description("接口文档系统") .description("接口文档系统")

View File

@ -10,9 +10,11 @@ import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.ydool.common.base.BaseService; import com.ydool.common.base.BaseService;
import com.ydool.common.cache.ConfigCache; import com.ydool.common.cache.ConfigCache;
import com.ydool.common.constant.UrlConstant;
import com.ydool.common.data.dto.AjaxResult; import com.ydool.common.data.dto.AjaxResult;
import com.ydool.common.utils.HttpServletUtil; import com.ydool.common.utils.HttpServletUtil;
import com.ydool.common.utils.PasswordUtil; import com.ydool.common.utils.PasswordUtil;
import com.ydool.common.utils.RsaUtil;
import com.ydool.system.entity.Dept; import com.ydool.system.entity.Dept;
import com.ydool.system.entity.Menu; import com.ydool.system.entity.Menu;
import com.ydool.system.entity.Role; import com.ydool.system.entity.Role;
@ -58,8 +60,8 @@ public class AuthServiceImpl extends BaseService<UserMapper, User> implements IA
userName = URLDecoder.decode(userName, StandardCharsets.UTF_8.name()); userName = URLDecoder.decode(userName, StandardCharsets.UTF_8.name());
password = URLDecoder.decode(password, StandardCharsets.UTF_8.name()); password = URLDecoder.decode(password, StandardCharsets.UTF_8.name());
//按照Rsa解密用户名密码 //按照Rsa解密用户名密码
// userName = RsaUtil.decrypt(userName, UrlConstant.APP_PRIVATE_KEY); userName = RsaUtil.decrypt(userName, UrlConstant.APP_PRIVATE_KEY);
// password = RsaUtil.decrypt(password, UrlConstant.APP_PRIVATE_KEY); password = RsaUtil.decrypt(password, UrlConstant.APP_PRIVATE_KEY);
//根据用户名查询账号是否存在 //根据用户名查询账号是否存在
User loginUser = getOne(new QueryWrapper<User>().lambda().eq(User::getLoginName, userName)); User loginUser = getOne(new QueryWrapper<User>().lambda().eq(User::getLoginName, userName));
if (ObjectUtil.isNull(loginUser)) return AjaxResult.fail("账号或者密码错误"); if (ObjectUtil.isNull(loginUser)) return AjaxResult.fail("账号或者密码错误");

View File

@ -1 +1 @@
import{_ as e}from"./_plugin-vue_export-helper-c27b6911.js";import{o as c,c as o}from"./@vue-99409b8e.js";const r={};function t(n,_){return c(),o("div",null," 404 ")}const f=e(r,[["render",t]]);export{f as default}; import{_ as e}from"./_plugin-vue_export-helper-c27b6911.js";import{o as c,c as o}from"./@vue-5dd246aa.js";const r={};function t(n,_){return c(),o("div",null," 404 ")}const f=e(r,[["render",t]]);export{f as default};

View File

@ -1 +1 @@
System.register(["./_plugin-vue_export-helper-legacy-762b7923.js","./@vue-legacy-6c3c82af.js"],(function(e,t){"use strict";var r,u,n;return{setters:[e=>{r=e._},e=>{u=e.o,n=e.c}],execute:function(){e("default",r({},[["render",function(e,t){return u(),n("div",null," 404 ")}]]))}}})); System.register(["./_plugin-vue_export-helper-legacy-762b7923.js","./@vue-legacy-4de3d5b5.js"],(function(e,t){"use strict";var r,u,n;return{setters:[e=>{r=e._},e=>{u=e.o,n=e.c}],execute:function(){e("default",r({},[["render",function(e,t){return u(),n("div",null," 404 ")}]]))}}}));

View File

@ -0,0 +1 @@
function f(e){return f=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(r){return typeof r}:function(r){return r&&typeof Symbol=="function"&&r.constructor===Symbol&&r!==Symbol.prototype?"symbol":typeof r},f(e)}function l(e,r,t,n,a,c,i){try{var u=e[c](i),o=u.value}catch(y){t(y);return}u.done?r(o):Promise.resolve(o).then(n,a)}function p(e){return function(){var r=this,t=arguments;return new Promise(function(n,a){var c=e.apply(r,t);function i(o){l(c,n,a,i,u,"next",o)}function u(o){l(c,n,a,i,u,"throw",o)}i(void 0)})}}function m(e,r){if(f(e)!=="object"||e===null)return e;var t=e[Symbol.toPrimitive];if(t!==void 0){var n=t.call(e,r||"default");if(f(n)!=="object")return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return(r==="string"?String:Number)(e)}function s(e){var r=m(e,"string");return f(r)==="symbol"?r:String(r)}function b(e,r,t){return r=s(r),r in e?Object.defineProperty(e,r,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[r]=t,e}export{p as _,b as a,f as b};

View File

@ -0,0 +1 @@
System.register([],(function(t,r){"use strict";return{execute:function(){function r(n){return t("b",r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t}),r(n)}function n(t,r,n,e,o,i,u){try{var c=t[i](u),f=c.value}catch(l){return void n(l)}c.done?r(f):Promise.resolve(f).then(e,o)}function e(t){var n=function(t,n){if("object"!==r(t)||null===t)return t;var e=t[Symbol.toPrimitive];if(void 0!==e){var o=e.call(t,n||"default");if("object"!==r(o))return o;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===n?String:Number)(t)}(t,"string");return"symbol"===r(n)?n:String(n)}t({_:function(t){return function(){var r=this,e=arguments;return new Promise((function(o,i){var u=t.apply(r,e);function c(t){n(u,o,i,c,f,"next",t)}function f(t){n(u,o,i,c,f,"throw",t)}c(void 0)}))}},a:function(t,r,n){return(r=e(r))in t?Object.defineProperty(t,r,{value:n,enumerable:!0,configurable:!0,writable:!0}):t[r]=n,t},b:r})}}}));

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1 +1 @@
import{f,h as C,ag as a,o as h,R as k,S as e,a as y,d as l,W as d}from"./@vue-99409b8e.js";const A={class:"dialog-footer"},N={__name:"Approve",props:{},emits:["update:modelValue","handleApprove"],setup(c,{emit:p}){const s=c,u=f(!1),o=f({status:"2"}),m=()=>{u.value=!1,o.value={status:"2"},p("update:modelValue",!1)},V=()=>{p("handleApprove",o.value),m()};return C(()=>s.modelValue,v=>{s.modelValue&&(u.value=s.modelValue)}),(v,t)=>{const b=a("el-input"),r=a("el-form-item"),_=a("el-radio"),g=a("el-radio-group"),w=a("el-form"),i=a("el-button"),x=a("el-dialog");return h(),k(x,{modelValue:u.value,"onUpdate:modelValue":t[2]||(t[2]=n=>u.value=n),title:"审批",width:"26%","before-close":m},{footer:e(()=>[y("span",A,[l(i,{onClick:m},{default:e(()=>[d("取消")]),_:1}),l(i,{type:"primary",onClick:V},{default:e(()=>[d(" 确认 ")]),_:1})])]),default:e(()=>[l(w,{model:o.value},{default:e(()=>[l(r,{label:"审批意见"},{default:e(()=>[l(b,{modelValue:o.value.auditOpinion,"onUpdate:modelValue":t[0]||(t[0]=n=>o.value.auditOpinion=n),rows:4,type:"textarea"},null,8,["modelValue"])]),_:1}),l(r,{label:"审批状态"},{default:e(()=>[l(g,{modelValue:o.value.status,"onUpdate:modelValue":t[1]||(t[1]=n=>o.value.status=n)},{default:e(()=>[l(_,{label:"2"},{default:e(()=>[d("同意")]),_:1}),l(_,{label:"3"},{default:e(()=>[d("拒绝")]),_:1})]),_:1},8,["modelValue"])]),_:1})]),_:1},8,["model"])]),_:1},8,["modelValue"])}}};export{N as default}; import{f,h as C,ag as a,o as h,S as k,T as e,a as y,d as l,X as d}from"./@vue-5dd246aa.js";const A={class:"dialog-footer"},N={__name:"Approve",props:{},emits:["update:modelValue","handleApprove"],setup(c,{emit:p}){const s=c,u=f(!1),o=f({status:"2"}),m=()=>{u.value=!1,o.value={status:"2"},p("update:modelValue",!1)},V=()=>{p("handleApprove",o.value),m()};return C(()=>s.modelValue,v=>{s.modelValue&&(u.value=s.modelValue)}),(v,t)=>{const b=a("el-input"),r=a("el-form-item"),_=a("el-radio"),g=a("el-radio-group"),w=a("el-form"),i=a("el-button"),x=a("el-dialog");return h(),k(x,{modelValue:u.value,"onUpdate:modelValue":t[2]||(t[2]=n=>u.value=n),title:"审批",width:"26%","before-close":m},{footer:e(()=>[y("span",A,[l(i,{onClick:m},{default:e(()=>[d("取消")]),_:1}),l(i,{type:"primary",onClick:V},{default:e(()=>[d(" 确认 ")]),_:1})])]),default:e(()=>[l(w,{model:o.value},{default:e(()=>[l(r,{label:"审批意见"},{default:e(()=>[l(b,{modelValue:o.value.auditOpinion,"onUpdate:modelValue":t[0]||(t[0]=n=>o.value.auditOpinion=n),rows:4,type:"textarea"},null,8,["modelValue"])]),_:1}),l(r,{label:"审批状态"},{default:e(()=>[l(g,{modelValue:o.value.status,"onUpdate:modelValue":t[1]||(t[1]=n=>o.value.status=n)},{default:e(()=>[l(_,{label:"2"},{default:e(()=>[d("同意")]),_:1}),l(_,{label:"3"},{default:e(()=>[d("拒绝")]),_:1})]),_:1},8,["modelValue"])]),_:1})]),_:1},8,["model"])]),_:1},8,["modelValue"])}}};export{N as default};

Some files were not shown because too many files have changed in this diff Show More