From 684e4306a08feeae188070f264148e6765da8dcf Mon Sep 17 00:00:00 2001
From: 云 <2163098428@qq.com>
Date: 星期日, 20 九月 2026 19:25:15 +0800
Subject: [PATCH] feat(account): 更新往来付款回款流水表及接口
---
src/main/java/com/ruoyi/procurementrecord/service/impl/ProcurementRecordOutServiceImpl.java | 130 +++++++++++++++++++++++++++++++++++++++----
1 files changed, 117 insertions(+), 13 deletions(-)
diff --git a/src/main/java/com/ruoyi/procurementrecord/service/impl/ProcurementRecordOutServiceImpl.java b/src/main/java/com/ruoyi/procurementrecord/service/impl/ProcurementRecordOutServiceImpl.java
index 078d8f9..d75db6c 100644
--- a/src/main/java/com/ruoyi/procurementrecord/service/impl/ProcurementRecordOutServiceImpl.java
+++ b/src/main/java/com/ruoyi/procurementrecord/service/impl/ProcurementRecordOutServiceImpl.java
@@ -4,27 +4,35 @@
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.common.utils.SecurityUtils;
import com.ruoyi.common.utils.poi.ExcelUtil;
-import com.ruoyi.framework.security.LoginUser;
-import com.ruoyi.procurementrecord.dto.ProcurementPageDto;
-import com.ruoyi.procurementrecord.dto.ProcurementRecordOutAdd;
-import com.ruoyi.procurementrecord.dto.ProcurementRecordOutPageDto;
-import com.ruoyi.procurementrecord.dto.ProcurementUpdateDto;
+import com.ruoyi.procurementrecord.bean.dto.ProcurementRecordOutAdd;
+import com.ruoyi.procurementrecord.bean.dto.ProcurementRecordOutPageDto;
+import com.ruoyi.procurementrecord.bean.dto.ProcurementUpdateDto;
+import com.ruoyi.procurementrecord.bean.vo.BatchNoOptionVo;
import com.ruoyi.procurementrecord.mapper.ProcurementRecordOutMapper;
-import com.ruoyi.procurementrecord.pojo.ProcurementRecord;
import com.ruoyi.procurementrecord.pojo.ProcurementRecordOut;
import com.ruoyi.procurementrecord.service.ProcurementRecordOutService;
import com.ruoyi.project.system.domain.SysUser;
import com.ruoyi.project.system.mapper.SysUserMapper;
+import com.ruoyi.sales.dto.ShippingInfoDto;
+import com.ruoyi.sales.mapper.SalesLedgerProductMapper;
+import com.ruoyi.sales.pojo.SalesLedgerProduct;
+import com.ruoyi.sales.pojo.ShippingProductDetail;
+import com.ruoyi.sales.service.ShippingInfoService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
-import javax.servlet.http.HttpServletResponse;
+import jakarta.servlet.http.HttpServletResponse;
import java.math.BigDecimal;
+import java.time.LocalDate;
import java.time.LocalDateTime;
+import java.time.LocalTime;
+import java.time.format.DateTimeFormatter;
+import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;
@@ -37,31 +45,97 @@
@Slf4j
public class ProcurementRecordOutServiceImpl extends ServiceImpl<ProcurementRecordOutMapper, ProcurementRecordOut> implements ProcurementRecordOutService {
+ /**
+ * 鍑哄簱绫诲瀷锛氶攢鍞嚭搴撱�傛补鍝侀攢鍞嚭搴撳嵆鍙戣揣
+ */
+ private static final Integer TYPE_SALE_OUT = 2;
+
+ /**
+ * 閿�鍞骇鍝佹槑缁嗙被鍨嬶細1閿�鍞紙sales_ledger_product.type锛屼笌鍑哄簱 type 璇箟涓嶅悓锛�
+ */
+ private static final Integer LEDGER_PRODUCT_TYPE_SALE = 1;
+
public final ProcurementRecordOutMapper procurementRecordOutMapper;
public final SysUserMapper sysUserMapper;
+ public final ShippingInfoService shippingInfoService;
+
+ public final SalesLedgerProductMapper salesLedgerProductMapper;
+
@Override
+ @Transactional(rollbackFor = Exception.class)
public int stockout(ProcurementRecordOutAdd procurementRecordOutAdd) {
SysUser sysUser = sysUserMapper.selectUserById(Long.valueOf(procurementRecordOutAdd.getUserId().toString()));
if(sysUser == null){
throw new RuntimeException("鍑哄簱浜轰笉瀛樺湪");
}
+ // 鏌ヨ鏃堕棿鑼冨洿涓哄綋澶╂暟閲�
+ LocalDate now = LocalDate.now();
+ DateTimeFormatter dateFormat = DateTimeFormatter.ofPattern("yyyyMMdd");
+ LambdaQueryWrapper<ProcurementRecordOut> procurementRecordOutLambdaQueryWrapper = new LambdaQueryWrapper<>();
+ procurementRecordOutLambdaQueryWrapper.ge(ProcurementRecordOut::getCreateTime, now) // 澶т簬绛変簬褰撳ぉ
+ .lt(ProcurementRecordOut::getCreateTime, now.plusDays(1)); // 灏忎簬鏄庡ぉ
+ Long aLong1 = procurementRecordOutMapper.selectCount(procurementRecordOutLambdaQueryWrapper);
+ // 2. 瀹氫箟鏃ユ湡鏍煎紡锛堝繀椤讳笌瀛楃涓叉牸寮忓畬鍏ㄥ尮閰嶏級
+ DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+ LocalDateTime localDateTime = null;
+ // 3. 杞崲锛歋tring 鈫� LocalDate 鈫� LocalDateTime锛堣ˉ鍏�0鐐规椂闂达級
+ if(StringUtils.isNotEmpty(procurementRecordOutAdd.getTime())){
+ LocalDate localDate = LocalDate.parse(procurementRecordOutAdd.getTime(), formatter);
+ // 鑾峰彇褰撳墠鏃跺垎绉�
+ LocalTime localTime = LocalTime.now();
+ localDateTime = localDate.atTime(localTime);}
// 鏌ヨ閲囪喘鍑哄簱鏁伴噺
LambdaQueryWrapper<ProcurementRecordOut> procurementRecordLambdaQueryWrapper = new LambdaQueryWrapper<>();
procurementRecordLambdaQueryWrapper.eq(ProcurementRecordOut::getProcurementRecordStorageId, procurementRecordOutAdd.getId());
Long aLong = procurementRecordOutMapper.selectCount(procurementRecordLambdaQueryWrapper);
ProcurementRecordOut.ProcurementRecordOutBuilder procurementRecordOut = ProcurementRecordOut.builder()
.procurementRecordStorageId(procurementRecordOutAdd.getId())
+ .code("SC" + dateFormat.format(now) + String.format("%03d", aLong1 + 1))
.salesLedgerProductId(procurementRecordOutAdd.getSalesLedgerProductId())
.inboundBatches(aLong.equals(0L) ? "绗�1鎵规" : "绗�"+ (aLong + 1) + "鎵规")
.inboundNum(new BigDecimal(procurementRecordOutAdd.getQuantity()))
- .createDate(LocalDateTime.now())
- .userId(procurementRecordOutAdd.getUserId())
+ .type(procurementRecordOutAdd.getType())
+ .createTime(localDateTime == null ? LocalDateTime.now() : localDateTime)
+ .createUser(Long.valueOf(procurementRecordOutAdd.getUserId()))
.createBy(sysUser.getNickName())
- .tenantId(sysUser.getTenantId());
- this.save(procurementRecordOut.build());
+ .updateUser(Long.valueOf(procurementRecordOutAdd.getUserId()))
+ .updateTime(LocalDateTime.now())
+ .productModelId(procurementRecordOutAdd.getProductModelId())
+ .batchNo(procurementRecordOutAdd.getBatchNo());
+ ProcurementRecordOut record = procurementRecordOut.build();
+ this.save(record);
+
+ // 娌瑰搧閿�鍞嚭搴撳嵆鍙戣揣锛氳嚜鍔ㄧ敓鎴愪竴鏉″凡鍙戣揣鐨勫彂璐у彴璐﹀苟鍥炲啓鍏宠仈
+ if (TYPE_SALE_OUT.equals(record.getType())) {
+ record.setShippingInfoId(createShippingForOutbound(record));
+ this.updateById(record);
+ }
return 0;
+ }
+
+ /**
+ * 鎸夊嚭搴撹褰曠敓鎴愬彂璐у彴璐︼細鎵规蹇呭~锛屽簱瀛樼敱鍙戣揣渚ф墸鍑�
+ */
+ private Long createShippingForOutbound(ProcurementRecordOut record) {
+ if (StringUtils.isBlank(record.getBatchNo())) {
+ throw new RuntimeException("璇烽�夋嫨鍑哄簱鎵规");
+ }
+ SalesLedgerProduct salesLedgerProduct = salesLedgerProductMapper.selectById(record.getSalesLedgerProductId());
+ if (salesLedgerProduct == null || !LEDGER_PRODUCT_TYPE_SALE.equals(salesLedgerProduct.getType())) {
+ throw new RuntimeException("閿�鍞嚭搴撴湭鍏宠仈鍒版湁鏁堢殑閿�鍞骇鍝佹槑缁�");
+ }
+ ShippingProductDetail detail = new ShippingProductDetail();
+ detail.setProductModelId(record.getProductModelId());
+ detail.setQuantity(record.getInboundNum());
+ detail.setBatchNo(record.getBatchNo());
+
+ ShippingInfoDto shippingInfoDto = new ShippingInfoDto();
+ shippingInfoDto.setSalesLedgerId(salesLedgerProduct.getSalesLedgerId());
+ shippingInfoDto.setSalesLedgerProductId(record.getSalesLedgerProductId());
+ shippingInfoDto.setBatchNoDetailList(Collections.singletonList(detail));
+ return shippingInfoService.addShippedFromOutbound(shippingInfoDto);
}
@Override
@@ -74,10 +148,17 @@
}
@Override
+ @Transactional(rollbackFor = Exception.class)
public int deletePro(ProcurementUpdateDto procurementDto) {
List<ProcurementRecordOut> procurementRecordOutByIds = getProcurementRecordOutByIds(procurementDto.getIds());
if(CollectionUtils.isEmpty(procurementRecordOutByIds)){
throw new RuntimeException("鏈煡璇㈠埌閫変腑鐨勪汉");
+ }
+ // 閿�鍞嚭搴撳凡鐢熸垚鍙戣揣鍗曪紝鍒犻櫎鍑哄簱鍗曞墠鍏堝啿閿�鍙戣揣鍗曞苟褰掕繕宸叉墸搴撳瓨
+ for (ProcurementRecordOut record : procurementRecordOutByIds) {
+ if (record.getShippingInfoId() != null) {
+ shippingInfoService.cancelByOutbound(record.getShippingInfoId());
+ }
}
procurementRecordOutMapper.deleteBatchIds(procurementRecordOutByIds.stream().map(ProcurementRecordOut::getId).collect(Collectors.toList()));
return 0;
@@ -85,8 +166,31 @@
@Override
public void export(HttpServletResponse response) {
- List<ProcurementRecordOutPageDto> list =procurementRecordOutMapper.list();
+ List<ProcurementRecordOutPageDto> list = procurementRecordOutMapper.list();
ExcelUtil<ProcurementRecordOutPageDto> util = new ExcelUtil<>(ProcurementRecordOutPageDto.class);
util.exportExcel(response, list, "鍑哄簱鍙拌处");
}
+
+ @Override
+ public IPage<ProcurementRecordOutPageDto> listPageByProduct(Page page, ProcurementRecordOutPageDto procurementDto) {
+ return procurementRecordOutMapper.listPageByProduct(page, procurementDto);
+ }
+
+ @Override
+ public IPage<ProcurementRecordOutPageDto> listPageByCustom(Page page, ProcurementRecordOutPageDto procurementDto) {
+ return procurementRecordOutMapper.listPageByCustom(page, procurementDto);
+ }
+
+ @Override
+ public IPage<ProcurementRecordOutPageDto> listPageBySemiProduct(Page page, ProcurementRecordOutPageDto procurementDto) {
+ return procurementRecordOutMapper.listPageBySemiProduct(page, procurementDto);
+ }
+
+ @Override
+ public List<BatchNoOptionVo> listBatchNoByProductModelId(Long productModelId) {
+ if (productModelId == null) {
+ return Collections.emptyList();
+ }
+ return procurementRecordOutMapper.listBatchNoByProductModelId(productModelId);
+ }
}
--
Gitblit v1.9.3