From 2be9b7f9c675e6ffe64adfac0a3e37f30404af99 Mon Sep 17 00:00:00 2001
From: cuilei <ray_tsu1@163.com>
Date: 星期三, 11 六月 2025 10:35:58 +0800
Subject: [PATCH] 工具管理-刀具准备单功能接口开发

---
 lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/impl/PreparationOrderServiceImpl.java |  176 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++--
 1 files changed, 170 insertions(+), 6 deletions(-)

diff --git a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/impl/PreparationOrderServiceImpl.java b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/impl/PreparationOrderServiceImpl.java
index 2cecbd3..0fb2bcc 100644
--- a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/impl/PreparationOrderServiceImpl.java
+++ b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/impl/PreparationOrderServiceImpl.java
@@ -1,22 +1,31 @@
 package org.jeecg.modules.tms.service.impl;
 
 import cn.hutool.core.collection.CollectionUtil;
+import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import org.apache.shiro.SecurityUtils;
+import org.apache.shiro.subject.Subject;
+import org.jeecg.common.system.vo.LoginUser;
+import org.jeecg.modules.system.service.ISysBusinessCodeRuleService;
 import org.jeecg.modules.tms.convert.PreparationOrderConvert;
-import org.jeecg.modules.tms.entity.PreparationOrder;
-import org.jeecg.modules.tms.entity.PreparationOrderDetail;
+import org.jeecg.modules.tms.entity.*;
 import org.jeecg.modules.tms.entity.dto.PreparationOrderAndDetailDto;
+import org.jeecg.modules.tms.enums.*;
 import org.jeecg.modules.tms.mapper.PreparationOrderDetailMapper;
 import org.jeecg.modules.tms.mapper.PreparationOrderMapper;
-import org.jeecg.modules.tms.service.IPreparationOrderDetailService;
-import org.jeecg.modules.tms.service.IPreparationOrderService;
+import org.jeecg.modules.tms.service.*;
 import org.springframework.stereotype.Service;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.transaction.annotation.Transactional;
 import java.io.Serializable;
-import java.util.List;
-import java.util.Collection;
+import java.math.BigDecimal;
+import java.util.*;
+import java.util.stream.Collectors;
 
 /**
  * @Description: 鍒�鍏峰噯澶囧崟
@@ -33,6 +42,18 @@
 	private PreparationOrderDetailMapper preparationOrderDetailMapper;
 	@Autowired
 	private IPreparationOrderDetailService preparationOrderDetailService;
+	@Autowired
+	private IToolLedgerService toolLedgerService;
+	@Autowired
+	private IToolLedgerDetailService toolLedgerDetailService;
+	@Autowired
+	private IOutboundOrderService outboundOrderService;
+	@Autowired
+	private IOutboundDetailService outboundDetailService;
+	@Autowired
+	private ISysBusinessCodeRuleService businessCodeRuleService;
+	@Autowired
+	private IBaseToolsService baseToolsService;
 	
 	@Override
 	@Transactional(rollbackFor = Exception.class)
@@ -66,4 +87,147 @@
 		preparationOrderDetailService.saveBatch(detailUpdateList);
 	}
 
+	@Override
+	@Transactional(rollbackFor = Exception.class)
+	public List<String> convertToOutboundOrder(List<String> preparationOrderIds) {
+		List<String> resultMessage = CollectionUtil.newArrayList();
+		List<PreparationOrder> preparationOrderList = listByIds(preparationOrderIds);
+		//鏍¢獙鍑嗗鍗曟槑缁嗕腑鐨勬暟閲�
+		for (PreparationOrder preparationOrder : preparationOrderList) {
+			if (PreparationOrderStatus.PENDING_AUDIT.getValue().equals(preparationOrder.getOrderStatus())) {
+				resultMessage.add("鍑嗗鍗曘��" + preparationOrder.getPreparationOrderNum() + "銆戞湭瀹℃牳锛屾棤娉曡浆鍑哄簱鐢宠锛�");
+				continue;
+			}
+			if (PreparationOrderStatus.CONVERT.getValue().equals(preparationOrder.getOrderStatus())) {
+				resultMessage.add("鍑嗗鍗曘��" + preparationOrder.getPreparationOrderNum() + "銆戝凡缁忚浆鍑猴紝璇峰嬁閲嶅鎻愪氦锛�");
+				continue;
+			}
+			List<PreparationOrderDetail> preparationOrderDetailList = preparationOrderDetailService.list(new LambdaQueryWrapper<PreparationOrderDetail>()
+					.eq(PreparationOrderDetail::getPreparationOrderId, preparationOrder.getId()));
+			Map<String, BigDecimal> preparationOrderToolCodeMap = preparationOrderDetailList.stream().collect(Collectors.toMap(PreparationOrderDetail::getToolCode,
+					PreparationOrderDetail::getOutboundQuantity, (k1, k2) -> k1));
+			List<ToolLedgerDetail> toolLedgerDetailList = toolLedgerDetailService.list(new LambdaQueryWrapper<ToolLedgerDetail>()
+					.in(ToolLedgerDetail::getToolCode, preparationOrderToolCodeMap.keySet())
+					.eq(ToolLedgerDetail::getQuantity, BigDecimal.ONE)
+					.eq(ToolLedgerDetail::getStatus, ToolCirculationStatus.IN_STOCK.getValue()));
+			Map<String, List<ToolLedgerDetail>> ledgerDetailToolCodeMap = toolLedgerDetailList.stream().collect(Collectors.groupingBy(ToolLedgerDetail::getToolCode));
+
+			List<OutboundDetail> outboundDetailList = CollectionUtil.newArrayList();
+			for (PreparationOrderDetail preparationOrderDetail : preparationOrderDetailList) {
+				String toolCode = preparationOrderDetail.getToolCode();
+				BigDecimal needQuantity = preparationOrderDetail.getOutboundQuantity();
+				List<ToolLedgerDetail> toolLedgerDetails = ledgerDetailToolCodeMap.get(toolCode);
+				BigDecimal stockQuantity = Optional.ofNullable(toolLedgerDetails).orElse(Collections.emptyList()).stream()
+						.map(ToolLedgerDetail::getQuantity)
+						.reduce(BigDecimal.ZERO, BigDecimal::add);
+				if (CollectionUtil.isEmpty(toolLedgerDetails) || stockQuantity.compareTo(needQuantity) < 0) {
+					BaseTools tools = baseToolsService.getById(toolCode);
+					resultMessage.add("鍑嗗鍗曘��" + preparationOrder.getPreparationOrderNum() +"銆戜腑锛岀紪鐮佷负銆�" + tools.getToolCode() + "銆戠殑宸ュ叿锛屽簱瀛樹笉瓒筹紝杞嚭搴撶敵璇峰崟澶辫触锛�");
+					break;
+				} else {
+					//浠庡簱瀛樻槑缁嗕腑鍙栧嚭闇�瑕佺殑鏁伴噺锛屾寚瀹氬埌鎶�
+					List<ToolLedgerDetail> selectedTools = toolLedgerDetails.subList(0, needQuantity.intValue());
+					//鐢熸垚鐢宠鍗曟槑缁�
+					selectedTools.forEach(item->{
+						OutboundDetail detail = new OutboundDetail()
+								.setToolCode(item.getToolCode())
+								.setToolId(item.getToolId())
+								.setOutboundQuantity(item.getQuantity())
+								.setStorageLocation(item.getWarehouseId())
+								.setOutboundLocation(item.getPositionCode())
+								.setStatus(OutBoundStatusEnum.NOT_OUTBOUND.getValue())
+								.setCreateBy(Objects.requireNonNull(getCurrentUser()).getUsername())
+								.setCreateTime(new Date());
+						outboundDetailList.add(detail);
+					});
+				}
+			}
+			BigDecimal totalOutboundQuantity = preparationOrderDetailList.stream()
+					.map(detail -> Optional.ofNullable(detail.getOutboundQuantity()).orElse(BigDecimal.ZERO))
+					.reduce(BigDecimal.ZERO, BigDecimal::add);
+			if (outboundDetailList.size() == totalOutboundQuantity.intValue()) {
+				//鎸囧畾鍒版妸鐨勬暟閲忎笌闇�姹傛暟閲忎竴鑷达紝婊¤冻杞嚭搴撶敵璇峰崟鐨勬潯浠讹紝鐢熸垚鍑哄簱鐢宠鍗�
+				OutboundOrder order = new OutboundOrder()
+						.setOutNum(businessCodeRuleService.generateBusinessCodeSeq("outBoundOrder"))
+						.setOutStorehouseType(OutStorehouseType.PREPARATION_OUTBOUND.getValue())
+						.setHandler(Objects.requireNonNull(getCurrentUser()).getId())
+						.setReviewer(Objects.requireNonNull(getCurrentUser()).getUsername())
+						.setOrderStatus(OutBillStatus.DRAFT.getValue())
+						.setSubjectMatter("鍒�鍏峰噯澶囧崟杞叆")
+						.setPreparationOrderId(preparationOrder.getId())
+						.setPartDrawingNo(preparationOrder.getPartDrawingNo())
+						.setPartName(preparationOrder.getPartName())
+						.setPartMaterial(preparationOrder.getPartMaterial())
+						.setProductionProcessesNo(preparationOrder.getProductionProcessesNo())
+						.setBatchCode(preparationOrder.getBatchCode())
+						.setMachiningCount(preparationOrder.getMachiningCount())
+						.setEquipmentCode(preparationOrder.getEquipmentCode())
+						.setNcName(preparationOrder.getNcName())
+						.setCreateBy(Objects.requireNonNull(getCurrentUser()).getUsername())
+						.setCreateTime(new Date());
+				outboundOrderService.save(order);
+				outboundDetailList.forEach(item -> item.setOutStorehouseId(order.getId()));
+				outboundDetailService.saveBatch(outboundDetailList);
+				//閿佸畾搴撳瓨鍙拌处鏄庣粏搴撳瓨
+				LambdaQueryWrapper<ToolLedgerDetail> queryWrapper = new LambdaQueryWrapper<>();
+				String codeIdString = outboundDetailList.stream()
+						.map(detail -> "'" + detail.getToolCode() + ":" + detail.getToolId() + "'")
+						.collect(Collectors.joining(","));
+				String sql = "(tool_code + ':' + tool_id) IN (" + codeIdString + ")";
+				queryWrapper.apply(sql);
+				toolLedgerDetailService.update(new ToolLedgerDetail().setQuantity(BigDecimal.ZERO), queryWrapper);
+				//閿佸畾搴撳瓨鍙拌处涓昏〃
+				List<ToolLedger> toolLedgerList = toolLedgerService.list(new LambdaQueryWrapper<ToolLedger>()
+						.in(ToolLedger::getToolId, preparationOrderToolCodeMap.keySet()));
+				toolLedgerList.forEach(item -> {
+					BigDecimal outboundQuantity = preparationOrderToolCodeMap.getOrDefault(item.getToolId(), BigDecimal.ZERO);
+					item.setAvailableCount(Optional.ofNullable(item.getAvailableCount()).orElse(BigDecimal.ZERO).subtract(outboundQuantity));
+				});
+				toolLedgerService.updateBatchById(toolLedgerList);
+				//鏇存柊鍑嗗鍗曠姸鎬�
+				updateById(new PreparationOrder()
+						.setId(preparationOrder.getId())
+						.setOutboundTime(new Date())
+						.setOrderStatus(PreparationOrderStatus.CONVERT.getValue()));//3.宸茶浆鍑哄簱鐢宠
+				resultMessage.add("鍑嗗鍗曘��" + preparationOrder.getPreparationOrderNum() + "銆戣浆鍑哄簱鐢宠鍗曟垚鍔燂紒");
+			}
+		}
+		return resultMessage;
+	}
+
+	@Override
+	public IPage<PreparationOrder> queryPageList(Page<PreparationOrder> page, Map<String, String[]> parameterMap) {
+		QueryWrapper<PreparationOrder> queryWrapper = Wrappers.query();
+		String[] preparationOrderNums = parameterMap.get("preparationOrderNum");
+		if (preparationOrderNums != null && preparationOrderNums.length > 0) {
+			queryWrapper.like("t.preparation_order_num", preparationOrderNums[0]);
+		}
+		String[] orderStatuses = parameterMap.get("orderStatus");
+		if (orderStatuses != null && orderStatuses.length > 0) {
+			queryWrapper.eq("t.order_status", orderStatuses[0]);
+		}
+		String[] beginTimes = parameterMap.get("beginTime");
+		if (beginTimes != null && beginTimes.length > 0) {
+			queryWrapper.ge("t.create_time", beginTimes[0]);
+		}
+		String[] endTimes = parameterMap.get("endTime");
+		if (endTimes != null && endTimes.length > 0) {
+			queryWrapper.le("t.create_time", endTimes[0]);
+		}
+		queryWrapper.orderByAsc("t.create_time");
+		return this.baseMapper.queryPageList(page, queryWrapper);
+	}
+
+	private LoginUser getCurrentUser() {
+		// 鑾峰彇褰撳墠璁よ瘉鐨勭櫥褰曠敤鎴蜂俊鎭�
+		Subject currentUser = SecurityUtils.getSubject();
+		if (currentUser != null && currentUser.isAuthenticated()) {
+			Object principal = currentUser.getPrincipal();
+			if (principal instanceof LoginUser) {
+				return (LoginUser) principal;
+			}
+		}
+		return null;
+	}
+
 }

--
Gitblit v1.9.3