shenzhongzheng пре 2 година
родитељ
комит
ff47bb594c
13 измењених фајлова са 526 додато и 3 уклоњено
  1. 12 2
      jeecg-module-system/jeecg-system-biz/pom.xml
  2. 42 0
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/rooms/Enum/CouponEnums.java
  3. 21 0
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/rooms/config/RedisLockConfig.java
  4. 58 0
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/rooms/controller/CesGoodStockRecordsController.java
  5. 8 1
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/rooms/controller/CesGoodsController.java
  6. 93 0
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/rooms/entity/CesGoodStockRecords.java
  7. 4 0
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/rooms/entity/CesGoodStockRecordsDto.java
  8. 96 0
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/rooms/entity/CesMealCoupon.java
  9. 16 0
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/rooms/mapper/CesGoodStockRecordsMapper.java
  10. 16 0
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/rooms/mapper/CesMealCouponMapper.java
  11. 100 0
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/rooms/service/CesGoodStockRecordsServiceImpl.java
  12. 14 0
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/rooms/service/CesGoodsServiceImpl.java
  13. 46 0
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/rooms/service/CesMealCouponServiceImpl.java

+ 12 - 2
jeecg-module-system/jeecg-system-biz/pom.xml

@@ -34,11 +34,21 @@
 			<groupId>org.jeecgframework.jimureport</groupId>
 			<artifactId>jimureport-spring-boot-starter</artifactId>
 		</dependency>
-		<!-- 积木报表 mongo redis 支持包 
+		<!-- 积木报表 mongo redis 支持包
 		<dependency>
 			<groupId>org.jeecgframework.jimureport</groupId>
 			<artifactId>jimureport-nosql-starter</artifactId>
 		</dependency>-->
+
+		<dependency>
+			<groupId>org.springframework.boot</groupId>
+			<artifactId>spring-boot-starter-integration</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>org.springframework.integration</groupId>
+			<artifactId>spring-integration-redis</artifactId>
+		</dependency>
+
 	</dependencies>
-	
+
 </project>

+ 42 - 0
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/rooms/Enum/CouponEnums.java

@@ -252,4 +252,46 @@ public class CouponEnums {
 		}
 
 	}
+
+	/**
+	 *
+	 */
+	public static enum CesGoodsStockRecordsScopeEnum {
+		ENTER(1, "进"), REFUND(2, "退");
+		int code = 0;
+		String value = "";
+
+		private CesGoodsStockRecordsScopeEnum(int code, String value) {
+			this.code = code;
+			this.value = value;
+		}
+
+		public int code() {
+			return code;
+		}
+
+		public String getValue() {
+			return value;
+		}
+
+		//根据CODE获取类型
+		public static CesGoodsStockRecordsScopeEnum val(int vcode) {
+			for (CesGoodsStockRecordsScopeEnum bld : values()) {
+				if (bld.code == vcode) {
+					return bld;
+				}
+			}
+			return REFUND;
+		}
+
+		public static CesGoodsStockRecordsScopeEnum val(String value) {
+			for (CesGoodsStockRecordsScopeEnum bld : values()) {
+				if (bld.value.equals(value)) {
+					return bld;
+				}
+			}
+			return REFUND;
+		}
+
+	}
 }

+ 21 - 0
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/rooms/config/RedisLockConfig.java

@@ -0,0 +1,21 @@
+package org.jeecg.modules.rooms.config;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.data.redis.connection.RedisConnectionFactory;
+import org.springframework.integration.redis.util.RedisLockRegistry;
+
+/**
+ * 分布式redis锁配置
+ */
+@Configuration
+public class RedisLockConfig {
+    @Bean
+    public RedisLockRegistry redisLockRegistry(RedisConnectionFactory redisConnectionFactory) {
+        //第一个参数redisConnectionFactory
+        //第二个参数registryKey,分布式锁前缀,设置为项目名称会好些
+        //该构造方法对应的分布式锁,默认有效期是60秒.可以自定义
+        return new RedisLockRegistry(redisConnectionFactory, "hotel-redis-lock");
+    }
+
+}

+ 58 - 0
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/rooms/controller/CesGoodStockRecordsController.java

@@ -0,0 +1,58 @@
+package org.jeecg.modules.rooms.controller;
+
+
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.jeecg.common.Enum.ResultCode;
+import org.jeecg.common.api.vo.Result;
+import org.jeecg.common.aspect.annotation.AutoLog;
+import org.jeecg.modules.rooms.entity.CesGoodStockRecords;
+import org.jeecg.modules.rooms.entity.CesGoodStockRecordsDto;
+import org.jeecg.modules.rooms.service.CesGoodStockRecordsServiceImpl;
+import org.springframework.web.bind.annotation.*;
+
+import org.springframework.stereotype.Controller;
+
+import javax.annotation.Resource;
+
+/**
+ * <p>
+ * 商品进退货记录表 前端控制器
+ * </p>
+ *
+ * @author fendo
+ * @since 2023-03-14
+ */
+@RestController
+@RequestMapping("/rooms/cesGoodStockRecords")
+@Api(tags="CesGoodStockRecordsController")
+@Slf4j
+public class CesGoodStockRecordsController {
+
+    @Resource
+    private CesGoodStockRecordsServiceImpl stockRecordsService;
+
+
+    @AutoLog(value = "创建")
+    @ApiOperation(value="创建", notes="创建")
+    @PostMapping(value = "/create")
+    public Result create(@RequestBody CesGoodStockRecordsDto dto){
+        if(StringUtils.isBlank(dto.getGoodId())){
+            return Result.error(ResultCode.PARAM_MISS);
+        }
+        if(StringUtils.isBlank(dto.getHotelId())){
+            return Result.error(ResultCode.PARAM_MISS);
+        }
+        if(StringUtils.isBlank(dto.getHotelId())){
+            return Result.error(ResultCode.PARAM_MISS);
+        }
+        if(dto.getGoodNum().intValue() < 0){
+            return Result.error(ResultCode.PARAM_MISS);
+        }
+        return stockRecordsService.create(dto);
+    }
+
+}
+

+ 8 - 1
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/rooms/controller/CesGoodsController.java

@@ -1,14 +1,18 @@
 package org.jeecg.modules.rooms.controller;
 
 
+import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
 import org.jeecg.common.Enum.ResultCode;
 import org.jeecg.common.api.vo.Result;
+import org.jeecg.common.system.base.controller.JeecgController;
 import org.jeecg.modules.rooms.DTO.CesGoodsDelDto;
 import org.jeecg.modules.rooms.DTO.CesGoodsDto;
 import org.jeecg.modules.rooms.DTO.CesGoodsSearchDto;
 import org.jeecg.modules.rooms.DTO.CesGoodsUnitSearchDto;
+import org.jeecg.modules.rooms.entity.CesGoods;
 import org.jeecg.modules.rooms.service.CesGoodsServiceImpl;
 import org.springframework.web.bind.annotation.*;
 
@@ -29,7 +33,9 @@ import java.util.stream.Stream;
  */
 @Controller
 @RequestMapping("/rooms/cesGoods")
-public class CesGoodsController {
+@Api(tags="CesGoodsController")
+@Slf4j
+public class CesGoodsController extends JeecgController<CesGoods,CesGoodsServiceImpl> {
 
     @Resource
     private CesGoodsServiceImpl goodsService;
@@ -128,6 +134,7 @@ public class CesGoodsController {
         try{
             return goodsService.delete(id,hotelId);
         }catch (Exception e){
+
             return Result.error(e.getMessage());
         }
     }

+ 93 - 0
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/rooms/entity/CesGoodStockRecords.java

@@ -0,0 +1,93 @@
+package org.jeecg.modules.rooms.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import java.time.LocalDateTime;
+import com.baomidou.mybatisplus.annotation.TableField;
+import java.io.Serializable;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * <p>
+ * 商品进退货记录表
+ * </p>
+ *
+ * @author fendo
+ * @since 2023-03-14
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@TableName("ces_good_stock_records")
+public class CesGoodStockRecords extends Model<CesGoodStockRecords> {
+
+    private static final long serialVersionUID = 1L;
+
+    private String id;
+
+    /**
+     * 酒店ID
+     */
+    private String hotelId;
+
+    private String goodId;
+
+    /**
+     * 进退货  1  进 2 退
+     */
+    private Integer type;
+
+    /**
+     * 数量
+     */
+    private Integer goodNum;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+    /**
+     * 创建时间
+     */
+    @TableField("createAt")
+    private LocalDateTime createAt;
+
+    /**
+     * 修改时间
+     */
+    @TableField("updateAt")
+    private LocalDateTime updateAt;
+
+    /**
+     * 逻辑删除字段
+     */
+    private Boolean invalid;
+
+
+    public static final String ID = "id";
+
+    public static final String HOTEL_ID = "hotel_id";
+
+    public static final String GOOD_ID = "good_id";
+
+    public static final String TYPE = "type";
+
+    public static final String GOOD_NUM = "good_num";
+
+    public static final String REMARK = "remark";
+
+    public static final String CREATEAT = "createAt";
+
+    public static final String UPDATEAT = "updateAt";
+
+    public static final String INVALID = "invalid";
+
+    @Override
+    public Serializable pkVal() {
+        return this.id;
+    }
+
+}

+ 4 - 0
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/rooms/entity/CesGoodStockRecordsDto.java

@@ -0,0 +1,4 @@
+package org.jeecg.modules.rooms.entity;
+
+public class CesGoodStockRecordsDto extends CesGoodStockRecords{
+}

+ 96 - 0
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/rooms/entity/CesMealCoupon.java

@@ -0,0 +1,96 @@
+package org.jeecg.modules.rooms.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import java.time.LocalDateTime;
+import com.baomidou.mybatisplus.annotation.TableField;
+import java.io.Serializable;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * <p>
+ * 餐卷设置
+ * </p>
+ *
+ * @author fendo
+ * @since 2023-03-14
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@TableName("ces_meal_coupon")
+public class CesMealCoupon extends Model<CesMealCoupon> {
+
+    private static final long serialVersionUID = 1L;
+
+    private String id;
+
+    /**
+     * 酒店ID
+     */
+    private String hotelId;
+
+    /**
+     * 名称
+     */
+    private String name;
+
+    /**
+     * 自动发放
+     */
+    private Boolean autoProvide;
+
+    /**
+     * 是否启用
+     */
+    private Boolean appState;
+
+    /**
+     * 开始时间(小时数分钟)
+     */
+    private String startDate;
+
+    /**
+     * 结束时间(同上)
+     */
+    private String endDate;
+
+    /**
+     * 创建时间
+     */
+    @TableField("createAt")
+    private LocalDateTime createAt;
+
+    /**
+     * 修改时间
+     */
+    @TableField("updateAt")
+    private LocalDateTime updateAt;
+
+
+    public static final String ID = "id";
+
+    public static final String HOTEL_ID = "hotel_id";
+
+    public static final String NAME = "name";
+
+    public static final String AUTO_PROVIDE = "auto_provide";
+
+    public static final String APP_STATE = "app_state";
+
+    public static final String START_DATE = "start_date";
+
+    public static final String END_DATE = "end_date";
+
+    public static final String CREATEAT = "createAt";
+
+    public static final String UPDATEAT = "updateAt";
+
+    @Override
+    public Serializable pkVal() {
+        return this.id;
+    }
+
+}

+ 16 - 0
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/rooms/mapper/CesGoodStockRecordsMapper.java

@@ -0,0 +1,16 @@
+package org.jeecg.modules.rooms.mapper;
+
+import org.jeecg.modules.rooms.entity.CesGoodStockRecords;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ * 商品进退货记录表 Mapper 接口
+ * </p>
+ *
+ * @author fendo
+ * @since 2023-03-14
+ */
+public interface CesGoodStockRecordsMapper extends BaseMapper<CesGoodStockRecords> {
+
+}

+ 16 - 0
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/rooms/mapper/CesMealCouponMapper.java

@@ -0,0 +1,16 @@
+package org.jeecg.modules.rooms.mapper;
+
+import org.jeecg.modules.rooms.entity.CesMealCoupon;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ * 餐卷设置 Mapper 接口
+ * </p>
+ *
+ * @author fendo
+ * @since 2023-03-14
+ */
+public interface CesMealCouponMapper extends BaseMapper<CesMealCoupon> {
+
+}

+ 100 - 0
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/rooms/service/CesGoodStockRecordsServiceImpl.java

@@ -0,0 +1,100 @@
+package org.jeecg.modules.rooms.service;
+
+import cn.hutool.core.bean.BeanUtil;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.apache.commons.lang3.ObjectUtils;
+import org.jeecg.common.api.vo.Result;
+import org.jeecg.common.exception.JeecgBootException;
+import org.jeecg.modules.rooms.entity.CesGoodStockRecords;
+import org.jeecg.modules.rooms.entity.CesGoodStockRecordsDto;
+import org.jeecg.modules.rooms.entity.CesGoods;
+import org.jeecg.modules.rooms.mapper.CesGoodStockRecordsMapper;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.integration.redis.util.RedisLockRegistry;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import javax.transaction.Transactional;
+import java.time.LocalDateTime;
+import java.util.concurrent.locks.Lock;
+
+/**
+ * <p>
+ * 商品进退货记录表 服务实现类
+ * </p>
+ *
+ * @author fendo
+ * @since 2023-03-14
+ */
+@Service
+public class CesGoodStockRecordsServiceImpl extends ServiceImpl<CesGoodStockRecordsMapper, CesGoodStockRecords> implements IService<CesGoodStockRecords> {
+    private static  final Logger logger = LoggerFactory.getLogger(CesGoodStockRecordsServiceImpl.class);
+    @Resource
+    private CesGoodStockRecordsMapper stockRecordsMapper;
+
+    @Resource
+    private CesGoodsServiceImpl goodsService;
+
+    @Resource
+    private RedisLockRegistry redisLockRegistry;
+
+    @Transactional(rollbackOn = Exception.class)
+    public Result create(CesGoodStockRecordsDto dto){
+        //查询商品是否存在
+        CesGoods goods = goodsService.fetchByIdAndHotelId(dto.getGoodId(),dto.getHotelId());
+        if(ObjectUtils.isEmpty(goods)) return Result.error("商品数据未找到!");
+
+        /**
+         * 这里需要锁资源  分布式事务锁 采用redis 实现  考虑到数据操作的原子性 (设置redis 锁一定要同步设置过期时间 3 秒 )
+         */
+        String key = String.format("stock::record::create:%s:%s", dto.getGoodId(),dto.getHotelId());
+        Lock lock = redisLockRegistry.obtain(key);  //获取锁资源
+        logger.info("lock begin");
+        logger.info("创建 redis 资源锁 key:{}", key);
+        try{
+            //开启锁
+            lock.lock();
+            logger.info("开启 redis 资源锁");
+
+            //业务逻辑处理 减库存 加库存 这样写更清晰
+            int num = dto.getGoodNum().intValue();
+            int count = goods.getInventory().intValue();
+
+            switch (dto.getType().intValue()){
+                case 1: //进货
+                    goods.setInventory(count + num);
+                    break;
+                case 2:
+                    //如果商品的库存数量 小于 需要减去库存的数量 则 提示错误
+                    if(count < num) throw new JeecgBootException("该商品的库存数量小于需要减去的数量,请重新填入!");
+                    goods.setInventory(count - num);
+                    break;
+            }
+            //先保存 记录数据 再去扣除库存 加锁
+            CesGoodStockRecords records = new CesGoodStockRecords();
+            BeanUtil.copyProperties(dto,records);
+            records.setCreateAt(LocalDateTime.now());
+            records.setUpdateAt(LocalDateTime.now());
+            records.setInvalid(false);
+
+            int insert_count = stockRecordsMapper.insert(records);
+            //修改商品数据
+            if(num > 0){ //必须是大于0 再去修改
+                goods.setUpdateAt(LocalDateTime.now());
+                boolean flag = goodsService.updateById(goods);
+                if(!flag) throw  new JeecgBootException("修改商品失败!");
+            }
+        }catch (Exception e){
+            return Result.error(e.getMessage());
+        }finally {
+            //释放锁
+            lock.unlock();
+            logger.info("释放 redis 资源锁");
+            logger.info("lock end");
+        }
+        return Result.ok("创建成功!");
+    }
+
+}

+ 14 - 0
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/rooms/service/CesGoodsServiceImpl.java

@@ -182,6 +182,20 @@ public class CesGoodsServiceImpl extends ServiceImpl<CesGoodsMapper, CesGoods> i
     }
 
 
+    /**
+     * 查询酒店中的商品
+     * @param id
+     * @param hotelId
+     * @return
+     */
+    public CesGoods fetchByIdAndHotelId(String id,String hotelId){
+        if(StringUtils.isBlank(id) || StringUtils.isBlank(hotelId)) return null;
+        return goodsMapper.selectOne(Wrappers.<CesGoods>lambdaQuery().eq(CesGoods::getHotelId,hotelId).eq(CesGoods::getId,id).eq(CesGoods::getInvalid,false));
+    }
+
+
+
+
 
 
 

+ 46 - 0
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/rooms/service/CesMealCouponServiceImpl.java

@@ -0,0 +1,46 @@
+package org.jeecg.modules.rooms.service;
+
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.apache.commons.lang3.StringUtils;
+import org.jeecg.modules.rooms.Vo.SelectVo;
+import org.jeecg.modules.rooms.entity.CesMealCoupon;
+import org.jeecg.modules.rooms.mapper.CesMealCouponMapper;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * <p>
+ * 餐卷设置 服务实现类
+ * </p>
+ *
+ * @author fendo
+ * @since 2023-03-14
+ */
+@Service
+public class CesMealCouponServiceImpl extends ServiceImpl<CesMealCouponMapper, CesMealCoupon> implements IService<CesMealCoupon> {
+    @Resource
+    private CesMealCouponMapper cesMealCouponMapper;
+
+    /**
+     * 获取当前酒店的所有餐券类型
+     * @param hotelId
+     * @return
+     */
+    public List<SelectVo> fetch(String hotelId){
+        if(StringUtils.isBlank(hotelId)) return new ArrayList<>();
+        List<SelectVo> vos = new ArrayList<>();
+        List<CesMealCoupon> list = cesMealCouponMapper.selectList(Wrappers.<CesMealCoupon>lambdaQuery().eq(CesMealCoupon::getHotelId,hotelId));
+        list.forEach(v -> {
+            SelectVo vo = new SelectVo();
+            vo.setLabel(v.getName());
+            vo.setValue(v.getId());
+            vos.add(vo);
+        });
+        return vos;
+    }
+}