Pārlūkot izejas kodu

Merge remote-tracking branch 'origin/master'

zouxuan 3 gadi atpakaļ
vecāks
revīzija
69cb1233ac
54 mainītis faili ar 1207 papildinājumiem un 392 dzēšanām
  1. 35 6
      cooleshow-common/src/main/java/com/yonge/cooleshow/common/constant/SysConfigConstant.java
  2. 2 0
      cooleshow-common/src/main/java/com/yonge/cooleshow/common/enums/CacheNameEnum.java
  3. 2 2
      cooleshow-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/controller/OmsOrderController.java
  4. 1 1
      cooleshow-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/dao/OmsOrderDao.java
  5. 58 0
      cooleshow-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/dto/OrderVo.java
  6. 2 2
      cooleshow-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/service/OmsOrderService.java
  7. 1 1
      cooleshow-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/service/impl/OmsOrderServiceImpl.java
  8. 24 11
      cooleshow-mall/mall-admin/src/main/resources/config/mybatis/OmsOrderDao.xml
  9. 11 0
      cooleshow-mall/mall-mbg/src/main/java/com/yonge/cooleshow/mbg/model/OmsCartItem.java
  10. 5 0
      cooleshow-mall/mall-mbg/src/main/java/com/yonge/cooleshow/mbg/model/OmsCartItemExample.java
  11. 20 5
      cooleshow-mall/mall-mbg/src/main/resources/config/mybatis/OmsCartItemMapper.xml
  12. 5 5
      cooleshow-mall/mall-mbg/src/main/resources/config/mybatis/UserOrderPaymentMapper.xml
  13. 7 2
      cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/impl/OmsCartItemServiceImpl.java
  14. 0 28
      cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/AdminSysUserContractRecordController.java
  15. 1 1
      cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/UserOrderRefundController.java
  16. 49 23
      cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/UserWithdrawalController.java
  17. 8 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/MusicSheetDao.java
  18. 31 17
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/UserWithdrawalDao.java
  19. 4 4
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/req/AuthOperaReq.java
  20. 12 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/search/SysUserContractRecordSearch.java
  21. 39 5
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/search/TeacherWithdrawalSearch.java
  22. 79 10
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/UserWithdrawal.java
  23. 2 2
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/sdk/WithdrawSdk.java
  24. 9 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/MusicSheetAuthRecordService.java
  25. 8 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/MusicSheetService.java
  26. 1 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/UserOrderRefundService.java
  27. 15 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/UserWithdrawalService.java
  28. 33 11
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/CourseGroupServiceImpl.java
  29. 1 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/CourseHomeworkServiceImpl.java
  30. 41 11
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/CourseScheduleServiceImpl.java
  31. 1 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/LiveRoomServiceImpl.java
  32. 14 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/MusicSheetAuthRecordServiceImpl.java
  33. 9 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/MusicSheetServiceImpl.java
  34. 9 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/StudentCourseHomeworkServiceImpl.java
  35. 8 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/StudentServiceImpl.java
  36. 39 34
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/TeacherAuthEntryRecordServiceImpl.java
  37. 31 25
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/TeacherAuthMusicianRecordServiceImpl.java
  38. 26 22
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/TeacherStyleVideoServiceImpl.java
  39. 34 30
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserOrderRefundServiceImpl.java
  40. 266 91
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserWithdrawalServiceImpl.java
  41. 34 2
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/CourseScheduleStudentVo.java
  42. 11 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/MusicSheetDetailVo.java
  43. 58 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/TeacherAuditMusicSheetVo.java
  44. 21 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/UserWithdrawalVo.java
  45. 3 3
      cooleshow-user/user-biz/src/main/resources/config/mybatis/CourseHomeworkMapper.xml
  46. 6 1
      cooleshow-user/user-biz/src/main/resources/config/mybatis/CourseScheduleStudentPaymentMapper.xml
  47. 12 0
      cooleshow-user/user-biz/src/main/resources/config/mybatis/MusicSheetMapper.xml
  48. 5 3
      cooleshow-user/user-biz/src/main/resources/config/mybatis/SysUserContractRecordMapper.xml
  49. 1 1
      cooleshow-user/user-biz/src/main/resources/config/mybatis/UserBankCardMapper.xml
  50. 18 17
      cooleshow-user/user-biz/src/main/resources/config/mybatis/UserBindingTeacherMapper.xml
  51. 62 8
      cooleshow-user/user-biz/src/main/resources/config/mybatis/UserWithdrawalMapper.xml
  52. 23 1
      cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/UserWithdrawalController.java
  53. 1 0
      cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/task/TaskController.java
  54. 9 2
      cooleshow-user/user-website/src/main/java/com/yonge/cooleshow/website/controller/MusicSheetController.java

+ 35 - 6
cooleshow-common/src/main/java/com/yonge/cooleshow/common/constant/SysConfigConstant.java

@@ -19,12 +19,7 @@ public interface SysConfigConstant {
      * @updateTime 2022/3/24 10:20
      */
     String OPEN_LIVE_OVER_CLASS = "open_list_over_class";
-    /***
-     * 平台结算手续费
-     * @author liweifan
-     * @updateTime 2022/3/24 17:15
-     */
-    String WITHDRAWAL_SERVICE_FEE = "withdrawal_service_fee";
+
     /**
      * 陪练课服务费
      */
@@ -184,6 +179,40 @@ public interface SysConfigConstant {
      * 琴房课扣时公式
      */
     String PIANO_ROOM_TIME_FORMULA = "piano_room_time_formula";
+    /**
+     * 琴房课开课最小时长(分钟)
+     */
+    String PIANO_ROOM_MIN_TIME = "piano_room_min_time";
+    /***
+     * 结算开关 0 关闭 1开启
+     * @author liweifan
+     * @updateTime 2022/3/24 17:15
+     */
+    String WITHDRAWAL_SWITCH = "withdrawal_switch";
+    /***
+     * 结算审核开关 0 关闭 1开启
+     * @author liweifan
+     * @updateTime 2022/3/24 17:15
+     */
+    String WITHDRAWAL_AUTH_SWITCH = "withdrawal_auth_switch";
+    /***
+     * 结算审核额度(小于该额度免审核结算)
+     * @author liweifan
+     * @updateTime 2022/3/24 17:15
+     */
+    String WITHDRAWAL_AUTH_FEE = "withdrawal_auth_fee";
+    /***
+     * 一天最多结算次数
+     * @author liweifan
+     * @updateTime 2022/3/24 17:15
+     */
+    String WITHDRAWAL_MAX_COUNT = "withdrawal_max_count";
+    /***
+     * 平台结算手续费
+     * @author liweifan
+     * @updateTime 2022/3/24 17:15
+     */
+    String WITHDRAWAL_SERVICE_FEE = "withdrawal_service_fee";
 
     /** 公司名称 */
     String COMPANY_NAME = "company_name";

+ 2 - 0
cooleshow-common/src/main/java/com/yonge/cooleshow/common/enums/CacheNameEnum.java

@@ -22,6 +22,8 @@ public enum CacheNameEnum implements BaseEnum<String, CacheNameEnum> {
 
     LOCK_EXECUTE_ORDER("用户下单/付款/取消订单锁"),
     LOCK_CHANGE_ACCOUNT("账户变更锁"),
+    LOCK_WITHDRAWAL("锁用户结算"),
+
 
     ;
     /***

+ 2 - 2
cooleshow-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/controller/OmsOrderController.java

@@ -30,10 +30,10 @@ public class OmsOrderController {
     @ApiOperation("查询订单")
     @RequestMapping(value = "/list", method = RequestMethod.GET)
     @ResponseBody
-    public CommonResult<CommonPage<OmsOrder>> list(OmsOrderQueryParam queryParam,
+    public CommonResult<CommonPage<OrderVo>> list(OmsOrderQueryParam queryParam,
                                                    @RequestParam(value = "pageSize", defaultValue = "5") Integer pageSize,
                                                    @RequestParam(value = "pageNum", defaultValue = "1") Integer pageNum) {
-        List<OmsOrder> orderList = orderService.list(queryParam, pageSize, pageNum);
+        List<OrderVo> orderList = orderService.list(queryParam, pageSize, pageNum);
         return CommonResult.success(CommonPage.restPage(orderList));
     }
 

+ 1 - 1
cooleshow-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/dao/OmsOrderDao.java

@@ -17,7 +17,7 @@ public interface OmsOrderDao {
     /**
      * 条件查询订单
      */
-    List<OmsOrder> getList(@Param("queryParam") OmsOrderQueryParam queryParam);
+    List<OrderVo> getList(@Param("queryParam") OmsOrderQueryParam queryParam);
 
     /**
      * 批量发货

+ 58 - 0
cooleshow-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/dto/OrderVo.java

@@ -0,0 +1,58 @@
+package com.yonge.cooleshow.admin.dto;
+
+import com.yonge.cooleshow.mbg.model.OmsOrder;
+import io.swagger.annotations.ApiModelProperty;
+
+/**
+ * Description
+ *
+ * @author liujunchi
+ * @date 2022-06-21
+ */
+public class OrderVo extends OmsOrder {
+
+    @ApiModelProperty("用户编号")
+    private String userId;
+
+    @ApiModelProperty("用户昵称")
+    private String username;
+
+    @ApiModelProperty("手机号")
+    private String phone;
+
+    @ApiModelProperty("用户类型 STUDENT:学生  TEACHER:老师")
+    private String userType;
+
+
+    public String getUserId() {
+        return userId;
+    }
+
+    public void setUserId(String userId) {
+        this.userId = userId;
+    }
+
+    public String getUsername() {
+        return username;
+    }
+
+    public void setUsername(String username) {
+        this.username = username;
+    }
+
+    public String getPhone() {
+        return phone;
+    }
+
+    public void setPhone(String phone) {
+        this.phone = phone;
+    }
+
+    public String getUserType() {
+        return userType;
+    }
+
+    public void setUserType(String userType) {
+        this.userType = userType;
+    }
+}

+ 2 - 2
cooleshow-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/service/OmsOrderService.java

@@ -3,7 +3,6 @@ package com.yonge.cooleshow.admin.service;
 import com.yonge.cooleshow.admin.dto.*;
 import com.yonge.cooleshow.admin.dto.search.OrderStatisticalSearch;
 import com.yonge.cooleshow.admin.dto.search.UserStatisticalSearch;
-import com.yonge.cooleshow.mbg.model.OmsOrder;
 import org.springframework.transaction.annotation.Transactional;
 
 import java.util.List;
@@ -16,8 +15,9 @@ import java.util.Map;
 public interface OmsOrderService {
     /**
      * 订单查询
+     * @return
      */
-    List<OmsOrder> list(OmsOrderQueryParam queryParam, Integer pageSize, Integer pageNum);
+    List<OrderVo> list(OmsOrderQueryParam queryParam, Integer pageSize, Integer pageNum);
 
     /**
      * 批量发货

+ 1 - 1
cooleshow-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/service/impl/OmsOrderServiceImpl.java

@@ -54,7 +54,7 @@ public class OmsOrderServiceImpl implements OmsOrderService {
     private PmsProductService productService;
 
     @Override
-    public List<OmsOrder> list(OmsOrderQueryParam queryParam, Integer pageSize, Integer pageNum) {
+    public List<OrderVo> list(OmsOrderQueryParam queryParam, Integer pageSize, Integer pageNum) {
         PageHelper.startPage(pageNum, pageSize);
         return orderDao.getList(queryParam);
     }

+ 24 - 11
cooleshow-mall/mall-admin/src/main/resources/config/mybatis/OmsOrderDao.xml

@@ -5,31 +5,44 @@
         <collection property="orderItemList" resultMap="com.yonge.cooleshow.mbg.mapper.OmsOrderItemMapper.BaseResultMap" columnPrefix="item_"/>
         <collection property="historyList" resultMap="com.yonge.cooleshow.mbg.mapper.OmsOrderOperateHistoryMapper.BaseResultMap" columnPrefix="history_"/>
     </resultMap>
-    <select id="getList" resultMap="com.yonge.cooleshow.mbg.mapper.OmsOrderMapper.BaseResultMap">
-        SELECT *
+
+    <resultMap id="orderResultMap" type="com.yonge.cooleshow.admin.dto.OrderVo" extends="com.yonge.cooleshow.mbg.mapper.OmsOrderMapper.BaseResultMap">
+        <result column="userId"  property="userId" />
+        <result column="username"  property="username" />
+        <result column="phone"  property="phone" />
+        <result column="userType"  property="userType" />
+    </resultMap>
+    <select id="getList" resultMap="orderResultMap">
+        SELECT o.*,
+                um.id as userId,
+                um.username as username,
+                um.phone as phone,
+                (select  uop.payment_client_ from user_order_payment uop where uop.order_no_ = o.order_sn order by  uop.id_ desc limit 1) as userType
+
         FROM
-        oms_order
+        oms_order o
+        left join ums_member um on um.id = member_id
         WHERE
-        delete_status = 0
+        o.delete_status = 0
         <if test="queryParam.orderSn!=null and queryParam.orderSn!=''">
-            AND order_sn = #{queryParam.orderSn}
+            AND o.order_sn = #{queryParam.orderSn}
         </if>
         <if test="queryParam.status!=null">
-            AND `status` = #{queryParam.status}
+            AND o.`status` = #{queryParam.status}
         </if>
         <if test="queryParam.sourceType!=null">
-            AND source_type = #{queryParam.sourceType}
+            AND o.source_type = #{queryParam.sourceType}
         </if>
         <if test="queryParam.orderType!=null">
-            AND order_type = #{queryParam.orderType}
+            AND o.order_type = #{queryParam.orderType}
         </if>
         <if test="queryParam.createTime!=null and queryParam.createTime!=''">
-            AND create_time LIKE concat(#{queryParam.createTime},"%")
+            AND o.create_time LIKE concat(#{queryParam.createTime},"%")
         </if>
         <if test="queryParam.receiverKeyword!=null and queryParam.receiverKeyword!=''">
             AND (
-            receiver_name LIKE concat("%",#{queryParam.receiverKeyword},"%")
-            OR receiver_phone LIKE concat("%",#{queryParam.receiverKeyword},"%")
+            o.receiver_name LIKE concat("%",#{queryParam.receiverKeyword},"%")
+            OR o.receiver_phone LIKE concat("%",#{queryParam.receiverKeyword},"%")
             )
         </if>
     </select>

+ 11 - 0
cooleshow-mall/mall-mbg/src/main/java/com/yonge/cooleshow/mbg/model/OmsCartItem.java

@@ -56,8 +56,19 @@ public class OmsCartItem implements Serializable {
     @ApiModelProperty(value = "商品销售属性:[{'key':'颜色','value':'颜色'},{'key':'容量','value':'4G'}]")
     private String productAttr;
 
+    @ApiModelProperty("是否隐藏(1:是,0:否)")
+    private Integer hidden;
+
     private static final long serialVersionUID = 1L;
 
+    public Integer getHidden() {
+        return hidden;
+    }
+
+    public void setHidden(Integer hidden) {
+        this.hidden = hidden;
+    }
+
     public Long getId() {
         return id;
     }

+ 5 - 0
cooleshow-mall/mall-mbg/src/main/java/com/yonge/cooleshow/mbg/model/OmsCartItemExample.java

@@ -951,6 +951,11 @@ public class OmsCartItemExample {
             return (Criteria) this;
         }
 
+        public Criteria andHiddenEqualTo(Integer value) {
+            addCriterion("hidden_ =", value, "hidden");
+            return (Criteria) this;
+        }
+
         public Criteria andDeleteStatusNotEqualTo(Integer value) {
             addCriterion("delete_status <>", value, "deleteStatus");
             return (Criteria) this;

+ 20 - 5
cooleshow-mall/mall-mbg/src/main/resources/config/mybatis/OmsCartItemMapper.xml

@@ -20,6 +20,7 @@
     <result column="product_brand" jdbcType="VARCHAR" property="productBrand" />
     <result column="product_sn" jdbcType="VARCHAR" property="productSn" />
     <result column="product_attr" jdbcType="VARCHAR" property="productAttr" />
+    <result column="hidden_" jdbcType="VARCHAR" property="hidden" />
   </resultMap>
   <sql id="Example_Where_Clause">
     <where>
@@ -82,7 +83,7 @@
   <sql id="Base_Column_List">
     id, product_id, product_sku_id, member_id, quantity, price, product_pic, product_name, 
     product_sub_title, product_sku_code, member_nickname, create_date, modify_date, delete_status, 
-    product_category_id, product_brand, product_sn, product_attr
+    product_category_id, product_brand, product_sn, product_attr,hidden_
   </sql>
   <select id="selectByExample" parameterType="com.yonge.cooleshow.mbg.model.OmsCartItemExample" resultMap="BaseResultMap">
     select
@@ -123,13 +124,13 @@
       product_name, product_sub_title, product_sku_code, 
       member_nickname, create_date, modify_date, 
       delete_status, product_category_id, product_brand, 
-      product_sn, product_attr)
+      product_sn, product_attr,hidden_)
     values (#{productId,jdbcType=BIGINT}, #{productSkuId,jdbcType=BIGINT}, #{memberId,jdbcType=BIGINT}, 
       #{quantity,jdbcType=INTEGER}, #{price,jdbcType=DECIMAL}, #{productPic,jdbcType=VARCHAR}, 
       #{productName,jdbcType=VARCHAR}, #{productSubTitle,jdbcType=VARCHAR}, #{productSkuCode,jdbcType=VARCHAR}, 
       #{memberNickname,jdbcType=VARCHAR}, #{createDate,jdbcType=TIMESTAMP}, #{modifyDate,jdbcType=TIMESTAMP}, 
       #{deleteStatus,jdbcType=INTEGER}, #{productCategoryId,jdbcType=BIGINT}, #{productBrand,jdbcType=VARCHAR}, 
-      #{productSn,jdbcType=VARCHAR}, #{productAttr,jdbcType=VARCHAR})
+      #{productSn,jdbcType=VARCHAR}, #{productAttr,jdbcType=VARCHAR},#{hidden})
   </insert>
   <insert id="insertSelective" parameterType="com.yonge.cooleshow.mbg.model.OmsCartItem">
     <selectKey keyProperty="id" order="AFTER" resultType="java.lang.Long">
@@ -188,6 +189,9 @@
       <if test="productAttr != null">
         product_attr,
       </if>
+      <if test="hidden != null">
+        hidden_,
+      </if>
     </trim>
     <trim prefix="values (" suffix=")" suffixOverrides=",">
       <if test="productId != null">
@@ -241,6 +245,9 @@
       <if test="productAttr != null">
         #{productAttr,jdbcType=VARCHAR},
       </if>
+      <if test="hidden != null">
+        #{hidden},
+      </if>
     </trim>
   </insert>
   <select id="countByExample" parameterType="com.yonge.cooleshow.mbg.model.OmsCartItemExample" resultType="java.lang.Long">
@@ -306,6 +313,9 @@
       <if test="record.productAttr != null">
         product_attr = #{record.productAttr,jdbcType=VARCHAR},
       </if>
+      <if test="record.hidden != null">
+        hidden_ = #{record.hidden},
+      </if>
     </set>
     <if test="_parameter != null">
       <include refid="Update_By_Example_Where_Clause" />
@@ -330,7 +340,8 @@
       product_category_id = #{record.productCategoryId,jdbcType=BIGINT},
       product_brand = #{record.productBrand,jdbcType=VARCHAR},
       product_sn = #{record.productSn,jdbcType=VARCHAR},
-      product_attr = #{record.productAttr,jdbcType=VARCHAR}
+      product_attr = #{record.productAttr,jdbcType=VARCHAR},
+      hidden_ = #{record.hidden}
     <if test="_parameter != null">
       <include refid="Update_By_Example_Where_Clause" />
     </if>
@@ -389,6 +400,9 @@
       <if test="productAttr != null">
         product_attr = #{productAttr,jdbcType=VARCHAR},
       </if>
+      <if test="hidden != null">
+        hidden_ = #{hidden},
+      </if>
     </set>
     where id = #{id,jdbcType=BIGINT}
   </update>
@@ -410,7 +424,8 @@
       product_category_id = #{productCategoryId,jdbcType=BIGINT},
       product_brand = #{productBrand,jdbcType=VARCHAR},
       product_sn = #{productSn,jdbcType=VARCHAR},
-      product_attr = #{productAttr,jdbcType=VARCHAR}
+      product_attr = #{productAttr,jdbcType=VARCHAR},
+      hidden_ = #{hidden}
     where id = #{id,jdbcType=BIGINT}
   </update>
 </mapper>

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

@@ -246,7 +246,7 @@
     <select id="selectByTranNo" resultMap="BaseResultMap">
         select
         <include refid="Base_Column_List" />
-      from user_order_payment where trans_no_ = #{orderNo} limit 1
+      from user_order_payment where trans_no_ = #{orderNo} order by id_ desc limit 1
     </select>
 
     <select id="selectByOrderNo" resultMap="BaseResultMap">
@@ -258,25 +258,25 @@
     <select id="selectByOrderNoAndStatusPaying" resultMap="BaseResultMap">
         select
         <include refid="Base_Column_List" />
-        from user_order_payment where order_no_ = #{orderSn} and status_ = 'pending'
+        from user_order_payment where order_no_ = #{orderSn} and status_ = 'pending' order by id_ desc  limit 1
     </select>
 
     <select id="selectByOrderNoAndStatus" resultMap="BaseResultMap">
         select
         <include refid="Base_Column_List" />
         from user_order_payment where order_no_ = #{orderSn}
-        and status_ = #{payStatus} and pay_channel_ = #{payChannel}
+        and status_ = #{payStatus} and pay_channel_ = #{payChannel} order by id_ desc  limit 1
     </select>
 
     <select id="selectByOrderNoAndStatusSucceeded" resultMap="BaseResultMap">
         select
         <include refid="Base_Column_List" />
-        from user_order_payment where order_no_ = #{orderSn} and status_ = 'succeeded'
+        from user_order_payment where order_no_ = #{orderSn} and status_ = 'succeeded' order by id_ desc  limit 1
     </select>
 
     <select id="selectByAdapayNo" resultMap="BaseResultMap">
         select
         <include refid="Base_Column_List" />
-        from user_order_payment where adapay_no_ = #{paymentNo} limit 1
+        from user_order_payment where adapay_no_ = #{paymentNo} order by id_ desc  limit 1
     </select>
 </mapper>

+ 7 - 2
cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/impl/OmsCartItemServiceImpl.java

@@ -50,6 +50,11 @@ public class OmsCartItemServiceImpl implements OmsCartItemService {
         cartItem.setMemberNickname(currentMember.getNickname());
         cartItem.setDeleteStatus(0);
         OmsCartItem existCartItem = getCartItem(cartItem);
+        if (cartItem.getHidden() == null) {
+            cartItem.setHidden(0);
+        } else if (cartItem.getHidden() == 1) {
+            existCartItem = null;
+        }
         if (existCartItem == null) {
             PmsProduct pmsProduct = pmsProductMapper.selectByPrimaryKey(cartItem.getProductId());
 
@@ -91,7 +96,7 @@ public class OmsCartItemServiceImpl implements OmsCartItemService {
     private OmsCartItem getCartItem(OmsCartItem cartItem) {
         OmsCartItemExample example = new OmsCartItemExample();
         OmsCartItemExample.Criteria criteria = example.createCriteria().andMemberIdEqualTo(cartItem.getMemberId())
-                .andProductIdEqualTo(cartItem.getProductId()).andDeleteStatusEqualTo(0);
+                .andProductIdEqualTo(cartItem.getProductId()).andDeleteStatusEqualTo(0).andHiddenEqualTo(0);
         if (!StringUtils.isEmpty(cartItem.getProductSkuId())) {
             criteria.andProductSkuIdEqualTo(cartItem.getProductSkuId());
         }
@@ -105,7 +110,7 @@ public class OmsCartItemServiceImpl implements OmsCartItemService {
     @Override
     public List<OmsCartItem> list(Long memberId) {
         OmsCartItemExample example = new OmsCartItemExample();
-        example.createCriteria().andDeleteStatusEqualTo(0).andMemberIdEqualTo(memberId);
+        example.createCriteria().andDeleteStatusEqualTo(0).andMemberIdEqualTo(memberId).andHiddenEqualTo(0);
         return cartItemMapper.selectByExample(example);
     }
 

+ 0 - 28
cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/AdminSysUserContractRecordController.java

@@ -1,28 +0,0 @@
-package com.yonge.cooleshow.admin.controller;
-
-import com.yonge.cooleshow.biz.dal.service.SysUserContractRecordService;
-import com.yonge.cooleshow.common.controller.BaseController;
-import io.swagger.annotations.Api;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
-
-import javax.annotation.Resource;
-
-/**
- * 用户协议记录表-一个用户一种协议一个版本一条记录(SysUserContractRecord)表控制层
- *
- * @author hgw
- * @since 2022-05-07 15:04:05
- */
-@Api(tags = "用户协议记录表-一个用户一种协议一个版本一条记录")
-@RestController
-@RequestMapping("/sysUserContractRecord")
-public class AdminSysUserContractRecordController extends BaseController {
-    /**
-     * 服务对象
-     */
-    @Resource
-    private SysUserContractRecordService sysUserContractRecordService;
-
-}
-

+ 1 - 1
cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/UserOrderRefundController.java

@@ -55,7 +55,7 @@ public class UserOrderRefundController extends BaseController {
 	@PostMapping("/doAuth")
 	@ApiOperation(value = "审核", notes = "传入authOperaReq")
 	@PreAuthorize("@pcs.hasPermissions('userOrderRefunds/doAuth')")
-	public HttpResponseResult<UserOrderRefundBill> doAuth(@Valid @RequestBody AuthOperaReq authOperaReq) throws Exception {
+	public HttpResponseResult<Boolean> doAuth(@Valid @RequestBody AuthOperaReq authOperaReq) throws Exception {
 		SysUser user = sysUserFeignService.queryUserInfo();
 		if (user == null || null == user.getId()) {
 			return failed(HttpStatus.FORBIDDEN, "请登录");

+ 49 - 23
cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/UserWithdrawalController.java

@@ -3,7 +3,12 @@ package com.yonge.cooleshow.admin.controller;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 
 import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
+import com.yonge.cooleshow.auth.api.entity.SysUser;
 import com.yonge.cooleshow.biz.dal.dto.excel.UserWithdrawalExport;
+import com.yonge.cooleshow.biz.dal.dto.req.AuthOperaReq;
+import com.yonge.cooleshow.biz.dal.support.DistributedLock;
+import com.yonge.cooleshow.common.enums.CacheNameEnum;
+import com.yonge.toolset.base.exception.BizException;
 import com.yonge.toolset.mybatis.support.PageUtil;
 import com.yonge.cooleshow.common.controller.BaseController;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
@@ -11,16 +16,21 @@ import com.yonge.toolset.base.page.PageInfo;
 import com.yonge.toolset.utils.easyexcel.*;
 import io.swagger.annotations.*;
 import org.apache.commons.beanutils.BeanUtils;
+import org.redisson.api.RedissonClient;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.web.bind.annotation.*;
 
 import com.yonge.cooleshow.biz.dal.vo.UserWithdrawalVo;
 import com.yonge.cooleshow.biz.dal.dto.search.TeacherWithdrawalSearch;
 import com.yonge.cooleshow.biz.dal.service.UserWithdrawalService;
+import springfox.documentation.annotations.ApiIgnore;
 
+import javax.validation.Valid;
 import java.lang.reflect.InvocationTargetException;
 import java.util.*;
+import java.util.concurrent.TimeUnit;
 
 @RestController
 @RequestMapping("/userWithdrawal")
@@ -30,7 +40,8 @@ public class UserWithdrawalController extends BaseController {
     private SysUserFeignService sysUserFeignService;
     @Autowired
     private UserWithdrawalService userWithdrawalService;
-
+    @Autowired
+    private RedissonClient redissonClient;
     /**
      * 查询单条
      */
@@ -65,13 +76,6 @@ public class UserWithdrawalController extends BaseController {
             UserWithdrawalExport export = new UserWithdrawalExport();
             try {
                 BeanUtils.copyProperties(export, o);
-                /*StringBuffer buffer = new StringBuffer(export.getId().toString());
-                buffer.append(export.getUserId());
-                buffer.append(export.getAmount().setScale(2, RoundingMode.HALF_UP));
-                buffer.append(export.getPlantformFee().setScale(2, RoundingMode.HALF_UP));
-                buffer.append(export.getActualAmount().setScale(2, RoundingMode.HALF_UP));
-                String s = DigestUtils.md5DigestAsHex(buffer.toString().getBytes());
-                export.setSign(s);*/
                 list.add(export);
             } catch (IllegalAccessException e) {
                 e.printStackTrace();
@@ -83,26 +87,48 @@ public class UserWithdrawalController extends BaseController {
                 "列表数据");
     }
 
-    /**
-     * 导入
-     */
-    /*@PostMapping("/importExcel")
-    @ApiOperation(value = "导入", notes = "传入file")
-    @PreAuthorize("@pcs.hasPermissions('userWithdrawal/importExcel')")
-    public HttpResponseResult<List<ErrMsg>> importExcel(@RequestParam("file") MultipartFile file) {
-        if (null == file) {
-            return HttpResponseResult.failed("请上传文件");
+
+    @PostMapping("/doAuth")
+    @ApiOperation(value = "审核", notes = "传入authOperaReq")
+    @PreAuthorize("@pcs.hasPermissions('userWithdrawal/doAuth')")
+    public HttpResponseResult<Boolean> doAuth(@Valid @RequestBody AuthOperaReq authOperaReq) throws Exception {
+        SysUser user = sysUserFeignService.queryUserInfo();
+        if (user == null || null == user.getId()) {
+            return failed(HttpStatus.FORBIDDEN, "请登录");
         }
+        return userWithdrawalService.batchAuth(authOperaReq, user);
+    }
+
+    @ApiImplicitParams({
+            @ApiImplicitParam(
+                    name = "id",
+                    value = "审核单id",
+                    paramType = "query", dataType = "Long"
+            )
+    })
+    @PostMapping("/transferAccount")
+    @ApiOperation(value = "继续转账", notes = "传入authOperaReq")
+    @PreAuthorize("@pcs.hasPermissions('userWithdrawal/transferAccount')")
+    public HttpResponseResult<Boolean> transferAccount(@ApiIgnore @RequestBody AuthOperaReq authOperaReq) throws Exception {
         SysUser user = sysUserFeignService.queryUserInfo();
         if (user == null || null == user.getId()) {
             return failed(HttpStatus.FORBIDDEN, "请登录");
         }
+
         try {
-            ExcelDataReader<UserWithdrawalExport> reader = ExcelUtils.getReader(UserWithdrawalExport.class, file);
-            userWithdrawalService.importExcel(reader.getDataList(), user.getId());
-            return HttpResponseResult.succeed();
-        } catch (ExcelException e) {
-            return HttpResponseResult.failed(BizHttpStatus.IMPORT.getCode(), e.getErrMsgList(), BizHttpStatus.IMPORT.getMsg());
+            HttpResponseResult<Boolean> res = DistributedLock.of(redissonClient)
+                    .runIfLockCanGet(CacheNameEnum.LOCK_WITHDRAWAL.getRedisKey(authOperaReq.getId())
+                            , () -> userWithdrawalService.transferAccount(authOperaReq, user), 60L, TimeUnit.SECONDS);
+            if(null != res){
+                return res;
+            }else{
+                return HttpResponseResult.failed("转账失败");
+            }
+        } catch (BizException e) {
+            return HttpResponseResult.failed(e.getMessage());
+        }  catch (Exception e) {
+            e.printStackTrace();
+            return HttpResponseResult.failed("转账失败");
         }
-    }*/
+    }
 }

+ 8 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/MusicSheetDao.java

@@ -128,4 +128,12 @@ public interface MusicSheetDao extends BaseMapper<MusicSheet> {
      * @return
      */
     List<HomeMusicSheetVo.MusicSheetSmall> selectPayMusicSheet();
+
+    /**
+     * 查询老师曲目审核数量
+     *
+     * @param userId 老师id
+     * @return
+     */
+    TeacherAuditMusicSheetVo selectTeacherCount(@Param("userId") Long userId);
 }

+ 31 - 17
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/UserWithdrawalDao.java

@@ -11,29 +11,43 @@ import com.yonge.cooleshow.biz.dal.vo.UserWithdrawalVo;
 import com.yonge.cooleshow.biz.dal.dto.search.TeacherWithdrawalSearch;
 
 
-public interface UserWithdrawalDao extends BaseMapper<UserWithdrawal>{
-	/**
-	 * 查询详情
+public interface UserWithdrawalDao extends BaseMapper<UserWithdrawal> {
+    /**
+     * 查询详情
+     *
      * @author liweifan
      * @date 2022-03-30 13:53:51
      * @return: com.yonge.cooleshow.biz.dal.vo.TeacherWithdrawalVo
-	 */
-	UserWithdrawalVo detail(@Param("id") Long id);
+     */
+    UserWithdrawalVo detail(@Param("id") Long id);
 
-	/**
-	 * 分页查询
+    UserWithdrawalVo detailByTransNo(@Param("transNo") String transNo);
+
+    /**
+     * 分页查询
+     *
      * @author liweifan
      * @date 2022-03-30 13:53:51
      * @return: com.yonge.cooleshow.biz.dal.vo.TeacherWithdrawalVo
-	 */
-	List<UserWithdrawalVo> selectPage(@Param("page") IPage page, @Param("param") TeacherWithdrawalSearch teacherWithdrawal);
-	/***
-	 * 查询集合
-	 * @author liweifan
-	 * @param: teacherWithdrawal
-	 * @updateTime 2022/4/15 18:05
-	 * @return: java.util.List<com.yonge.cooleshow.biz.dal.vo.UserWithdrawalVo>
-	 */
-	List<UserWithdrawalVo> selectList(@Param("param") TeacherWithdrawalSearch teacherWithdrawal);
+     */
+    List<UserWithdrawalVo> selectPage(@Param("page") IPage page, @Param("param") TeacherWithdrawalSearch teacherWithdrawal);
+
+    /***
+     * 查询集合
+     * @author liweifan
+     * @param: teacherWithdrawal
+     * @updateTime 2022/4/15 18:05
+     * @return: java.util.List<com.yonge.cooleshow.biz.dal.vo.UserWithdrawalVo>
+     */
+    List<UserWithdrawalVo> selectList(@Param("param") TeacherWithdrawalSearch teacherWithdrawal);
+
+    /**
+     * 查询用户今天发起的结算次数
+     *
+     * @param userId
+     * @return
+     */
+    Integer getNowDayWithdrawalCount(@Param("userId") Long userId);
+
 
 }

+ 4 - 4
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/req/AuthOperaReq.java

@@ -15,8 +15,8 @@ import javax.validation.constraints.NotNull;
 @ApiModel(value = "AuthOperaReq", description = "审核操作对象")
 public class AuthOperaReq {
     @NotNull(message = "id不能为空")
-    @ApiModelProperty(value = "id", required = true)
-    private Long id;
+    @ApiModelProperty(value = "审核id,多个id,分割", required = true)
+    private String id;
     @NotNull(message = "请说明审核是否通过")
     @ApiModelProperty(value = "审核是否通过", required = true)
     private Boolean isPass;
@@ -24,11 +24,11 @@ public class AuthOperaReq {
     @ApiModelProperty(value = "审核理由", required = true)
     private String reason;
 
-    public Long getId() {
+    public String getId() {
         return id;
     }
 
-    public void setId(Long id) {
+    public void setId(String id) {
         this.id = id;
     }
 

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

@@ -1,5 +1,6 @@
 package com.yonge.cooleshow.biz.dal.dto.search;
 
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.yonge.toolset.base.page.QueryInfo;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
@@ -15,6 +16,9 @@ public class SysUserContractRecordSearch extends QueryInfo{
 	@ApiModelProperty(value = "用户id")
 	private Long userId;
 
+	@ApiModelProperty(value = "签署状态 DONG 签署中 SUCCESS 签署完成 FAILED 签署失败")
+	private String status;
+
 
 	public Long getUserId() {
 		return userId;
@@ -23,4 +27,12 @@ public class SysUserContractRecordSearch extends QueryInfo{
 	public void setUserId(Long userId) {
 		this.userId = userId;
 	}
+
+	public String getStatus() {
+		return status;
+	}
+
+	public void setStatus(String status) {
+		this.status = status;
+	}
 }

+ 39 - 5
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/search/TeacherWithdrawalSearch.java

@@ -1,6 +1,8 @@
 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.AuthStatusEnum;
 import com.yonge.toolset.base.page.QueryInfo;
 import com.yonge.toolset.payment.base.enums.TradeStatusEnum;
 import io.swagger.annotations.ApiModel;
@@ -17,14 +19,22 @@ public class TeacherWithdrawalSearch extends QueryInfo{
 	private static final long serialVersionUID = 1L;
 	@ApiModelProperty("三方交易流水号 ")
 	private String transNo;
+	@ApiModelProperty("申请人 ")
+	private String username;
+	@ApiModelProperty("审核状态 DOING、审核中 PASS、通过 UNPASS、不通过")
+	@TableField(value = "auth_status_")
+	private AuthStatusEnum authStatus;
 	@ApiModelProperty("交易状态 pending、交易处理中 succeeded、交易成功 failed、交易失败 ")
-	private TradeStatusEnum status;
+	private TradeStatusEnum tradeStatus;
 	@ApiModelProperty(value = "申请开始时间")
 	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
 	private LocalDateTime startTime;
 	@ApiModelProperty(value = "申请结束时间")
 	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
 	private LocalDateTime endTime;
+	@ApiModelProperty("审核人 ")
+	private String verifyUser;
+
 	@ApiModelProperty("查询时间(yyyy-MM) ")
 	private String searchDate;
 
@@ -38,12 +48,20 @@ public class TeacherWithdrawalSearch extends QueryInfo{
 		this.transNo = transNo;
 	}
 
-	public TradeStatusEnum getStatus() {
-		return status;
+	public String getUsername() {
+		return username;
+	}
+
+	public void setUsername(String username) {
+		this.username = username;
 	}
 
-	public void setStatus(TradeStatusEnum status) {
-		this.status = status;
+	public TradeStatusEnum getTradeStatus() {
+		return tradeStatus;
+	}
+
+	public void setTradeStatus(TradeStatusEnum tradeStatus) {
+		this.tradeStatus = tradeStatus;
 	}
 
 	public LocalDateTime getStartTime() {
@@ -77,4 +95,20 @@ public class TeacherWithdrawalSearch extends QueryInfo{
 	public void setUserId(Long userId) {
 		this.userId = userId;
 	}
+
+	public AuthStatusEnum getAuthStatus() {
+		return authStatus;
+	}
+
+	public void setAuthStatus(AuthStatusEnum authStatus) {
+		this.authStatus = authStatus;
+	}
+
+	public String getVerifyUser() {
+		return verifyUser;
+	}
+
+	public void setVerifyUser(String verifyUser) {
+		this.verifyUser = verifyUser;
+	}
 }

+ 79 - 10
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/UserWithdrawal.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.AuthStatusEnum;
 import com.yonge.toolset.payment.base.enums.TradeStatusEnum;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
@@ -30,24 +31,44 @@ public class UserWithdrawal implements Serializable {
     @ApiModelProperty("结算金额 ")
     @TableField(value = "amount_")
     private BigDecimal amount;
+    @ApiModelProperty("实际到账金额 ")
+    @TableField(value = "actual_amount_")
+    private BigDecimal actualAmount;
     @ApiModelProperty("平台服务费 ")
     @TableField(value = "plantform_fee_")
     private BigDecimal plantformFee;
+    @ApiModelProperty("审核状态 DOING、审核中 PASS、通过 UNPASS、不通过")
+    @TableField(value = "auth_status_")
+    private AuthStatusEnum authStatus;
+    @ApiModelProperty("审核用户表id ")
+    @TableField(value = "auth_user_id_")
+    private Long authUserId;
+    @ApiModelProperty("审核时间 ")
+    @TableField(value = "auth_time_")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
+    private Date authTime;
+    @ApiModelProperty("审核原因 ")
+    @TableField(value = "reason_")
+    private String reason;
     @ApiModelProperty("银行卡id ")
     @TableField(value = "bank_card_id_")
     private Long bankCardId;
     @ApiModelProperty("第三方类型 ")
     @TableField(value = "open_type_")
     private String openType;
-    @ApiModelProperty("三方交易流水号 ")
+    @ApiModelProperty("交易流水号 ")
     @TableField(value = "trans_no_")
     private String transNo;
     @ApiModelProperty("交易状态 pending、交易处理中 succeeded、交易成功 failed、交易失败 ")
-    @TableField(value = "status_")
-    private TradeStatusEnum status;
-    @ApiModelProperty("实际到账金额 ")
-    @TableField(value = "actual_amount_")
-    private BigDecimal actualAmount;
+    @TableField(value = "trade_status_")
+    private TradeStatusEnum tradeStatus;
+    @ApiModelProperty("三方交易流水号 ")
+    @TableField(value = "trade_no_")
+    private String tradeNo;
+    @ApiModelProperty("三方接口返回金额 ")
+    @TableField(value = "callbak_amount_")
+    private BigDecimal callbakAmount;
     @ApiModelProperty("转账时间 ")
     @TableField(value = "transfer_time_")
     @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@@ -129,12 +150,20 @@ public class UserWithdrawal implements Serializable {
         this.transNo = transNo;
     }
 
-    public TradeStatusEnum getStatus() {
-        return status;
+    public AuthStatusEnum getAuthStatus() {
+        return authStatus;
+    }
+
+    public void setAuthStatus(AuthStatusEnum authStatus) {
+        this.authStatus = authStatus;
+    }
+
+    public TradeStatusEnum getTradeStatus() {
+        return tradeStatus;
     }
 
-    public void setStatus(TradeStatusEnum status) {
-        this.status = status;
+    public void setTradeStatus(TradeStatusEnum tradeStatus) {
+        this.tradeStatus = tradeStatus;
     }
 
     public BigDecimal getActualAmount() {
@@ -192,4 +221,44 @@ public class UserWithdrawal implements Serializable {
     public void setUpdateTime(Date updateTime) {
         this.updateTime = updateTime;
     }
+
+    public Long getAuthUserId() {
+        return authUserId;
+    }
+
+    public void setAuthUserId(Long authUserId) {
+        this.authUserId = authUserId;
+    }
+
+    public String getReason() {
+        return reason;
+    }
+
+    public void setReason(String reason) {
+        this.reason = reason;
+    }
+
+    public BigDecimal getCallbakAmount() {
+        return callbakAmount;
+    }
+
+    public void setCallbakAmount(BigDecimal callbakAmount) {
+        this.callbakAmount = callbakAmount;
+    }
+
+    public Date getAuthTime() {
+        return authTime;
+    }
+
+    public void setAuthTime(Date authTime) {
+        this.authTime = authTime;
+    }
+
+    public String getTradeNo() {
+        return tradeNo;
+    }
+
+    public void setTradeNo(String tradeNo) {
+        this.tradeNo = tradeNo;
+    }
 }

+ 2 - 2
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/sdk/WithdrawSdk.java

@@ -177,6 +177,7 @@ public class WithdrawSdk {
         map.put("cardAttribute", "C");
         map.put("payAccount", payAccount);
         String jsonStr = JSONObject.toJSONString(map);
+        logger.info("单笔请求请求参数:{}", JSONObject.toJSONString(jsonStr));
 
         //签名
         JSONObject mapParam = new JSONObject();
@@ -186,7 +187,6 @@ public class WithdrawSdk {
             mapParam.put("outMemberNo", memberNo);
             mapParam.put("signType", "RSA");
             mapParam.put("sign", encryptStr);
-            logger.info("单笔请求请求参数:{}", JSONObject.toJSONString(mapParam));
         } catch (Exception e) {
             logger.info("加密失败:{}", e);
         }
@@ -204,7 +204,7 @@ public class WithdrawSdk {
         } catch (IOException e) {
             logger.info("发送失败:{}", e);
         }
-        return HttpResponseResult.failed("提现失败");
+        return HttpResponseResult.failed("结算失败");
     }
 
     /**

+ 9 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/MusicSheetAuthRecordService.java

@@ -3,6 +3,7 @@ package com.yonge.cooleshow.biz.dal.service;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.yonge.cooleshow.biz.dal.dto.req.TeacherMusicSheetAuditReq;
 import com.yonge.cooleshow.biz.dal.entity.MusicSheetAuthRecord;
+import com.yonge.cooleshow.biz.dal.enums.AuthStatusEnum;
 
 /**
  * 曲目审核表 服务类
@@ -26,4 +27,12 @@ public interface MusicSheetAuthRecordService extends IService<MusicSheetAuthReco
      * @param musicSheetId 曲目id
      */
     void setAuditDoing(Long musicSheetId);
+
+    /**
+     * 获取当前曲目审核理由
+     *
+     * @param musicSheetId 曲目id
+     * @return
+     */
+    String selectAuditReason(Long musicSheetId);
 }

+ 8 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/MusicSheetService.java

@@ -243,4 +243,12 @@ public interface MusicSheetService extends IService<MusicSheet> {
      * @return
      */
     MusicSheetWebsiteDetailVo websiteDetail(Long musicSheetId, SysUser sysUser);
+
+    /**
+     * 查询老师曲目审核数量
+     *
+     * @param userId 老师id
+     * @return
+     */
+    TeacherAuditMusicSheetVo selectTeacherCount(Long userId);
 }

+ 1 - 1
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/UserOrderRefundService.java

@@ -53,7 +53,7 @@ public interface UserOrderRefundService extends IService<UserOrderRefund>  {
 	 * @updateTime 2022/5/9 16:25
 	 * @return: com.yonge.cooleshow.common.entity.HttpResponseResult<java.lang.Boolean>
 	 */
-    HttpResponseResult<UserOrderRefundBill> doAuth(AuthOperaReq authOperaReq, SysUser user);
+    HttpResponseResult<Boolean> doAuth(AuthOperaReq authOperaReq, SysUser user);
 
 	/**
 	 * 系統自動退款

+ 15 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/UserWithdrawalService.java

@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.yonge.cooleshow.auth.api.entity.SysUser;
 import com.yonge.cooleshow.biz.dal.dto.excel.UserWithdrawalExport;
+import com.yonge.cooleshow.biz.dal.dto.req.AuthOperaReq;
 import com.yonge.cooleshow.biz.dal.dto.req.WithdrawalReq;
 import com.yonge.cooleshow.biz.dal.entity.UserWithdrawalCallback;
 import com.yonge.cooleshow.biz.dal.vo.UserWithdrawalVo;
@@ -12,6 +13,7 @@ import com.yonge.cooleshow.biz.dal.entity.UserWithdrawal;
 import com.yonge.cooleshow.biz.dal.vo.res.WithdrawalInfoRes;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
 import com.yonge.toolset.utils.easyexcel.ExcelDataReaderProperty;
+import org.springframework.transaction.annotation.Transactional;
 
 import java.util.List;
 import java.util.Map;
@@ -32,6 +34,8 @@ public interface UserWithdrawalService extends IService<UserWithdrawal> {
      */
     UserWithdrawalVo detail(Long id);
 
+    UserWithdrawalVo detailByTransNo(String transNo);
+
     /**
      * 分页查询
      *
@@ -84,6 +88,17 @@ public interface UserWithdrawalService extends IService<UserWithdrawal> {
      */
     void contractCallback(String status, String serialNo, String url, String errMsg);
 
+    @Transactional(rollbackFor = Exception.class)
+    HttpResponseResult<Boolean> batchAuth(AuthOperaReq authOperaReq, SysUser sysUser);
+
+    /**
+     * 继续转账
+     * @param authOperaReq
+     * @param user
+     * @return
+     */
+    HttpResponseResult<Boolean> transferAccount(AuthOperaReq authOperaReq, SysUser user);
+
 
     /***
      * 导入

+ 33 - 11
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/CourseGroupServiceImpl.java

@@ -18,7 +18,6 @@ import com.yonge.cooleshow.biz.dal.dto.search.*;
 import com.yonge.cooleshow.biz.dal.entity.*;
 import com.yonge.cooleshow.biz.dal.enums.*;
 import com.yonge.cooleshow.biz.dal.service.*;
-import com.yonge.toolset.mybatis.support.PageUtil;
 import com.yonge.cooleshow.biz.dal.support.WrapperUtil;
 import com.yonge.cooleshow.biz.dal.vo.*;
 import com.yonge.cooleshow.biz.dal.vo.res.OrderCreateRes;
@@ -27,6 +26,7 @@ import com.yonge.cooleshow.common.constant.SysConfigConstant;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
 import com.yonge.toolset.base.exception.BizException;
 import com.yonge.toolset.base.page.PageInfo;
+import com.yonge.toolset.mybatis.support.PageUtil;
 import com.yonge.toolset.thirdparty.message.MessageSenderPluginContext;
 import com.yonge.toolset.utils.date.DateUtil;
 import org.apache.commons.collections.CollectionUtils;
@@ -381,6 +381,7 @@ public class CourseGroupServiceImpl extends ServiceImpl<CourseGroupDao, CourseGr
     private List<CourseTimeEntity> autoPlanningLiveCourseTime(Long teacherId, int totalCourseNum, List<CourseTimeEntity> paramTimeList, boolean courseTypeFlag) {
         //是否跳过节假日
         boolean skipHoliday = false;
+        Long studentId = null;
         if (courseTypeFlag) {
             //查询老师陪练课设置
             TeacherFreeTime teacherTime = teacherFreeTimeService.getOne(Wrappers.<TeacherFreeTime>lambdaQuery()
@@ -389,6 +390,7 @@ public class CourseGroupServiceImpl extends ServiceImpl<CourseGroupDao, CourseGr
             );
             Optional.ofNullable(teacherTime).orElseThrow(() -> new BizException("未查询到老师陪练课设置!"));
             skipHoliday = teacherTime.getSkipHolidayFlag();
+            studentId = getSysUser().getId();
         }
 
         //获取当前课程
@@ -480,6 +482,16 @@ public class CourseGroupServiceImpl extends ServiceImpl<CourseGroupDao, CourseGr
                     continue;
                 }
 
+                //校验当前生成时间是否和未来的课程时间是否交集-学生
+                if (courseTypeFlag) {
+                    checkTime = courseScheduleService.checkStudentCourseTime(studentId, autoStartDate, autoEndDate);
+                    con.accept(checkTime);
+                    //如果和未来时间冲突则跳过
+                    if (flag.get()) {
+                        continue;
+                    }
+                }
+
                 //将自动生成时间收入集合
                 CourseTimeEntity autoTimeDto = new CourseTimeEntity();
                 autoTimeDto.setStartTime(autoStartDate);
@@ -719,8 +731,10 @@ public class CourseGroupServiceImpl extends ServiceImpl<CourseGroupDao, CourseGr
         BigDecimal liveServiceRate = new BigDecimal(liveServiceRateStr).divide(new BigDecimal("100"), 2, RoundingMode.HALF_UP);
         //总课酬  1 - (1 * 手续费率)
         BigDecimal totalRatePrice = expectPrice.subtract(expectPrice.multiply(liveServiceRate)).setScale(2, RoundingMode.HALF_UP);
-        //获取每节课的课酬 key 课堂数  value 课酬
-        Map<Integer, BigDecimal> singerCourseSalary = WrapperUtil.getAveragePrice(courseGroup.getCourseNum(), totalRatePrice);
+        //获取每节课的实际课酬 key 课堂数  value 课酬
+        Map<Integer, BigDecimal> singerActualCourseSalary = WrapperUtil.getAveragePrice(courseGroup.getCourseNum(), totalRatePrice);
+        //获取每节课的预计原课酬 key 课堂数  value 课酬
+        Map<Integer, BigDecimal> singerExpectCourseSalary = WrapperUtil.getAveragePrice(courseGroup.getCourseNum(), expectPrice);
         //写入课酬表计算-根据课程组总金额计算分配到每节课的金额
         Date now = new Date();
         List<CourseScheduleTeacherSalary> teacherSalaryList = new ArrayList<>();
@@ -732,10 +746,18 @@ public class CourseGroupServiceImpl extends ServiceImpl<CourseGroupDao, CourseGr
             teacherSalary.setCourseGroupType(course.getType());
             teacherSalary.setCourseGroupId(course.getCourseGroupId());
             teacherSalary.setClassNum(course.getClassNum());
-            teacherSalary.setExpectSalary(singerCourseSalary.get(course.getClassNum()));
-            teacherSalary.setReduceSalary(BigDecimal.ZERO);
             teacherSalary.setCreateTime(now);
             teacherSalary.setStatus(TeacherSalaryEnum.NOT_START.getCode());
+            //预计课酬
+            BigDecimal ex = singerExpectCourseSalary.get(course.getClassNum());
+            //实际课酬
+            BigDecimal ac = singerActualCourseSalary.get(course.getClassNum());
+            teacherSalary.setExpectSalary(ex);
+            teacherSalary.setActualSalary(ac);
+            //预计课酬-实际课酬 = 扣除费用
+            teacherSalary.setReduceSalary(ex.subtract(ac));
+            //备注是为直播课手续费
+            teacherSalary.setReduceSalaryRemark(SysConfigConstant.LIVE_SERVICE_RATE);
             teacherSalaryList.add(teacherSalary);
         });
         courseScheduleTeacherSalaryService.getDao().insertBatch(teacherSalaryList);
@@ -750,7 +772,7 @@ public class CourseGroupServiceImpl extends ServiceImpl<CourseGroupDao, CourseGr
                 imGroupService.autoCreate(courseGroup.getId(), CourseScheduleEnum.LIVE.getCode());
             } else {//存在->加入当前学员
                 String imGroupId = imGroup.getId();
-                Set<Long> userIds = new HashSet<>(Arrays.asList(studentPayment.getUserId()));
+                Set<Long> userIds = new HashSet<>(Collections.singletonList(studentPayment.getUserId()));
                 imGroupMemberService.initGroupMembers(imGroupId, userIds, ImGroupMemberRoleType.STUDENT);
             }
         } catch (Exception e) {
@@ -1106,7 +1128,7 @@ public class CourseGroupServiceImpl extends ServiceImpl<CourseGroupDao, CourseGr
     public IPage<CourseGroupPianoDetailVo> selectPianoGroupDetail(IPage<CourseGroupPianoDetailVo> page, CourseGroupDetailSearch search) {
         if (search.getStudentSign() != null) {
             List<StudentSignVo> list = studentSign(null, CourseScheduleEnum.PIANO_ROOM_CLASS.getCode());
-            List<Long> collect=new ArrayList<>();
+            List<Long> collect = new ArrayList<>();
             if (search.getStudentSign() == 0) {//异常学生
                 collect = list.stream().filter(s -> (s.getStudentOutSign() + s.getStudentInSign()) != 2).map(StudentSignVo::getCourseId).collect(Collectors.toList());
             }
@@ -1145,26 +1167,26 @@ public class CourseGroupServiceImpl extends ServiceImpl<CourseGroupDao, CourseGr
 
     @Override
     public IPage<CourseGroupPianoDetailVo> selectPianoGroupStudentDetail(IPage<CourseGroupPianoDetailVo> page, CourseGroupDetailSearch search) {
-        return baseMapper.selectPianoGroupStudentDetail(page,search);
+        return baseMapper.selectPianoGroupStudentDetail(page, search);
     }
 
     @Override
     public IPage<CourseGroupPianoVo> selectPianoGroupTeacher(IPage<CourseGroupPianoVo> page, CourseGroupSearch search) {
-        return baseMapper.selectPianoGroupTeacher(page,search);
+        return baseMapper.selectPianoGroupTeacher(page, search);
     }
 
     @Override
     public IPage<CourseGroupPianoDetailVo> selectPianoGroupTeacherDetail(IPage<CourseGroupPianoDetailVo> page, CourseGroupDetailSearch search) {
         if (search.getStudentSign() != null) {
             List<StudentSignVo> list = studentSign(null, CourseScheduleEnum.PIANO_ROOM_CLASS.getCode());
-            List<Long> collect=new ArrayList<>();
+            List<Long> collect = new ArrayList<>();
             if (search.getStudentSign() == 0) {//异常学生
                 collect = list.stream().filter(s -> (s.getStudentOutSign() + s.getStudentInSign()) != 2).map(StudentSignVo::getCourseId).collect(Collectors.toList());
             }
             if (search.getStudentSign() == 1) {//正常学生
                 collect = list.stream().filter(s -> (s.getStudentOutSign() + s.getStudentInSign()) == 2).map(StudentSignVo::getCourseId).collect(Collectors.toList());
             }
-            collect.add(Long.valueOf(-1));
+            collect.add((long) -1);
             search.setCourseIds(collect);
         }
 

+ 1 - 1
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/CourseHomeworkServiceImpl.java

@@ -307,7 +307,7 @@ public class CourseHomeworkServiceImpl extends ServiceImpl<CourseHomeworkDao, Co
 
         url = MessageFormatter.arrayFormat(url, reviewDto.getCourseScheduleId());
         sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.TEACHER_REVIEW_HOMEWORK,
-        studentReceivers, null, 0, url + reviewDto.getCourseScheduleId() , ClientEnum.STUDENT.getCode(), teacher.getUsername());
+        studentReceivers, null, 0, url , ClientEnum.STUDENT.getCode(), teacher.getUsername());
     }
 
     @Override

+ 41 - 11
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/CourseScheduleServiceImpl.java

@@ -14,6 +14,7 @@ import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
 import com.yonge.cooleshow.auth.api.entity.SysUser;
 import com.yonge.cooleshow.biz.dal.dao.*;
 import com.yonge.cooleshow.biz.dal.dto.PracticeScheduleDto;
+import com.yonge.cooleshow.biz.dal.dto.UserAccountRecordDto;
 import com.yonge.cooleshow.biz.dal.dto.req.OrderReq;
 import com.yonge.cooleshow.biz.dal.dto.search.HomeworkSearch;
 import com.yonge.cooleshow.biz.dal.dto.search.MyCourseSearch;
@@ -44,9 +45,6 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
-import javax.script.ScriptEngine;
-import javax.script.ScriptEngineManager;
-import javax.script.ScriptException;
 import java.math.BigDecimal;
 import java.math.RoundingMode;
 import java.text.SimpleDateFormat;
@@ -108,6 +106,8 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
     private ImGroupService imGroupService;
     @Autowired
     private ImUserFriendService imUserFriendService;
+    @Autowired
+    private UserAccountService userAccountService;
 
     @Override
     public CourseScheduleDao getDao() {
@@ -756,6 +756,9 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
     @Override
     public boolean checkStudentCourseSchedule(Long studentId, Long courseId) {
         List<CourseScheduleStudentPayment> paymentList = courseScheduleStudentPaymentService.getByCourseId(courseId);
+        if (CollectionUtils.isEmpty(paymentList)) {
+            return false;
+        }
         for (CourseScheduleStudentPayment courseScheduleStudentPayment : paymentList) {
             if (courseScheduleStudentPayment != null && studentId.equals(courseScheduleStudentPayment.getUserId())) {
                 return true;
@@ -889,7 +892,8 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
         timeList.forEach(o -> {
             boolean checkDataTime = this.checkStudentCourseTime(studentId, startTimeFun.apply(o), endTimeFun.apply(o));
             if (checkDataTime) {
-                throw new BizException("学生id:" + studentId + ",预计安排在" + DateUtil.dateToString(startTimeFun.apply(o), "yyyy年MM月dd号 HH点mm分") + "的课程时间存在冲突!");
+                SysUser sysUser = sysUserFeignService.queryUserById(studentId);
+                throw new BizException("学生:" + sysUser.getUsername() + ",预计安排在" + DateUtil.dateToString(startTimeFun.apply(o), "yyyy年MM月dd号 HH点mm分") + "的课程时间存在冲突!");
             }
         });
     }
@@ -1535,11 +1539,31 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
         List<CourseScheduleStudentVo> userList = paymentDao.selectUser();
         if (CollectionUtils.isNotEmpty(userList)) {
             List<CourseScheduleStudentVo> practiceList = userList.stream().filter(s -> s.getType().equals(CourseScheduleEnum.PRACTICE.getCode())).collect(Collectors.toList());
-            if (CollectionUtils.isNotEmpty(practiceList)) {//添加陪练课评论
+            if (CollectionUtils.isNotEmpty(practiceList)) {//陪练课
+                //创建课程评论
                 repliedDao.insertBatch(practiceList);
+
+                //老师课酬状态改为已完成
+                courseScheduleTeacherSalaryService.update(null, Wrappers.<CourseScheduleTeacherSalary>lambdaUpdate()
+                        .set(CourseScheduleTeacherSalary::getStatus, CourseScheduleEnum.COMPLETE.getCode())
+                        .set(CourseScheduleTeacherSalary::getSettlementTime, new Date())
+                        .in(CourseScheduleTeacherSalary::getCourseGroupId, practiceList.stream().map(CourseScheduleStudentVo::getCourseId).collect(Collectors.toList())));
+
+                //获取教师课酬写入到金额变更表
+                for (CourseScheduleStudentVo practice : practiceList) {
+                    UserAccountRecordDto userAccountRecord = new UserAccountRecordDto();
+                    userAccountRecord.setUserId(practice.getTeacherId());//老师id
+                    userAccountRecord.setInOrOut(InOrOutEnum.IN);
+                    userAccountRecord.setBizType(AccountBizTypeEnum.PRACTICE);
+                    userAccountRecord.setBizId(practice.getCourseId());//课程id
+                    userAccountRecord.setBizName(practice.getGroupName());//课程名称
+                    userAccountRecord.setTransAmount(practice.getActualSalary());//扣除手续费后所得金额
+                    userAccountRecord.setOrderNo(practice.getOrderNo());
+                    userAccountService.accountChange(userAccountRecord);
+                }
             }
 
-            //更新学生最近结课时间
+            //更新琴房课学生最近结课时间
             List<CourseScheduleStudentVo> pianoUserList = userList.stream().filter((CourseScheduleStudentVo s) -> s.getType().equals(CourseScheduleEnum.PIANO_ROOM_CLASS.getCode())).collect(Collectors.toList());
             if (CollectionUtils.isNotEmpty(pianoUserList)) {
                 pianoRoomTimeDao.updateEndTime(pianoUserList);
@@ -1659,6 +1683,12 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
         Integer singleClssTime = arrangeCourseVo.getSingleClssTime();//单课时长
         List<Long> studentIds = arrangeCourseVo.getStudentIds();//学员id集合
 
+        //单课最小时长
+//        Integer minTime = Integer.valueOf(sysConfigService.findConfigValue(SysConfigConstant.PIANO_ROOM_TIME_FORMULA));
+//        if (singleClssTime<minTime){
+//            throw new BizException("单课最小时长不得低于{}分钟", minTime);
+//        }
+
         String formula = sysConfigService.findConfigValue(SysConfigConstant.PIANO_ROOM_TIME_FORMULA);
         Integer n = (Integer) WrapperUtil.strToFormula(formula, "n", String.valueOf(studentIds.size() + 1));//人数计算 公式n*(n-1) n包含老师
         Integer consumTime = classNum * singleClssTime * n;//消耗时长 课程数*单课时长*人数
@@ -1666,11 +1696,11 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
         List<CourseTimeEntity> timeList = arrangeCourseVo.getTimeList();//选课时间
         Integer consumeTime = arrangeCourseVo.getConsumeTime();
 
-        log.info("classNum:"+classNum);
-        log.info("singleClssTime:"+singleClssTime);
-        log.info("n:"+n);
-        log.info("消耗时长:"+consumTime);
-        log.info("传入时长:"+consumeTime);
+        log.info("classNum:" + classNum);
+        log.info("singleClssTime:" + singleClssTime);
+        log.info("n:" + n);
+        log.info("消耗时长:" + consumTime);
+        log.info("传入时长:" + consumeTime);
 
         Integer configValue = Integer.valueOf(sysConfigService.findConfigValue(SysConfigConstant.PIANO_ROOM_MAX_STUDENTS));
         if (studentIds.size() > configValue) {

+ 1 - 1
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/LiveRoomServiceImpl.java

@@ -328,7 +328,7 @@ public class LiveRoomServiceImpl extends ServiceImpl<LiveRoomDao, LiveRoom> impl
                 userAccountRecord.setBizType(AccountBizTypeEnum.LIVE);
                 userAccountRecord.setBizId(room.getCourseId());
                 userAccountRecord.setBizName(room.getRoomTitle());
-                userAccountRecord.setTransAmount(salary.getExpectSalary());//扣除手续费后所得金额
+                userAccountRecord.setTransAmount(salary.getActualSalary());//扣除手续费后所得金额
                 userAccountRecord.setOrderNo(payment.getOrderNo());
                 userAccountService.accountChange(userAccountRecord);
             }

+ 14 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/MusicSheetAuthRecordServiceImpl.java

@@ -52,4 +52,18 @@ public class MusicSheetAuthRecordServiceImpl extends ServiceImpl<MusicSheetAuthR
         musicSheetAuthRecord.setAuditState(AuthStatusEnum.DOING);
         this.saveOrUpdate(musicSheetAuthRecord);
     }
+
+    @Override
+    public String selectAuditReason(Long musicSheetId) {
+        MusicSheetAuthRecord one = this.lambdaQuery()
+                                       .eq(MusicSheetAuthRecord::getMusicSheetId, musicSheetId)
+                                       .orderByDesc(MusicSheetAuthRecord::getId)
+                                       .last("limit 1")
+                                       .one();
+        if (one == null) {
+            return "";
+        }
+        return one.getReason();
+
+    }
 }

+ 9 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/MusicSheetServiceImpl.java

@@ -182,6 +182,10 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao,MusicSheet>
         if (sysUser == null) {
             return detail;
         }
+        if (AuthStatusEnum.UNPASS.getCode().equals(detail.getAuditStatus().getCode())) {
+            String reason = musicSheetAuthRecordService.selectAuditReason(id);
+            detail.setReason(reason);
+        }
         if (ChargeTypeEnum.FREE.getCode().equals(detail.getChargeType().getCode())) {
             detail.setPlay(YesOrNoEnum.YES);
         }  else if (SysUserType.STUDENT.getCode().equals(userType.getCode())) {
@@ -784,6 +788,11 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao,MusicSheet>
         return musicSheetWebsiteDetailVo;
     }
 
+    @Override
+    public TeacherAuditMusicSheetVo selectTeacherCount(Long userId) {
+        return baseMapper.selectTeacherCount(userId);
+    }
+
     private SysUser getSysUser(Long userId) {
         return Optional.ofNullable(userId)
                        .map(sysUserFeignService::queryUserById)

+ 9 - 1
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/StudentCourseHomeworkServiceImpl.java

@@ -40,7 +40,15 @@ public class StudentCourseHomeworkServiceImpl extends ServiceImpl<StudentCourseH
     @Override
     @Transactional(rollbackFor = Exception.class)
     public boolean submitCourseHome(CourseHomeworkDetailVo courseHomeworkDetailVo, String submit, Long studentId) {
-        StudentCourseHomework studentCourseHomework = new StudentCourseHomework();
+
+        StudentCourseHomework studentCourseHomework = this.lambdaQuery()
+                                        .eq(StudentCourseHomework::getStudentId, studentId)
+                                        .eq(StudentCourseHomework::getCourseScheduleId, courseHomeworkDetailVo.getCourseScheduleId())
+                                        .last("limit 1")
+                                        .one();
+        if (studentCourseHomework == null) {
+            studentCourseHomework = new StudentCourseHomework();
+        }
         studentCourseHomework.setCourseHomeworkId(courseHomeworkDetailVo.getId());
         studentCourseHomework.setCourseGroupType(courseHomeworkDetailVo.getCourseType().getCode());
         studentCourseHomework.setCourseGroupId(courseHomeworkDetailVo.getCourseGroupId());

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

@@ -10,6 +10,7 @@ import com.yonge.cooleshow.biz.dal.dto.search.StudentSearch;
 import com.yonge.cooleshow.biz.dal.entity.StudentTotal;
 import com.yonge.cooleshow.biz.dal.entity.Subject;
 import com.yonge.cooleshow.biz.dal.entity.UserBindingTeacher;
+import com.yonge.cooleshow.biz.dal.service.ImUserFriendService;
 import com.yonge.cooleshow.common.enums.CacheNameEnum;
 import com.yonge.cooleshow.biz.dal.service.StudentTotalService;
 import com.yonge.cooleshow.biz.dal.vo.*;
@@ -35,6 +36,8 @@ public class StudentServiceImpl extends ServiceImpl<StudentDao, Student> impleme
     @Autowired
     private StudentTotalService totalService;
     @Autowired
+    private ImUserFriendService imUserFriendService;
+    @Autowired
     private UserBindingTeacherDao userBindingTeacherDao;
     @Autowired
     private StudentService studentService;
@@ -144,6 +147,11 @@ public class StudentServiceImpl extends ServiceImpl<StudentDao, Student> impleme
             userBindingTeacher.setTeacherId(userId);
             userBindingTeacher.setStudentId(studentVo.getUserId());
             userBindingTeacherDao.insert(userBindingTeacher);
+
+            //学生老师增加好友关系
+            Set<Long> studentIds = new HashSet<>();
+            studentIds.add(studentVo.getUserId());
+            imUserFriendService.saveUserFriend(userId,studentIds);
         }
         resMap.put("now", detail);
         return HttpResponseResult.succeed(resMap);

+ 39 - 34
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/TeacherAuthEntryRecordServiceImpl.java

@@ -17,6 +17,7 @@ import com.yonge.cooleshow.biz.dal.service.SysMessageService;
 import com.yonge.cooleshow.biz.dal.vo.TeacherAuthEntryRecordVo;
 import com.yonge.cooleshow.biz.dal.vo.TeacherVo;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
+import com.yonge.toolset.base.string.StringPool;
 import com.yonge.toolset.base.util.StringUtil;
 import com.yonge.toolset.thirdparty.message.MessageSenderPluginContext;
 import com.yonge.toolset.utils.string.ValueUtil;
@@ -58,44 +59,48 @@ public class TeacherAuthEntryRecordServiceImpl extends ServiceImpl<TeacherAuthEn
     @Override
     @Transactional(rollbackFor = Exception.class)
     public HttpResponseResult<Boolean> doAuth(AuthOperaReq authOperaReq, SysUser sysUser) throws Exception {
-        TeacherAuthEntryRecord build = baseMapper.selectById(authOperaReq.getId());
-        if (!AuthStatusEnum.DOING.equals(build.getTeacherAuthStatus())) {
-            return HttpResponseResult.failed("审核单已审核");
-        }
+        Long[] ids = StringUtil.toLongArray(StringPool.COMMA, authOperaReq.getId());
+        for (Long id : ids) {
+            TeacherAuthEntryRecord build = baseMapper.selectById(id);
+            if (null == build || !AuthStatusEnum.DOING.equals(build.getTeacherAuthStatus())) {
+                continue;
+            }
 
-        build.setTeacherAuthStatus(authOperaReq.getPass() ? AuthStatusEnum.PASS : AuthStatusEnum.UNPASS);
-        build.setReason(authOperaReq.getReason());
-        build.setVerifyUserId(sysUser.getId());
-        build.setUpdateTime(new Date());
+            build.setTeacherAuthStatus(authOperaReq.getPass() ? AuthStatusEnum.PASS : AuthStatusEnum.UNPASS);
+            build.setReason(authOperaReq.getReason());
+            build.setVerifyUserId(sysUser.getId());
+            build.setUpdateTime(new Date());
 
-        //修改teacher表
-        TeacherVo teacher = teacherDao.detail(build.getUserId());
-        if (null == teacher) {
-            return HttpResponseResult.failed("未找到用户信息");
-        }
-        if (YesOrNoEnum.YES.equals(teacher.getEntryFlag())) {
-            return HttpResponseResult.failed("用户已经通过审核");
-        }
-        if (authOperaReq.getPass()) {
-            teacher.setSubjectId(StringUtil.isEmpty(teacher.getSubjectId()) ? build.getSubjectId() : teacher.getSubjectId());
-            teacher.setIntroduction(StringUtil.isEmpty(teacher.getIntroduction()) ? build.getIntroduction() : teacher.getIntroduction());
-            teacher.setGraduateSchool(StringUtil.isEmpty(teacher.getGraduateSchool()) ? build.getGraduateSchool() : teacher.getGraduateSchool());
-            teacher.setSubject(StringUtil.isEmpty(teacher.getSubject()) ? build.getSubject() : teacher.getSubject());
-            teacher.setGradCertificate(StringUtil.isEmpty(teacher.getGradCertificate()) ? build.getGradCertificate() : teacher.getGradCertificate());
-            teacher.setDegreeCertificate(StringUtil.isEmpty(teacher.getDegreeCertificate()) ? build.getDegreeCertificate() : teacher.getDegreeCertificate());
-            teacher.setTeacherCertificate(StringUtil.isEmpty(teacher.getTeacherCertificate()) ? build.getTeacherCertificate() : teacher.getTeacherCertificate());
-        }
-        teacher.setEntryFlag(authOperaReq.getPass() ? YesOrNoEnum.YES : YesOrNoEnum.NO);
-        teacher.setEntryAuthDate(new Date());
-        teacher.setUpdateTime(new Date());
+            //修改teacher表
+            TeacherVo teacher = teacherDao.detail(build.getUserId());
+            if (null == teacher) {
+                continue;
+            }
+            if (YesOrNoEnum.YES.equals(teacher.getEntryFlag())) {
+                continue;
+            }
+            if (authOperaReq.getPass()) {
+                teacher.setSubjectId(StringUtil.isEmpty(teacher.getSubjectId()) ? build.getSubjectId() : teacher.getSubjectId());
+                teacher.setIntroduction(StringUtil.isEmpty(teacher.getIntroduction()) ? build.getIntroduction() : teacher.getIntroduction());
+                teacher.setGraduateSchool(StringUtil.isEmpty(teacher.getGraduateSchool()) ? build.getGraduateSchool() : teacher.getGraduateSchool());
+                teacher.setSubject(StringUtil.isEmpty(teacher.getSubject()) ? build.getSubject() : teacher.getSubject());
+                teacher.setGradCertificate(StringUtil.isEmpty(teacher.getGradCertificate()) ? build.getGradCertificate() : teacher.getGradCertificate());
+                teacher.setDegreeCertificate(StringUtil.isEmpty(teacher.getDegreeCertificate()) ? build.getDegreeCertificate() : teacher.getDegreeCertificate());
+                teacher.setTeacherCertificate(StringUtil.isEmpty(teacher.getTeacherCertificate()) ? build.getTeacherCertificate() : teacher.getTeacherCertificate());
+            }
+            teacher.setEntryFlag(authOperaReq.getPass() ? YesOrNoEnum.YES : YesOrNoEnum.NO);
+            teacher.setEntryAuthDate(new Date());
+            teacher.setUpdateTime(new Date());
 
-        Teacher newTeacher = new Teacher();
-        BeanUtils.copyProperties(newTeacher, teacher);
-        teacherDao.updateById(newTeacher);
+            Teacher newTeacher = new Teacher();
+            BeanUtils.copyProperties(newTeacher, teacher);
+            teacherDao.updateById(newTeacher);
 
-        // 发送审核通知
-        authSend(teacher.getUserId(), teacher.getPhone(), authOperaReq.getPass(), authOperaReq.getReason());
-        return HttpResponseResult.succeed(baseMapper.updateById(build) > 0);
+            // 发送审核通知
+            authSend(teacher.getUserId(), teacher.getPhone(), authOperaReq.getPass(), authOperaReq.getReason());
+            baseMapper.updateById(build);
+        }
+        return HttpResponseResult.succeed(true);
     }
 
     // 发送审核通知

+ 31 - 25
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/TeacherAuthMusicianRecordServiceImpl.java

@@ -16,6 +16,8 @@ import com.yonge.cooleshow.biz.dal.service.SysMessageService;
 import com.yonge.cooleshow.biz.dal.vo.MusicianAuthEntryRecordVo;
 import com.yonge.cooleshow.biz.dal.vo.TeacherVo;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
+import com.yonge.toolset.base.string.StringPool;
+import com.yonge.toolset.base.util.StringUtil;
 import com.yonge.toolset.thirdparty.message.MessageSenderPluginContext;
 import org.apache.commons.beanutils.BeanUtils;
 import org.slf4j.Logger;
@@ -85,36 +87,40 @@ public class TeacherAuthMusicianRecordServiceImpl extends ServiceImpl<TeacherAut
     @Override
     @Transactional(rollbackFor = Exception.class)
     public HttpResponseResult<Boolean> doAuth(AuthOperaReq authOperaReq, SysUser sysUser) throws Exception {
-        TeacherAuthMusicianRecord build = baseMapper.selectById(authOperaReq.getId());
-        if (!AuthStatusEnum.DOING.equals(build.getTeacherAuthStatus())) {
-            return HttpResponseResult.failed("审核单已审核");
-        }
+        Long[] ids = StringUtil.toLongArray(StringPool.COMMA, authOperaReq.getId());
+        for (Long id : ids) {
+            TeacherAuthMusicianRecord build = baseMapper.selectById(id);
+            if (null == build || !AuthStatusEnum.DOING.equals(build.getTeacherAuthStatus())) {
+                continue;
+            }
 
-        build.setTeacherAuthStatus(authOperaReq.getPass() ? AuthStatusEnum.PASS : AuthStatusEnum.UNPASS);
-        build.setReason(authOperaReq.getReason());
-        build.setVerifyUserId(sysUser.getId());
-        build.setUpdateTime(new Date());
+            build.setTeacherAuthStatus(authOperaReq.getPass() ? AuthStatusEnum.PASS : AuthStatusEnum.UNPASS);
+            build.setReason(authOperaReq.getReason());
+            build.setVerifyUserId(sysUser.getId());
+            build.setUpdateTime(new Date());
 
-        //修改teacher表
-        TeacherVo teacher = teacherDao.detail(build.getUserId());
-        if (null == teacher) {
-            return HttpResponseResult.failed("未找到用户信息");
-        }
-        if (YesOrNoEnum.YES.equals(teacher.getMusicianFlag())) {
-            return HttpResponseResult.failed("用户已经通过审核");
-        }
+            //修改teacher表
+            TeacherVo teacher = teacherDao.detail(build.getUserId());
+            if (null == teacher) {
+                continue;
+            }
+            if (YesOrNoEnum.YES.equals(teacher.getMusicianFlag())) {
+                continue;
+            }
 
-        teacher.setMusicianFlag(authOperaReq.getPass() ? YesOrNoEnum.YES : YesOrNoEnum.NO);
-        teacher.setMusicianDate(new Date());
-        teacher.setUpdateTime(new Date());
+            teacher.setMusicianFlag(authOperaReq.getPass() ? YesOrNoEnum.YES : YesOrNoEnum.NO);
+            teacher.setMusicianDate(new Date());
+            teacher.setUpdateTime(new Date());
 
-        Teacher newTeacher = new Teacher();
-        BeanUtils.copyProperties(newTeacher, teacher);
-        teacherDao.updateById(newTeacher);
+            Teacher newTeacher = new Teacher();
+            BeanUtils.copyProperties(newTeacher, teacher);
+            teacherDao.updateById(newTeacher);
 
-        // 发送审核通知
-        authSend(teacher.getUserId(), teacher.getPhone(), authOperaReq.getPass(), authOperaReq.getReason());
-        return HttpResponseResult.succeed(baseMapper.updateById(build) > 0);
+            // 发送审核通知
+            authSend(teacher.getUserId(), teacher.getPhone(), authOperaReq.getPass(), authOperaReq.getReason());
+            baseMapper.updateById(build);
+        }
+        return HttpResponseResult.succeed(true);
     }
 
     // 发送审核通知

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

@@ -13,6 +13,8 @@ import com.yonge.cooleshow.biz.dal.enums.MessageTypeEnum;
 import com.yonge.cooleshow.biz.dal.service.SysMessageService;
 import com.yonge.cooleshow.biz.dal.vo.TeacherStyleVideoVo;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
+import com.yonge.toolset.base.string.StringPool;
+import com.yonge.toolset.base.util.StringUtil;
 import com.yonge.toolset.thirdparty.message.MessageSenderPluginContext;
 import com.yonge.toolset.utils.http.HttpUtil;
 import org.slf4j.Logger;
@@ -47,44 +49,46 @@ public class TeacherStyleVideoServiceImpl extends ServiceImpl<TeacherStyleVideoD
     }
 
     @Override
-    public IPage<TeacherStyleVideoVo> selectPage(IPage<TeacherStyleVideoVo> page, TeacherStyleVideoSearch query){
+    public IPage<TeacherStyleVideoVo> selectPage(IPage<TeacherStyleVideoVo> page, TeacherStyleVideoSearch query) {
         return page.setRecords(baseMapper.selectPage(page, query));
     }
 
     @Override
     @Transactional(rollbackFor = Exception.class)
     public HttpResponseResult<Boolean> doAuth(AuthOperaReq authOperaReq, SysUser sysUser) throws Exception {
-        TeacherStyleVideo build = baseMapper.selectById(authOperaReq.getId());
-        if (!AuthStatusEnum.DOING.equals(build.getAuthStatus())) {
-            return HttpResponseResult.failed("审核单已审核");
-        }
-
-        build.setAuthStatus(authOperaReq.getPass() ? AuthStatusEnum.PASS : AuthStatusEnum.UNPASS);
-        build.setReason(authOperaReq.getReason());
-        build.setVerifyUserId(sysUser.getId());
-        build.setUpdateTime(new Date());
-        HttpResponseResult<Boolean> result = HttpResponseResult.succeed(baseMapper.updateById(build) > 0);
-        if (result.getStatus()) {
-            sendAuthMessage(authOperaReq.getPass(), build.getUserId(), authOperaReq.getReason());
+        Long[] ids = StringUtil.toLongArray(StringPool.COMMA, authOperaReq.getId());
+        for (Long id : ids) {
+            TeacherStyleVideo build = baseMapper.selectById(id);
+            if (!AuthStatusEnum.DOING.equals(build.getAuthStatus())) {
+                continue;
+            }
+            build.setAuthStatus(authOperaReq.getPass() ? AuthStatusEnum.PASS : AuthStatusEnum.UNPASS);
+            build.setReason(authOperaReq.getReason());
+            build.setVerifyUserId(sysUser.getId());
+            build.setUpdateTime(new Date());
+            HttpResponseResult<Boolean> result = HttpResponseResult.succeed(baseMapper.updateById(build) > 0);
+            if (result.getStatus()) {
+                sendAuthMessage(authOperaReq.getPass(), build.getUserId(), authOperaReq.getReason());
+            }
         }
-        return result;
+        return HttpResponseResult.succeed(true);
     }
 
     /**
-     *  发送个人风采审核
+     * 发送个人风采审核
      *
      * @param pass 通过/失败
      */
-    private void sendAuthMessage(Boolean pass, Long teacherId,String remark) {
+    private void sendAuthMessage(Boolean pass, Long teacherId, String remark) {
         if (Boolean.TRUE.equals(pass)) {
             try {
                 SysUser user = sysUserFeignService.queryUserById(teacherId);
                 Map<Long, String> teacherReceivers = new HashMap<>();
                 teacherReceivers.put(user.getId(), user.getPhone());
                 sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.TEACHER_STYLE_VIDEO_SUCCESS,
-                       teacherReceivers, null, 0, null, ClientEnum.TEACHER.getCode());
-            }catch (Exception e) {
-                log.warn("老师个人风采审核成功消息发送失败,{}",e.getMessage());
+                        teacherReceivers, null, 0, null, ClientEnum.TEACHER.getCode());
+            } catch (Exception e) {
+                log.warn("老师个人风采审核成功消息发送失败,{}", e.getMessage());
             }
         } else {
             try {
@@ -92,9 +96,9 @@ public class TeacherStyleVideoServiceImpl extends ServiceImpl<TeacherStyleVideoD
                 Map<Long, String> teacherReceivers = new HashMap<>();
                 teacherReceivers.put(user.getId(), user.getPhone());
                 sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.TEACHER_STYLE_VIDEO_FAIL,
-                                                   teacherReceivers, null, 0, null, ClientEnum.TEACHER.getCode(),remark);
-            }catch (Exception e) {
-                log.warn("老师个人风采审核失败消息发送失败,{}",e.getMessage());
+                        teacherReceivers, null, 0, null, ClientEnum.TEACHER.getCode(), remark);
+            } catch (Exception e) {
+                log.warn("老师个人风采审核失败消息发送失败,{}", e.getMessage());
             }
         }
     }

+ 34 - 30
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserOrderRefundServiceImpl.java

@@ -27,6 +27,7 @@ import com.yonge.cooleshow.common.entity.HttpResponseResult;
 import com.yonge.cooleshow.common.service.IdGeneratorService;
 import com.yonge.toolset.base.exception.BizException;
 import com.yonge.toolset.base.result.BaseResult;
+import com.yonge.toolset.base.string.StringPool;
 import com.yonge.toolset.base.util.StringUtil;
 import com.yonge.toolset.payment.base.enums.PaymentClientEnum;
 import com.yonge.toolset.payment.base.enums.TradeStatusEnum;
@@ -178,41 +179,44 @@ public class UserOrderRefundServiceImpl extends ServiceImpl<UserOrderRefundDao,
 
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public HttpResponseResult<UserOrderRefundBill> doAuth(AuthOperaReq authOperaReq, SysUser user) {
-        UserOrderRefund orderRefund = baseMapper.selectById(authOperaReq.getId());
-        if (!AuthStatusEnum.DOING.equals(orderRefund.getStatus())) {
-            return HttpResponseResult.failed("退款单已审核");
-        }
-        String oredrDetilIds = orderRefund.getOredrDetilIds();
-        if (StringUtil.isEmpty(oredrDetilIds)) {
-            return HttpResponseResult.succeed();
-        }
+    public HttpResponseResult<Boolean> doAuth(AuthOperaReq authOperaReq, SysUser user) {
+        Long[] ids = StringUtil.toLongArray(StringPool.COMMA, authOperaReq.getId());
+        for (Long id : ids) {
+            UserOrderRefund orderRefund = baseMapper.selectById(id);
+            if (null == orderRefund || !AuthStatusEnum.DOING.equals(orderRefund.getStatus())) {
+                continue;
+            }
+            String oredrDetilIds = orderRefund.getOredrDetilIds();
+            if (StringUtil.isEmpty(oredrDetilIds)) {
+                continue;
+            }
 
-        orderRefund.setStatus(authOperaReq.getPass() ? AuthStatusEnum.PASS : AuthStatusEnum.UNPASS);
-        orderRefund.setActualAmount(orderRefund.getApplyAmount());
-        orderRefund.setOperateId(user.getId());
-        orderRefund.setOperateReason(authOperaReq.getReason());
-        orderRefund.setUpdateTime(new Date());
-        updateById(orderRefund);
+            orderRefund.setStatus(authOperaReq.getPass() ? AuthStatusEnum.PASS : AuthStatusEnum.UNPASS);
+            orderRefund.setActualAmount(orderRefund.getApplyAmount());
+            orderRefund.setOperateId(user.getId());
+            orderRefund.setOperateReason(authOperaReq.getReason());
+            orderRefund.setUpdateTime(new Date());
+            updateById(orderRefund);
 
-        if (authOperaReq.getPass()) {
-            //通过调用退款接口
-            return doOrderRefund(orderRefund);
-        } else {
-            List<String> detilIds = Arrays.asList(oredrDetilIds.split(","));
-            for (String id : detilIds) {
-                UserOrderDetailVo detail = orderDetailService.detail(Long.parseLong(id));
-                if (null == detail) {
-                    continue;
-                }
-                //调用业务方法
-                Consumer<UserOrderDetailVo> refundCancelConsumer = refundCancel.get(detail.getGoodType());
-                if (!Objects.isNull(refundCancelConsumer)) {
-                    refundCancelConsumer.accept(detail);
+            if (authOperaReq.getPass()) {
+                //通过调用退款接口
+                doOrderRefund(orderRefund);
+            } else {
+                List<String> detilIds = Arrays.asList(oredrDetilIds.split(StringPool.COMMA));
+                for (String detilId : detilIds) {
+                    UserOrderDetailVo detail = orderDetailService.detail(Long.parseLong(detilId));
+                    if (null == detail) {
+                        continue;
+                    }
+                    //调用业务方法
+                    Consumer<UserOrderDetailVo> refundCancelConsumer = refundCancel.get(detail.getGoodType());
+                    if (!Objects.isNull(refundCancelConsumer)) {
+                        refundCancelConsumer.accept(detail);
+                    }
                 }
             }
         }
-        return HttpResponseResult.succeed();
+        return HttpResponseResult.succeed(true);
     }
 
 

+ 266 - 91
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserWithdrawalServiceImpl.java

@@ -1,29 +1,34 @@
 package com.yonge.cooleshow.biz.dal.service.impl;
 
+import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.yonge.cooleshow.auth.api.entity.SysUser;
 import com.yonge.cooleshow.biz.dal.dao.SysUserContractRecordDao;
+import com.yonge.cooleshow.biz.dal.dto.req.AuthOperaReq;
 import com.yonge.cooleshow.biz.dal.entity.UserWithdrawalCallback;
 import com.yonge.cooleshow.biz.dal.enums.*;
 import com.yonge.cooleshow.biz.dal.sdk.WithdrawSdk;
-import com.yonge.cooleshow.biz.dal.service.SysMessageService;
+import com.yonge.cooleshow.biz.dal.service.*;
+import com.yonge.cooleshow.biz.dal.support.DistributedLock;
 import com.yonge.cooleshow.common.constant.SysConfigConstant;
 import com.yonge.cooleshow.biz.dal.dao.UserBankCardDao;
 import com.yonge.cooleshow.biz.dal.dto.UserAccountRecordDto;
 import com.yonge.cooleshow.biz.dal.dto.req.WithdrawalReq;
 import com.yonge.cooleshow.biz.dal.entity.UserAccountRecord;
-import com.yonge.cooleshow.biz.dal.service.SysConfigService;
-import com.yonge.cooleshow.biz.dal.service.UserAccountService;
 import com.yonge.cooleshow.biz.dal.vo.UserAccountVo;
 import com.yonge.cooleshow.biz.dal.vo.UserBankCardVo;
 import com.yonge.cooleshow.biz.dal.vo.res.WithdrawalInfoRes;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
+import com.yonge.cooleshow.common.enums.CacheNameEnum;
+import com.yonge.cooleshow.common.service.IdGeneratorService;
 import com.yonge.toolset.base.exception.BizException;
+import com.yonge.toolset.base.string.StringPool;
 import com.yonge.toolset.base.util.StringUtil;
 import com.yonge.toolset.payment.base.enums.TradeStatusEnum;
 import com.yonge.toolset.thirdparty.message.MessageSenderPluginContext;
 import com.yonge.toolset.utils.string.ValueUtil;
+import org.redisson.api.RedissonClient;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -32,11 +37,11 @@ import com.yonge.cooleshow.biz.dal.entity.UserWithdrawal;
 import com.yonge.cooleshow.biz.dal.vo.UserWithdrawalVo;
 import com.yonge.cooleshow.biz.dal.dto.search.TeacherWithdrawalSearch;
 import com.yonge.cooleshow.biz.dal.dao.UserWithdrawalDao;
-import com.yonge.cooleshow.biz.dal.service.UserWithdrawalService;
 import org.springframework.transaction.annotation.Transactional;
 
 import java.math.BigDecimal;
 import java.util.*;
+import java.util.concurrent.TimeUnit;
 
 
 @Service
@@ -50,11 +55,17 @@ public class UserWithdrawalServiceImpl extends ServiceImpl<UserWithdrawalDao, Us
     @Autowired
     private SysConfigService sysConfigService;
     @Autowired
+    private SysUserService sysUserService;
+    @Autowired
     private WithdrawSdk withdrawSdk;
     @Autowired
     private SysMessageService sysMessageService;
     @Autowired
     private SysUserContractRecordDao userContractRecordDao;
+    @Autowired
+    private IdGeneratorService idGeneratorService;
+    @Autowired
+    private RedissonClient redissonClient;
 
     @Override
     public UserWithdrawalVo detail(Long id) {
@@ -63,6 +74,12 @@ public class UserWithdrawalServiceImpl extends ServiceImpl<UserWithdrawalDao, Us
     }
 
     @Override
+    public UserWithdrawalVo detailByTransNo(String transNo) {
+        UserWithdrawalVo detail = baseMapper.detailByTransNo(transNo);
+        return detail;
+    }
+
+    @Override
     public IPage<UserWithdrawalVo> selectPage(IPage<UserWithdrawalVo> page, TeacherWithdrawalSearch query) {
         List<UserWithdrawalVo> withdrawalVoList = baseMapper.selectPage(page, query);
         withdrawalVoList.forEach(o -> o.setBankCard(ValueUtil.fuzzyBankCard(o.getBankCard())));
@@ -94,14 +111,28 @@ public class UserWithdrawalServiceImpl extends ServiceImpl<UserWithdrawalDao, Us
     @Override
     @Transactional(rollbackFor = Exception.class)
     public HttpResponseResult<Boolean> withdrawal(SysUser user, WithdrawalReq withdrawalReq) {
+        if (StringUtil.isEmpty(user.getIdCardNo())) {
+            return HttpResponseResult.failed("用户未实名认证");
+        }
+        //校验--结算开关
+        String withdrawalSwitch = sysConfigService.findConfigValue(SysConfigConstant.WITHDRAWAL_SWITCH);
+        if (!YesOrNoEnum.YES.getCode().toString().equals(withdrawalSwitch)) {
+            return HttpResponseResult.failed("当前不允许结算");
+        }
+        //校验--判断今天结算次数
+        String withdrawalMaxCount = sysConfigService.findConfigValue(SysConfigConstant.WITHDRAWAL_MAX_COUNT);
+        Integer count = getNowDayWithdrawalCount(user.getId());
+        if (count >= Integer.parseInt(withdrawalMaxCount)) {
+            return HttpResponseResult.failed("达到当天结算最大次数");
+        }
+        //校验--校验金额(金额不能小于手续费,手续费从结算金额里面扣除)
         BigDecimal withdrawalServiceFee = getWithdrawalServiceFee();
-        //校验金额
-        if (withdrawalReq.getAmountWithdrawal().floatValue() <= 0) {
+        BigDecimal actualAmount = withdrawalReq.getAmountWithdrawal().subtract(withdrawalServiceFee);
+        if (actualAmount.compareTo(BigDecimal.ZERO) <= 0) {
             return HttpResponseResult.failed("结算金额过小");
         }
-        //获取用户结算金额
+        //获取用户结算金额
         BigDecimal amountWithdrawal = getAmountUsable(user.getId());
-        //比较大小
         if (amountWithdrawal.compareTo(withdrawalReq.getAmountWithdrawal()) < 0) {
             return HttpResponseResult.failed("账户余额不足");
         }
@@ -110,9 +141,13 @@ public class UserWithdrawalServiceImpl extends ServiceImpl<UserWithdrawalDao, Us
         if (null == bankCardVo) {
             return HttpResponseResult.failed("未找到用户绑卡信息");
         }
+        //结算审核开关
+        String withdrawalAuthSwitch = sysConfigService.findConfigValue(SysConfigConstant.WITHDRAWAL_AUTH_SWITCH);
+        //结算审核额度(小于该额度免审核结算)
+        String withdrawalAuthFee = sysConfigService.findConfigValue(SysConfigConstant.WITHDRAWAL_AUTH_FEE);
 
         //插入用户结算表
-        UserWithdrawal userWithdrawal = insertUserWithdrawal(user.getId(), withdrawalReq, bankCardVo, withdrawalServiceFee);
+        UserWithdrawal userWithdrawal = insertUserWithdrawal(user.getId(), withdrawalReq, bankCardVo, withdrawalServiceFee, withdrawalAuthSwitch, withdrawalAuthFee);
         //插入账户变更
         UserAccountRecordDto accountRecordDto = new UserAccountRecordDto(
                 user.getId(), withdrawalReq.getAmountWithdrawal(), InOrOutEnum.OUT, AccountBizTypeEnum.WITHDRAWAL,
@@ -121,36 +156,157 @@ public class UserWithdrawalServiceImpl extends ServiceImpl<UserWithdrawalDao, Us
         accountRecordDto.setFrozenType(FrozenTypeEnum.FROZEN);
         accountRecordDto.setSaveRecord(false);
         HttpResponseResult<UserAccountRecord> accountChange = userAccountService.accountChange(accountRecordDto);
+
         if (accountChange.getStatus()) {
+            if (YesOrNoEnum.NO.getCode().toString().equals(withdrawalAuthSwitch)
+                    || new BigDecimal(withdrawalAuthFee).compareTo(withdrawalReq.getAmountWithdrawal()) > 0) {
+                //不用审核的,直接请求三方
+                //交易流水号生成
+                Long transNo = idGeneratorService.generatorId("withdrawNo");
+
+                HttpResponseResult<Boolean> withdraw = withdrawSdk.withdraw(
+                        transNo.toString(), bankCardVo.getName(), bankCardVo.getPhone(), user.getIdCardNo(),
+                        userWithdrawal.getActualAmount().multiply(new BigDecimal("100")).intValue(), bankCardVo.getBankCard(), null
+                );
+                if (withdraw.getStatus() && withdraw.getData()) {
+                    userWithdrawal.setTradeStatus(TradeStatusEnum.pending);
+                    userWithdrawal.setTransNo(transNo.toString());
+                    updateById(userWithdrawal);
+                } else {
+                    log.error("结算调用三方接口失败:user is {}, param is {}, res is {}", user.getId(), JSONObject.toJSONString(withdrawalReq), withdraw);
+                    throw new BizException("结算失败");
+                }
+            }
+            return HttpResponseResult.succeed(true);
+        } else {
+            throw new BizException("结算失败");
+        }
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public HttpResponseResult<Boolean> batchAuth(AuthOperaReq authOperaReq, SysUser sysUser) {
+        Long[] ids = StringUtil.toLongArray(StringPool.COMMA, authOperaReq.getId());
+        for (Long id : ids) {
+            AuthOperaReq param = new AuthOperaReq();
+            param.setId(id.toString());
+            param.setReason(authOperaReq.getReason());
+            param.setPass(authOperaReq.getPass());
+
+            try {
+                DistributedLock.of(redissonClient)
+                        .runIfLockCanGet(CacheNameEnum.LOCK_WITHDRAWAL.getRedisKey(id.toString())
+                                , () -> doAuth(param, sysUser), 60L, TimeUnit.SECONDS);
+            } catch (BizException e) {
+                return HttpResponseResult.failed(e.getMessage());
+            } catch (Exception e) {
+                e.printStackTrace();
+                return HttpResponseResult.failed("结算失败");
+            }
+        }
+        return HttpResponseResult.succeed();
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    public void doAuth(AuthOperaReq authOperaReq, SysUser sysUser) {
+        UserWithdrawalVo build = detail(Long.parseLong(authOperaReq.getId()));
+        if (null == build || !AuthStatusEnum.DOING.equals(build.getAuthStatus())) {
+            return;
+        }
+        build.setAuthStatus(authOperaReq.getPass() ? AuthStatusEnum.PASS : AuthStatusEnum.UNPASS);
+        build.setReason(authOperaReq.getReason());
+        build.setAuthUserId(sysUser.getId());
+        build.setUpdateTime(new Date());
+        build.setAuthTime(new Date());
+
+        //请求三方
+        SysUser withdrawalUser = sysUserService.findUserById(build.getUserId());
+        Boolean flag = false;
+        if (authOperaReq.getPass()) {
             //请求三方接口
-            withdrawSdk.withdraw(
-                    userWithdrawal.getId().toString(), bankCardVo.getName(), bankCardVo.getPhone(), user.getIdCardNo(),
-                    amountWithdrawal.multiply(new BigDecimal("100")).intValue(), bankCardVo.getBankCard(), null
+            //交易流水号生成
+            Long transNo = idGeneratorService.generatorId("withdrawNo");
+
+            HttpResponseResult<Boolean> withdraw = withdrawSdk.withdraw(
+                    transNo.toString(), build.getRealName(), build.getPhone(), withdrawalUser.getIdCardNo(),
+                    build.getActualAmount().multiply(new BigDecimal("100")).intValue(), build.getBankCard(), null
+            );
+            if (withdraw.getStatus() && withdraw.getData()) {
+                build.setTradeStatus(TradeStatusEnum.pending);
+                build.setTransNo(transNo.toString());
+                flag = true;
+            } else {
+                build.setTradeStatus(TradeStatusEnum.failed);
+                build.setErrorMsg("请求三方接口返回失败");
+            }
+        }
+        //修改系统中账户
+        if (!authOperaReq.getPass() || !flag) {
+            //审核不通过,账户解冻
+            UserAccountRecordDto accountRecordDto = new UserAccountRecordDto(
+                    build.getUserId(), build.getAmount(), InOrOutEnum.OUT, AccountBizTypeEnum.WITHDRAWAL,
+                    build.getId(), "老师结算", null
             );
+            accountRecordDto.setFrozenType(FrozenTypeEnum.FROZEN_BACK);
+            accountRecordDto.setSaveRecord(false);
+            userAccountService.accountChange(accountRecordDto);
+        }
+        updateById(build);
+    }
+
+    @Override
+    public HttpResponseResult<Boolean> transferAccount(AuthOperaReq authOperaReq, SysUser user) {
+        UserWithdrawalVo detail = detail(Long.parseLong(authOperaReq.getId()));
+        if (detail == null) {
+            return HttpResponseResult.failed("结算记录不存在");
+        }
+        if (!AuthStatusEnum.PASS.equals(detail.getAuthStatus())) {
+            return HttpResponseResult.failed("结算记录未审核");
+        }
+        if (TradeStatusEnum.succeeded.equals(detail.getTradeStatus())) {
+            return HttpResponseResult.failed("结算已经交易成功");
+        }
+
+        //交易流水号生成
+        Long transNo = idGeneratorService.generatorId("withdrawNo");
+
+        //不用审核的,需要请求三方
+        HttpResponseResult<Boolean> withdraw = withdrawSdk.withdraw(
+                transNo.toString(), detail.getRealName(), detail.getPhone(), user.getIdCardNo(),
+                detail.getActualAmount().multiply(new BigDecimal("100")).intValue(), detail.getBankCard(), null
+        );
+        if (withdraw.getStatus() && withdraw.getData()) {
+            detail.setTradeStatus(TradeStatusEnum.pending);
+            detail.setTransNo(transNo.toString());
+            updateById(detail);
             return HttpResponseResult.succeed(true);
         } else {
+            log.error("结算调用三方接口失败:user is {}, data is {}, res is {}", user.getId(), JSONObject.toJSONString(detail), withdraw);
             throw new BizException("结算失败");
         }
     }
 
+
     @Override
     @Transactional(rollbackFor = Exception.class)
     public void callback(UserWithdrawalCallback callback, String jsonStr) {
         if (StringUtil.isEmpty(callback.getOuterOrderNo()) ||
                 StringUtil.isEmpty(callback.getStatus())) {
-            throw new BizException("参数异常,参数缺失,param is {}", jsonStr);
+            log.error("参数异常,参数缺失,param is {}", jsonStr);
+            return;
         }
-        UserWithdrawalVo detail = detail(Long.parseLong(callback.getOuterOrderNo().trim()));
+        UserWithdrawalVo detail = detailByTransNo(callback.getOuterOrderNo().trim());
         if (null == detail) {
-            throw new BizException("参数异常,未找到交易记录,param is {}", jsonStr);
+            log.error("参数异常,未找到交易记录,param is {}", jsonStr);
+            return;
         }
-        if (!TradeStatusEnum.pending.equals(detail.getStatus())) {
+        if (!TradeStatusEnum.pending.equals(detail.getTradeStatus())) {
             return;
         }
         if ("1".equals(callback.getStatus())) {
             //交易成功
-            detail.setStatus(TradeStatusEnum.succeeded);
-            detail.setTransNo(callback.getOrderNo());
+            detail.setTradeStatus(TradeStatusEnum.succeeded);
+            detail.setTradeNo(callback.getOrderNo());
             BigDecimal actualAmount = new BigDecimal(callback.getActualAmount());
             detail.setActualAmount(actualAmount.divide(new BigDecimal("100")));
             detail.setTransferTime(callback.getEndTime());
@@ -167,18 +323,10 @@ public class UserWithdrawalServiceImpl extends ServiceImpl<UserWithdrawalDao, Us
             successSend(detail.getUserId(), detail.getPhone());
         } else if ("2".equals(callback.getStatus())) {
             //交易失败
-            detail.setStatus(TradeStatusEnum.failed);
+            detail.setTradeStatus(TradeStatusEnum.failed);
+            detail.setTradeNo(callback.getOrderNo());
             detail.setErrorCode(callback.getErrorCode());
             detail.setErrorMsg(callback.getErrorMsg());
-
-            //结算失败,账户解冻
-            UserAccountRecordDto accountRecordDto = new UserAccountRecordDto(
-                    detail.getUserId(), detail.getAmount(), InOrOutEnum.OUT, AccountBizTypeEnum.WITHDRAWAL,
-                    detail.getId(), "老师结算", null
-            );
-            accountRecordDto.setFrozenType(FrozenTypeEnum.FROZEN_BACK);
-            accountRecordDto.setSaveRecord(false);
-            userAccountService.accountChange(accountRecordDto);
         } else {
             return;
         }
@@ -191,6 +339,16 @@ public class UserWithdrawalServiceImpl extends ServiceImpl<UserWithdrawalDao, Us
         userContractRecordDao.contractCallbackUpdate(status, serialNo, url, errMsg);
     }
 
+    /**
+     * 查询用户今天发起的结算次数
+     *
+     * @param userId
+     * @return
+     */
+    private Integer getNowDayWithdrawalCount(Long userId) {
+        return baseMapper.getNowDayWithdrawalCount(userId);
+    }
+
     private void successSend(Long userId, String phone) {
         Map<Long, String> receivers = new HashMap<>();
         receivers.put(userId, phone);
@@ -202,7 +360,86 @@ public class UserWithdrawalServiceImpl extends ServiceImpl<UserWithdrawalDao, Us
         }
     }
 
-   /* @Override
+
+    /***
+     * 入结算表
+     * @author liweifan
+     * @param: userId
+     * @param: withdrawalReq
+     * @param: bankCardVo
+     * @param: userAccountRecord
+     * @updateTime 2022/4/7 16:46
+     */
+    private UserWithdrawal insertUserWithdrawal(Long userId, WithdrawalReq withdrawalReq,
+                                                UserBankCardVo bankCardVo, BigDecimal withdrawalServiceFee,
+                                                String withdrawalAuthSwitch, String withdrawalAuthFee) {
+        UserWithdrawal userWithdrawal = new UserWithdrawal();
+        userWithdrawal.setUserId(userId);
+        userWithdrawal.setAmount(withdrawalReq.getAmountWithdrawal());
+        userWithdrawal.setPlantformFee(withdrawalServiceFee);
+        userWithdrawal.setActualAmount(withdrawalReq.getAmountWithdrawal().subtract(withdrawalServiceFee));
+        userWithdrawal.setBankCardId(bankCardVo.getId());
+        userWithdrawal.setOpenType(OpenContractEnum.lingxinpay.getCode());
+
+        if (YesOrNoEnum.NO.getCode().toString().equals(withdrawalAuthSwitch)) {
+            userWithdrawal.setAuthStatus(AuthStatusEnum.PASS);
+            userWithdrawal.setAuthUserId(0L);
+            userWithdrawal.setReason("系统审核通过");
+        } else {
+            if (new BigDecimal(withdrawalAuthFee).compareTo(withdrawalReq.getAmountWithdrawal()) > 0) {
+                userWithdrawal.setAuthStatus(AuthStatusEnum.PASS);
+                userWithdrawal.setAuthUserId(0L);
+                userWithdrawal.setReason("系统审核通过");
+            } else {
+                userWithdrawal.setAuthStatus(AuthStatusEnum.DOING);
+            }
+        }
+        userWithdrawal.setCreateTime(new Date());
+        userWithdrawal.setUpdateTime(new Date());
+        baseMapper.insert(userWithdrawal);
+        return userWithdrawal;
+    }
+
+    /***
+     * 获取平台结算服务费
+     * @author liweifan
+     * @param: userId
+     * @updateTime 2022/4/7 14:59
+     * @return: java.math.BigDecimal
+     */
+    private BigDecimal getWithdrawalServiceFee() {
+        BigDecimal withdrawalServiceFee;
+        try {
+            String configValue = sysConfigService.findConfigValue(SysConfigConstant.WITHDRAWAL_SERVICE_FEE);
+            withdrawalServiceFee = new BigDecimal(configValue);
+        } catch (Exception e) {
+            e.printStackTrace();
+            log.info("获取平台配置失败 key={}", SysConfigConstant.WITHDRAWAL_SERVICE_FEE);
+            withdrawalServiceFee = new BigDecimal(0);
+        }
+        return withdrawalServiceFee;
+    }
+
+    /***
+     * 获取用户可结算金额
+     * @author liweifan
+     * @param: userId
+     * @param: withdrawalServiceFee
+     * @updateTime 2022/4/7 15:02
+     * @return: java.math.BigDecimal
+     */
+    private BigDecimal getAmountUsable(Long userId) {
+        //查询用户账户余额
+        UserAccountVo detail = userAccountService.detail(userId);
+        BigDecimal subtract = detail.getAmountUsable();
+        if (subtract.intValue() < 0) {
+            subtract = new BigDecimal(0);
+        }
+        return subtract;
+    }
+
+
+       /* @Override
     @Transactional(rollbackFor = Exception.class)
     public void importExcel(List<ExcelDataReaderProperty<UserWithdrawalExport>> dataList, Long userId) {
         List<ErrMsg> errMsgList = new ArrayList<>();
@@ -290,66 +527,4 @@ public class UserWithdrawalServiceImpl extends ServiceImpl<UserWithdrawalDao, Us
             baseMapper.updateById(userWithdrawal);
         }
     }*/
-
-    /***
-     * 入结算表
-     * @author liweifan
-     * @param: userId
-     * @param: withdrawalReq
-     * @param: bankCardVo
-     * @param: userAccountRecord
-     * @updateTime 2022/4/7 16:46
-     */
-    private UserWithdrawal insertUserWithdrawal(Long userId, WithdrawalReq withdrawalReq,
-                                                UserBankCardVo bankCardVo, BigDecimal withdrawalServiceFee) {
-        UserWithdrawal userWithdrawal = new UserWithdrawal();
-        userWithdrawal.setUserId(userId);
-        userWithdrawal.setAmount(withdrawalReq.getAmountWithdrawal());
-        userWithdrawal.setPlantformFee(withdrawalServiceFee);
-        userWithdrawal.setBankCardId(bankCardVo.getId());
-        userWithdrawal.setOpenType(OpenContractEnum.lingxinpay.getCode());
-        userWithdrawal.setStatus(TradeStatusEnum.pending);
-        userWithdrawal.setCreateTime(new Date());
-        userWithdrawal.setUpdateTime(new Date());
-        baseMapper.insert(userWithdrawal);
-        return userWithdrawal;
-    }
-
-    /***
-     * 获取平台结算服务费
-     * @author liweifan
-     * @param: userId
-     * @updateTime 2022/4/7 14:59
-     * @return: java.math.BigDecimal
-     */
-    private BigDecimal getWithdrawalServiceFee() {
-        BigDecimal withdrawalServiceFee;
-        try {
-            String configValue = sysConfigService.findConfigValue(SysConfigConstant.WITHDRAWAL_SERVICE_FEE);
-            withdrawalServiceFee = new BigDecimal(configValue);
-        } catch (Exception e) {
-            e.printStackTrace();
-            log.info("获取平台配置失败 key={}", SysConfigConstant.WITHDRAWAL_SERVICE_FEE);
-            withdrawalServiceFee = new BigDecimal(0);
-        }
-        return withdrawalServiceFee;
-    }
-
-    /***
-     * 获取用户可结算金额
-     * @author liweifan
-     * @param: userId
-     * @param: withdrawalServiceFee
-     * @updateTime 2022/4/7 15:02
-     * @return: java.math.BigDecimal
-     */
-    private BigDecimal getAmountUsable(Long userId) {
-        //查询用户账户余额
-        UserAccountVo detail = userAccountService.detail(userId);
-        BigDecimal subtract = detail.getAmountUsable();
-        if (subtract.intValue() < 0) {
-            subtract = new BigDecimal(0);
-        }
-        return subtract;
-    }
 }

+ 34 - 2
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/CourseScheduleStudentVo.java

@@ -1,11 +1,10 @@
 package com.yonge.cooleshow.biz.dal.vo;
 
-import com.fasterxml.jackson.annotation.JsonFormat;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
-import org.springframework.format.annotation.DateTimeFormat;
 
 import java.io.Serializable;
+import java.math.BigDecimal;
 import java.util.Date;
 
 /**
@@ -35,6 +34,39 @@ public class CourseScheduleStudentVo implements Serializable {
     @ApiModelProperty(value = "课程类型")
     private String type;
 
+    @ApiModelProperty(value = "订单号")
+    private String orderNo;
+
+    @ApiModelProperty(value = "课程名称")
+    private String groupName;
+
+    @ApiModelProperty(value = "实际薪水")
+    private BigDecimal actualSalary;
+
+    public String getOrderNo() {
+        return orderNo;
+    }
+
+    public void setOrderNo(String orderNo) {
+        this.orderNo = orderNo;
+    }
+
+    public String getGroupName() {
+        return groupName;
+    }
+
+    public void setGroupName(String groupName) {
+        this.groupName = groupName;
+    }
+
+    public BigDecimal getActualSalary() {
+        return actualSalary;
+    }
+
+    public void setActualSalary(BigDecimal actualSalary) {
+        this.actualSalary = actualSalary;
+    }
+
     public Long getCourseGroupId() {
         return courseGroupId;
     }

+ 11 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/MusicSheetDetailVo.java

@@ -40,6 +40,17 @@ public class MusicSheetDetailVo extends MusicSheet {
     @ApiModelProperty("声部code")
     private String code;
 
+    @ApiModelProperty("审核理由")
+    private String reason;
+
+    public String getReason() {
+        return reason;
+    }
+
+    public void setReason(String reason) {
+        this.reason = reason;
+    }
+
     public String getCode() {
         return code;
     }

+ 58 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/TeacherAuditMusicSheetVo.java

@@ -0,0 +1,58 @@
+package com.yonge.cooleshow.biz.dal.vo;
+
+import com.yonge.toolset.base.page.PageInfo;
+import io.swagger.annotations.ApiModelProperty;
+
+/**
+ * Description
+ *
+ * @author liujunchi
+ * @date 2022-06-21
+ */
+public class TeacherAuditMusicSheetVo {
+
+    @ApiModelProperty("审核通过数量")
+    private Integer pass = 0;
+
+    @ApiModelProperty("审核拒绝数量")
+    private Integer unPass= 0;
+
+    @ApiModelProperty("审核中数量")
+    private Integer doing= 0;
+
+
+    @ApiModelProperty("分页数据")
+    private PageInfo<MusicSheetVo> list;
+
+    public Integer getPass() {
+        return pass;
+    }
+
+    public void setPass(Integer pass) {
+        this.pass = pass;
+    }
+
+    public Integer getUnPass() {
+        return unPass;
+    }
+
+    public void setUnPass(Integer unPass) {
+        this.unPass = unPass;
+    }
+
+    public Integer getDoing() {
+        return doing;
+    }
+
+    public void setDoing(Integer doing) {
+        this.doing = doing;
+    }
+
+    public PageInfo<MusicSheetVo> getList() {
+        return list;
+    }
+
+    public void setList(PageInfo<MusicSheetVo> list) {
+        this.list = list;
+    }
+}

+ 21 - 1
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/UserWithdrawalVo.java

@@ -11,7 +11,8 @@ import io.swagger.annotations.ApiModelProperty;
 @ApiModel(value = "UserWithdrawalVo对象", description = "账户结算表查询视图对象")
 public class UserWithdrawalVo extends UserWithdrawal {
 	private static final long serialVersionUID = 1L;
-
+	@ApiModelProperty("银行卡用户 ")
+	private String realName;
 	@ApiModelProperty("银行卡号 ")
 	private String bankCard;
 	@ApiModelProperty("银行名称 ")
@@ -21,6 +22,9 @@ public class UserWithdrawalVo extends UserWithdrawal {
 	@ApiModelProperty("结算手机号 ")
 	private String phone;
 
+	@ApiModelProperty("审核人 ")
+	private String verifyUser;
+
 	public String getBankName() {
 		return bankName;
 	}
@@ -52,4 +56,20 @@ public class UserWithdrawalVo extends UserWithdrawal {
 	public void setPhone(String phone) {
 		this.phone = phone;
 	}
+
+	public String getVerifyUser() {
+		return verifyUser;
+	}
+
+	public void setVerifyUser(String verifyUser) {
+		this.verifyUser = verifyUser;
+	}
+
+	public String getRealName() {
+		return realName;
+	}
+
+	public void setRealName(String realName) {
+		this.realName = realName;
+	}
 }

+ 3 - 3
cooleshow-user/user-biz/src/main/resources/config/mybatis/CourseHomeworkMapper.xml

@@ -54,12 +54,12 @@
         sch.submit_time_ as submitTime,
         su.id_ as teacherId,
         ch.create_time_ as decorateTime
-        from  course_homework ch
+        from course_homework ch
         left join course_schedule cs on ch.course_schedule_id_ = cs.id_
-        left join course_schedule_student_payment cssp on cssp.course_id_ = cs.id_
+        left join course_schedule_student_payment cssp on cssp.course_id_ = ch.course_schedule_id_
+        left join student_course_homework sch on sch.course_schedule_id_ = cssp.course_id_ and sch.student_id_ = cssp.user_id_
         left join sys_user su on cs.teacher_id_ = su.id_
         left join sys_user su2 on cssp.user_id_ = su2.id_
-        left join student_course_homework sch on ch.id_ = sch.id_
         <where>
             <if test="param.courseStatus != null">
                 and cs.status_ = #{param.courseStatus}

+ 6 - 1
cooleshow-user/user-biz/src/main/resources/config/mybatis/CourseScheduleStudentPaymentMapper.xml

@@ -155,9 +155,14 @@
             p.user_id_ AS studentId,
             c.end_time_ AS endTime,
             c.single_course_time_ AS singleCourseTime,
-            c.type_ AS type
+            c.type_ AS type,
+            p.order_no_ AS orderNo,
+            s.actual_salary_ AS actualSalary,
+            g.name_ AS groupName
         FROM course_schedule c
         LEFT JOIN course_schedule_student_payment p ON c.id_ = p.course_id_
+        LEFT JOIN course_schedule_teacher_salary s ON c.id_ = s.course_schedule_id_
+        LEFT JOIN course_group g ON c.course_group_id_ = g.id_
         WHERE c.lock_ = 0
         AND c.status_ IN ('ING','NOT_START')
         AND NOW() &gt;= c.end_time_

+ 12 - 0
cooleshow-user/user-biz/src/main/resources/config/mybatis/MusicSheetMapper.xml

@@ -514,4 +514,16 @@
         limit 5
 
     </select>
+
+    <select id="selectTeacherCount" resultType="com.yonge.cooleshow.biz.dal.vo.TeacherAuditMusicSheetVo">
+        select
+            sum(if(t.audit_status_ = 'DOING',1,0)) as doing,
+            sum(if(t.audit_status_ = 'PASS'
+                       and t.state_ = 1,1,0)) as pass,
+            sum(if(t.audit_status_ = 'UNPASS',1,0)) as upPass
+        from
+            music_sheet t
+        where t.user_id_ = #{userId}
+
+    </select>
 </mapper>

+ 5 - 3
cooleshow-user/user-biz/src/main/resources/config/mybatis/SysUserContractRecordMapper.xml

@@ -47,6 +47,9 @@
             <if test="param.userId != null">
                 and t.user_id_ = #{param.userId}
             </if>
+            <if test="param.status != null and param.status != ''">
+                and t.status_ = #{param.status}
+            </if>
         </where>
         order by t.created_time_ desc
     </select>
@@ -54,11 +57,11 @@
     <insert id="insertBatch" keyColumn="id_" keyProperty="id" useGeneratedKeys="true"
             parameterType="com.yonge.cooleshow.biz.dal.entity.SysUserContractRecord">
         insert into sys_user_contract_record(user_id_, user_type_, contract_id_, url_, contract_no_,
-        status_, err_msg_, remark_, created_time_)
+        status_, err_msg_, remark_)
         values
         <foreach collection="entities" item="entity" separator=",">
             (#{entity.userId}, #{entity.userType}, #{entity.contractId}, #{entity.url},#{entity.contractNo},
-            #{entity.status}, #{entity.errMsg}, #{entity.remark}, #{entity.createdTime})
+            #{entity.status}, #{entity.errMsg}, #{entity.remark})
         </foreach>
     </insert>
     <update id="contractCallbackUpdate" parameterType="java.util.Map">
@@ -100,5 +103,4 @@
         left join sys_user_contract_record t on b.id_ = t.contract_id_ and t.status_ in ('SUCCESS','DONG ')
         where t.user_id_ = #{userId} and t.user_type_ = #{userType}
     </select>
-
 </mapper>

+ 1 - 1
cooleshow-user/user-biz/src/main/resources/config/mybatis/UserBankCardMapper.xml

@@ -18,7 +18,7 @@
     <sql id="baseColumns">
          t.id_ as id
         , t.user_id_ as userId
-        , t.name_ as name
+        , t.name_ as `name`
         , t.bank_name_ as bankName
         , t.bank_card_ as bankCard
         , t.phone_ as phone

+ 18 - 17
cooleshow-user/user-biz/src/main/resources/config/mybatis/UserBindingTeacherMapper.xml

@@ -9,26 +9,27 @@
         su.avatar_ AS avatar,
         su.phone_ AS phone,
         (SELECT group_concat(name_) FROM `subject` WHERE find_in_set(id_,s.subject_id_)) AS subjectName,
-        IFNULL(TIMESTAMPDIFF(DAY,b.last_end_class_,NOW()),TIMESTAMPDIFF(DAY,b.created_time_,NOW())) AS lastEndClass
+--         IFNULL(TIMESTAMPDIFF(DAY,b.last_end_class_,NOW()),TIMESTAMPDIFF(DAY,b.created_time_,NOW())) AS lastEndClass
+        TIMESTAMPDIFF(DAY,b.last_end_class_,NOW()) AS lastEndClass
         FROM user_binding_teacher b
         LEFT JOIN sys_user su ON b.student_id_=su.id_
         LEFT JOIN student s ON b.student_id_=s.user_id_
         <where>
-            <if test="param.subjectId != null">
-                find_in_set(#{param.subjectId},s.subject_id_)
-            </if>
-            <if test="param.teacherId !=null">
-                AND b.teacher_id_ = #{param.teacherId}
-            </if>
-            <if test="param.userName !=null and param.userName !=''">
-                AND su.username_ LIKE CONCAT('%', #{param.userName}, '%')
-            </if>
-            <if test="param.studentList !=null and param.studentList.size>0">
-                AND su.id_ IN
-                <foreach collection="param.studentList" item="item" open="(" separator="," close=")">
-                    #{item.userId}
-                </foreach>
-            </if>
+        <if test="param.subjectId != null">
+           AND find_in_set(#{param.subjectId},s.subject_id_)
+        </if>
+        <if test="param.teacherId !=null">
+            AND b.teacher_id_ = #{param.teacherId}
+        </if>
+        <if test="param.userName !=null and param.userName !=''">
+            AND su.username_ LIKE CONCAT('%', #{param.userName}, '%')
+        </if>
+        <if test="param.studentList !=null and param.studentList.size>0">
+            AND su.id_ IN
+            <foreach collection="param.studentList" item="item" open="(" separator="," close=")">
+                #{item.userId}
+            </foreach>
+        </if>
         </where>
     </select>
 
@@ -93,6 +94,6 @@
               AND a.type_ = 'PIANO_ROOM_CLASS'
             GROUP BY a.teacher_id_,b.user_id_
         ) v on t.teacher_id_ = v.teacher_id_ and t.student_id_ = v.user_id_
-        where v.user_id_ is null
+        where v.user_id_ is null and t.created_time_ >= DATE_SUB(NOW(),INTERVAL #{days} DAY)
     </select>
 </mapper>

+ 62 - 8
cooleshow-user/user-biz/src/main/resources/config/mybatis/UserWithdrawalMapper.xml

@@ -6,12 +6,18 @@
         <result column="id_" property="id" />
         <result column="user_id_" property="userId" />
         <result column="amount_" property="amount" />
+        <result column="actual_amount_" property="actualAmount" />
         <result column="plantform_fee_" property="plantformFee" />
+        <result column="auth_status_" property="authStatus" />
+        <result column="auth_user_id_" property="authUserId" />
+        <result column="auth_time_" property="authTime" />
+        <result column="reason_" property="reason" />
         <result column="bank_card_id_" property="bankCardId" />
         <result column="open_type_" property="openType" />
         <result column="trans_no_" property="transNo" />
-        <result column="status_" property="status" />
-        <result column="actual_amount_" property="actualAmount" />
+        <result column="trade_status_" property="tradeStatus" />
+        <result column="trade_no_" property="tradeNo" />
+        <result column="callbak_amount_" property="callbakAmount" />
         <result column="transfer_time_" property="transferTime" />
         <result column="error_code_" property="errorCode" />
         <result column="error_msg_" property="errorMsg" />
@@ -24,22 +30,30 @@
         t.id_ as id
         , t.user_id_ as userId
         , t.amount_ as amount
+        , t.actual_amount_ as actualAmount
         , t.plantform_fee_ as plantformFee
+        , t.auth_status_ as authStatus
+        , t.auth_user_id_ as authUserId
+        , t.auth_time_ as authTime
+        , t.reason_ as reason
         , t.bank_card_id_ as bankCardId
         , t.open_type_ as openType
         , t.trans_no_ as transNo
-        , t.status_ as status
-        , t.actual_amount_ as actualAmount
+        , t.trade_status_ as tradeStatus
+        , t.trade_no_ as tradeNo
+        , t.callbak_amount_ as callbakAmount
         , t.transfer_time_ as transferTime
         , t.error_code_ as errorCode
         , t.error_msg_ as errorMsg
         , t.create_time_ as createTime
         , t.update_time_ as updateTime
+        , t.status_ as status
     </sql>
 
     <select id="detail" resultType="com.yonge.cooleshow.biz.dal.vo.UserWithdrawalVo">
         SELECT
             <include refid="baseColumns"/>,
+            bc.name_ as realName,
             bc.bank_name_ as bankName,
             bc.bank_card_ as bankCard,
             bc.phone_ as phone,
@@ -50,15 +64,32 @@
         where t.id_ = #{id}
     </select>
 
+    <select id="detailByTransNo" resultType="com.yonge.cooleshow.biz.dal.vo.UserWithdrawalVo">
+        SELECT
+            <include refid="baseColumns"/>,
+            bc.name_ as realName,
+            bc.bank_name_ as bankName,
+            bc.bank_card_ as bankCard,
+            bc.phone_ as phone,
+            u.username_  as withdrawaUser
+        FROM user_withdrawal t
+        LEFT JOIN user_bank_card bc on t.bank_card_id_ = bc.id_ and t.user_id_ = bc.user_id_
+        left join sys_user u on t.user_id_ = u.id_
+        where t.trans_no_ = #{transNo}
+    </select>
+
     <sql id="selectSql">
         SELECT
             <include refid="baseColumns" />,
+            bc.name_ as realName,
             bc.bank_name_ as bankName,
             bc.bank_card_ as bankCard,
-            u.username_  as withdrawaUser
+            ifnull(u.real_name_,u.username_)  as withdrawaUser,
+            ifnull(au.real_name_,au.username_) as verifyUser
         FROM user_withdrawal t
         LEFT JOIN user_bank_card bc on t.bank_card_id_ = bc.id_ and t.user_id_ = bc.user_id_
         left join sys_user u on t.user_id_ = u.id_
+            left join sys_user au on t.auth_user_id_ = au.id_
         <where>
             <if test="null != param.search and '' != param.search">
                 AND (
@@ -67,6 +98,24 @@
                     u.phone_ LIKE CONCAT('%', #{param.search}, '%')
                 )
             </if>
+            <if test="null != param.username and '' != param.username">
+                AND (
+                    u.username_ LIKE CONCAT('%', #{param.username}, '%') or
+                    u.real_name_ LIKE CONCAT('%', #{param.username}, '%')
+                )
+            </if>
+            <if test="null != param.authStatus">
+                AND t.auth_status_ = #{param.authStatus}
+            </if>
+            <if test="null != param.tradeStatus">
+                AND t.trade_status_ = #{param.tradeStatus}
+            </if>
+            <if test="null != param.verifyUser and '' != param.verifyUser">
+                AND (
+                    au.username_ LIKE CONCAT('%', #{param.verifyUser}, '%') or
+                    au.real_name_ LIKE CONCAT('%', #{param.verifyUser}, '%')
+                )
+            </if>
             <if test="null != param.transNo and '' != param.transNo">
                 AND t.trans_no_ LIKE CONCAT('%', #{transNo}, '%')
             </if>
@@ -76,16 +125,21 @@
             <if test="param.endTime !=null">
                 <![CDATA[AND t.create_time_ < #{param.endTime} ]]>
             </if>
-            <if test="param.status !=null">
-                AND t.status_ = #{param.status}
-            </if>
         </where>
     </sql>
 
     <select id="selectPage" resultType="com.yonge.cooleshow.biz.dal.vo.UserWithdrawalVo">
         <include refid="selectSql"/>
     </select>
+
     <select id="selectList" resultType="com.yonge.cooleshow.biz.dal.vo.UserWithdrawalVo">
         <include refid="selectSql"/>
     </select>
+
+    <select id="getNowDayWithdrawalCount" resultType="java.lang.Integer">
+        select count(1) from user_withdrawal
+        where user_id_ = #{userId}
+          and auth_status_ in ('DOING','PASS') and trade_status_ != 'failed'
+        and to_days(create_time_) = to_days(now())
+    </select>
 </mapper>

+ 23 - 1
cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/UserWithdrawalController.java

@@ -5,7 +5,10 @@ import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
 import com.yonge.cooleshow.auth.api.entity.SysUser;
 import com.yonge.cooleshow.biz.dal.dto.req.WithdrawalReq;
 import com.yonge.cooleshow.biz.dal.dto.search.TeacherWithdrawalSearch;
+import com.yonge.cooleshow.biz.dal.entity.UserOrder;
 import com.yonge.cooleshow.biz.dal.service.UserWithdrawalService;
+import com.yonge.cooleshow.biz.dal.support.DistributedLock;
+import com.yonge.cooleshow.common.enums.CacheNameEnum;
 import com.yonge.toolset.mybatis.support.PageUtil;
 import com.yonge.cooleshow.biz.dal.vo.UserWithdrawalVo;
 import com.yonge.cooleshow.biz.dal.vo.res.WithdrawalInfoRes;
@@ -19,6 +22,7 @@ import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiImplicitParam;
 import io.swagger.annotations.ApiImplicitParams;
 import io.swagger.annotations.ApiOperation;
+import org.redisson.api.RedissonClient;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.HttpStatus;
 import org.springframework.web.bind.annotation.*;
@@ -30,6 +34,7 @@ import java.time.LocalDateTime;
 import java.time.LocalTime;
 import java.time.temporal.TemporalAdjusters;
 import java.util.Date;
+import java.util.concurrent.TimeUnit;
 
 @RestController
 @RequestMapping("/userWithdrawal")
@@ -42,6 +47,9 @@ public class UserWithdrawalController extends BaseController {
     @Autowired
     private SysUserFeignService sysUserFeignService;
 
+    @Autowired
+    private RedissonClient redissonClient;
+
     @PostMapping("/getWithdrawalInfo")
     @ApiOperation(value = "查询结算页面信息")
     public HttpResponseResult<WithdrawalInfoRes> getWithdrawalInfo() {
@@ -59,7 +67,21 @@ public class UserWithdrawalController extends BaseController {
         if (user == null || null == user.getId()) {
             return failed(HttpStatus.FORBIDDEN, "请登录");
         }
-        return userWithdrawalService.withdrawal(user, withdrawalReq);
+        try {
+            HttpResponseResult<Boolean> res = DistributedLock.of(redissonClient)
+                    .runIfLockCanGet(CacheNameEnum.LOCK_WITHDRAWAL.getRedisKey(user.getId())
+                            , () -> userWithdrawalService.withdrawal(user, withdrawalReq), 60L, TimeUnit.SECONDS);
+            if(null != res){
+                return res;
+            }else{
+                return HttpResponseResult.failed("结算失败");
+            }
+        } catch (BizException e) {
+            return HttpResponseResult.failed(e.getMessage());
+        }  catch (Exception e) {
+            e.printStackTrace();
+            return HttpResponseResult.failed("结算失败");
+        }
     }
 
 

+ 1 - 0
cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/task/TaskController.java

@@ -65,6 +65,7 @@ public class TaskController extends BaseController {
     @GetMapping("/courseStatus")
     public HttpResponseResult<Object> courseStatus() {
         scheduleService.scheduleTask();
+        teacherTotalService.queryTeacherTotal();
         return HttpResponseResult.succeed();
     }
 

+ 9 - 2
cooleshow-user/user-website/src/main/java/com/yonge/cooleshow/website/controller/MusicSheetController.java

@@ -11,6 +11,7 @@ import com.yonge.cooleshow.biz.dal.enums.ChargeTypeEnum;
 import com.yonge.cooleshow.biz.dal.enums.SourceTypeEnum;
 import com.yonge.cooleshow.biz.dal.enums.YesOrNoEnum;
 import com.yonge.cooleshow.biz.dal.service.MusicSheetService;
+import com.yonge.cooleshow.biz.dal.vo.TeacherAuditMusicSheetVo;
 import com.yonge.toolset.mybatis.support.PageUtil;
 import com.yonge.cooleshow.biz.dal.vo.MusicSheetVo;
 import com.yonge.cooleshow.common.controller.BaseController;
@@ -96,7 +97,7 @@ public class MusicSheetController extends BaseController {
 
     @ApiOperation(value = "老师-个人中心-曲目分页查询", httpMethod="POST", consumes="application/json", produces="application/json")
     @PostMapping(value="/teacher/list", consumes="application/json", produces="application/json")
-    public HttpResponseResult<PageInfo<MusicSheetVo>> list(@RequestBody MusicSheetSearch query) {
+    public HttpResponseResult<TeacherAuditMusicSheetVo> list(@RequestBody MusicSheetSearch query) {
         SysUser sysUser = sysUserFeignService.queryUserInfo();
         if (sysUser == null  || sysUser.getId() == null) {
             return failed("用户信息获取失败");
@@ -108,7 +109,13 @@ public class MusicSheetController extends BaseController {
         }
 
         IPage<MusicSheetVo> musicSheetVoIPage = musicSheetService.selectPage(PageUtil.getPage(query), query);
-        return succeed(PageUtil.pageInfo(musicSheetVoIPage));
+
+        TeacherAuditMusicSheetVo teacherAuditMusicSheetVo = musicSheetService.selectTeacherCount(sysUser.getId());
+        if (teacherAuditMusicSheetVo == null) {
+            teacherAuditMusicSheetVo = new TeacherAuditMusicSheetVo();
+        }
+        teacherAuditMusicSheetVo.setList(PageUtil.pageInfo(musicSheetVoIPage));
+        return succeed(teacherAuditMusicSheetVo);
     }
 
     @ApiOperation(value = "老师新增曲目", httpMethod="POST", consumes="application/json", produces="application/json")