From 99c61e2e4c5aabe594ff8a463a45f3a6b5cb9add Mon Sep 17 00:00:00 2001
From: buhuazhen <hua100783@gmail.com>
Date: 星期五, 29 五月 2026 17:55:58 +0800
Subject: [PATCH] feat: 调整
---
src/main/java/com/ruoyi/approve/pojo/ApproveProcess.java | 7 +
src/main/java/com/ruoyi/sales/service/impl/ShippingInfoServiceImpl.java | 140 ++++++++++++++++++++++++++++++++++
src/main/resources/mapper/stock/StockOutRecordMapper.xml | 6 +
src/main/resources/mapper/approve/ApproveProcessMapper.xml | 34 ++++++--
src/main/resources/mapper/sales/ShipmentApprovalMapper.xml | 11 ++
5 files changed, 185 insertions(+), 13 deletions(-)
diff --git a/src/main/java/com/ruoyi/approve/pojo/ApproveProcess.java b/src/main/java/com/ruoyi/approve/pojo/ApproveProcess.java
index 11d5268..35be69e 100644
--- a/src/main/java/com/ruoyi/approve/pojo/ApproveProcess.java
+++ b/src/main/java/com/ruoyi/approve/pojo/ApproveProcess.java
@@ -170,6 +170,13 @@
private BigDecimal maintenancePrice;
private static final long serialVersionUID = 1L;
+ /**
+ * 閿�鍞崟鍙� (鍙戣揣瀹℃壒鏃朵粠閿�鍞彴璐﹀叧鑱旀煡璇�)
+ */
+ @TableField(exist = false)
+ @ApiModelProperty(value = "閿�鍞崟鍙�")
+ private String salesContractNo;
+
@ApiModelProperty(value = "鍒涘缓鐢ㄦ埛")
@TableField(fill = FieldFill.INSERT)
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 f2b9555..ae8be33 100644
--- a/src/main/java/com/ruoyi/sales/service/impl/ShippingInfoServiceImpl.java
+++ b/src/main/java/com/ruoyi/sales/service/impl/ShippingInfoServiceImpl.java
@@ -4,17 +4,27 @@
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.mapper.ApproveProcessMapper;
import com.ruoyi.approve.pojo.ApproveProcess;
import com.ruoyi.approve.service.impl.ApproveProcessServiceImpl;
import com.ruoyi.common.enums.FileNameType;
import com.ruoyi.common.enums.StockOutQualifiedRecordTypeEnum;
+import com.ruoyi.common.utils.SecurityUtils;
+import com.ruoyi.framework.security.LoginUser;
import com.ruoyi.other.service.impl.TempFileServiceImpl;
import com.ruoyi.procurementrecord.utils.StockUtils;
+import com.ruoyi.project.system.domain.SysDept;
+import com.ruoyi.project.system.mapper.SysDeptMapper;
+import com.ruoyi.project.system.mapper.SysUserMapper;
import com.ruoyi.sales.dto.SalesLedgerProductDto;
import com.ruoyi.sales.dto.ShippingInfoDto;
+import com.ruoyi.sales.mapper.SalesLedgerMapper;
import com.ruoyi.sales.mapper.SalesLedgerProductMapper;
+import com.ruoyi.sales.mapper.ShipmentApprovalMapper;
import com.ruoyi.sales.mapper.ShippingInfoMapper;
+import com.ruoyi.sales.pojo.SalesLedger;
import com.ruoyi.sales.pojo.SalesLedgerProduct;
+import com.ruoyi.sales.pojo.ShipmentApproval;
import com.ruoyi.sales.pojo.ShippingInfo;
import com.ruoyi.sales.service.ShippingInfoService;
import lombok.extern.slf4j.Slf4j;
@@ -24,8 +34,11 @@
import org.springframework.transaction.annotation.Transactional;
import java.io.IOException;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.Collections;
+import java.util.Date;
import java.util.List;
/**
@@ -50,6 +63,21 @@
@Autowired
private ApproveProcessServiceImpl approveProcessService;
+
+ @Autowired
+ private ApproveProcessMapper approveProcessMapper;
+
+ @Autowired
+ private ShipmentApprovalMapper shipmentApprovalMapper;
+
+ @Autowired
+ private SalesLedgerMapper salesLedgerMapper;
+
+ @Autowired
+ private SysUserMapper sysUserMapper;
+
+ @Autowired
+ private SysDeptMapper sysDeptMapper;
@Override
public IPage<ShippingInfoDto> listPage(Page page, ShippingInfo req) {
@@ -124,16 +152,28 @@
/**
* 涓�閿彂璐� - 鑷姩瀹℃壒閫氳繃骞跺嚭搴�
- * 涓嶅垱寤哄鎵规祦绋嬶紝鐩存帴鎵e噺搴撳瓨
+ * 鍒涘缓瀹℃壒璁板綍锛屾壒鍑嗕汉涓�"鏈堝厜"
*/
@Override
@Transactional
public boolean oneClickShipping(ShippingInfoDto req) throws IOException {
+ LoginUser loginUser = SecurityUtils.getLoginUser();
+
// 鑾峰彇閿�鍞彴璐︿骇鍝佷俊鎭�
SalesLedgerProduct salesLedgerProduct = salesLedgerProductMapper.selectById(req.getSalesLedgerProductId());
if (salesLedgerProduct == null) {
throw new RuntimeException("閿�鍞骇鍝佷笉瀛樺湪");
}
+
+ // 鑾峰彇閿�鍞彴璐︿俊鎭�
+ SalesLedger salesLedger = salesLedgerMapper.selectById(req.getSalesLedgerId());
+
+ // 鏌ヨ"鏈堝厜"鐢ㄦ埛
+ com.ruoyi.project.system.domain.SysUser moonlightUser = sysUserMapper.selectOne(
+ new LambdaQueryWrapper<com.ruoyi.project.system.domain.SysUser>()
+ .eq(com.ruoyi.project.system.domain.SysUser::getNickName, "鏈堝厜")
+ .last("limit 1")
+ );
// 鐢熸垚鍙戣揣鍗曞彿
String shippingNo = com.ruoyi.common.utils.OrderUtils.countTodayByCreateTime(shippingInfoMapper, "SH", "shipping_no");
@@ -152,6 +192,44 @@
boolean save = this.save(shippingInfo);
if (save) {
+ // 鍒涘缓瀹℃壒娴佺▼璁板綍锛岀姸鎬佷负瀹℃牳瀹屾垚(2)锛屾壒鍑嗕汉涓�"鏈堝厜"
+ String salesContractNo = salesLedger != null ? salesLedger.getSalesContractNo() : "";
+ StringBuilder approveReason = new StringBuilder();
+ approveReason.append("鍙戣揣鍗曞彿:").append(shippingNo);
+ if (salesContractNo != null && !salesContractNo.isEmpty()) {
+ approveReason.append("\n閿�鍞崟鍙�:").append(salesContractNo);
+ }
+ approveReason.append("\n").append(req.getType());
+ if ("璐ц溅".equals(req.getType()) && req.getShippingCarNumber() != null && !req.getShippingCarNumber().isEmpty()) {
+ approveReason.append(":").append(req.getShippingCarNumber());
+ } else if ("蹇��".equals(req.getType()) && req.getExpressCompany() != null && !req.getExpressCompany().isEmpty()) {
+ approveReason.append(":").append(req.getExpressCompany());
+ }
+
+ ApproveProcess approveProcess = new ApproveProcess();
+ String approveId = com.ruoyi.common.utils.OrderUtils.countTodayByCreateTime(approveProcessMapper, "", "approve_id");
+ approveProcess.setApproveId(approveId);
+ approveProcess.setApproveUser(loginUser.getUserId());
+ approveProcess.setApproveUserName(loginUser.getNickName());
+ approveProcess.setApproveDeptId(loginUser.getCurrentDeptId());
+
+ SysDept sysDept = sysDeptMapper.selectDeptById(loginUser.getCurrentDeptId());
+
+ approveProcess.setApproveDeptName(sysDept.getDeptName());
+ approveProcess.setApproveReason(approveReason.toString());
+ approveProcess.setApproveUserIds(moonlightUser != null ? String.valueOf(moonlightUser.getUserId()) : "");
+ approveProcess.setApproveUserNames(moonlightUser != null ? moonlightUser.getNickName() : "鏈堝厜");
+ approveProcess.setApproveUserCurrentId(moonlightUser != null ? moonlightUser.getUserId() : null);
+ approveProcess.setApproveUserCurrentName(moonlightUser != null ? moonlightUser.getNickName() : "鏈堝厜");
+ approveProcess.setApproveStatus(2); // 瀹℃牳瀹屾垚
+ approveProcess.setApproveType(7); // 鍙戣揣瀹℃壒
+ approveProcess.setApproveDelete(0);
+ approveProcess.setApproveTime(new Date()); // 鐢宠鏃堕棿
+ approveProcess.setTenantId(loginUser.getCurrentDeptId());
+ approveProcess.setCreateTime(LocalDateTime.now());
+ approveProcess.setEndDate(new Date());
+ approveProcessService.save(approveProcess);
+
// 鐩存帴鎵e噺搴撳瓨
stockUtils.substractStock(
salesLedgerProduct.getProductModelId(),
@@ -171,10 +249,24 @@
/**
* 鎵归噺涓�閿彂璐� - 灏嗛攢鍞彴璐︿笅鎵�鏈夋湭鍙戣揣鐨勪骇鍝佸叏閮ㄥ彂璐�
+ * 鍒涘缓瀹℃壒璁板綍锛屾壒鍑嗕汉涓�"鏈堝厜"
*/
@Override
@Transactional
public boolean batchOneClickShipping(Long salesLedgerId, ShippingInfoDto req) throws IOException {
+ LoginUser loginUser = SecurityUtils.getLoginUser();
+
+ // 鏌ヨ"鏈堝厜"鐢ㄦ埛
+ com.ruoyi.project.system.domain.SysUser moonlightUser = sysUserMapper.selectOne(
+ new LambdaQueryWrapper<com.ruoyi.project.system.domain.SysUser>()
+ .eq(com.ruoyi.project.system.domain.SysUser::getNickName, "鏈堝厜")
+ .last("limit 1")
+ );
+
+ // 鑾峰彇閿�鍞彴璐︿俊鎭�
+ SalesLedger salesLedger = salesLedgerMapper.selectById(salesLedgerId);
+ String salesContractNo = salesLedger != null ? salesLedger.getSalesContractNo() : "";
+
// 鏌ヨ璇ラ攢鍞彴璐︿笅鎵�鏈変骇鍝�
List<SalesLedgerProduct> products = salesLedgerProductMapper.selectList(
new LambdaQueryWrapper<SalesLedgerProduct>()
@@ -204,7 +296,8 @@
throw new RuntimeException("璇ラ攢鍞彴璐︿笅鎵�鏈変骇鍝佸凡鍙戣揣");
}
- // 涓烘瘡涓湭鍙戣揣鐨勪骇鍝佸垱寤哄彂璐ц褰�
+ // 鏀堕泦鎵�鏈夊彂璐у崟鍙风敤浜庡悎骞跺鎵�
+ StringBuilder allShippingNos = new StringBuilder();
for (SalesLedgerProduct product : unshippedProducts) {
// 鐢熸垚鍙戣揣鍗曞彿
String shippingNo = com.ruoyi.common.utils.OrderUtils.countTodayByCreateTime(shippingInfoMapper, "SH", "shipping_no");
@@ -223,6 +316,12 @@
boolean save = this.save(shippingInfo);
if (save) {
+ // 鏀堕泦鍙戣揣鍗曞彿
+ if (allShippingNos.length() > 0) {
+ allShippingNos.append("\n");
+ }
+ allShippingNos.append("鍙戣揣鍗曞彿:").append(shippingNo);
+
// 鎵e噺搴撳瓨
stockUtils.substractStock(
product.getProductModelId(),
@@ -233,6 +332,43 @@
}
}
+ // 鍒涘缓鍚堝苟鐨勫鎵规祦绋嬭褰�
+ if (allShippingNos.length() > 0) {
+ StringBuilder approveReason = new StringBuilder();
+ approveReason.append(allShippingNos.toString());
+ if (salesContractNo != null && !salesContractNo.isEmpty()) {
+ approveReason.append("\n閿�鍞崟鍙�:").append(salesContractNo);
+ }
+ approveReason.append("\n").append(req.getType());
+ if ("璐ц溅".equals(req.getType()) && req.getShippingCarNumber() != null && !req.getShippingCarNumber().isEmpty()) {
+ approveReason.append(":").append(req.getShippingCarNumber());
+ } else if ("蹇��".equals(req.getType()) && req.getExpressCompany() != null && !req.getExpressCompany().isEmpty()) {
+ approveReason.append(":").append(req.getExpressCompany());
+ }
+
+ ApproveProcess approveProcess = new ApproveProcess();
+ String approveId = com.ruoyi.common.utils.OrderUtils.countTodayByCreateTime(approveProcessMapper, "", "approve_id");
+ approveProcess.setApproveId(approveId);
+ approveProcess.setApproveUser(loginUser.getUserId());
+ approveProcess.setApproveUserName(loginUser.getNickName());
+ approveProcess.setApproveDeptId(loginUser.getCurrentDeptId());
+ SysDept sysDept = sysDeptMapper.selectDeptById(loginUser.getCurrentDeptId());
+ approveProcess.setApproveDeptName(sysDept.getDeptName());
+ approveProcess.setApproveReason(approveReason.toString());
+ approveProcess.setApproveUserIds(moonlightUser != null ? String.valueOf(moonlightUser.getUserId()) : "");
+ approveProcess.setApproveUserNames(moonlightUser != null ? moonlightUser.getNickName() : "鏈堝厜");
+ approveProcess.setApproveUserCurrentId(moonlightUser != null ? moonlightUser.getUserId() : null);
+ approveProcess.setApproveUserCurrentName(moonlightUser != null ? moonlightUser.getNickName() : "鏈堝厜");
+ approveProcess.setApproveStatus(2); // 瀹℃牳瀹屾垚
+ approveProcess.setApproveType(7); // 鍙戣揣瀹℃壒
+ approveProcess.setApproveDelete(0);
+ approveProcess.setApproveTime(new Date()); // 鐢宠鏃堕棿
+ approveProcess.setTenantId(loginUser.getCurrentDeptId());
+ approveProcess.setCreateTime(LocalDateTime.now());
+ approveProcess.setEndDate(new Date());
+ approveProcessService.save(approveProcess);
+ }
+
return true;
}
}
diff --git a/src/main/resources/mapper/approve/ApproveProcessMapper.xml b/src/main/resources/mapper/approve/ApproveProcessMapper.xml
index 33b29a9..070a228 100644
--- a/src/main/resources/mapper/approve/ApproveProcessMapper.xml
+++ b/src/main/resources/mapper/approve/ApproveProcessMapper.xml
@@ -28,15 +28,33 @@
approve_delete,tenant_id,approve_type,approve_remark
</sql>
<select id="listPage" resultType="com.ruoyi.approve.pojo.ApproveProcess">
- select * from approve_process where approve_delete = 0
- <if test="req.approveId != null and req.approveId != ''">
- and approve_id like concat('%',#{req.approveId},'%')
+ <if test="req.approveType != null and req.approveType == 7">
+ select ap.*,
+ SUBSTRING_INDEX(SUBSTRING_INDEX(ap.approve_reason, '閿�鍞崟鍙�:', -1), '\n', 1) as salesContractNo
+ from approve_process ap
+ where ap.approve_delete = 0
+ <if test="req.approveId != null and req.approveId != ''">
+ and ap.approve_id like concat('%',#{req.approveId},'%')
+ </if>
+ <if test="req.approveStatus != null or req.approveStatus == 0">
+ and ap.approve_status = #{req.approveStatus}
+ </if>
+ and ap.approve_type = #{req.approveType}
+ <if test="req.salesContractNo != null and req.salesContractNo != ''">
+ and ap.approve_reason like concat('%閿�鍞崟鍙�:',#{req.salesContractNo},'%')
+ </if>
</if>
- <if test="req.approveStatus != null or req.approveStatus == 0">
- and approve_status = #{req.approveStatus}
- </if>
- <if test="req.approveType != null ">
- and approve_type = #{req.approveType}
+ <if test="req.approveType == null or req.approveType != 7">
+ select * from approve_process ap where ap.approve_delete = 0
+ <if test="req.approveId != null and req.approveId != ''">
+ and ap.approve_id like concat('%',#{req.approveId},'%')
+ </if>
+ <if test="req.approveStatus != null or req.approveStatus == 0">
+ and ap.approve_status = #{req.approveStatus}
+ </if>
+ <if test="req.approveType != null ">
+ and ap.approve_type = #{req.approveType}
+ </if>
</if>
</select>
</mapper>
diff --git a/src/main/resources/mapper/sales/ShipmentApprovalMapper.xml b/src/main/resources/mapper/sales/ShipmentApprovalMapper.xml
index 68cd664..15fc598 100644
--- a/src/main/resources/mapper/sales/ShipmentApprovalMapper.xml
+++ b/src/main/resources/mapper/sales/ShipmentApprovalMapper.xml
@@ -3,14 +3,22 @@
<mapper namespace="com.ruoyi.sales.mapper.ShipmentApprovalMapper">
<select id="listPage" resultType="com.ruoyi.sales.pojo.ShipmentApproval">
- SELECT *,
+ SELECT sa.*,
si.shipping_car_number,
+ sl.sales_contract_no,
+ sl.customer_name,
+ slp.product_category,
+ slp.specification_model,
+ slp.quantity,
+ slp.unit,
+ sd.dept_name as approveDeptName,
T2.nick_name AS entry_person_name
FROM shipment_approval sa
LEFT JOIN shipping_info si ON sa.shipping_info_id = si.id
LEFT JOIN sales_ledger sl ON sa.sales_ledger_id = sl.id
LEFT JOIN sales_ledger_product slp ON sa.sales_ledger_product_id = slp.id and slp.type = 1
LEFT JOIN sys_user T2 ON sl.entry_person = T2.user_id
+ LEFT JOIN sys_dept sd ON sa.approve_dept_id = sd.dept_id
<where>
1=1
<if test="req.approveStatus != null and req.approveStatus != '' ">
@@ -20,5 +28,6 @@
AND sl.sales_contract_no LIKE CONCAT('%',#{req.salesContractNo},'%')
</if>
</where>
+ ORDER BY sa.id DESC
</select>
</mapper>
\ No newline at end of file
diff --git a/src/main/resources/mapper/stock/StockOutRecordMapper.xml b/src/main/resources/mapper/stock/StockOutRecordMapper.xml
index 9222529..4b0233d 100644
--- a/src/main/resources/mapper/stock/StockOutRecordMapper.xml
+++ b/src/main/resources/mapper/stock/StockOutRecordMapper.xml
@@ -28,7 +28,7 @@
WHEN '3' THEN ppm.product_no
WHEN '8' THEN sl.sales_contract_no
WHEN '9' THEN pr.no
- WHEN '13' THEN si.shipping_no
+ WHEN '13' THEN CONCAT(si.shipping_no, IF(sl2.sales_contract_no IS NOT NULL AND sl2.sales_contract_no != '', CONCAT(' / ', sl2.sales_contract_no), ''))
WHEN '1' THEN sor.remark
WHEN '10' THEN sor.remark
ELSE NULL
@@ -41,6 +41,7 @@
LEFT JOIN sales_ledger as sl on sor.record_type = '8' and sor.record_id = sl.id
LEFT JOIN purchase_return_orders as pr on sor.record_type = '9' and sor.record_id = pr.id
LEFT JOIN shipping_info as si on sor.record_type = '13' and sor.record_id = si.id
+ LEFT JOIN sales_ledger as sl2 on sor.record_type = '13' and si.sales_ledger_id = sl2.id
<where>
<if test="params.timeStr != null and params.timeStr != ''">
and sor.create_time like concat('%',#{params.timeStr},'%')
@@ -68,7 +69,7 @@
WHEN '3' THEN ppm.product_no
WHEN '8' THEN sl.sales_contract_no
WHEN '9' THEN pr.no
- WHEN '13' THEN si.shipping_no
+ WHEN '13' THEN CONCAT(si.shipping_no, IF(sl2.sales_contract_no IS NOT NULL AND sl2.sales_contract_no != '', CONCAT(' / ', sl2.sales_contract_no), ''))
WHEN '1' THEN sor.remark
WHEN '10' THEN sor.remark
ELSE NULL
@@ -81,6 +82,7 @@
LEFT JOIN sales_ledger as sl on sor.record_type = '8' and sor.record_id = sl.id
LEFT JOIN purchase_return_orders as pr on sor.record_type = '9' and sor.record_id = pr.id
LEFT JOIN shipping_info as si on sor.record_type = '13' and sor.record_id = si.id
+ LEFT JOIN sales_ledger as sl2 on sor.record_type = '13' and si.sales_ledger_id = sl2.id
<where>
<if test="params.timeStr != null and params.timeStr != ''">
and sor.create_time like concat('%',#{params.timeStr},'%')
--
Gitblit v1.9.3