Bläddra i källkod

琴房课充值接口编写

liweifan 3 år sedan
förälder
incheckning
7cea896356

+ 12 - 34
cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/PianoRoomChangeRecordController.java

@@ -1,14 +1,16 @@
 package com.yonge.cooleshow.admin.controller;
 
+import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
+import com.yonge.cooleshow.auth.api.entity.SysUser;
 import com.yonge.cooleshow.common.controller.BaseController;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.yonge.toolset.base.page.PageInfo;
 import com.yonge.toolset.mybatis.support.PageUtil;
 
-import com.yonge.toolset.base.util.StringUtil;
 import io.swagger.annotations.*;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
 import org.springframework.web.bind.annotation.*;
 
 import javax.validation.Valid;
@@ -22,7 +24,8 @@ import com.yonge.cooleshow.biz.dal.service.PianoRoomChangeRecordService;
 @RequestMapping("/pianoRoomChangeRecord")
 @Api(value = "琴房时长变更记录表", tags = "琴房时长变更记录表")
 public class PianoRoomChangeRecordController extends BaseController {
-
+	@Autowired
+	private SysUserFeignService sysUserFeignService;
     @Autowired
     private PianoRoomChangeRecordService pianoRoomChangeRecordService;
 
@@ -48,39 +51,14 @@ public class PianoRoomChangeRecordController extends BaseController {
     /**
 	 * 新增
 	 */
-	@PostMapping("/save")
+	@PostMapping("/add")
 	@ApiOperation(value = "新增", notes = "传入pianoRoomChangeRecord")
-	public HttpResponseResult save(@Valid @RequestBody PianoRoomChangeRecord pianoRoomChangeRecord) {
-    	return status(pianoRoomChangeRecordService.save(pianoRoomChangeRecord));
-	}
-    
-    /**
-	 * 修改
-	 */
-	@PostMapping("/update")
-	@ApiOperation(value = "修改", notes = "传入pianoRoomChangeRecord")
-	public HttpResponseResult update(@Valid @RequestBody PianoRoomChangeRecord pianoRoomChangeRecord) {
-        return status(pianoRoomChangeRecordService.updateById(pianoRoomChangeRecord));
-	}
-    
-    /**
-	 * 新增或修改
-	 */
-    @PostMapping("/submit")
-    @ApiOperation(value = "新增或修改", notes = "传入pianoRoomChangeRecord")
-	public HttpResponseResult submit(@Valid @RequestBody PianoRoomChangeRecord pianoRoomChangeRecord) {
-        return status(pianoRoomChangeRecordService.saveOrUpdate(pianoRoomChangeRecord));
-    }
-
- 	/**
-	 * 删除
-	 */
-	@PostMapping("/remove")
-	@ApiOperation(value = "删除", notes = "传入ids")
-	public HttpResponseResult remove(@ApiParam(value = "主键集合", required = true) @RequestParam String ids) {
-        if (StringUtil.isEmpty(ids)) {
-			return failed("参数不能为空");
+	public HttpResponseResult add(@Valid @RequestBody PianoRoomChangeRecord pianoRoomChangeRecord) {
+		SysUser user = sysUserFeignService.queryUserInfo();
+		if (user == null || null == user.getId()) {
+			return failed(HttpStatus.FORBIDDEN, "请登录");
 		}
-		return status(pianoRoomChangeRecordService.removeByIds(StringUtil.toLongList(ids)));
+		pianoRoomChangeRecord.setCreateBy(user.getId());
+    	return status(pianoRoomChangeRecordService.add(pianoRoomChangeRecord));
 	}
 }

+ 66 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/search/PianoRoomChangeRecordSearch.java

@@ -1,7 +1,15 @@
 package com.yonge.cooleshow.biz.dal.dto.search;
 
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.yonge.cooleshow.biz.dal.enums.InOrOutEnum;
 import com.yonge.toolset.base.page.QueryInfo;
 import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import javax.validation.constraints.NotNull;
+import java.time.LocalDateTime;
 
 /**
  * @Author: liweifan
@@ -11,4 +19,62 @@ import io.swagger.annotations.ApiModel;
 public class PianoRoomChangeRecordSearch extends QueryInfo{
 	private static final long serialVersionUID = 1L;
 
+	@ApiModelProperty("用户id ")
+	private Long userId;
+
+	@ApiModelProperty("操作类型:IN、增加 OUT、减少 ")
+	private InOrOutEnum inOrOut;
+
+	@ApiModelProperty("操作人")
+	private String operaUser;
+
+	@ApiModelProperty(value = "交易开始时间")
+	@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+	private LocalDateTime startTime;
+
+	@ApiModelProperty(value = "交易结束时间")
+	@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+	private LocalDateTime endTime;
+
+	public Long getUserId() {
+		return userId;
+	}
+
+	public void setUserId(Long userId) {
+		this.userId = userId;
+	}
+
+	public InOrOutEnum getInOrOut() {
+		return inOrOut;
+	}
+
+	public void setInOrOut(InOrOutEnum inOrOut) {
+		this.inOrOut = inOrOut;
+	}
+
+	public String getOperaUser() {
+		return operaUser;
+	}
+
+	public void setOperaUser(String operaUser) {
+		this.operaUser = operaUser;
+	}
+
+	public LocalDateTime getStartTime() {
+		return startTime;
+	}
+
+	public void setStartTime(LocalDateTime startTime) {
+		this.startTime = startTime;
+	}
+
+	public LocalDateTime getEndTime() {
+		return endTime;
+	}
+
+	public void setEndTime(LocalDateTime endTime) {
+		this.endTime = endTime;
+	}
 }

+ 27 - 6
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/PianoRoomChangeRecord.java

@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
+import com.yonge.cooleshow.biz.dal.enums.InOrOutEnum;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 
@@ -12,6 +13,10 @@ import java.util.Date;
 import com.fasterxml.jackson.annotation.JsonFormat;
 import org.springframework.format.annotation.DateTimeFormat;
 
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+import javax.validation.constraints.Positive;
+
 /**
  * 琴房时长变更记录表
  */
@@ -24,23 +29,32 @@ public class PianoRoomChangeRecord implements Serializable {
     private Long id;
     @ApiModelProperty("用户id ")
 	@TableField(value = "user_id_")
+    @NotNull(message = "用户ID不能为空")
     private Long userId;
     @ApiModelProperty("时长(分) ")
 	@TableField(value = "times_")
+    @NotNull(message = "时长不能为空")
+    @Positive(message = "时长必须大于0")
     private Integer times;
-    @ApiModelProperty("收支类型:IN、增加 OUT、减少 ")
+    @ApiModelProperty("操作类型:IN、增加 OUT、减少 ")
 	@TableField(value = "in_or_out_")
-    private String inOrOut;
+    @NotNull(message = "操作类型不能为空")
+    private InOrOutEnum inOrOut;
     @ApiModelProperty("原因 ")
 	@TableField(value = "reason_")
+    @NotBlank(message = "原因不能为空")
     private String reason;
     @ApiModelProperty("创建时间 ")
 	@TableField(value = "create_time_")
     @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
     private Date createTime;
+    @ApiModelProperty("创建人 ")
+    @TableField(value = "create_by_")
+    private Long createBy;
+
 
-	public Long getId() {
+    public Long getId() {
         return id;
     }
 
@@ -64,11 +78,11 @@ public class PianoRoomChangeRecord implements Serializable {
         this.times = times;
     }
     
-	public String getInOrOut() {
+	public InOrOutEnum getInOrOut() {
         return inOrOut;
     }
 
-    public void setInOrOut(String inOrOut) {
+    public void setInOrOut(InOrOutEnum inOrOut) {
         this.inOrOut = inOrOut;
     }
     
@@ -87,5 +101,12 @@ public class PianoRoomChangeRecord implements Serializable {
     public void setCreateTime(Date createTime) {
         this.createTime = createTime;
     }
-    
+
+    public Long getCreateBy() {
+        return createBy;
+    }
+
+    public void setCreateBy(Long createBy) {
+        this.createBy = createBy;
+    }
 }

+ 2 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/PianoRoomChangeRecordService.java

@@ -26,4 +26,6 @@ public interface PianoRoomChangeRecordService extends IService<PianoRoomChangeRe
  	 * @date 2022-08-03
      */
     IPage<PianoRoomChangeRecordVo> selectPage(IPage<PianoRoomChangeRecordVo> page, PianoRoomChangeRecordSearch query);
+
+	boolean add(PianoRoomChangeRecord pianoRoomChangeRecord);
 }

+ 54 - 4
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/PianoRoomChangeRecordServiceImpl.java

@@ -1,7 +1,16 @@
 package com.yonge.cooleshow.biz.dal.service.impl;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.yonge.cooleshow.biz.dal.entity.PianoRoomTime;
+import com.yonge.cooleshow.biz.dal.enums.InOrOutEnum;
+import com.yonge.cooleshow.biz.dal.service.PianoRoomTimeService;
+import com.yonge.cooleshow.common.enums.CacheNameEnum;
+import com.yonge.toolset.base.exception.BizException;
+import com.yonge.toolset.payment.util.DistributedLock;
+import org.redisson.api.RedissonClient;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -10,20 +19,61 @@ import com.yonge.cooleshow.biz.dal.vo.PianoRoomChangeRecordVo;
 import com.yonge.cooleshow.biz.dal.dto.search.PianoRoomChangeRecordSearch;
 import com.yonge.cooleshow.biz.dal.dao.PianoRoomChangeRecordDao;
 import com.yonge.cooleshow.biz.dal.service.PianoRoomChangeRecordService;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.Date;
 
 
 @Service
 public class PianoRoomChangeRecordServiceImpl extends ServiceImpl<PianoRoomChangeRecordDao, PianoRoomChangeRecord> implements PianoRoomChangeRecordService {
     private final static Logger log = LoggerFactory.getLogger(PianoRoomChangeRecordServiceImpl.class);
+    @Autowired
+    private RedissonClient redissonClient;
+    @Autowired
+    private PianoRoomTimeService pianoRoomTimeService;
 
-	@Override
+    @Override
     public PianoRoomChangeRecordVo detail(Long id) {
         return baseMapper.detail(id);
     }
-    
+
     @Override
-    public IPage<PianoRoomChangeRecordVo> selectPage(IPage<PianoRoomChangeRecordVo> page, PianoRoomChangeRecordSearch query){
+    public IPage<PianoRoomChangeRecordVo> selectPage(IPage<PianoRoomChangeRecordVo> page, PianoRoomChangeRecordSearch query) {
         return page.setRecords(baseMapper.selectPage(page, query));
     }
-	
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public boolean add(PianoRoomChangeRecord pianoRoomChangeRecord) {
+        //保存记录
+        save(pianoRoomChangeRecord);
+        //入琴房账户
+        DistributedLock.of(redissonClient)
+                .runIfLockToFunction(CacheNameEnum.LOCK_CHANGE_PIANO_ROOM_ACCOUNT.getRedisKey(pianoRoomChangeRecord.getUserId())
+                        , (o) -> {
+                            PianoRoomTime pianoRoomTime = pianoRoomTimeService.getOne(Wrappers.<PianoRoomTime>lambdaQuery()
+                                    .eq(PianoRoomTime::getTeacherId, pianoRoomChangeRecord.getUserId()));
+
+                            if (null == pianoRoomTime) {
+                                pianoRoomTime = new PianoRoomTime();
+                                pianoRoomTime.setTeacherId(pianoRoomChangeRecord.getUserId());
+                                pianoRoomTimeService.save(pianoRoomTime);
+                            }
+
+                            if (InOrOutEnum.IN.equals(pianoRoomChangeRecord.getInOrOut())) {
+                                pianoRoomTime.setRemainTime(pianoRoomTime.getRemainTime() + pianoRoomChangeRecord.getTimes());
+                            } else {
+                                pianoRoomTime.setRemainTime(pianoRoomTime.getRemainTime() - pianoRoomChangeRecord.getTimes());
+                            }
+
+                            if (pianoRoomTime.getRemainTime() < 0) {
+                                throw new BizException("时长余额不足");
+                            }
+                            pianoRoomTime.setUpdateTime(new Date());
+                            pianoRoomTimeService.updateById(pianoRoomTime);
+                            return null;
+                        }, null, 10l);
+        return true;
+    }
+
 }

+ 12 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/PianoRoomChangeRecordVo.java

@@ -2,6 +2,7 @@ package com.yonge.cooleshow.biz.dal.vo;
 
 import com.yonge.cooleshow.biz.dal.entity.PianoRoomChangeRecord;
 import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
 
 /**
  * @Author: liweifan
@@ -10,4 +11,15 @@ import io.swagger.annotations.ApiModel;
 @ApiModel(value = "PianoRoomChangeRecordVo对象", description = "琴房时长变更记录表查询视图对象")
 public class PianoRoomChangeRecordVo extends PianoRoomChangeRecord{
 	private static final long serialVersionUID = 1L;
+
+	@ApiModelProperty("操作人")
+	private String operaUser;
+
+	public String getOperaUser() {
+		return operaUser;
+	}
+
+	public void setOperaUser(String operaUser) {
+		this.operaUser = operaUser;
+	}
 }

+ 41 - 18
cooleshow-user/user-biz/src/main/resources/config/mybatis/PianoRoomChangeRecordMapper.xml

@@ -1,35 +1,58 @@
 <?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.yonge.cooleshow.biz.dal.dao.PianoRoomChangeRecordDao">
-	<resultMap id="BaseResultMap" type="com.yonge.cooleshow.biz.dal.entity.PianoRoomChangeRecord">
-            <result column="id_" property="id" />
-	        <result column="user_id_" property="userId" />
-	        <result column="times_" property="times" />
-	        <result column="in_or_out_" property="inOrOut" />
-	        <result column="reason_" property="reason" />
-	        <result column="create_time_" property="createTime" />
-		</resultMap>  
-    
+    <resultMap id="BaseResultMap" type="com.yonge.cooleshow.biz.dal.entity.PianoRoomChangeRecord">
+        <result column="id_" property="id" />
+        <result column="user_id_" property="userId" />
+        <result column="times_" property="times" />
+        <result column="in_or_out_" property="inOrOut" />
+        <result column="reason_" property="reason" />
+        <result column="create_time_" property="createTime" />
+        <result column="create_by_" property="createBy" />
+    </resultMap>
+
     <!-- 表字段 -->
     <sql id="baseColumns">
-         t.id_ as id
+        t.id_ as id
         , t.user_id_ as userId
         , t.times_ as times
         , t.in_or_out_ as inOrOut
         , t.reason_ as reason
         , t.create_time_ as createTime
-        </sql> 
-    
+        , t.create_by_ as createBy
+    </sql>
+
     <select id="detail" resultType="com.yonge.cooleshow.biz.dal.vo.PianoRoomChangeRecordVo">
         SELECT
-            <include refid="baseColumns"/>
+            <include refid="baseColumns" />,
+            ifnull(u.real_name_,u.username_) as operaUser
         FROM piano_room_change_record t
+        left join sys_user u on t.create_by_ = u.id_
         where t.id_ = #{id}
     </select>
-    
+
     <select id="selectPage" resultType="com.yonge.cooleshow.biz.dal.vo.PianoRoomChangeRecordVo">
-		SELECT         
-        	<include refid="baseColumns" />
-		FROM piano_room_change_record t
-	</select>
+        SELECT
+            <include refid="baseColumns" />,
+            ifnull(u.real_name_,u.username_) as operaUser
+        FROM piano_room_change_record t
+        left join sys_user u on t.create_by_ = u.id_
+        <where>
+            <if test="param.userId != null">
+                and t.user_id_ = #{param.userId}
+            </if>
+            <if test="param.inOrOut != null">
+                and t.in_or_out_ = #{param.inOrOut}
+            </if>
+            <if test="param.operaUser != null and param.operaUser != ''">
+                and u.username_ LIKE CONCAT('%', #{param.operaUser}, '%')
+            </if>
+            <if test="param.startTime !=null">
+                <![CDATA[AND t.created_time_ >= #{param.startTime} ]]>
+            </if>
+            <if test="param.endTime !=null">
+                <![CDATA[AND t.created_time_ <= #{param.endTime} ]]>
+            </if>
+        </where>
+    </select>
 </mapper>