This commit is contained in:
zt
2025-08-28 14:37:30 +08:00
parent 936145138e
commit 7e0cd7c946
19 changed files with 157 additions and 27 deletions

View File

@ -74,7 +74,7 @@ public interface UserService {
* @param roleIds 角色ids
* @return 用户
*/
List<UserDTO> selectUsersByRoleIds(List<Long> roleIds);
List<UserDTO> selectUsersByRoleIds(List<Long> roleIds,Long projectId);
/**
* 通过部门ID查询用户

View File

@ -133,10 +133,8 @@ public class BusMrpBaseController extends BaseController {
* 获取剩余量
*/
@GetMapping("/remaining")
public R<Integer> remaining(Long suppliespriceId) {
BigDecimal remaining = busMrpBaseService.remaining(suppliespriceId);
BusBillofquantities byId = busBillofquantitiesService.getById(suppliespriceId);
return R.ok(byId.getQuantity().subtract(remaining).intValue());
public R<BigDecimal> remaining(Long suppliespriceId,Long mrpBaseId) {
return R.ok(busMrpBaseService.remaining(suppliespriceId,mrpBaseId));
}

View File

@ -1,5 +1,6 @@
package org.dromara.cailiaoshebei.domain.vo;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.util.Date;
import com.fasterxml.jackson.annotation.JsonFormat;
@ -43,6 +44,11 @@ public class BusMaterialbatchdemandplanVo implements Serializable {
@ExcelProperty(value = "批次ID")
private String batchId;
/**
* 批次号
*/
private String batchNumber;
/**
* 基础信息ID
*/
@ -125,4 +131,9 @@ public class BusMaterialbatchdemandplanVo implements Serializable {
*/
private String qs;
/**
* 创建时间
*/
private BigDecimal remaining;
}

View File

@ -87,5 +87,5 @@ public interface IBusMrpBaseService extends IService<BusMrpBase>{
/**
* 获取物资已有数量
*/
BigDecimal remaining(Long suppliespriceId);
BigDecimal remaining(Long suppliespriceId,Long mrpBaseId);
}

View File

@ -63,6 +63,7 @@ public class BusMrpBaseServiceImpl extends ServiceImpl<BusMrpBaseMapper, BusMrpB
private final IBusBillofquantitiesService busBillofquantitiesService;
/**
* 查询物资-批次需求计划基础信息
*
@ -77,6 +78,10 @@ public class BusMrpBaseServiceImpl extends ServiceImpl<BusMrpBaseMapper, BusMrpB
BusMaterialbatchdemandplanBo planBo = new BusMaterialbatchdemandplanBo();
planBo.setMrpBaseId(id);
List<BusMaterialbatchdemandplanVo> voList = planservice.queryList(planBo);
for (BusMaterialbatchdemandplanVo vo : voList) {
BigDecimal remaining = remaining(vo.getSuppliespriceId(), id);
vo.setRemaining(remaining);
}
busMrpVo.setMrpBaseBo(busMrpBaseVo);
busMrpVo.setPlanList(voList);
@ -266,20 +271,22 @@ public class BusMrpBaseServiceImpl extends ServiceImpl<BusMrpBaseMapper, BusMrpB
@Override
public BigDecimal remaining(Long suppliespriceId) {
public BigDecimal remaining(Long suppliespriceId,Long mrpBaseId) {
BusBillofquantities byId = busBillofquantitiesService.getById(suppliespriceId);
// 获取数据库中已有的数量
List<BusMaterialbatchdemandplan> existingList = planservice.list(
Wrappers.lambdaQuery(BusMaterialbatchdemandplan.class)
.eq(BusMaterialbatchdemandplan::getSuppliespriceId, suppliespriceId) // 排除当前批次
.eq(BusMaterialbatchdemandplan::getSuppliespriceId, suppliespriceId)
.ne(mrpBaseId!=null,BusMaterialbatchdemandplan::getMrpBaseId, mrpBaseId)// 排除当前批次
);
if(CollectionUtil.isEmpty(existingList)){
return BigDecimal.ZERO;
}
return existingList.stream()
BigDecimal reduce = existingList.stream()
.map(BusMaterialbatchdemandplan::getDemandQuantity)
.reduce(BigDecimal.ZERO, BigDecimal::add);
return byId.getQuantity().subtract(reduce);
}
/**

View File

@ -107,4 +107,6 @@ public class BusDrawingreviewReceiptsController extends BaseController {
return toAjax(busDrawingreviewReceiptsService.deleteWithValidByIds(List.of(ids), true));
}
}

View File

@ -159,4 +159,9 @@ public class BusDrawingreviewReceipts extends BaseEntity {
private String finalState;
private Long approveId;
private String approve;
}

View File

@ -151,4 +151,8 @@ public class BusDrawingreviewReceiptsBo extends BaseEntity {
private String finalState;
private Long approveId;
private String approve;
}

View File

@ -429,6 +429,11 @@ public class DesVolumeFileServiceImpl extends ServiceImpl<DesVolumeFileMapper, D
}
desVolumeFile.setAuditStatus(processEvent.getStatus());
if (processEvent.getStatus().equals("finish")) {
//修改目录状态
volumeCatalogService.update(Wrappers.<DesVolumeCatalog>lambdaUpdate()
.set(DesVolumeCatalog::getDesignState, "1")
.eq(DesVolumeCatalog::getDesign, desVolumeFile.getVolumeCatalogId())
);
//异步处理二维码
self.addQRCodeToPDF(desVolumeFile.getId(), false)
.thenAccept(result -> log.info("图纸[{}-{} ]添加二维码成功", desVolumeFile.getFileName(), desVolumeFile.getId()))

View File

@ -429,6 +429,7 @@ public class MatMaterialReceiveServiceImpl extends ServiceImpl<MatMaterialReceiv
String orderingUnit = req.getOrderingUnit();
String supplierUnit = req.getSupplierUnit();
String storageType = req.getStorageType();
lqw.orderByDesc(MatMaterialReceive::getCreateTime);
lqw.like(StringUtils.isNotBlank(projectName), MatMaterialReceive::getProjectName, projectName);
lqw.like(StringUtils.isNotBlank(materialName), MatMaterialReceive::getMaterialName, materialName);
lqw.like(StringUtils.isNotBlank(contractName), MatMaterialReceive::getContractName, contractName);

View File

@ -31,4 +31,7 @@ public class SysUserRole {
*/
private Long projectId;
private Long projectId;
}

View File

@ -845,14 +845,16 @@ public class SysUserServiceImpl implements ISysUserService, UserService {
* @return 用户
*/
@Override
public List<UserDTO> selectUsersByRoleIds(List<Long> roleIds) {
public List<UserDTO> selectUsersByRoleIds(List<Long> roleIds,Long projectId) {
if (CollUtil.isEmpty(roleIds)) {
return List.of();
}
// 通过角色ID获取用户角色信息
List<SysUserRole> userRoles = userRoleMapper.selectList(
new LambdaQueryWrapper<SysUserRole>().in(SysUserRole::getRoleId, roleIds));
new LambdaQueryWrapper<SysUserRole>().in(SysUserRole::getRoleId, roleIds)
.eq(projectId!=null,SysUserRole::getProjectId, projectId)
);
// 获取用户ID列表
Set<Long> userIds = StreamUtils.toSet(userRoles, SysUserRole::getUserId);

View File

@ -1,4 +0,0 @@
package org.dromara.workflow.filter;
public class RoleCandidateExcludeFilter {
}

View File

@ -1,21 +1,27 @@
package org.dromara.workflow.listener;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.map.MapUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.json.JSONUtil;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.dromara.common.core.domain.dto.UserDTO;
import org.dromara.common.core.domain.model.LoginUser;
import org.dromara.common.core.enums.BusinessStatusEnum;
import org.dromara.common.core.utils.StringUtils;
import org.dromara.warm.flow.core.FlowEngine;
import org.dromara.warm.flow.core.dto.FlowParams;
import org.dromara.warm.flow.core.entity.Definition;
import org.dromara.warm.flow.core.entity.Instance;
import org.dromara.warm.flow.core.entity.Node;
import org.dromara.warm.flow.core.entity.Task;
import org.dromara.warm.flow.core.listener.GlobalListener;
import org.dromara.warm.flow.core.listener.ListenerVariable;
import org.dromara.warm.flow.core.service.InsService;
import org.dromara.warm.flow.orm.entity.FlowInstance;
import org.dromara.warm.flow.orm.entity.FlowNode;
import org.dromara.warm.flow.orm.entity.FlowTask;
import org.dromara.workflow.common.ConditionalOnEnable;
import org.dromara.workflow.common.constant.FlowConstant;
@ -24,12 +30,12 @@ import org.dromara.workflow.domain.bo.FlowCopyBo;
import org.dromara.workflow.handler.FlowProcessEventHandler;
import org.dromara.workflow.service.IFlwCommonService;
import org.dromara.workflow.service.IFlwInstanceService;
import org.dromara.workflow.service.IFlwTaskAssigneeService;
import org.dromara.workflow.service.IFlwTaskService;
import org.springframework.stereotype.Component;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.*;
import java.util.stream.Collectors;
/**
* 全局任务办理监听
@ -47,6 +53,7 @@ public class WorkflowGlobalListener implements GlobalListener {
private final FlowProcessEventHandler flowProcessEventHandler;
private final IFlwCommonService flwCommonService;
private final InsService insService;
private final IFlwTaskAssigneeService flwTaskAssigneeService;
/**
* 创建监听器,任务创建时执行
@ -55,9 +62,46 @@ public class WorkflowGlobalListener implements GlobalListener {
*/
@Override
public void create(ListenerVariable listenerVariable) {
log.info("全局创建监听器开始执行......");
// 获取相关变量
// List<Task> nextTasks = listenerVariable.getNextTasks();
// Definition definition = listenerVariable.getDefinition();
// Map<String, Object> variable = listenerVariable.getVariable();
//
// for (Task flowTask : nextTasks) {
// String nodeCode = flowTask.getNodeCode();
//
//
// // 查询节点信息
// FlowNode byNodeCode = flwTaskService.getByNodeCode(nodeCode, definition.getId());
//
// // 获取原来的办理人信息
// List<String> originalPermissionList = flowTask.getPermissionList();
// log.info("节点 {} 原来的办理人信息: {}", nodeCode, originalPermissionList);
// String permissionFlag = byNodeCode.getPermissionFlag();
// try {
// if(permissionFlag.contains("role")){
// permissionFlag = permissionFlag.replace("@@", ",");
//
// String flowCode = definition.getFlowCode();
// String projectId = flowCode.split("_")[0];
//
// List<UserDTO> userDTOS = flwTaskAssigneeService.fetchUsersByStorageIds(permissionFlag, Long.valueOf(projectId));
// variable.put("userList", userDTOS.stream().map(UserDTO::getUserId).map(String::valueOf).collect(Collectors.toList()));
// flowTask.setPermissionList(userDTOS.stream().map(UserDTO::getUserId).map(String::valueOf).collect(Collectors.toList()));
// }
//
// }catch (Exception e) {
// log.error("设置失败: {}", e.getMessage());
// }
// }
log.info("全局创建监听器执行结束......");
}
/**
* 开始监听器,任务开始办理时执行
*
@ -65,6 +109,7 @@ public class WorkflowGlobalListener implements GlobalListener {
*/
@Override
public void start(ListenerVariable listenerVariable) {
}
/**
@ -92,6 +137,27 @@ public class WorkflowGlobalListener implements GlobalListener {
if (flowTask.getNodeCode().equals(applyNodeCode)) {
flowTask.setPermissionList(List.of(instance.getCreateBy()));
}
// String nodeCode = flowTask.getNodeCode();
// // 查询节点信息
// FlowNode byNodeCode = flwTaskService.getByNodeCode(nodeCode, definition.getId());
// // 获取原来的办理人信息
// List<String> originalPermissionList = flowTask.getPermissionList();
// log.info("节点 {} 原来的办理人信息: {}", nodeCode, originalPermissionList);
// String permissionFlag = byNodeCode.getPermissionFlag();
// try {
// if (permissionFlag.contains("role")) {
// permissionFlag = permissionFlag.replace("@@", ",");
//
// String flowCode = definition.getFlowCode();
// String projectId = flowCode.split("_")[0];
//
// List<UserDTO> userDTOS = flwTaskAssigneeService.fetchUsersByStorageIds(permissionFlag, Long.valueOf(projectId));
//
// flowTask.setPermissionList(userDTOS.stream().map(UserDTO::getUserId).map(String::valueOf).collect(Collectors.toList()));
// }
// } catch (Exception e) {
// log.error("设置失败: {}", e.getMessage());
// }
}
}
@ -135,6 +201,12 @@ public class WorkflowGlobalListener implements GlobalListener {
if (ObjectUtil.isNull(flowParams)) {
return;
}
//给处理人发消息重新统计数据
if (task != null) {
flwCommonService.sendCountMessage(task.getId());
}
// 只有办理或者退回的时候才执行消息通知和抄送
if (TaskStatusEnum.PASS.getStatus().equals(flowParams.getHisStatus())
|| TaskStatusEnum.BACK.getStatus().equals(flowParams.getHisStatus())) {

View File

@ -29,6 +29,11 @@ public interface IFlwCommonService {
*/
void sendMessage(String flowName,String flowCode, Long instId, List<String> messageType, String message);
/**
* 发送统计消息
*/
void sendCountMessage(Long taskId);
/**
* 发送抄送消息
*/

View File

@ -19,6 +19,6 @@ public interface IFlwTaskAssigneeService {
* @param storageIds 多个存储标识符字符串(逗号分隔)
* @return 合并后的用户列表,去重后返回,非法格式的标识将被跳过
*/
List<UserDTO> fetchUsersByStorageIds(String storageIds);
List<UserDTO> fetchUsersByStorageIds(String storageIds,Long projectId);
}

View File

@ -61,7 +61,7 @@ public class FlwCommonServiceImpl implements IFlwCommonService {
IFlwTaskAssigneeService taskAssigneeService = SpringUtils.getBean(IFlwTaskAssigneeService.class);
String processedBys = CollUtil.join(permissionList, StringUtils.SEPARATOR);
// 根据 processedBy 前缀判断处理人类型,分别获取用户列表
List<UserDTO> users = taskAssigneeService.fetchUsersByStorageIds(processedBys);
List<UserDTO> users = taskAssigneeService.fetchUsersByStorageIds(processedBys,null);
return StreamUtils.toList(users, userDTO -> String.valueOf(userDTO.getUserId()));
}
@ -127,6 +127,25 @@ public class FlwCommonServiceImpl implements IFlwCommonService {
}
public void sendCountMessage(Long taskId) {
IFlwTaskService flwTaskService = SpringUtils.getBean(IFlwTaskService.class);
List<UserDTO> userList = new ArrayList<>();
List<UserDTO> users = flwTaskService.currentTaskAllUser(taskId);
if (CollUtil.isNotEmpty(users)) {
userList.addAll(users);
}
SseMessageDto dto = new SseMessageDto();
SeeMessageContentDto contentDto = new SeeMessageContentDto();
contentDto.setType("count");
contentDto.setContent("统计");
dto.setMessage(JSONUtil.toJsonStr(contentDto));
dto.setIsRecord(false);
dto.setUserIds(users.stream().map(UserDTO::getUserId).collect(Collectors.toList()));
SseMessageUtils.publishMessage(dto);
}
@Override
public void sendCopyMessage(String flowName, String flowCode, List<FlowCopyBo> flowCopyList) {
if(CollUtil.isEmpty(flowCopyList)){

View File

@ -170,7 +170,7 @@ public class FlwTaskAssigneeServiceImpl implements IFlwTaskAssigneeService, Hand
* @return 合并后的用户列表,去重后返回,非法格式的标识将被跳过
*/
@Override
public List<UserDTO> fetchUsersByStorageIds(String storageIds) {
public List<UserDTO> fetchUsersByStorageIds(String storageIds,Long projectId) {
if (StringUtils.isEmpty(storageIds)) {
return List.of();
}
@ -182,7 +182,7 @@ public class FlwTaskAssigneeServiceImpl implements IFlwTaskAssigneeService, Hand
}
}
return typeIdMap.entrySet().stream()
.flatMap(entry -> this.getUsersByType(entry.getKey(), entry.getValue()).stream())
.flatMap(entry -> this.getUsersByType(entry.getKey(), entry.getValue(),projectId).stream())
.distinct()
.toList();
}
@ -197,10 +197,10 @@ public class FlwTaskAssigneeServiceImpl implements IFlwTaskAssigneeService, Hand
* 如果类型为部门DEPT则通过部门ID列表查询
* 如果类型为岗位POST或无法识别的类型则返回空列表
*/
private List<UserDTO> getUsersByType(TaskAssigneeEnum type, List<Long> ids) {
private List<UserDTO> getUsersByType(TaskAssigneeEnum type, List<Long> ids,Long projectId) {
return switch (type) {
case USER -> userService.selectListByIds(ids);
case ROLE -> userService.selectUsersByRoleIds(ids);
case ROLE -> userService.selectUsersByRoleIds(ids,projectId);
case DEPT -> userService.selectUsersByDeptIds(ids);
case POST -> userService.selectUsersByPostIds(ids);
};

View File

@ -537,7 +537,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService {
for (FlowNode flowNode : nextFlowNodes) {
buildNextTaskList.stream().filter(t -> t.getNodeCode().equals(flowNode.getNodeCode())).findFirst().ifPresent(t -> {
if (CollUtil.isNotEmpty(t.getPermissionList())) {
List<UserDTO> users = flwTaskAssigneeService.fetchUsersByStorageIds(String.join(StringUtils.SEPARATOR, t.getPermissionList()));
List<UserDTO> users = flwTaskAssigneeService.fetchUsersByStorageIds(String.join(StringUtils.SEPARATOR, t.getPermissionList()),null);
if (CollUtil.isNotEmpty(users)) {
flowNode.setPermissionFlag(StreamUtils.join(users, e -> String.valueOf(e.getUserId())));
}