Browse Source

库存基本调整完成

Huanyi 4 hours ago
parent
commit
43d8fdd039
24 changed files with 565 additions and 142 deletions
  1. 71 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysGoodsStockController.java
  2. 38 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysGoodsStock.java
  3. 26 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/query/SysGoodsStockQuery.java
  4. 32 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysGoodsStockSummaryVo.java
  5. 28 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysGoodsStockVo.java
  6. 22 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysGoodsStockMapper.java
  7. 32 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysGoodsStockService.java
  8. 57 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysGoodsStockServiceImpl.java
  9. 47 0
      ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysGoodsStockMapper.xml
  10. 9 0
      ruoyi-modules/yingpaipay-erp/src/main/java/org/dromara/erp/controller/GoodsStockController.java
  11. 6 0
      ruoyi-modules/yingpaipay-erp/src/main/java/org/dromara/erp/domain/ErpSaleOrderMaster.java
  12. 7 1
      ruoyi-modules/yingpaipay-erp/src/main/java/org/dromara/erp/domain/query/ErpOrderQuery.java
  13. 2 0
      ruoyi-modules/yingpaipay-erp/src/main/java/org/dromara/erp/domain/query/GoodsStockQuery.java
  14. 14 0
      ruoyi-modules/yingpaipay-erp/src/main/java/org/dromara/erp/domain/vo/ErpOrderDetailVo.java
  15. 1 19
      ruoyi-modules/yingpaipay-erp/src/main/java/org/dromara/erp/domain/vo/ErpOrderVo.java
  16. 5 0
      ruoyi-modules/yingpaipay-erp/src/main/java/org/dromara/erp/domain/vo/ErpSaleOrderMasterVo.java
  17. 32 0
      ruoyi-modules/yingpaipay-erp/src/main/java/org/dromara/erp/domain/vo/GoodsStockSummaryVo.java
  18. 9 0
      ruoyi-modules/yingpaipay-erp/src/main/java/org/dromara/erp/mapper/GoodsStockMapper.java
  19. 6 0
      ruoyi-modules/yingpaipay-erp/src/main/java/org/dromara/erp/service/IGoodsStockService.java
  20. 44 0
      ruoyi-modules/yingpaipay-erp/src/main/java/org/dromara/erp/service/impl/ErpOrderServiceImpl.java
  21. 8 0
      ruoyi-modules/yingpaipay-erp/src/main/java/org/dromara/erp/service/impl/GoodsStockServiceImpl.java
  22. 45 122
      ruoyi-modules/yingpaipay-erp/src/main/resources/mapper/ErpOrderMapper.xml
  23. 24 0
      ruoyi-modules/yingpaipay-erp/src/main/resources/mapper/GoodsStockMapper.xml
  24. BIN
      script/sql/sqlserver/HS_ERP_Order.dbo.T_Goods_Stock.sql

+ 71 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysGoodsStockController.java

@@ -0,0 +1,71 @@
+package org.dromara.system.controller.system;
+
+import cn.hutool.core.util.StrUtil;
+import lombok.RequiredArgsConstructor;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.satoken.utils.LoginHelper;
+import org.dromara.system.domain.query.SysGoodsStockQuery;
+import org.dromara.system.domain.vo.SysEmployeeVo;
+import org.dromara.system.domain.vo.SysGoodsStockSummaryVo;
+import org.dromara.system.service.ISysEmployeeService;
+import org.dromara.system.service.ISysGoodsStockService;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * 成品库存控制器
+ *
+ * @Author: Antigravity
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/system/goodsStock")
+public class SysGoodsStockController {
+
+    private final ISysGoodsStockService goodsStockService;
+    private final ISysEmployeeService employeeService;
+
+    /**
+     * 分页查询成品库存列表(按型号+客户名称分组汇总)
+     */
+    @GetMapping("/page")
+    public TableDataInfo<SysGoodsStockSummaryVo> page(SysGoodsStockQuery query, PageQuery pageQuery) {
+        return goodsStockService.querySummaryPage(query, pageQuery);
+    }
+
+    /**
+     * 汇总分页查询:按型号+客户名称分组,SUM(重量)、SUM(支数)
+     * <p>
+     * 客户过滤逻辑:
+     * - 前端传了 clientId → 精确匹配 = ;
+     * - 前端没传 → 取当前员工的 auth_client_frowids 做 IN 约束。
+     */
+    @GetMapping("/summary/page")
+    public TableDataInfo<SysGoodsStockSummaryVo> summaryPage(SysGoodsStockQuery query, PageQuery pageQuery) {
+        // 前端未传 clientId,则注入当前员工的授权客户列表
+        if (StrUtil.isBlank(query.getClientId())) {
+            Long employeeId = LoginHelper.getUserId();
+            SysEmployeeVo employee = employeeService.queryDetail(employeeId);
+            if (employee != null && StrUtil.isNotBlank(employee.getAuthClientFRowIDs())) {
+                List<String> authIds = Arrays.stream(employee.getAuthClientFRowIDs().split(","))
+                    .map(String::trim)
+                    .filter(StrUtil::isNotBlank)
+                    .collect(Collectors.toList());
+                query.setAuthClientIds(authIds);
+            } else {
+                // 无授权客户时返回空结果
+                query.setAuthClientIds(Collections.emptyList());
+            }
+        }
+        return goodsStockService.querySummaryPage(query, pageQuery);
+    }
+}

+ 38 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysGoodsStock.java

@@ -0,0 +1,38 @@
+package org.dromara.system.domain;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+/**
+ * 成品库存表 T_Goods_Stock(无主键,saleCode 仅作逻辑标识)
+ *
+ * @Author: Antigravity
+ */
+@Data
+@TableName("T_Goods_Stock")
+public class SysGoodsStock implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    @TableId("SaleCode")
+    private String saleCode;
+
+    @TableField("ClientName")
+    private String clientName;
+
+    @TableField("ClientID")
+    private String clientId;
+
+    @TableField("WT")
+    private BigDecimal wt;
+
+    @TableField("Qty")
+    private Integer qty;
+}

+ 26 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/query/SysGoodsStockQuery.java

@@ -0,0 +1,26 @@
+package org.dromara.system.domain.query;
+
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * 成品库存查询对象
+ *
+ * @Author: Antigravity
+ */
+@Data
+public class SysGoodsStockQuery {
+
+    /** 型号(SaleCode) */
+    private String saleCode;
+
+    /** 客户名称 */
+    private String clientName;
+
+    /** 客户ID(前端传参时精确匹配) */
+    private String clientId;
+
+    /** 授权客户ID列表(服务端注入,前端不传则使用当前员工的 auth_client_frowids 做 IN 约束) */
+    private List<String> authClientIds;
+}

+ 32 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysGoodsStockSummaryVo.java

@@ -0,0 +1,32 @@
+package org.dromara.system.domain.vo;
+
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+/**
+ * 成品库存汇总视图 VO
+ * 按 型号 + 客户名称 分组,汇总重量和支数
+ *
+ * @Author: Antigravity
+ */
+@Data
+public class SysGoodsStockSummaryVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /** 型号 */
+    private String saleCode;
+
+    /** 客户名称 */
+    private String clientName;
+
+    /** 汇总重量 */
+    private BigDecimal sumWt;
+
+    /** 汇总支数 */
+    private Integer sumQty;
+}

+ 28 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysGoodsStockVo.java

@@ -0,0 +1,28 @@
+package org.dromara.system.domain.vo;
+
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import org.dromara.system.domain.SysGoodsStock;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+/**
+ * 成品库存视图 VO
+ *
+ * @Author: Antigravity
+ */
+@Data
+@AutoMapper(target = SysGoodsStock.class)
+public class SysGoodsStockVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    private String saleCode;
+    private String clientName;
+    private String clientId;
+    private BigDecimal wt;
+    private Integer qty;
+}

+ 22 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysGoodsStockMapper.java

@@ -0,0 +1,22 @@
+package org.dromara.system.mapper;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import org.apache.ibatis.annotations.Param;
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+import org.dromara.system.domain.SysGoodsStock;
+import org.dromara.system.domain.query.SysGoodsStockQuery;
+import org.dromara.system.domain.vo.SysGoodsStockSummaryVo;
+import org.dromara.system.domain.vo.SysGoodsStockVo;
+
+/**
+ * 成品库存 Mapper
+ *
+ * @Author: Antigravity
+ */
+public interface SysGoodsStockMapper extends BaseMapperPlus<SysGoodsStock, SysGoodsStockVo> {
+
+    /**
+     * 按型号+客户名称汇总查询(SUM重量、SUM支数)
+     */
+    Page<SysGoodsStockSummaryVo> selectSummaryPage(@Param("page") Page<SysGoodsStockSummaryVo> page, @Param("query") SysGoodsStockQuery query);
+}

+ 32 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysGoodsStockService.java

@@ -0,0 +1,32 @@
+package org.dromara.system.service;
+
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.system.domain.query.SysGoodsStockQuery;
+import org.dromara.system.domain.vo.SysGoodsStockSummaryVo;
+import org.dromara.system.domain.vo.SysGoodsStockVo;
+
+import java.util.List;
+
+/**
+ * 成品库存 Service 接口
+ *
+ * @Author: Antigravity
+ */
+public interface ISysGoodsStockService {
+
+    /**
+     * 分页查询成品库存列表
+     */
+    TableDataInfo<SysGoodsStockVo> queryPageList(SysGoodsStockQuery query, PageQuery pageQuery);
+
+    /**
+     * 查询成品库存列表(不分页)
+     */
+    List<SysGoodsStockVo> queryList(SysGoodsStockQuery query);
+
+    /**
+     * 按型号+客户汇总分页查询
+     */
+    TableDataInfo<SysGoodsStockSummaryVo> querySummaryPage(SysGoodsStockQuery query, PageQuery pageQuery);
+}

+ 57 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysGoodsStockServiceImpl.java

@@ -0,0 +1,57 @@
+package org.dromara.system.service.impl;
+
+import cn.hutool.core.util.ObjectUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import lombok.RequiredArgsConstructor;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.system.domain.SysGoodsStock;
+import org.dromara.system.domain.query.SysGoodsStockQuery;
+import org.dromara.system.domain.vo.SysGoodsStockSummaryVo;
+import org.dromara.system.domain.vo.SysGoodsStockVo;
+import org.dromara.system.mapper.SysGoodsStockMapper;
+import org.dromara.system.service.ISysGoodsStockService;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * 成品库存 Service 实现
+ *
+ * @Author: Antigravity
+ */
+@RequiredArgsConstructor
+@Service
+public class SysGoodsStockServiceImpl implements ISysGoodsStockService {
+
+    private final SysGoodsStockMapper baseMapper;
+
+    @Override
+    public TableDataInfo<SysGoodsStockVo> queryPageList(SysGoodsStockQuery query, PageQuery pageQuery) {
+        LambdaQueryWrapper<SysGoodsStock> lqw = buildQueryWrapper(query);
+        Page<SysGoodsStockVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
+        return TableDataInfo.build(result);
+    }
+
+    @Override
+    public List<SysGoodsStockVo> queryList(SysGoodsStockQuery query) {
+        LambdaQueryWrapper<SysGoodsStock> lqw = buildQueryWrapper(query);
+        return baseMapper.selectVoList(lqw);
+    }
+
+    @Override
+    public TableDataInfo<SysGoodsStockSummaryVo> querySummaryPage(SysGoodsStockQuery query, PageQuery pageQuery) {
+        Page<SysGoodsStockSummaryVo> result = baseMapper.selectSummaryPage(pageQuery.build(), query);
+        return TableDataInfo.build(result);
+    }
+
+    private LambdaQueryWrapper<SysGoodsStock> buildQueryWrapper(SysGoodsStockQuery query) {
+        LambdaQueryWrapper<SysGoodsStock> lqw = Wrappers.lambdaQuery();
+        lqw.like(ObjectUtil.isNotEmpty(query.getSaleCode()), SysGoodsStock::getSaleCode, query.getSaleCode());
+        lqw.like(ObjectUtil.isNotEmpty(query.getClientName()), SysGoodsStock::getClientName, query.getClientName());
+        lqw.eq(ObjectUtil.isNotEmpty(query.getClientId()), SysGoodsStock::getClientId, query.getClientId());
+        return lqw;
+    }
+}

+ 47 - 0
ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysGoodsStockMapper.xml

@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.dromara.system.mapper.SysGoodsStockMapper">
+
+    <!-- 汇总分组查询(SUM重量、SUM支数)
+         - 有 clientId(锁定单个客户):GROUP BY ClientName, SaleCode
+         - 无 clientId:GROUP BY ClientName(纯客户维度聚合) -->
+    <select id="selectSummaryPage" resultType="org.dromara.system.domain.vo.SysGoodsStockSummaryVo">
+        SELECT 
+        <choose>
+            <when test="query.clientId != null and query.clientId != ''">
+                SaleCode as saleCode,
+            </when>
+            <otherwise>
+                '' as saleCode,
+            </otherwise>
+        </choose>
+            ClientName as clientName,
+            SUM(WT) as sumWt,
+            SUM(Qty) as sumQty
+        FROM T_Goods_Stock
+        <where>
+            <choose>
+                <when test="query.clientId != null and query.clientId != ''">
+                    AND ClientID = #{query.clientId}
+                </when>
+                <when test="query.authClientIds != null and query.authClientIds.size() > 0">
+                    AND ClientID IN
+                    <foreach collection="query.authClientIds" item="id" open="(" separator="," close=")">
+                        #{id}
+                    </foreach>
+                </when>
+            </choose>
+        </where>
+        GROUP BY ClientName
+        <if test="query.clientId != null and query.clientId != ''">
+            , SaleCode
+        </if>
+        ORDER BY ClientName
+        <if test="query.clientId != null and query.clientId != ''">
+            , SaleCode
+        </if>
+    </select>
+
+</mapper>

+ 9 - 0
ruoyi-modules/yingpaipay-erp/src/main/java/org/dromara/erp/controller/GoodsStockController.java

@@ -5,6 +5,7 @@ import org.dromara.common.core.domain.R;
 import org.dromara.common.mybatis.core.page.PageQuery;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
 import org.dromara.erp.domain.query.GoodsStockQuery;
+import org.dromara.erp.domain.vo.GoodsStockSummaryVo;
 import org.dromara.erp.domain.vo.GoodsStockVo;
 import org.dromara.erp.service.IGoodsStockService;
 import org.springframework.validation.annotation.Validated;
@@ -42,4 +43,12 @@ public class GoodsStockController {
     public R<List<GoodsStockVo>> list(GoodsStockQuery query) {
         return R.ok(goodsStockService.queryList(query));
     }
+
+    /**
+     * 汇总分页查询:按型号+客户名称分组,SUM(重量)、SUM(支数)
+     */
+    @GetMapping("/summary/page")
+    public TableDataInfo<GoodsStockSummaryVo> summaryPage(GoodsStockQuery query, PageQuery pageQuery) {
+        return goodsStockService.querySummaryPage(query, pageQuery);
+    }
 }

+ 6 - 0
ruoyi-modules/yingpaipay-erp/src/main/java/org/dromara/erp/domain/ErpSaleOrderMaster.java

@@ -190,4 +190,10 @@ public class ErpSaleOrderMaster implements Serializable {
     @TableField("AluVariety")
     private String aluVariety;
 
+    /**
+     * 订单结束标志 (1-已结束)
+     */
+    @TableField("Ended")
+    private Integer ended;
+
 }

+ 7 - 1
ruoyi-modules/yingpaipay-erp/src/main/java/org/dromara/erp/domain/query/ErpOrderQuery.java

@@ -32,7 +32,7 @@ public class ErpOrderQuery {
     private String docCode;
 
     /**
-     * 综合状态 (0-待确认 1-已确认 2-已审核 3-已签批 4-挤压完成 5-生产完成 6-已取消)
+     * 综合状态 (0-待确认 1-已确认 2-挤压完成 3-生产完成)
      * @Author: Antigravity
      */
     private Integer status;
@@ -46,4 +46,10 @@ public class ErpOrderQuery {
      * 是否仅查看加急订单 (0-全部 1-仅加急)
      */
     private Integer urgentFlag;
+
+    /**
+     * 型材型号(模糊匹配)
+     * @Author: Trae
+     */
+    private String modelNum;
 }

+ 2 - 0
ruoyi-modules/yingpaipay-erp/src/main/java/org/dromara/erp/domain/query/GoodsStockQuery.java

@@ -24,6 +24,8 @@ public class GoodsStockQuery {
 
     private String clientName;
 
+    private String clientId;
+
     private String docCode;
 
     private String orderState;

+ 14 - 0
ruoyi-modules/yingpaipay-erp/src/main/java/org/dromara/erp/domain/vo/ErpOrderDetailVo.java

@@ -79,6 +79,20 @@ public class ErpOrderDetailVo implements Serializable {
 
     private String erpProjectId;
 
+    /**
+     * 成品入库数(关联 t_Sale_OrderDetail.ItemNo 查询)
+     * @Author: Trae
+     */
+    @com.baomidou.mybatisplus.annotation.TableField(exist = false)
+    private Integer goodsInQty;
+
+    /**
+     * 挤压入库数(关联 t_Sale_OrderDetail.ItemNo 查询)
+     * @Author: Trae
+     */
+    @com.baomidou.mybatisplus.annotation.TableField(exist = false)
+    private Integer semiInQty;
+
     private Date createTime;
 
 }

+ 1 - 19
ruoyi-modules/yingpaipay-erp/src/main/java/org/dromara/erp/domain/vo/ErpOrderVo.java

@@ -110,25 +110,7 @@ public class ErpOrderVo implements Serializable {
     private Integer exFinished;
 
     /**
-     * 已签批标志 (0-否 1-是)
-     */
-    @com.baomidou.mybatisplus.annotation.TableField(exist = false)
-    private Integer reviewed;
-
-    /**
-     * 已审核标志 (0-否 1-是)
-     */
-    @com.baomidou.mybatisplus.annotation.TableField(exist = false)
-    private Integer approved;
-
-    /**
-     * 取消标志 (0-否 1-是)
-     */
-    @com.baomidou.mybatisplus.annotation.TableField(exist = false)
-    private Integer canceled;
-
-    /**
-     * 综合状态 (0-待确认 1-已确认 2-已审核 3-已签批 4-挤压完成 5-生产完成 6-已取消)
+     * 综合状态 (0-待确认 1-已确认 2-挤压完成 3-生产完成)
      */
     @com.baomidou.mybatisplus.annotation.TableField(exist = false)
     private Integer status;

+ 5 - 0
ruoyi-modules/yingpaipay-erp/src/main/java/org/dromara/erp/domain/vo/ErpSaleOrderMasterVo.java

@@ -77,4 +77,9 @@ public class ErpSaleOrderMasterVo implements Serializable {
     private BigDecimal aluPrice;
     private String aluVariety;
 
+    /**
+     * 订单结束标志 (1-已结束)
+     */
+    private Integer ended;
+
 }

+ 32 - 0
ruoyi-modules/yingpaipay-erp/src/main/java/org/dromara/erp/domain/vo/GoodsStockSummaryVo.java

@@ -0,0 +1,32 @@
+package org.dromara.erp.domain.vo;
+
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+/**
+ * 成品库存汇总视图 VO
+ * 按 型号 + 客户名称 分组,汇总重量和支数
+ *
+ * @Author: Antigravity
+ */
+@Data
+public class GoodsStockSummaryVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /** 型号 */
+    private String modelNum;
+
+    /** 客户名称 */
+    private String clientName;
+
+    /** 汇总重量 */
+    private BigDecimal sumWt;
+
+    /** 汇总支数 */
+    private BigDecimal sumQty;
+}

+ 9 - 0
ruoyi-modules/yingpaipay-erp/src/main/java/org/dromara/erp/mapper/GoodsStockMapper.java

@@ -1,8 +1,12 @@
 package org.dromara.erp.mapper;
 
 import com.baomidou.dynamic.datasource.annotation.DS;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import org.apache.ibatis.annotations.Param;
 import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
 import org.dromara.erp.domain.GoodsStock;
+import org.dromara.erp.domain.query.GoodsStockQuery;
+import org.dromara.erp.domain.vo.GoodsStockSummaryVo;
 import org.dromara.erp.domain.vo.GoodsStockVo;
 
 /**
@@ -12,4 +16,9 @@ import org.dromara.erp.domain.vo.GoodsStockVo;
  */
 @DS("htsail_cs")
 public interface GoodsStockMapper extends BaseMapperPlus<GoodsStock, GoodsStockVo> {
+
+    /**
+     * 按型号+客户名称汇总查询(SUM重量、SUM支数)
+     */
+    Page<GoodsStockSummaryVo> selectSummaryPage(@Param("page") Page<GoodsStockSummaryVo> page, @Param("query") GoodsStockQuery query);
 }

+ 6 - 0
ruoyi-modules/yingpaipay-erp/src/main/java/org/dromara/erp/service/IGoodsStockService.java

@@ -3,6 +3,7 @@ package org.dromara.erp.service;
 import org.dromara.common.mybatis.core.page.PageQuery;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
 import org.dromara.erp.domain.query.GoodsStockQuery;
+import org.dromara.erp.domain.vo.GoodsStockSummaryVo;
 import org.dromara.erp.domain.vo.GoodsStockVo;
 
 import java.util.List;
@@ -23,4 +24,9 @@ public interface IGoodsStockService {
      * 查询成品库存列表(不分页)
      */
     List<GoodsStockVo> queryList(GoodsStockQuery query);
+
+    /**
+     * 按型号+客户汇总分页查询
+     */
+    TableDataInfo<GoodsStockSummaryVo> querySummaryPage(GoodsStockQuery query, PageQuery pageQuery);
 }

+ 44 - 0
ruoyi-modules/yingpaipay-erp/src/main/java/org/dromara/erp/service/impl/ErpOrderServiceImpl.java

@@ -39,6 +39,7 @@ public class ErpOrderServiceImpl implements IErpOrderService {
     private final ErpOrderMapper baseMapper;
     private final org.dromara.erp.mapper.ErpOrderDetailMapper erpOrderDetailMapper;
     private final org.dromara.erp.mapper.ErpSaleOrderMasterMapper erpSaleOrderMasterMapper;
+    private final org.dromara.erp.mapper.ErpSaleOrderDetailMapper erpSaleOrderDetailMapper;
     private final LockTemplate lockTemplate;
 
     @Override
@@ -88,6 +89,9 @@ public class ErpOrderServiceImpl implements IErpOrderService {
         detailLqw.in(org.dromara.erp.domain.ErpOrderDetail::getOrderId, orderIds);
         List<org.dromara.erp.domain.vo.ErpOrderDetailVo> allDetails = erpOrderDetailMapper.selectVoList(detailLqw);
 
+        // 填充入库数
+        fillInOutQtys(allDetails);
+
         for (ErpOrderVo vo : list) {
             List<org.dromara.erp.domain.vo.ErpOrderDetailVo> details = allDetails.stream()
                     .filter(d -> vo.getRowId().equals(d.getOrderId()))
@@ -97,6 +101,44 @@ public class ErpOrderServiceImpl implements IErpOrderService {
         }
     }
 
+    /**
+     * 根据 ItemNo 关联 t_Sale_OrderDetail 填充成品入库数和挤压入库数
+     * @Author: Trae
+     */
+    private void fillInOutQtys(List<org.dromara.erp.domain.vo.ErpOrderDetailVo> details) {
+        if (ObjectUtil.isEmpty(details)) return;
+
+        List<String> itemNos = details.stream()
+                .map(org.dromara.erp.domain.vo.ErpOrderDetailVo::getItemNo)
+                .filter(ObjectUtil::isNotEmpty)
+                .distinct()
+                .toList();
+
+        if (itemNos.isEmpty()) return;
+
+        LambdaQueryWrapper<org.dromara.erp.domain.ErpSaleOrderDetail> saleDetailLqw = Wrappers.lambdaQuery();
+        saleDetailLqw.in(org.dromara.erp.domain.ErpSaleOrderDetail::getItemNo, itemNos);
+        List<org.dromara.erp.domain.vo.ErpSaleOrderDetailVo> saleDetails = erpSaleOrderDetailMapper.selectVoList(saleDetailLqw);
+
+        // 构建 ItemNo -> (goodsInQty, semiInQty) 映射
+        java.util.Map<String, org.dromara.erp.domain.vo.ErpSaleOrderDetailVo> saleDetailMap = new java.util.HashMap<>();
+        for (org.dromara.erp.domain.vo.ErpSaleOrderDetailVo sd : saleDetails) {
+            if (ObjectUtil.isNotEmpty(sd.getItemNo())) {
+                saleDetailMap.put(sd.getItemNo(), sd);
+            }
+        }
+
+        for (org.dromara.erp.domain.vo.ErpOrderDetailVo detail : details) {
+            if (ObjectUtil.isNotEmpty(detail.getItemNo())) {
+                org.dromara.erp.domain.vo.ErpSaleOrderDetailVo matched = saleDetailMap.get(detail.getItemNo());
+                if (matched != null) {
+                    detail.setGoodsInQty(matched.getGoodsInQty());
+                    detail.setSemiInQty(matched.getSemiInQty());
+                }
+            }
+        }
+    }
+
     @Override
     public ErpOrderVo queryById(String rowId) {
         ErpOrderVo vo = baseMapper.selectOrderVoById(rowId);
@@ -104,6 +146,8 @@ public class ErpOrderServiceImpl implements IErpOrderService {
             LambdaQueryWrapper<org.dromara.erp.domain.ErpOrderDetail> detailLqw = Wrappers.lambdaQuery();
             detailLqw.eq(org.dromara.erp.domain.ErpOrderDetail::getOrderId, rowId);
             List<org.dromara.erp.domain.vo.ErpOrderDetailVo> details = erpOrderDetailMapper.selectVoList(detailLqw);
+            // 填充入库数
+            fillInOutQtys(details);
             vo.setDetails(details);
             vo.setTotalCount(details.stream().mapToInt(d -> d.getCount() == null ? 0 : d.getCount()).sum());
         }

+ 8 - 0
ruoyi-modules/yingpaipay-erp/src/main/java/org/dromara/erp/service/impl/GoodsStockServiceImpl.java

@@ -9,6 +9,7 @@ import org.dromara.common.mybatis.core.page.PageQuery;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
 import org.dromara.erp.domain.GoodsStock;
 import org.dromara.erp.domain.query.GoodsStockQuery;
+import org.dromara.erp.domain.vo.GoodsStockSummaryVo;
 import org.dromara.erp.domain.vo.GoodsStockVo;
 import org.dromara.erp.mapper.GoodsStockMapper;
 import org.dromara.erp.service.IGoodsStockService;
@@ -40,6 +41,12 @@ public class GoodsStockServiceImpl implements IGoodsStockService {
         return baseMapper.selectVoList(lqw);
     }
 
+    @Override
+    public TableDataInfo<GoodsStockSummaryVo> querySummaryPage(GoodsStockQuery query, PageQuery pageQuery) {
+        Page<GoodsStockSummaryVo> result = baseMapper.selectSummaryPage(pageQuery.build(), query);
+        return TableDataInfo.build(result);
+    }
+
     private LambdaQueryWrapper<GoodsStock> buildQueryWrapper(GoodsStockQuery query) {
         LambdaQueryWrapper<GoodsStock> lqw = Wrappers.lambdaQuery();
         lqw.eq(ObjectUtil.isNotEmpty(query.getItemNo()), GoodsStock::getItemNo, query.getItemNo());
@@ -49,6 +56,7 @@ public class GoodsStockServiceImpl implements IGoodsStockService {
         lqw.like(ObjectUtil.isNotEmpty(query.getColorName()), GoodsStock::getColorName, query.getColorName());
         lqw.like(ObjectUtil.isNotEmpty(query.getClientNum()), GoodsStock::getClientNum, query.getClientNum());
         lqw.like(ObjectUtil.isNotEmpty(query.getClientName()), GoodsStock::getClientName, query.getClientName());
+        lqw.eq(ObjectUtil.isNotEmpty(query.getClientId()), GoodsStock::getClientId, query.getClientId());
         lqw.eq(ObjectUtil.isNotEmpty(query.getDocCode()), GoodsStock::getDocCode, query.getDocCode());
         lqw.eq(ObjectUtil.isNotEmpty(query.getOrderState()), GoodsStock::getOrderState, query.getOrderState());
         lqw.eq(query.getIsHalf() != null, GoodsStock::getIsHalf, query.getIsHalf());

+ 45 - 122
ruoyi-modules/yingpaipay-erp/src/main/resources/mapper/ErpOrderMapper.xml

@@ -23,23 +23,16 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             o.FClientName as clientName,
             m.Finished as finished,
             m.ExFinished as exFinished,
-            m.Reviewed as reviewed,
-            m.Approved as approved,
-            m.Canceled as canceled,
             CASE 
-                WHEN m.Finished = 1 THEN 5
-                WHEN m.Finished = 0 AND m.ExFinished = 1 THEN 4
-                WHEN m.Finished = 0 AND m.ExFinished = 0 AND m.Reviewed = 1 THEN 3
-                WHEN m.Finished = 0 AND m.ExFinished = 0 AND m.Reviewed = 0 AND m.Approved = 1 THEN 2
-                WHEN m.Finished = 0 AND m.ExFinished = 0 AND m.Reviewed = 0 AND m.Approved = 0 AND m.Canceled = 1 THEN 6
-                WHEN (m.Canceled IS NULL OR m.Canceled = 0) AND (m.Finished IS NULL OR m.Finished = 0) 
-                     AND (m.ExFinished IS NULL OR m.ExFinished = 0) AND (m.Reviewed IS NULL OR m.Reviewed = 0) 
-                     AND (m.Approved IS NULL OR m.Approved = 0) AND o.FIsConfirmed = 1 THEN 1
+                WHEN m.Finished = 1 THEN 3
+                WHEN m.ExFinished = 1 THEN 2
+                WHEN o.FIsConfirmed = 1 THEN 1
                 ELSE 0
             END as status
         FROM t_Applet_Order o
         LEFT JOIN t_Sale_OrderMaster m ON o.FErpDocCode = m.DocCode
         <where>
+            AND (m.Ended IS NULL OR m.Ended = 0)
             <if test="query.code != null and query.code != ''">
                 AND o.FCode LIKE concat('%', #{query.code}, '%')
             </if>
@@ -55,18 +48,12 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
                         AND o.FIsConfirmed = 0 
                         AND (m.Finished IS NULL OR m.Finished = 0)
                         AND (m.ExFinished IS NULL OR m.ExFinished = 0)
-                        AND (m.Reviewed IS NULL OR m.Reviewed = 0)
-                        AND (m.Approved IS NULL OR m.Approved = 0)
-                        AND (m.Canceled IS NULL OR m.Canceled = 0)
                     </when>
                     <when test="query.isConfirmed == 1">
                         AND (
                             o.FIsConfirmed = 1 
                             OR m.Finished = 1 
-                            OR m.ExFinished = 1 
-                            OR m.Reviewed = 1 
-                            OR m.Approved = 1 
-                            OR m.Canceled = 1
+                            OR m.ExFinished = 1
                         )
                     </when>
                 </choose>
@@ -77,38 +64,31 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
                         AND o.FIsConfirmed = 0 
                         AND (m.Finished IS NULL OR m.Finished = 0)
                         AND (m.ExFinished IS NULL OR m.ExFinished = 0)
-                        AND (m.Reviewed IS NULL OR m.Reviewed = 0)
-                        AND (m.Approved IS NULL OR m.Approved = 0)
-                        AND (m.Canceled IS NULL OR m.Canceled = 0)
                     </when>
                     <when test="query.status == 1">
                         AND o.FIsConfirmed = 1
                         AND (m.Finished IS NULL OR m.Finished = 0)
                         AND (m.ExFinished IS NULL OR m.ExFinished = 0)
-                        AND (m.Reviewed IS NULL OR m.Reviewed = 0)
-                        AND (m.Approved IS NULL OR m.Approved = 0)
-                        AND (m.Canceled IS NULL OR m.Canceled = 0)
                     </when>
                     <when test="query.status == 2">
-                        AND m.Finished = 0 AND m.ExFinished = 0 AND m.Reviewed = 0 AND m.Approved = 1
+                        AND m.ExFinished = 1
+                        AND (m.Finished IS NULL OR m.Finished = 0)
                     </when>
                     <when test="query.status == 3">
-                        AND m.Finished = 0 AND m.ExFinished = 0 AND m.Reviewed = 1
-                    </when>
-                    <when test="query.status == 4">
-                        AND m.Finished = 0 AND m.ExFinished = 1
-                    </when>
-                    <when test="query.status == 5">
                         AND m.Finished = 1
                     </when>
-                    <when test="query.status == 6">
-                        AND m.Finished = 0 AND m.ExFinished = 0 AND m.Reviewed = 0 AND m.Approved = 0 AND m.Canceled = 1
-                    </when>
                 </choose>
             </if>
             <if test="query.urgentFlag != null and query.urgentFlag == 1">
                 AND o.FUrgentFlag = 1
             </if>
+            <if test="query.modelNum != null and query.modelNum != ''">
+                AND EXISTS (
+                    SELECT 1 FROM t_Applet_Order_Details d 
+                    WHERE d.FOrderID = o.FRowID 
+                    AND d.ModelNum LIKE concat('%', #{query.modelNum}, '%')
+                )
+            </if>
         </where>
         ORDER BY o.CreateTime DESC
     </select>
@@ -128,23 +108,16 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             o.FClientName as clientName,
             m.Finished as finished,
             m.ExFinished as exFinished,
-            m.Reviewed as reviewed,
-            m.Approved as approved,
-            m.Canceled as canceled,
             CASE 
-                WHEN m.Finished = 1 THEN 5
-                WHEN m.Finished = 0 AND m.ExFinished = 1 THEN 4
-                WHEN m.Finished = 0 AND m.ExFinished = 0 AND m.Reviewed = 1 THEN 3
-                WHEN m.Finished = 0 AND m.ExFinished = 0 AND m.Reviewed = 0 AND m.Approved = 1 THEN 2
-                WHEN m.Finished = 0 AND m.ExFinished = 0 AND m.Reviewed = 0 AND m.Approved = 0 AND m.Canceled = 1 THEN 6
-                WHEN (m.Canceled IS NULL OR m.Canceled = 0) AND (m.Finished IS NULL OR m.Finished = 0) 
-                     AND (m.ExFinished IS NULL OR m.ExFinished = 0) AND (m.Reviewed IS NULL OR m.Reviewed = 0) 
-                     AND (m.Approved IS NULL OR m.Approved = 0) AND o.FIsConfirmed = 1 THEN 1
+                WHEN m.Finished = 1 THEN 3
+                WHEN m.ExFinished = 1 THEN 2
+                WHEN o.FIsConfirmed = 1 THEN 1
                 ELSE 0
             END as status
         FROM t_Applet_Order o
         LEFT JOIN t_Sale_OrderMaster m ON o.FErpDocCode = m.DocCode
         <where>
+            AND (m.Ended IS NULL OR m.Ended = 0)
             <if test="query.code != null and query.code != ''">
                 AND o.FCode = #{query.code}
             </if>
@@ -160,18 +133,12 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
                         AND o.FIsConfirmed = 0 
                         AND (m.Finished IS NULL OR m.Finished = 0)
                         AND (m.ExFinished IS NULL OR m.ExFinished = 0)
-                        AND (m.Reviewed IS NULL OR m.Reviewed = 0)
-                        AND (m.Approved IS NULL OR m.Approved = 0)
-                        AND (m.Canceled IS NULL OR m.Canceled = 0)
                     </when>
                     <when test="query.isConfirmed == 1">
                         AND (
                             o.FIsConfirmed = 1 
                             OR m.Finished = 1 
-                            OR m.ExFinished = 1 
-                            OR m.Reviewed = 1 
-                            OR m.Approved = 1 
-                            OR m.Canceled = 1
+                            OR m.ExFinished = 1
                         )
                     </when>
                 </choose>
@@ -182,38 +149,31 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
                         AND o.FIsConfirmed = 0 
                         AND (m.Finished IS NULL OR m.Finished = 0)
                         AND (m.ExFinished IS NULL OR m.ExFinished = 0)
-                        AND (m.Reviewed IS NULL OR m.Reviewed = 0)
-                        AND (m.Approved IS NULL OR m.Approved = 0)
-                        AND (m.Canceled IS NULL OR m.Canceled = 0)
                     </when>
                     <when test="query.status == 1">
                         AND o.FIsConfirmed = 1
                         AND (m.Finished IS NULL OR m.Finished = 0)
                         AND (m.ExFinished IS NULL OR m.ExFinished = 0)
-                        AND (m.Reviewed IS NULL OR m.Reviewed = 0)
-                        AND (m.Approved IS NULL OR m.Approved = 0)
-                        AND (m.Canceled IS NULL OR m.Canceled = 0)
                     </when>
                     <when test="query.status == 2">
-                        AND m.Finished = 0 AND m.ExFinished = 0 AND m.Reviewed = 0 AND m.Approved = 1
+                        AND m.ExFinished = 1
+                        AND (m.Finished IS NULL OR m.Finished = 0)
                     </when>
                     <when test="query.status == 3">
-                        AND m.Finished = 0 AND m.ExFinished = 0 AND m.Reviewed = 1
-                    </when>
-                    <when test="query.status == 4">
-                        AND m.Finished = 0 AND m.ExFinished = 1
-                    </when>
-                    <when test="query.status == 5">
                         AND m.Finished = 1
                     </when>
-                    <when test="query.status == 6">
-                        AND m.Finished = 0 AND m.ExFinished = 0 AND m.Reviewed = 0 AND m.Approved = 0 AND m.Canceled = 1
-                    </when>
                 </choose>
             </if>
             <if test="query.urgentFlag != null and query.urgentFlag == 1">
                 AND o.FUrgentFlag = 1
             </if>
+            <if test="query.modelNum != null and query.modelNum != ''">
+                AND EXISTS (
+                    SELECT 1 FROM t_Applet_Order_Details d 
+                    WHERE d.FOrderID = o.FRowID 
+                    AND d.ModelNum LIKE concat('%', #{query.modelNum}, '%')
+                )
+            </if>
         </where>
         ORDER BY o.CreateTime DESC
     </select>
@@ -233,52 +193,36 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             o.FClientName as clientName,
             m.Finished as finished,
             m.ExFinished as exFinished,
-            m.Reviewed as reviewed,
-            m.Approved as approved,
-            m.Canceled as canceled,
             CASE 
-                WHEN m.Finished = 1 THEN 5
-                WHEN m.Finished = 0 AND m.ExFinished = 1 THEN 4
-                WHEN m.Finished = 0 AND m.ExFinished = 0 AND m.Reviewed = 1 THEN 3
-                WHEN m.Finished = 0 AND m.ExFinished = 0 AND m.Reviewed = 0 AND m.Approved = 1 THEN 2
-                WHEN m.Finished = 0 AND m.ExFinished = 0 AND m.Reviewed = 0 AND m.Approved = 0 AND m.Canceled = 1 THEN 6
-                WHEN (m.Canceled IS NULL OR m.Canceled = 0) AND (m.Finished IS NULL OR m.Finished = 0) 
-                     AND (m.ExFinished IS NULL OR m.ExFinished = 0) AND (m.Reviewed IS NULL OR m.Reviewed = 0) 
-                     AND (m.Approved IS NULL OR m.Approved = 0) AND o.FIsConfirmed = 1 THEN 1
+                WHEN m.Finished = 1 THEN 3
+                WHEN m.ExFinished = 1 THEN 2
+                WHEN o.FIsConfirmed = 1 THEN 1
                 ELSE 0
             END as status
         FROM t_Applet_Order o
         LEFT JOIN t_Sale_OrderMaster m ON o.FErpDocCode = m.DocCode
         WHERE o.FRowID = #{rowId}
+        AND (m.Ended IS NULL OR m.Ended = 0)
     </select>
 
     <!-- 按综合状态统计订单数量 -->
     <select id="countOrderStatus" resultType="java.util.LinkedHashMap">
         SELECT 
             CASE 
-                WHEN m.Finished = 1 THEN 5
-                WHEN m.Finished = 0 AND m.ExFinished = 1 THEN 4
-                WHEN m.Finished = 0 AND m.ExFinished = 0 AND m.Reviewed = 1 THEN 3
-                WHEN m.Finished = 0 AND m.ExFinished = 0 AND m.Reviewed = 0 AND m.Approved = 1 THEN 2
-                WHEN m.Finished = 0 AND m.ExFinished = 0 AND m.Reviewed = 0 AND m.Approved = 0 AND m.Canceled = 1 THEN 6
-                WHEN (m.Canceled IS NULL OR m.Canceled = 0) AND (m.Finished IS NULL OR m.Finished = 0) 
-                     AND (m.ExFinished IS NULL OR m.ExFinished = 0) AND (m.Reviewed IS NULL OR m.Reviewed = 0) 
-                     AND (m.Approved IS NULL OR m.Approved = 0) AND o.FIsConfirmed = 1 THEN 1
+                WHEN m.Finished = 1 THEN 3
+                WHEN m.ExFinished = 1 THEN 2
+                WHEN o.FIsConfirmed = 1 THEN 1
                 ELSE 0
             END as statusKey,
             COUNT(1) as statusCount
         FROM t_Applet_Order o
         LEFT JOIN t_Sale_OrderMaster m ON o.FErpDocCode = m.DocCode
+        WHERE (m.Ended IS NULL OR m.Ended = 0)
         GROUP BY 
             CASE 
-                WHEN m.Finished = 1 THEN 5
-                WHEN m.Finished = 0 AND m.ExFinished = 1 THEN 4
-                WHEN m.Finished = 0 AND m.ExFinished = 0 AND m.Reviewed = 1 THEN 3
-                WHEN m.Finished = 0 AND m.ExFinished = 0 AND m.Reviewed = 0 AND m.Approved = 1 THEN 2
-                WHEN m.Finished = 0 AND m.ExFinished = 0 AND m.Reviewed = 0 AND m.Approved = 0 AND m.Canceled = 1 THEN 6
-                WHEN (m.Canceled IS NULL OR m.Canceled = 0) AND (m.Finished IS NULL OR m.Finished = 0) 
-                     AND (m.ExFinished IS NULL OR m.ExFinished = 0) AND (m.Reviewed IS NULL OR m.Reviewed = 0) 
-                     AND (m.Approved IS NULL OR m.Approved = 0) AND o.FIsConfirmed = 1 THEN 1
+                WHEN m.Finished = 1 THEN 3
+                WHEN m.ExFinished = 1 THEN 2
+                WHEN o.FIsConfirmed = 1 THEN 1
                 ELSE 0
             END
         ORDER BY statusKey
@@ -299,23 +243,16 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             o.FClientName as clientName,
             m.Finished as finished,
             m.ExFinished as exFinished,
-            m.Reviewed as reviewed,
-            m.Approved as approved,
-            m.Canceled as canceled,
             CASE 
-                WHEN m.Finished = 1 THEN 5
-                WHEN m.Finished = 0 AND m.ExFinished = 1 THEN 4
-                WHEN m.Finished = 0 AND m.ExFinished = 0 AND m.Reviewed = 1 THEN 3
-                WHEN m.Finished = 0 AND m.ExFinished = 0 AND m.Reviewed = 0 AND m.Approved = 1 THEN 2
-                WHEN m.Finished = 0 AND m.ExFinished = 0 AND m.Reviewed = 0 AND m.Approved = 0 AND m.Canceled = 1 THEN 6
-                WHEN (m.Canceled IS NULL OR m.Canceled = 0) AND (m.Finished IS NULL OR m.Finished = 0) 
-                     AND (m.ExFinished IS NULL OR m.ExFinished = 0) AND (m.Reviewed IS NULL OR m.Reviewed = 0) 
-                     AND (m.Approved IS NULL OR m.Approved = 0) AND o.FIsConfirmed = 1 THEN 1
+                WHEN m.Finished = 1 THEN 3
+                WHEN m.ExFinished = 1 THEN 2
+                WHEN o.FIsConfirmed = 1 THEN 1
                 ELSE 0
             END as status
         FROM t_Applet_Order o
         LEFT JOIN t_Sale_OrderMaster m ON o.FErpDocCode = m.DocCode
         <where>
+            AND (m.Ended IS NULL OR m.Ended = 0)
             <if test="query.clientId != null and query.clientId != ''">
                 AND o.FClientID = #{query.clientId}
             </if>
@@ -325,33 +262,19 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
                         AND o.FIsConfirmed = 0 
                         AND (m.Finished IS NULL OR m.Finished = 0)
                         AND (m.ExFinished IS NULL OR m.ExFinished = 0)
-                        AND (m.Reviewed IS NULL OR m.Reviewed = 0)
-                        AND (m.Approved IS NULL OR m.Approved = 0)
-                        AND (m.Canceled IS NULL OR m.Canceled = 0)
                     </when>
                     <when test="query.status == 1">
                         AND o.FIsConfirmed = 1
                         AND (m.Finished IS NULL OR m.Finished = 0)
                         AND (m.ExFinished IS NULL OR m.ExFinished = 0)
-                        AND (m.Reviewed IS NULL OR m.Reviewed = 0)
-                        AND (m.Approved IS NULL OR m.Approved = 0)
-                        AND (m.Canceled IS NULL OR m.Canceled = 0)
                     </when>
                     <when test="query.status == 2">
-                        AND m.Finished = 0 AND m.ExFinished = 0 AND m.Reviewed = 0 AND m.Approved = 1
+                        AND m.ExFinished = 1
+                        AND (m.Finished IS NULL OR m.Finished = 0)
                     </when>
                     <when test="query.status == 3">
-                        AND m.Finished = 0 AND m.ExFinished = 0 AND m.Reviewed = 1
-                    </when>
-                    <when test="query.status == 4">
-                        AND m.Finished = 0 AND m.ExFinished = 1
-                    </when>
-                    <when test="query.status == 5">
                         AND m.Finished = 1
                     </when>
-                    <when test="query.status == 6">
-                        AND m.Finished = 0 AND m.ExFinished = 0 AND m.Reviewed = 0 AND m.Approved = 0 AND m.Canceled = 1
-                    </when>
                 </choose>
             </if>
             <if test="query.urgentFlag != null and query.urgentFlag == 1">

+ 24 - 0
ruoyi-modules/yingpaipay-erp/src/main/resources/mapper/GoodsStockMapper.xml

@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.dromara.erp.mapper.GoodsStockMapper">
+
+    <!-- 按型号+客户名称分组汇总(SUM重量、SUM支数),支持客户ID过滤 -->
+    <select id="selectSummaryPage" resultType="org.dromara.erp.domain.vo.GoodsStockSummaryVo">
+        SELECT 
+            ModelNum as modelNum,
+            ClientName as clientName,
+            SUM(Wt) as sumWt,
+            SUM(Qty) as sumQty
+        FROM v_Goods_Stock
+        <where>
+            <if test="query.clientId != null and query.clientId != ''">
+                AND ClientID = #{query.clientId}
+            </if>
+        </where>
+        GROUP BY ModelNum, ClientName
+        ORDER BY ModelNum
+    </select>
+
+</mapper>

BIN
script/sql/sqlserver/HS_ERP_Order.dbo.T_Goods_Stock.sql