From dee56ed8d52f1d8ee1f89b369561c49e9b3b7c2d Mon Sep 17 00:00:00 2001
From: liyong <18434998025@163.com>
Date: 星期五, 23 一月 2026 17:56:31 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/dev_New' into dev_New

---
 src/main/java/com/ruoyi/approve/service/impl/ApproveNodeServiceImpl.java |   25 ++++++
 src/main/resources/mapper/sales/SalesLedgerProductMapper.xml             |    2 
 src/main/java/com/ruoyi/sales/pojo/SalesLedgerProduct.java               |   10 +-
 src/main/java/com/ruoyi/common/enums/FileNameType.java                   |    7 +
 src/main/java/com/ruoyi/sales/service/impl/CommonFileServiceImpl.java    |   11 ++
 src/main/java/com/ruoyi/sales/dto/ShippingInfoDto.java                   |   32 ++++++++
 src/main/resources/mapper/sales/ShippingInfoMapper.xml                   |    5 +
 src/main/java/com/ruoyi/sales/controller/ShippingInfoController.java     |  105 ++++++++++++++++----------
 src/main/java/com/ruoyi/sales/pojo/ShippingInfo.java                     |   39 +++++++--
 9 files changed, 177 insertions(+), 59 deletions(-)

diff --git a/src/main/java/com/ruoyi/approve/service/impl/ApproveNodeServiceImpl.java b/src/main/java/com/ruoyi/approve/service/impl/ApproveNodeServiceImpl.java
index 9680b64..ddc3718 100644
--- a/src/main/java/com/ruoyi/approve/service/impl/ApproveNodeServiceImpl.java
+++ b/src/main/java/com/ruoyi/approve/service/impl/ApproveNodeServiceImpl.java
@@ -22,8 +22,10 @@
 import com.ruoyi.sales.mapper.CommonFileMapper;
 import com.ruoyi.sales.mapper.SalesQuotationMapper;
 import com.ruoyi.sales.mapper.SalesQuotationProductMapper;
+import com.ruoyi.sales.mapper.ShippingInfoMapper;
 import com.ruoyi.sales.pojo.CommonFile;
 import com.ruoyi.sales.pojo.SalesQuotation;
+import com.ruoyi.sales.pojo.ShippingInfo;
 import com.ruoyi.sales.service.impl.CommonFileServiceImpl;
 import lombok.RequiredArgsConstructor;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -60,6 +62,9 @@
 
     @Autowired
     private SalesQuotationMapper salesQuotationMapper;
+
+    @Autowired
+    private ShippingInfoMapper shippingInfoMapper;
 
 
 
@@ -176,9 +181,27 @@
             }else if(status.equals(1) && salesQuote != null){
                 salesQuote.setStatus("瀹℃牳涓�");
             }
-
             salesQuotationMapper.updateById(salesQuote);
         }
+        // 鍑哄簱瀹℃壒淇敼
+        if(approveProcess.getApproveType().equals(7)){
+            String[] split = approveProcess.getApproveReason().split(":");
+            ShippingInfo shippingInfo = shippingInfoMapper.selectOne(new LambdaQueryWrapper<ShippingInfo>()
+                    .eq(ShippingInfo::getShippingNo, split[1])
+                    .orderByDesc(ShippingInfo::getCreateTime)
+                    .last("limit 1"));
+            if(shippingInfo != null){
+                if(status.equals(2)){
+                    shippingInfo.setStatus("瀹℃牳閫氳繃");
+                }else if(status.equals(3)){
+                    shippingInfo.setType("瀹℃牳鎷掔粷");
+                }else if(status.equals(1)){
+                    shippingInfo.setStatus("瀹℃牳涓�");
+                }
+                shippingInfoMapper.updateById(shippingInfo);
+            }
+
+        }
         // 缁戝畾闄勪欢
         if(!CollectionUtils.isEmpty(approveNode.getTempFileIds()) && approveNode.getApproveNodeStatus() == 1){
             tempFileService.migrateTempFilesToFormal(approveNode.getId(), approveNode.getTempFileIds(), FileNameType.ApproveNode.getValue());
diff --git a/src/main/java/com/ruoyi/common/enums/FileNameType.java b/src/main/java/com/ruoyi/common/enums/FileNameType.java
index 16d51f6..7afc045 100644
--- a/src/main/java/com/ruoyi/common/enums/FileNameType.java
+++ b/src/main/java/com/ruoyi/common/enums/FileNameType.java
@@ -1,6 +1,5 @@
 package com.ruoyi.common.enums;
 
-import com.ruoyi.approve.pojo.ApproveProcess;
 
 public enum FileNameType {
 
@@ -11,7 +10,11 @@
     MEASURING(5),  //璁¢噺鍣ㄥ叿鍙拌处
     MEASURINGRecord(6),//璁¢噺鍣ㄥ叿鍙拌处璁板綍
     ApproveNode(7),  //鍗忓悓瀹℃壒鑺傜偣瀹℃牳
-    ApproveProcess(8);  //鍗忓悓瀹℃壒涓绘暟鎹�
+    ApproveProcess(8),//鍗忓悓瀹℃壒涓绘暟鎹�
+    SHIP(9),//鍙戣揣鍙拌处
+    INSPECTION_PRODUCTION_BEFORE(10),
+    INSPECTION_PRODUCTION_AFTER(11),
+    INSPECTION(12);//宸℃ 鐢熶骇鍓�
 
     private final int value;
 
diff --git a/src/main/java/com/ruoyi/sales/controller/ShippingInfoController.java b/src/main/java/com/ruoyi/sales/controller/ShippingInfoController.java
index c498b93..1c657e9 100644
--- a/src/main/java/com/ruoyi/sales/controller/ShippingInfoController.java
+++ b/src/main/java/com/ruoyi/sales/controller/ShippingInfoController.java
@@ -3,11 +3,20 @@
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.approve.mapper.ApproveProcessMapper;
+import com.ruoyi.approve.service.impl.ApproveProcessServiceImpl;
+import com.ruoyi.approve.vo.ApproveProcessVO;
+import com.ruoyi.common.enums.FileNameType;
+import com.ruoyi.common.utils.OrderUtils;
+import com.ruoyi.common.utils.SecurityUtils;
 import com.ruoyi.common.utils.poi.ExcelUtil;
 import com.ruoyi.framework.aspectj.lang.annotation.Log;
 import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
+import com.ruoyi.framework.security.LoginUser;
 import com.ruoyi.framework.web.controller.BaseController;
 import com.ruoyi.framework.web.domain.AjaxResult;
+import com.ruoyi.other.service.impl.TempFileServiceImpl;
+import com.ruoyi.sales.dto.ShippingInfoDto;
 import com.ruoyi.sales.mapper.ShipmentApprovalMapper;
 import com.ruoyi.sales.mapper.ShippingInfoMapper;
 import com.ruoyi.sales.pojo.SalesLedger;
@@ -17,6 +26,7 @@
 import com.ruoyi.sales.service.ISalesLedgerProductService;
 import com.ruoyi.sales.service.ISalesLedgerService;
 import com.ruoyi.sales.service.ShippingInfoService;
+import com.ruoyi.sales.service.impl.CommonFileServiceImpl;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.apache.commons.collections4.CollectionUtils;
@@ -25,6 +35,8 @@
 import org.springframework.web.bind.annotation.*;
 
 import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.time.LocalDate;
 import java.util.List;
 
 /**
@@ -43,6 +55,15 @@
     @Autowired
     private ISalesLedgerProductService salesLedgerProductService;
 
+    @Autowired
+    private TempFileServiceImpl tempFileService;
+
+    @Autowired
+    private CommonFileServiceImpl commonFileService;
+
+    @Autowired
+    private ApproveProcessServiceImpl approveProcessService;
+
 
     @GetMapping("/listPage")
     @ApiOperation("鍙戣揣淇℃伅鍒楄〃")
@@ -54,45 +75,54 @@
     @PostMapping("/add")
     @ApiOperation("娣诲姞鍙戣揣淇℃伅")
     @Transactional(rollbackFor = Exception.class)
-    public AjaxResult add(@RequestBody ShippingInfo req) {
-        LambdaQueryWrapper<ShippingInfo> wrapper = new LambdaQueryWrapper<>();
-        wrapper.eq(ShippingInfo::getSalesLedgerId, req.getSalesLedgerId());
-        wrapper.eq(ShippingInfo::getSalesLedgerProductId, req.getSalesLedgerProductId());
-        List<ShippingInfo> list = shippingInfoService.list(wrapper);
-        if(!CollectionUtils.isEmpty(list)){
-            return AjaxResult.error("鍙戣揣淇℃伅宸插瓨鍦�");
-        }
+    @Log(title = "鍙戣揣淇℃伅绠$悊", businessType = BusinessType.INSERT)
+    public AjaxResult add(@RequestBody ShippingInfoDto req) throws Exception {
+        LoginUser loginUser = SecurityUtils.getLoginUser();
+        String sh = OrderUtils.countTodayByCreateTime(shippingInfoMapper, "SH");
+        // 鍙戣揣瀹℃壒
+        ApproveProcessVO approveProcessVO = new ApproveProcessVO();
+        approveProcessVO.setApproveType(7);
+        approveProcessVO.setApproveDeptId(loginUser.getTenantId());
+        approveProcessVO.setApproveReason(req.getType() + ":" +sh);
+        approveProcessVO.setApproveUserIds(req.getApproveUserIds());
+        approveProcessVO.setApproveUser(loginUser.getUserId());
+        approveProcessVO.setApproveTime(LocalDate.now().toString());
+        approveProcessService.addApprove(approveProcessVO);
+        // 娣诲姞鍙戣揣娑堟伅
+        req.setShippingNo(sh);
+        req.setStatus("寰呭鏍�");
         boolean save = shippingInfoService.save(req);
-        if(save){
-            ShippingInfo shippingInfo = shippingInfoService.getOne(wrapper);
-            ShipmentApproval shipmentApproval = new ShipmentApproval();
-            shipmentApproval.setSalesLedgerId(req.getSalesLedgerId());
-            shipmentApproval.setSalesLedgerProductId(req.getSalesLedgerProductId());
-            shipmentApproval.setApproveUserId(req.getApproverId());
-            shipmentApproval.setApproveStatus(2);
-            shipmentApproval.setShippingInfoId(shippingInfo.getId());
-            shipmentApprovalMapper.insert(shipmentApproval);
-
-            SalesLedgerProduct salesLedgerProduct = salesLedgerProductService.getById(req.getSalesLedgerProductId());
-            if(salesLedgerProduct != null){
-                salesLedgerProduct.setApproveStatus(2);
-                salesLedgerProductService.updateById(salesLedgerProduct);
-            }
-
-        }
         return save ? AjaxResult.success() : AjaxResult.error();
     }
 
-    @PostMapping("/update")
-    @ApiOperation("淇敼鍙戣揣淇℃伅")
-    public AjaxResult update(@RequestBody ShippingInfo req) {
+    @ApiOperation("鍙戣揣鎵e簱瀛�")
+    @PostMapping("/deductStock")
+    @Transactional(rollbackFor = Exception.class)
+    @Log(title = "鍙戣揣淇℃伅绠$悊", businessType = BusinessType.UPDATE)
+    public AjaxResult deductStock(@RequestBody ShippingInfoDto req) throws IOException {
         ShippingInfo byId = shippingInfoService.getById(req.getId());
         if (byId == null) {
             return AjaxResult.error("鍙戣揣淇℃伅涓嶅瓨鍦�");
         }
-        Long userId = getLoginUser().getUserId();
-        if(!userId.equals(Long.parseLong(byId.getCreateUser().toString()))){
-            return AjaxResult.error("鎮ㄦ病鏈夋潈闄愪慨鏀规鍙戣揣淇℃伅");
+        byId.setExpressNumber(req.getExpressNumber());
+        byId.setExpressCompany(req.getExpressCompany());
+        byId.setShippingCarNumber(req.getShippingCarNumber());
+        boolean update = shippingInfoService.updateById(req);
+        // 杩佺Щ鏂囦欢
+        if(CollectionUtils.isNotEmpty(req.getTempFileIds())){
+            tempFileService.migrateTempFilesToFormal(req.getId(), req.getTempFileIds(), FileNameType.SHIP.getValue());
+        }
+        return update ? AjaxResult.success() : AjaxResult.error();
+    }
+
+    @PostMapping("/update")
+    @ApiOperation("淇敼鍙戣揣淇℃伅")
+    @Transactional(rollbackFor = Exception.class)
+    @Log(title = "鍙戣揣淇℃伅绠$悊", businessType = BusinessType.UPDATE)
+    public AjaxResult update(@RequestBody ShippingInfo req) {
+        ShippingInfo byId = shippingInfoService.getById(req.getId());
+        if (byId == null) {
+            return AjaxResult.error("鍙戣揣淇℃伅涓嶅瓨鍦�");
         }
         boolean update = shippingInfoService.updateById(req);
         return update ? AjaxResult.success() : AjaxResult.error();
@@ -100,17 +130,10 @@
 
     @DeleteMapping("/delete")
     @ApiOperation("鍒犻櫎鍙戣揣淇℃伅")
+    @Transactional(rollbackFor = Exception.class)
+    @Log(title = "鍙戣揣淇℃伅绠$悊", businessType = BusinessType.DELETE)
     public AjaxResult delete(@RequestBody List<Long> ids) {
-        Long userId = getLoginUser().getUserId();
-        ids.forEach(id -> {
-            ShippingInfo byId = shippingInfoService.getById(id);
-            if (byId == null) {
-                throw new RuntimeException("鍙戣揣淇℃伅涓嶅瓨鍦�");
-            }
-            if(!userId.equals(Long.parseLong(byId.getCreateUser().toString()))){
-                throw new RuntimeException("鎮ㄦ病鏈夋潈闄愬垹闄ゆ鍙戣揣淇℃伅");
-            }
-        });
+        commonFileService.deleteByBusinessIds(ids, FileNameType.SHIP.getValue());
         boolean delete = shippingInfoService.removeBatchByIds(ids);
         return delete ? AjaxResult.success("鍒犻櫎鎴愬姛") : AjaxResult.error("鍒犻櫎澶辫触");
     }
diff --git a/src/main/java/com/ruoyi/sales/dto/ShippingInfoDto.java b/src/main/java/com/ruoyi/sales/dto/ShippingInfoDto.java
new file mode 100644
index 0000000..3561c18
--- /dev/null
+++ b/src/main/java/com/ruoyi/sales/dto/ShippingInfoDto.java
@@ -0,0 +1,32 @@
+package com.ruoyi.sales.dto;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.ruoyi.framework.aspectj.lang.annotation.Excel;
+import com.ruoyi.sales.pojo.CommonFile;
+import com.ruoyi.sales.pojo.ShippingInfo;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * @author :yys
+ * @date : 2026/1/23 16:35
+ */
+@Data
+public class ShippingInfoDto extends ShippingInfo {
+
+    /**
+     * 瀹℃壒浜篿d鍒楄〃
+     */
+    // 瀹℃壒浜�
+    private String approveUserIds;
+
+    private String type; // 鍙戣揣绫诲瀷
+
+    @TableField(exist = false)
+    private List<String> tempFileIds;
+    @TableField(exist = false)
+    private List<CommonFile> commonFileList;
+
+}
diff --git a/src/main/java/com/ruoyi/sales/pojo/SalesLedgerProduct.java b/src/main/java/com/ruoyi/sales/pojo/SalesLedgerProduct.java
index 6111d1d..3966071 100644
--- a/src/main/java/com/ruoyi/sales/pojo/SalesLedgerProduct.java
+++ b/src/main/java/com/ruoyi/sales/pojo/SalesLedgerProduct.java
@@ -200,14 +200,14 @@
     @JsonFormat(pattern = "yyyy-MM-dd")
     private Date shippingDate;
 
-//    @TableField(exist = false)
-//    @ApiModelProperty(value = "鐢熶骇鐘舵��")
-//    private String productionStatus = "鏈紑濮�";
+    @TableField(exist = false)
+    @ApiModelProperty(value = "鍙戣揣鐘舵��")
+    private String shippingStatus;
     /**
-     * 鍙戣揣瀹℃壒鐘舵��
+     * 浜у搧鐘舵��
      */
 //    @TableField(exist = false)
-    @ApiModelProperty(value = "瀹℃壒鐘舵�侊細0鍙戣揣寰呯敵璇�,1鍙戣揣鍙敵璇�,2鍙戣揣瀹℃壒涓�(寰呭鎵�),3鍙戣揣瀹℃壒閫氳繃锛�4鍙戣揣瀹℃壒閫�鍥�")
+    @ApiModelProperty(value = "浜у搧鐘舵�侊細1-鍏呰冻")
     private Integer approveStatus;
 
     @ApiModelProperty(value = "寰呭洖娆炬�婚噾棰�")
diff --git a/src/main/java/com/ruoyi/sales/pojo/ShippingInfo.java b/src/main/java/com/ruoyi/sales/pojo/ShippingInfo.java
index fce7148..3385739 100644
--- a/src/main/java/com/ruoyi/sales/pojo/ShippingInfo.java
+++ b/src/main/java/com/ruoyi/sales/pojo/ShippingInfo.java
@@ -18,13 +18,6 @@
 @TableName("shipping_info")
 public class ShippingInfo {
 
-    @TableId(value = "id", type = IdType.AUTO)
-    private Long id;
-
-    @ApiModelProperty(value = "閿�鍞彴璐d")
-    private Long salesLedgerId;
-    @ApiModelProperty(value = "閿�鍞姤浠蜂骇鍝佽〃id")
-    private Long salesLedgerProductId;
     @TableField(exist = false)
     @ApiModelProperty(value = "閿�鍞悎鍚屽彿")
     @Excel(name = "閿�鍞悎鍚屽彿")
@@ -35,11 +28,40 @@
     @Excel(name = "瀹㈡埛鍚嶇О")
     private String customerName;
 
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    @ApiModelProperty(value = "閿�鍞彴璐d")
+    private Long salesLedgerId;
+
+    @ApiModelProperty(value = "閿�鍞姤浠蜂骇鍝佽〃id")
+    private Long salesLedgerProductId;
+
+    @ApiModelProperty(value = "鐘舵��")
+    @Excel(name = "鐘舵��")
+    private String status;
+
     @ApiModelProperty(value = "鍙戣揣鏃ユ湡")
     @JsonFormat(pattern = "yyyy-MM-dd")
     @DateTimeFormat(pattern = "yyyy-MM-dd")
     @Excel(name = "鍙戣揣鏃ユ湡", width = 30, dateFormat = "yyyy-MM-dd")
     private Date shippingDate;
+
+    @ApiModelProperty(value = "鍙戣揣缂栧彿")
+    @Excel(name = "鍙戣揣缂栧彿")
+    private String shippingNo;
+
+    @ApiModelProperty(value = "蹇�掑崟鍙�")
+    @Excel(name = "蹇�掑崟鍙�")
+    private String expressNumber;
+
+    @ApiModelProperty(value = "蹇�掑叕鍙�")
+    @Excel(name = "蹇�掑叕鍙�")
+    private String expressCompany;
+
+    @ApiModelProperty(value = "鍙戣揣绫诲瀷")
+    @Excel(name = "鍙戣揣绫诲瀷")
+    private String type;
 
     @ApiModelProperty(value = "鍙戣揣杞︾墝鍙�")
     @Excel(name = "鍙戣揣杞︾墝鍙�")
@@ -65,8 +87,5 @@
     @ApiModelProperty(value = "绉熸埛ID")
     @TableField(fill = FieldFill.INSERT)
     private Long tenantId;
-    @ApiModelProperty(value = "瀹℃壒浜篿d")
-    @TableField(exist = false)
-    private Integer approverId;
 
 }
diff --git a/src/main/java/com/ruoyi/sales/service/impl/CommonFileServiceImpl.java b/src/main/java/com/ruoyi/sales/service/impl/CommonFileServiceImpl.java
index 06bd40e..88b8e22 100644
--- a/src/main/java/com/ruoyi/sales/service/impl/CommonFileServiceImpl.java
+++ b/src/main/java/com/ruoyi/sales/service/impl/CommonFileServiceImpl.java
@@ -1,5 +1,6 @@
 package com.ruoyi.sales.service.impl;
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.ruoyi.other.mapper.TempFileMapper;
@@ -39,6 +40,16 @@
     @Value("${file.upload-dir}")
     private String uploadDir;
 
+    public void deleteByBusinessId(Long businessId,Integer type) {
+        commonFileMapper.delete(new LambdaQueryWrapper<CommonFile>().eq(CommonFile::getCommonId, businessId)
+                .eq(CommonFile::getType, type));
+    }
+
+    public void deleteByBusinessIds(List<Long> businessId,Integer type) {
+        commonFileMapper.delete(new LambdaQueryWrapper<CommonFile>().in(CommonFile::getCommonId, businessId)
+                .eq(CommonFile::getType, type));
+    }
+
 
     @Override
     public int deleteSalesLedgerByIds(Long[] ids) {
diff --git a/src/main/resources/mapper/sales/SalesLedgerProductMapper.xml b/src/main/resources/mapper/sales/SalesLedgerProductMapper.xml
index f74c3fa..e27d27e 100644
--- a/src/main/resources/mapper/sales/SalesLedgerProductMapper.xml
+++ b/src/main/resources/mapper/sales/SalesLedgerProductMapper.xml
@@ -9,6 +9,8 @@
         T1.*,
         t3.shipping_car_number,
         t3.shipping_date,
+        t3.status as shippingStatus
+        t3.shipping_date,
         CASE
         WHEN t2.qualitity > T1.quantity THEN 1
         ELSE 0
diff --git a/src/main/resources/mapper/sales/ShippingInfoMapper.xml b/src/main/resources/mapper/sales/ShippingInfoMapper.xml
index efe93cf..9f7ce19 100644
--- a/src/main/resources/mapper/sales/ShippingInfoMapper.xml
+++ b/src/main/resources/mapper/sales/ShippingInfoMapper.xml
@@ -8,6 +8,11 @@
         s.sales_ledger_id,
         s.shipping_date,
         s.shipping_car_number,
+        s.express_number,
+        s.express_company,
+        s.shipping_no,
+        s.type,
+        s.status,
         s.create_time,
         s.update_time,
         s.create_user,

--
Gitblit v1.9.3