yxk-20260731

改善提案
新增提案时,提案部门默认选中当前登录部门,用户可改选本人所属的有效业务部门。候选范围严格限定为用户关联部门中 org_type='2' 且 org_category='2' 的记录,排除岗位、科室及其他组织节点。
This commit is contained in:
ye1023
2026-07-31 14:07:47 +08:00
parent 915581eba1
commit 6811e3ea01
4 changed files with 109 additions and 12 deletions
@@ -30,6 +30,7 @@ import org.jeecg.modules.improvementproposal.entity.ImprovementProposal;
import org.jeecg.modules.improvementproposal.dto.ImprovementDeptScoreBpmDTO;
import org.jeecg.modules.improvementproposal.dto.ImprovementInstituteVoteCandidateDTO;
import org.jeecg.modules.improvementproposal.dto.ImprovementProposalBpmActionDTO;
import org.jeecg.modules.improvementproposal.dto.ImprovementProposalDepartmentDTO;
import org.jeecg.modules.improvementproposal.vo.ImprovementProposalPage;
import org.jeecg.modules.improvementproposal.service.IImprovementProposalService;
import org.jeecg.modules.improvementproposal.service.IImprovementDeptScoreService;
@@ -105,13 +106,26 @@ public class ImprovementProposalController {
ImprovementProposal improvementProposal = new ImprovementProposal();
BeanUtils.copyProperties(improvementProposalPage, improvementProposal);
improvementProposal.setBpmStatus("1");
// 新增申请在保存事务内分配年度流水号,避免前端预取号产生并发重复。
improvementProposalService.createNewProposal(improvementProposal);
// 附件必须使用已落库的主表 ID 关联,不能使用响应成功文案。
Map<String, String> result = new HashMap<>(2);
result.put("id", improvementProposal.getId());
result.put("proposalNo", improvementProposal.getProposalNo());
return Result.OK("添加成功!", result);
try {
// 新增申请在保存事务内分配年度流水号,避免前端预取号产生并发重复。
improvementProposalService.createNewProposal(improvementProposal, currentUser());
// 附件必须使用已落库的主表 ID 关联,不能使用响应成功文案。
Map<String, String> result = new HashMap<>(2);
result.put("id", improvementProposal.getId());
result.put("proposalNo", improvementProposal.getProposalNo());
return Result.OK("添加成功!", result);
} catch (IllegalStateException e) {
return Result.error(e.getMessage());
}
}
/**
* 获取当前登录用户可作为改善提案归属的业务部门。
*/
@GetMapping(value = "/myProposalDepartments")
@RequiresPermissions("improvementproposal:improvement_proposal:add")
public Result<List<ImprovementProposalDepartmentDTO>> getMyProposalDepartments() {
return Result.OK(improvementProposalService.getMyProposalDepartments(currentUser()));
}
/**
@@ -0,0 +1,24 @@
package org.jeecg.modules.improvementproposal.dto;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.io.Serializable;
/**
* 当前登录用户可作为改善提案归属的业务部门。
*/
@Data
@Schema(description = "改善提案可选业务部门")
public class ImprovementProposalDepartmentDTO implements Serializable {
private static final long serialVersionUID = 1L;
@Schema(description = "部门ID")
private String id;
@Schema(description = "部门名称")
private String departName;
@Schema(description = "部门编码")
private String orgCode;
}
@@ -6,6 +6,7 @@ import org.jeecg.modules.improvementproposal.entity.ImprovementProposal;
import org.jeecg.modules.improvementproposal.dto.ImprovementDeptScoreBpmDTO;
import org.jeecg.modules.improvementproposal.dto.ImprovementInstituteVoteCandidateDTO;
import org.jeecg.modules.improvementproposal.dto.ImprovementProposalBpmActionDTO;
import org.jeecg.modules.improvementproposal.dto.ImprovementProposalDepartmentDTO;
import org.jeecg.common.system.vo.LoginUser;
import com.baomidou.mybatisplus.extension.service.IService;
import javax.servlet.http.HttpServletRequest;
@@ -43,8 +44,17 @@ public interface IImprovementProposalService extends IService<ImprovementProposa
* 创建新的改善提案,并在保存事务内生成不可重复的年度提案编号。
*
* @param improvementProposal 提案主表数据
* @param loginUser 当前登录用户
*/
void createNewProposal(ImprovementProposal improvementProposal);
void createNewProposal(ImprovementProposal improvementProposal, LoginUser loginUser);
/**
* 查询当前登录人可选择的改善提案归属部门。
*
* @param loginUser 当前登录用户
* @return 有效业务部门列表
*/
List<ImprovementProposalDepartmentDTO> getMyProposalDepartments(LoginUser loginUser);
/**
* 修改一对多
@@ -6,6 +6,7 @@ import org.jeecg.modules.improvementproposal.entity.ImprovementInstituteVote;
import org.jeecg.modules.improvementproposal.dto.ImprovementDeptScoreBpmDTO;
import org.jeecg.modules.improvementproposal.dto.ImprovementInstituteVoteCandidateDTO;
import org.jeecg.modules.improvementproposal.dto.ImprovementProposalBpmActionDTO;
import org.jeecg.modules.improvementproposal.dto.ImprovementProposalDepartmentDTO;
import org.jeecg.modules.improvementproposal.mapper.ImprovementDeptScoreMapper;
import org.jeecg.modules.improvementproposal.mapper.ImprovementInstituteVoteMapper;
import org.jeecg.modules.improvementproposal.mapper.ImprovementProposalMapper;
@@ -25,6 +26,7 @@ import java.math.RoundingMode;
import java.util.HashMap;
import java.util.List;
import java.util.Collection;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.Map;
@@ -33,7 +35,9 @@ import org.flowable.engine.HistoryService;
import org.flowable.engine.TaskService;
import org.flowable.task.api.Task;
import org.jeecg.modules.system.entity.SysRole;
import org.jeecg.modules.system.entity.SysDepart;
import org.jeecg.modules.system.service.ISysRoleService;
import org.jeecg.modules.system.service.ISysUserDepartService;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
@@ -86,6 +90,8 @@ public class ImprovementProposalServiceImpl extends ServiceImpl<ImprovementPropo
@Autowired
private ISysRoleService sysRoleService;
@Autowired
private ISysUserDepartService sysUserDepartService;
@Autowired
private IExtActTaskCcService extActTaskCcService;
@Override
@@ -126,10 +132,8 @@ public class ImprovementProposalServiceImpl extends ServiceImpl<ImprovementPropo
@Override
@Transactional(rollbackFor = Exception.class)
public void createNewProposal(ImprovementProposal improvementProposal) {
if (oConvertUtils.isEmpty(improvementProposal.getProposalDeptName())) {
throw new IllegalStateException("提案部门不能为空,无法生成提案编号");
}
public void createNewProposal(ImprovementProposal improvementProposal, LoginUser loginUser) {
fillAndValidateProposalDepartment(improvementProposal, loginUser);
int proposalYear = getProposalYear(improvementProposal.getProposalDate());
// 年度控制表通过主键锁串行递增,整个创建事务回滚时流水号也会随之回滚。
@@ -143,6 +147,51 @@ public class ImprovementProposalServiceImpl extends ServiceImpl<ImprovementPropo
saveMain(improvementProposal, null, null);
}
@Override
public List<ImprovementProposalDepartmentDTO> getMyProposalDepartments(LoginUser loginUser) {
if (loginUser == null || oConvertUtils.isEmpty(loginUser.getId())) {
return new ArrayList<>();
}
return getAvailableProposalDepartments(loginUser.getId());
}
/**
* 只允许用户所属的有效业务部门作为提案归属,岗位、科室及逻辑删除部门均不可选择。
*/
private List<ImprovementProposalDepartmentDTO> getAvailableProposalDepartments(String userId) {
List<ImprovementProposalDepartmentDTO> departments = new ArrayList<>();
for (SysDepart depart : sysUserDepartService.getOrderedDepartListById(userId)) {
if (!"2".equals(depart.getOrgType()) || !"2".equals(depart.getOrgCategory()) || !NORMAL_DEL_FLAG.equals(depart.getDelFlag())) {
continue;
}
ImprovementProposalDepartmentDTO department = new ImprovementProposalDepartmentDTO();
department.setId(depart.getId());
department.setDepartName(depart.getDepartName());
department.setOrgCode(depart.getOrgCode());
departments.add(department);
}
return departments;
}
/**
* 前端只能提交部门 ID;部门名称必须由服务端依据当前用户的有效部门重新回填。
*/
private void fillAndValidateProposalDepartment(ImprovementProposal improvementProposal, LoginUser loginUser) {
if (loginUser == null || oConvertUtils.isEmpty(loginUser.getId())) {
throw new IllegalStateException("未获取到当前登录用户,无法保存提案");
}
if (oConvertUtils.isEmpty(improvementProposal.getProposalDeptId())) {
throw new IllegalStateException("请选择提案部门");
}
for (ImprovementProposalDepartmentDTO department : getAvailableProposalDepartments(loginUser.getId())) {
if (improvementProposal.getProposalDeptId().equals(department.getId())) {
improvementProposal.setProposalDeptName(department.getDepartName());
return;
}
}
throw new IllegalStateException("所选提案部门无权限或不是有效业务部门");
}
private int getProposalYear(Date proposalDate) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(proposalDate == null ? new Date() : proposalDate);