From 593379b64d440c06887e8fbfa2803c70463dba19 Mon Sep 17 00:00:00 2001
From: gongchunyi <deslre0381@gmail.com>
Date: 星期一, 30 三月 2026 19:27:57 +0800
Subject: [PATCH] fix: 产品入库的库存返回产品大类、规则型号、单位

---
 src/main/resources/mapper/procurementrecord/ProcurementRecordOutMapper.xml               |   72 ++++++-----
 src/main/java/com/ruoyi/procurementrecord/controller/ProcurementRecordController.java    |    7 +
 src/main/java/com/ruoyi/procurementrecord/service/ProcurementRecordService.java          |    1 
 src/main/resources/mapper/procurementrecord/ProcurementRecordMapper.xml                  |  228 +++++++++++++++++++++----------------
 src/main/java/com/ruoyi/procurementrecord/service/impl/ProcurementRecordServiceImpl.java |   38 +++++-
 5 files changed, 211 insertions(+), 135 deletions(-)

diff --git a/src/main/java/com/ruoyi/procurementrecord/controller/ProcurementRecordController.java b/src/main/java/com/ruoyi/procurementrecord/controller/ProcurementRecordController.java
index 7fb7b44..26c1873 100644
--- a/src/main/java/com/ruoyi/procurementrecord/controller/ProcurementRecordController.java
+++ b/src/main/java/com/ruoyi/procurementrecord/controller/ProcurementRecordController.java
@@ -44,6 +44,13 @@
         return AjaxResult.success(procurementRecordService.add(procurementDto));
     }
 
+    @PostMapping("/addProduct")
+    @Log(title = "鍏ュ簱绠$悊-浜у搧鍏ュ簱", businessType = BusinessType.INSERT)
+    @Transactional
+    public AjaxResult addProduct(@RequestBody Details detail) {
+        return AjaxResult.success(procurementRecordService.addProduct(detail));
+    }
+
     @PostMapping("/update")
     @Log(title = "閲囪喘鍏ュ簱-鍏ュ簱绠$悊-淇敼鍏ュ簱", businessType = BusinessType.UPDATE)
     @Transactional
diff --git a/src/main/java/com/ruoyi/procurementrecord/service/ProcurementRecordService.java b/src/main/java/com/ruoyi/procurementrecord/service/ProcurementRecordService.java
index 79603ae..5a4ffed 100644
--- a/src/main/java/com/ruoyi/procurementrecord/service/ProcurementRecordService.java
+++ b/src/main/java/com/ruoyi/procurementrecord/service/ProcurementRecordService.java
@@ -19,6 +19,7 @@
 
     int add(ProcurementAddDto procurementDto);
 
+    int addProduct(Details detail);
     IPage<ProcurementPageDto> listPage(Page page, ProcurementPageDto procurementDto);
 
     IPage<ProcurementPageDtoCopy> listPageCopy(Page page, ProcurementPageDto procurementDto);
diff --git a/src/main/java/com/ruoyi/procurementrecord/service/impl/ProcurementRecordServiceImpl.java b/src/main/java/com/ruoyi/procurementrecord/service/impl/ProcurementRecordServiceImpl.java
index caf11a0..15d12ec 100644
--- a/src/main/java/com/ruoyi/procurementrecord/service/impl/ProcurementRecordServiceImpl.java
+++ b/src/main/java/com/ruoyi/procurementrecord/service/impl/ProcurementRecordServiceImpl.java
@@ -174,24 +174,26 @@
     public int updateManagement(ProcurementManagementUpdateDto procurementDto) {
         LoginUser loginUser = SecurityUtils.getLoginUser();
         SysUser sysUser = sysUserMapper.selectUserById(procurementDto.getCreateUser());
-        if(sysUser == null){
+        if (sysUser == null) {
             throw new RuntimeException("鍏ュ簱浜轰笉瀛樺湪");
         }
         DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
         String entryDateStr = procurementDto.getEntryDate() + " 00:00:00";
         String createTimeStr = procurementDto.getCreateTime() + " 00:00:00";
         SalesLedgerProduct salesLedgerProduct = salesLedgerProductMapper.selectById(procurementDto.getSalesLedgerProductId());
-        if(salesLedgerProduct == null){
+        if (procurementDto.getSalesLedgerProductId() != null && salesLedgerProduct == null) {
             throw new RuntimeException("閿�鍞彴璐︿骇鍝佷笉瀛樺湪");
         }
-        salesLedgerProduct.setMinStock(procurementDto.getMinStock());
-        salesLedgerProductMapper.updateById(salesLedgerProduct);
+        if (procurementDto.getSalesLedgerProductId() != null && salesLedgerProduct != null) {
+            salesLedgerProduct.setMinStock(procurementDto.getMinStock());
+            salesLedgerProductMapper.updateById(salesLedgerProduct);
+        }
         ProcurementRecordStorage procurementRecordStorageById = getProcurementRecordById(procurementDto.getId());
         procurementRecordStorageById.setCreateBy(sysUser.getNickName());
         procurementRecordStorageById.setCreateUser(sysUser.getUserId());
-        procurementRecordStorageById.setUpdateTime(LocalDateTime.parse(entryDateStr,df));
+        procurementRecordStorageById.setUpdateTime(LocalDateTime.parse(entryDateStr, df));
         procurementRecordStorageById.setUpdateUser(loginUser.getUserId());
-        procurementRecordStorageById.setCreateTime(LocalDateTime.parse(createTimeStr,df));
+        procurementRecordStorageById.setCreateTime(LocalDateTime.parse(createTimeStr, df));
         procurementRecordMapper.updateById(procurementRecordStorageById);
         return 0;
     }
@@ -375,6 +377,30 @@
     }
 
     @Override
+    public int addProduct(Details detail) {
+        LoginUser loginUser = SecurityUtils.getLoginUser();
+
+        ProcurementRecordStorage.ProcurementRecordStorageBuilder builder = ProcurementRecordStorage.builder()
+                .id(detail.getId())
+                .inboundBatches("绗�1鎵规")
+                .inboundNum(detail.getInboundQuantity())
+                .warnNum(detail.getWarnNum())
+                .outStockQuantity(detail.getOutStockQuantity())
+                .shortageDescription(detail.getShortageDescription())
+                .productModelId(detail.getProductModelId())
+                .updateTime(LocalDateTime.now())
+                .updateUser(loginUser.getUserId());
+        if (detail.getId() == null) {
+            builder.createTime(LocalDateTime.now())
+                    .createUser(loginUser.getUserId())
+                    .createBy(loginUser.getNickName());
+        }
+
+        boolean success = this.saveOrUpdate(builder.build());
+        return success ? 1 : 0;
+    }
+
+    @Override
     public IPage<ProcurementPageDto> listPage(Page page, ProcurementPageDto procurementDto) {
         IPage<ProcurementPageDto> procurementPageDtoIPage = procurementRecordMapper.listPage(page, procurementDto);
         List<ProcurementPageDto> procurementPageDtos = procurementPageDtoIPage.getRecords();
diff --git a/src/main/resources/mapper/procurementrecord/ProcurementRecordMapper.xml b/src/main/resources/mapper/procurementrecord/ProcurementRecordMapper.xml
index fed517d..1d99122 100644
--- a/src/main/resources/mapper/procurementrecord/ProcurementRecordMapper.xml
+++ b/src/main/resources/mapper/procurementrecord/ProcurementRecordMapper.xml
@@ -4,23 +4,23 @@
 
     <select id="listProcurementBySalesLedgerId" resultType="com.ruoyi.procurementrecord.dto.ProcurementDto">
         select
-            t1.supplier_name,
-            t2.product_category,
-            t2.id,
-            t3.id as recordId,
-            t2.specification_model,
-            t2.product_model_id,
-            t2.unit,
-            t2.quantity,
-            t2.min_stock,
-            t2.warn_num,
-            t2.quantity as quantity0,
-            t2.tax_rate,
-            t2.tax_inclusive_unit_price,
-            t2.tax_inclusive_total_price,
-            t2.tax_exclusive_total_price,
-            t3.inbound_num as quantityStock
-        from  purchase_ledger t1
+        t1.supplier_name,
+        t2.product_category,
+        t2.id,
+        t3.id as recordId,
+        t2.specification_model,
+        t2.product_model_id,
+        t2.unit,
+        t2.quantity,
+        t2.min_stock,
+        t2.warn_num,
+        t2.quantity as quantity0,
+        t2.tax_rate,
+        t2.tax_inclusive_unit_price,
+        t2.tax_inclusive_total_price,
+        t2.tax_exclusive_total_price,
+        t3.inbound_num as quantityStock
+        from purchase_ledger t1
         left join sales_ledger_product t2 on t1.id = t2.sales_ledger_id
         left join procurement_record_storage t3 on t2.id = t3.sales_ledger_product_id
         where t1.purchase_contract_number = #{req.purchaseContractNumber}
@@ -31,100 +31,121 @@
     </select>
     <select id="listPage" resultType="com.ruoyi.procurementrecord.dto.ProcurementPageDto">
         select
-        t3.supplier_name,
-        t3.purchase_contract_number,
-        t2.product_category,
+        t3.supplier_name as supplierName,
+        t3.purchase_contract_number as purchaseContractNumber,
+        case when t2.product_category is null then t5.product_name
+        else t2.product_category end as productCategory,
         t1.id,
-        t1.sales_ledger_product_id,
-        t1.product_model_id,
-        t1.create_user,
-        t2.specification_model,
-        t2.unit,
-        t2.tax_rate,
-        t2.tax_inclusive_unit_price,
+        t1.sales_ledger_product_id as salesLedgerProductId,
+        t1.product_model_id as productModelId,
+        t1.create_user as createUser,
+        case when t2.specification_model is null then t4.model
+        else t2.specification_model end as specificationModel,
+        case when t2.unit is null then t4.unit
+        else t2.unit end as unit,
+        t2.tax_rate as taxRate,
+        t2.tax_inclusive_unit_price as taxInclusiveUnitPrice,
         (t1.inbound_num * t2.tax_inclusive_unit_price) as taxInclusiveTotalPrice,
-        (t1.inbound_num * t2.tax_inclusive_unit_price - t1.inbound_num * t2.tax_inclusive_unit_price * t2.tax_rate / 100) as taxExclusiveTotalPrice,
-        t1.inbound_batches,
-        t1.inbound_num,
+        (t1.inbound_num * t2.tax_inclusive_unit_price - t1.inbound_num * t2.tax_inclusive_unit_price * t2.tax_rate /
+        100) as taxExclusiveTotalPrice,
+        t1.inbound_batches as inboundBatches,
+        t1.inbound_num as inboundNum,
         t1.inbound_num as inboundNum0,
-        t1.create_time,
-        t1.update_time,
-        t1.create_by,
-        t2.warn_num,
+        t1.create_time as createTime,
+        t1.update_time as updateTime,
+        t1.create_by as createBy,
+        t2.warn_num as warnNum,
         t1.out_stock_quantity as outStockQuantity,
         t1.shortage_description as shortageDescription
-        from  procurement_record_storage t1
-                  left join sales_ledger_product t2 on t2.id = t1.sales_ledger_product_id
-                  left join purchase_ledger t3 on t3.id = t2.sales_ledger_id
+        from procurement_record_storage t1
+        left join sales_ledger_product t2 on t2.id = t1.sales_ledger_product_id
+        left join purchase_ledger t3 on t3.id = t2.sales_ledger_id
+        left join product_model t4 on t4.id = t1.product_model_id
+        left join product t5 on t5.id = t4.product_id
         <where>
             1 = 1
             <if test="req.supplierName != null and req.supplierName != ''">
-                and t3.supplier_name like  concat('%',#{req.supplierName},'%')
+                and t3.supplier_name like concat('%',#{req.supplierName},'%')
             </if>
             <if test="req.timeStr != null and req.timeStr != ''">
-                and t1.create_time like  concat('%',#{req.timeStr},'%')
+                and t1.create_time like concat('%',#{req.timeStr},'%')
             </if>
         </where>
     </select>
+
     <select id="list" resultType="com.ruoyi.procurementrecord.dto.ProcurementPageDto">
-        select
-            t3.supplier_name,
-            t3.purchase_contract_number,
-            t2.product_category,
-            t1.id,
-            t2.specification_model,
-            t2.unit,
-            t2.quantity,
-            t2.quantity as quantity0,
-            t2.tax_rate,
-            t2.tax_inclusive_unit_price,
-            t2.tax_inclusive_total_price,
-            t2.tax_exclusive_total_price,
-            t1.inbound_batches,
-            t1.inbound_num,
-            t1.create_time,
-            t1.create_time as time,
-            t1.create_by
-        from  procurement_record_storage t1
-                  left join sales_ledger_product t2 on t2.id = t1.sales_ledger_product_id
-                  left join purchase_ledger t3 on t3.id = t2.sales_ledger_id
+        select t3.supplier_name as supplierName,
+               t3.purchase_contract_number as purchaseContractNumber,
+               case
+                   when t2.product_category is null then t5.product_name
+                   else t2.product_category end    as productCategory,
+               t1.id,
+               case
+                   when t2.specification_model is null then t4.model
+                   else t2.specification_model end as specificationModel,
+               case
+                   when t2.unit is null then t4.unit
+                   else t2.unit end                as unit,
+               t2.quantity,
+               t2.quantity                         as quantity0,
+               t2.tax_rate                         as taxRate,
+               t2.tax_inclusive_unit_price         as taxInclusiveUnitPrice,
+               t2.tax_inclusive_total_price        as taxInclusiveTotalPrice,
+               t2.tax_exclusive_total_price        as taxExclusiveTotalPrice,
+               t1.inbound_batches                  as inboundBatches,
+               t1.inbound_num                      as inboundNum,
+               t1.create_time                      as createTime,
+               t1.create_time                      as time,
+               t1.create_by                        as createBy
+        from procurement_record_storage t1
+                 left join sales_ledger_product t2 on t2.id = t1.sales_ledger_product_id
+                 left join purchase_ledger t3 on t3.id = t2.sales_ledger_id
+                 left join product_model t4 on t4.id = t1.product_model_id
+                 left join product t5 on t5.id = t4.product_id
     </select>
+
     <select id="listPageCopy" resultType="com.ruoyi.procurementrecord.dto.ProcurementPageDtoCopy">
         select
         t3.supplier_name,
         t3.purchase_contract_number,
-        t2.product_category,
-        t1.id,
+        case when t2.product_category is null then t5.product_name
+        else t2.product_category end as productCategory,
+        max(t1.id) as id,
         t1.sales_ledger_product_id,
         t1.create_user,
-        t2.specification_model,
-        t2.unit,
+        case when t2.specification_model is null then t4.model
+        else t2.specification_model end as specificationModel,
+        case when t2.unit is null then t4.unit
+        else t2.unit end as unit,
         t2.min_stock,
         t2.tax_rate,
         t2.tax_inclusive_unit_price,
         t2.tax_inclusive_total_price,
         t2.tax_exclusive_total_price,
-        t1.inbound_batches,
+        group_concat(t1.inbound_batches) as inbound_batches,
         sum(t1.inbound_num) as inboundNum,
         sum(t1.inbound_num) as inboundNum0,
-        t1.inbound_num as totalInboundNum,
-        t1.create_time,
-        t1.update_time,
+        sum(t1.inbound_num) as totalInboundNum,
+        max(t1.create_time) as create_time,
+        max(t1.update_time) as update_time,
         t1.create_by,
         t2.warn_num
-        from  procurement_record_storage t1
+        from procurement_record_storage t1
         left join sales_ledger_product t2 on t2.id = t1.sales_ledger_product_id
         left join purchase_ledger t3 on t3.id = t2.sales_ledger_id
+        left join product_model t4 on t4.id = t1.product_model_id
+        left join product t5 on t5.id = t4.product_id
         <where>
             1 = 1
             <if test="req.supplierName != null and req.supplierName != ''">
-                and t3.supplier_name like  concat('%',#{req.supplierName},'%')
+                and t3.supplier_name like concat('%',#{req.supplierName},'%')
             </if>
             <if test="req.timeStr != null and req.timeStr != ''">
-                and t1.create_time like  concat('%',#{req.timeStr},'%')
+                and t1.create_time like concat('%',#{req.timeStr},'%')
             </if>
             <if test="req.reportDate != null">
-                and t1.create_time >= #{req.reportDate} and t1.create_time &lt; DATE_ADD(#{req.reportDate}, INTERVAL 1 DAY)
+                and t1.create_time >= #{req.reportDate} and t1.create_time &lt; DATE_ADD(#{req.reportDate}, INTERVAL 1
+                DAY)
             </if>
             <if test="req.startMonth != null">
                 and t1.create_time >= #{req.startMonth}
@@ -139,32 +160,45 @@
                 and t1.create_time &lt;= #{req.endDate}
             </if>
         </where>
-        group by t3.supplier_name,t2.product_category,t2.specification_model
-    </select>
-    <select id="listCopy" resultType="com.ruoyi.procurementrecord.dto.ProcurementPageDtoCopy">
-        select
+        group by
             t3.supplier_name,
             t3.purchase_contract_number,
-            t2.product_category,
-            t1.id,
-            t1.sales_ledger_product_id,
-            t1.create_user,
-            t2.specification_model,
-            t2.unit,
-            t2.tax_rate,
-            t2.tax_inclusive_unit_price,
-            t2.tax_inclusive_total_price,
-            t2.tax_exclusive_total_price,
-            t1.inbound_batches,
-            t1.inbound_num,
-            t1.inbound_num as inboundNum0,
-            t1.create_time,
-            t1.update_time,
-            t1.create_time as cTime,
-            t1.update_time as uTime,
-            t1.create_by
-        from  procurement_record_storage t1
-                  left join sales_ledger_product t2 on t2.id = t1.sales_ledger_product_id
-                  left join purchase_ledger t3 on t3.id = t2.sales_ledger_id
+            productCategory,
+            specificationModel,
+            unit
+    </select>
+
+    <select id="listCopy" resultType="com.ruoyi.procurementrecord.dto.ProcurementPageDtoCopy">
+        select t3.supplier_name,
+               t3.purchase_contract_number,
+               case
+                   when t2.product_category is null then t5.product_name
+                   else t2.product_category end    as productCategory,
+               t1.id,
+               t1.sales_ledger_product_id,
+               t1.create_user,
+               case
+                   when t2.specification_model is null then t4.model
+                   else t2.specification_model end as specificationModel,
+               case
+                   when t2.unit is null then t4.unit
+                   else t2.unit end                as unit,
+               t2.tax_rate,
+               t2.tax_inclusive_unit_price,
+               t2.tax_inclusive_total_price,
+               t2.tax_exclusive_total_price,
+               t1.inbound_batches,
+               t1.inbound_num,
+               t1.inbound_num                      as inboundNum0,
+               t1.create_time,
+               t1.update_time,
+               t1.create_time                      as cTime,
+               t1.update_time                      as uTime,
+               t1.create_by
+        from procurement_record_storage t1
+                 left join sales_ledger_product t2 on t2.id = t1.sales_ledger_product_id
+                 left join purchase_ledger t3 on t3.id = t2.sales_ledger_id
+                 left join product_model t4 on t4.id = t1.product_model_id
+                 left join product t5 on t5.id = t4.product_id
     </select>
 </mapper>
diff --git a/src/main/resources/mapper/procurementrecord/ProcurementRecordOutMapper.xml b/src/main/resources/mapper/procurementrecord/ProcurementRecordOutMapper.xml
index ec91c53..71c028f 100644
--- a/src/main/resources/mapper/procurementrecord/ProcurementRecordOutMapper.xml
+++ b/src/main/resources/mapper/procurementrecord/ProcurementRecordOutMapper.xml
@@ -2,52 +2,60 @@
         "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.ruoyi.procurementrecord.mapper.ProcurementRecordOutMapper">
 
+
     <select id="listPage" resultType="com.ruoyi.procurementrecord.dto.ProcurementRecordOutPageDto">
         select
-        t3.supplier_name,
-        t2.product_category,
+        t3.supplier_name as supplierName,
+        COALESCE(t2.product_category, t6.product_name) as productCategory,
         t1.id,
         t1.code,
-        t2.specification_model,
-        t2.unit,
-        t2.tax_rate,
-        t2.tax_inclusive_unit_price,
-        t2.tax_inclusive_total_price,
-        t2.tax_exclusive_total_price,
-        t1.inbound_num,
-        t1.create_time,
-        t1.create_by,
-        t2.warn_num
-        from  procurement_record_out t1
+        COALESCE(t2.specification_model, t5.model) as specificationModel,
+        COALESCE(t2.unit, t5.unit) as unit,
+        t2.tax_rate as taxRate,
+        t2.tax_inclusive_unit_price as taxInclusiveUnitPrice,
+        t2.tax_inclusive_total_price as taxInclusiveTotalPrice,
+        t2.tax_exclusive_total_price as taxExclusiveTotalPrice,
+        t1.inbound_num as inboundNum,
+        t1.create_time as createTime,
+        t1.create_by as createBy,
+        COALESCE(t2.warn_num, t4.warn_num) as warnNum
+        from procurement_record_out t1
         left join sales_ledger_product t2 on t2.id = t1.sales_ledger_product_id
         left join purchase_ledger t3 on t3.id = t2.sales_ledger_id
+        left join procurement_record_storage t4 on t4.id = t1.procurement_record_storage_id
+        left join product_model t5 on t5.id = t4.product_model_id
+        left join product t6 on t6.id = t5.product_id
         <where>
             1 = 1
             <if test="req.supplierName != null and req.supplierName != ''">
-                and t3.supplier_name like  concat('%',#{req.supplierName},'%')
+                and t3.supplier_name like concat('%',#{req.supplierName},'%')
             </if>
             <if test="req.timeStr != null and req.timeStr != ''">
-                and t1.create_time like  concat('%',#{req.timeStr},'%')
+                and t1.create_time like concat('%',#{req.timeStr},'%')
             </if>
         </where>
     </select>
+
     <select id="list" resultType="com.ruoyi.procurementrecord.dto.ProcurementRecordOutPageDto">
-        select
-            t3.supplier_name,
-            t2.product_category,
-            t1.id,
-            t2.specification_model,
-            t2.unit,
-            t2.tax_rate,
-            t2.tax_inclusive_unit_price,
-            t2.tax_inclusive_total_price,
-            t2.tax_exclusive_total_price,
-            t1.inbound_num,
-            t1.create_time,
-            t1.create_time as time,
-            t1.create_by
-        from  procurement_record_out t1
-                  left join sales_ledger_product t2 on t2.id = t1.sales_ledger_product_id
-                  left join purchase_ledger t3 on t3.id = t2.sales_ledger_id
+        select t3.supplier_name as supplierName,
+               COALESCE(t2.product_category, t6.product_name) as productCategory,
+               t1.id,
+               COALESCE(t2.specification_model, t5.model)     as specificationModel,
+               COALESCE(t2.unit, t5.unit)                     as unit,
+               t2.tax_rate                                    as taxRate,
+               t2.tax_inclusive_unit_price                    as taxInclusiveUnitPrice,
+               t2.tax_inclusive_total_price                    as taxInclusiveTotalPrice,
+               t2.tax_exclusive_total_price                    as taxExclusiveTotalPrice,
+               t1.inbound_num                                 as inboundNum,
+               t1.create_time                                 as createTime,
+               t1.create_time                                 as time,
+               t1.create_by                                   as createBy
+        from procurement_record_out t1
+                 left join sales_ledger_product t2 on t2.id = t1.sales_ledger_product_id
+                 left join purchase_ledger t3 on t3.id = t2.sales_ledger_id
+                 left join procurement_record_storage t4 on t4.id = t1.procurement_record_storage_id
+                 left join product_model t5 on t5.id = t4.product_model_id
+                 left join product t6 on t6.id = t5.product_id
     </select>
+
 </mapper>
\ No newline at end of file

--
Gitblit v1.9.3