流程管理

liweidong
张乾翔 3 days ago
parent 05219738c8
commit a0a9772963
  1. 93
      blade-service/blade-desk/src/main/java/org/springblade/desk/process/controller/FmProjectApprovalConfigController.java
  2. 78
      blade-service/blade-desk/src/main/java/org/springblade/desk/process/excel/FmProjectApprovalConfigExcel.java
  3. 40
      blade-service/blade-desk/src/main/java/org/springblade/desk/process/mapper/FmProjectApprovalConfigMapper.java
  4. 44
      blade-service/blade-desk/src/main/java/org/springblade/desk/process/mapper/FmProjectApprovalConfigMapper.xml
  5. 94
      blade-service/blade-desk/src/main/java/org/springblade/desk/process/pojo/entity/FmProjectApprovalConfigEntity.java
  6. 22
      blade-service/blade-desk/src/main/java/org/springblade/desk/process/pojo/vo/FmProjectApprovalConfigVO.java
  7. 57
      blade-service/blade-desk/src/main/java/org/springblade/desk/process/service/IFmProjectApprovalConfigService.java
  8. 104
      blade-service/blade-desk/src/main/java/org/springblade/desk/process/service/impl/FmProjectApprovalConfigServiceImpl.java
  9. 82
      doc/sql/oracle/project_approval_config.sql

@ -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<List<FmProjectApprovalConfigEntity>> page() {
return R.data(fmProjectApprovalConfigService.getList());
}
/**
* 根据节点编码查询审批用户列表
*/
@GetMapping("/getUsersByNodeCode")
@ApiOperationSupport(order = 11)
@Operation(summary = "查询审批用户", description = "传入节点编码,返回该节点配置角色下的所有用户")
public R<List<User>> getUsersByNodeCode(@Parameter(description = "节点编码", required = true) @RequestParam String nodeCode) {
List<User> userList = fmProjectApprovalConfigService.getUsersByNodeCode(nodeCode);
return R.data(userList);
}
// 批量修改
@PostMapping("/batchUpdate")
@ApiOperationSupport(order = 12)
@Operation(summary = "批量修改", description = "传入项目审批配置列表,根据id修改")
public R<Boolean> batchUpdate(@RequestBody List<FmProjectApprovalConfigEntity> 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));
}
}

@ -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;
}

@ -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<FmProjectApprovalConfigEntity> {
/**
* 自定义分页
*
* @param page 分页参数
* @param fmProjectApprovalConfig 查询参数
* @return List<FmProjectApprovalConfigVO>
*/
List<FmProjectApprovalConfigVO> selectFmProjectApprovalConfigPage(IPage page, FmProjectApprovalConfigVO fmProjectApprovalConfig);
/**
* 获取导出数据
*
* @param queryWrapper 查询条件
* @return List<FmProjectApprovalConfigExcel>
*/
List<FmProjectApprovalConfigExcel> exportFmProjectApprovalConfig(@Param("ew") Wrapper<FmProjectApprovalConfigEntity> queryWrapper);
}

@ -0,0 +1,44 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.springblade.desk.process.mapper.FmProjectApprovalConfigMapper">
<!-- 通用查询映射结果 -->
<resultMap id="configResultMap" type="org.springblade.desk.process.pojo.entity.FmProjectApprovalConfigEntity">
<id column="ID" property="id"/>
<result column="NODE_CODE" property="nodeCode"/>
<result column="NODE_NAME" property="nodeName"/>
<result column="ROLE_ID" property="roleId"/>
<result column="ROLE_NAME" property="roleName"/>
<result column="REMARK" property="remark"/>
<result column="STATUS" property="status"/>
<result column="CREATE_USER" property="createUser"/>
<result column="CREATE_DEPT" property="createDept"/>
<result column="CREATE_TIME" property="createTime"/>
<result column="UPDATE_USER" property="updateUser"/>
<result column="UPDATE_TIME" property="updateTime"/>
<result column="IS_DELETED" property="isDeleted"/>
</resultMap>
<select id="selectFmProjectApprovalConfigPage" resultMap="configResultMap">
select * from FM_PROJECT_APPROVAL_CONFIG
<where>
IS_DELETED = 0
<if test="fmProjectApprovalConfig.nodeCode != null and fmProjectApprovalConfig.nodeCode != ''">
and NODE_CODE = #{fmProjectApprovalConfig.nodeCode}
</if>
<if test="fmProjectApprovalConfig.nodeName != null and fmProjectApprovalConfig.nodeName != ''">
and NODE_NAME LIKE CONCAT('%', CONCAT(#{fmProjectApprovalConfig.nodeName}, '%'))
</if>
<if test="fmProjectApprovalConfig.status != null">
and STATUS = #{fmProjectApprovalConfig.status}
</if>
</where>
order by CREATE_TIME desc
</select>
<select id="exportFmProjectApprovalConfig" resultType="org.springblade.desk.process.excel.FmProjectApprovalConfigExcel">
SELECT * FROM FM_PROJECT_APPROVAL_CONFIG ${ew.customSqlSegment}
</select>
</mapper>

@ -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<String> 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;
}

@ -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;
}

@ -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<FmProjectApprovalConfigEntity> {
/**
* 自定义分页
*
* @param page 分页参数
* @param fmProjectApprovalConfig 查询参数
* @return IPage<FmProjectApprovalConfigVO>
*/
IPage<FmProjectApprovalConfigVO> selectFmProjectApprovalConfigPage(IPage<FmProjectApprovalConfigVO> page, FmProjectApprovalConfigVO fmProjectApprovalConfig);
/**
* 导出数据
*
* @param queryWrapper 查询条件
* @return List<FmProjectApprovalConfigExcel>
*/
List<FmProjectApprovalConfigExcel> exportFmProjectApprovalConfig(Wrapper<FmProjectApprovalConfigEntity> queryWrapper);
/**
* 根据节点编码获取配置
*
* @param nodeCode 节点编码
* @return 审批配置
*/
FmProjectApprovalConfigEntity getConfigByNodeCode(String nodeCode);
/**
* 根据节点编码和角色查询用户列表
*
* @param nodeCode 节点编码
* @return 用户列表
*/
List<User> getUsersByNodeCode(String nodeCode);
List<FmProjectApprovalConfigEntity> getList();
}

@ -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<FmProjectApprovalConfigMapper, FmProjectApprovalConfigEntity> implements IFmProjectApprovalConfigService {
private final IUserClient userClient;
@Override
public IPage<FmProjectApprovalConfigVO> selectFmProjectApprovalConfigPage(IPage<FmProjectApprovalConfigVO> page, FmProjectApprovalConfigVO fmProjectApprovalConfig) {
return page.setRecords(baseMapper.selectFmProjectApprovalConfigPage(page, fmProjectApprovalConfig));
}
@Override
public List<FmProjectApprovalConfigExcel> exportFmProjectApprovalConfig(Wrapper<FmProjectApprovalConfigEntity> queryWrapper) {
List<FmProjectApprovalConfigExcel> 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<User> getUsersByNodeCode(String nodeCode) {
// 获取节点配置
FmProjectApprovalConfigEntity config = getConfigByNodeCode(nodeCode);
if (config == null) {
return new ArrayList<>();
}
// 获取角色ID列表
if (StrUtil.isEmpty(config.getRoleId())) {
return new ArrayList<>();
}
List<String> 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<String> 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<FmProjectApprovalConfigEntity> getList() {
return list(Wrappers.lambdaQuery(FmProjectApprovalConfigEntity.class)
.eq(FmProjectApprovalConfigEntity::getStatus, FmProjectApprovalConfigEntity.STATUS_ENABLED)
.orderByDesc(FmProjectApprovalConfigEntity::getSortOrde));
}
}

@ -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;
Loading…
Cancel
Save