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 * @param roleIds 角色ids
* @return 用户 * @return 用户
*/ */
List<UserDTO> selectUsersByRoleIds(List<Long> roleIds); List<UserDTO> selectUsersByRoleIds(List<Long> roleIds,Long projectId);
/** /**
* 通过部门ID查询用户 * 通过部门ID查询用户

View File

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

View File

@ -1,5 +1,6 @@
package org.dromara.cailiaoshebei.domain.vo; package org.dromara.cailiaoshebei.domain.vo;
import java.math.BigDecimal;
import java.time.LocalDate; import java.time.LocalDate;
import java.util.Date; import java.util.Date;
import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonFormat;
@ -43,6 +44,11 @@ public class BusMaterialbatchdemandplanVo implements Serializable {
@ExcelProperty(value = "批次ID") @ExcelProperty(value = "批次ID")
private String batchId; private String batchId;
/**
* 批次号
*/
private String batchNumber;
/** /**
* 基础信息ID * 基础信息ID
*/ */
@ -125,4 +131,9 @@ public class BusMaterialbatchdemandplanVo implements Serializable {
*/ */
private String qs; 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; private final IBusBillofquantitiesService busBillofquantitiesService;
/** /**
* 查询物资-批次需求计划基础信息 * 查询物资-批次需求计划基础信息
* *
@ -77,6 +78,10 @@ public class BusMrpBaseServiceImpl extends ServiceImpl<BusMrpBaseMapper, BusMrpB
BusMaterialbatchdemandplanBo planBo = new BusMaterialbatchdemandplanBo(); BusMaterialbatchdemandplanBo planBo = new BusMaterialbatchdemandplanBo();
planBo.setMrpBaseId(id); planBo.setMrpBaseId(id);
List<BusMaterialbatchdemandplanVo> voList = planservice.queryList(planBo); List<BusMaterialbatchdemandplanVo> voList = planservice.queryList(planBo);
for (BusMaterialbatchdemandplanVo vo : voList) {
BigDecimal remaining = remaining(vo.getSuppliespriceId(), id);
vo.setRemaining(remaining);
}
busMrpVo.setMrpBaseBo(busMrpBaseVo); busMrpVo.setMrpBaseBo(busMrpBaseVo);
busMrpVo.setPlanList(voList); busMrpVo.setPlanList(voList);
@ -266,20 +271,22 @@ public class BusMrpBaseServiceImpl extends ServiceImpl<BusMrpBaseMapper, BusMrpB
@Override @Override
public BigDecimal remaining(Long suppliespriceId) { public BigDecimal remaining(Long suppliespriceId,Long mrpBaseId) {
BusBillofquantities byId = busBillofquantitiesService.getById(suppliespriceId);
// 获取数据库中已有的数量 // 获取数据库中已有的数量
List<BusMaterialbatchdemandplan> existingList = planservice.list( List<BusMaterialbatchdemandplan> existingList = planservice.list(
Wrappers.lambdaQuery(BusMaterialbatchdemandplan.class) Wrappers.lambdaQuery(BusMaterialbatchdemandplan.class)
.eq(BusMaterialbatchdemandplan::getSuppliespriceId, suppliespriceId) // 排除当前批次 .eq(BusMaterialbatchdemandplan::getSuppliespriceId, suppliespriceId)
.ne(mrpBaseId!=null,BusMaterialbatchdemandplan::getMrpBaseId, mrpBaseId)// 排除当前批次
); );
if(CollectionUtil.isEmpty(existingList)){ if(CollectionUtil.isEmpty(existingList)){
return BigDecimal.ZERO; return BigDecimal.ZERO;
} }
BigDecimal reduce = existingList.stream()
return existingList.stream()
.map(BusMaterialbatchdemandplan::getDemandQuantity) .map(BusMaterialbatchdemandplan::getDemandQuantity)
.reduce(BigDecimal.ZERO, BigDecimal::add); .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)); return toAjax(busDrawingreviewReceiptsService.deleteWithValidByIds(List.of(ids), true));
} }
} }

View File

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

View File

@ -151,4 +151,8 @@ public class BusDrawingreviewReceiptsBo extends BaseEntity {
private String finalState; 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()); desVolumeFile.setAuditStatus(processEvent.getStatus());
if (processEvent.getStatus().equals("finish")) { if (processEvent.getStatus().equals("finish")) {
//修改目录状态
volumeCatalogService.update(Wrappers.<DesVolumeCatalog>lambdaUpdate()
.set(DesVolumeCatalog::getDesignState, "1")
.eq(DesVolumeCatalog::getDesign, desVolumeFile.getVolumeCatalogId())
);
//异步处理二维码 //异步处理二维码
self.addQRCodeToPDF(desVolumeFile.getId(), false) self.addQRCodeToPDF(desVolumeFile.getId(), false)
.thenAccept(result -> log.info("图纸[{}-{} ]添加二维码成功", desVolumeFile.getFileName(), desVolumeFile.getId())) .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 orderingUnit = req.getOrderingUnit();
String supplierUnit = req.getSupplierUnit(); String supplierUnit = req.getSupplierUnit();
String storageType = req.getStorageType(); String storageType = req.getStorageType();
lqw.orderByDesc(MatMaterialReceive::getCreateTime);
lqw.like(StringUtils.isNotBlank(projectName), MatMaterialReceive::getProjectName, projectName); lqw.like(StringUtils.isNotBlank(projectName), MatMaterialReceive::getProjectName, projectName);
lqw.like(StringUtils.isNotBlank(materialName), MatMaterialReceive::getMaterialName, materialName); lqw.like(StringUtils.isNotBlank(materialName), MatMaterialReceive::getMaterialName, materialName);
lqw.like(StringUtils.isNotBlank(contractName), MatMaterialReceive::getContractName, contractName); lqw.like(StringUtils.isNotBlank(contractName), MatMaterialReceive::getContractName, contractName);

View File

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

View File

@ -845,14 +845,16 @@ public class SysUserServiceImpl implements ISysUserService, UserService {
* @return 用户 * @return 用户
*/ */
@Override @Override
public List<UserDTO> selectUsersByRoleIds(List<Long> roleIds) { public List<UserDTO> selectUsersByRoleIds(List<Long> roleIds,Long projectId) {
if (CollUtil.isEmpty(roleIds)) { if (CollUtil.isEmpty(roleIds)) {
return List.of(); return List.of();
} }
// 通过角色ID获取用户角色信息 // 通过角色ID获取用户角色信息
List<SysUserRole> userRoles = userRoleMapper.selectList( 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列表 // 获取用户ID列表
Set<Long> userIds = StreamUtils.toSet(userRoles, SysUserRole::getUserId); 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; package org.dromara.workflow.listener;
import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.map.MapUtil; import cn.hutool.core.map.MapUtil;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
import cn.hutool.json.JSONUtil;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; 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.enums.BusinessStatusEnum;
import org.dromara.common.core.utils.StringUtils; import org.dromara.common.core.utils.StringUtils;
import org.dromara.warm.flow.core.FlowEngine; import org.dromara.warm.flow.core.FlowEngine;
import org.dromara.warm.flow.core.dto.FlowParams; import org.dromara.warm.flow.core.dto.FlowParams;
import org.dromara.warm.flow.core.entity.Definition; import org.dromara.warm.flow.core.entity.Definition;
import org.dromara.warm.flow.core.entity.Instance; 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.entity.Task;
import org.dromara.warm.flow.core.listener.GlobalListener; import org.dromara.warm.flow.core.listener.GlobalListener;
import org.dromara.warm.flow.core.listener.ListenerVariable; import org.dromara.warm.flow.core.listener.ListenerVariable;
import org.dromara.warm.flow.core.service.InsService; import org.dromara.warm.flow.core.service.InsService;
import org.dromara.warm.flow.orm.entity.FlowInstance; 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.warm.flow.orm.entity.FlowTask;
import org.dromara.workflow.common.ConditionalOnEnable; import org.dromara.workflow.common.ConditionalOnEnable;
import org.dromara.workflow.common.constant.FlowConstant; 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.handler.FlowProcessEventHandler;
import org.dromara.workflow.service.IFlwCommonService; import org.dromara.workflow.service.IFlwCommonService;
import org.dromara.workflow.service.IFlwInstanceService; import org.dromara.workflow.service.IFlwInstanceService;
import org.dromara.workflow.service.IFlwTaskAssigneeService;
import org.dromara.workflow.service.IFlwTaskService; import org.dromara.workflow.service.IFlwTaskService;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import java.util.HashMap; import java.util.*;
import java.util.List; import java.util.stream.Collectors;
import java.util.Map;
/** /**
* 全局任务办理监听 * 全局任务办理监听
@ -47,6 +53,7 @@ public class WorkflowGlobalListener implements GlobalListener {
private final FlowProcessEventHandler flowProcessEventHandler; private final FlowProcessEventHandler flowProcessEventHandler;
private final IFlwCommonService flwCommonService; private final IFlwCommonService flwCommonService;
private final InsService insService; private final InsService insService;
private final IFlwTaskAssigneeService flwTaskAssigneeService;
/** /**
* 创建监听器,任务创建时执行 * 创建监听器,任务创建时执行
@ -55,9 +62,46 @@ public class WorkflowGlobalListener implements GlobalListener {
*/ */
@Override @Override
public void create(ListenerVariable listenerVariable) { 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 @Override
public void start(ListenerVariable listenerVariable) { public void start(ListenerVariable listenerVariable) {
} }
/** /**
@ -92,6 +137,27 @@ public class WorkflowGlobalListener implements GlobalListener {
if (flowTask.getNodeCode().equals(applyNodeCode)) { if (flowTask.getNodeCode().equals(applyNodeCode)) {
flowTask.setPermissionList(List.of(instance.getCreateBy())); 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)) { if (ObjectUtil.isNull(flowParams)) {
return; return;
} }
//给处理人发消息重新统计数据
if (task != null) {
flwCommonService.sendCountMessage(task.getId());
}
// 只有办理或者退回的时候才执行消息通知和抄送 // 只有办理或者退回的时候才执行消息通知和抄送
if (TaskStatusEnum.PASS.getStatus().equals(flowParams.getHisStatus()) if (TaskStatusEnum.PASS.getStatus().equals(flowParams.getHisStatus())
|| TaskStatusEnum.BACK.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 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 多个存储标识符字符串(逗号分隔) * @param storageIds 多个存储标识符字符串(逗号分隔)
* @return 合并后的用户列表,去重后返回,非法格式的标识将被跳过 * @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); IFlwTaskAssigneeService taskAssigneeService = SpringUtils.getBean(IFlwTaskAssigneeService.class);
String processedBys = CollUtil.join(permissionList, StringUtils.SEPARATOR); String processedBys = CollUtil.join(permissionList, StringUtils.SEPARATOR);
// 根据 processedBy 前缀判断处理人类型,分别获取用户列表 // 根据 processedBy 前缀判断处理人类型,分别获取用户列表
List<UserDTO> users = taskAssigneeService.fetchUsersByStorageIds(processedBys); List<UserDTO> users = taskAssigneeService.fetchUsersByStorageIds(processedBys,null);
return StreamUtils.toList(users, userDTO -> String.valueOf(userDTO.getUserId())); 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 @Override
public void sendCopyMessage(String flowName, String flowCode, List<FlowCopyBo> flowCopyList) { public void sendCopyMessage(String flowName, String flowCode, List<FlowCopyBo> flowCopyList) {
if(CollUtil.isEmpty(flowCopyList)){ if(CollUtil.isEmpty(flowCopyList)){

View File

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

View File

@ -537,7 +537,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService {
for (FlowNode flowNode : nextFlowNodes) { for (FlowNode flowNode : nextFlowNodes) {
buildNextTaskList.stream().filter(t -> t.getNodeCode().equals(flowNode.getNodeCode())).findFirst().ifPresent(t -> { buildNextTaskList.stream().filter(t -> t.getNodeCode().equals(flowNode.getNodeCode())).findFirst().ifPresent(t -> {
if (CollUtil.isNotEmpty(t.getPermissionList())) { 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)) { if (CollUtil.isNotEmpty(users)) {
flowNode.setPermissionFlag(StreamUtils.join(users, e -> String.valueOf(e.getUserId()))); flowNode.setPermissionFlag(StreamUtils.join(users, e -> String.valueOf(e.getUserId())));
} }