Explorar o código

Merge remote-tracking branch 'origin/master_saas' into master_saas

zouxuan %!s(int64=2) %!d(string=hai) anos
pai
achega
351455f409
Modificáronse 35 ficheiros con 819 adicións e 101 borrados
  1. 2 2
      mec-auth/mec-auth-server/src/main/resources/config/mybatis/SysUserMapper.xml
  2. 11 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/SysCoupon.java
  3. 3 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/enums/CouponDetailTypeEnum.java
  4. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/enums/ExportTypeEnum.java
  5. 24 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/page/SysCouponCodeQueryInfo.java
  6. 3 0
      mec-biz/src/main/java/com/ym/mec/biz/service/StudentPaymentOrderService.java
  7. 1 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/OrderPayOpsServiceImpl.java
  8. 81 7
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentPaymentOrderServiceImpl.java
  9. 4 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/SysCouponServiceImpl.java
  10. 6 0
      mec-biz/src/main/resources/config/mybatis/SysCouponCodeMapper.xml
  11. 6 2
      mec-biz/src/main/resources/config/mybatis/SysCouponMapper.xml
  12. 4 0
      mec-client-api/src/main/java/com/ym/mec/web/WebFeignService.java
  13. 5 0
      mec-client-api/src/main/java/com/ym/mec/web/fallback/WebFeignServiceFallback.java
  14. 11 0
      mec-common/common-core/src/main/java/com/ym/mec/common/entity/MallCreateOrderModel.java
  15. 6 5
      mec-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/controller/OmsOrderController.java
  16. 0 2
      mec-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/controller/open/OpenController.java
  17. 2 0
      mec-mall/mall-mbg/src/main/java/com/yonge/cooleshow/mbg/mapper/UserOrderPaymentMapper.java
  18. 1 0
      mec-mall/mall-mbg/src/main/resources/config/mybatis/PmsSkuStockMapper.xml
  19. 6 0
      mec-mall/mall-mbg/src/main/resources/config/mybatis/UserOrderPaymentMapper.xml
  20. 10 4
      mec-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/controller/OmsPortalOrderController.java
  21. 12 12
      mec-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/controller/open/OpenShareController.java
  22. 17 0
      mec-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/dao/PortalProductDao.java
  23. 12 0
      mec-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/domain/OrderParam.java
  24. 46 0
      mec-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/dto/StockOperateModel.java
  25. 1 2
      mec-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/OmsPortalOrderService.java
  26. 9 0
      mec-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/PmsPortalProductService.java
  27. 9 0
      mec-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/UserOrderPaymentService.java
  28. 45 17
      mec-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/impl/OmsPortalOrderServiceImpl.java
  29. 66 0
      mec-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/impl/PmsPortalProductServiceImpl.java
  30. 5 0
      mec-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/impl/UserOrderPaymentServiceImpl.java
  31. 56 0
      mec-mall/mall-portal/src/main/resources/config/mybatis/PortalProductDao.xml
  32. 1 6
      mec-student/src/main/resources/logback-spring.xml
  33. 16 0
      mec-web/src/main/java/com/ym/mec/web/controller/APIController.java
  34. 283 27
      mec-web/src/main/java/com/ym/mec/web/controller/ExportController.java
  35. 54 13
      mec-web/src/main/java/com/ym/mec/web/controller/StudentManageController.java

+ 2 - 2
mec-auth/mec-auth-server/src/main/resources/config/mybatis/SysUserMapper.xml

@@ -245,10 +245,10 @@
         <where>
             su.del_flag_ = 0
             <if test="createStartDate != null and createStartDate != ''">
-                and #{createStartDate} &lt;= e.create_time_
+                and #{createStartDate} &lt;= e.update_time_
             </if>
             <if test="createEndDate != null and createEndDate != ''">
-                and #{createEndDate} &gt; e.create_time_
+                and #{createEndDate} &gt; e.update_time_
             </if>
         </where>
     </select>

+ 11 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/SysCoupon.java

@@ -91,6 +91,17 @@ public class SysCoupon extends BaseEntity implements Serializable{
 	@ApiModelProperty("领取优惠券条件JSON: {organId:分部id(逗号隔开)}")
 	private String useCondition;
 
+	@ApiModelProperty("使用系统 MALL:商城  MEC:管乐迷")
+	private String useSystem;
+
+	public String getUseSystem() {
+		return useSystem;
+	}
+
+	public void setUseSystem(String useSystem) {
+		this.useSystem = useSystem;
+	}
+
 	public String getUseCondition() {
 		return useCondition;
 	}

+ 3 - 1
mec-biz/src/main/java/com/ym/mec/biz/dal/enums/CouponDetailTypeEnum.java

@@ -37,7 +37,9 @@ public enum CouponDetailTypeEnum {
     //会员开通,团练宝   CLOUD_TEACHER  CLOUD_TEACHER_PLUS
     MEMBER("MEMBER", "云教练"),
     //全类都可以使用
-    FULLCOUPON("FULLCOUPON", "全类券");
+    FULLCOUPON("FULLCOUPON", "全类券"),
+    // 商城券
+    MALLCOUPON("MALLCOUPON", "商城券");
 
     private String code;
 

+ 1 - 1
mec-biz/src/main/java/com/ym/mec/biz/dal/enums/ExportTypeEnum.java

@@ -7,7 +7,7 @@ public enum ExportTypeEnum implements BaseEnum<Integer, ExportTypeEnum> {
 	COURSE_SCHEDULE(1, "课表列表"),
 	ROUTE_ORDER(2, "财务管理"),
 	STUDENT_VIP_PRACTICE(3, "VIP网管课耗导出"),
-	STUDENT_MUSIC_THEORY_COURSE_INFO(4, "网管课学员课程信息导出"),
+	STUDENT_MUSIC_THEORY_COURSE_INFO(4, "乐理课学员课程导出"),
 	STUDENT_VIP_COURSE_INFO(5, "VIP课学员课程信息导出"),
 	VIP_STUDENT_COURSE_MANAGE(6, "vip学员课程管理"),
 	STUDENT_SMALL_CLASS_STATISTICS(7, "学员小课数据统计"),

+ 24 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/page/SysCouponCodeQueryInfo.java

@@ -1,6 +1,7 @@
 package com.ym.mec.biz.dal.page;
 
 import com.ym.mec.common.page.QueryInfo;
+import io.swagger.annotations.ApiModelProperty;
 
 /**
  * @Author Joburgess
@@ -23,6 +24,29 @@ public class SysCouponCodeQueryInfo extends QueryInfo {
      */
     private Integer issueType;
 
+    // 使用系统 MALL:商城  MEC:管乐迷
+    private String useSystem;
+
+    // 优惠券类型 详情-CouponDetailTypeEnum-枚举类 多个逗号隔开
+    @ApiModelProperty("优惠券类型:OTHER:其他,MUSICAL:乐器 MAINTENANCE 乐保 ACCESSORIES 辅件 TEACHING 教材 PRACTICE 网管课 SINGLE 声部课 MIX 合奏课 VIP:VIP MEMBER:会员开通 FULLCOUPON:全类 MALLCOUPON:商城券")
+    private String typeDetail;
+
+    public String getTypeDetail() {
+        return typeDetail;
+    }
+
+    public void setTypeDetail(String typeDetail) {
+        this.typeDetail = typeDetail;
+    }
+
+    public String getUseSystem() {
+        return useSystem;
+    }
+
+    public void setUseSystem(String useSystem) {
+        this.useSystem = useSystem;
+    }
+
     public Integer getOrganId() {
         return organId;
     }

+ 3 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/StudentPaymentOrderService.java

@@ -255,4 +255,7 @@ public interface StudentPaymentOrderService extends BaseService<Long, StudentPay
 
     // 查询优惠券优惠券金额
     Map couponAmount(MallCreateOrderModel model);
+
+    // 订单收货状态更新
+    void receive(String orderNo, boolean autoReceive);
 }

+ 1 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/OrderPayOpsServiceImpl.java

@@ -273,6 +273,7 @@ public class OrderPayOpsServiceImpl implements OrderPayOpsService {
             throw new BizException("微信支付请先授权");
         }
         String wxMpOAuth2AccessTokenUrl = String.format(ConfigInit.wxMpOAuth2AccessTokenUrl, hfMerchantConfig.getWxAppId(), hfMerchantConfig.getWxAppSecret(), code);
+        log.info("请求微信授权接口的参数:{}", wxMpOAuth2AccessTokenUrl);
         Map<String, String> weChatRes = JSON.parseObject(HttpUtil.get(wxMpOAuth2AccessTokenUrl, new HashMap<>()), Map.class);
         if (!weChatRes.containsKey("openid")) {
         	log.error("获取微信openId失败:[{}]",JsonUtil.toJSONString(weChatRes));

+ 81 - 7
mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentPaymentOrderServiceImpl.java

@@ -49,6 +49,7 @@ import java.util.concurrent.atomic.AtomicInteger;
 import java.util.stream.Collectors;
 
 import static com.ym.mec.biz.dal.enums.DealStatusEnum.CLOSE;
+import static com.ym.mec.biz.dal.enums.DealStatusEnum.SUCCESS;
 
 @Service
 public class StudentPaymentOrderServiceImpl extends BaseServiceImpl<Long, StudentPaymentOrder> implements StudentPaymentOrderService {
@@ -335,7 +336,7 @@ public class StudentPaymentOrderServiceImpl extends BaseServiceImpl<Long, Studen
         OrderCancelModel  model = new OrderCancelModel();
 
         Map<String, Object> payment = Payment.queryPayment(payingOrder.getTransNo(), hfMerchantConfig.getMerKey());
-        LOGGER.info("订单[{}]交易主动查询接口返回:{}", payingOrder.getTransNo(), payment);
+        LOGGER.warn("订单[{}]交易主动查询接口返回:{}", payingOrder.getTransNo(), payment);
 
         Map<String, String> rpMap = new HashMap<>();
         rpMap.put("merOrderNo", payingOrder.getOrderNo());
@@ -1043,6 +1044,7 @@ public class StudentPaymentOrderServiceImpl extends BaseServiceImpl<Long, Studen
     private StudentGoodsSellDao studentGoodsSellDao;
 
     @Override
+    @Transactional
     public Map createOrder(MallCreateOrderModel model) throws Exception {
 
         if(model == null ||model.getUserId() == null) {
@@ -1101,7 +1103,7 @@ public class StudentPaymentOrderServiceImpl extends BaseServiceImpl<Long, Studen
 
 
         Date date = new Date();
-        StudentPaymentOrder studentPaymentOrder = sysCouponCodeService.use(model.getCouponIdList(), model.getAmount(),false);
+        StudentPaymentOrder studentPaymentOrder = sysCouponCodeService.use(model.getCouponIdList(), model.getAmount(),true);
 
         studentPaymentOrder.setStatus(DealStatusEnum.ING);
         if (studentPaymentOrder.getActualAmount().compareTo(BigDecimal.ZERO) == 0) {
@@ -1113,11 +1115,46 @@ public class StudentPaymentOrderServiceImpl extends BaseServiceImpl<Long, Studen
         studentPaymentOrder.setOrderNo(model.getOrderNo());
         studentPaymentOrder.setCreateTime(date);
         studentPaymentOrder.setUpdateTime(date);
-        studentPaymentOrder.setPaymentChannel("ADAPAY");
+        if (model.isUseBalance()) {
+            studentPaymentOrder.setPaymentChannel("BALANCE");
+        } else {
+            studentPaymentOrder.setPaymentChannel("ADAPAY");
+        }
+        studentPaymentOrder.setVersion(1);
         studentPaymentOrder.setOrganId(student.getOrganId());
         studentPaymentOrder.setRoutingOrganId(student.getOrganId());
         studentPaymentOrder.setTenantId(student.getTenantId());
         studentPaymentOrderService.insert(studentPaymentOrder);
+        studentPaymentOrder.setVersion(0);
+
+        // 余额支付
+        BigDecimal amount = studentPaymentOrder.getActualAmount();
+        BigDecimal balance = BigDecimal.ZERO;
+        if (model.isUseBalance() && amount.compareTo(BigDecimal.ZERO) > 0) {
+            SysUserCashAccount userCashAccount = sysUserCashAccountService.getLocked(model.getUserId());
+            if (userCashAccount == null) {
+                throw new BizException("用户账户不存在");
+            }
+            if (userCashAccount.getBalance() != null && userCashAccount.getBalance().compareTo(BigDecimal.ZERO) > 0) {
+                balance = amount.compareTo(userCashAccount.getBalance()) >= 0 ? userCashAccount.getBalance() : amount;
+                amount = amount.subtract(balance);
+                studentPaymentOrder.setActualAmount(amount);
+                studentPaymentOrder.setBalancePaymentAmount(balance);
+                sysUserCashAccountService.updateBalance(model.getUserId(), balance.negate(), PlatformCashAccountDetailTypeEnum.PAY_FEE, "商品销售");
+            }
+        }
+        studentPaymentOrderService.update(studentPaymentOrder);
+        studentPaymentOrder.setVersion(studentPaymentOrder.getVersion() + 1);
+
+        if (amount.compareTo(BigDecimal.ZERO) == 0) {
+            studentPaymentRouteOrderService.addRouteOrder(model.getOrderNo(), student.getOrganId(), balance);
+            Map<String, String> notifyMap = new HashMap<>();
+            notifyMap.put("tradeState", "1");
+            notifyMap.put("merOrderNo", studentPaymentOrder.getOrderNo());
+            studentPaymentOrderService.updateOrder(notifyMap);
+            notifyMap.put("orderNo", model.getOrderNo());
+            return notifyMap;
+        }
 
         studentGoodsSell.setCouponMarketAmount(studentPaymentOrder.getCouponRemitFee());
         studentGoodsSell.setOrganId(student.getOrganId());
@@ -1136,8 +1173,8 @@ public class StudentPaymentOrderServiceImpl extends BaseServiceImpl<Long, Studen
 
         //  receiver类型
         payMap = payService.getPayMap(
-                studentPaymentOrder.getExpectAmount(),
                 studentPaymentOrder.getActualAmount(),
+                studentPaymentOrder.getBalancePaymentAmount(),
                 model.getOrderNo(),
                 baseApiUrl + "/api-mall-portal/payment/callback",
                 baseApiUrl + "/api-student/studentOrder/paymentResult?type=edu&orderNo=" + model.getOrderNo(),
@@ -1155,6 +1192,7 @@ public class StudentPaymentOrderServiceImpl extends BaseServiceImpl<Long, Studen
     }
 
     @Override
+    @Transactional
     public void mallBuyOrderCallback(StudentPaymentOrder studentPaymentOrder) {
         Date nowDate = new Date();
         //更新订单信息
@@ -1213,6 +1251,7 @@ public class StudentPaymentOrderServiceImpl extends BaseServiceImpl<Long, Studen
     }
 
     @Override
+    @Transactional
     public void mallSaveOrderInfo(MallCreateOrderModel model) {
 
         StudentGoodsSell studentGoodsSell = studentGoodsSellDao.findByOrderNo(model.getOrderNo());
@@ -1225,16 +1264,31 @@ public class StudentPaymentOrderServiceImpl extends BaseServiceImpl<Long, Studen
     }
 
     @Override
+    @Transactional
     public OrderCancelModel cancelOrder(StudentPaymentOrder order) {
         OrderCancelModel model = new OrderCancelModel();
         try {
+            HfMerchantConfig hfMerchantConfig = hfMerchantConfigService.queryByTenantId(order.getTenantId());
+            if(hfMerchantConfig == null){
+                throw new BizException("机构[{}]汇付商户信息找不到", order.getTenantId());
+            }
+            Map<String, Object> payment = Payment.queryPayment(order.getTransNo(), hfMerchantConfig.getMerKey());
+            LOGGER.info("订单[{}]交易主动查询接口返回:{}", order.getTransNo(), payment);
+
+            model.setPayChannel((String) payment.get("pay_channel"));
+            String status = (String) payment.get("status");
+            if (status.equals("succeeded")) {
+                model.setStatus(true);
+                order.setStatus(SUCCESS);
+            } else if (status.equals("failed") ) {
+                model.setStatus(false);
+                order.setStatus(CLOSE);
+                order.setMemo("超时未支付关闭");
+            }
             TenantContextHolder.setTenantId(order.getTenantId());
-            order.setStatus(CLOSE);
-            order.setMemo("超时未支付关闭");
             callOrderCallBack(order);
             TenantContextHolder.clearTenantId();
             model.setSuccess(true);
-            model.setStatus(false);
         } catch (Exception e) {
             model.setSuccess(false);
             e.printStackTrace();
@@ -1243,6 +1297,7 @@ public class StudentPaymentOrderServiceImpl extends BaseServiceImpl<Long, Studen
     }
 
     @Override
+    @Transactional
     public BaseResult<Map<String, Object>> refund(String orderNo, String notifyUrl, String refundNo) {
 
         StudentPaymentOrder orderByOrderNo = studentPaymentOrderService.findOrderByOrderNo(orderNo);
@@ -1269,4 +1324,23 @@ public class StudentPaymentOrderServiceImpl extends BaseServiceImpl<Long, Studen
         payMap.put("mallStatus",1);
         return payMap;
     }
+
+    @Override
+    @Transactional
+    public void receive(String orderNo, boolean autoReceive) {
+
+        StudentPaymentOrder orderByOrderNo = studentPaymentOrderService.findOrderByOrderNo(orderNo);
+        if (orderByOrderNo == null) {
+            return;
+        }
+        // MANUAL_RECEIVE 手动确认,AUTO_RECEIVE 自动确认
+        StudentPaymentOrder studentPaymentOrder = new StudentPaymentOrder();
+        studentPaymentOrder.setId(orderByOrderNo.getId());
+        if (autoReceive) {
+            studentPaymentOrder.setReceiveStatus("AUTO_RECEIVE");
+        } else {
+            studentPaymentOrder.setReceiveStatus("MANUAL_RECEIVE");
+        }
+        studentPaymentOrderDao.update(studentPaymentOrder);
+    }
 }

+ 4 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/SysCouponServiceImpl.java

@@ -13,6 +13,7 @@ import com.ym.mec.common.service.impl.BaseServiceImpl;
 import com.ym.mec.common.tenant.TenantContextHolder;
 import com.ym.mec.thirdparty.message.MessageSenderPluginContext;
 import com.ym.mec.util.collection.MapUtil;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Service;
@@ -141,6 +142,9 @@ public class SysCouponServiceImpl extends BaseServiceImpl<Integer, SysCoupon> im
         if (Objects.isNull(sysCoupon.getType())) {
             throw new BizException("请指定优惠券类型");
         }
+        if (StringUtils.isEmpty(sysCoupon.getUseSystem())) {
+            throw new BizException("请置顶使用系统");
+        }
 
         switch (sysCoupon.getType()) {
             case DISCOUNT:

+ 6 - 0
mec-biz/src/main/resources/config/mybatis/SysCouponCodeMapper.xml

@@ -185,6 +185,12 @@
 			<if test="issueType !=null">
                 AND scc.type_ = #{issueType}
             </if>
+			<if test="useSystem != null and useSystem != ''">
+				and sc.use_system_ = #{useSystem}
+			</if>
+			<if test="typeDetail != null and typeDetail != ''">
+				and  find_in_set(sc.type_detail_ , #{typeDetail})
+			</if>
 		</where>
 	</sql>
 

+ 6 - 2
mec-biz/src/main/resources/config/mybatis/SysCouponMapper.xml

@@ -10,6 +10,7 @@
 		<result column="id_" property="id" />
 		<result column="name_" property="name" />
 		<result column="description_" property="description" />
+		<result column="use_system_" property="useSystem" />
 		<result column="status_" property="status" />
         <result column="issuance_type_" jdbcType="INTEGER" property="issuanceType"/>
 		<result column="type_" property="type" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
@@ -47,13 +48,13 @@
 	<insert id="insert" parameterType="com.ym.mec.biz.dal.entity.SysCoupon" useGeneratedKeys="true" keyColumn="id" keyProperty="id">
 		INSERT INTO sys_coupon (id_,name_,description_,status_,issuance_type_,type_,type_detail_,face_value_,full_amount_,limit_exchange_num_,effective_type_,deadline_,
 		                        effective_start_time_, effective_expire_time_,end_date_,start_date_,stock_count_,consume_num_,warning_stock_num_,
-		                        create_time_,update_time_,tenant_id_,use_condition_)
+		                        create_time_,update_time_,tenant_id_,use_condition_,use_system_)
 		                        VALUES(#{id},#{name},#{description},#{status},#{issuanceType},
 		                               #{type, typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
 		                               #{typeDetail},#{faceValue},#{fullAmount},#{limitExchangeNum},
 		                               #{effectiveType, typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{deadline},
 		                               #{effectiveStartTime},#{effectiveExpireTime},#{endDate},#{startDate},#{stockCount},#{consumeNum},#{warningStockNum},
-		                               NOW(), NOW(),#{tenantId},#{useCondition})
+		                               NOW(), NOW(),#{tenantId},#{useCondition},#{useSystem})
 	</insert>
 
 	<!-- 根据主键查询一条记录 -->
@@ -109,6 +110,9 @@
 			<if test="issuanceType != null">
 				issuance_type_ = #{issuanceType},
 			</if>
+			<if test="useSystem != null">
+				use_system_ = #{useSystem},
+			</if>
 				update_time_ = NOW()
 		</set>
 		WHERE id_ = #{id} and tenant_id_ = #{tenantId}

+ 4 - 0
mec-client-api/src/main/java/com/ym/mec/web/WebFeignService.java

@@ -70,4 +70,8 @@ public interface WebFeignService {
 	// 商城订单优惠券金额
 	@PostMapping("/api/couponAmount")
 	HttpResponseResult<Map> couponAmount(@RequestBody MallCreateOrderModel model);
+
+	// 商城获取 退款数据  只能全额退款
+	@PostMapping("/api/receive")
+	HttpResponseResult receive(@RequestParam("orderNo") String orderNo,@RequestParam("autoReceive") boolean autoReceive);
 }

+ 5 - 0
mec-client-api/src/main/java/com/ym/mec/web/fallback/WebFeignServiceFallback.java

@@ -97,4 +97,9 @@ public class WebFeignServiceFallback implements WebFeignService {
 	public HttpResponseResult<Map> couponAmount(MallCreateOrderModel model) {
 		return null;
 	}
+
+	@Override
+	public HttpResponseResult receive(String orderNo, boolean autoReceive) {
+		return null;
+	}
 }

+ 11 - 0
mec-common/common-core/src/main/java/com/ym/mec/common/entity/MallCreateOrderModel.java

@@ -27,6 +27,17 @@ public class MallCreateOrderModel {
 
     private String orderInfo;
 
+    // 使用余额
+    private boolean useBalance;
+
+    public boolean isUseBalance() {
+        return useBalance;
+    }
+
+    public void setUseBalance(boolean useBalance) {
+        this.useBalance = useBalance;
+    }
+
     public String getOrderInfo() {
         return orderInfo;
     }

+ 6 - 5
mec-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/controller/OmsOrderController.java

@@ -52,11 +52,12 @@ public class OmsOrderController {
     @RequestMapping(value = "/update/close", method = RequestMethod.POST)
     @ResponseBody
     public CommonResult close(@RequestParam("ids") List<Long> ids, @RequestParam String note) {
-        int count = orderService.close(ids, note);
-        if (count > 0) {
-            return CommonResult.success(count);
-        }
-        return CommonResult.failed();
+
+        // int count = orderService.close(ids, note);
+        // if (count > 0) {
+        //     return CommonResult.success(count);
+        // }
+        return CommonResult.failed("当前状态不可关闭");
     }
 
     @ApiOperation("批量删除订单")

+ 0 - 2
mec-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/controller/open/OpenController.java

@@ -52,10 +52,8 @@ public class OpenController {
         try {
             boolean b = lock.tryLock(60, 60, TimeUnit.SECONDS);
             if (b) {
-
                 returnApplyService.setTestReturnApply(id);
                 return CommonResult.success(true);
-
             }
         } catch (InterruptedException e) {
             e.printStackTrace();

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

@@ -32,4 +32,6 @@ public interface UserOrderPaymentMapper {
      * @return
      */
     UserOrderPayment selectByAdapayNo(String paymentNo);
+
+    UserOrderPayment selectByOrderNoAndStatusSuccess(@Param("orderSn") String orderSn);
 }

+ 1 - 0
mec-mall/mall-mbg/src/main/resources/config/mybatis/PmsSkuStockMapper.xml

@@ -307,4 +307,5 @@
   <update id="lockStock">
     update pms_sku_stock set lock_stock = lock_stock + #{quantity} where  id = #{productSkuId} and stock &gt;= ( lock_stock + #{quantity})
     </update>
+
 </mapper>

+ 6 - 0
mec-mall/mall-mbg/src/main/resources/config/mybatis/UserOrderPaymentMapper.xml

@@ -279,4 +279,10 @@
         <include refid="Base_Column_List" />
         from user_order_payment where adapay_no_ = #{paymentNo} order by id_ desc  limit 1
     </select>
+
+    <select id="selectByOrderNoAndStatusSuccess" resultMap="BaseResultMap">
+        select
+        <include refid="Base_Column_List" />
+        from user_order_payment where order_no_ = #{orderSn} and status_ = 'succeeded' order by id_ desc  limit 1
+    </select>
 </mapper>

+ 10 - 4
mec-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/controller/OmsPortalOrderController.java

@@ -1,5 +1,7 @@
 package com.yonge.cooleshow.portal.controller;
 
+import com.ym.mec.auth.api.client.SysUserFeignService;
+import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.common.exception.BizException;
 import com.yonge.cooleshow.mall.common.api.CommonPage;
 import com.yonge.cooleshow.mall.common.api.CommonResult;
@@ -45,7 +47,8 @@ public class OmsPortalOrderController {
 
     @Autowired
     private UserOrderPaymentService userOrderPaymentService;
-
+    @Autowired
+    private SysUserFeignService sysUserFeignService;
     @Value("${message.debugMode}")
     private boolean debugMode;
 
@@ -96,8 +99,11 @@ public class OmsPortalOrderController {
     @RequestMapping(value = "/teacher/generateOrder", method = RequestMethod.POST)
     @ResponseBody
     public CommonResult teacherGenerateOrder(@RequestBody OrderParam orderParam) {
-        UmsMember currentMember = memberService.getCurrentMember();
-        orderParam.setTeacherId(currentMember.getId());
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (sysUser == null || sysUser.getId() == null) {
+            throw new BizException("用户信息获取失败");
+        }
+        orderParam.setTeacherId(sysUser.getId().longValue());
         final Map<String, Object>[] result = new Map[]{new HashMap<>()};
         if (StringUtil.isEmpty(orderParam.getOrderNo())) {
             result[0] = portalOrderService.generateOrder(orderParam);
@@ -192,7 +198,7 @@ public class OmsPortalOrderController {
 
         DistributedLock.of(redissonClient)
                        .runIfLockCanGet(OrderCacheEnum.LOCK_ORDER_NO_MALL.getRedisKey(omsOrder.getOrderSn())
-                               , () -> portalOrderService.confirmReceiveOrder(orderId), 60L, TimeUnit.SECONDS);
+                               , () -> portalOrderService.confirmReceiveOrder(orderId,false), 60L, TimeUnit.SECONDS);
         return CommonResult.success(null);
     }
 

+ 12 - 12
mec-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/controller/open/OpenShareController.java

@@ -1,13 +1,8 @@
 package com.yonge.cooleshow.portal.controller.open;
 
-import com.ym.mec.auth.api.client.SysUserFeignService;
-import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.common.controller.BaseController;
-import com.ym.mec.common.entity.HttpResponseResult;
 import com.yonge.cooleshow.mall.common.api.CommonResult;
-import com.yonge.cooleshow.mall.common.util.StringUtil;
-import com.yonge.cooleshow.portal.dto.ShareProductVo;
-import com.yonge.cooleshow.portal.dto.ShareProfitParam;
+import com.yonge.cooleshow.portal.dto.StockOperateModel;
 import com.yonge.cooleshow.portal.service.PmsPortalProductService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
@@ -16,21 +11,17 @@ import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
-import javax.annotation.Resource;
+import java.util.List;
 
 @RestController
 @RequestMapping("/open")
-@Api(tags = "开放权限接口-分享")
+@Api(tags = "开放权限接口")
 public class OpenShareController extends BaseController {
     private final static Logger log = LoggerFactory.getLogger(OpenShareController.class);
 
     @Autowired
-    private SysUserFeignService sysUserFeignService;
-
-    @Autowired
     private PmsPortalProductService portalProductService;
 
-
     // @ApiOperation(value = "老师商品分享分润")
     // @PostMapping(value="/productProfit")
     // @ResponseBody
@@ -49,4 +40,13 @@ public class OpenShareController extends BaseController {
     //     }
     //     return CommonResult.failed("分享功能暂未开放");
     // }
+
+    @ApiOperation(value = "同步库存")
+    @PostMapping(value="/updateStock/{stockType}")
+    @ResponseBody
+    public CommonResult<String> updateStock(@RequestBody List<StockOperateModel> model, @PathVariable String stockType) {
+        // 库存操作 stockType  add:添加   reduce:减少  lock:锁定  unlock:解锁
+        portalProductService.reduceStock(model,stockType);
+        return CommonResult.success("");
+    }
 }

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

@@ -4,6 +4,7 @@ import com.yonge.cooleshow.mbg.model.SmsCoupon;
 import com.yonge.cooleshow.portal.domain.CartProduct;
 import com.yonge.cooleshow.portal.domain.ProductStock;
 import com.yonge.cooleshow.portal.domain.PromotionProduct;
+import com.yonge.cooleshow.portal.dto.StockOperateModel;
 import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
@@ -32,4 +33,20 @@ public interface PortalProductDao {
      * 改库存
      */
     void updateProductStock(@Param("itemList") List<ProductStock> productStockList);
+
+    /**
+     * 释放sku锁定库存
+     */
+    void unlockSku(@Param("itemList") List<StockOperateModel> model);
+
+    /**
+     * 释放商品锁定库存
+     */
+    void unlockProduct(@Param("itemList") List<ProductStock> productList);
+
+    /**
+     * 扣减sku库存
+     */
+    void reduceSku(@Param("itemList") List<StockOperateModel> model);
+
 }

+ 12 - 0
mec-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/domain/OrderParam.java

@@ -36,6 +36,18 @@ public class OrderParam {
     @ApiModelProperty("订单号 重复支付传订单号")
     private String orderNo;
 
+
+    @ApiModelProperty("使用余额")
+    private boolean useBalance;
+
+    public boolean isUseBalance() {
+        return useBalance;
+    }
+
+    public void setUseBalance(boolean useBalance) {
+        this.useBalance = useBalance;
+    }
+
     public Long getTeacherId() {
         return teacherId;
     }

+ 46 - 0
mec-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/dto/StockOperateModel.java

@@ -0,0 +1,46 @@
+package com.yonge.cooleshow.portal.dto;
+
+/**
+ * Description
+ *
+ * @author liujunchi
+ * @date 2022-09-26
+ */
+public class StockOperateModel {
+
+    // 商品id
+    private Long productId;
+
+    // 商品sku id
+    private Long productSkuId;
+
+    // 数量
+    private Integer count;
+
+
+
+    public Long getProductId() {
+        return productId;
+    }
+
+    public void setProductId(Long productId) {
+        this.productId = productId;
+    }
+
+    public Long getProductSkuId() {
+        return productSkuId;
+    }
+
+    public void setProductSkuId(Long productSkuId) {
+        this.productSkuId = productSkuId;
+    }
+
+    public Integer getCount() {
+        return count;
+    }
+
+    public void setCount(Integer count) {
+        this.count = count;
+    }
+
+}

+ 1 - 2
mec-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/OmsPortalOrderService.java

@@ -1,6 +1,5 @@
 package com.yonge.cooleshow.portal.service;
 
-import com.ym.mec.common.entity.HttpResponseResult;
 import com.yonge.cooleshow.mall.common.api.CommonPage;
 import com.yonge.cooleshow.mbg.model.OmsOrder;
 import com.yonge.cooleshow.portal.domain.ConfirmOrderResult;
@@ -57,7 +56,7 @@ public interface OmsPortalOrderService {
      * 确认收货
      */
     @Transactional
-    void confirmReceiveOrder(Long orderId);
+    void confirmReceiveOrder(Long orderId, boolean auto);
 
     /**
      * 分页获取用户订单

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

@@ -6,6 +6,7 @@ import com.yonge.cooleshow.portal.domain.PmsPortalProductDetail;
 import com.yonge.cooleshow.portal.domain.PmsProductCategoryNode;
 import com.yonge.cooleshow.portal.dto.ProductSearchConditionVo;
 import com.yonge.cooleshow.portal.dto.ShareProductVo;
+import com.yonge.cooleshow.portal.dto.StockOperateModel;
 
 import java.util.List;
 
@@ -43,4 +44,12 @@ public interface PmsPortalProductService {
      * @param productId 商品id
      */
     ShareProductVo shareProductProfit(SysUser sysUser, Long productId);
+
+    /**
+     * 同步修改商品库存
+     *
+     * @param model
+     * @param stockType
+     */
+    void reduceStock(List<StockOperateModel> model, String stockType);
 }

+ 9 - 0
mec-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/UserOrderPaymentService.java

@@ -40,6 +40,15 @@ public interface UserOrderPaymentService {
      */
     UserOrderPayment getByOrderNoAndStatusPaying(String orderSn);
 
+
+    /**
+     * 查询支付成功的订单, 最多只有一个
+     *
+     * @param orderSn
+     * @return
+     */
+    UserOrderPayment getByOrderNoAndStatusSuccess(String orderSn);
+
     /**
      * 查询回调支付信息
      */

+ 45 - 17
mec-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/impl/OmsPortalOrderServiceImpl.java

@@ -149,10 +149,11 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
                 userOrderPayment.setStatus(TradeStatusEnum.pending.getCode());
                 userOrderPayment.setAdapayNo(orderSn);
                 userOrderPayment.setId(null);
+                userOrderPayment.setCreateTime(new Date());
                 userOrderPaymentService.saveOrUpdate(userOrderPayment);
 
-                return feignMecCreateOrder(order.getCouponId(), oldOrderNo, orderSn, null, detail.getMemberId().intValue(), detail.getTotalAmount(),
-                                           JSON.toJSONString(detail));
+                return feignMecCreateOrder(detail.getCouponId(), oldOrderNo, orderSn, null, detail.getMemberId().intValue(), detail.getTotalAmount(),
+                       JSON.toJSONString(detail),detail.getPayType()!= null && detail.getPayType() == 3);
             } else {
                 throw new BizException("订单信息获取失败");
             }
@@ -202,11 +203,12 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
         if (!hasStock(cartPromotionItemList)) {
             Asserts.fail("库存不足,无法下单");
         }
-
+        BigDecimal couponAmount = BigDecimal.ZERO;
         BigDecimal amount = calcTotalAmount(orderItemList);
-        Map data = feignMecCouponAmount(orderParam.getCouponId(), orderParam.getOrderAmount());
-
-        BigDecimal couponAmount = MapUtil.get(data, "mallCouponAmount", BigDecimal.class);
+        if (!StringUtil.isEmpty(orderParam.getCouponId())) {
+            Map data = feignMecCouponAmount(orderParam.getCouponId(), amount);
+            couponAmount = MapUtil.get(data, "mallCouponAmount", BigDecimal.class);
+        }
         if (couponAmount == null) {
             couponAmount = BigDecimal.ZERO;
         }
@@ -267,7 +269,7 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
         lockProductStock(cartPromotionItemList);
 
         //根据商品合计、运费、活动优惠、优惠券、积分计算应付金额
-        String cartIds = orderParam.getCartIds().stream().map(String::valueOf).collect(Collectors.joining());
+        String cartIds = orderParam.getCartIds().stream().map(String::valueOf).collect(Collectors.joining(","));
         order.setCartIds(cartIds);
         order.setDiscountAmount(new BigDecimal(0));
         order.setTotalAmount(amount);
@@ -297,8 +299,12 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
         order.setMemberId(currentMember.getId());
         order.setCreateTime(new Date());
         order.setMemberUsername(currentMember.getUsername());
-        //支付方式:0->未支付;1->支付宝;2->微信
-        order.setPayType(orderParam.getPayType());
+        //支付方式:0->未支付;1->支付宝;2->微信 3:余额
+        if (orderParam.isUseBalance()) {
+            order.setPayType(3);
+        } else {
+            order.setPayType(orderParam.getPayType());
+        }
         //订单来源:0->PC订单;1->app订单
         order.setSourceType(1);
         //订单状态:0->待付款;1->待发货;2->已发货;3->已完成;4->已关闭;5->无效订单 6 -> 未支付
@@ -363,6 +369,7 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
         userOrderPayment.setOrderNo(order.getOrderSn());
         userOrderPayment.setAdapayNo(order.getOrderSn());
         userOrderPayment.setStatus(TradeStatusEnum.pending.getCode());
+        userOrderPayment.setCreateTime(new Date());
 
         if (order.getPayAmount().compareTo(BigDecimal.ZERO) == 0) {
             paySuccess(order.getId(),order.getPayType());
@@ -375,9 +382,16 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
         // 生成订单
         // 保存商品信息到管乐迷
         OmsOrderDetail detail = detail(order.getOrderSn());
-        data = feignMecCreateOrder(orderParam.getCouponId(),orderParam.getOrderNo(), orderSn,
+        Map data = feignMecCreateOrder(orderParam.getCouponId(),orderParam.getOrderNo(), orderSn,
                                        orderParam.getTeacherId()==null?null:orderParam.getTeacherId().intValue(),
-                                       currentMember.getId().intValue(), amount,JSON.toJSONString(detail));
+                                       currentMember.getId().intValue(), amount,JSON.toJSONString(detail),orderParam.isUseBalance());
+        if ("1".equals(MapUtil.getStr(data, "tradeState"))) {
+            paySuccess(order.getId(),order.getPayType());
+            order.setStatus(1);
+            result.put("orderType","success");
+            userOrderPayment.setStatus(TradeStatusEnum.succeeded.getCode());
+            userOrderPaymentService.save(userOrderPayment);
+        }
         result.put("pay",data);
 
         return result;
@@ -395,20 +409,20 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
         return mapHttpResponseResult.getData();
     }
 
-    private Map feignMecCreateOrder(String couponId, String oldOrderNo, String orderSn, Integer teacherId, Integer userId, BigDecimal amount, String orderDetail) {
+    private Map feignMecCreateOrder(String couponId, String oldOrderNo, String orderSn, Integer teacherId, Integer userId,
+                                    BigDecimal amount, String orderDetail,boolean useBalance) {
         // 远程调用管乐迷订单记录
         MallCreateOrderModel model = new MallCreateOrderModel();
         model.setAmount(amount);
         model.setOrderNo(orderSn);
-        if (!userId.equals(teacherId)) {
-            model.setTeacherId(teacherId);
-        }
+        model.setUseBalance(useBalance);
         model.setUserId(userId);
         model.setCouponIdList(StringUtil.toIntegerList(couponId));
         model.setOldOrderNo(oldOrderNo);
         model.setOrderInfo(orderDetail);
         HttpResponseResult<Map> mapHttpResponseResult = webFeignService.mallCreateOrder(model);
         if (!mapHttpResponseResult.getStatus()) {
+            LOG.error("管乐迷下单错误信息:{}",mapHttpResponseResult.getMsg());
             throw new BizException("管乐迷订单生成失败");
         }
         Map data = mapHttpResponseResult.getData();
@@ -569,7 +583,7 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
     }
 
     @Override
-    public void confirmReceiveOrder(Long orderId) {
+    public void confirmReceiveOrder(Long orderId, boolean auto) {
         // UmsMember member = memberService.getCurrentMember();
         OmsOrder order = orderMapper.selectByPrimaryKey(orderId);
         // if (!member.getId().equals(order.getMemberId())) {
@@ -585,6 +599,20 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
         order.setReceiveTime(new Date());
         orderMapper.updateByPrimaryKey(order);
 
+
+        // 管乐迷状态同步更新为手动确认收货
+        mecReceive(order.getOrderSn(),auto);
+
+    }
+
+    // 管乐迷状态同步更新为手、自动确认收货
+    private void mecReceive(String orderSn, boolean auto) {
+        UserOrderPayment userOrderPayment = userOrderPaymentService.getByOrderNoAndStatusSuccess(orderSn);
+        HttpResponseResult receive = webFeignService.receive(userOrderPayment.getAdapayNo(), auto);
+        if (!receive.getStatus()) {
+            LOG.error("管乐迷状态同步更新为手、自动确认收货失败:{}",receive.getMsg());
+        }
+
     }
 
     @Override
@@ -709,7 +737,7 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
                            .runIfLockCanGet(OrderCacheEnum.LOCK_ORDER_NO_MALL.getRedisKey(omsOrder.getOrderSn())
                                    , () -> {
                                         try {
-                                            this.confirmReceiveOrder(omsOrder.getId());
+                                            this.confirmReceiveOrder(omsOrder.getId(), true);
 
                                         }catch (Exception e) {
                                             LOG.warn("订单收货,{}",e.fillInStackTrace());

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

@@ -4,21 +4,26 @@ import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.util.StrUtil;
 import com.github.pagehelper.PageHelper;
 import com.ym.mec.auth.api.entity.SysUser;
+import com.yonge.cooleshow.mall.common.exception.Asserts;
 import com.yonge.cooleshow.mbg.mapper.*;
 import com.yonge.cooleshow.mbg.model.*;
 import com.yonge.cooleshow.portal.dao.PortalProductDao;
 import com.yonge.cooleshow.portal.domain.PmsPortalProductDetail;
 import com.yonge.cooleshow.portal.domain.PmsProductCategoryNode;
+import com.yonge.cooleshow.portal.domain.ProductStock;
 import com.yonge.cooleshow.portal.dto.ProductCategorySmallVo;
 import com.yonge.cooleshow.portal.dto.ProductSearchConditionVo;
 import com.yonge.cooleshow.portal.dto.ShareProductVo;
+import com.yonge.cooleshow.portal.dto.StockOperateModel;
 import com.yonge.cooleshow.portal.service.PmsPortalProductService;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.CollectionUtils;
 
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.stream.Collectors;
@@ -48,6 +53,8 @@ public class PmsPortalProductServiceImpl implements PmsPortalProductService {
     @Autowired
     private PortalProductDao portalProductDao;
 
+    @Autowired
+    private PmsProductMapper pmsProductMapper;
 
     @Autowired
     private PmsProductAttributeCategoryMapper productAttributeCategoryMapper;
@@ -209,6 +216,65 @@ public class PmsPortalProductServiceImpl implements PmsPortalProductService {
         return shareProductVo;
     }
 
+    @Override
+    @Transactional
+    public void reduceStock(List<StockOperateModel> model, String stockType) {
+
+        // 商品库存变动
+        List<ProductStock> productList = new ArrayList<>();
+        Map<Long, List<StockOperateModel>> collect = model.stream().collect(Collectors.groupingBy(
+                StockOperateModel::getProductId));
+        for (Map.Entry<Long, List<StockOperateModel>> entry : collect.entrySet()) {
+            ProductStock productStock = new ProductStock();
+            List<StockOperateModel> value = entry.getValue();
+            if (CollectionUtils.isEmpty(value)) {
+                continue;
+            }
+            int sum = value.stream().mapToInt(StockOperateModel::getCount).sum();
+            productStock.setProductId(entry.getKey());
+            productStock.setStock(sum);
+            productList.add(productStock);
+        }
+        switch (stockType) {
+            case "lock" :
+                // sku库存锁定
+                for (StockOperateModel stockOperateModel : model) {
+                    int i = skuStockMapper.lockStock(stockOperateModel.getProductSkuId(), stockOperateModel.getCount());
+                    if (i ==0) {
+                        Asserts.fail("库存不足");
+                    }
+                }
+                // 商品扣减锁定
+                for (ProductStock product : productList) {
+                    if (product.getStock() > 0) {
+                        int i = pmsProductMapper.lockStock(product.getProductId(), product.getStock());
+                        if (i == 0) {
+                            Asserts.fail("库存不足");
+                        }
+                    }
+                }
+                break;
+            case "unlock" :
+                // 解锁sku库存
+                portalProductDao.unlockSku(model);
+
+                // 解锁商品库存
+                portalProductDao.unlockProduct(productList);
+                break;
+            case "reduce" :
+                // 扣减sku库存
+                portalProductDao.reduceSku(model);
+
+                // 扣减商品库存
+                portalProductDao.updateProductStock(productList);
+                break;
+            default: break;
+
+        }
+
+
+    }
+
 
     private  List<PmsProductAttributeCategory>  getHomeProductAttributeCategory() {
         PmsProductAttributeCategoryExample example = new PmsProductAttributeCategoryExample();

+ 5 - 0
mec-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/impl/UserOrderPaymentServiceImpl.java

@@ -50,6 +50,11 @@ public class UserOrderPaymentServiceImpl implements UserOrderPaymentService {
     }
 
     @Override
+    public UserOrderPayment getByOrderNoAndStatusSuccess(String orderSn) {
+        return userOrderPaymentMapper.selectByOrderNoAndStatusSuccess(orderSn);
+    }
+
+    @Override
     public UserOrderPayment getByAdapayNo(String paymentNo) {
         return userOrderPaymentMapper.selectByAdapayNo(paymentNo);
     }

+ 56 - 0
mec-mall/mall-portal/src/main/resources/config/mybatis/PortalProductDao.xml

@@ -120,4 +120,60 @@
             #{item.productId}
         </foreach>
     </update>
+
+    <update id="unlockSku">
+        UPDATE pms_sku_stock
+        SET
+        lock_stock = CASE id
+        <foreach collection="itemList" item="item">
+            WHEN #{item.productSkuId} THEN lock_stock - #{item.count}
+        </foreach>
+        END
+        WHERE
+        id IN
+        <foreach collection="itemList" item="item" separator="," open="(" close=")">
+            #{item.productSkuId}
+        </foreach>
+    </update>
+
+    <update id="unlockProduct">
+        UPDATE pms_product
+        SET
+        lock_stock = CASE id
+        <foreach collection="itemList" item="item">
+            WHEN #{item.productId} THEN lock_stock - #{item.stock}
+        </foreach>
+        END
+        WHERE
+        id IN
+        <foreach collection="itemList" item="item" separator="," open="(" close=")">
+            #{item.productId}
+        </foreach>
+    </update>
+
+    <update id="reduceSku">
+        UPDATE pms_sku_stock
+        SET
+        stock = CASE id
+        <foreach collection="itemList" item="item">
+            WHEN #{item.productSkuId} THEN stock - #{item.count}
+        </foreach>
+        END,
+        sale = CASE id
+        <foreach collection="itemList" item="item">
+            WHEN #{item.productSkuId} THEN pms_sku_stock.sale + #{item.count}
+        </foreach>
+        END,
+        lock_stock = CASE id
+        <foreach collection="itemList" item="item">
+            WHEN #{item.productSkuId} THEN lock_stock - #{item.count}
+        </foreach>
+        END
+        WHERE
+        id IN
+        <foreach collection="itemList" item="item" separator="," open="(" close=")">
+            #{item.productSkuId}
+        </foreach>
+    </update>
+
 </mapper>

+ 1 - 6
mec-student/src/main/resources/logback-spring.xml

@@ -43,18 +43,13 @@
 		</encoder>
 	</appender>
 
-	<logger name="com.ym.mec" level="WARN" />
+	<logger name="com.ym.mec" level="INFO" />
 
 	<logger name="com.ym.mec.thirdparty" level="INFO"
 			additivity="false">
 		<appender-ref ref="messagefile" />
 	</logger>
 
-	<logger name="com.ym.mec.student.controller.StudentOrderController" level="INFO"
-			additivity="false">
-		<appender-ref ref="messagefile" />
-	</logger>
-
 	<!--本地环境:打印控制台 -->
 	<springProfile name="local">
 		<root level="INFO">

+ 16 - 0
mec-web/src/main/java/com/ym/mec/web/controller/APIController.java

@@ -239,4 +239,20 @@ public class APIController extends BaseController {
 			return failed();
 		}
 	}
+
+
+
+	// 商城获取 收货状态
+	@PostMapping("/receive")
+	public HttpResponseResult receive(@RequestParam String orderNo,@RequestParam boolean autoReceive) {
+
+		try {
+			studentPaymentOrderService.receive(orderNo,autoReceive);
+
+			return succeed();
+		} catch (Exception e) {
+			e.printStackTrace();
+			return failed();
+		}
+	}
 }

+ 283 - 27
mec-web/src/main/java/com/ym/mec/web/controller/ExportController.java

@@ -1,14 +1,219 @@
 package com.ym.mec.web.controller;
 
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+
+import java.io.IOException;
+import java.io.OutputStream;
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.commons.lang3.StringUtils;
+import org.apache.poi.hssf.usermodel.HSSFWorkbook;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.util.CollectionUtils;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
 import com.ym.mec.auth.api.client.SysUserFeignService;
 import com.ym.mec.auth.api.entity.SysUser;
-import com.ym.mec.biz.dal.dao.*;
-import com.ym.mec.biz.dal.dto.*;
-import com.ym.mec.biz.dal.entity.*;
-import com.ym.mec.biz.dal.enums.*;
-import com.ym.mec.biz.dal.page.*;
+import com.ym.mec.biz.dal.dao.CourseScheduleDao;
+import com.ym.mec.biz.dal.dao.CourseScheduleStudentPaymentDao;
+import com.ym.mec.biz.dal.dao.MusicGroupDao;
+import com.ym.mec.biz.dal.dao.PracticeGroupDao;
+import com.ym.mec.biz.dal.dao.StudentDao;
+import com.ym.mec.biz.dal.dao.StudentPaymentOrderDao;
+import com.ym.mec.biz.dal.dao.SysUserCashAccountDetailDao;
+import com.ym.mec.biz.dal.dao.SysUserCoursesAccountDetailDao;
+import com.ym.mec.biz.dal.dao.TempBuyFreeLiveTheoryCourseDao;
+import com.ym.mec.biz.dal.dao.VipGroupDao;
+import com.ym.mec.biz.dal.dto.ChildrenStatisticsDetailDto;
+import com.ym.mec.biz.dal.dto.ClassGroupTeachersDto;
+import com.ym.mec.biz.dal.dto.CloudTeacherActiveTargetDetailDto;
+import com.ym.mec.biz.dal.dto.CloudTeacherActiveTargetDto;
+import com.ym.mec.biz.dal.dto.CourseGroupExportDto;
+import com.ym.mec.biz.dal.dto.CourseReviewDto;
+import com.ym.mec.biz.dal.dto.DoubleEleven2021Dto;
+import com.ym.mec.biz.dal.dto.DoubleEleven2021OrderDetailDto;
+import com.ym.mec.biz.dal.dto.EduOrganStudentDataDto;
+import com.ym.mec.biz.dal.dto.EduOrganStudentListExportDto;
+import com.ym.mec.biz.dal.dto.ExportDto;
+import com.ym.mec.biz.dal.dto.ExportStudentAttendanceDto;
+import com.ym.mec.biz.dal.dto.ExportTeacherSalaryDto;
+import com.ym.mec.biz.dal.dto.ExportVipGroupActivityDto;
+import com.ym.mec.biz.dal.dto.ExtraExerciseStudentsDto;
+import com.ym.mec.biz.dal.dto.IndexErrorDataExportDto;
+import com.ym.mec.biz.dal.dto.MusicArrearageStudentDto;
+import com.ym.mec.biz.dal.dto.MusicGroupCourseScheduleDto;
+import com.ym.mec.biz.dal.dto.MusicGroupPaymentCalenderAuditDto;
+import com.ym.mec.biz.dal.dto.MusicGroupPaymentCalenderDetailDto;
+import com.ym.mec.biz.dal.dto.MusicGroupStudentsDto;
+import com.ym.mec.biz.dal.dto.MusicalListDetailDto;
+import com.ym.mec.biz.dal.dto.NoClassMusicStudentDto;
+import com.ym.mec.biz.dal.dto.OrderByTypeExportDto;
+import com.ym.mec.biz.dal.dto.OrganDoubleEleven2021StatisDto;
+import com.ym.mec.biz.dal.dto.PageInfoDegree;
+import com.ym.mec.biz.dal.dto.PracticeCourseDto;
+import com.ym.mec.biz.dal.dto.PracticeGroupDto;
+import com.ym.mec.biz.dal.dto.Student4operating;
+import com.ym.mec.biz.dal.dto.StudentApplyDetailDto;
+import com.ym.mec.biz.dal.dto.StudentBuyPracticeDto;
+import com.ym.mec.biz.dal.dto.StudentErrorLeaveDto;
+import com.ym.mec.biz.dal.dto.StudentExercisesSituationDto;
+import com.ym.mec.biz.dal.dto.StudentManageListDto;
+import com.ym.mec.biz.dal.dto.StudentVisitDto;
+import com.ym.mec.biz.dal.dto.TeacherCourseSalaryDetail4WebDto;
+import com.ym.mec.biz.dal.dto.TeacherDefaultSalaryDto;
+import com.ym.mec.biz.dal.dto.TeacherSalaryDto;
+import com.ym.mec.biz.dal.dto.TeacherServeDto;
+import com.ym.mec.biz.dal.dto.TeacherStudentDataDto;
+import com.ym.mec.biz.dal.dto.VipBuyResultDto;
+import com.ym.mec.biz.dal.entity.ClassGroupTeacherMapper;
+import com.ym.mec.biz.dal.entity.CooperationOrgan;
+import com.ym.mec.biz.dal.entity.DegreeRegistration;
+import com.ym.mec.biz.dal.entity.EmployeeInfo;
+import com.ym.mec.biz.dal.entity.Goods;
+import com.ym.mec.biz.dal.entity.ManagerDownload;
+import com.ym.mec.biz.dal.entity.MusicEnlightenmentQuestionnaire;
+import com.ym.mec.biz.dal.entity.MusicGroup;
+import com.ym.mec.biz.dal.entity.MusicGroupQuit;
+import com.ym.mec.biz.dal.entity.SellOrder;
+import com.ym.mec.biz.dal.entity.SporadicChargeInfo;
+import com.ym.mec.biz.dal.entity.Student;
+import com.ym.mec.biz.dal.entity.StudentAttendance;
+import com.ym.mec.biz.dal.entity.SysMusicScore;
+import com.ym.mec.biz.dal.entity.SysUserCashAccountDetail;
+import com.ym.mec.biz.dal.entity.SysUserCoursesAccountDetail;
+import com.ym.mec.biz.dal.entity.Teacher;
+import com.ym.mec.biz.dal.entity.TeacherCourseReward;
+import com.ym.mec.biz.dal.entity.TeacherCourseStatistics;
+import com.ym.mec.biz.dal.entity.TeacherSalaryComplaints;
+import com.ym.mec.biz.dal.entity.TempBuyFreeLiveTheoryCourse;
+import com.ym.mec.biz.dal.entity.TenantPaymentOrder;
+import com.ym.mec.biz.dal.entity.VipGroup;
+import com.ym.mec.biz.dal.enums.AccountType;
+import com.ym.mec.biz.dal.enums.CourseStatusEnum;
+import com.ym.mec.biz.dal.enums.ExamSongTypeEnum;
+import com.ym.mec.biz.dal.enums.ExportEnum;
+import com.ym.mec.biz.dal.enums.ExportTypeEnum;
+import com.ym.mec.biz.dal.enums.GroupType;
+import com.ym.mec.biz.dal.enums.IndexErrorType;
+import com.ym.mec.biz.dal.enums.KitGroupPurchaseTypeEnum;
+import com.ym.mec.biz.dal.enums.LevelEnum;
+import com.ym.mec.biz.dal.enums.OrderTypeEnum;
+import com.ym.mec.biz.dal.enums.PaymentChannelEnum;
+import com.ym.mec.biz.dal.enums.PaymentStatusEnum;
+import com.ym.mec.biz.dal.enums.TeachTypeEnum;
+import com.ym.mec.biz.dal.enums.YesOrNoEnum;
+import com.ym.mec.biz.dal.page.ArrearageStudentsQueryInfo;
+import com.ym.mec.biz.dal.page.ChildrenReserveQueryInfo;
+import com.ym.mec.biz.dal.page.ClassGroupQueryInfo;
+import com.ym.mec.biz.dal.page.CloudTeacherActiveQueryInfo;
+import com.ym.mec.biz.dal.page.CooperationOrganQueryInfo;
+import com.ym.mec.biz.dal.page.CourseReviewQueryInfo;
+import com.ym.mec.biz.dal.page.CourseSalaryQueryInfo4Web;
+import com.ym.mec.biz.dal.page.CourseScheduleTeacherSalaryQueryInfo;
+import com.ym.mec.biz.dal.page.DegreeQueryInfo;
+import com.ym.mec.biz.dal.page.DoubleEleven2021QueryInfo;
+import com.ym.mec.biz.dal.page.EmployeeInfoQueryInfo;
+import com.ym.mec.biz.dal.page.EndCourseScheduleQueryInfo;
+import com.ym.mec.biz.dal.page.ExportStudentAttendanceQueryInfo;
+import com.ym.mec.biz.dal.page.ExportTeacherSalaryQueryInfo;
+import com.ym.mec.biz.dal.page.ExportUserAccountQueryInfo;
+import com.ym.mec.biz.dal.page.ExtraExercilseReplyQueryInfo;
+import com.ym.mec.biz.dal.page.GoodsQueryInfo;
+import com.ym.mec.biz.dal.page.IndexErrRecordQueryInfo;
+import com.ym.mec.biz.dal.page.LiveBroadcastRoomMemberQueryInfo;
+import com.ym.mec.biz.dal.page.MusicCalenderDetailQueryInfo;
+import com.ym.mec.biz.dal.page.MusicEnlightenmentQuestionnaireQueryInfo;
+import com.ym.mec.biz.dal.page.MusicGroupPaymentCalenderQueryInfo;
+import com.ym.mec.biz.dal.page.MusicGroupQueryInfo;
+import com.ym.mec.biz.dal.page.MusicGroupQuitQueryInfo;
+import com.ym.mec.biz.dal.page.MusicGroupStudentQueryInfo;
+import com.ym.mec.biz.dal.page.NoClassMusicStudentQueryInfo;
+import com.ym.mec.biz.dal.page.OrganCloudStudyStudentDataQueryInfo;
+import com.ym.mec.biz.dal.page.PracticeGroupQueryInfo;
+import com.ym.mec.biz.dal.page.SellOrderQueryInfo;
+import com.ym.mec.biz.dal.page.SporadicChargeInfoQueryInfo;
+import com.ym.mec.biz.dal.page.StudentAttendanceQueryInfo;
+import com.ym.mec.biz.dal.page.StudentBuyPracticeQueryInfo;
+import com.ym.mec.biz.dal.page.StudentErrorLeaveQueryInfo;
+import com.ym.mec.biz.dal.page.StudentExercisesSituationQueryInfo;
+import com.ym.mec.biz.dal.page.StudentManageQueryInfo;
+import com.ym.mec.biz.dal.page.StudentOperatingQueryInfo;
+import com.ym.mec.biz.dal.page.StudentQueryInfo;
+import com.ym.mec.biz.dal.page.StudentRegistrationQueryInfo;
+import com.ym.mec.biz.dal.page.StudentVisitQueryInfo;
+import com.ym.mec.biz.dal.page.SysExamSongQueryInfo;
+import com.ym.mec.biz.dal.page.TeacherCloseQueryInfo;
+import com.ym.mec.biz.dal.page.TeacherCourseRewardQueryInfo;
+import com.ym.mec.biz.dal.page.TeacherCourseStatisticsQueryInfo;
+import com.ym.mec.biz.dal.page.TeacherQueryInfo;
+import com.ym.mec.biz.dal.page.TeacherSalaryModifyQueryInfo;
+import com.ym.mec.biz.dal.page.TeacherServeQueryInfo;
+import com.ym.mec.biz.dal.page.TenantPaymentOrderQueryInfo;
+import com.ym.mec.biz.dal.page.VipGroupActivityQueryInfo;
+import com.ym.mec.biz.dal.page.VipGroupQueryInfo;
+import com.ym.mec.biz.dal.page.queryMusicGroupCourseScheduleQueryInfo;
 import com.ym.mec.biz.dal.vo.ImLiveBroadcastRoomMemberVo;
-import com.ym.mec.biz.service.*;
+import com.ym.mec.biz.service.ChildrenDayReserveService;
+import com.ym.mec.biz.service.ClassGroupService;
+import com.ym.mec.biz.service.CooperationOrganService;
+import com.ym.mec.biz.service.CourseReviewService;
+import com.ym.mec.biz.service.CourseScheduleService;
+import com.ym.mec.biz.service.CourseScheduleTeacherSalaryService;
+import com.ym.mec.biz.service.DegreeRegistrationService;
+import com.ym.mec.biz.service.EmployeeInfoService;
+import com.ym.mec.biz.service.ExportService;
+import com.ym.mec.biz.service.ExtracurricularExercisesReplyService;
+import com.ym.mec.biz.service.GoodsService;
+import com.ym.mec.biz.service.ImLiveBroadcastRoomMemberService;
+import com.ym.mec.biz.service.IndexBaseMonthDataService;
+import com.ym.mec.biz.service.IndexErrDataRecordService;
+import com.ym.mec.biz.service.MusicEnlightenmentQuestionnaireService;
+import com.ym.mec.biz.service.MusicGroupPaymentCalenderDetailService;
+import com.ym.mec.biz.service.MusicGroupPaymentCalenderService;
+import com.ym.mec.biz.service.MusicGroupQuitService;
+import com.ym.mec.biz.service.MusicGroupService;
+import com.ym.mec.biz.service.OrganizationService;
+import com.ym.mec.biz.service.PracticeGroupService;
+import com.ym.mec.biz.service.SellOrderService;
+import com.ym.mec.biz.service.SporadicChargeInfoService;
+import com.ym.mec.biz.service.StudentAttendanceService;
+import com.ym.mec.biz.service.StudentExtracurricularExercisesSituationService;
+import com.ym.mec.biz.service.StudentManageService;
+import com.ym.mec.biz.service.StudentPaymentOrderDetailService;
+import com.ym.mec.biz.service.StudentRegistrationService;
+import com.ym.mec.biz.service.StudentService;
+import com.ym.mec.biz.service.StudentVisitService;
+import com.ym.mec.biz.service.SysConfigService;
+import com.ym.mec.biz.service.SysMusicScoreService;
+import com.ym.mec.biz.service.SysTenantConfigService;
+import com.ym.mec.biz.service.TeacherAttendanceService;
+import com.ym.mec.biz.service.TeacherCourseRewardService;
+import com.ym.mec.biz.service.TeacherCourseStatisticsService;
+import com.ym.mec.biz.service.TeacherSalaryComplaintsService;
+import com.ym.mec.biz.service.TeacherService;
+import com.ym.mec.biz.service.TenantPaymentOrderService;
+import com.ym.mec.biz.service.VipGroupActivityService;
+import com.ym.mec.biz.service.VipGroupService;
 import com.ym.mec.common.constant.CommonConstants;
 import com.ym.mec.common.controller.BaseController;
 import com.ym.mec.common.entity.HttpResponseResult;
@@ -19,27 +224,6 @@ import com.ym.mec.util.collection.MapUtil;
 import com.ym.mec.util.date.DateUtil;
 import com.ym.mec.util.excel.POIUtil;
 
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiImplicitParam;
-import io.swagger.annotations.ApiImplicitParams;
-import io.swagger.annotations.ApiOperation;
-
-import org.apache.commons.lang3.StringUtils;
-import org.apache.poi.hssf.usermodel.HSSFWorkbook;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.security.access.prepost.PreAuthorize;
-import org.springframework.util.CollectionUtils;
-import org.springframework.web.bind.annotation.*;
-
-import javax.annotation.Resource;
-import javax.servlet.http.HttpServletResponse;
-
-import java.io.IOException;
-import java.io.OutputStream;
-import java.math.BigDecimal;
-import java.util.*;
-import java.util.stream.Collectors;
-
 @RequestMapping
 @Api(tags = "数据导出服务")
 @RestController
@@ -3048,4 +3232,76 @@ public class ExportController extends BaseController {
             }
         }
     }
+    
+    @ApiOperation(value = "没有班级的学员导出")
+    @PostMapping("export/noClassGroupStudentList")
+    @PreAuthorize("@pcs.hasPermissions('export/noClassGroupStudentList')")
+    public void exportNoClassGroupStudentList(HttpServletResponse response, NoClassMusicStudentQueryInfo queryInfo) throws IOException {
+    	queryInfo = organizationService.onlyEducation(queryInfo);
+        queryInfo.setPage(1);
+        queryInfo.setRows(49999);
+        List<NoClassMusicStudentDto> rows = studentRegistrationService.queryNoClassMusicStudentInfo(queryInfo).getRows();
+        if (rows.size() < 1) {
+            throw new BizException("没有可导出数据");
+        }
+        OutputStream outputStream = response.getOutputStream();
+        try {
+            HSSFWorkbook workbook = POIUtil.exportExcel(new String[]{"分部", "乐团编号",
+                    "乐团名称", "学生编号", "学生姓名", "学员声部"}, new String[]{
+                    "organName", "groupId", "groupName", "studentId", "studentName", "subjectName"}, rows);
+            response.setContentType("application/octet-stream");
+            response.setHeader("Content-Disposition", "attac:wq" +
+                    "hment;filename=noClassGroupStudentList-" + DateUtil.getDate(new Date()) + ".xls");
+
+            outputStream = response.getOutputStream();
+            workbook.write(outputStream);
+            outputStream.flush();
+        } catch (Exception e) {
+            e.printStackTrace();
+        } finally {
+            if (outputStream != null) {
+                try {
+                    outputStream.close();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+    }
+    
+    @ApiOperation(value = "学员异常请假列表")
+    @PostMapping("export/studentErrorLeaveList")
+    @PreAuthorize("@pcs.hasPermissions('export/studentErrorLeaveList')")
+    public void exportStudentErrorLeaveList(HttpServletResponse response, StudentErrorLeaveQueryInfo queryInfo) throws IOException {
+    	queryInfo.setOrganIds(organizationService.getEmployeeOrgan(queryInfo.getOrganIds()));
+        queryInfo.setPage(1);
+        queryInfo.setRows(49999);
+        List<StudentErrorLeaveDto> rows = studentManageService.queryStudentErrorLeaveList(queryInfo).getRows();
+        if (rows.size() < 1) {
+            throw new BizException("没有可导出数据");
+        }
+        OutputStream outputStream = response.getOutputStream();
+        try {
+            HSSFWorkbook workbook = POIUtil.exportExcel(new String[]{"分部", "学生编号",
+                    "学生姓名", "手机号", "近两个月请假次数", "本月请假次数"}, new String[]{
+                    "organName", "userId", "studentName", "phone", "totalNum", "currentNum"}, rows);
+            response.setContentType("application/octet-stream");
+            response.setHeader("Content-Disposition", "attac:wq" +
+                    "hment;filename=studentErrorLeaveList-" + DateUtil.getDate(new Date()) + ".xls");
+
+            outputStream = response.getOutputStream();
+            workbook.write(outputStream);
+            outputStream.flush();
+        } catch (Exception e) {
+            e.printStackTrace();
+        } finally {
+            if (outputStream != null) {
+                try {
+                    outputStream.close();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+    }
 }

+ 54 - 13
mec-web/src/main/java/com/ym/mec/web/controller/StudentManageController.java

@@ -1,25 +1,66 @@
 package com.ym.mec.web.controller;
 
-import com.ym.mec.biz.dal.dto.*;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.util.CollectionUtils;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import com.ym.mec.biz.dal.dto.ActivityCourseDetailDto;
+import com.ym.mec.biz.dal.dto.CloudStudyStudentDataDto;
+import com.ym.mec.biz.dal.dto.EduOrganStudentDataDto;
+import com.ym.mec.biz.dal.dto.IndexCloudStudyListDto;
+import com.ym.mec.biz.dal.dto.StatDto;
+import com.ym.mec.biz.dal.dto.StudentSubTotalCourseTimesDto;
+import com.ym.mec.biz.dal.dto.UpdateStudentFeeDto;
 import com.ym.mec.biz.dal.entity.Organization;
 import com.ym.mec.biz.dal.entity.Student;
-import com.ym.mec.biz.dal.page.*;
-import com.ym.mec.biz.service.*;
+import com.ym.mec.biz.dal.page.CloudTeacherActiveQueryInfo;
+import com.ym.mec.biz.dal.page.MusicGroupStudentQueryInfo;
+import com.ym.mec.biz.dal.page.OrganCloudStudyStudentDataQueryInfo;
+import com.ym.mec.biz.dal.page.StudentActivityQueryInfo;
+import com.ym.mec.biz.dal.page.StudentErrorLeaveQueryInfo;
+import com.ym.mec.biz.dal.page.StudentManageAttendanceQueryInfo;
+import com.ym.mec.biz.dal.page.StudentManageCourseQueryInfo;
+import com.ym.mec.biz.dal.page.StudentManageQueryInfo;
+import com.ym.mec.biz.dal.page.StudentManageVipClassQueryInfo;
+import com.ym.mec.biz.dal.page.StudentOperatingQueryInfo;
+import com.ym.mec.biz.dal.page.StudentQueryInfo;
+import com.ym.mec.biz.dal.page.StudentSignQueryInfo;
+import com.ym.mec.biz.dal.page.StudentSubTotalCourseTimesQueryInfo;
+import com.ym.mec.biz.dal.page.TeacherPaymentRecordInfo;
+import com.ym.mec.biz.dal.page.UserBasicQueryInfo;
+import com.ym.mec.biz.service.MusicGroupStudentFeeService;
+import com.ym.mec.biz.service.OrganizationService;
+import com.ym.mec.biz.service.StudentCourseHomeworkService;
+import com.ym.mec.biz.service.StudentManageService;
+import com.ym.mec.biz.service.StudentRegistrationService;
+import com.ym.mec.biz.service.StudentService;
 import com.ym.mec.common.controller.BaseController;
 import com.ym.mec.common.entity.HttpResponseResult;
 import com.ym.mec.common.exception.BizException;
 import com.ym.mec.common.page.PageInfo;
 import com.ym.mec.common.page.QueryInfo;
-import io.swagger.annotations.*;
-import io.swagger.models.auth.In;
-import org.apache.commons.lang3.StringUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.security.access.prepost.PreAuthorize;
-import org.springframework.util.CollectionUtils;
-import org.springframework.web.bind.annotation.*;
-
-import java.util.*;
-import java.util.stream.Collectors;
 
 @Api(tags = "学生管理")
 @RestController