From 55d694aaae4e421b5e55cd941500e08f85cb5d4d Mon Sep 17 00:00:00 2001
From: 云 <2163098428@qq.com>
Date: 星期四, 27 八月 2026 18:21:33 +0800
Subject: [PATCH] feat(sales): 添加框架合同订单功能并优化销售台账管理
---
src/main/java/com/ruoyi/sales/service/impl/ShippingInfoServiceImpl.java | 92 +++++++++++++++++++++++++++++++++++++++++++---
1 files changed, 86 insertions(+), 6 deletions(-)
diff --git a/src/main/java/com/ruoyi/sales/service/impl/ShippingInfoServiceImpl.java b/src/main/java/com/ruoyi/sales/service/impl/ShippingInfoServiceImpl.java
index f8bd358..82049ab 100644
--- a/src/main/java/com/ruoyi/sales/service/impl/ShippingInfoServiceImpl.java
+++ b/src/main/java/com/ruoyi/sales/service/impl/ShippingInfoServiceImpl.java
@@ -4,21 +4,31 @@
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.approve.bean.dto.ApprovalInstanceDto;
+import com.ruoyi.approve.mapper.ApprovalTemplateMapper;
+import com.ruoyi.approve.pojo.ApprovalTemplate;
import com.ruoyi.approve.pojo.ApproveProcess;
+import com.ruoyi.approve.service.ApprovalInstanceService;
import com.ruoyi.approve.service.impl.ApproveProcessServiceImpl;
import com.ruoyi.basic.enums.ApplicationTypeEnum;
import com.ruoyi.basic.enums.RecordTypeEnum;
import com.ruoyi.basic.utils.FileUtil;
import com.ruoyi.common.enums.FileNameType;
import com.ruoyi.common.enums.StockOutQualifiedRecordTypeEnum;
+import com.ruoyi.common.utils.OrderUtils;
+import com.ruoyi.common.utils.SecurityUtils;
+import com.ruoyi.framework.security.LoginUser;
import com.ruoyi.procurementrecord.bean.vo.ShippingProductVo;
import com.ruoyi.procurementrecord.utils.StockUtils;
import com.ruoyi.sales.dto.ShippingApproveDto;
import com.ruoyi.sales.dto.ShippingInfoDto;
import com.ruoyi.sales.dto.ShippingProductDetailDto;
+import com.ruoyi.sales.mapper.SalesLedgerMapper;
import com.ruoyi.sales.mapper.SalesLedgerProductMapper;
import com.ruoyi.sales.mapper.ShippingInfoMapper;
import com.ruoyi.sales.mapper.ShippingProductDetailMapper;
+import com.ruoyi.sales.pojo.SalesLedger;
+import com.ruoyi.sales.pojo.SalesLedgerProduct;
import com.ruoyi.sales.pojo.ShippingInfo;
import com.ruoyi.sales.pojo.ShippingProductDetail;
import com.ruoyi.sales.service.ShippingInfoService;
@@ -26,7 +36,9 @@
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import java.time.LocalDateTime;
import java.util.List;
/**
@@ -44,6 +56,8 @@
private final SalesLedgerProductMapper salesLedgerProductMapper;
+ private final SalesLedgerMapper salesLedgerMapper;
+
private final StockUtils stockUtils;
private final CommonFileServiceImpl commonFileService;
@@ -51,6 +65,8 @@
private final ApproveProcessServiceImpl approveProcessService;
private final FileUtil fileUtil;
private final ShippingProductDetailMapper shippingProductDetailMapper;
+ private final ApprovalTemplateMapper approvalTemplateMapper;
+ private final ApprovalInstanceService approvalInstanceService;
@Override
public IPage<ShippingInfoDto> listPage(Page page, ShippingInfo req) {
@@ -89,18 +105,16 @@
}
@Override
+ @Transactional(rollbackFor = Exception.class)
public boolean delete(List<Long> ids) {
List<ShippingInfo> shippingInfos = shippingInfoMapper.selectList(new LambdaQueryWrapper<ShippingInfo>()
.in(ShippingInfo::getId, ids));
if (CollectionUtils.isEmpty(shippingInfos)) return false;
+ // 鍙湁寰呭鏍哥姸鎬佹墠鑳藉垹闄�
+ boolean allPending = shippingInfos.stream().allMatch(s -> "寰呭鏍�".equals(s.getStatus()));
+ if (!allPending) throw new RuntimeException("鍙湁寰呭鏍哥姸鎬佹墠鑳藉垹闄�");
// 鍒犻櫎闄勪欢
commonFileService.deleteByBusinessIds(ids, FileNameType.SHIP.getValue());
- // 鎵e凡鍙戣揣搴撳瓨
- for (ShippingInfo shippingInfo : shippingInfos) {
- if ("瀹℃牳閫氳繃".equals(shippingInfo.getStatus())) {
- stockUtils.deleteStockOutRecord(shippingInfo.getId(), StockOutQualifiedRecordTypeEnum.SALE_SHIP_STOCK_OUT.getCode());
- }
- }
// 鍒犻櫎鍙戣揣瀹℃壒
if (CollectionUtils.isNotEmpty(shippingInfos)) {
for (ShippingInfo shippingInfo : shippingInfos) {
@@ -110,6 +124,8 @@
List<Long> list = one.stream().map(ApproveProcess::getId).toList();
approveProcessService.delByIds(list);
}
+ // 鎵e凡鍙戣揣搴撳瓨
+ stockUtils.deleteStockOutRecord(shippingInfo.getId(), StockOutQualifiedRecordTypeEnum.SALE_SHIP_STOCK_OUT.getCode());
}
}
//鍒犻櫎鍙戣揣鏄庣粏
@@ -157,4 +173,68 @@
shippingApproveDto.setShippingProductDetailDtoList(dateilByShippingNo);
return shippingApproveDto;
}
+
+ @Override
+ public boolean addReq(ShippingInfoDto req) {
+
+ // 妗嗘灦鍚堝悓鍙敤浜庣櫥璁颁骇鍝佽寖鍥达紝瀹為檯鍙戣揣蹇呴』鍏宠仈妗嗘灦璁㈠崟浜у搧銆�
+ Long salesLedgerProductId = req.getSalesLedgerProductId();
+ if (salesLedgerProductId != null) {
+ SalesLedgerProduct product = salesLedgerProductMapper.selectById(salesLedgerProductId);
+ if (product == null) {
+ throw new RuntimeException("閿�鍞骇鍝佷笉瀛樺湪");
+ }
+ if (req.getSalesLedgerId() != null
+ && !java.util.Objects.equals(req.getSalesLedgerId(), product.getSalesLedgerId())) {
+ throw new RuntimeException("鍙戣揣鍙拌处涓庨攢鍞骇鍝佷笉鍖归厤");
+ }
+ SalesLedger ledger = salesLedgerMapper.selectById(product.getSalesLedgerId());
+ if (ledger == null || (!java.util.Objects.equals(ledger.getContractType(), 1)
+ && !java.util.Objects.equals(ledger.getContractType(), 3))) {
+ throw new RuntimeException("璇ラ攢鍞骇鍝佷笉鍏佽鍙戣揣");
+ }
+ }
+ // 鏍¢獙璇ヤ骇鍝佹槸鍚﹀凡鏈夊緟瀹℃牳/瀹℃牳涓殑鍙戣揣璁板綍锛岄槻姝㈤噸澶嶆彁浜�
+ if (salesLedgerProductId != null) {
+ long pendingCount = this.count(new LambdaQueryWrapper<ShippingInfo>()
+ .eq(ShippingInfo::getSalesLedgerProductId, salesLedgerProductId)
+ .in(ShippingInfo::getStatus, "寰呭鏍�", "瀹℃牳涓�"));
+ if (pendingCount > 0) {
+ throw new RuntimeException("璇ヤ骇鍝佸凡鏈夊緟瀹℃牳鐨勫彂璐ц褰曪紝璇峰嬁閲嶅鎻愪氦");
+ }
+ }
+
+ LoginUser loginUser = SecurityUtils.getLoginUser();
+ String sh = OrderUtils.countTodayByCreateTime(shippingInfoMapper, "SH","shipping_no",req.getCreateTime());
+ // 鍏堜繚瀛樺彂璐у崟锛屽啀鍙戣捣瀹℃壒锛涙棤瀹℃牳浜鸿嚜鍔ㄩ�氳繃鏃堕渶瑕佹寜鍙戣揣缂栧彿鍥炲啓鍙戣揣鐘舵�併��
+ req.setShippingNo(sh);
+ req.setStatus("寰呭鏍�");
+ boolean save = this.add(req);
+ // 鍙戣揣瀹℃壒
+ ApprovalTemplate approvalTemplate = approvalTemplateMapper.selectOne(
+ new LambdaQueryWrapper<ApprovalTemplate>()
+ .eq(ApprovalTemplate::getBusinessType, 7L)
+ .eq(ApprovalTemplate::getDeleted, 0)
+ .orderByDesc(ApprovalTemplate::getId)
+ .last("LIMIT 1")
+ );
+ if (approvalTemplate == null) {
+ throw new RuntimeException("璇峰厛閰嶇疆鍙戣揣瀹℃壒妯℃澘");
+ }
+ ApprovalInstanceDto approvalInstance = new ApprovalInstanceDto();
+ approvalInstance.setTemplateId(approvalTemplate.getId());
+ approvalInstance.setTemplateName(approvalTemplate.getTemplateName());
+ approvalInstance.setBusinessId(req.getId());
+ approvalInstance.setBusinessType(7L);
+ approvalInstance.setCurrentLevel(1);
+ approvalInstance.setTitle(sh);
+ approvalInstance.setApplicantId(loginUser.getUserId());
+ approvalInstance.setApplicantName(loginUser.getNickName());
+ approvalInstance.setApplyTime(LocalDateTime.now());
+ approvalInstanceService.add(approvalInstance);
+ // 鍒涘缓瀹℃壒瀹炰緥鍚庯紝鏇存柊鍙戣揣鐘舵�佷负"瀹℃牳涓�"锛屼娇鍓嶇姝g‘鏄剧ず瀹℃壒鐘舵��
+ req.setStatus("瀹℃牳涓�");
+ this.updateById(req);
+ return true;
+ }
}
--
Gitblit v1.9.3