24282 7 månader sedan
förälder
incheckning
54598fc751
23 ändrade filer med 666 tillägg och 78 borttagningar
  1. 22 0
      hx-victoriatourist/src/main/java/com/fjhx/victoriatourist/controller/jd/JdRefundController.java
  2. 0 34
      hx-victoriatourist/src/main/java/com/fjhx/victoriatourist/controller/jd/JdRefundDetailController.java
  3. 48 0
      hx-victoriatourist/src/main/java/com/fjhx/victoriatourist/controller/jd/JdRefundNotQualityCheckController.java
  4. 28 4
      hx-victoriatourist/src/main/java/com/fjhx/victoriatourist/controller/jd/JdRefundQualityCheckController.java
  5. 17 0
      hx-victoriatourist/src/main/java/com/fjhx/victoriatourist/entity/jd/dto/JdRefundNotQualityCheckDto.java
  6. 17 0
      hx-victoriatourist/src/main/java/com/fjhx/victoriatourist/entity/jd/dto/JdRefundNotQualityCheckSelectDto.java
  7. 5 0
      hx-victoriatourist/src/main/java/com/fjhx/victoriatourist/entity/jd/dto/JdRefundQualityCheckDto.java
  8. 5 0
      hx-victoriatourist/src/main/java/com/fjhx/victoriatourist/entity/jd/dto/JdRefundQualityCheckSelectDto.java
  9. 1 1
      hx-victoriatourist/src/main/java/com/fjhx/victoriatourist/entity/jd/po/JdRefundDetail.java
  10. 31 0
      hx-victoriatourist/src/main/java/com/fjhx/victoriatourist/entity/jd/po/JdRefundNotQualityCheck.java
  11. 5 27
      hx-victoriatourist/src/main/java/com/fjhx/victoriatourist/entity/jd/po/JdRefundQualityCheck.java
  12. 22 0
      hx-victoriatourist/src/main/java/com/fjhx/victoriatourist/entity/jd/vo/JdRefundNotQualityCheckVo.java
  13. 7 1
      hx-victoriatourist/src/main/java/com/fjhx/victoriatourist/entity/jd/vo/JdRefundQualityCheckVo.java
  14. 1 0
      hx-victoriatourist/src/main/java/com/fjhx/victoriatourist/entity/jd/vo/JdRefundVo.java
  15. 26 0
      hx-victoriatourist/src/main/java/com/fjhx/victoriatourist/mapper/jd/JdRefundNotQualityCheckMapper.java
  16. 33 0
      hx-victoriatourist/src/main/java/com/fjhx/victoriatourist/service/jd/JdRefundNotQualityCheckService.java
  17. 5 0
      hx-victoriatourist/src/main/java/com/fjhx/victoriatourist/service/jd/JdRefundService.java
  18. 139 0
      hx-victoriatourist/src/main/java/com/fjhx/victoriatourist/service/jd/impl/JdRefundNotQualityCheckServiceImpl.java
  19. 9 2
      hx-victoriatourist/src/main/java/com/fjhx/victoriatourist/service/jd/impl/JdRefundQualityCheckServiceImpl.java
  20. 214 0
      hx-victoriatourist/src/main/java/com/fjhx/victoriatourist/service/jd/impl/JdRefundServiceImpl.java
  21. 4 1
      hx-victoriatourist/src/main/java/com/fjhx/victoriatourist/utils/CodeEnum.java
  22. 18 0
      hx-victoriatourist/src/main/resources/mapper/jd/JdRefundNotQualityCheckMapper.xml
  23. 9 8
      hx-victoriatourist/src/main/resources/mapper/jd/JdRefundQualityCheckMapper.xml

+ 22 - 0
hx-victoriatourist/src/main/java/com/fjhx/victoriatourist/controller/jd/JdRefundController.java

@@ -1,11 +1,14 @@
 package com.fjhx.victoriatourist.controller.jd;
 
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.fjhx.victoriatourist.entity.jd.dto.JdRefundDto;
 import com.fjhx.victoriatourist.entity.jd.dto.JdRefundSelectDto;
 import com.fjhx.victoriatourist.entity.jd.vo.JdRefundVo;
 import com.fjhx.victoriatourist.service.jd.JdRefundService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
@@ -25,9 +28,28 @@ public class JdRefundController {
     @Autowired
     private JdRefundService JdRefundService;
 
+    /**
+     * 京东售后退货列表
+     */
     @GetMapping("/getPage")
     public Page<JdRefundVo> getPage(JdRefundSelectDto dto) {
         return JdRefundService.getPage(dto);
     }
 
+    /**
+     * 售后退货确认
+     */
+    @PostMapping("confirm")
+    public void confirm(@RequestBody JdRefundDto dto) {
+        JdRefundService.confirm(dto);
+    }
+
+    /**
+     * 售后退货取消确认
+     */
+    @PostMapping("cancelConfirm")
+    public void cancelConfirm(@RequestBody JdRefundDto dto) {
+        JdRefundService.cancelConfirm(dto);
+    }
+
 }

+ 0 - 34
hx-victoriatourist/src/main/java/com/fjhx/victoriatourist/controller/jd/JdRefundDetailController.java

@@ -1,34 +0,0 @@
-package com.fjhx.victoriatourist.controller.jd;
-
-import com.fjhx.victoriatourist.entity.jd.dto.JdRefundDetailSelectDto;
-import com.fjhx.victoriatourist.entity.jd.po.JdRefundDetail;
-import com.fjhx.victoriatourist.service.jd.JdRefundDetailService;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
-
-import java.util.List;
-
-
-/**
- * <p>
- * 京东售后退货明细 前端控制器
- * </p>
- *
- * @author
- * @since 2024-09-25
- */
-@RestController
-@RequestMapping("/jdRefundDetail")
-public class JdRefundDetailController {
-
-    @Autowired
-    private JdRefundDetailService jdRefundDetailService;
-
-    @GetMapping("/getList")
-    public List<JdRefundDetail> getList(JdRefundDetailSelectDto dto) {
-        return jdRefundDetailService.getList(dto);
-    }
-
-}

+ 48 - 0
hx-victoriatourist/src/main/java/com/fjhx/victoriatourist/controller/jd/JdRefundNotQualityCheckController.java

@@ -0,0 +1,48 @@
+package com.fjhx.victoriatourist.controller.jd;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.fjhx.victoriatourist.entity.jd.dto.JdRefundNotQualityCheckSelectDto;
+import com.fjhx.victoriatourist.entity.jd.po.JdRefundQualityCheck;
+import com.fjhx.victoriatourist.entity.jd.vo.JdRefundNotQualityCheckVo;
+import com.fjhx.victoriatourist.service.jd.JdRefundNotQualityCheckService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+
+/**
+ * <p>
+ * 京东售后退货待质检 前端控制器
+ * </p>
+ *
+ * @author
+ * @since 2024-09-28
+ */
+@RestController
+@RequestMapping("/jdRefundNotQualityCheck")
+public class JdRefundNotQualityCheckController {
+
+    @Autowired
+    private JdRefundNotQualityCheckService jdRefundNotQualityCheckService;
+
+    /**
+     * 京东售后退货待质检分页
+     */
+    @PostMapping("/page")
+    public Page<JdRefundNotQualityCheckVo> page(@RequestBody JdRefundNotQualityCheckSelectDto dto) {
+        return jdRefundNotQualityCheckService.getPage(dto);
+    }
+
+    /**
+     * 提交质检
+     */
+    @PostMapping("/submitQualityCheck")
+    public void submitQualityCheck(@RequestBody List<JdRefundQualityCheck> dto) {
+        jdRefundNotQualityCheckService.submitQualityCheck(dto);
+    }
+
+}

+ 28 - 4
hx-victoriatourist/src/main/java/com/fjhx/victoriatourist/controller/jd/JdRefundQualityCheckController.java

@@ -5,8 +5,7 @@ import com.fjhx.victoriatourist.entity.jd.dto.JdRefundQualityCheckSelectDto;
 import com.fjhx.victoriatourist.entity.jd.vo.JdRefundQualityCheckVo;
 import com.fjhx.victoriatourist.service.jd.JdRefundQualityCheckService;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
@@ -29,9 +28,34 @@ public class JdRefundQualityCheckController {
     /**
      * 京东售后退货质检分页
      */
-    @PostMapping("/page")
-    public Page<JdRefundQualityCheckVo> page(@RequestBody JdRefundQualityCheckSelectDto dto) {
+    @GetMapping("/getPage")
+    public Page<JdRefundQualityCheckVo> page(JdRefundQualityCheckSelectDto dto) {
         return jdRefundQualityCheckService.getPage(dto);
     }
 
+    ///**
+    // * 添加京东售后退货质检
+    // */
+    //@PostMapping("/add")
+    //public void add(@RequestBody JdRefundQualityCheckDto dto) {
+    //    jdRefundQualityCheckService.add(dto);
+    //}
+    //
+    ///**
+    // * 删除京东售后退货质检
+    // */
+    //@PostMapping("/delete")
+    //public void delete(@RequestBody JdRefundQualityCheckDto dto) {
+    //    jdRefundQualityCheckService.delete(dto);
+    //}
+    //
+    ///**
+    // * 京东售后退货质检
+    // */
+    //@PostMapping("/edit")
+    //public void edit(@RequestBody JdRefundQualityCheckDto dto) {
+    //    jdRefundQualityCheckService.edit(dto);
+    //}
+
+
 }

+ 17 - 0
hx-victoriatourist/src/main/java/com/fjhx/victoriatourist/entity/jd/dto/JdRefundNotQualityCheckDto.java

@@ -0,0 +1,17 @@
+package com.fjhx.victoriatourist.entity.jd.dto;
+
+import com.fjhx.victoriatourist.entity.jd.po.JdRefundNotQualityCheck;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 京东售后退货待质检新增编辑入参实体
+ *
+ * @author
+ * @since 2024-09-28
+ */
+@Getter
+@Setter
+public class JdRefundNotQualityCheckDto extends JdRefundNotQualityCheck {
+
+}

+ 17 - 0
hx-victoriatourist/src/main/java/com/fjhx/victoriatourist/entity/jd/dto/JdRefundNotQualityCheckSelectDto.java

@@ -0,0 +1,17 @@
+package com.fjhx.victoriatourist.entity.jd.dto;
+
+import com.ruoyi.common.core.domain.BaseSelectDto;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 京东售后退货待质检列表查询入参实体
+ *
+ * @author
+ * @since 2024-09-28
+ */
+@Getter
+@Setter
+public class JdRefundNotQualityCheckSelectDto extends BaseSelectDto {
+
+}

+ 5 - 0
hx-victoriatourist/src/main/java/com/fjhx/victoriatourist/entity/jd/dto/JdRefundQualityCheckDto.java

@@ -14,4 +14,9 @@ import lombok.Setter;
 @Setter
 public class JdRefundQualityCheckDto extends JdRefundQualityCheck {
 
+    /**
+     * 京东售后明细id
+     */
+    private Long jdRefundDetailId;
+
 }

+ 5 - 0
hx-victoriatourist/src/main/java/com/fjhx/victoriatourist/entity/jd/dto/JdRefundQualityCheckSelectDto.java

@@ -14,4 +14,9 @@ import lombok.Setter;
 @Setter
 public class JdRefundQualityCheckSelectDto extends BaseSelectDto {
 
+    /**
+     * 状态 0待质检 1已质检
+     */
+    private Integer status;
+
 }

+ 1 - 1
hx-victoriatourist/src/main/java/com/fjhx/victoriatourist/entity/jd/po/JdRefundDetail.java

@@ -97,7 +97,7 @@ public class JdRefundDetail extends BasePo {
     private String upc;
 
     /**
-     * 状态 0待确认 1待质检 2部分质检 3已质检
+     * 状态 0待确认 1已确认
      */
     private Integer status;
 

+ 31 - 0
hx-victoriatourist/src/main/java/com/fjhx/victoriatourist/entity/jd/po/JdRefundNotQualityCheck.java

@@ -0,0 +1,31 @@
+package com.fjhx.victoriatourist.entity.jd.po;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.ruoyi.common.core.domain.BasePo;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * <p>
+ * 京东售后退货待质检
+ * </p>
+ *
+ * @author
+ * @since 2024-09-28
+ */
+@Getter
+@Setter
+@TableName("jd_refund_not_quality_check")
+public class JdRefundNotQualityCheck extends BasePo {
+
+    /**
+     * 产品id
+     */
+    private Long productId;
+
+    /**
+     * 待质检数量
+     */
+    private Integer quantity;
+
+}

+ 5 - 27
hx-victoriatourist/src/main/java/com/fjhx/victoriatourist/entity/jd/po/JdRefundQualityCheck.java

@@ -5,8 +5,6 @@ import com.ruoyi.common.core.domain.BasePo;
 import lombok.Getter;
 import lombok.Setter;
 
-import java.util.Date;
-
 /**
  * <p>
  * 京东售后退货质检
@@ -26,43 +24,23 @@ public class JdRefundQualityCheck extends BasePo {
     private String code;
 
     /**
-     * 京东售后id
-     */
-    private Long jdRefund;
-
-    /**
      * 产品id
      */
     private Long productId;
 
     /**
-     * 需要质检数量
-     */
-    private Integer totalToInspect;
-
-    /**
-     * 质检合格数量
+     * 良品数量
      */
     private Integer qualifiedCount;
 
     /**
-     * 质检不合格数量
-     */
-    private Integer unqualifiedCount;
-
-    /**
-     * 质检时间
-     */
-    private Date inspectionTime;
-
-    /**
-     * 质检人员
+     * 次品数量
      */
-    private Long inspectionUserId;
+    private Integer defectiveCount;
 
     /**
-     * 状态 0待质检 1已质检
+     * 报废数量
      */
-    private Integer status;
+    private Integer scrappedCount;
 
 }

+ 22 - 0
hx-victoriatourist/src/main/java/com/fjhx/victoriatourist/entity/jd/vo/JdRefundNotQualityCheckVo.java

@@ -0,0 +1,22 @@
+package com.fjhx.victoriatourist.entity.jd.vo;
+
+import com.fjhx.victoriatourist.entity.jd.po.JdRefundNotQualityCheck;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 京东售后退货待质检列表查询返回值实体
+ *
+ * @author
+ * @since 2024-09-28
+ */
+@Getter
+@Setter
+public class JdRefundNotQualityCheckVo extends JdRefundNotQualityCheck {
+
+    private String productName;
+    private String productCustomCode;
+    private String productSpec;
+    private String productUnit;
+
+}

+ 7 - 1
hx-victoriatourist/src/main/java/com/fjhx/victoriatourist/entity/jd/vo/JdRefundQualityCheckVo.java

@@ -13,5 +13,11 @@ import lombok.Setter;
 @Getter
 @Setter
 public class JdRefundQualityCheckVo extends JdRefundQualityCheck {
-
+    private String productName;
+    private String productCustomCode;
+    private String productSpec;
+    private String productUnit;
+    private String userName;
+    private String outNo;
+    private String partCode;
 }

+ 1 - 0
hx-victoriatourist/src/main/java/com/fjhx/victoriatourist/entity/jd/vo/JdRefundVo.java

@@ -22,5 +22,6 @@ public class JdRefundVo extends JdRefund {
     private String wareName;
     private String confirmReceiptPeople;
     private Integer status;
+    private Long jdRefundDetailId;
 
 }

+ 26 - 0
hx-victoriatourist/src/main/java/com/fjhx/victoriatourist/mapper/jd/JdRefundNotQualityCheckMapper.java

@@ -0,0 +1,26 @@
+package com.fjhx.victoriatourist.mapper.jd;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.fjhx.victoriatourist.entity.jd.po.JdRefundNotQualityCheck;
+import com.fjhx.victoriatourist.entity.jd.vo.JdRefundNotQualityCheckVo;
+import com.ruoyi.common.utils.wrapper.IWrapper;
+import org.apache.ibatis.annotations.Param;
+
+
+/**
+ * <p>
+ * 京东售后退货待质检 Mapper 接口
+ * </p>
+ *
+ * @author
+ * @since 2024-09-28
+ */
+public interface JdRefundNotQualityCheckMapper extends BaseMapper<JdRefundNotQualityCheck> {
+
+    /**
+     * 京东售后退货待质检分页
+     */
+    Page<JdRefundNotQualityCheckVo> getPage(@Param("page") Page<Object> page, @Param("ew") IWrapper<JdRefundNotQualityCheck> wrapper);
+
+}

+ 33 - 0
hx-victoriatourist/src/main/java/com/fjhx/victoriatourist/service/jd/JdRefundNotQualityCheckService.java

@@ -0,0 +1,33 @@
+package com.fjhx.victoriatourist.service.jd;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.fjhx.victoriatourist.entity.jd.dto.JdRefundNotQualityCheckSelectDto;
+import com.fjhx.victoriatourist.entity.jd.po.JdRefundNotQualityCheck;
+import com.fjhx.victoriatourist.entity.jd.po.JdRefundQualityCheck;
+import com.fjhx.victoriatourist.entity.jd.vo.JdRefundNotQualityCheckVo;
+import com.ruoyi.common.core.service.BaseService;
+
+import java.util.List;
+
+
+/**
+ * <p>
+ * 京东售后退货待质检 服务类
+ * </p>
+ *
+ * @author
+ * @since 2024-09-28
+ */
+public interface JdRefundNotQualityCheckService extends BaseService<JdRefundNotQualityCheck> {
+
+    /**
+     * 京东售后退货待质检分页
+     */
+    Page<JdRefundNotQualityCheckVo> getPage(JdRefundNotQualityCheckSelectDto dto);
+
+    /**
+     * 提交质检
+     */
+    void submitQualityCheck(List<JdRefundQualityCheck> dto);
+
+}

+ 5 - 0
hx-victoriatourist/src/main/java/com/fjhx/victoriatourist/service/jd/JdRefundService.java

@@ -1,6 +1,7 @@
 package com.fjhx.victoriatourist.service.jd;
 
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.fjhx.victoriatourist.entity.jd.dto.JdRefundDto;
 import com.fjhx.victoriatourist.entity.jd.dto.JdRefundSelectDto;
 import com.fjhx.victoriatourist.entity.jd.po.JdRefund;
 import com.fjhx.victoriatourist.entity.jd.vo.JdRefundVo;
@@ -19,4 +20,8 @@ public interface JdRefundService extends BaseService<JdRefund> {
 
     Page<JdRefundVo> getPage(JdRefundSelectDto dto);
 
+    void confirm(JdRefundDto dto);
+
+    void cancelConfirm(JdRefundDto dto);
+
 }

+ 139 - 0
hx-victoriatourist/src/main/java/com/fjhx/victoriatourist/service/jd/impl/JdRefundNotQualityCheckServiceImpl.java

@@ -0,0 +1,139 @@
+package com.fjhx.victoriatourist.service.jd.impl;
+
+import cn.hutool.core.util.ObjectUtil;
+import com.baomidou.dynamic.datasource.annotation.DSTransactional;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fjhx.item.entity.product.po.ProductInfo;
+import com.fjhx.item.service.product.ProductInfoService;
+import com.fjhx.victoriatourist.entity.jd.dto.JdRefundNotQualityCheckSelectDto;
+import com.fjhx.victoriatourist.entity.jd.po.JdRefundNotQualityCheck;
+import com.fjhx.victoriatourist.entity.jd.po.JdRefundQualityCheck;
+import com.fjhx.victoriatourist.entity.jd.vo.JdRefundNotQualityCheckVo;
+import com.fjhx.victoriatourist.mapper.jd.JdRefundNotQualityCheckMapper;
+import com.fjhx.victoriatourist.service.jd.JdRefundNotQualityCheckService;
+import com.fjhx.victoriatourist.service.jd.JdRefundQualityCheckService;
+import com.fjhx.victoriatourist.utils.CodeEnum;
+import com.fjhx.wms.entity.stock.po.Stock;
+import com.fjhx.wms.service.stock.StockService;
+import com.ruoyi.common.exception.ServiceException;
+import com.ruoyi.common.utils.wrapper.IWrapper;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+
+import static com.fjhx.victoriatourist.service.jd.impl.JdRefundServiceImpl.WAREHOUSE_ID;
+import static com.fjhx.victoriatourist.service.jd.impl.JdRefundServiceImpl.getUpdateStockSql;
+
+
+/**
+ * <p>
+ * 京东售后退货待质检 服务实现类
+ * </p>
+ *
+ * @author
+ * @since 2024-09-28
+ */
+@Service
+public class JdRefundNotQualityCheckServiceImpl extends ServiceImpl<JdRefundNotQualityCheckMapper, JdRefundNotQualityCheck> implements JdRefundNotQualityCheckService {
+
+    @Autowired
+    private JdRefundQualityCheckService qualityCheckService;
+
+    @Autowired
+    private StockService stockService;
+
+    @Autowired
+    private ProductInfoService productInfoService;
+
+    @Override
+    public Page<JdRefundNotQualityCheckVo> getPage(JdRefundNotQualityCheckSelectDto dto) {
+        IWrapper<JdRefundNotQualityCheck> wrapper = getWrapper();
+        wrapper.orderByDesc("jrnqc", JdRefundNotQualityCheck::getId);
+        wrapper.gt("jrnqc", JdRefundNotQualityCheck::getQuantity, 0);
+        Page<JdRefundNotQualityCheckVo> page = this.baseMapper.getPage(dto.getPage(), wrapper);
+        return page;
+    }
+
+    @DSTransactional
+    @Override
+    public synchronized void submitQualityCheck(List<JdRefundQualityCheck> dto) {
+
+        Map<Long, JdRefundQualityCheck> qualityCheckMap = dto.stream()
+                .peek(item -> item.setId(null))
+                .peek(item -> item.setQualifiedCount(ObjectUtil.defaultIfNull(item.getQualifiedCount(), 0)))
+                .peek(item -> item.setDefectiveCount(ObjectUtil.defaultIfNull(item.getDefectiveCount(), 0)))
+                .peek(item -> item.setScrappedCount(ObjectUtil.defaultIfNull(item.getScrappedCount(), 0)))
+                .filter(item -> item.getQualifiedCount() + item.getDefectiveCount() + item.getScrappedCount() > 0)
+                .collect(Collectors.toMap(JdRefundQualityCheck::getProductId, Function.identity()));
+
+        if (qualityCheckMap.isEmpty()) {
+            return;
+        }
+
+        // 获取质检产品
+        Set<Long> productIdSet = qualityCheckMap.keySet();
+
+        // 验证质检数
+        List<JdRefundNotQualityCheck> list = list(q -> q.in(JdRefundNotQualityCheck::getProductId, productIdSet));
+        Map<Long, JdRefundNotQualityCheck> notQualityCheckMap = list.stream().collect(Collectors.toMap(JdRefundNotQualityCheck::getProductId, Function.identity()));
+
+        String code = CodeEnum.REFUND_QUALITY_CHECK.getCode();
+
+        Collection<JdRefundQualityCheck> jdRefundQualityChecks = qualityCheckMap.values();
+        for (JdRefundQualityCheck jdRefundQualityCheck : jdRefundQualityChecks) {
+
+            jdRefundQualityCheck.setCode(code);
+
+            // 产品id
+            Long productId = jdRefundQualityCheck.getProductId();
+
+            // 待质检数量
+            JdRefundNotQualityCheck jdRefundNotQualityCheck = notQualityCheckMap.get(productId);
+
+            int notCheckCount = jdRefundNotQualityCheck == null ? 0 : jdRefundNotQualityCheck.getQuantity();
+
+            Integer qualifiedCount = jdRefundQualityCheck.getQualifiedCount();
+            Integer defectiveCount = jdRefundQualityCheck.getDefectiveCount();
+            Integer scrappedCount = jdRefundQualityCheck.getScrappedCount();
+
+            int totalCheckCount = qualifiedCount + defectiveCount + scrappedCount;
+
+            if (notCheckCount < totalCheckCount) {
+                ProductInfo productInfo = productInfoService.getById(productId);
+
+                throw new ServiceException("产品【" + productInfo.getCustomCode() + "】待质检数量为"
+                        + notCheckCount + ", 当前质检数量为" + totalCheckCount);
+            }
+
+            // 修改待质检数量
+            jdRefundNotQualityCheck.setQuantity(notCheckCount - totalCheckCount);
+
+            // 修改库存
+            stockService.update(q -> q
+                    .eq(Stock::getProductId, jdRefundQualityCheck.getProductId())
+                    .eq(Stock::getWarehouseId, WAREHOUSE_ID)
+                    // 良品入库
+                    .setSql(qualifiedCount > 0, "quantity = quantity + " + qualifiedCount)
+                    // 次品入库
+                    .setSql(defectiveCount > 0, getUpdateStockSql(3, defectiveCount))
+                    // 减少锁定库存
+                    .setSql(qualifiedCount + defectiveCount > 0, getUpdateStockSql(2, qualifiedCount + defectiveCount))
+            );
+
+        }
+
+        // 保存质检记录
+        qualityCheckService.saveBatch(jdRefundQualityChecks);
+
+        // 修改待质检数量
+        updateBatchById(list);
+    }
+
+}

+ 9 - 2
hx-victoriatourist/src/main/java/com/fjhx/victoriatourist/service/jd/impl/JdRefundQualityCheckServiceImpl.java

@@ -8,6 +8,7 @@ import com.fjhx.victoriatourist.entity.jd.vo.JdRefundQualityCheckVo;
 import com.fjhx.victoriatourist.mapper.jd.JdRefundQualityCheckMapper;
 import com.fjhx.victoriatourist.service.jd.JdRefundQualityCheckService;
 import com.ruoyi.common.utils.wrapper.IWrapper;
+import com.ruoyi.common.utils.wrapper.SqlField;
 import org.springframework.stereotype.Service;
 
 
@@ -24,8 +25,14 @@ public class JdRefundQualityCheckServiceImpl extends ServiceImpl<JdRefundQuality
 
     @Override
     public Page<JdRefundQualityCheckVo> getPage(JdRefundQualityCheckSelectDto dto) {
-        IWrapper<JdRefundQualityCheck> wrapper = getWrapper();
-        wrapper.orderByDesc("jrqc", JdRefundQualityCheck::getId);
+        IWrapper<JdRefundQualityCheck> wrapper = getWrapper()
+                .keyword(dto.getKeyword(),
+                        new SqlField("jrqc.code"),
+                        new SqlField("pi.name"),
+                        new SqlField("pi.custom_code"),
+                        new SqlField("su.user_name")
+                )
+                .orderByDesc("jrqc", JdRefundQualityCheck::getId);
         Page<JdRefundQualityCheckVo> page = this.baseMapper.getPage(dto.getPage(), wrapper);
         return page;
     }

+ 214 - 0
hx-victoriatourist/src/main/java/com/fjhx/victoriatourist/service/jd/impl/JdRefundServiceImpl.java

@@ -1,18 +1,41 @@
 package com.fjhx.victoriatourist.service.jd.impl;
 
+import cn.hutool.core.util.StrUtil;
+import com.alibaba.fastjson2.JSONObject;
+import com.baomidou.dynamic.datasource.annotation.DSTransactional;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fjhx.common.utils.Assert;
+import com.fjhx.item.entity.product.po.ProductInfo;
+import com.fjhx.item.service.product.ProductInfoService;
+import com.fjhx.victoriatourist.entity.jd.dto.JdRefundDto;
 import com.fjhx.victoriatourist.entity.jd.dto.JdRefundSelectDto;
 import com.fjhx.victoriatourist.entity.jd.po.JdRefund;
 import com.fjhx.victoriatourist.entity.jd.po.JdRefundDetail;
+import com.fjhx.victoriatourist.entity.jd.po.JdRefundNotQualityCheck;
 import com.fjhx.victoriatourist.entity.jd.vo.JdRefundVo;
 import com.fjhx.victoriatourist.mapper.jd.JdRefundMapper;
+import com.fjhx.victoriatourist.service.jd.JdRefundDetailService;
+import com.fjhx.victoriatourist.service.jd.JdRefundNotQualityCheckService;
 import com.fjhx.victoriatourist.service.jd.JdRefundService;
+import com.fjhx.wms.entity.stock.po.Stock;
+import com.fjhx.wms.service.stock.StockService;
+import com.ruoyi.common.constant.StatusConstant;
+import com.ruoyi.common.core.domain.BaseIdPo;
 import com.ruoyi.common.utils.wrapper.IWrapper;
 import com.ruoyi.common.utils.wrapper.SqlField;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import java.math.BigDecimal;
 import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.function.Function;
+import java.util.stream.Collectors;
 
 
 /**
@@ -26,6 +49,37 @@ import java.util.Date;
 @Service
 public class JdRefundServiceImpl extends ServiceImpl<JdRefundMapper, JdRefund> implements JdRefundService {
 
+    // 仓库id
+    public final static Long WAREHOUSE_ID = 1774616929466654722L;
+    private static final String sql = "victoriatourist_json=JSON_SET(" +
+            "victoriatourist_json,'$.{}',(json_extract(victoriatourist_json,'$.{}'){}{}))";
+    private static final Map<Integer, String[]> typeMappings = new HashMap<Integer, String[]>() {{
+        put(1, new String[]{"frozenQuantity", "+"});
+        put(2, new String[]{"frozenQuantity", "-"});
+        put(3, new String[]{"defectiveQuantity", "+"});
+        put(4, new String[]{"defectiveQuantity", "-"});
+    }};
+    @Autowired
+    private JdRefundDetailService jdRefundDetailService;
+    @Autowired
+    private ProductInfoService productInfoService;
+    @Autowired
+    private StockService stockService;
+    @Autowired
+    private JdRefundNotQualityCheckService jdRefundNotQualityCheckService;
+
+    /**
+     * @param type 1冻结新增 2冻结减少 3次品新增 4次品减少
+     * @return sql
+     */
+    public static String getUpdateStockSql(Integer type, Number quantity) {
+        String[] mapping = typeMappings.get(type);
+        if (mapping == null) {
+            throw new IllegalArgumentException("type参数错误");
+        }
+        return StrUtil.format(sql, mapping[0], mapping[0], mapping[1], quantity);
+    }
+
     @Override
     public Page<JdRefundVo> getPage(JdRefundSelectDto dto) {
 
@@ -49,4 +103,164 @@ public class JdRefundServiceImpl extends ServiceImpl<JdRefundMapper, JdRefund> i
         return baseMapper.getPage(dto.getPage(), wrapper);
     }
 
+    @DSTransactional
+    @Override
+    public void confirm(JdRefundDto dto) {
+        JdRefundDetail jdRefundDetail = jdRefundDetailService.getById(dto.getId());
+        Assert.notEmpty(jdRefundDetail, "京东售后明细不存在");
+
+        Integer status = jdRefundDetail.getStatus();
+        Assert.eqZero(status, "京东售后单已确认");
+
+        // 获取产品编号
+        String wareId = jdRefundDetail.getWareId();
+        ProductInfo productInfo = productInfoService.getOne(q -> q.eq(ProductInfo::getCustomCode, wareId));
+        Assert.notEmpty(productInfo, "未知产品编码:" + wareId);
+
+        // key: product_id  value:产品数量
+        Map<Long, Integer> map = new HashMap<>();
+
+        // 添加质检信息
+        setJdRefundQualityCheck(map, productInfo, jdRefundDetail, 1);
+
+        // 修改为已确认
+        jdRefundDetail.setStatus(StatusConstant.YES);
+        jdRefundDetailService.updateById(jdRefundDetail);
+
+        // 新增锁定库存
+        Set<Long> productIdSet = map.keySet();
+
+        Map<Long, JdRefundNotQualityCheck> notQualityCheckMap = jdRefundNotQualityCheckService
+                .list(q -> q.in(JdRefundNotQualityCheck::getProductId, productIdSet))
+                .stream().collect(Collectors.toMap(JdRefundNotQualityCheck::getProductId, Function.identity()));
+
+        Map<Long, Stock> stockMap = stockService
+                .list(q -> q.in(Stock::getProductId, productIdSet).eq(Stock::getWarehouseId, WAREHOUSE_ID))
+                .stream().collect(Collectors.toMap(Stock::getProductId, Function.identity()));
+
+        map.forEach((k, v) -> {
+
+            // 添加未质检库存
+            JdRefundNotQualityCheck jdRefundNotQualityCheck = notQualityCheckMap.get(k);
+            if (jdRefundNotQualityCheck == null) {
+                JdRefundNotQualityCheck saveJdRefundNotQualityCheck = new JdRefundNotQualityCheck();
+                saveJdRefundNotQualityCheck.setProductId(k);
+                saveJdRefundNotQualityCheck.setQuantity(v);
+                jdRefundNotQualityCheckService.save(saveJdRefundNotQualityCheck);
+            } else {
+                jdRefundNotQualityCheckService.update(q -> q
+                        .eq(BaseIdPo::getId, jdRefundNotQualityCheck.getId())
+                        .setSql("quantity = quantity + " + v)
+                );
+            }
+
+            // 修改库存
+            Stock stock = stockMap.get(k);
+            if (stock == null) {
+                JSONObject victoriatouristJson = new JSONObject();
+                victoriatouristJson.put("frozenQuantity", v);
+                victoriatouristJson.put("defectiveQuantity", 0);
+
+                Stock saveStock = new Stock();
+                saveStock.setWarehouseId(WAREHOUSE_ID);
+                saveStock.setProductId(k);
+                saveStock.setQuantity(BigDecimal.ZERO);
+                saveStock.setVictoriatouristJson(victoriatouristJson.toJSONString());
+                stockService.save(saveStock);
+            } else {
+                stockService.update(q -> q
+                        .eq(BaseIdPo::getId, stock.getId())
+                        .setSql(getUpdateStockSql(1, v))
+                );
+            }
+
+        });
+
+    }
+
+    @DSTransactional
+    @Override
+    public void cancelConfirm(JdRefundDto dto) {
+        JdRefundDetail jdRefundDetail = jdRefundDetailService.getById(dto.getId());
+        Assert.notEmpty(jdRefundDetail, "京东售后明细不存在");
+
+        Integer status = jdRefundDetail.getStatus();
+        Assert.eqOne(status, "京东售后单未确认");
+
+        // 获取产品编号
+        String wareId = jdRefundDetail.getWareId();
+        ProductInfo productInfo = productInfoService.getOne(q -> q.eq(ProductInfo::getCustomCode, wareId));
+        Assert.notEmpty(productInfo, "未知产品编码:" + wareId);
+
+        // key: product_id  value:产品数量
+        Map<Long, Integer> map = new HashMap<>();
+
+        // 添加质检信息
+        setJdRefundQualityCheck(map, productInfo, jdRefundDetail, 1);
+
+        // 修改为待确认
+        jdRefundDetail.setStatus(StatusConstant.NO);
+        jdRefundDetailService.updateById(jdRefundDetail);
+
+        // 新增锁定库存
+        Set<Long> productIdSet = map.keySet();
+
+        Map<Long, JdRefundNotQualityCheck> notQualityCheckMap = jdRefundNotQualityCheckService
+                .list(q -> q.in(JdRefundNotQualityCheck::getProductId, productIdSet))
+                .stream().collect(Collectors.toMap(JdRefundNotQualityCheck::getProductId, Function.identity()));
+
+        Map<Long, Stock> stockMap = stockService
+                .list(q -> q.in(Stock::getProductId, productIdSet).eq(Stock::getWarehouseId, WAREHOUSE_ID))
+                .stream().collect(Collectors.toMap(Stock::getProductId, Function.identity()));
+
+        map.forEach((k, v) -> {
+
+            // 修改未质检库存
+            JdRefundNotQualityCheck jdRefundNotQualityCheck = notQualityCheckMap.get(k);
+            Assert.notEmpty(jdRefundNotQualityCheck, "未质检库存少于撤回售后退货数量,撤回失败");
+            boolean update = jdRefundNotQualityCheckService.update(q -> q
+                    .eq(BaseIdPo::getId, jdRefundNotQualityCheck.getId())
+                    .setSql("quantity = quantity - " + v)
+                    .ge(JdRefundNotQualityCheck::getQuantity, v)
+            );
+            Assert.eqTrue(update, "未质检库存少于撤回售后退货数量,撤回失败");
+
+            // 修改库存
+            Stock stock = stockMap.get(k);
+            Assert.notEmpty(stock, "冻结少于撤回售后退货数量,撤回失败");
+            boolean stockUpdate = stockService.update(Wrappers.<Stock>update()
+                    .eq("id", stock.getId())
+                    .setSql(getUpdateStockSql(2, v))
+                    .geSql("json_extract(victoriatourist_json,'$.frozenQuantity')", v.toString())
+            );
+            Assert.eqTrue(stockUpdate, "冻结库存少于撤回售后退货数量,撤回失败");
+
+        });
+
+    }
+
+    /**
+     * 赋值需要质检的商品
+     */
+    private void setJdRefundQualityCheck(Map<Long, Integer> map, ProductInfo productInfo, JdRefundDetail jdRefundDetail, Integer number) {
+        String victoriatouristJson = productInfo.getVictoriatouristJson();
+        JSONObject victoriatourist = JSONObject.parseObject(victoriatouristJson);
+
+        // 如果是组合商品,拆分组合
+        if (StatusConstant.YES.equals(victoriatourist.getInteger("combination"))) {
+            List<JSONObject> list = victoriatourist.getJSONArray("productCombinationList").toJavaList(JSONObject.class);
+            list.forEach(item -> {
+                Long linkProductId = item.getLong("linkProductId");
+                ProductInfo linkProductInfo = productInfoService.getById(linkProductId);
+                Assert.notEmpty(linkProductInfo, "未知组合商品id:" + linkProductId);
+                setJdRefundQualityCheck(map, linkProductInfo, jdRefundDetail, item.getInteger("linkQuantity") * number);
+            });
+        }
+        // 不是组合
+        else {
+            Long productInfoId = productInfo.getId();
+            map.put(productInfoId, map.getOrDefault(productInfoId, 0) + number);
+        }
+    }
+
 }

+ 4 - 1
hx-victoriatourist/src/main/java/com/fjhx/victoriatourist/utils/CodeEnum.java

@@ -8,6 +8,7 @@ import cn.hutool.extra.spring.SpringUtil;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.fjhx.victoriatourist.service.abnormal.AbnormalInfoService;
 import com.fjhx.victoriatourist.service.jd.JdBackQualityDetailsService;
+import com.fjhx.victoriatourist.service.jd.JdRefundQualityCheckService;
 import com.fjhx.victoriatourist.service.order.OrderInfoService;
 import com.fjhx.victoriatourist.service.stock.StockTransferService;
 import com.ruoyi.common.exception.ServiceException;
@@ -26,7 +27,9 @@ public enum CodeEnum {
     //京东退货质检
     JD_BACK_QUALITY("PA", "yyMM-", "code", 3, JdBackQualityDetailsService.class),
     //异常记录
-    ABNORMAL("PO", "yyMM-", "link_code", 3, AbnormalInfoService.class);
+    ABNORMAL("PO", "yyMM-", "link_code", 3, AbnormalInfoService.class),
+    //京东退货质检
+    REFUND_QUALITY_CHECK("RQC", "yyMM-", "code", 3, JdRefundQualityCheckService.class);
 
     // 编码前缀
     private final String prefix;

+ 18 - 0
hx-victoriatourist/src/main/resources/mapper/jd/JdRefundNotQualityCheckMapper.xml

@@ -0,0 +1,18 @@
+<?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="com.fjhx.victoriatourist.mapper.jd.JdRefundNotQualityCheckMapper">
+
+    <select id="getPage" resultType="com.fjhx.victoriatourist.entity.jd.vo.JdRefundNotQualityCheckVo">
+        select jrnqc.id,
+               jrnqc.product_id,
+               jrnqc.quantity,
+               pi.name        as product_name,
+               pi.custom_code as product_custom_code,
+               pi.spec        as product_spec,
+               pi.unit        as product_unit
+        from jd_refund_not_quality_check jrnqc
+                 Left Join bytesailing_item.product_info pi ON jrnqc.product_id = pi.id
+            ${ew.customSqlSegment}
+    </select>
+
+</mapper>

+ 9 - 8
hx-victoriatourist/src/main/resources/mapper/jd/JdRefundQualityCheckMapper.xml

@@ -4,19 +4,20 @@
     <select id="getPage" resultType="com.fjhx.victoriatourist.entity.jd.vo.JdRefundQualityCheckVo">
         select jrqc.id,
                jrqc.code,
-               jrqc.jd_refund,
                jrqc.product_id,
-               jrqc.total_to_inspect,
                jrqc.qualified_count,
-               jrqc.unqualified_count,
-               jrqc.inspection_time,
-               jrqc.inspection_user_id,
-               jrqc.status,
+               jrqc.defective_count,
+               jrqc.scrapped_count,
                jrqc.create_user,
                jrqc.create_time,
-               jrqc.update_user,
-               jrqc.update_time
+               pi.name        as product_name,
+               pi.custom_code as product_custom_code,
+               pi.spec        as product_spec,
+               pi.unit        as product_unit,
+               su.user_name
         from jd_refund_quality_check jrqc
+                 Left Join bytesailing_item.product_info pi ON jrqc.product_id = pi.id
+                 left join bytesailing_base.sys_user su ON jrqc.create_user = su.user_id
             ${ew.customSqlSegment}
     </select>