home пре 2 година
родитељ
комит
0750142433

+ 5 - 0
hx-common/library-supply/src/main/java/com/fjhx/constants/LibrarySupplyLockConstant.java

@@ -20,4 +20,9 @@ public interface LibrarySupplyLockConstant {
      */
     String ORDER_CODE_LOCK = PREFIX + "orderCodeLock-";
 
+    /**
+     * 保证退货单编码唯一
+     */
+    String BACK_GOODS_CODE_LOCK = PREFIX + "backGoodsCodeLock-";
+
 }

+ 22 - 6
hx-common/library-supply/src/main/java/com/fjhx/entity/BackGoods.java

@@ -1,16 +1,15 @@
 package com.fjhx.entity;
 
-import java.math.BigDecimal;
-import com.baomidou.mybatisplus.annotation.IdType;
-import com.baomidou.mybatisplus.annotation.Version;
-import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.Version;
 import com.fjhx.base.BaseEntity;
-import com.baomidou.mybatisplus.annotation.TableField;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 
+import java.math.BigDecimal;
+
 /**
  * <p>
  * 退货单
@@ -30,6 +29,16 @@ public class BackGoods extends BaseEntity {
     private String code;
 
     /**
+     * 供应商ID
+     */
+    private Long supplierId;
+
+    /**
+     * 物品id
+     */
+    private Long goodsId;
+
+    /**
      * 申购单id
      */
     private Long applyPurchaseId;
@@ -60,7 +69,7 @@ public class BackGoods extends BaseEntity {
     private String remark;
 
     /**
-     * 退货状态  1审批中 2待退款 3部分退款 4已退款
+     * 退货状态  1审批中 2未通过 3已通过/待退款 4部分退款 5已退款
      */
     private Integer status;
 
@@ -71,4 +80,11 @@ public class BackGoods extends BaseEntity {
     @Version
     private Integer version;
 
+    /**
+     * 逻辑删除 0未删除 1已删除
+     */
+    @TableField(fill = FieldFill.INSERT)
+    @TableLogic
+    private Integer delFlag;
+
 }

+ 39 - 0
hx-common/library-supply/src/main/java/com/fjhx/enums/BackGoodsStatusEnum.java

@@ -0,0 +1,39 @@
+package com.fjhx.enums;
+
+import lombok.Getter;
+
+import java.util.HashMap;
+
+@Getter
+public enum BackGoodsStatusEnum {
+
+    IN_APPROVAL(1), // 审批中
+    NOT_PASS(2), // 未通过
+    PASS(3), // 已通过/待退款
+    PART_REFUND(4), // 部分退款
+    REFUND(5), // 已退款
+    ;
+
+    BackGoodsStatusEnum(Integer value) {
+        this.value = value;
+    }
+
+    private final Integer value;
+
+    private static final HashMap<Integer, BackGoodsStatusEnum> map = new HashMap<>();
+
+    static {
+        for (BackGoodsStatusEnum value : BackGoodsStatusEnum.values()) {
+            map.put(value.getValue(), value);
+        }
+    }
+
+    /**
+     * 根据value值获取枚举
+     */
+    public static BackGoodsStatusEnum get(Integer value) {
+        return map.get(value);
+    }
+
+
+}

+ 47 - 0
hx-common/library-supply/src/main/java/com/fjhx/service/BackGoodsService.java

@@ -3,6 +3,8 @@ package com.fjhx.service;
 import com.fjhx.base.BaseService;
 import com.fjhx.entity.BackGoods;
 
+import java.math.BigDecimal;
+
 /**
  * <p>
  * 退货单 服务类
@@ -13,4 +15,49 @@ import com.fjhx.entity.BackGoods;
  */
 public interface BackGoodsService extends BaseService<BackGoods> {
 
+    /**
+     * 发起退货
+     *
+     * @param backGoods 退货实体
+     */
+    void launchBackGoods(BackGoods backGoods);
+
+    /**
+     * 发起退货(指定前缀自动生成退货单号)
+     *
+     * @param backGoods  退货实体
+     * @param codePrefix 单号前缀
+     */
+    void launchBackGoodsAuto(BackGoods backGoods, String codePrefix);
+
+    /**
+     * 发起退货(默认前缀自动生成退货单号)
+     *
+     * @param backGoods 退货实体
+     */
+    void launchBackGoodsAuto(BackGoods backGoods);
+
+    /**
+     * 退款审批未通过
+     *
+     * @param backGoodsId 退款id
+     */
+    void flowNotPass(Long backGoodsId);
+
+    /**
+     * 退款审批通过
+     *
+     * @param backGoodsId 退款id
+     */
+    void flowPass(Long backGoodsId);
+
+    /**
+     * 退款
+     *
+     * @param backGoodsId 退款id
+     * @param price       退款金额
+     */
+    void refund(Long backGoodsId, BigDecimal price);
+
+
 }

+ 149 - 0
hx-common/library-supply/src/main/java/com/fjhx/service/impl/BackGoodsServiceImpl.java

@@ -1,11 +1,25 @@
 package com.fjhx.service.impl;
 
+import cn.hutool.core.date.DateUtil;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fjhx.base.BaseEntity;
+import com.fjhx.constants.ErrorMsgConstant;
+import com.fjhx.constants.LibrarySupplyLockConstant;
 import com.fjhx.entity.BackGoods;
+import com.fjhx.enums.BackGoodsStatusEnum;
 import com.fjhx.mapper.BackGoodsMapper;
 import com.fjhx.service.BackGoodsService;
+import com.fjhx.utils.Assert;
+import org.springblade.core.redis.lock.RedisLockClient;
+import org.springblade.core.secure.utils.AuthUtil;
 import org.springframework.stereotype.Service;
 
+import javax.annotation.Resource;
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.function.Supplier;
+
 /**
  * <p>
  * 退货单 服务实现类
@@ -17,4 +31,139 @@ import org.springframework.stereotype.Service;
 @Service
 public class BackGoodsServiceImpl extends ServiceImpl<BackGoodsMapper, BackGoods> implements BackGoodsService {
 
+    @Resource
+    private RedisLockClient redisLockClient;
+
+    @Override
+    public void launchBackGoods(BackGoods backGoods) {
+
+        launchBackGoodsFun(backGoods, () -> {
+            String code = backGoods.getCode();
+            Assert.notEmpty(code, "退货单号不能为空");
+
+            int count = count(Wrappers.<BackGoods>lambdaQuery()
+                    .eq(BackGoods::getCode, code)
+                    .eq(BaseEntity::getTenantId, AuthUtil.getTenantId()));
+            Assert.eqZero(count, "退货单号已存在");
+
+            return code;
+        });
+    }
+
+    @Override
+    public void launchBackGoodsAuto(BackGoods backGoods, String codePrefix) {
+        launchBackGoodsFun(backGoods, () -> createBackGoodsCode(codePrefix));
+    }
+
+    @Override
+    public void launchBackGoodsAuto(BackGoods backGoods) {
+        String codePrefix = "PB" + DateUtil.format(new Date(), "yyMMdd-");
+        launchBackGoodsAuto(backGoods, codePrefix);
+    }
+
+    @Override
+    public void flowNotPass(Long backGoodsId) {
+        updateStatus(backGoodsId, BackGoodsStatusEnum.NOT_PASS);
+    }
+
+    @Override
+    public void flowPass(Long backGoodsId) {
+        updateStatus(backGoodsId, BackGoodsStatusEnum.PASS);
+    }
+
+    @Override
+    public void refund(Long backGoodsId, BigDecimal price) {
+
+        BackGoods backGoods = getById(backGoodsId);
+        Assert.notEmpty(backGoods, "退款单不存在");
+
+        // 赋值回款金额
+        BigDecimal collectionPrice = backGoods.getCollectionPrice().add(price);
+        backGoods.setCollectionPrice(collectionPrice);
+
+        if (collectionPrice.compareTo(backGoods.getBackPrice()) >= 0) {
+            backGoods.setStatus(BackGoodsStatusEnum.REFUND.getValue());
+        } else {
+            backGoods.setStatus(BackGoodsStatusEnum.PART_REFUND.getValue());
+        }
+
+        boolean b = updateById(backGoods);
+        Assert.eqTrue(b, ErrorMsgConstant.SYSTEM_BUSY_ERROR);
+
+    }
+
+    /**
+     * 发起退货
+     *
+     * @param backGoods 退货实体
+     * @param fun       发起退货方法
+     */
+    private void launchBackGoodsFun(BackGoods backGoods, Supplier<String> fun) {
+        String tenantId = AuthUtil.getTenantId();
+
+        Boolean b = redisLockClient.lockFair(LibrarySupplyLockConstant.BACK_GOODS_CODE_LOCK + tenantId, () -> {
+
+            BigDecimal unitPrice = backGoods.getUnitPrice();
+            BigDecimal backQuantity = backGoods.getBackQuantity();
+
+            Assert.notEmpty(backGoods.getSupplierId(), "供应商id不能为空");
+            Assert.notEmpty(backGoods.getGoodsId(), "物品id不能为空");
+            Assert.notEmpty(unitPrice, "退货单价不能为空");
+            Assert.notEmpty(backQuantity, "退货数量不能为空");
+
+            // 退款金额
+            backGoods.setBackPrice(unitPrice.multiply(backQuantity));
+
+            // 回款金额
+            backGoods.setCollectionPrice(BigDecimal.ZERO);
+
+            // 审批中
+            backGoods.setStatus(BackGoodsStatusEnum.IN_APPROVAL.getValue());
+
+            String code = fun.get();
+            backGoods.setCode(code);
+            save(backGoods);
+
+            return true;
+        });
+
+        Assert.eqTrue(b, ErrorMsgConstant.SYSTEM_BUSY_ERROR);
+    }
+
+    /**
+     * 自动生成申购单编号
+     */
+    public String createBackGoodsCode(String codePrefix) {
+        StringBuilder builder = new StringBuilder();
+        builder.append(codePrefix);
+
+        BackGoods backGoods = getOne(Wrappers.<BackGoods>lambdaQuery()
+                .select(BackGoods::getCode)
+                .eq(BaseEntity::getTenantId, AuthUtil.getTenantId())
+                .likeRight(BackGoods::getCode, codePrefix)
+                .orderByDesc(BackGoods::getCode)
+                .last("limit 1")
+        );
+
+        if (backGoods == null) {
+            return builder.append("001").toString();
+        }
+
+        int codeNum = Integer.parseInt(backGoods.getCode().replace(codePrefix, ""));
+
+        return builder.append(codeNum < 9 ? "00" : codeNum < 99 ? "0" : "").append(codeNum + 1).toString();
+    }
+
+    /**
+     * 修改退款状态
+     */
+    private void updateStatus(Long backGoodsId, BackGoodsStatusEnum backGoodsStatusEnum) {
+        update(Wrappers.<BackGoods>lambdaUpdate()
+                .eq(BaseEntity::getId, backGoodsId)
+                .set(BackGoods::getStatus, backGoodsStatusEnum.getValue())
+                .set(BaseEntity::getUpdateUser, AuthUtil.getUserId())
+                .set(BaseEntity::getUpdateTime, new Date())
+        );
+    }
+
 }