|
|
|
|
@ -12,6 +12,8 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
|
|
|
|
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
|
|
|
|
import lombok.RequiredArgsConstructor;
|
|
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
|
|
import org.springframework.cache.annotation.Cacheable;
|
|
|
|
|
import org.springframework.cache.annotation.CacheEvict;
|
|
|
|
|
import org.springframework.stereotype.Service;
|
|
|
|
|
import org.dromara.wcs.domain.LiveTaskDetail;
|
|
|
|
|
import org.dromara.wcs.domain.bo.LiveTaskDetailBo;
|
|
|
|
|
@ -50,6 +52,7 @@ public class LiveTaskQueueServiceImpl implements ILiveTaskQueueService {
|
|
|
|
|
* @return 实时任务队列
|
|
|
|
|
*/
|
|
|
|
|
@Override
|
|
|
|
|
@Cacheable(cacheNames = "wcs_cache", key = "#objId")
|
|
|
|
|
public LiveTaskQueueVo queryById(Long objId){
|
|
|
|
|
LiveTaskQueueVo vo = baseMapper.selectCustomLiveTaskQueueVoById(objId);
|
|
|
|
|
if (vo != null) {
|
|
|
|
|
@ -162,11 +165,16 @@ public class LiveTaskQueueServiceImpl implements ILiveTaskQueueService {
|
|
|
|
|
@Override
|
|
|
|
|
@DSTransactional
|
|
|
|
|
public Boolean insertByBo(LiveTaskQueueBo bo) {
|
|
|
|
|
// 将 BO 对象转换为实体对象
|
|
|
|
|
LiveTaskQueue add = MapstructUtils.convert(bo, LiveTaskQueue.class);
|
|
|
|
|
// 保存前进行数据校验
|
|
|
|
|
validEntityBeforeSave(add);
|
|
|
|
|
// 执行插入操作
|
|
|
|
|
boolean flag = baseMapper.insert(add) > 0;
|
|
|
|
|
if (flag) {
|
|
|
|
|
// 插入成功后将生成的主键回填到 BO 对象
|
|
|
|
|
bo.setObjId(add.getObjId());
|
|
|
|
|
// 保存任务明细
|
|
|
|
|
saveDetails(bo);
|
|
|
|
|
}
|
|
|
|
|
return flag;
|
|
|
|
|
@ -179,18 +187,24 @@ public class LiveTaskQueueServiceImpl implements ILiveTaskQueueService {
|
|
|
|
|
* @return 是否修改成功
|
|
|
|
|
*/
|
|
|
|
|
@Override
|
|
|
|
|
@CacheEvict(cacheNames = "wcs_cache", key = "#bo.objId")
|
|
|
|
|
@DSTransactional
|
|
|
|
|
public Boolean updateByBo(LiveTaskQueueBo bo) {
|
|
|
|
|
// 查询原记录
|
|
|
|
|
LiveTaskQueue old = baseMapper.selectById(bo.getObjId());
|
|
|
|
|
if (old == null) {
|
|
|
|
|
throw new ServiceException("实时任务队列不存在,无法修改");
|
|
|
|
|
}
|
|
|
|
|
// 将 BO 对象转换为实体对象
|
|
|
|
|
LiveTaskQueue update = MapstructUtils.convert(bo, LiveTaskQueue.class);
|
|
|
|
|
// 保存前进行数据校验
|
|
|
|
|
validEntityBeforeSave(update);
|
|
|
|
|
// 任务编号是子表外键,先按旧编号删除旧明细,避免 ON UPDATE CASCADE 后删不到旧数据。
|
|
|
|
|
deleteDetailsByTaskCode(old.getTaskCode());
|
|
|
|
|
// 执行更新操作
|
|
|
|
|
boolean flag = baseMapper.updateById(update) > 0;
|
|
|
|
|
if (flag) {
|
|
|
|
|
// 更新成功后保存任务明细
|
|
|
|
|
saveDetails(bo);
|
|
|
|
|
}
|
|
|
|
|
return flag;
|
|
|
|
|
@ -200,19 +214,24 @@ public class LiveTaskQueueServiceImpl implements ILiveTaskQueueService {
|
|
|
|
|
* 保存前的数据校验
|
|
|
|
|
*/
|
|
|
|
|
private void validEntityBeforeSave(LiveTaskQueue entity){
|
|
|
|
|
// 校验实体对象和任务编号
|
|
|
|
|
if (entity == null || StringUtils.isBlank(entity.getTaskCode())) {
|
|
|
|
|
throw new ServiceException("任务编号不能为空");
|
|
|
|
|
}
|
|
|
|
|
// 查询相同任务编号的数量,排除当前记录(更新场景)
|
|
|
|
|
Long sameTaskCodeCount = baseMapper.selectCount(Wrappers.<LiveTaskQueue>lambdaQuery()
|
|
|
|
|
.eq(LiveTaskQueue::getTaskCode, entity.getTaskCode())
|
|
|
|
|
.ne(entity.getObjId() != null, LiveTaskQueue::getObjId, entity.getObjId()));
|
|
|
|
|
// 校验任务编号唯一性
|
|
|
|
|
if (sameTaskCodeCount > 0) {
|
|
|
|
|
throw new ServiceException("任务编号已存在,请更换任务编号");
|
|
|
|
|
}
|
|
|
|
|
// 设置默认任务状态
|
|
|
|
|
if (entity.getTaskStatus() == null) {
|
|
|
|
|
// 新建任务默认进入待执行,避免空状态在调度看板中无法归类。
|
|
|
|
|
entity.setTaskStatus(1);
|
|
|
|
|
}
|
|
|
|
|
// 设置默认启用标识
|
|
|
|
|
if (entity.getIsFlag() == null) {
|
|
|
|
|
entity.setIsFlag(1);
|
|
|
|
|
}
|
|
|
|
|
@ -222,17 +241,22 @@ public class LiveTaskQueueServiceImpl implements ILiveTaskQueueService {
|
|
|
|
|
* 保存任务明细。
|
|
|
|
|
*/
|
|
|
|
|
private void saveDetails(LiveTaskQueueBo bo) {
|
|
|
|
|
// 获取任务明细列表
|
|
|
|
|
List<LiveTaskDetailBo> details = bo.getDetails();
|
|
|
|
|
if (details == null || details.isEmpty()) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
// 遍历明细列表并保存
|
|
|
|
|
for (LiveTaskDetailBo detailBo : details) {
|
|
|
|
|
// 将明细 BO 转换为实体对象
|
|
|
|
|
LiveTaskDetail detail = MapstructUtils.convert(detailBo, LiveTaskDetail.class);
|
|
|
|
|
// 子表跟随主表整体替换,清空旧主键避免误把历史明细主键带入新增流程。
|
|
|
|
|
detail.setObjId(null);
|
|
|
|
|
// 设置任务编号
|
|
|
|
|
detail.setTaskCode(bo.getTaskCode());
|
|
|
|
|
// 明细常用字段默认继承主表,减少人工重复录入导致的主子表业务信息不一致。
|
|
|
|
|
inheritMasterFieldsWhenBlank(detail, bo);
|
|
|
|
|
// 插入明细记录
|
|
|
|
|
liveTaskDetailMapper.insert(detail);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
@ -241,39 +265,51 @@ public class LiveTaskQueueServiceImpl implements ILiveTaskQueueService {
|
|
|
|
|
* 明细字段为空时继承主表字段。
|
|
|
|
|
*/
|
|
|
|
|
private void inheritMasterFieldsWhenBlank(LiveTaskDetail detail, LiveTaskQueueBo bo) {
|
|
|
|
|
// 物料编码为空时从主表继承
|
|
|
|
|
if (StringUtils.isBlank(detail.getMaterialCode())) {
|
|
|
|
|
detail.setMaterialCode(bo.getMaterialCode());
|
|
|
|
|
}
|
|
|
|
|
// 托盘条码为空时从主表继承
|
|
|
|
|
if (StringUtils.isBlank(detail.getPalletBarcode())) {
|
|
|
|
|
detail.setPalletBarcode(bo.getPalletBarcode());
|
|
|
|
|
}
|
|
|
|
|
// 物料条码为空时从主表继承
|
|
|
|
|
if (StringUtils.isBlank(detail.getMaterialBarcode())) {
|
|
|
|
|
detail.setMaterialBarcode(bo.getMaterialBarcode());
|
|
|
|
|
}
|
|
|
|
|
// 物料数量为空时从主表继承
|
|
|
|
|
if (detail.getMaterialCount() == null) {
|
|
|
|
|
detail.setMaterialCount(bo.getMaterialCount());
|
|
|
|
|
}
|
|
|
|
|
// 任务类型为空时从主表继承
|
|
|
|
|
if (detail.getTaskType() == null) {
|
|
|
|
|
detail.setTaskType(bo.getTaskType());
|
|
|
|
|
}
|
|
|
|
|
// 任务分类为空时从主表继承
|
|
|
|
|
if (detail.getTaskCategory() == null) {
|
|
|
|
|
detail.setTaskCategory(bo.getTaskCategory());
|
|
|
|
|
}
|
|
|
|
|
// 起始点位为空时从主表继承
|
|
|
|
|
if (StringUtils.isBlank(detail.getStartPoint())) {
|
|
|
|
|
detail.setStartPoint(bo.getStartPoint());
|
|
|
|
|
}
|
|
|
|
|
// 目标点位为空时从主表继承
|
|
|
|
|
if (StringUtils.isBlank(detail.getEndPoint())) {
|
|
|
|
|
detail.setEndPoint(bo.getEndPoint());
|
|
|
|
|
}
|
|
|
|
|
// 路径编号为空时从主表继承
|
|
|
|
|
if (StringUtils.isBlank(detail.getPathCode())) {
|
|
|
|
|
detail.setPathCode(bo.getPathCode());
|
|
|
|
|
}
|
|
|
|
|
// 任务状态为空时从主表继承
|
|
|
|
|
if (detail.getTaskStatus() == null) {
|
|
|
|
|
detail.setTaskStatus(bo.getTaskStatus());
|
|
|
|
|
}
|
|
|
|
|
// 设置默认校验标识
|
|
|
|
|
if (detail.getIsValidate() == null) {
|
|
|
|
|
detail.setIsValidate(1);
|
|
|
|
|
}
|
|
|
|
|
// 设置默认启用标识
|
|
|
|
|
if (detail.getIsFlag() == null) {
|
|
|
|
|
detail.setIsFlag(1);
|
|
|
|
|
}
|
|
|
|
|
@ -283,9 +319,11 @@ public class LiveTaskQueueServiceImpl implements ILiveTaskQueueService {
|
|
|
|
|
* 按任务编号删除子表明细。
|
|
|
|
|
*/
|
|
|
|
|
private void deleteDetailsByTaskCode(String taskCode) {
|
|
|
|
|
// 任务编号为空时直接返回
|
|
|
|
|
if (StringUtils.isBlank(taskCode)) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
// 根据任务编号删除明细
|
|
|
|
|
liveTaskDetailMapper.delete(Wrappers.<LiveTaskDetail>lambdaQuery()
|
|
|
|
|
.eq(LiveTaskDetail::getTaskCode, taskCode));
|
|
|
|
|
}
|
|
|
|
|
@ -294,9 +332,11 @@ public class LiveTaskQueueServiceImpl implements ILiveTaskQueueService {
|
|
|
|
|
* 按任务编号批量删除子表明细。
|
|
|
|
|
*/
|
|
|
|
|
private void deleteDetailsByTaskCodes(Collection<String> taskCodes) {
|
|
|
|
|
// 任务编号集合为空时直接返回
|
|
|
|
|
if (taskCodes == null || taskCodes.isEmpty()) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
// 根据任务编号集合批量删除明细
|
|
|
|
|
liveTaskDetailMapper.delete(Wrappers.<LiveTaskDetail>lambdaQuery()
|
|
|
|
|
.in(LiveTaskDetail::getTaskCode, taskCodes));
|
|
|
|
|
}
|
|
|
|
|
@ -305,21 +345,26 @@ public class LiveTaskQueueServiceImpl implements ILiveTaskQueueService {
|
|
|
|
|
* 批量挂载任务明细,避免 XML 嵌套 collection 造成分页列表 N+1 查询。
|
|
|
|
|
*/
|
|
|
|
|
private void attachDetails(List<LiveTaskQueueVo> taskQueueList) {
|
|
|
|
|
// 任务队列列表为空时直接返回
|
|
|
|
|
if (taskQueueList == null || taskQueueList.isEmpty()) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
// 提取所有任务编号并去重
|
|
|
|
|
List<String> taskCodes = taskQueueList.stream()
|
|
|
|
|
.map(LiveTaskQueueVo::getTaskCode)
|
|
|
|
|
.filter(StringUtils::isNotBlank)
|
|
|
|
|
.distinct()
|
|
|
|
|
.toList();
|
|
|
|
|
// 任务编号为空时设置空明细列表
|
|
|
|
|
if (taskCodes.isEmpty()) {
|
|
|
|
|
taskQueueList.forEach(item -> item.setDetails(List.of()));
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
// 批量查询明细并按任务编号分组
|
|
|
|
|
Map<String, List<LiveTaskDetailVo>> detailMap = liveTaskDetailMapper.selectCustomLiveTaskDetailVoByTaskCodes(taskCodes)
|
|
|
|
|
.stream()
|
|
|
|
|
.collect(Collectors.groupingBy(LiveTaskDetailVo::getTaskCode));
|
|
|
|
|
// 将明细挂载到对应的任务队列
|
|
|
|
|
taskQueueList.forEach(item -> item.setDetails(detailMap.getOrDefault(item.getTaskCode(), List.of())));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@ -331,21 +376,25 @@ public class LiveTaskQueueServiceImpl implements ILiveTaskQueueService {
|
|
|
|
|
* @return 是否删除成功
|
|
|
|
|
*/
|
|
|
|
|
@Override
|
|
|
|
|
@CacheEvict(cacheNames = "wcs_cache", allEntries = true)
|
|
|
|
|
@DSTransactional
|
|
|
|
|
public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
|
|
|
|
|
// 主键集合为空时直接返回
|
|
|
|
|
if (ids == null || ids.isEmpty()) {
|
|
|
|
|
// 删除入口明确要求主键集合,空集合直接返回,避免拼出无意义SQL。
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
if(isValid){
|
|
|
|
|
//TODO 做一些业务上的校验,判断是否需要校验
|
|
|
|
|
// TODO: 做一些业务上的校验,判断是否需要校验
|
|
|
|
|
}
|
|
|
|
|
// 根据主键集合查询任务编号
|
|
|
|
|
List<String> taskCodes = baseMapper.selectTaskCodesByIds(ids).stream()
|
|
|
|
|
.filter(StringUtils::isNotBlank)
|
|
|
|
|
.distinct()
|
|
|
|
|
.toList();
|
|
|
|
|
// 主子表删除放在同一个本地多数据源事务里,避免只删主表后明细残留。
|
|
|
|
|
deleteDetailsByTaskCodes(taskCodes);
|
|
|
|
|
// 执行主表批量删除
|
|
|
|
|
return baseMapper.deleteByIds(ids) > 0;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|