From 4788f8d86807296a3dce75b5dd428c0a8d5828db Mon Sep 17 00:00:00 2001
From: hyingbo <1363390067@qq.com>
Date: 星期五, 25 七月 2025 17:12:39 +0800
Subject: [PATCH] 分类字典设置上级是否存在子节点修改
---
lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/impl/OutboundOrderServiceImpl.java | 553 +++++++++++++++++++++++++++++++++++++++++++++++++++++-
1 files changed, 538 insertions(+), 15 deletions(-)
diff --git a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/impl/OutboundOrderServiceImpl.java b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/impl/OutboundOrderServiceImpl.java
index d0f5668..2c06432 100644
--- a/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/impl/OutboundOrderServiceImpl.java
+++ b/lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/impl/OutboundOrderServiceImpl.java
@@ -2,12 +2,13 @@
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollectionUtil;
-import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import lombok.extern.slf4j.Slf4j;
@@ -20,28 +21,31 @@
import org.jeecg.common.system.vo.LoginUser;
import org.jeecg.modules.flowable.apithird.business.entity.FlowMyBusiness;
import org.jeecg.modules.flowable.apithird.business.service.IFlowMyBusinessService;
-import org.jeecg.modules.flowable.apithird.business.service.impl.FlowMyBusinessServiceImpl;
import org.jeecg.modules.flowable.apithird.service.FlowCallBackServiceI;
import org.jeecg.modules.flowable.apithird.service.FlowCommonService;
import org.jeecg.modules.flowable.service.IFlowDefinitionService;
import org.jeecg.modules.flowable.service.IFlowTaskService;
import org.jeecg.modules.system.service.ISysBusinessCodeRuleService;
-import org.jeecg.modules.tms.entity.OutboundOrder;
-import org.jeecg.modules.tms.entity.OutboundDetail;
+import org.jeecg.modules.tms.entity.*;
+import org.jeecg.modules.tms.entity.dto.OutBoundAddDto;
import org.jeecg.modules.tms.entity.dto.OutBoundOrderFlowDto;
+import org.jeecg.modules.tms.entity.dto.OutBoundRequestDto;
import org.jeecg.modules.tms.entity.dto.OutboundOrderAndDetailDto;
-import org.jeecg.modules.tms.enums.OutBillStatus;
-import org.jeecg.modules.tms.enums.OutBoundStatusEnum;
+import org.jeecg.modules.tms.entity.vo.SelectOutboundToolVo;
+import org.jeecg.modules.tms.enums.*;
import org.jeecg.modules.tms.mapper.OutboundDetailMapper;
+import org.jeecg.modules.tms.convert.OutboundOrderConvert;
import org.jeecg.modules.tms.mapper.OutboundOrderMapper;
-import org.jeecg.modules.tms.service.IOutboundDetailService;
-import org.jeecg.modules.tms.service.IOutboundOrderService;
+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.math.BigDecimal;
+import java.math.RoundingMode;
import java.util.*;
+import java.util.stream.Collectors;
/**
* @Description: tms_outbound_order
@@ -55,6 +59,16 @@
@Autowired
private IOutboundDetailService outboundDetailService;
+ @Autowired
+ private IToolLedgerService toolLedgerService;
+ @Autowired
+ private IToolLedgerDetailService toolLedgerDetailService;
+ @Autowired
+ private IOutStoreDetailService outStoreDetailService;
+ @Autowired
+ private IBaseToolsService baseToolsService;
+ @Autowired
+ private IToolsSharpeningService toolsSharpeningService;
@Autowired
private ISysBusinessCodeRuleService businessCodeRuleService;
@Autowired
@@ -71,6 +85,8 @@
private OutboundOrderMapper outboundOrderMapper;
@Autowired
private OutboundDetailMapper outboundDetailMapper;
+ @Autowired
+ private OutboundOrderConvert outboundOrderConvert;
@Override
@Transactional(rollbackFor = Exception.class)
@@ -91,7 +107,7 @@
@Override
@Transactional(rollbackFor = Exception.class)
public void addTotal(OutboundOrderAndDetailDto outboundOrder) {
- OutboundOrder order = BeanUtil.copyProperties(outboundOrder, OutboundOrder.class);
+ OutboundOrder order = outboundOrderConvert.convert(outboundOrder);
order.setHandler(Objects.requireNonNull(getCurrentUser()).getId());
order.setOutNum(businessCodeRuleService.generateBusinessCodeSeq("outBoundOrder"));
order.setOrderStatus(OutBillStatus.DRAFT.getValue());
@@ -116,9 +132,14 @@
if (outStorehouseTypes != null && outStorehouseTypes.length > 0) {
queryWrapper.eq("t.out_storehouse_type", outStorehouseTypes[0]);
}
- String[] statuses = parameterMap.get("orderStatus");
- if (statuses != null && statuses.length > 0) {
- queryWrapper.eq("t.order_status", statuses[0]);
+ String[] orderStatuses = parameterMap.get("orderStatus");
+ if (orderStatuses != null && orderStatuses.length > 0) {
+ queryWrapper.eq("t.order_status", orderStatuses[0]);
+ }
+ String[] outStatuses = parameterMap.get("outStatus");
+ if (outStatuses != null && outStatuses.length > 0) {
+ String[] statusArr = outStatuses[0].split(",");
+ queryWrapper.in("t.out_status", statusArr);
}
String[] startTimes = parameterMap.get("startTime");
if (startTimes != null && startTimes.length > 0) {
@@ -138,7 +159,7 @@
//鍒犻櫎鎵�鏈夋槑缁�
outboundDetailService.remove(new LambdaQueryWrapper<OutboundDetail>()
.eq(OutboundDetail::getOutStorehouseId, outboundOrder.getId()));
- OutboundOrder outboundOrderUpdate = BeanUtil.copyProperties(outboundOrder, OutboundOrder.class);
+ OutboundOrder outboundOrderUpdate = outboundOrderConvert.convert(outboundOrder);
outboundOrderMapper.updateById(outboundOrderUpdate);
List<OutboundDetail> detailList = CollectionUtil.newArrayList();
outboundOrder.getOutboundDetailList().forEach(item->{
@@ -149,6 +170,7 @@
}
@Override
+ @Transactional(rollbackFor = Exception.class)
public void submit(String id) {
OutboundOrder outboundOrder = getById(id);
if (outboundOrder == null) {
@@ -157,12 +179,80 @@
if (!Objects.equals(outboundOrder.getOrderStatus(), OutBillStatus.DRAFT.getValue())) {
throw new JeecgBootException("鏃犳硶鎻愪氦闈炶崏绋跨姸鎬佺殑鍑哄簱鐢宠鍗曪紒");
}
+ if (!OutStorehouseType.PREPARATION_OUTBOUND.getValue().equals(outboundOrder.getOutStorehouseType())) {
+ //涓嶆槸浠庡噯澶囧崟杞叆鐨勫嚭搴撶敵璇凤紝鎵ц閿佸簱
+ lockOutboundStock(id);
+ }
//鍚姩娴佺▼
if (triggerProcess(outboundOrder)) {
outboundOrder.setOrderStatus(OutBillStatus.SUBMITTED.getValue());
+ updateById(outboundOrder);
}
- updateById(outboundOrder);
}
+
+ private boolean lockOutboundStock(String id) {
+ List<OutboundDetail> outboundDetailList = outboundDetailService.list(new LambdaQueryWrapper<OutboundDetail>()
+ .eq(OutboundDetail::getOutStorehouseId, id));
+
+ LambdaQueryWrapper<ToolLedgerDetail> queryWrapper = new LambdaQueryWrapper<>();
+ for (int i = 0; i < outboundDetailList.size(); i++) {
+ if (i > 0) {
+ queryWrapper.or();
+ }
+ OutboundDetail detail = outboundDetailList.get(i);
+ queryWrapper.or(wrapper ->
+ wrapper.eq(StrUtil.isNotBlank(detail.getToolCode()), ToolLedgerDetail::getToolCode, detail.getToolCode())
+ .eq(StrUtil.isNotBlank(detail.getToolId()), ToolLedgerDetail::getToolId, detail.getToolId()) //濡傛灉涓嶇鍒版妸锛岃瀛楁涓虹┖
+ );
+ }
+ List<ToolLedgerDetail> toolLedgerDetailList = toolLedgerDetailService.list(queryWrapper);
+ List<ToolLedgerDetail> toolLedgerDetailUpdateList = CollectionUtil.newArrayList();
+ for (OutboundDetail detail : outboundDetailList) {
+ String toolCode = detail.getToolCode();
+ List<ToolLedgerDetail> ledgerDetailList = toolLedgerDetailList.stream().filter(item -> Objects.equals(item.getToolCode(), toolCode)
+ && Objects.equals(item.getToolId(), detail.getToolId())).collect(Collectors.toList());
+ BaseTools tools = baseToolsService.getById(toolCode);
+ if (CollectionUtil.isEmpty(ledgerDetailList)) {
+ throw new JeecgBootException("缂栫爜涓恒��" + tools.getToolCode() + "銆戠殑宸ュ叿锛屽簱瀛樹笉瓒筹紒");
+ } else {
+ ToolLedgerDetail toolLedgerDetail = ledgerDetailList.get(0);
+ if (toolLedgerDetail.getQuantity().compareTo(detail.getOutboundQuantity()) < 0) {
+ throw new JeecgBootException("缂栫爜涓恒��" + tools.getToolCode() + "銆戠殑宸ュ叿锛屽簱瀛樹笉瓒筹紒");
+ } else {
+ //鎵e噺鍙拌处鏄庣粏涓殑搴撳瓨锛屾墽琛岄攣搴�
+ if (StrUtil.isBlank(detail.getToolId())) {
+ //绠″埌绫荤殑鍒�鍏�
+ toolLedgerDetail.setQuantity(toolLedgerDetail.getQuantity().subtract(detail.getOutboundQuantity()));
+ } else {
+ //绠″埌鎶婄殑鍒�鍏凤紝鏁伴噺鍙湁 0鍜�1
+ toolLedgerDetail.setQuantity(BigDecimal.ZERO);
+ }
+ toolLedgerDetailUpdateList.add(toolLedgerDetail);
+ }
+ }
+ }
+
+ Map<String, BigDecimal> outToolCodeQuantityMap = outboundDetailList.stream().collect(Collectors.groupingBy(OutboundDetail::getToolCode,
+ Collectors.mapping(OutboundDetail::getOutboundQuantity, Collectors.reducing(BigDecimal.ZERO, BigDecimal::add))));
+ Map<String, ToolLedger> toolLedgerMap = toolLedgerService.list(new LambdaQueryWrapper<ToolLedger>().in(ToolLedger::getToolId, outToolCodeQuantityMap.keySet()))
+ .stream().collect(Collectors.toMap(ToolLedger::getToolId, toolLedger -> toolLedger, (k1, k2) -> k1));
+ List<ToolLedger> toolLedgerUpdateList = CollectionUtil.newArrayList();
+ for (String toolCode : outToolCodeQuantityMap.keySet()) {
+ BigDecimal outQuantity = outToolCodeQuantityMap.get(toolCode);
+ ToolLedger toolLedger = toolLedgerMap.get(toolCode);
+ BaseTools tools = baseToolsService.getById(toolCode);
+ if (Objects.isNull(toolLedger) || toolLedger.getAvailableCount().compareTo(outQuantity) < 0) {
+ throw new JeecgBootException("缂栫爜涓恒��" + tools.getToolCode() + "銆戠殑宸ュ叿锛屽簱瀛樹笉瓒筹紒");
+ } else {
+ //鎵e噺鍙拌处涓昏〃涓殑鍙敤瀛樺簱锛屾墽琛岄攣搴�
+ toolLedger.setAvailableCount(toolLedger.getAvailableCount().subtract(outQuantity));
+ toolLedgerUpdateList.add(toolLedger);
+ }
+ }
+ toolLedgerDetailService.updateBatchById(toolLedgerDetailUpdateList);
+ toolLedgerService.updateBatchById(toolLedgerUpdateList);
+ return true;
+ }
@Transactional(rollbackFor = Exception.class)
@Override
@@ -207,9 +297,20 @@
//鏍规嵁浠诲姟瀹屾垚缁撴灉鏇存柊鐢宠鍗曠姸鎬�
if (result.isSuccess()) {
- outboundOrder.setOrderStatus(outBoundOrderFlowDto.getStatus());
if (OutBillStatus.APPROVED.getValue().equals(outBoundOrderFlowDto.getStatus())) {
outboundOrder.setOutStatus(OutBoundStatusEnum.NOT_OUTBOUND.getValue());
+ outboundOrder.setOrderStatus(OutBillStatus.APPROVED.getValue());
+ //鍒濆鍖栫敵璇锋槑缁嗕俊鎭殑鍑哄簱鐘舵��/瀹為檯鍑哄簱鏁伴噺瀛楁
+ outboundDetailService.update(new LambdaUpdateWrapper<OutboundDetail>()
+ .eq(OutboundDetail::getOutStorehouseId, outboundOrder.getId())
+ .set(OutboundDetail::getStatus, OutBoundStatusEnum.NOT_OUTBOUND.getValue())
+ .set(OutboundDetail::getOutActualCount, BigDecimal.ZERO));
+ }
+ if (OutBillStatus.REJECTED.getValue().equals(outBoundOrderFlowDto.getStatus())) {
+ //濡傛灉椹冲洖锛屽鎵瑰崟鐘舵�佸洖鍒拌崏绋�
+ outboundOrder.setOrderStatus(OutBillStatus.DRAFT.getValue());
+ //閲婃斁鐢宠鍗曚腑閿佸畾鐨勫簱瀛�
+ releaseStock(outboundOrder);
}
outboundOrder.setAuditDate(new Date());
outboundOrder.setApprovalOpinion(outBoundOrderFlowDto.getApprovalOpinion());
@@ -217,6 +318,428 @@
}
}
+ private void releaseStock(OutboundOrder outboundOrder) {
+ List<OutboundDetail> outboundDetailList = outboundDetailService.list(new LambdaQueryWrapper<OutboundDetail>()
+ .eq(OutboundDetail::getOutStorehouseId, outboundOrder.getId()));
+
+ LambdaQueryWrapper<ToolLedgerDetail> queryWrapper = new LambdaQueryWrapper<>();
+ for (int i = 0; i < outboundDetailList.size(); i++) {
+ if (i > 0) {
+ queryWrapper.or();
+ }
+ OutboundDetail detail = outboundDetailList.get(i);
+ queryWrapper.or(wrapper ->
+ wrapper.eq(StrUtil.isNotBlank(detail.getToolCode()), ToolLedgerDetail::getToolCode, detail.getToolCode())
+ .eq(StrUtil.isNotBlank(detail.getToolId()), ToolLedgerDetail::getToolId, detail.getToolId()) //濡傛灉涓嶇鍒版妸锛岃瀛楁涓虹┖
+ );
+ }
+ List<ToolLedgerDetail> toolLedgerDetailList = toolLedgerDetailService.list(queryWrapper);
+ List<ToolLedgerDetail> toolLedgerDetailUpdateList = CollectionUtil.newArrayList();
+ for (OutboundDetail detail : outboundDetailList) {
+ Optional<ToolLedgerDetail> optonal = toolLedgerDetailList.stream().filter(item -> Objects.equals(item.getToolCode(), detail.getToolCode())
+ && Objects.equals(item.getToolId(), detail.getToolId())).findFirst();
+ if (optonal.isPresent()) {
+ ToolLedgerDetail toolLedgerDetail = optonal.get();
+ if (StrUtil.isBlank(detail.getToolId())) {
+ //鍒扮被
+ toolLedgerDetail.setQuantity(toolLedgerDetail.getQuantity().add(detail.getOutboundQuantity()));
+ } else {
+ //鍒版妸
+ toolLedgerDetail.setQuantity(BigDecimal.ONE);
+ }
+ toolLedgerDetailUpdateList.add(toolLedgerDetail);
+ }
+ }
+
+ Map<String, BigDecimal> outToolCodeQuantityMap = outboundDetailList.stream().collect(Collectors.groupingBy(OutboundDetail::getToolCode,
+ Collectors.mapping(OutboundDetail::getOutboundQuantity, Collectors.reducing(BigDecimal.ZERO, BigDecimal::add))));
+ Map<String, ToolLedger> toolLedgerMap = toolLedgerService.list(new LambdaQueryWrapper<ToolLedger>().in(ToolLedger::getToolId, outToolCodeQuantityMap.keySet()))
+ .stream().collect(Collectors.toMap(ToolLedger::getToolId, toolLedger -> toolLedger, (k1, k2) -> k1));
+ List<ToolLedger> toolLedgerUpdateList = new ArrayList<>();
+ for (String baseToolId : outToolCodeQuantityMap.keySet()) {
+ BigDecimal outQuantity = outToolCodeQuantityMap.get(baseToolId);
+ ToolLedger toolLedger = toolLedgerMap.get(baseToolId);
+ if (Objects.nonNull(toolLedger)) {
+ toolLedger.setAvailableCount(toolLedger.getAvailableCount().add(outQuantity));
+ toolLedgerUpdateList.add(toolLedger);
+ }
+ }
+ toolLedgerDetailService.updateBatchById(toolLedgerDetailUpdateList);
+ toolLedgerService.updateBatchById(toolLedgerUpdateList);
+ }
+
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public void outBoundByApply(List<OutBoundRequestDto> outBoundRequestList) {
+ //鏍¢獙鏄惁鏉ヨ嚜涓�涓敵璇峰崟
+ if (!fromOneApply(outBoundRequestList)) {
+ throw new JeecgBootException("鍑哄簱鏄庣粏蹇呴』鏉ヨ嚜鍚屼竴鍑哄簱鐢宠鍗曪紒");
+ }
+ //鏄惁鍙嚭搴撴牎楠�
+ if (!readyToOutbound(outBoundRequestList)) {
+ throw new JeecgBootException("鏈粡瀹℃壒閫氳繃鐨勭敵璇峰崟涓嶈兘鍑哄簱锛�");
+ }
+ //寮�濮嬪嚭搴�
+ OutboundOrder outboundOrder = getById(outBoundRequestList.get(0).getOutBoundOrderId());
+ List<String> detailIds = outBoundRequestList.stream().map(OutBoundRequestDto::getOutboundDetailId).collect(Collectors.toList());
+ List<OutboundDetail> outboundDetailList = outboundDetailService.listByIds(detailIds);
+ List<String> toolIdList = outboundDetailList.stream().map(OutboundDetail::getToolCode).collect(Collectors.toList());
+
+ Map<String, BigDecimal> outBoundRequestMap = outBoundRequestList.stream()
+ .collect(Collectors.toMap(OutBoundRequestDto::getOutboundDetailId, OutBoundRequestDto::getOutboundQuantity));
+ Map<String, BigDecimal> ratedLifeMap = outBoundRequestList.stream()
+ .collect(Collectors.toMap(OutBoundRequestDto::getOutboundDetailId, dto->dto.getRatedLife() != null ? dto.getRatedLife() : BigDecimal.ZERO));
+ Map<String, BigDecimal> useLifeMap = outBoundRequestList.stream()
+ .collect(Collectors.toMap(OutBoundRequestDto::getOutboundDetailId, dto->dto.getUseLife() != null ? dto.getUseLife() : BigDecimal.ZERO));
+ //澶勭悊搴撳瓨鍙拌处鍙婂彴璐︽槑缁�
+ Map<String, ToolLedger> toolLedgerMap = toolLedgerService.list(new LambdaQueryWrapper<ToolLedger>().in(ToolLedger::getToolId, toolIdList)).stream()
+ .collect(Collectors.toMap(ToolLedger::getToolId, item -> item, (k1, k2) -> k1));
+
+ LambdaQueryWrapper<ToolLedgerDetail> ledgerDetailQueryWrapper = new LambdaQueryWrapper<>();
+ LambdaQueryWrapper<ToolSharpening> toolSharpenQueryWrapper = new LambdaQueryWrapper<>();
+ for (int i = 0; i < outboundDetailList.size(); i++) {
+ if (i > 0) {
+ ledgerDetailQueryWrapper.or();
+ toolSharpenQueryWrapper.or();
+ }
+ OutboundDetail detail = outboundDetailList.get(i);
+ ledgerDetailQueryWrapper.or(wrapper ->
+ wrapper.eq(ToolLedgerDetail::getToolCode, detail.getToolCode())
+ .eq(ToolLedgerDetail::getToolId, detail.getToolId()) //濡傛灉涓嶇鍒版妸锛岃瀛楁涓虹┖
+ );
+ toolSharpenQueryWrapper.or(wrapper ->
+ wrapper.eq(ToolSharpening::getToolCode, detail.getToolCode())
+ .eq(ToolSharpening::getToolId, detail.getToolId())
+ .eq(ToolSharpening::getSharpeningStatus, SharpenStatus.PENDING.getValue())
+ );
+ }
+ List<ToolLedgerDetail> toolLedgerDetailList = toolLedgerDetailService.list(ledgerDetailQueryWrapper);
+ List<ToolSharpening> toolSharpeningList = toolsSharpeningService.list(toolSharpenQueryWrapper);
+
+ List<ToolLedger> toolLedgerUpdateList = CollectionUtil.newArrayList();
+ List<ToolLedgerDetail> toolLedgerDetailUpdateList = CollectionUtil.newArrayList();
+ List<OutStoreDetail> outStoreAddList = CollectionUtil.newArrayList();
+ List<OutboundDetail> outboundDetailUpdateList = CollectionUtil.newArrayList();
+ List<ToolSharpening> toolSharpeningUpdateList = CollectionUtil.newArrayList();
+
+ for (OutboundDetail detail : outboundDetailList) {
+ //鏇存柊搴撳瓨鍙拌处
+ ToolLedger toolLedger = toolLedgerMap.get(detail.getToolCode());
+ BigDecimal outboundQuantity = outBoundRequestMap.get(detail.getId());
+ BigDecimal ratedLife = ratedLifeMap.get(detail.getId());
+ BigDecimal useLife = useLifeMap.get(detail.getId());
+ //鍞竴缂栫爜涓嶄负绌烘椂锛堢鍒版妸锛�,璁$畻鍓╀綑瀵垮懡
+ BigDecimal remandLife = null;
+ if(StringUtils.isNotBlank(detail.getToolId())){
+ ToolLedgerDetail toolLedgerDetail = toolLedgerDetailService.lambdaQuery().eq(ToolLedgerDetail::getToolId,detail.getToolId()).one();
+ remandLife = (ratedLife.multiply(toolLedgerDetail.getRemainingPercentage()).subtract(useLife).max(BigDecimal.ZERO)).divide(ratedLife, 4, RoundingMode.HALF_UP);
+ }
+ OutStorehouseType outStorehouseType = OutStorehouseType.getByValue(outboundOrder.getOutStorehouseType());
+ switch (outStorehouseType) {
+ case TOOL_BORROW:
+ toolLedger.setLendCount(toolLedger.getLendCount().add(outboundQuantity));
+ break;
+ case MAINTENANCE_OUTBOUND:
+ toolLedger.setRepairCount(toolLedger.getRepairCount().add(outboundQuantity));
+ break;
+ case CALIBRATION_OUTBOUND:
+ toolLedger.setDetectionCount(toolLedger.getDetectionCount().add(outboundQuantity));
+ break;
+ case GRINDING_OUTBOUND:
+ toolLedger.setSharpeningCount(toolLedger.getSharpeningCount().add(outboundQuantity));
+ break;
+ default:
+ throw new JeecgBootException("鏈煡鐨勫嚭搴撶被鍨嬶紒");
+ }
+ toolLedgerUpdateList.add(toolLedger);
+
+ //鏇存柊鍙拌处鏄庣粏
+ BigDecimal finalRemandLife = remandLife;
+ toolLedgerDetailList.stream().filter(item -> item.getToolCode().equals(detail.getToolCode()) && item.getToolId().equals(detail.getToolId()))
+ .findFirst().ifPresent(item -> {
+ switch (outStorehouseType) {
+ case TOOL_BORROW:
+ item.setStatus(ToolCirculationStatus.BORROWED.getValue());
+ item.setRatedLife(ratedLife);
+ item.setUseLife(useLife);
+ item.setRemainingPercentage(finalRemandLife);
+ break;
+ case MAINTENANCE_OUTBOUND:
+ item.setStatus(ToolCirculationStatus.REPAIRING.getValue());
+ item.setRatedLife(ratedLife);
+ item.setUseLife(useLife);
+ item.setRemainingPercentage(finalRemandLife);
+ break;
+ case CALIBRATION_OUTBOUND:
+ item.setStatus(ToolCirculationStatus.INSPECTING.getValue());
+ item.setRatedLife(ratedLife);
+ item.setUseLife(useLife);
+ item.setRemainingPercentage(finalRemandLife);
+ break;
+ case GRINDING_OUTBOUND:
+ item.setStatus(ToolCirculationStatus.GRINDING.getValue());
+ item.setRatedLife(ratedLife);
+ item.setUseLife(useLife);
+ item.setRemainingPercentage(finalRemandLife);
+ break;
+ default:
+ throw new JeecgBootException("鏈煡鐨勫嚭搴撶被鍨嬶紒");
+ }
+ toolLedgerDetailUpdateList.add(item);
+ });
+
+ if (outStorehouseType == OutStorehouseType.GRINDING_OUTBOUND) {
+ //鏇存柊鍒冪(鍗曠姸鎬�
+ toolSharpeningList.stream().filter(item -> item.getToolCode().equals(detail.getToolCode()) && item.getToolId().equals(detail.getToolId()))
+ .findFirst().ifPresent(item -> {
+ item.setSharpeningStatus(SharpenStatus.IN_PROGRESS.getValue());
+ toolSharpeningUpdateList.add(item);
+ });
+ }
+
+ //璁板綍鍑哄簱娴佹按
+ OutStoreDetail outStoreDetail = new OutStoreDetail()
+ .setToolCode(detail.getToolCode())
+ .setToolId(detail.getToolId())
+ .setOutStorehouseType(outboundOrder.getOutStorehouseType())
+ .setGoodsShelvesCode(detail.getOutboundLocation())
+ .setOutNumber(outboundQuantity)
+ .setOutStorehouseId(outboundOrder.getId())
+ .setRatedLife(ratedLife)
+ .setUseLife(useLife)
+ .setRemainingPercentage(remandLife)
+ .setOperateType("1");//1锛氭寜鐢宠鍗�
+ outStoreAddList.add(outStoreDetail);
+
+ //鏇存柊鐢宠鍗曟槑缁�
+ detail.setOutActualCount(detail.getOutActualCount().add(outboundQuantity));
+ detail.setOutboundTime(new Date());
+ if (detail.getOutActualCount().compareTo(detail.getOutboundQuantity()) == 0) {
+ detail.setStatus(OutBoundStatusEnum.COMPLETED.getValue());
+ } else {
+ detail.setStatus(OutBoundStatusEnum.PARTIAL_OUTBOUND.getValue());
+ }
+ outboundDetailUpdateList.add(detail);
+ }
+ toolLedgerService.updateBatchById(toolLedgerUpdateList);
+ toolLedgerDetailService.updateBatchById(toolLedgerDetailUpdateList);
+ outStoreDetailService.saveBatch(outStoreAddList);
+ outboundDetailService.updateBatchById(outboundDetailUpdateList);
+ toolsSharpeningService.updateBatchById(toolSharpeningUpdateList);
+
+ //鏇存柊鐢宠鍗�
+ boolean allMatch = outboundDetailService.list(new LambdaQueryWrapper<OutboundDetail>()
+ .eq(OutboundDetail::getOutStorehouseId, outboundOrder.getId()))
+ .stream().filter(i -> !detailIds.contains(i.getId()))
+ .allMatch(i -> i.getStatus().equals(OutBoundStatusEnum.COMPLETED.getValue()));
+ List<OutboundDetail> partialOutboundList = outboundDetailUpdateList.stream()
+ .filter(i -> !i.getStatus().equals(OutBoundStatusEnum.COMPLETED.getValue())).collect(Collectors.toList());
+ if (allMatch && partialOutboundList.isEmpty()) {
+ outboundOrder.setOutStatus(OutBoundStatusEnum.COMPLETED.getValue());
+ } else {
+ outboundOrder.setOutStatus(OutBoundStatusEnum.PARTIAL_OUTBOUND.getValue());
+ }
+ outboundOrder.setOutboundTime(new Date());
+ updateById(outboundOrder);
+ }
+
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public void outBoundByAdd(List<OutBoundAddDto> boundAddList) {
+ //鏍¢獙鍙拌处涓昏〃搴撳瓨鏁伴噺
+ Map<String, BigDecimal> toolBoundQuantityMap = boundAddList.stream()
+ .collect(Collectors.groupingBy(OutBoundAddDto::getToolCode,
+ Collectors.mapping(OutBoundAddDto::getOutboundQuantity, Collectors.reducing(BigDecimal.ZERO, BigDecimal::add))));
+ Map<String, ToolLedger> toolLedgerMap = toolLedgerService.list(new LambdaQueryWrapper<ToolLedger>().in(ToolLedger::getToolId, toolBoundQuantityMap.keySet()))
+ .stream().collect(Collectors.toMap(ToolLedger::getToolId, item -> item, (k1, k2) -> k1));
+ List<ToolLedger> toolLedgerUpdateList = CollectionUtil.newArrayList();
+ for (String toolCode : toolBoundQuantityMap.keySet()) {
+ ToolLedger toolLedger = toolLedgerMap.get(toolCode);
+ BigDecimal outBoundQuantity = toolBoundQuantityMap.get(toolCode);
+ if (Objects.isNull(toolLedger) || toolLedger.getAvailableCount().compareTo(outBoundQuantity) < 0) {
+ BaseTools tools = baseToolsService.getById(toolCode);
+ throw new JeecgBootException("缂栫爜涓恒��" + tools.getToolCode() + "銆戠殑宸ュ叿锛屽簱瀛樹笉瓒筹紒");
+ } else {
+ OutStorehouseType outStorehouseType = OutStorehouseType.getByValue(boundAddList.get(0).getOutStorehouseType());
+ switch (outStorehouseType) {
+ case TOOL_BORROW:
+ toolLedger.setLendCount(toolLedger.getLendCount().add(outBoundQuantity));
+ break;
+ case MAINTENANCE_OUTBOUND:
+ toolLedger.setRepairCount(toolLedger.getRepairCount().add(outBoundQuantity));
+ break;
+ case CALIBRATION_OUTBOUND:
+ toolLedger.setDetectionCount(toolLedger.getDetectionCount().add(outBoundQuantity));
+ break;
+ case GRINDING_OUTBOUND:
+ toolLedger.setSharpeningCount(toolLedger.getSharpeningCount().add(outBoundQuantity));
+ break;
+ default:
+ throw new JeecgBootException("鏈煡鐨勫嚭搴撶被鍨嬶紒");
+ }
+ //鎵e噺鍙拌处涓昏〃鍙敤搴撳瓨
+ toolLedger.setAvailableCount(toolLedger.getAvailableCount().subtract(outBoundQuantity));
+ toolLedgerUpdateList.add(toolLedger);
+ }
+ }
+ //鏍¢獙鍙拌处鏄庣粏搴撳瓨鏁伴噺
+ Map<String, OutBoundAddDto> boundAddDtoMap = boundAddList.stream().collect(Collectors
+ .toMap(OutBoundAddDto::getToolLedgerDetailId, item -> item, (k1, k2) -> k1));
+ Map<String, ToolLedgerDetail> toolLedgerDetailMap = toolLedgerDetailService.listByIds(boundAddDtoMap.keySet()).stream()
+ .collect(Collectors.toMap(ToolLedgerDetail::getId, item -> item, (k1, k2) -> k1));
+ List<ToolSharpening> toolSharpeningList = toolsSharpeningService.list(new LambdaQueryWrapper<ToolSharpening>()
+ .in(ToolSharpening::getToolCode, toolBoundQuantityMap.keySet()).eq(ToolSharpening::getSharpeningStatus, SharpenStatus.PENDING.getValue()));
+ List<ToolLedgerDetail> toolLedgerDetailUpdateList = CollectionUtil.newArrayList();
+ List<ToolSharpening> toolSharpeningUpdateList = CollectionUtil.newArrayList();
+ for (String toolLedgerDetailId : boundAddDtoMap.keySet()) {
+ OutBoundAddDto outBoundAddDto = boundAddDtoMap.get(toolLedgerDetailId);
+ BigDecimal outboundQuantity = outBoundAddDto.getOutboundQuantity();
+ BigDecimal ratedLife = outBoundAddDto.getRatedLife();
+ BigDecimal useLife = outBoundAddDto.getUseLife();
+ ToolLedgerDetail toolLedgerDetail = toolLedgerDetailMap.get(toolLedgerDetailId);
+ if (Objects.isNull(toolLedgerDetail) || toolLedgerDetail.getQuantity().compareTo(outboundQuantity) < 0) {
+ BaseTools tools = baseToolsService.getById(outBoundAddDto.getToolCode());
+ throw new JeecgBootException("缂栫爜涓恒��" + tools.getToolCode() + "銆戠殑宸ュ叿锛屽簱瀛樹笉瓒筹紒");
+ } else {
+ //鎵e噺鍙拌处鏄庣粏搴撳瓨
+ if (StrUtil.isBlank(toolLedgerDetail.getToolId())) {
+ //娌℃湁鍞竴缂栫爜锛屼笉绠″埌鎶婄殑
+ toolLedgerDetail.setQuantity(toolLedgerDetail.getQuantity().subtract(outboundQuantity));
+ } else {
+ //鏈夊敮涓�缂栫爜锛岀閬撴妸鐨�
+ //璁$畻鍓╀綑瀵垮懡
+ BigDecimal remandLife = (ratedLife.multiply(toolLedgerDetail.getRemainingPercentage()).subtract(useLife).max(BigDecimal.ZERO)).divide(ratedLife, 4, RoundingMode.HALF_UP);
+ toolLedgerDetail.setQuantity(BigDecimal.ZERO);//鏁伴噺鍙細鏄�0鍜�1
+ OutStorehouseType outStorehouseType = OutStorehouseType.getByValue(boundAddList.get(0).getOutStorehouseType());
+ switch (outStorehouseType) {
+ case TOOL_BORROW:
+ toolLedgerDetail.setStatus(ToolCirculationStatus.BORROWED.getValue());
+ toolLedgerDetail.setRatedLife(ratedLife);
+ toolLedgerDetail.setUseLife(useLife);
+ toolLedgerDetail.setRemainingPercentage(remandLife);
+ break;
+ case MAINTENANCE_OUTBOUND:
+ toolLedgerDetail.setStatus(ToolCirculationStatus.REPAIRING.getValue());
+ toolLedgerDetail.setRatedLife(ratedLife);
+ toolLedgerDetail.setUseLife(useLife);
+ toolLedgerDetail.setRemainingPercentage(remandLife);
+ break;
+ case CALIBRATION_OUTBOUND:
+ toolLedgerDetail.setStatus(ToolCirculationStatus.INSPECTING.getValue());
+ toolLedgerDetail.setRatedLife(ratedLife);
+ toolLedgerDetail.setUseLife(useLife);
+ toolLedgerDetail.setRemainingPercentage(remandLife);
+ break;
+ case GRINDING_OUTBOUND:
+ toolLedgerDetail.setStatus(ToolCirculationStatus.GRINDING.getValue());
+ toolLedgerDetail.setRatedLife(ratedLife);
+ toolLedgerDetail.setUseLife(useLife);
+ toolLedgerDetail.setRemainingPercentage(remandLife);
+ //鍚屾椂鏇存柊鍒冪(鍗曠姸鎬�
+ toolSharpeningList.stream().filter(item -> item.getToolCode().equals(outBoundAddDto.getToolCode())
+ && item.getToolId().equals(outBoundAddDto.getToolId())).findFirst().ifPresent(item -> {
+ item.setSharpeningStatus(SharpenStatus.IN_PROGRESS.getValue());
+ toolSharpeningUpdateList.add(item);
+ });
+ break;
+ default:
+ throw new JeecgBootException("鏈煡鐨勫嚭搴撶被鍨嬶紒");
+ }
+ }
+ toolLedgerDetailUpdateList.add(toolLedgerDetail);
+ }
+ }
+ toolLedgerService.updateBatchById(toolLedgerUpdateList);
+ toolLedgerDetailService.updateBatchById(toolLedgerDetailUpdateList);
+ toolsSharpeningService.updateBatchById(toolSharpeningUpdateList);
+ //璁板綍鍑哄簱娴佹按
+ List<OutStoreDetail> outStoreAddList = CollectionUtil.newArrayList();
+ for (OutBoundAddDto outBoundAddDto : boundAddList) {
+ //鑾峰彇鍓╀綑瀵垮懡
+ ToolLedgerDetail toolLedgerDetail = toolLedgerDetailService.getById(outBoundAddDto.getToolLedgerDetailId());
+ OutStoreDetail outStoreDetail = new OutStoreDetail()
+ .setToolCode(outBoundAddDto.getToolCode())
+ .setToolId(outBoundAddDto.getToolId())
+ .setOutStorehouseType(outBoundAddDto.getOutStorehouseType())
+ .setGoodsShelvesCode(outBoundAddDto.getOutboundLocation())
+ .setOutNumber(outBoundAddDto.getOutboundQuantity())
+ .setRatedLife(outBoundAddDto.getRatedLife())
+ .setUseLife(outBoundAddDto.getUseLife())
+ .setRemainingPercentage(toolLedgerDetail.getRemainingPercentage())
+ .setOperateType("2");//2锛氭墜宸ユ搷浣�
+ outStoreAddList.add(outStoreDetail);
+ }
+ outStoreDetailService.saveBatch(outStoreAddList);
+ }
+
+ @Override
+ public IPage<SelectOutboundToolVo> querySharpenOutboundToolPageList(Page<SelectOutboundToolVo> page, Map<String, String[]> parameterMap) {
+ QueryWrapper<SelectOutboundToolVo> queryWrapper = Wrappers.query();
+ String[] toolCodes = parameterMap.get("toolCode");
+ if (toolCodes != null && toolCodes.length > 0) {
+ queryWrapper.like("t3.tool_code", toolCodes[0]);
+ }
+ String[] classifyIds = parameterMap.get("classifyId");
+ if (classifyIds != null && classifyIds.length > 0) {
+ queryWrapper.eq("t3.classify_id", classifyIds[0]);
+ }
+ String[] excludeIds = parameterMap.get("excludeIds");
+ if (excludeIds != null && excludeIds.length > 0) {
+ String[] idArray = excludeIds[0].split(",");
+ queryWrapper.notIn("t1.id", idArray);
+ }
+ queryWrapper.eq("t1.sharpening_status", SharpenStatus.PENDING.getValue());
+ return this.baseMapper.querySharpenOutboundToolPageList(page, queryWrapper);
+ }
+
+ @Override
+ public IPage<SelectOutboundToolVo> queryBorrowOutboundToolPageList(Page<SelectOutboundToolVo> page, Map<String, String[]> parameterMap) {
+ QueryWrapper<SelectOutboundToolVo> queryWrapper = Wrappers.query();
+ String[] toolCodes = parameterMap.get("toolCode");
+ if (toolCodes != null && toolCodes.length > 0) {
+ queryWrapper.like("p.tool_code", toolCodes[0]);
+ }
+ String[] statuses = parameterMap.get("status");
+ if (statuses != null && statuses.length > 0) {
+ queryWrapper.eq("t.status", statuses[0]);
+ }
+ String[] quantities = parameterMap.get("quantity");
+ if (quantities != null && quantities.length > 0) {
+ queryWrapper.gt("t.quantity", quantities[0]);
+ }
+ String[] classifyIds = parameterMap.get("classifyId");
+ if (classifyIds != null && classifyIds.length > 0) {
+ queryWrapper.eq("p.classify_id", classifyIds[0]);
+ }
+ String[] excludeIds = parameterMap.get("excludeIds");
+ if (excludeIds != null && excludeIds.length > 0) {
+ String[] idArray = excludeIds[0].split(",");
+ queryWrapper.notIn("t.id", idArray);
+ }
+ return this.baseMapper.queryBorrowOutboundToolPageList(page, queryWrapper);
+ }
+
+
+ private boolean fromOneApply(List<OutBoundRequestDto> outBoundRequestList) {
+ long count = outBoundRequestList.stream().map(OutBoundRequestDto::getOutBoundOrderId).distinct().count();
+ if (count > 1) {
+ return false;
+ }
+ List<String> outDetailIds = outBoundRequestList.stream().map(OutBoundRequestDto::getOutboundDetailId).collect(Collectors.toList());
+ String outboundDetailId = outBoundRequestList.get(0).getOutboundDetailId();
+ OutboundDetail outboundDetail = outboundDetailService.getById(outboundDetailId);
+ List<String> detailIds = outboundDetailService.list(new LambdaQueryWrapper<OutboundDetail>()
+ .eq(OutboundDetail::getOutStorehouseId, outboundDetail.getOutStorehouseId())).stream()
+ .map(OutboundDetail::getId).collect(Collectors.toList());
+ return new HashSet<>(detailIds).containsAll(outDetailIds);
+ }
+
+ private boolean readyToOutbound(List<OutBoundRequestDto> outBoundRequestList) {
+ String outBoundOrderId = outBoundRequestList.get(0).getOutBoundOrderId();
+ OutboundOrder outboundOrder = getById(outBoundOrderId);
+ return OutBillStatus.APPROVED.getValue().equals(outboundOrder.getOrderStatus());
+ }
+
public boolean triggerProcess(OutboundOrder outboundOrder) {
flowCommonService.initActBusiness("鍗曞彿涓猴細" + outboundOrder.getOutNum() + " 鐨勫嚭搴撶敵璇凤紝寮�濮嬭繘琛屽鎵�",
outboundOrder.getId(), "outboundOrderServiceImpl", "tool_out_storage", null);
--
Gitblit v1.9.3