diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/process/controller/FmProjectApprovalConfigController.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/process/controller/FmProjectApprovalConfigController.java new file mode 100644 index 000000000..f040ccd33 --- /dev/null +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/process/controller/FmProjectApprovalConfigController.java @@ -0,0 +1,93 @@ + +package org.springblade.desk.process.controller; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.Valid; +import lombok.AllArgsConstructor; +import org.springblade.core.boot.ctrl.BladeController; +import org.springblade.core.excel.util.ExcelUtil; +import org.springblade.core.mp.support.Condition; +import org.springblade.core.mp.support.Query; +import org.springblade.core.secure.BladeUser; +import org.springblade.core.secure.annotation.IsAdmin; +import org.springblade.core.tool.api.R; +import org.springblade.core.tool.utils.DateUtil; +import org.springblade.core.tool.utils.Func; +import org.springblade.desk.process.excel.FmProjectApprovalConfigExcel; +import org.springblade.desk.process.pojo.entity.FmProjectApprovalConfigEntity; +import org.springblade.desk.process.pojo.vo.FmProjectApprovalConfigVO; +import org.springblade.desk.process.service.IFmProjectApprovalConfigService; +import org.springblade.system.pojo.entity.User; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.Map; + +/** + * 项目审批配置 控制器 + * + * @author BladeX + * @since 2026-01-27 + */ +@RestController +@AllArgsConstructor +@RequestMapping("/fmProjectApprovalConfig") +@Tag(name = "项目审批配置", description = "项目审批配置接口") +public class FmProjectApprovalConfigController extends BladeController { + + private final IFmProjectApprovalConfigService fmProjectApprovalConfigService; + + /** + * 项目审批配置 + */ + @GetMapping("/list") + @ApiOperationSupport(order = 3) + @Operation(summary = "列表", description = "") + public R> page() { + return R.data(fmProjectApprovalConfigService.getList()); + } + + /** + * 根据节点编码查询审批用户列表 + */ + @GetMapping("/getUsersByNodeCode") + @ApiOperationSupport(order = 11) + @Operation(summary = "查询审批用户", description = "传入节点编码,返回该节点配置角色下的所有用户") + public R> getUsersByNodeCode(@Parameter(description = "节点编码", required = true) @RequestParam String nodeCode) { + List userList = fmProjectApprovalConfigService.getUsersByNodeCode(nodeCode); + return R.data(userList); + } + +// 批量修改 + + @PostMapping("/batchUpdate") + @ApiOperationSupport(order = 12) + @Operation(summary = "批量修改", description = "传入项目审批配置列表,根据id修改") + public R batchUpdate(@RequestBody List fmProjectApprovalConfigList) { + if (CollUtil.isEmpty(fmProjectApprovalConfigList)){ + return R.fail("参数错误"); + } + if (FmProjectApprovalConfigEntity.NODE_CODES.size() != fmProjectApprovalConfigList.size()){ + return R.fail("参数错误"); + } + for (FmProjectApprovalConfigEntity fmProjectApprovalConfig : fmProjectApprovalConfigList) { + if (!FmProjectApprovalConfigEntity.NODE_CODES.contains(fmProjectApprovalConfig.getNodeCode())){ + return R.fail("参数错误"); + } + if (StrUtil.isEmpty(fmProjectApprovalConfig.getRoleId())){ + throw new RuntimeException("请配置角色"); + } + } + return R.status(fmProjectApprovalConfigService.updateBatchById(fmProjectApprovalConfigList)); + } + +} diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/process/excel/FmProjectApprovalConfigExcel.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/process/excel/FmProjectApprovalConfigExcel.java new file mode 100644 index 000000000..80c6f1b91 --- /dev/null +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/process/excel/FmProjectApprovalConfigExcel.java @@ -0,0 +1,78 @@ + +package org.springblade.desk.process.excel; + +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.alibaba.excel.annotation.write.style.ContentRowHeight; +import com.alibaba.excel.annotation.write.style.HeadRowHeight; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.math.BigDecimal; + +/** + * 项目审批配置 Excel实体类 + * + * @author BladeX + * @since 2026-01-27 + */ +@Data +@ColumnWidth(25) +@HeadRowHeight(20) +@ContentRowHeight(18) +public class FmProjectApprovalConfigExcel implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键ID + */ + @ColumnWidth(20) + @ExcelProperty("主键ID") + private BigDecimal id; + + /** + * 节点编码 + */ + @ColumnWidth(20) + @ExcelProperty("节点编码") + private String nodeCode; + + /** + * 节点名称 + */ + @ColumnWidth(20) + @ExcelProperty("节点名称") + private String nodeName; + + /** + * 角色ID + */ + @ColumnWidth(20) + @ExcelProperty("角色ID") + private String roleId; + + /** + * 角色名称 + */ + @ColumnWidth(20) + @ExcelProperty("角色名称") + private String roleName; + + /** + * 备注说明 + */ + @ColumnWidth(20) + @ExcelProperty("备注说明") + private String remark; + + /** + * 状态 + */ + @ColumnWidth(20) + @ExcelProperty("状态") + private Integer status; + +} diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/process/mapper/FmProjectApprovalConfigMapper.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/process/mapper/FmProjectApprovalConfigMapper.java new file mode 100644 index 000000000..6fce06694 --- /dev/null +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/process/mapper/FmProjectApprovalConfigMapper.java @@ -0,0 +1,40 @@ + +package org.springblade.desk.process.mapper; + +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import org.apache.ibatis.annotations.Param; +import org.springblade.desk.process.excel.FmProjectApprovalConfigExcel; +import org.springblade.desk.process.pojo.entity.FmProjectApprovalConfigEntity; +import org.springblade.desk.process.pojo.vo.FmProjectApprovalConfigVO; + +import java.util.List; + +/** + * 项目审批配置 Mapper 接口 + * + * @author BladeX + * @since 2026-01-27 + */ +public interface FmProjectApprovalConfigMapper extends BaseMapper { + + /** + * 自定义分页 + * + * @param page 分页参数 + * @param fmProjectApprovalConfig 查询参数 + * @return List + */ + List selectFmProjectApprovalConfigPage(IPage page, FmProjectApprovalConfigVO fmProjectApprovalConfig); + + + /** + * 获取导出数据 + * + * @param queryWrapper 查询条件 + * @return List + */ + List exportFmProjectApprovalConfig(@Param("ew") Wrapper queryWrapper); + +} diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/process/mapper/FmProjectApprovalConfigMapper.xml b/blade-service/blade-desk/src/main/java/org/springblade/desk/process/mapper/FmProjectApprovalConfigMapper.xml new file mode 100644 index 000000000..01488d897 --- /dev/null +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/process/mapper/FmProjectApprovalConfigMapper.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/process/pojo/entity/FmProjectApprovalConfigEntity.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/process/pojo/entity/FmProjectApprovalConfigEntity.java new file mode 100644 index 000000000..5adf53ca3 --- /dev/null +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/process/pojo/entity/FmProjectApprovalConfigEntity.java @@ -0,0 +1,94 @@ + +package org.springblade.desk.process.pojo.entity; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.springblade.core.mp.base.BaseEntity; + +import java.io.Serial; +import java.util.Arrays; +import java.util.List; + +/** + * 项目审批配置 实体类 + * + * @author BladeX + * @since 2026-01-27 + */ +@Data +@TableName("FM_PROJECT_APPROVAL_CONFIG") +@Schema(description = "FmProjectApprovalConfig对象") +@EqualsAndHashCode(callSuper = true) +public class FmProjectApprovalConfigEntity extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 节点编码 + */ + @Schema(description = "节点编码:PROJECT_APPROVAL (立项 - 审批),EXECUTE_CHECK(执行-核查), CHECK_APPROVE(核查-核准)") + private String nodeCode; + + /** + * 节点名称 + */ + @Schema(description = "节点名称") + private String nodeName; + + /** + * 角色ID(多个角色用逗号分隔) + */ + @Schema(description = "角色ID(多个角色用逗号分隔)") + private String roleId; + + /** + * 角色名称(冗余字段,便于展示) + */ + @Schema(description = "角色名称(冗余字段,便于展示)") + private String roleName; + + /** + * 备注说明 + */ + @Schema(description = "备注说明") + private String remark; + + /** + * 状态:0-禁用,1-启用 + */ + @Schema(description = "状态:0-禁用,1-启用") + private Integer status; + + private Integer sortOrde; + + // ==================== 节点编码常量 ==================== + /** + * 立项 - 审批 + * */ + public static final String NODE_PROJECT_APPROVAL = "PROJECT_APPROVAL"; + /** + * 节点编码:执行-核查 + */ + public static final String NODE_EXECUTE_CHECK = "EXECUTE_CHECK"; + /** + * 节点编码:核查-核准 + */ + public static final String NODE_CHECK_APPROVE = "CHECK_APPROVE"; + + public static final List NODE_CODES = Arrays.asList(NODE_PROJECT_APPROVAL, NODE_EXECUTE_CHECK, NODE_CHECK_APPROVE); + + /** + * 状态:启用 + */ + public static final Integer STATUS_ENABLED = 1; + + /** + * 状态:禁用 + */ + public static final Integer STATUS_DISABLED = 0; + +} diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/process/pojo/vo/FmProjectApprovalConfigVO.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/process/pojo/vo/FmProjectApprovalConfigVO.java new file mode 100644 index 000000000..4b6c23d45 --- /dev/null +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/process/pojo/vo/FmProjectApprovalConfigVO.java @@ -0,0 +1,22 @@ + +package org.springblade.desk.process.pojo.vo; + +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.springblade.desk.process.pojo.entity.FmProjectApprovalConfigEntity; + +import java.io.Serial; + +/** + * 项目审批配置 视图实体类 + * + * @author BladeX + * @since 2026-01-27 + */ +@Data +@EqualsAndHashCode(callSuper = true) +public class FmProjectApprovalConfigVO extends FmProjectApprovalConfigEntity { + @Serial + private static final long serialVersionUID = 1L; + +} diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/process/service/IFmProjectApprovalConfigService.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/process/service/IFmProjectApprovalConfigService.java new file mode 100644 index 000000000..a11de7653 --- /dev/null +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/process/service/IFmProjectApprovalConfigService.java @@ -0,0 +1,57 @@ + +package org.springblade.desk.process.service; + +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import org.springblade.core.mp.base.BaseService; +import org.springblade.desk.process.excel.FmProjectApprovalConfigExcel; +import org.springblade.desk.process.pojo.entity.FmProjectApprovalConfigEntity; +import org.springblade.desk.process.pojo.vo.FmProjectApprovalConfigVO; +import org.springblade.system.pojo.entity.User; + +import java.util.List; + +/** + * 项目审批配置 服务类 + * + * @author BladeX + * @since 2026-01-27 + */ +public interface IFmProjectApprovalConfigService extends BaseService { + /** + * 自定义分页 + * + * @param page 分页参数 + * @param fmProjectApprovalConfig 查询参数 + * @return IPage + */ + IPage selectFmProjectApprovalConfigPage(IPage page, FmProjectApprovalConfigVO fmProjectApprovalConfig); + + + /** + * 导出数据 + * + * @param queryWrapper 查询条件 + * @return List + */ + List exportFmProjectApprovalConfig(Wrapper queryWrapper); + + /** + * 根据节点编码获取配置 + * + * @param nodeCode 节点编码 + * @return 审批配置 + */ + FmProjectApprovalConfigEntity getConfigByNodeCode(String nodeCode); + + /** + * 根据节点编码和角色查询用户列表 + * + * @param nodeCode 节点编码 + * @return 用户列表 + */ + List getUsersByNodeCode(String nodeCode); + + List getList(); + +} diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/process/service/impl/FmProjectApprovalConfigServiceImpl.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/process/service/impl/FmProjectApprovalConfigServiceImpl.java new file mode 100644 index 000000000..e56d43365 --- /dev/null +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/process/service/impl/FmProjectApprovalConfigServiceImpl.java @@ -0,0 +1,104 @@ + +package org.springblade.desk.process.service.impl; + +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.AllArgsConstructor; +import org.springblade.core.mp.base.BaseServiceImpl; +import org.springblade.desk.process.excel.FmProjectApprovalConfigExcel; +import org.springblade.desk.process.mapper.FmProjectApprovalConfigMapper; +import org.springblade.desk.process.pojo.entity.FmProjectApprovalConfigEntity; +import org.springblade.desk.process.pojo.vo.FmProjectApprovalConfigVO; +import org.springblade.desk.process.service.IFmProjectApprovalConfigService; +import org.springblade.system.feign.IUserClient; +import org.springblade.system.pojo.entity.User; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 项目审批配置 服务实现类 + * + * @author BladeX + * @since 2026-01-27 + */ +@Service +@AllArgsConstructor +public class FmProjectApprovalConfigServiceImpl extends BaseServiceImpl implements IFmProjectApprovalConfigService { + + private final IUserClient userClient; + + @Override + public IPage selectFmProjectApprovalConfigPage(IPage page, FmProjectApprovalConfigVO fmProjectApprovalConfig) { + return page.setRecords(baseMapper.selectFmProjectApprovalConfigPage(page, fmProjectApprovalConfig)); + } + + + @Override + public List exportFmProjectApprovalConfig(Wrapper queryWrapper) { + List list = baseMapper.exportFmProjectApprovalConfig(queryWrapper); + return list; + } + + @Override + public FmProjectApprovalConfigEntity getConfigByNodeCode(String nodeCode) { + if (nodeCode == null || nodeCode.trim().isEmpty()) { + return null; + } + return this.lambdaQuery() + .eq(FmProjectApprovalConfigEntity::getNodeCode, nodeCode) + .eq(FmProjectApprovalConfigEntity::getStatus, FmProjectApprovalConfigEntity.STATUS_ENABLED) + .one(); + } + + @Override + public List getUsersByNodeCode(String nodeCode) { + // 获取节点配置 + FmProjectApprovalConfigEntity config = getConfigByNodeCode(nodeCode); + if (config == null) { + return new ArrayList<>(); + } + + // 获取角色ID列表 + if (StrUtil.isEmpty(config.getRoleId())) { + return new ArrayList<>(); + } + List roleIdList = getRoleIdList(config.getRoleId()); + + return roleIdList.stream() + .map(userClient::userByRole) + .flatMap(Collection::stream) + .collect(Collectors.collectingAndThen( + Collectors.toMap( + User::getId, + user -> user, + (existing, replacement) -> existing + ), + map -> new ArrayList<>(map.values()) + )); + } + + public List getRoleIdList(String roleId) { + if (roleId == null || roleId.trim().isEmpty()) { + return List.of(); + } + return Arrays.stream(roleId.split(",")) + .map(String::trim) + .filter(s -> !s.isEmpty()) + .toList(); + } + + @Override + public List getList() { + return list(Wrappers.lambdaQuery(FmProjectApprovalConfigEntity.class) + .eq(FmProjectApprovalConfigEntity::getStatus, FmProjectApprovalConfigEntity.STATUS_ENABLED) + .orderByDesc(FmProjectApprovalConfigEntity::getSortOrde)); + } + +} diff --git a/doc/sql/oracle/project_approval_config.sql b/doc/sql/oracle/project_approval_config.sql new file mode 100644 index 000000000..8a1a7cecd --- /dev/null +++ b/doc/sql/oracle/project_approval_config.sql @@ -0,0 +1,82 @@ +-- 项目审批配置表 +CREATE TABLE FM_PROJECT_APPROVAL_CONFIG ( + ID NUMBER(20) NOT NULL, + NODE_CODE VARCHAR2(50) NOT NULL, -- 节点编码:EXECUTE_CHECK(执行-核查), CHECK_APPROVE(核查-核准) + NODE_NAME VARCHAR2(100) NOT NULL, -- 节点名称:执行核查、核查核准 + ROLE_ID VARCHAR2(200) NOT NULL, -- 角色ID(多个角色用逗号分隔) + ROLE_NAME VARCHAR2(500), -- 角色名称(冗余字段,便于展示) + REMARK VARCHAR2(500), -- 备注说明 + CREATE_USER NUMBER(20), -- 创建人 + CREATE_DEPT NUMBER(20), -- 创建部门 + CREATE_TIME DATE DEFAULT SYSDATE, -- 创建时间 + UPDATE_USER NUMBER(20), -- 更新人 + UPDATE_TIME DATE DEFAULT SYSDATE, -- 更新时间 + STATUS NUMBER(2) DEFAULT 1, -- 状态:0-禁用,1-启用 + IS_DELETED NUMBER(2) DEFAULT 0, -- 是否删除:0-未删除,1-已删除 + CONSTRAINT PK_FM_PROJECT_APPROVAL_CONFIG PRIMARY KEY (ID) +); + +-- 添加注释 +COMMENT ON TABLE FM_PROJECT_APPROVAL_CONFIG IS '项目审批配置表'; +COMMENT ON COLUMN FM_PROJECT_APPROVAL_CONFIG.ID IS '主键ID'; +COMMENT ON COLUMN FM_PROJECT_APPROVAL_CONFIG.NODE_CODE IS '节点编码:EXECUTE_CHECK(执行-核查), CHECK_APPROVE(核查-核准)'; +COMMENT ON COLUMN FM_PROJECT_APPROVAL_CONFIG.NODE_NAME IS '节点名称'; +COMMENT ON COLUMN FM_PROJECT_APPROVAL_CONFIG.ROLE_ID IS '角色ID(多个角色用逗号分隔)'; +COMMENT ON COLUMN FM_PROJECT_APPROVAL_CONFIG.ROLE_NAME IS '角色名称(冗余字段,便于展示)'; +COMMENT ON COLUMN FM_PROJECT_APPROVAL_CONFIG.REMARK IS '备注说明'; +COMMENT ON COLUMN FM_PROJECT_APPROVAL_CONFIG.CREATE_USER IS '创建人'; +COMMENT ON COLUMN FM_PROJECT_APPROVAL_CONFIG.CREATE_DEPT IS '创建部门'; +COMMENT ON COLUMN FM_PROJECT_APPROVAL_CONFIG.CREATE_TIME IS '创建时间'; +COMMENT ON COLUMN FM_PROJECT_APPROVAL_CONFIG.UPDATE_USER IS '更新人'; +COMMENT ON COLUMN FM_PROJECT_APPROVAL_CONFIG.UPDATE_TIME IS '更新时间'; +COMMENT ON COLUMN FM_PROJECT_APPROVAL_CONFIG.STATUS IS '状态:0-禁用,1-启用'; +COMMENT ON COLUMN FM_PROJECT_APPROVAL_CONFIG.IS_DELETED IS '是否删除:0-未删除,1-已删除'; + +-- 创建索引 +CREATE INDEX IDX_CONFIG_NODE_CODE ON FM_PROJECT_APPROVAL_CONFIG(NODE_CODE); +CREATE INDEX IDX_CONFIG_STATUS ON FM_PROJECT_APPROVAL_CONFIG(STATUS); + +-- 插入默认配置数据 +INSERT INTO FM_PROJECT_APPROVAL_CONFIG (ID, NODE_CODE, NODE_NAME, ROLE_ID, ROLE_NAME, REMARK, STATUS) +VALUES (1, 'PROJECT_APPROVAL', '立项-审批', '', '', '里程碑执行完成后,进入核查环节的审批角色配置', 1); + +INSERT INTO FM_PROJECT_APPROVAL_CONFIG (ID, NODE_CODE, NODE_NAME, ROLE_ID, ROLE_NAME, REMARK, STATUS) +VALUES (1, 'EXECUTE_CHECK', '执行-核查', '', '', '里程碑执行完成后,进入核查环节的审批角色配置', 1); + +INSERT INTO FM_PROJECT_APPROVAL_CONFIG (ID, NODE_CODE, NODE_NAME, ROLE_ID, ROLE_NAME, REMARK, STATUS) +VALUES (2, 'CHECK_APPROVE', '核查-核准', '', '', '里程碑核查通过后,进入核准环节的审批角色配置', 1); + +COMMIT; + + + +ALTER TABLE JONHON_MES.FM_PROJECT_MILESTONE ADD NEXT_APPROVER_ID VARCHAR2(100) NULL; +COMMENT ON COLUMN JONHON_MES.FM_PROJECT_MILESTONE.NEXT_APPROVER_ID IS '下一节点审批人ID'; +ALTER TABLE JONHON_MES.FM_PROJECT_MILESTONE ADD NEXT_APPROVER_NAME VARCHAR2(100) NULL; +COMMENT ON COLUMN JONHON_MES.FM_PROJECT_MILESTONE.NEXT_APPROVER_NAME IS '下一节点审批人名称'; + + + +-- 1. 添加排序字段 SORT_ORDER +ALTER TABLE FM_PROJECT_APPROVAL_CONFIG ADD (SORT_ORDER NUMBER(20)); + +-- 添加字段注释 +COMMENT ON COLUMN FM_PROJECT_APPROVAL_CONFIG.SORT_ORDER IS '排序字段'; + +-- 2. 将现有数据的排序字段更新为与 ID 一致 +UPDATE FM_PROJECT_APPROVAL_CONFIG SET SORT_ORDER = ID; + +COMMIT; + +ALTER TABLE JONHON_MES.FM_PROJECT_APPLICATION ADD APPROVAL_MAN VARCHAR2(100) NULL; +COMMENT ON COLUMN JONHON_MES.FM_PROJECT_APPLICATION.APPROVAL_MAN IS '审批人'; +ALTER TABLE JONHON_MES.FM_PROJECT_APPLICATION ADD APPROVAL_MAN_NAME VARCHAR2(100) NULL; +COMMENT ON COLUMN JONHON_MES.FM_PROJECT_APPLICATION.APPROVAL_MAN_NAME IS '审批人名称'; + + +ALTER TABLE JONHON_MES.FM_PROJECT_APPLICATION MODIFY APPROVAL_MAN NUMBER(38,0); + + +ALTER TABLE JONHON_MES.FM_PROJECT_MILESTONE MODIFY NEXT_APPROVER_ID NUMBER(38,0); + +ALTER TABLE JONHON_MES.FM_PROJECT_MILESTONE ADD GRADE_MAN_ID NUMBER(38,0) NULL;