Browse Source

Merge branch 'dev_mall_20221201' into online

liujunchi 2 năm trước cách đây
mục cha
commit
6612515160
29 tập tin đã thay đổi với 891 bổ sung44 xóa
  1. 5 0
      cooleshow-api/src/main/java/com/yonge/cooleshow/api/feign/AdminFeignService.java
  2. 3 0
      cooleshow-api/src/main/java/com/yonge/cooleshow/api/feign/StudentFeignService.java
  3. 67 0
      cooleshow-api/src/main/java/com/yonge/cooleshow/api/feign/dto/StudentWrapper.java
  4. 7 0
      cooleshow-api/src/main/java/com/yonge/cooleshow/api/feign/fallback/AdminFeignServiceFallback.java
  5. 1 0
      cooleshow-api/src/main/java/com/yonge/cooleshow/api/feign/fallback/StudentFeignServiceFallback.java
  6. 6 0
      cooleshow-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/service/impl/PmsProductServiceImpl.java
  7. 1 1
      cooleshow-mall/mall-admin/src/main/resources/config/mybatis/PmsProductDao.xml
  8. 2 0
      cooleshow-mall/mall-mbg/src/main/java/com/yonge/cooleshow/mbg/mapper/OmsOrderMapper.java
  9. 8 0
      cooleshow-mall/mall-mbg/src/main/java/com/yonge/cooleshow/mbg/mapper/PmsProductMapper.java
  10. 1 0
      cooleshow-mall/mall-mbg/src/main/java/com/yonge/cooleshow/mbg/mapper/PmsSkuStockMapper.java
  11. 12 0
      cooleshow-mall/mall-mbg/src/main/java/com/yonge/cooleshow/mbg/model/PmsSkuStock.java
  12. 7 0
      cooleshow-mall/mall-mbg/src/main/resources/config/mybatis/OmsOrderMapper.xml
  13. 5 0
      cooleshow-mall/mall-mbg/src/main/resources/config/mybatis/PmsProductMapper.xml
  14. 22 3
      cooleshow-mall/mall-mbg/src/main/resources/config/mybatis/PmsSkuStockMapper.xml
  15. 109 1
      cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/controller/open/OpenShareController.java
  16. 6 0
      cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/dao/PortalOrderDao.java
  17. 2 0
      cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/dao/PortalProductDao.java
  18. 185 0
      cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/dto/OrderCreate.java
  19. 35 0
      cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/OmsPortalOrderService.java
  20. 27 0
      cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/PmsPortalProductService.java
  21. 4 0
      cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/UmsMemberService.java
  22. 201 4
      cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/impl/OmsPortalOrderServiceImpl.java
  23. 63 0
      cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/impl/PmsPortalProductServiceImpl.java
  24. 28 18
      cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/impl/UmsMemberServiceImpl.java
  25. 20 0
      cooleshow-mall/mall-portal/src/main/resources/config/mybatis/PortalOrderDao.xml
  26. 21 0
      cooleshow-mall/mall-portal/src/main/resources/config/mybatis/PortalProductDao.xml
  27. 13 11
      cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/open/AdminClient.java
  28. 22 6
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/StudentServiceImpl.java
  29. 8 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/wrapper/StudentWrapper.java

+ 5 - 0
cooleshow-api/src/main/java/com/yonge/cooleshow/api/feign/AdminFeignService.java

@@ -3,6 +3,7 @@ package com.yonge.cooleshow.api.feign;
 import com.yonge.cooleshow.api.feign.dto.CouponInfoApi;
 import com.yonge.cooleshow.api.feign.dto.EmployeeApi;
 import com.yonge.cooleshow.api.feign.dto.StudentApi;
+import com.yonge.cooleshow.api.feign.dto.StudentWrapper;
 import com.yonge.cooleshow.api.feign.dto.TeacherApi;
 import com.yonge.cooleshow.api.feign.dto.UserFriendInfoVO;
 import com.yonge.cooleshow.api.feign.fallback.AdminFeignServiceFallback;
@@ -149,4 +150,8 @@ public interface AdminFeignService {
      */
     @GetMapping("/task/batchSending")
     HttpResponseResult<Boolean> batchSending();
+
+
+    @PostMapping("/open/adminClient/unionStudent")
+    HttpResponseResult<StudentWrapper.UnionStudentResp> unionStudent(@RequestBody StudentWrapper.UnionStudent info);
 }

+ 3 - 0
cooleshow-api/src/main/java/com/yonge/cooleshow/api/feign/StudentFeignService.java

@@ -1,11 +1,14 @@
 package com.yonge.cooleshow.api.feign;
 
+import com.yonge.cooleshow.api.feign.dto.StudentWrapper;
 import com.yonge.cooleshow.api.feign.fallback.StudentFeignServiceFallback;
 import com.yonge.cooleshow.common.constant.AppConstant;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
 import com.yonge.toolset.feign.config.FeignConfiguration;
 import org.springframework.cloud.openfeign.FeignClient;
 import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
 
 @FeignClient(name = AppConstant.APPLICATION_STUDENT + AppConstant.SERVER, configuration = FeignConfiguration.class, fallback = StudentFeignServiceFallback.class)
 public interface StudentFeignService {

+ 67 - 0
cooleshow-api/src/main/java/com/yonge/cooleshow/api/feign/dto/StudentWrapper.java

@@ -0,0 +1,67 @@
+package com.yonge.cooleshow.api.feign.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+
+/**
+ * 学生封装类
+ * Created by Eric.Shang on 2023/1/6.
+ */
+public class StudentWrapper {
+
+    @Data
+    @Builder
+    @NoArgsConstructor
+    @AllArgsConstructor
+    public static class UnionStudent implements Serializable {
+
+        private Long unionId;
+
+        private String token;
+
+        private String mobile;
+
+        private String subjectName;
+
+        private String username;
+
+        private Integer gender;
+
+        private Boolean tokenCheck;
+
+
+        private Integer lockFlag;
+    }
+
+    @Data
+    @Builder
+    @NoArgsConstructor
+    @AllArgsConstructor
+    public static class UnionStudentResp implements Serializable {
+
+        private Long unionId;
+
+        private String mobile;
+
+        private Long userId;
+
+        private String username;
+
+        private Boolean updateFlag;
+
+        private Object sysUser;
+        public UnionStudentResp userId(Long userId) {
+            this.userId = userId;
+            return this;
+        }
+
+        public UnionStudentResp username(String username) {
+            this.username = username;
+            return this;
+        }
+    }
+}

+ 7 - 0
cooleshow-api/src/main/java/com/yonge/cooleshow/api/feign/fallback/AdminFeignServiceFallback.java

@@ -4,6 +4,7 @@ import com.yonge.cooleshow.api.feign.AdminFeignService;
 import com.yonge.cooleshow.api.feign.dto.CouponInfoApi;
 import com.yonge.cooleshow.api.feign.dto.EmployeeApi;
 import com.yonge.cooleshow.api.feign.dto.StudentApi;
+import com.yonge.cooleshow.api.feign.dto.StudentWrapper;
 import com.yonge.cooleshow.api.feign.dto.TeacherApi;
 import com.yonge.cooleshow.api.feign.dto.UserFriendInfoVO;
 import com.yonge.cooleshow.common.entity.ContractDto;
@@ -131,4 +132,10 @@ public class AdminFeignServiceFallback implements AdminFeignService {
     public HttpResponseResult<Boolean> batchSending() {
         return null;
     }
+
+
+    @Override
+    public HttpResponseResult<StudentWrapper.UnionStudentResp> unionStudent(StudentWrapper.UnionStudent info) {
+        return null;
+    }
 }

+ 1 - 0
cooleshow-api/src/main/java/com/yonge/cooleshow/api/feign/fallback/StudentFeignServiceFallback.java

@@ -1,6 +1,7 @@
 package com.yonge.cooleshow.api.feign.fallback;
 
 import com.yonge.cooleshow.api.feign.StudentFeignService;
+import com.yonge.cooleshow.api.feign.dto.StudentWrapper;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
 import org.springframework.stereotype.Component;
 

+ 6 - 0
cooleshow-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/service/impl/PmsProductServiceImpl.java

@@ -11,6 +11,7 @@ import com.yonge.cooleshow.admin.dto.PmsProductResult;
 import com.yonge.cooleshow.admin.service.PmsProductService;
 import com.yonge.cooleshow.mbg.mapper.*;
 import com.yonge.cooleshow.mbg.model.*;
+import com.yonge.toolset.base.exception.BizException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -192,6 +193,11 @@ public class PmsProductServiceImpl implements PmsProductService {
         }
         //删除sku
         if(CollUtil.isNotEmpty(removeSkuList)){
+            for (PmsSkuStock pmsSkuStock : removeSkuList) {
+                if (org.apache.commons.lang3.StringUtils.isNotBlank(pmsSkuStock.getPlatformLock())) {
+                    throw new BizException("该商品已被锁定,不能删除");
+                }
+            }
             List<Long> removeSkuIds = removeSkuList.stream().map(PmsSkuStock::getId).collect(Collectors.toList());
             PmsSkuStockExample removeExample = new PmsSkuStockExample();
             removeExample.createCriteria().andIdIn(removeSkuIds);

+ 1 - 1
cooleshow-mall/mall-admin/src/main/resources/config/mybatis/PmsProductDao.xml

@@ -24,7 +24,7 @@
             l.id ladder_id,l.product_id ladder_product_id,l.discount ladder_discount,l.count ladder_count,l.price ladder_price,
             pf.id full_id,pf.product_id full_product_id,pf.full_price full_full_price,pf.reduce_price full_reduce_price,
             m.id member_id,m.product_id member_product_id,m.member_level_id member_member_level_id,m.member_price member_member_price,m.member_level_name member_member_level_name,
-            s.id sku_id,s.product_id sku_product_id,s.price sku_price,s.low_stock sku_low_stock,s.pic sku_pic,s.sale sku_sale,s.sku_code sku_sku_code,s.stock sku_stock,s.sp_data sku_sp_data,
+            s.id as  sku_id,s.product_id sku_product_id,s.price sku_price,s.low_stock sku_low_stock,s.pic sku_pic,s.sale sku_sale,s.sku_code sku_sku_code,s.stock sku_stock,s.sp_data sku_sp_data,s.platform_lock sku_platform_lock,
             a.id attribute_id,a.product_id attribute_product_id,a.product_attribute_id attribute_product_attribute_id,a.value attribute_value
         FROM pms_product p
         LEFT JOIN pms_product_category pc on pc.id = p.product_category_id

+ 2 - 0
cooleshow-mall/mall-mbg/src/main/java/com/yonge/cooleshow/mbg/mapper/OmsOrderMapper.java

@@ -27,4 +27,6 @@ public interface OmsOrderMapper {
     int updateByPrimaryKeySelective(OmsOrder record);
 
     int updateByPrimaryKey(OmsOrder record);
+
+    OmsOrder getByOrderSn(String orderNo);
 }

+ 8 - 0
cooleshow-mall/mall-mbg/src/main/java/com/yonge/cooleshow/mbg/mapper/PmsProductMapper.java

@@ -37,4 +37,12 @@ public interface PmsProductMapper {
     int updateByPrimaryKey(PmsProduct record);
 
     int lockStock(@Param("productId") Long productId, @Param("sum") int sum);
+
+    /**
+     * 解锁商品锁定库存
+     *
+     * @param productId  商品id
+     * @param num 解锁数量
+     */
+    int unLockStock(@Param("productId") Long productId, @Param("sum") int sum);
 }

+ 1 - 0
cooleshow-mall/mall-mbg/src/main/java/com/yonge/cooleshow/mbg/mapper/PmsSkuStockMapper.java

@@ -39,4 +39,5 @@ public interface PmsSkuStockMapper {
      */
     int lockStock(@Param("productSkuId") Long productSkuId, @Param("quantity") Integer quantity);
 
+    int unLockStock(@Param("productSkuId") Long productSkuId, @Param("quantity") Integer quantity);
 }

+ 12 - 0
cooleshow-mall/mall-mbg/src/main/java/com/yonge/cooleshow/mbg/model/PmsSkuStock.java

@@ -35,8 +35,20 @@ public class PmsSkuStock implements Serializable {
     @ApiModelProperty(value = "商品销售属性,json格式")
     private String spData;
 
+    @ApiModelProperty("平台锁定 被其他平台使用,不许删除")
+    private String platformLock;
+
     private static final long serialVersionUID = 1L;
 
+
+    public String getPlatformLock() {
+        return platformLock;
+    }
+
+    public void setPlatformLock(String platformLock) {
+        this.platformLock = platformLock;
+    }
+
     public Long getId() {
         return id;
     }

+ 7 - 0
cooleshow-mall/mall-mbg/src/main/resources/config/mybatis/OmsOrderMapper.xml

@@ -870,4 +870,11 @@
       modify_time = #{modifyTime,jdbcType=TIMESTAMP}
     where id = #{id,jdbcType=BIGINT}
   </update>
+
+  <select id="getByOrderSn" resultMap="BaseResultMap">
+    select
+    <include refid="Base_Column_List" />
+    from oms_order
+    where order_sn = #{orderSn}
+  </select>
 </mapper>

+ 5 - 0
cooleshow-mall/mall-mbg/src/main/resources/config/mybatis/PmsProductMapper.xml

@@ -923,4 +923,9 @@
   <update id="lockStock">
     update pms_product set lock_stock = lock_stock + #{sum} where  id = #{productId} and stock &gt;= ( lock_stock + #{sum})
   </update>
+
+  <update id="unLockStock">
+
+    update pms_product set lock_stock = lock_stock - #{sum} where  id = #{productId} and lock_stock &gt;= #{sum}
+    </update>
 </mapper>

+ 22 - 3
cooleshow-mall/mall-mbg/src/main/resources/config/mybatis/PmsSkuStockMapper.xml

@@ -13,6 +13,7 @@
     <result column="promotion_price" jdbcType="DECIMAL" property="promotionPrice" />
     <result column="lock_stock" jdbcType="INTEGER" property="lockStock" />
     <result column="sp_data" jdbcType="VARCHAR" property="spData" />
+    <result column="platform_lock" jdbcType="VARCHAR" property="platformLock" />
   </resultMap>
   <sql id="Example_Where_Clause">
     <where>
@@ -73,7 +74,7 @@
     </where>
   </sql>
   <sql id="Base_Column_List">
-    id, product_id, sku_code, price, stock, low_stock, pic, sale, promotion_price, lock_stock, 
+    id, product_id, sku_code, price, stock, low_stock, pic, sale, promotion_price, lock_stock, platform_lock,
     sp_data
   </sql>
   <select id="selectByExample" parameterType="com.yonge.cooleshow.mbg.model.PmsSkuStockExample" resultMap="BaseResultMap">
@@ -112,11 +113,11 @@
     </selectKey>
     insert into pms_sku_stock (product_id, sku_code, price, 
       stock, low_stock, pic, 
-      sale, promotion_price, lock_stock, 
+      sale, promotion_price, lock_stock, platform_lock,
       sp_data)
     values (#{productId,jdbcType=BIGINT}, #{skuCode,jdbcType=VARCHAR}, #{price,jdbcType=DECIMAL}, 
       #{stock,jdbcType=INTEGER}, #{lowStock,jdbcType=INTEGER}, #{pic,jdbcType=VARCHAR}, 
-      #{sale,jdbcType=INTEGER}, #{promotionPrice,jdbcType=DECIMAL}, #{lockStock,jdbcType=INTEGER}, 
+      #{sale,jdbcType=INTEGER}, #{promotionPrice,jdbcType=DECIMAL}, #{lockStock,jdbcType=INTEGER}, #{platformLock},
       #{spData,jdbcType=VARCHAR})
   </insert>
   <insert id="insertSelective" parameterType="com.yonge.cooleshow.mbg.model.PmsSkuStock">
@@ -155,6 +156,9 @@
       <if test="spData != null">
         sp_data,
       </if>
+      <if test="platformLock != null">
+        platform_lock,
+      </if>
     </trim>
     <trim prefix="values (" suffix=")" suffixOverrides=",">
       <if test="productId != null">
@@ -187,6 +191,9 @@
       <if test="spData != null">
         #{spData,jdbcType=VARCHAR},
       </if>
+      <if test="platformLock != null">
+        #{platformLock,jdbcType=VARCHAR},
+      </if>
     </trim>
   </insert>
   <select id="countByExample" parameterType="com.yonge.cooleshow.mbg.model.PmsSkuStockExample" resultType="java.lang.Long">
@@ -231,6 +238,9 @@
       <if test="record.spData != null">
         sp_data = #{record.spData,jdbcType=VARCHAR},
       </if>
+      <if test="record.spData != null">
+        platform_lock = #{record.platformLock,jdbcType=VARCHAR},
+      </if>
     </set>
     <if test="_parameter != null">
       <include refid="Update_By_Example_Where_Clause" />
@@ -248,6 +258,7 @@
       sale = #{record.sale,jdbcType=INTEGER},
       promotion_price = #{record.promotionPrice,jdbcType=DECIMAL},
       lock_stock = #{record.lockStock,jdbcType=INTEGER},
+      platform_lock = #{record.platformLock,jdbcType=VARCHAR},
       sp_data = #{record.spData,jdbcType=VARCHAR}
     <if test="_parameter != null">
       <include refid="Update_By_Example_Where_Clause" />
@@ -286,6 +297,9 @@
       <if test="spData != null">
         sp_data = #{spData,jdbcType=VARCHAR},
       </if>
+      <if test="spData != null">
+        platform_lock = #{platformLock,jdbcType=VARCHAR},
+      </if>
     </set>
     where id = #{id,jdbcType=BIGINT}
   </update>
@@ -300,6 +314,7 @@
       sale = #{sale,jdbcType=INTEGER},
       promotion_price = #{promotionPrice,jdbcType=DECIMAL},
       lock_stock = #{lockStock,jdbcType=INTEGER},
+    platform_lock = #{platformLock,jdbcType=VARCHAR},
       sp_data = #{spData,jdbcType=VARCHAR}
     where id = #{id,jdbcType=BIGINT}
   </update>
@@ -307,4 +322,8 @@
   <update id="lockStock">
     update pms_sku_stock set lock_stock = lock_stock + #{quantity} where  id = #{productSkuId} and stock &gt;= ( lock_stock + #{quantity})
     </update>
+
+  <update id="unLockStock">
+    update pms_sku_stock set lock_stock = lock_stock - #{quantity} where  id = #{productSkuId} and  lock_stock &gt;= #{quantity}
+  </update>
 </mapper>

+ 109 - 1
cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/controller/open/OpenShareController.java

@@ -2,6 +2,7 @@ package com.yonge.cooleshow.portal.controller.open;
 
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.extension.api.R;
 import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
 import com.yonge.cooleshow.auth.api.entity.SysUser;
 import com.yonge.cooleshow.common.controller.BaseController;
@@ -10,8 +11,12 @@ import com.yonge.cooleshow.mall.common.api.CommonPage;
 import com.yonge.cooleshow.mall.common.api.CommonResult;
 import com.yonge.cooleshow.mall.common.courier.domain.CourierInfo;
 import com.yonge.cooleshow.mall.common.courier.service.CourierService;
+import com.yonge.cooleshow.mbg.mapper.PmsSkuStockMapper;
+import com.yonge.cooleshow.mbg.model.OmsOrderCourier;
 import com.yonge.cooleshow.mbg.model.PmsProduct;
+import com.yonge.cooleshow.portal.domain.OmsOrderDetail;
 import com.yonge.cooleshow.portal.domain.PmsPortalProductDetail;
+import com.yonge.cooleshow.portal.dto.OrderCreate;
 import com.yonge.cooleshow.portal.dto.ProductSearch;
 import com.yonge.cooleshow.portal.dto.ShareProductVo;
 import com.yonge.cooleshow.portal.dto.ShareProfitParam;
@@ -27,7 +32,6 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.MediaType;
 import org.springframework.web.bind.annotation.*;
 
-import javax.annotation.Resource;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -45,9 +49,15 @@ public class OpenShareController extends BaseController {
     private PmsPortalProductService portalProductService;
 
     @Autowired
+    private PmsSkuStockMapper skuStockMapper;
+
+    @Autowired
     private OmsOrderCourierService orderCourierService;
 
     @Autowired
+    private OmsPortalOrderService portalOrderService;
+
+    @Autowired
     private CourierService courierService;
 
     @ApiOperation(value = "老师商品分享分润")
@@ -109,4 +119,102 @@ public class OpenShareController extends BaseController {
         PmsPortalProductDetail productDetail = portalProductService.detail(id);
         return CommonResult.success(productDetail);
     }
+
+    @PostMapping(value = "/product/queryNameMap", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
+    public CommonResult<Map<Long,String>> queryNameMap(@RequestBody List<Long> goodsIds) {
+        return CommonResult.success(portalProductService.queryNameMap(goodsIds));
+
+    }
+
+
+    /**
+     * 商品库存查询
+     * @param goodsSkuId 商品存储Id
+     * @return String
+     */
+    @GetMapping(value = "/product/stocks/{id}", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
+    public R<Integer> productStocks(@PathVariable(name = "id") Long goodsSkuId) {
+        log.info("商品库存查询 skuId:{}",goodsSkuId);
+        return R.ok(portalProductService.getProductStockAndSkuStock(goodsSkuId));
+
+    }
+
+    @PostMapping(value = "/product/stocksLock/{id}", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
+    public R<Boolean> productStocksLock(@PathVariable(name = "id") Long goodsSkuId, @RequestParam("lockState") Boolean lockState) {
+        log.info("商品库存锁定 goodsSkuId:{},lockState:{}",goodsSkuId,lockState);
+        return R.ok(portalProductService.lockStock(goodsSkuId,lockState));
+
+    }
+
+    /**
+     * 查询商品订单状态
+     * @param orderNo 订单编号
+     * @return String
+     */
+    @GetMapping(value = "/product/orderStatus/{id}", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
+    public R<Boolean> productOrderStatus(@PathVariable(name = "id") String orderNo){
+        log.info("查询商品订单状态:{}",orderNo);
+        OmsOrderDetail detail = portalOrderService.detail(orderNo);
+
+        return R.ok(detail.getStatus().equals(1));
+    }
+
+
+    /**
+     * 设置商品退款
+     *
+     * @param orderNo 订单编号
+     * @return String
+     */
+    @GetMapping(value = "/product/orderRefund/{id}", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
+    public R<Boolean> productOrderRefund(@PathVariable(name = "id") String orderNo) {
+
+        log.info("设置订单退款:{}",orderNo);
+        return R.ok(portalOrderService.jmeduOrderRefund(orderNo));
+    }
+
+
+    /**
+     * 查询商品订单生成
+     * @param order ProductWrapper.OrderCreate
+     * @return String
+     */
+    @PostMapping(value = "/product/orderCreate", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
+    public R<Boolean> productOrderCreate(@RequestBody OrderCreate order) {
+
+        log.info("创建管乐团订单:{}",JSON.toJSONString(order));
+
+        portalOrderService.jmeduProductOrderCreate(order);
+
+
+        return R.ok(true);
+    }
+
+
+
+    /**
+     * 查询订单快递信息
+     * @return
+     */
+    @GetMapping(value = "/product/orderCourier/{id}", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
+    public R<OmsOrderCourier> productOrderCourier(@PathVariable(name = "id") String orderNo) {
+        log.info("查询订单快递信息 : {}",orderNo);
+        return R.ok(portalOrderService.productOrderCourier(orderNo));
+
+    }
+
+
+
+
+
+    /**
+     * 锁定/解锁 sku
+     *
+     */
+    @GetMapping(value = "/product/lockSku/{id}", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
+    public R<Boolean> productOrderCourier(@PathVariable(name = "id") Long skuId,@RequestParam("platform") String platform,@RequestParam("lockState") Boolean lockState) {
+        log.info("锁定/解锁 skuId : {},platform:{},lockState:{}",skuId,platform,lockState);
+        return R.ok(portalOrderService.lockSku(skuId,platform,lockState));
+
+    }
 }

+ 6 - 0
cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/dao/PortalOrderDao.java

@@ -1,5 +1,6 @@
 package com.yonge.cooleshow.portal.dao;
 
+import com.yonge.cooleshow.mbg.model.OmsOrder;
 import com.yonge.cooleshow.mbg.model.OmsOrderItem;
 import com.yonge.cooleshow.portal.domain.OmsOrderDetail;
 import com.yonge.cooleshow.portal.domain.ProductStock;
@@ -23,6 +24,10 @@ public interface PortalOrderDao {
     int updateSkuStock(@Param("itemList") List<OmsOrderItem> orderItemList);
 
     /**
+     * 修改 pms_sku_stock表的锁定库存及真实库存
+     */
+    int updateRefundSkuStock(@Param("itemList") List<OmsOrderItem> orderItemList);
+    /**
      * 获取超时订单
      * @param minute 超时时间(分)
      */
@@ -39,4 +44,5 @@ public interface PortalOrderDao {
     int releaseSkuStockLock(@Param("itemList") List<OmsOrderItem> orderItemList);
 
     int releaseProductStockLock(@Param("itemList") List<ProductStock> orderItemList);
+
 }

+ 2 - 0
cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/dao/PortalProductDao.java

@@ -32,4 +32,6 @@ public interface PortalProductDao {
      * 改库存
      */
     void updateProductStock(@Param("itemList") List<ProductStock> productStockList);
+
+    int refundProductStock(@Param("itemList") List<ProductStock> productStockList);
 }

+ 185 - 0
cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/dto/OrderCreate.java

@@ -0,0 +1,185 @@
+package com.yonge.cooleshow.portal.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.List;
+
+/**
+ * Description
+ *
+ * @author liujunchi
+ * @date 2023-01-10
+ */
+public class OrderCreate {
+
+    @ApiModelProperty("下单手机号")
+    private String mobile;
+
+    @ApiModelProperty("订单编号")
+    private String orderNo;
+
+    @ApiModelProperty("订单总金额")
+    private BigDecimal totalAmount;
+
+    @ApiModelProperty("支付类型  1->支付宝;2->微信")
+    private Integer payType;
+
+    @ApiModelProperty(value = "收货人姓名")
+    private String receiverName;
+
+    @ApiModelProperty(value = "收货人电话")
+    private String receiverPhone;
+
+    @ApiModelProperty(value = "收货人邮编")
+    private String receiverPostCode;
+
+    @ApiModelProperty(value = "省份/直辖市")
+    private String receiverProvince;
+
+    @ApiModelProperty(value = "城市")
+    private String receiverCity;
+
+    @ApiModelProperty(value = "区")
+    private String receiverRegion;
+
+    @ApiModelProperty(value = "详细地址")
+    private String receiverDetailAddress;
+
+    @ApiModelProperty("商品详情")
+    private List<OrderItem> orderItemList;
+
+    public static class OrderItem implements Serializable {
+
+
+        @ApiModelProperty(value = "购买数量")
+        private Integer productQuantity;
+
+        @ApiModelProperty(value = "商品sku编号")
+        private Long productSkuId;
+
+        @ApiModelProperty(value = "该商品经过优惠后的分解金额")
+        private BigDecimal realAmount;
+
+        public Integer getProductQuantity() {
+            return productQuantity;
+        }
+
+        public void setProductQuantity(Integer productQuantity) {
+            this.productQuantity = productQuantity;
+        }
+
+        public Long getProductSkuId() {
+            return productSkuId;
+        }
+
+        public void setProductSkuId(Long productSkuId) {
+            this.productSkuId = productSkuId;
+        }
+
+        public BigDecimal getRealAmount() {
+            return realAmount;
+        }
+
+        public void setRealAmount(BigDecimal realAmount) {
+            this.realAmount = realAmount;
+        }
+    }
+
+    public String getMobile() {
+        return mobile;
+    }
+
+    public void setMobile(String mobile) {
+        this.mobile = mobile;
+    }
+
+    public String getOrderNo() {
+        return orderNo;
+    }
+
+    public void setOrderNo(String orderNo) {
+        this.orderNo = orderNo;
+    }
+
+    public BigDecimal getTotalAmount() {
+        return totalAmount;
+    }
+
+    public void setTotalAmount(BigDecimal totalAmount) {
+        this.totalAmount = totalAmount;
+    }
+
+    public Integer getPayType() {
+        return payType;
+    }
+
+    public void setPayType(Integer payType) {
+        this.payType = payType;
+    }
+
+    public String getReceiverName() {
+        return receiverName;
+    }
+
+    public void setReceiverName(String receiverName) {
+        this.receiverName = receiverName;
+    }
+
+    public String getReceiverPhone() {
+        return receiverPhone;
+    }
+
+    public void setReceiverPhone(String receiverPhone) {
+        this.receiverPhone = receiverPhone;
+    }
+
+    public String getReceiverPostCode() {
+        return receiverPostCode;
+    }
+
+    public void setReceiverPostCode(String receiverPostCode) {
+        this.receiverPostCode = receiverPostCode;
+    }
+
+    public String getReceiverProvince() {
+        return receiverProvince;
+    }
+
+    public void setReceiverProvince(String receiverProvince) {
+        this.receiverProvince = receiverProvince;
+    }
+
+    public String getReceiverCity() {
+        return receiverCity;
+    }
+
+    public void setReceiverCity(String receiverCity) {
+        this.receiverCity = receiverCity;
+    }
+
+    public String getReceiverRegion() {
+        return receiverRegion;
+    }
+
+    public void setReceiverRegion(String receiverRegion) {
+        this.receiverRegion = receiverRegion;
+    }
+
+    public String getReceiverDetailAddress() {
+        return receiverDetailAddress;
+    }
+
+    public void setReceiverDetailAddress(String receiverDetailAddress) {
+        this.receiverDetailAddress = receiverDetailAddress;
+    }
+
+    public List<OrderItem> getOrderItemList() {
+        return orderItemList;
+    }
+
+    public void setOrderItemList(List<OrderItem> orderItemList) {
+        this.orderItemList = orderItemList;
+    }
+}

+ 35 - 0
cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/OmsPortalOrderService.java

@@ -2,9 +2,11 @@ package com.yonge.cooleshow.portal.service;
 
 import com.yonge.cooleshow.mall.common.api.CommonPage;
 import com.yonge.cooleshow.mbg.model.OmsOrder;
+import com.yonge.cooleshow.mbg.model.OmsOrderCourier;
 import com.yonge.cooleshow.portal.domain.ConfirmOrderResult;
 import com.yonge.cooleshow.portal.domain.OmsOrderDetail;
 import com.yonge.cooleshow.portal.domain.OrderParam;
+import com.yonge.cooleshow.portal.dto.OrderCreate;
 import com.yonge.cooleshow.portal.dto.OrderPayReq;
 import com.yonge.cooleshow.portal.dto.OrderPayRes;
 import com.yonge.toolset.payment.base.model.callback.PaymentCallBack;
@@ -126,4 +128,37 @@ public interface OmsPortalOrderService {
      */
     @Transactional
     Integer shareProfit();
+
+    /**
+     * 订单退款
+     *
+     * @param orderNo 订单号
+     * @return
+     */
+    Boolean jmeduOrderRefund(String orderNo);
+
+    /**
+     * 创建管乐团订单
+     *
+     * @param order
+     */
+    void jmeduProductOrderCreate(OrderCreate order);
+
+    /**
+     * 查询
+     *
+     * @param orderNo
+     * @return
+     */
+    OmsOrderCourier productOrderCourier(String orderNo);
+
+    /**
+     * 锁定/ 解锁 sku
+     *
+     * @param skuId skuId
+     * @param platform 平台
+     * @param lockState 锁定状态
+     * @return
+     */
+    Boolean lockSku(Long skuId, String platform, Boolean lockState);
 }

+ 27 - 0
cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/PmsPortalProductService.java

@@ -8,6 +8,7 @@ import com.yonge.cooleshow.portal.dto.ProductSearchConditionVo;
 import com.yonge.cooleshow.portal.dto.ShareProductVo;
 
 import java.util.List;
+import java.util.Map;
 
 /**
  * 前台商品管理Service
@@ -43,4 +44,30 @@ public interface PmsPortalProductService {
      * @param productId 商品id
      */
     ShareProductVo shareProductProfit(SysUser sysUser, Long productId);
+
+    /**
+     * 商品编号名称
+     *
+     * @param goodsIds
+     * @return
+     */
+    Map<Long,String> queryNameMap(List<Long> goodsIds);
+
+    /**
+     * 查询商品和商品sku库存
+     *
+     * @param goodsSkuId skuId
+     * @return
+     */
+    Integer getProductStockAndSkuStock(Long goodsSkuId);
+
+    /**
+     * 锁定 解锁库存
+     *
+     * @param goodsSkuId
+     * @param lockState
+     * @return
+     */
+    Boolean lockStock(Long goodsSkuId, Boolean lockState);
+
 }

+ 4 - 0
cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/UmsMemberService.java

@@ -1,5 +1,6 @@
 package com.yonge.cooleshow.portal.service;
 
+import com.yonge.cooleshow.auth.api.entity.SysUser;
 import com.yonge.cooleshow.mbg.model.UmsMember;
 import org.springframework.security.core.userdetails.UserDetails;
 import org.springframework.transaction.annotation.Transactional;
@@ -25,6 +26,9 @@ public interface UmsMemberService {
      */
     UmsMember getCurrentMember();
 
+    @Transactional
+    UmsMember createUmsMember(SysUser sysUser);
+
     /**
      * 根据会员id修改会员积分
      */

+ 201 - 4
cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/impl/OmsPortalOrderServiceImpl.java

@@ -5,7 +5,11 @@ import cn.hutool.core.collection.CollUtil;
 import com.alibaba.fastjson.JSON;
 import com.github.pagehelper.PageHelper;
 import com.yonge.cooleshow.api.feign.AdminFeignService;
+import com.yonge.cooleshow.api.feign.StudentFeignService;
 import com.yonge.cooleshow.api.feign.dto.CouponInfoApi;
+import com.yonge.cooleshow.api.feign.dto.StudentWrapper;
+import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
+import com.yonge.cooleshow.auth.api.entity.SysUser;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
 import com.yonge.cooleshow.common.entity.MallOrderItemDto;
 import com.yonge.cooleshow.common.enums.PostStatusEnum;
@@ -22,6 +26,7 @@ import com.yonge.cooleshow.portal.dao.PortalOrderDao;
 import com.yonge.cooleshow.portal.dao.PortalOrderItemDao;
 import com.yonge.cooleshow.portal.dao.PortalProductDao;
 import com.yonge.cooleshow.portal.domain.*;
+import com.yonge.cooleshow.portal.dto.OrderCreate;
 import com.yonge.cooleshow.portal.dto.OrderPayReq;
 import com.yonge.cooleshow.portal.dto.OrderPayRes;
 import com.yonge.cooleshow.portal.service.*;
@@ -111,13 +116,17 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
 
     @Autowired
     private PmsProductMapper pmsProductMapper;
-
+    @Autowired
+    private SysUserFeignService sysUserFeignService;
     @Autowired
     private UserOrderRefundMapper userOrderRefundMapper;
 
     @Autowired
     private RedissonClient redissonClient;
 
+    @Autowired
+    private OmsOrderCourierService orderCourierService;
+
 
     @Autowired
     private PortalProductDao productDao;
@@ -352,7 +361,7 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
         int count = portalOrderDao.updateSkuStock(orderDetail.getOrderItemList());
 
         // 减商品库存
-        updateProductStock(orderDetail);
+        updateProductStock(orderDetail,true);
 
         // 查询订单
         OmsOrderDetail detail = detail(orderId);
@@ -407,7 +416,7 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
     /**
      * 减商品库存
      */
-    private void updateProductStock(OmsOrderDetail orderDetail) {
+    private void updateProductStock(OmsOrderDetail orderDetail,Boolean status) {
         Map<Long, List<OmsOrderItem>> collect = orderDetail.getOrderItemList()
                                                            .stream()
                                                            .collect(Collectors.groupingBy(OmsOrderItem::getProductId));
@@ -424,7 +433,11 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
             stock.setStock(sum);
             productStockList.add(stock);
         }
-        productDao.updateProductStock(productStockList);
+        if (status) {
+            productDao.updateProductStock(productStockList);
+        } else {
+            productDao.refundProductStock(productStockList);
+        }
     }
 
     @Override
@@ -881,6 +894,190 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
         return omsOrders.size();
     }
 
+    @Override
+    @Transactional
+    public Boolean jmeduOrderRefund(String orderNo) {
+        OmsOrderDetail detail = detail(orderNo);
+        if (detail == null) {
+            throw new BizException("订单不存在");
+        }
+        if(detail.getStatus() != 1) {
+            throw new BizException("当前订单不能退款");
+        }
+        OmsOrder order = new OmsOrder();
+        order.setStatus(4);
+        order.setId(detail.getId());
+        orderMapper.updateByPrimaryKeySelective(order);
+
+        // 减sku库存
+        portalOrderDao.updateRefundSkuStock(detail.getOrderItemList());
+
+        // 减商品库存
+        updateProductStock(detail,false);
+
+        return true;
+    }
+
+    @Override
+    @Transactional
+    public void jmeduProductOrderCreate(OrderCreate order) {
+
+
+        // 查询订单是否已存在
+        OmsOrder detail = orderMapper.getByOrderSn(order.getOrderNo());
+        if (detail != null) {
+            throw new BizException("订单已存在");
+        }
+
+
+
+        // 1.查询酷乐秀学生账户
+        HttpResponseResult<StudentWrapper.UnionStudentResp> unionStudent = adminFeignService.unionStudent(
+            StudentWrapper.UnionStudent.builder().tokenCheck(false).lockFlag(1).mobile(order.getMobile()).build());
+
+        Long userId = unionStudent.getData().getUserId();
+        UmsMember umsMember = memberService.getById(userId);
+        if (umsMember == null) {
+            umsMember = memberService.createUmsMember(
+                JSON.parseObject(JSON.toJSONString(unionStudent.getData().getSysUser()), SysUser.class));
+        }
+
+
+        // 创建订单
+
+        //设置自动收货天数
+        List<OmsOrderSetting> orderSettings = orderSettingMapper.selectByExample(new OmsOrderSettingExample());
+
+
+        detail = new OmsOrder();
+        detail.setMemberId(umsMember.getId());
+        detail.setPlatformType("JMEDU");
+        detail.setOrderSn(order.getOrderNo());
+        detail.setCreateTime(new Date());
+        detail.setMemberUsername(umsMember.getUsername());
+        detail.setTotalAmount(order.getTotalAmount());
+        detail.setPayAmount(order.getTotalAmount());
+        detail.setFreightAmount(BigDecimal.ZERO);
+        detail.setPromotionAmount(BigDecimal.ZERO);
+        detail.setIntegrationAmount(BigDecimal.ZERO);
+        detail.setCouponAmount(BigDecimal.ZERO);
+        detail.setDiscountAmount(BigDecimal.ZERO);
+        detail.setPayType(order.getPayType());
+        detail.setConfirmStatus(0);
+        detail.setSourceType(1);
+        detail.setStatus(1);
+        detail.setOrderType(0);
+        if (CollUtil.isNotEmpty(orderSettings)) {
+            detail.setAutoConfirmDay(orderSettings.get(0).getConfirmOvertime());
+        }
+        detail.setReceiverName(order.getReceiverName());
+        detail.setReceiverPhone(order.getReceiverPhone());
+        detail.setReceiverPostCode(order.getReceiverPostCode());
+        detail.setReceiverProvince(order.getReceiverProvince());
+        detail.setReceiverCity(order.getReceiverCity());
+        detail.setReceiverRegion(order.getReceiverRegion());
+        detail.setReceiverDetailAddress(order.getReceiverDetailAddress());
+        detail.setDeleteStatus(0);
+        detail.setPaymentTime(new Date());
+        detail.setAfterSale(1);
+        detail.setModifyTime(new Date());
+        orderMapper.insert(detail);
+
+        List<OmsOrderItem> orderItemList = new ArrayList<>();
+        // 创建订单详情
+        for (OrderCreate.OrderItem orderItem : order.getOrderItemList()) {
+
+            // 获取商品信息
+            PmsSkuStock pmsSkuStock = skuStockMapper.selectByPrimaryKey(orderItem.getProductSkuId());
+            if (pmsSkuStock == null) {
+                throw new BizException("商品规格不存在");
+            }
+            PmsProduct pmsProduct = pmsProductMapper.selectByPrimaryKey(pmsSkuStock.getProductId());
+
+            if (pmsProduct == null) {
+                throw new BizException("商品不存在");
+            }
+
+            OmsOrderItem omsOrderItem = new OmsOrderItem();
+            omsOrderItem.setOrderId(detail.getId());
+            omsOrderItem.setOrderSn(detail.getOrderSn());
+            omsOrderItem.setProductId(pmsProduct.getId());
+            omsOrderItem.setProductPic(pmsProduct.getPic());
+            omsOrderItem.setProductName(pmsProduct.getName());
+            omsOrderItem.setProductBrand(pmsProduct.getBrandName());
+            omsOrderItem.setProductPrice(pmsProduct.getPrice());
+            omsOrderItem.setProductQuantity(1);
+            omsOrderItem.setProductSkuId(pmsSkuStock.getId());
+            omsOrderItem.setProductSkuCode(pmsSkuStock.getSkuCode());
+            omsOrderItem.setProductCategoryId(pmsProduct.getProductCategoryId());
+            omsOrderItem.setPromotionAmount(BigDecimal.ZERO);
+            omsOrderItem.setCouponAmount(BigDecimal.ZERO);
+            omsOrderItem.setIntegrationAmount(BigDecimal.ZERO);
+            omsOrderItem.setRealAmount(orderItem.getRealAmount());
+            omsOrderItem.setProductAttr(pmsSkuStock.getSpData());
+            omsOrderItem.setReturnStatus(-1);
+
+            orderItemList.add(omsOrderItem);
+        }
+
+
+        // 保存数据
+        if (!CollectionUtils.isEmpty(orderItemList)) {
+            orderItemDao.insertList(orderItemList);
+            // 减sku库存
+            OmsOrderDetail orderDetail = detail(order.getOrderNo());
+            portalOrderDao.updateSkuStock(orderDetail.getOrderItemList());
+
+            // 减商品库存
+            updateProductStock(orderDetail,true);
+        }
+
+
+
+
+    }
+
+    @Override
+    public OmsOrderCourier productOrderCourier(String orderNo) {
+        OmsOrderDetail detail = detail(orderNo);
+        if (!StringUtil.isEmpty(detail.getDeliverySn()) ) {
+            return orderCourierService.getCourierInfo(orderNo);
+        }
+        return null;
+    }
+
+    @Override
+    @Transactional
+    public Boolean lockSku(Long skuId, String platform, Boolean lockState) {
+
+        PmsSkuStock pmsSkuStock = skuStockMapper.selectByPrimaryKey(skuId);
+        if (pmsSkuStock == null) {
+            throw new BizException("商品规格不存在");
+        }
+        String platformLock = pmsSkuStock.getPlatformLock();
+        if (StringUtil.isEmpty(platformLock)) {
+            platformLock = platform;
+        } else {
+            if (lockState) {
+                if (platformLock.contains(platform)) {
+                    // throw new BizException("商品已锁定");
+                    return true;
+                }
+                platformLock = platformLock + "," + platform;
+            } else {
+                if (!platformLock.contains(platform)) {
+                    // throw new BizException("商品未锁定");
+                    return true;
+                }
+                platformLock = platformLock.replace(platform, "");
+            }
+        }
+        pmsSkuStock.setPlatformLock(platformLock);
+        skuStockMapper.updateByPrimaryKeySelective(pmsSkuStock);
+        return true;
+
+    }
+
     private void FinishReceiveOrder(Long orderId) {
 
         // UmsMember member = memberService.getCurrentMember();

+ 63 - 0
cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/impl/PmsPortalProductServiceImpl.java

@@ -15,10 +15,12 @@ import com.yonge.cooleshow.portal.dto.ProductCategorySmallVo;
 import com.yonge.cooleshow.portal.dto.ProductSearchConditionVo;
 import com.yonge.cooleshow.portal.dto.ShareProductVo;
 import com.yonge.cooleshow.portal.service.PmsPortalProductService;
+import com.yonge.toolset.base.exception.BizException;
 import com.yonge.toolset.base.string.MessageFormatter;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.CollectionUtils;
 
 import java.util.ArrayList;
@@ -214,6 +216,67 @@ public class PmsPortalProductServiceImpl implements PmsPortalProductService {
         return shareProductVo;
     }
 
+    @Override
+    public Map<Long, String> queryNameMap(List<Long> goodsIds) {
+        PmsProductExample example = new PmsProductExample();
+        PmsProductExample.Criteria criteria = example.createCriteria();
+        criteria.andIdIn(goodsIds);
+        List<PmsProduct> goodsList = productMapper.selectByExample(example);
+        return goodsList.stream().collect(Collectors.toMap(PmsProduct::getId, PmsProduct::getName));
+    }
+
+    @Override
+    public Integer getProductStockAndSkuStock(Long goodsSkuId) {
+
+        PmsSkuStock pmsSkuStock = skuStockMapper.selectByPrimaryKey(goodsSkuId);
+        if (pmsSkuStock == null) {
+            throw new BizException("商品信息不存在");
+        }
+        // 查询商品
+        PmsProduct pmsProduct = productMapper.selectByPrimaryKey(pmsSkuStock.getProductId());
+        if (pmsProduct == null) {
+            throw new BizException("商品信息不存在");
+        }
+        int skuStock = pmsSkuStock.getStock() - pmsSkuStock.getLockStock();
+        int productStock = pmsProduct.getStock() - pmsProduct.getLockStock();
+        return Math.min(skuStock, productStock);
+
+    }
+
+    @Override
+    @Transactional
+    public Boolean lockStock(Long goodsSkuId, Boolean lockState) {
+        PmsSkuStock pmsSkuStock = skuStockMapper.selectByPrimaryKey(goodsSkuId);
+        if (pmsSkuStock == null) {
+            throw new BizException("商品sku信息不存在");
+        }
+        // 查询商品
+        PmsProduct pmsProduct = productMapper.selectByPrimaryKey(pmsSkuStock.getProductId());
+        if (pmsProduct == null) {
+            throw new BizException("商品信息不存在");
+        }
+        // 锁定库存 直接使用for update 更新 判断是否更新成功
+        if (lockState) {
+            int lock = productMapper.lockStock(pmsProduct.getId(), 1);
+            if (lock <=0) {
+                throw new BizException("商品库存不足");
+            }
+            lock = skuStockMapper.lockStock(pmsSkuStock.getId(), 1);
+            if (lock <=0) {
+                throw new BizException("商品sku库存不足");
+            }
+        } else {
+            productMapper.unLockStock(pmsProduct.getId(),1);
+            skuStockMapper.unLockStock(pmsSkuStock.getId(),1);
+        }
+
+        // 解锁库存 直接解锁
+        return true;
+
+    }
+
+
+
 
     private  List<PmsProductAttributeCategory>  getHomeProductAttributeCategory() {
         PmsProductAttributeCategoryExample example = new PmsProductAttributeCategoryExample();

+ 28 - 18
cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/impl/UmsMemberServiceImpl.java

@@ -18,6 +18,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.core.userdetails.UserDetails;
 import org.springframework.security.core.userdetails.UsernameNotFoundException;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.CollectionUtils;
 
 import java.util.List;
@@ -60,6 +61,7 @@ public class UmsMemberServiceImpl implements UmsMemberService {
     }
 
     @Override
+    @Transactional
     public UmsMember getCurrentMember() {
         SysUser sysUser = sysUserFeignService.queryUserInfo();
         if (sysUser == null || sysUser.getId() == null) {
@@ -68,24 +70,7 @@ public class UmsMemberServiceImpl implements UmsMemberService {
         UmsMember umsMember = getById(sysUser.getId());
         // 商城库用户不存在-> 创建
         if (umsMember == null || umsMember.getId() == null) {
-            umsMember = new UmsMember();
-            umsMember.setId(sysUser.getId());
-            umsMember.setCreateTime(sysUser.getCreateTime());
-            umsMember.setUsername(sysUser.getUsername());
-            umsMember.setPassword(sysUser.getPassword());
-            umsMember.setPhone(sysUser.getPhone());
-            umsMember.setStatus(sysUser.getLockFlag());
-            umsMember.setIcon(sysUser.getAvatar());
-            umsMember.setGender(sysUser.getGender());
-            umsMember.setBirthday(sysUser.getBirthdate());
-            //获取默认会员等级并设置
-            UmsMemberLevelExample levelExample = new UmsMemberLevelExample();
-            levelExample.createCriteria().andDefaultStatusEqualTo(1);
-            List<UmsMemberLevel> memberLevelList = memberLevelMapper.selectByExample(levelExample);
-            if (!CollectionUtils.isEmpty(memberLevelList)) {
-                umsMember.setMemberLevelId(memberLevelList.get(0).getId());
-            }
-            memberMapper.insert(umsMember);
+            umsMember = createUmsMember(sysUser);
         } else {
             boolean flag = false;
             if (sysUser.getUsername() != null && !sysUser.getUsername().equals(umsMember.getUsername())) {
@@ -108,6 +93,31 @@ public class UmsMemberServiceImpl implements UmsMemberService {
     }
 
     @Override
+    @Transactional
+    public UmsMember createUmsMember(SysUser sysUser) {
+        UmsMember umsMember;
+        umsMember = new UmsMember();
+        umsMember.setId(sysUser.getId());
+        umsMember.setCreateTime(sysUser.getCreateTime());
+        umsMember.setUsername(sysUser.getUsername());
+        umsMember.setPassword(sysUser.getPassword());
+        umsMember.setPhone(sysUser.getPhone());
+        umsMember.setStatus(sysUser.getLockFlag());
+        umsMember.setIcon(sysUser.getAvatar());
+        umsMember.setGender(sysUser.getGender());
+        umsMember.setBirthday(sysUser.getBirthdate());
+        //获取默认会员等级并设置
+        UmsMemberLevelExample levelExample = new UmsMemberLevelExample();
+        levelExample.createCriteria().andDefaultStatusEqualTo(1);
+        List<UmsMemberLevel> memberLevelList = memberLevelMapper.selectByExample(levelExample);
+        if (!CollectionUtils.isEmpty(memberLevelList)) {
+            umsMember.setMemberLevelId(memberLevelList.get(0).getId());
+        }
+        memberMapper.insert(umsMember);
+        return umsMember;
+    }
+
+    @Override
     public void updateIntegration(Long id, Integer integration) {
         UmsMember record=new UmsMember();
         record.setId(id);

+ 20 - 0
cooleshow-mall/mall-portal/src/main/resources/config/mybatis/PortalOrderDao.xml

@@ -109,4 +109,24 @@
             #{item.productId}
         </foreach>
     </update>
+
+    <update id="updateRefundSkuStock">
+        UPDATE pms_sku_stock
+        SET
+        stock = CASE id
+        <foreach collection="itemList" item="item">
+            WHEN #{item.productSkuId} THEN stock + #{item.productQuantity}
+        </foreach>
+        END,
+        sale = CASE id
+        <foreach collection="itemList" item="item">
+            WHEN #{item.productSkuId} THEN pms_sku_stock.sale - #{item.productQuantity}
+        </foreach>
+        END
+        WHERE
+        id IN
+        <foreach collection="itemList" item="item" separator="," open="(" close=")">
+            #{item.productSkuId}
+        </foreach>
+    </update>
 </mapper>

+ 21 - 0
cooleshow-mall/mall-portal/src/main/resources/config/mybatis/PortalProductDao.xml

@@ -120,4 +120,25 @@
             #{item.productId}
         </foreach>
     </update>
+
+
+    <update id="refundProductStock">
+        UPDATE pms_product
+        SET
+        stock = CASE id
+        <foreach collection="itemList" item="item">
+            WHEN #{item.productId} THEN stock + #{item.stock}
+        </foreach>
+        END,
+        sale = CASE id
+        <foreach collection="itemList" item="item">
+            WHEN #{item.productId} THEN sale - #{item.stock}
+        </foreach>
+        END
+        WHERE
+        id IN
+        <foreach collection="itemList" item="item" separator="," open="(" close=")">
+            #{item.productId}
+        </foreach>
+    </update>
 </mapper>

+ 13 - 11
cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/open/AdminClient.java

@@ -101,20 +101,22 @@ public class AdminClient extends BaseController {
     @PostMapping("/unionStudent")
     public HttpResponseResult<StudentWrapper.UnionStudentResp> unionStudent(@RequestBody StudentWrapper.UnionStudent info) {
 
-        if (StringUtils.isAnyBlank(info.getToken(), info.getMobile())) {
-            throw new BizException("请求参数错误");
-        }
+        if (info.getTokenCheck() == null || info.getTokenCheck()) {
+            if (StringUtils.isAnyBlank(info.getToken(), info.getMobile())) {
+                throw new BizException("请求参数错误");
+            }
 
-        // 校验三方帐号关联请求合法性
-        RSAPublicKey rsaPublicKey = RsaKeyHelper.getRSAPublicKey("jmedu", "dayaedu", "jmedu.jks", "dayaedu");
-        Jwt jwt = JwtHelper.decodeAndVerify(info.getToken(), new RsaVerifier(rsaPublicKey));
+            // 校验三方帐号关联请求合法性
+            RSAPublicKey rsaPublicKey = RsaKeyHelper.getRSAPublicKey("jmedu", "dayaedu", "jmedu.jks", "dayaedu");
+            Jwt jwt = JwtHelper.decodeAndVerify(info.getToken(), new RsaVerifier(rsaPublicKey));
 
-        //获取jwt原始内容
-        String claims = jwt.getClaims();
-        if (StringUtils.isEmpty(claims)) {
-            throw new BizException("三方授权校验失败");
-        }
+            //获取jwt原始内容
+            String claims = jwt.getClaims();
+            if (StringUtils.isEmpty(claims)) {
+                throw new BizException("三方授权校验失败");
+            }
 
+        }
         // 学生帐号关联
         StudentWrapper.UnionStudentResp studentResp = studentService.unionStudent(info);
 

+ 22 - 6
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/StudentServiceImpl.java

@@ -31,6 +31,7 @@ import com.yonge.cooleshow.common.enums.UserLockFlag;
 import com.yonge.toolset.base.util.StringUtil;
 import com.yonge.toolset.utils.date.DateUtil;
 import com.yonge.toolset.utils.string.ValueUtil;
+import org.apache.commons.lang3.StringUtils;
 import org.redisson.api.RMap;
 import org.redisson.api.RedissonClient;
 import org.springframework.beans.BeanUtils;
@@ -46,6 +47,7 @@ import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
+import java.util.Optional;
 import java.util.Set;
 import java.util.concurrent.TimeUnit;
 
@@ -236,26 +238,35 @@ public class StudentServiceImpl extends ServiceImpl<StudentDao, Student> impleme
 
         // 手机号查询用户信息
         StudentVo studentVo = detailByPhone(info.getMobile());
+
+
+        com.yonge.cooleshow.biz.dal.entity.SysUser sysUser = sysUserMapper.selectOne(Wrappers.<com.yonge.cooleshow.biz.dal.entity.SysUser>lambdaQuery()
+                                                                                             .eq(com.yonge.cooleshow.biz.dal.entity.SysUser::getPhone, info.getMobile()));
+
+        studentResp.setSysUser(sysUser);
         if (Objects.isNull(studentVo)) {
 
-            com.yonge.cooleshow.biz.dal.entity.SysUser sysUser = sysUserMapper.selectOne(Wrappers.<com.yonge.cooleshow.biz.dal.entity.SysUser>lambdaQuery()
-                    .eq(com.yonge.cooleshow.biz.dal.entity.SysUser::getPhone, info.getMobile()));
 
             if (Objects.isNull(sysUser)) {
 
                 // 自动注册创建用户
                 com.yonge.cooleshow.biz.dal.entity.SysUser user = new com.yonge.cooleshow.biz.dal.entity.SysUser();
                 user.setUsername(info.getUsername());
+                user.setAvatar("https://daya.ks3-cn-beijing.ksyun.com/202203/T1WgJaE.png");
                 user.setPhone(info.getMobile());
                 user.setLockFlag(0);
                 user.setGender(info.getGender());
+                user.setUserType(ClientEnum.STUDENT.getCode());
                 sysUserMapper.insert(user);
 
+                studentResp.setSysUser(user);
                 String subjectId = null;
                 // 学生声部
-                Subject subject = subjectDao.getSubjectMatchByName(info.getSubjectName());
-                if (Objects.nonNull(subject)) {
-                    subjectId = String.valueOf(subject.getId());
+                if (!StringUtil.isEmpty(info.getSubjectName())) {
+                    Subject subject = subjectDao.getSubjectMatchByName(info.getSubjectName());
+                    if (Objects.nonNull(subject)) {
+                        subjectId = String.valueOf(subject.getId());
+                    }
                 }
 
                 // 添加学生帐号
@@ -263,6 +274,7 @@ public class StudentServiceImpl extends ServiceImpl<StudentDao, Student> impleme
                 student.setUserId(user.getId());
                 student.setSubjectId(subjectId);
                 student.setUnionId(info.getUnionId());
+                student.setLockFlag(UserLockFlag.codeOf(Optional.ofNullable(info.getLockFlag()).orElse(0)));
                 save(student);
 
                 // 更新标识
@@ -271,7 +283,10 @@ public class StudentServiceImpl extends ServiceImpl<StudentDao, Student> impleme
 
                 com.yonge.cooleshow.biz.dal.entity.SysUser updateEntity = new com.yonge.cooleshow.biz.dal.entity.SysUser();
                 updateEntity.setId(sysUser.getId());
-                updateEntity.setDelFlag(0); // 激活帐号
+                updateEntity.setDelFlag(Optional.ofNullable(info.getLockFlag()).orElse(0)); // 激活帐号
+                if (StringUtils.isBlank(sysUser.getUsername())) {
+                    updateEntity.setUsername(info.getUsername());
+                }
                 // 激活帐号
                 sysUserMapper.updateById(updateEntity);
 
@@ -314,6 +329,7 @@ public class StudentServiceImpl extends ServiceImpl<StudentDao, Student> impleme
                 lambdaUpdate()
                         .eq(Student::getUserId, student.getUserId())
                         .set(Student::getUnionId, info.getUnionId())
+                        .set(Student::getLockFlag, UserLockFlag.codeOf(Optional.ofNullable(info.getLockFlag()).orElse(0)))
                         .update();
             } else {
                 studentResp.setUnionId(student.getUnionId());

+ 8 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/wrapper/StudentWrapper.java

@@ -1,5 +1,6 @@
 package com.yonge.cooleshow.biz.dal.wrapper;
 
+import com.yonge.cooleshow.biz.dal.entity.SysUser;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.AllArgsConstructor;
@@ -40,6 +41,11 @@ public class StudentWrapper {
         @ApiModelProperty("性别(0,女  1,男)")
         private Integer gender;
 
+        @ApiModelProperty("是否校验token")
+        private Boolean tokenCheck;
+
+        @ApiModelProperty("0-正常,1-锁定")
+        private Integer lockFlag;
     }
 
     @Data
@@ -64,6 +70,8 @@ public class StudentWrapper {
         @ApiModelProperty("更新标识")
         private Boolean updateFlag;
 
+        private SysUser sysUser;
+
         public UnionStudentResp userId(Long userId) {
             this.userId = userId;
             return this;