Просмотр исходного кода

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

zouxuan 2 лет назад
Родитель
Сommit
34aaddecdd
34 измененных файлов с 920 добавлено и 144 удалено
  1. 1 1
      mec-auth/mec-auth-api/src/main/java/com/ym/mec/auth/api/client/SysUserFeignService.java
  2. 15 0
      mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/web/controller/TokenController.java
  3. 10 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/StudentGoodsSellDto.java
  4. 11 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/StudentGoodsSell.java
  5. 11 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/page/GoodsSellQueryInfo.java
  6. 4 0
      mec-biz/src/main/java/com/ym/mec/biz/service/StudentPaymentOrderService.java
  7. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/PracticeGroupServiceImpl.java
  8. 99 11
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentPaymentOrderServiceImpl.java
  9. 16 3
      mec-biz/src/main/resources/config/mybatis/StudentGoodsSellMapper.xml
  10. 1 1
      mec-biz/src/main/resources/config/mybatis/StudentPaymentOrderMapper.xml
  11. 14 0
      mec-client-api/src/main/java/com/ym/mec/web/WebFeignService.java
  12. 16 0
      mec-client-api/src/main/java/com/ym/mec/web/fallback/WebFeignServiceFallback.java
  13. 22 0
      mec-common/common-core/src/main/java/com/ym/mec/common/entity/MallCreateOrderModel.java
  14. 52 0
      mec-mall/mall-common/src/main/java/com/yonge/cooleshow/mall/common/enums/TradeStatusEnum.java
  15. 2 0
      mec-mall/mall-mbg/src/main/java/com/yonge/cooleshow/mbg/mapper/UserOrderRefundMapper.java
  16. 7 0
      mec-mall/mall-mbg/src/main/resources/config/mybatis/UserOrderRefundMapper.xml
  17. 2 2
      mec-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/config/ResourceServerConfig.java
  18. 9 0
      mec-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/controller/OmsCartItemController.java
  19. 37 3
      mec-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/controller/OmsPortalOrderController.java
  20. 8 28
      mec-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/controller/PaymentController.java
  21. 3 0
      mec-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/dao/PortalOrderDao.java
  22. 12 2
      mec-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/domain/OrderParam.java
  23. 6 0
      mec-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/OmsCartItemService.java
  24. 11 8
      mec-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/OmsPortalOrderService.java
  25. 47 0
      mec-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/UserOrderPaymentService.java
  26. 19 1
      mec-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/impl/OmsCartItemServiceImpl.java
  27. 204 51
      mec-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/impl/OmsPortalOrderServiceImpl.java
  28. 1 2
      mec-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/impl/UmsMemberReceiveAddressServiceImpl.java
  29. 56 0
      mec-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/impl/UserOrderPaymentServiceImpl.java
  30. 14 3
      mec-mall/mall-portal/src/main/resources/config/mybatis/PortalOrderDao.xml
  31. 1 1
      mec-student/src/main/java/com/ym/mec/student/controller/StudentOrderController.java
  32. 24 0
      mec-thirdparty/src/main/java/com/ym/mec/thirdparty/adapay/Payment.java
  33. 131 0
      mec-thirdparty/src/main/java/com/ym/mec/thirdparty/adapay/entity/BaseResult.java
  34. 53 26
      mec-web/src/main/java/com/ym/mec/web/controller/APIController.java

+ 1 - 1
mec-auth/mec-auth-api/src/main/java/com/ym/mec/auth/api/client/SysUserFeignService.java

@@ -46,7 +46,7 @@ public interface SysUserFeignService {
 									@RequestParam("clientId")String clientId,
 									@RequestParam("clientSecret")String clientSecret);
 
-	@GetMapping(value = "exit")
+	@PostMapping(value = "exit")
 	@ApiOperation(value = "退出登录")
 	HttpResponseResult<String> logout();
 

+ 15 - 0
mec-auth/mec-auth-server/src/main/java/com/ym/mec/auth/web/controller/TokenController.java

@@ -156,6 +156,21 @@ public class TokenController extends BaseController {
 		return succeed("退出成功");
 	}
 
+	@GetMapping(value = "exit")
+	@ApiOperation(value = "退出登录")
+	public HttpResponseResult<String> logoutGet(HttpServletRequest request) {
+		String authHeader = request.getHeader(HttpHeaders.AUTHORIZATION);
+		if (StringUtils.isBlank(authHeader)) {
+			return failed("退出失败,token 为空");
+		}
+
+		String tokenValue = authHeader.toLowerCase().replace(OAuth2AccessToken.BEARER_TYPE.toLowerCase(), StringUtils.EMPTY).trim();
+
+		tokenService.revokeToken(tokenValue);
+
+		return succeed("退出成功");
+	}
+
 	@PostMapping(value = "exit/{clientId}/{phone}", consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE)
 	@ApiOperation(value = "指定用户退出登录")
 	public HttpResponseResult<String> exitByPhone(@PathVariable("clientId") String clientId, @PathVariable("phone") String phone) {

+ 10 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/StudentGoodsSellDto.java

@@ -12,12 +12,22 @@ public class StudentGoodsSellDto extends StudentPaymentOrder {
 
     private Integer authorUser;
 
+    private String goodsType;
+
     private BigDecimal totalAmount = BigDecimal.ZERO;
 
     private BigDecimal marketAmount = BigDecimal.ZERO;
 
     private Integer autoAffirmReceiveTime;
 
+    public String getGoodsType() {
+        return goodsType;
+    }
+
+    public void setGoodsType(String goodsType) {
+        this.goodsType = goodsType;
+    }
+
     public Integer getAutoAffirmReceiveTime() {
         return autoAffirmReceiveTime;
     }

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

@@ -76,6 +76,17 @@ public class StudentGoodsSell extends BaseEntity {
 	@ApiModelProperty(value = "优惠券详情列表", required = false)
 	private List<SysCouponCodeDto> couponCodeDtoList;
 
+	// 商品来源类型 MALL商城
+	private String goodsType;
+
+	public String getGoodsType() {
+		return goodsType;
+	}
+
+	public void setGoodsType(String goodsType) {
+		this.goodsType = goodsType;
+	}
+
 	public String getCouponIds() {
 		return couponIds;
 	}

+ 11 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/page/GoodsSellQueryInfo.java

@@ -14,6 +14,17 @@ public class GoodsSellQueryInfo extends QueryInfo {
 	@ApiModelProperty(value = "交易状态",required = true)
 	private String status;
 
+	@ApiModelProperty("商品来源类型 MALL:商城")
+	private String goodsType;
+
+	public String getGoodsType() {
+		return goodsType;
+	}
+
+	public void setGoodsType(String goodsType) {
+		this.goodsType = goodsType;
+	}
+
 	public Integer getTeacherId() {
 		return teacherId;
 	}

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

@@ -244,4 +244,8 @@ public interface StudentPaymentOrderService extends BaseService<Long, StudentPay
     Map createOrder(MallCreateOrderModel model) throws Exception;
 
     void mallBuyOrderCallback(StudentPaymentOrder order);
+
+    void mallSaveOrderInfo(MallCreateOrderModel model);
+
+    OrderCancelModel cancelOrder(StudentPaymentOrder orderByOrderNo);
 }

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

@@ -3472,7 +3472,7 @@ public class PracticeGroupServiceImpl extends BaseServiceImpl<Long, PracticeGrou
         practiceBuyResult.setType(order.getType().getCode());
         practiceBuyResult.setFinanceChops(financeChops);
 
-        if (order.getGroupType().equals(GroupType.GOODS_SELL)) {
+        if (order.getGroupType().equals(GroupType.GOODS_SELL) || order.getGroupType().equals(GroupType.MALL_SELL)) {
             practiceBuyResult.setDetail(studentGoodsSellDao.getStudentGoodsSellDto(orderNo));
         }
 

+ 99 - 11
mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentPaymentOrderServiceImpl.java

@@ -1,14 +1,12 @@
 package com.ym.mec.biz.service.impl;
 
 import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 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.PageInfoOrder;
-import com.ym.mec.biz.dal.dto.SporadicChargeInfoDto;
-import com.ym.mec.biz.dal.dto.StudentPaymentOrderDto;
-import com.ym.mec.biz.dal.dto.StudentPaymentOrderExportDto;
+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.SporadicOrderQueryInfo;
@@ -127,6 +125,8 @@ public class StudentPaymentOrderServiceImpl extends BaseServiceImpl<Long, Studen
     private StudentDao studentDao;
     @Autowired
     private StudentPaymentOrderService studentPaymentOrderService;
+
+
     @Autowired
     private SysUserCashAccountDetailService sysUserCashAccountDetailService;
     private final Logger logger = LoggerFactory.getLogger(this.getClass());
@@ -1030,10 +1030,56 @@ public class StudentPaymentOrderServiceImpl extends BaseServiceImpl<Long, Studen
         return studentPaymentOrderDao.getMemberIngOrder(member, status);
     }
 
+    @Autowired
+    private StudentRepairDao studentRepairDao;
+    @Autowired
+    private MusicGroupDao musicGroupDao;
+
+    @Autowired
+    private StudentGoodsSellDao studentGoodsSellDao;
 
     @Override
     public Map createOrder(MallCreateOrderModel model) throws Exception {
 
+        if(model == null ||model.getUserId() == null) {
+            throw new BizException("参数错误");
+        }
+        StudentGoodsSell studentGoodsSell;
+        if (StringUtils.isNotEmpty(model.getOldOrderNo())) {
+            studentGoodsSell = studentGoodsSellDao.findByOrderNo(model.getOldOrderNo());
+        }  else {
+            studentGoodsSell = new StudentGoodsSell();
+        }
+        studentDao.lockUser(model.getUserId());
+        SysUser student = studentDao.getUser(model.getUserId());
+        Map payMap = new HashMap();
+        if (student == null) {
+            payMap.put("mallStatus",0);
+            return payMap;
+        }
+        studentGoodsSell.setUserId(model.getUserId());
+        studentGoodsSell.setTeacherId(model.getTeacherId() >0 ? model.getTeacherId():studentGoodsSell.getTeacherId());
+        studentGoodsSell.setAuthorUser(model.getTeacherId() >0 ? model.getTeacherId():studentGoodsSell.getAuthorUser());
+        //如果教务老师为空,代表学员自己创建的订单
+        if (model.getTeacherId() == null && studentGoodsSell.getTeacherId() == null) {
+            //获取学生关联的所有教务老师列表
+            List<Integer> stuEducation = studentRepairDao.countStuEducation(model.getUserId());
+            if (stuEducation != null && stuEducation.size() == 1) {
+                //获取学员乐团关联的教务
+                MusicGroup musicGroup = musicGroupDao.getStuMusic(model.getUserId());
+                studentGoodsSell.setTeacherId(stuEducation.get(0));
+                if (musicGroup != null) {
+                    studentGoodsSell.setCooperationOrganId(musicGroup.getCooperationOrganId());
+                }
+            }
+        } else if (studentGoodsSell.getCooperationOrganId() == null) {
+            //获取教务老师,学员关联的乐团
+            MusicGroup musicGroup = musicGroupDao.getStuEduMusic(model.getUserId(), studentGoodsSell.getTeacherId());
+            if (musicGroup != null) {
+                studentGoodsSell.setCooperationOrganId(musicGroup.getCooperationOrganId());
+            }
+        }
+
         if (StringUtils.isNotEmpty(model.getOldOrderNo())) {
             StudentPaymentOrder orderByOrderNo = studentPaymentOrderService.findOrderByOrderNo(model.getOldOrderNo());
             if (orderByOrderNo == null) {
@@ -1049,27 +1095,39 @@ public class StudentPaymentOrderServiceImpl extends BaseServiceImpl<Long, Studen
             sysCouponCodeService.quit(orderByOrderNo.getCouponCodeId());
         }
 
-        SysUser student = studentDao.getUser(model.getUserId());
-        Map payMap = new HashMap();
-        if (student == null) {
-            payMap.put("mallStatus",0);
-            return payMap;
-        }
+
         Date date = new Date();
         StudentPaymentOrder studentPaymentOrder = sysCouponCodeService.use(model.getCouponIdList(), model.getAmount(),false);
 
+        studentPaymentOrder.setStatus(DealStatusEnum.ING);
+        if (studentPaymentOrder.getActualAmount().compareTo(BigDecimal.ZERO) == 0) {
+            studentPaymentOrder.setStatus(DealStatusEnum.SUCCESS);
+        }
         studentPaymentOrder.setGroupType(GroupType.MALL_SELL);
         studentPaymentOrder.setUserId(model.getUserId());
         studentPaymentOrder.setType(OrderTypeEnum.MALL_BUY);
         studentPaymentOrder.setOrderNo(model.getOrderNo());
-        studentPaymentOrder.setStatus(DealStatusEnum.ING);
         studentPaymentOrder.setCreateTime(date);
         studentPaymentOrder.setUpdateTime(date);
+        studentPaymentOrder.setPaymentChannel("ADAPAY");
         studentPaymentOrder.setOrganId(student.getOrganId());
         studentPaymentOrder.setRoutingOrganId(student.getOrganId());
         studentPaymentOrder.setTenantId(student.getTenantId());
         studentPaymentOrderService.insert(studentPaymentOrder);
 
+        studentGoodsSell.setCouponMarketAmount(studentPaymentOrder.getCouponRemitFee());
+        studentGoodsSell.setOrganId(student.getOrganId());
+        studentGoodsSell.setTotalAmount(studentPaymentOrder.getActualAmount());
+        studentGoodsSell.setGoodsType("MALL");
+        // studentGoodsSell.setGoodsJson(JSONObject.toJSONString(goodsSellDtos));
+        studentGoodsSell.setOrderNo(model.getOrderNo());
+        List<Integer> couponIdList = model.getCouponIdList();
+        if (couponIdList != null && couponIdList.size() > 0) {
+            studentGoodsSell.setCouponIds(StringUtils.join(couponIdList, ","));
+        }
+        studentGoodsSell.setTenantId(student.getTenantId());
+        studentGoodsSellDao.insert(studentGoodsSell);
+
         String baseApiUrl = sysConfigDao.findConfigValue("base_api_url");
 
         //  receiver类型
@@ -1149,4 +1207,34 @@ public class StudentPaymentOrderServiceImpl extends BaseServiceImpl<Long, Studen
             sysCouponCodeService.quit(studentPaymentOrder.getCouponCodeId());
         }
     }
+
+    @Override
+    public void mallSaveOrderInfo(MallCreateOrderModel model) {
+
+        StudentGoodsSell studentGoodsSell = studentGoodsSellDao.findByOrderNo(model.getOrderNo());
+        if (studentGoodsSell == null) {
+            throw new BizException("未找到订单信息");
+        }
+        studentGoodsSell.setGoodsJson(model.getOrderInfo());
+        studentGoodsSell.setGoodsType("MALL");
+        studentGoodsSellDao.update(studentGoodsSell);
+    }
+
+    @Override
+    public OrderCancelModel cancelOrder(StudentPaymentOrder order) {
+        OrderCancelModel model = new OrderCancelModel();
+        try {
+            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();
+        }
+        return model;
+    }
 }

+ 16 - 3
mec-biz/src/main/resources/config/mybatis/StudentGoodsSellMapper.xml

@@ -40,9 +40,9 @@
 	<!-- 向数据库增加一条记录 -->
 	<insert id="insert" parameterType="com.ym.mec.biz.dal.entity.StudentGoodsSell" useGeneratedKeys="true" keyColumn="id" keyProperty="id">
 		INSERT INTO student_goods_sell (user_id_,teacher_id_,goods_json_,total_amount_,market_amount_,
-		create_time_,update_time_,order_no_,organ_id_,author_user_,cooperation_organ_id_,coupon_market_amount_,coupon_ids_,tenant_id_)
+		create_time_,update_time_,order_no_,organ_id_,author_user_,cooperation_organ_id_,coupon_market_amount_,coupon_ids_,tenant_id_,goods_type_)
 		VALUES(#{userId},#{teacherId},#{goodsJson},#{totalAmount},#{marketAmount},
-		NOW(),NOW(),#{orderNo},#{organId},#{authorUser},#{cooperationOrganId},#{couponMarketAmount},#{couponIds},#{tenantId})
+		NOW(),NOW(),#{orderNo},#{organId},#{authorUser},#{cooperationOrganId},#{couponMarketAmount},#{couponIds},#{tenantId},#{goodsType})
 	</insert>
 	
 	<!-- 根据主键查询一条记录 -->
@@ -81,6 +81,9 @@
 		<if test="goodsJson != null">
 			goods_json_ = #{goodsJson},
 		</if>
+		<if test="goodsType != null">
+			goods_type_ = #{goodsType},
+		</if>
 		update_time_ = NOW()
 		</set> WHERE id_ = #{id} and tenant_id_ = #{tenantId}
 	</update>
@@ -110,6 +113,7 @@
 	</select>
 	<resultMap type="com.ym.mec.biz.dal.dto.StudentGoodsSellDto" id="StudentGoodsSellDto" extends="com.ym.mec.biz.dal.dao.StudentPaymentOrderDao.StudentPaymentOrder">
 		<result column="goods_json_" property="goodsJson" />
+		<result column="goods_type_" property="goodsType" />
 		<result column="total_amount_" property="totalAmount" />
 		<result column="market_amount_" property="marketAmount" />
 		<result column="username_" property="userName" />
@@ -118,6 +122,15 @@
 	<sql id="queryStudentGoodsOrdersSql">
 		<where>
 			sgs.tenant_id_ = #{tenantId}
+
+			<choose>
+				<when test="goodsType != null and goodsType =='MALL'">
+					and sgs.goods_type_ = 'MALL'
+				</when>
+				<otherwise>
+					and sgs.goods_type_ is null
+				</otherwise>
+			</choose>
 			<if test="teacherId != null">
 				AND sgs.teacher_id_ = #{teacherId}
 			</if>
@@ -136,7 +149,7 @@
 		</where>
 	</sql>
 	<select id="queryStudentGoodsOrders" resultMap="StudentGoodsSellDto">
-		SELECT spo.*,sgs.goods_json_,sgs.total_amount_,sgs.market_amount_,su.username_,sgs.author_user_
+		SELECT spo.*,sgs.goods_json_,sgs.total_amount_,sgs.market_amount_,su.username_,sgs.author_user_,sgs.goods_type_
 		FROM student_payment_order spo
 		LEFT JOIN student_goods_sell sgs ON spo.order_no_ = sgs.order_no_
 		LEFT JOIN sys_user su ON sgs.user_id_ = su.id_

+ 1 - 1
mec-biz/src/main/resources/config/mybatis/StudentPaymentOrderMapper.xml

@@ -507,7 +507,7 @@
         WHERE status_ = #{status,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}
           AND payment_channel_ = #{paymentChannel}
     <!--  商城订单由商城控制订单超时      -->
-        and group_type_ = 'MALL_SELL' and type_ = 'MALL_BUY'
+        and group_type_ != 'MALL_SELL' and type_ != 'MALL_BUY'
     </select>
 
     <!-- 查询支付中超时订单 -->

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

@@ -5,6 +5,7 @@ import com.ym.mec.common.entity.HttpResponseResult;
 import com.ym.mec.common.entity.MallCreateOrderModel;
 import com.ym.mec.common.entity.OrderCancelModel;
 import com.ym.mec.common.page.QueryInfo;
+import com.ym.mec.thirdparty.adapay.entity.BaseResult;
 import com.ym.mec.thirdparty.adapay.entity.HfMerchantConfig;
 import com.ym.mec.web.fallback.WebFeignServiceFallback;
 import org.springframework.cloud.openfeign.FeignClient;
@@ -51,4 +52,17 @@ public interface WebFeignService {
 
 	@PostMapping("/api/cancelOrder")
 	HttpResponseResult<OrderCancelModel> cancelOrder(@RequestParam("orderNo") String orderNo);
+
+
+
+	@PostMapping("/api/mallSaveOrderInfo")
+	HttpResponseResult<Map> mallSaveOrderInfo(@RequestBody MallCreateOrderModel model);
+
+	// 商城获取 退款数据
+	@GetMapping("/api/getRefundInfo")
+	HttpResponseResult<Map<String,String>> getBaseUrl(@RequestParam("orderNo") String orderNo);
+
+	// 商城获取 退款数据
+	@GetMapping("/api/refund")
+	public HttpResponseResult<BaseResult<Map<String, Object>>> refund(@RequestParam Map<String,Object> refundInfo);
 }

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

@@ -4,6 +4,7 @@ import com.ym.mec.common.entity.HttpResponseResult;
 import com.ym.mec.common.entity.MallCreateOrderModel;
 import com.ym.mec.common.entity.OrderCancelModel;
 import com.ym.mec.common.page.QueryInfo;
+import com.ym.mec.thirdparty.adapay.entity.BaseResult;
 import com.ym.mec.thirdparty.adapay.entity.HfMerchantConfig;
 import org.springframework.stereotype.Component;
 
@@ -75,4 +76,19 @@ public class WebFeignServiceFallback implements WebFeignService {
 	public HttpResponseResult<OrderCancelModel> cancelOrder(String orderNo) {
 		return null;
 	}
+
+	@Override
+	public HttpResponseResult<Map> mallSaveOrderInfo(MallCreateOrderModel model) {
+		return null;
+	}
+
+	@Override
+	public HttpResponseResult<Map<String, String>> getBaseUrl(String orderNo) {
+		return null;
+	}
+
+	@Override
+	public HttpResponseResult<BaseResult<Map<String, Object>>> refund(Map<String, Object> refundInfo) {
+		return null;
+	}
 }

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

@@ -19,8 +19,30 @@ public class MallCreateOrderModel {
 
     private List<Integer> couponIdList;
 
+    // 需要购买的人
     private Integer userId;
 
+    // 代购人id
+    private Integer teacherId;
+
+    private String orderInfo;
+
+    public String getOrderInfo() {
+        return orderInfo;
+    }
+
+    public void setOrderInfo(String orderInfo) {
+        this.orderInfo = orderInfo;
+    }
+
+    public Integer getTeacherId() {
+        return teacherId;
+    }
+
+    public void setTeacherId(Integer teacherId) {
+        this.teacherId = teacherId;
+    }
+
     public String getOldOrderNo() {
         return oldOrderNo;
     }

+ 52 - 0
mec-mall/mall-common/src/main/java/com/yonge/cooleshow/mall/common/enums/TradeStatusEnum.java

@@ -0,0 +1,52 @@
+package com.yonge.cooleshow.mall.common.enums;
+
+import com.baomidou.mybatisplus.annotation.EnumValue;
+import com.ym.mec.common.enums.BaseEnum;
+
+/**
+ * 交易状态 pending 交易处理中 succeeded 交易成功 failed 交易失败
+ *
+ * @Author: liweifan
+ * @Data: 2022/3/31 14:59
+ */
+public enum TradeStatusEnum implements BaseEnum<String, TradeStatusEnum> {
+    pending("交易处理中"),
+    succeeded("交易成功"),
+    failed("交易失败"),
+    close("交易关闭");
+
+    @EnumValue
+    private String code;
+    private String msg;
+
+    TradeStatusEnum(String msg) {
+        this.code = this.name();
+        this.msg = msg;
+    }
+
+    public void setCode(String code) {
+        this.code = code;
+    }
+
+    public String getMsg() {
+        return msg;
+    }
+
+    public void setMsg(String msg) {
+        this.msg = msg;
+    }
+
+    @Override
+    public String getCode() {
+        return this.code;
+    }
+
+    public static TradeStatusEnum getByName(String name) {
+        for (TradeStatusEnum statusEnum : TradeStatusEnum.values()) {
+            if (statusEnum.getCode().equals(name)) {
+                return statusEnum;
+            }
+        }
+        return null;
+    }
+}

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

@@ -42,4 +42,6 @@ public interface UserOrderRefundMapper {
     UserOrderRefund selectByRefundNo(@Param("refundOrderNo") String refundOrderNo);
 
     UserOrderRefund selectByPayOrderNo( @Param("payOrderNo") String payOrderNo);
+
+    UserOrderRefund selectByPayTansNo(@Param("payTransNo") String payTransNo);
 }

+ 7 - 0
mec-mall/mall-mbg/src/main/resources/config/mybatis/UserOrderRefundMapper.xml

@@ -364,4 +364,11 @@
     from user_order_refund
     where #{payOrderNo} = pay_order_no_   and status_ = 'succeeded'
   </select>
+
+  <select id="selectByPayTansNo" resultMap="BaseResultMap">
+    select
+    <include refid="Base_Column_List" />
+    from user_order_refund
+    where #{payTransNo} = pay_trans_no_ limit 1
+  </select>
 </mapper>

+ 2 - 2
mec-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/config/ResourceServerConfig.java

@@ -26,8 +26,8 @@ public class ResourceServerConfig extends ResourceServerConfigurerAdapter {
         http.csrf().disable().exceptionHandling().accessDeniedHandler(baseAccessDeniedHandler).authenticationEntryPoint(baseAuthenticationEntryPoint).and()
             .authorizeRequests().antMatchers("/task/**").hasIpAddress("0.0.0.0/0")
                 .and()
-                .authorizeRequests().antMatchers("/wechat/*","/v2/api-docs", "/code/*","/payment/callback",
-                 "/order/paySuccess/test","/order/cancelUserOrder/test","/open/**","/task/**")
+                .authorizeRequests().antMatchers("/wechat/*","/v2/api-docs", "/code/*","/payment/callback","/order/adapayNo/list",
+                 "/order/paySuccess/test","/order/cancelUserOrder/test","/open/**","/task/**","/order/detail/sn/**","/cart/addAll","/order/generateOrder")
             .permitAll().anyRequest().authenticated().and().httpBasic();
     }
 

+ 9 - 0
mec-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/controller/OmsCartItemController.java

@@ -64,9 +64,18 @@ public class OmsCartItemController {
                 lock.unlock();
             }
         }
+    }
+
+    @ApiOperation("批量添加商品到购物车")
+    @RequestMapping(value = "/addAll", method = RequestMethod.POST)
+    @ResponseBody
+    public CommonResult<List<OmsCartItem>> addAll(@RequestBody List<OmsCartItem> cartItemList) {
 
+        List<OmsCartItem> omsCartItem = cartItemService.addAll(cartItemList);
+        return CommonResult.success(omsCartItem);
     }
 
+
     @ApiOperation("获取当前会员的购物车列表")
     @RequestMapping(value = "/list", method = RequestMethod.GET)
     @ResponseBody

+ 37 - 3
mec-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/controller/OmsPortalOrderController.java

@@ -7,10 +7,14 @@ import com.yonge.cooleshow.mall.common.enums.OrderCacheEnum;
 import com.yonge.cooleshow.mall.common.util.DistributedLock;
 import com.yonge.cooleshow.mall.common.util.StringUtil;
 import com.yonge.cooleshow.mbg.model.OmsOrder;
+import com.yonge.cooleshow.mbg.model.UmsMember;
+import com.yonge.cooleshow.mbg.model.UserOrderPayment;
 import com.yonge.cooleshow.portal.domain.ConfirmOrderResult;
 import com.yonge.cooleshow.portal.domain.OmsOrderDetail;
 import com.yonge.cooleshow.portal.domain.OrderParam;
 import com.yonge.cooleshow.portal.service.OmsPortalOrderService;
+import com.yonge.cooleshow.portal.service.UmsMemberService;
+import com.yonge.cooleshow.portal.service.UserOrderPaymentService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiImplicitParam;
 import io.swagger.annotations.ApiOperation;
@@ -35,8 +39,11 @@ import java.util.concurrent.TimeUnit;
 public class OmsPortalOrderController {
     @Autowired
     private OmsPortalOrderService portalOrderService;
+    @Autowired
+    private UmsMemberService memberService;
 
-
+    @Autowired
+    private UserOrderPaymentService userOrderPaymentService;
 
     @Value("${message.debugMode}")
     private boolean debugMode;
@@ -75,6 +82,17 @@ public class OmsPortalOrderController {
         return CommonResult.success(result, "下单成功");
     }
 
+
+    @ApiOperation("根据购物车信息生成订单")
+    @RequestMapping(value = "/teacher/generateOrder", method = RequestMethod.POST)
+    @ResponseBody
+    public CommonResult teacherGenerateOrder(@RequestBody OrderParam orderParam) {
+        UmsMember currentMember = memberService.getCurrentMember();
+        orderParam.setTeacherId(currentMember.getId());
+        Map<String, Object> result = portalOrderService.generateOrder(orderParam);
+        return CommonResult.success(result, "下单成功");
+    }
+
     @ApiOperation("用户支付成功的回调")
     @RequestMapping(value = "/paySuccess", method = RequestMethod.POST)
     @ResponseBody
@@ -91,6 +109,15 @@ public class OmsPortalOrderController {
         return CommonResult.success(null);
     }
 
+
+    @ApiOperation("根据订单号查询订单信息")
+    @RequestMapping(value = "/adapayNo/list", method = RequestMethod.POST)
+    @ResponseBody
+    public List<OmsOrderDetail> cancelTimeOutOrder(@RequestBody List<String> adapayNoList) {
+        List<OmsOrderDetail> result =  portalOrderService.list(adapayNoList);
+        return result;
+    }
+
     @ApiOperation("按状态分页获取用户订单列表")
     @ApiImplicitParam(name = "status", value = "订单状态:-1->全部;0->待付款;1->待发货;2->已发货;3->已完成;4->已关闭",
             defaultValue = "-1", allowableValues = "-1,0,1,2,3,4", paramType = "query", dataType = "string")
@@ -175,8 +202,15 @@ public class OmsPortalOrderController {
         DistributedLock.of(redissonClient)
                        .runIfLockCanGet(OrderCacheEnum.LOCK_ORDER_NO_MALL.getRedisKey(omsOrder.getOrderSn())
                                , () -> {
-                                       if (omsOrder.getStatus() == 0 || omsOrder.getStatus() == 6) {
-                                           portalOrderService.paymentSucceededHandle(omsOrder.getOrderSn(),omsOrder.getPayAmount(),"wx_pub");
+                                       if (true) {
+
+                                           UserOrderPayment orderPayment = userOrderPaymentService.getByOrderNoAndStatusPaying(
+                                                   omsOrder.getOrderSn());
+                                           if (orderPayment == null) {
+                                               throw new BizException("未找到支付信息");
+                                           }
+
+                                           portalOrderService.paymentSucceededHandle(orderPayment.getAdapayNo(),omsOrder.getPayAmount(),"wx_pub");
 
                                        } else {
                                            throw new BizException("订单已支付或已取消");

+ 8 - 28
mec-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/controller/PaymentController.java

@@ -51,34 +51,6 @@ public class PaymentController extends BaseController {
     @Autowired
     private RedissonClient redissonClient;
 
-    // 调用管乐迷里的
-    // @ApiOperation(value = "订单付款")
-    // @PostMapping("/orderPay")
-    public HttpResponseResult<OrderPayRes> orderPay(@Valid @RequestBody Map payReq, HttpServletRequest request) {
-        SysUser user = sysUserFeignService.queryUserInfo();
-        if (user == null || null == user.getId()) {
-            return failed(HttpStatus.FORBIDDEN, "请登录");
-        }
-        String orderNo = MapUtil.getStr(payReq,"orderNo");
-
-        RLock lock = redissonClient.getLock(OrderCacheEnum.LOCK_ORDER_NO_MALL.getRedisKey(orderNo));
-        try {
-            boolean b = lock.tryLock(60, TimeUnit.SECONDS);
-            if (b) {
-                return orderService.orderPay(payReq);
-            }
-            return failed("请求超时");
-        } catch (BizException e) {
-            return failed(e.getMessage());
-        } catch (Exception e) {
-            e.printStackTrace();
-            return failed("付款失败");
-        } finally {
-            if (lock.getHoldCount()>0) {
-                lock.unlock();
-            }
-        }
-    }
 
 
     /***
@@ -130,7 +102,15 @@ public class PaymentController extends BaseController {
                                 orderService.paymentFailedHandle(dataObj.getString("order_no"),notifyMap);
 
                                 break;
+                            case "refund.succeeded" :
+
+                                orderService.paymentRefundSucceededHandle(dataObj.getString("payment_id")
+                                                ,dataObj.getString("refund_amt"),dataObj.getString("id"),dataObj.getString("fee_amt"));
+                                break;
+                            case "refund.failed" :
 
+                                orderService.paymentRefundFailedHandle(dataObj.getString("payment_id")
+                                        ,dataObj.getString("error_msg"),dataObj.getString("id"));
                             default:
                                 break;
                         }

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

@@ -1,5 +1,6 @@
 package com.yonge.cooleshow.portal.dao;
 
+import com.yonge.cooleshow.mbg.model.OmsOrder;
 import com.yonge.cooleshow.mbg.model.OmsOrderItem;
 import com.yonge.cooleshow.portal.domain.OmsOrderDetail;
 import org.apache.ibatis.annotations.Param;
@@ -38,4 +39,6 @@ public interface PortalOrderDao {
     int releaseSkuStockLock(@Param("itemList") List<OmsOrderItem> orderItemList);
 
     int releaseProductStockLock(@Param("itemList") List<OmsOrderItem> orderItemList);
+
+    List<OmsOrder> listByAdapayNo(@Param("alapayNoList") List<String> alapayNoList, @Param("adapayNos") String adapayNos);
 }

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

@@ -28,12 +28,22 @@ public class OrderParam {
     @ApiModelProperty("订单金额")
     private BigDecimal orderAmount;
 
-    @ApiModelProperty("代码用户id")
+    @ApiModelProperty("代码用户id 需要代买时传购买用户id")
     private Long  userId;
 
-    @ApiModelProperty("订单号 ")
+    private Long teacherId;
+
+    @ApiModelProperty("订单号 重复支付传订单号")
     private String orderNo;
 
+    public Long getTeacherId() {
+        return teacherId;
+    }
+
+    public void setTeacherId(Long teacherId) {
+        this.teacherId = teacherId;
+    }
+
     public String getOrderNo() {
         return orderNo;
     }

+ 6 - 0
mec-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/OmsCartItemService.java

@@ -59,4 +59,10 @@ public interface OmsCartItemService {
     int clear(Long memberId);
 
     OmsCartItem get(Long id);
+
+    /**
+     * 添加购物车
+     */
+    @Transactional
+    List<OmsCartItem> addAll(List<OmsCartItem> cartItemList);
 }

+ 11 - 8
mec-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/OmsPortalOrderService.java

@@ -78,14 +78,6 @@ public interface OmsPortalOrderService {
     void deleteOrder(Long orderId);
 
     /**
-     * 订单拉起支付
-     *
-     * @param payReq 支付信息
-     * @return
-     */
-    @Transactional
-    HttpResponseResult orderPay(Map payReq) throws Exception;
-    /**
      * 获取订单信息
      *
      * @param orderId 订单号
@@ -113,4 +105,15 @@ public interface OmsPortalOrderService {
     void paymentSucceededHandle(String orderNo, BigDecimal payAmount, String payChannel);
 
     void paymentFailedHandle(String orderNo, Map<String, Object> notifyMap);
+
+    /**
+     * 根据支付订单号查询订单列表
+     */
+    List<OmsOrderDetail> list(List<String> adapayNoList);
+
+    @Transactional
+    void paymentRefundSucceededHandle(String payTransNo, String refundAmount, String refundTransNo,String feeAmt);
+
+    @Transactional
+    void paymentRefundFailedHandle(String payTransNo, String msg, String refundTransNo);
 }

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

@@ -0,0 +1,47 @@
+package com.yonge.cooleshow.portal.service;
+
+import com.yonge.cooleshow.mbg.model.UserOrderPayment;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+
+/**
+ * Description
+ *
+ * @author liujunchi
+ * @date 2022-04-24
+ */
+public interface UserOrderPaymentService {
+
+    /**
+     * 保存订单记录
+     *
+     * @param userOrderPayment
+     */
+    @Transactional
+    void save(UserOrderPayment userOrderPayment);
+
+    @Transactional
+    void saveOrUpdate(UserOrderPayment userOrderPayment);
+
+    /**
+     * 根据订单查询 订单支付信息
+     *
+     * @param orderSn 订单号
+     * @return
+     */
+    List<UserOrderPayment> getByOrderNo(String orderSn);
+
+    /**
+     * 查询支付中的订单, 最多只有一个
+     *
+     * @param orderSn
+     * @return
+     */
+    UserOrderPayment getByOrderNoAndStatusPaying(String orderSn);
+
+    /**
+     * 查询回调支付信息
+     */
+    UserOrderPayment getByAdapayNo(String paymentNo);
+}

+ 19 - 1
mec-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/impl/OmsCartItemServiceImpl.java

@@ -46,7 +46,15 @@ public class OmsCartItemServiceImpl implements OmsCartItemService {
 
     @Override
     public OmsCartItem add(OmsCartItem cartItem) {
-        UmsMember currentMember =memberService.getCurrentMember();
+        UmsMember currentMember;
+        if(cartItem.getMemberId() != null) {
+            currentMember = memberService.getById(cartItem.getMemberId());
+            if (currentMember == null) {
+                throw new BizException("未找到用户信息");
+            }
+        } else {
+            currentMember = memberService.getCurrentMember();
+        }
         cartItem.setMemberId(currentMember.getId());
         cartItem.setMemberNickname(currentMember.getNickname());
         cartItem.setDeleteStatus(0);
@@ -228,4 +236,14 @@ public class OmsCartItemServiceImpl implements OmsCartItemService {
     public OmsCartItem get(Long id) {
         return cartItemMapper.selectByPrimaryKey(id);
     }
+
+    @Override
+    public List<OmsCartItem> addAll(List<OmsCartItem> cartItemList) {
+        List<OmsCartItem> result = new ArrayList<>();
+        for (OmsCartItem omsCartItem : cartItemList) {
+            OmsCartItem cartItem = add(omsCartItem);
+            result.add(cartItem);
+        }
+        return result;
+    }
 }

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

@@ -3,15 +3,19 @@ package com.yonge.cooleshow.portal.service.impl;
 import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.map.MapUtil;
+import com.alibaba.fastjson.JSON;
 import com.github.pagehelper.PageHelper;
 import com.ym.mec.common.entity.HttpResponseResult;
 import com.ym.mec.common.entity.MallCreateOrderModel;
 import com.ym.mec.common.entity.OrderCancelModel;
 import com.ym.mec.common.exception.BizException;
 import com.ym.mec.common.service.IdGeneratorService;
+import com.ym.mec.thirdparty.adapay.Payment;
+import com.ym.mec.thirdparty.adapay.entity.BaseResult;
 import com.ym.mec.web.WebFeignService;
 import com.yonge.cooleshow.mall.common.api.CommonPage;
 import com.yonge.cooleshow.mall.common.enums.OrderCacheEnum;
+import com.yonge.cooleshow.mall.common.enums.TradeStatusEnum;
 import com.yonge.cooleshow.mall.common.exception.Asserts;
 import com.yonge.cooleshow.mall.common.service.RedisService;
 import com.yonge.cooleshow.mall.common.util.DistributedLock;
@@ -74,6 +78,9 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
     private PortalOrderDao portalOrderDao;
 
     @Autowired
+    private UserOrderRefundMapper userOrderRefundMapper;
+
+    @Autowired
     private IdGeneratorService idGeneratorService;
 
     @Autowired
@@ -90,6 +97,9 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
     @Autowired
     private RedissonClient redissonClient;
 
+    @Autowired
+    private UserOrderPaymentService userOrderPaymentService;
+
 
     @Autowired
     private PortalProductDao productDao;
@@ -127,22 +137,21 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
             // 订单号不为空 先删除订单  在重新创建订单
             OmsOrderDetail detail = detail(orderParam.getOrderNo());
             if (detail != null && detail.getStatus() == 0) {
-                detail.setStatus(4);
-                orderMapper.updateByPrimaryKeySelective(detail);
-                // 另外生成一个订单
-                detail.setId(null);
-                detail.setStatus(0);
-                detail.setOrderSn(orderSn);
-                List<OmsOrderItem> orderItemList = detail.getOrderItemList();
-                orderMapper.insert(detail);
-                for (OmsOrderItem omsOrderItem : orderItemList) {
-                    omsOrderItem.setId(null);
-                    omsOrderItem.setOrderSn(detail.getOrderSn());
-                    omsOrderItem.setOrderId(detail.getId());
-                }
-                orderItemDao.insertList(orderItemList);
+                // 取消原有的订单支付
+                UserOrderPayment userOrderPayment = userOrderPaymentService.getByOrderNoAndStatusPaying(
+                        orderParam.getOrderNo());
+                userOrderPayment.setStatus(TradeStatusEnum.close.getCode());
+
+                String oldOrderNo = userOrderPayment.getAdapayNo();
+                userOrderPaymentService.saveOrUpdate(userOrderPayment);
 
-                return feignMecCreateOrder(order.getCouponId(),orderParam.getOrderNo(), orderSn, detail.getMemberId(), detail.getTotalAmount());
+                // 增加一个支付中的记录
+                userOrderPayment.setStatus(TradeStatusEnum.pending.getCode());
+                userOrderPayment.setAdapayNo(orderSn);
+                userOrderPayment.setId(null);
+                userOrderPaymentService.saveOrUpdate(userOrderPayment);
+
+                return feignMecCreateOrder(order.getCouponId(), oldOrderNo, orderSn, null, detail.getMemberId().intValue(), detail.getTotalAmount());
             } else {
                 throw new BizException("订单信息获取失败");
             }
@@ -154,9 +163,11 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
         }
         List<OmsOrderItem> orderItemList = new ArrayList<>();
         //获取购物车及优惠信息
-        UmsMember currentMember = memberService.getCurrentMember();
+        UmsMember currentMember;
         if (orderParam.getUserId() != null && orderParam.getUserId() > 0) {
             currentMember = memberService.getById(orderParam.getUserId());
+        } else {
+            currentMember =  memberService.getCurrentMember();
         }
 
         List<CartPromotionItem> cartPromotionItemList = cartItemService.listPromotion(currentMember.getId(),
@@ -190,7 +201,8 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
 
         BigDecimal amount = calcTotalAmount(orderItemList);
 
-        Map data = feignMecCreateOrder(orderParam.getCouponId(),orderParam.getOrderNo(), orderSn, currentMember.getId(), amount);
+        Map data = feignMecCreateOrder(orderParam.getCouponId(),orderParam.getOrderNo(), orderSn,
+                                       orderParam.getTeacherId()==null?null:orderParam.getTeacherId().intValue(), currentMember.getId().intValue(), amount);
 
         BigDecimal couponAmount = MapUtil.get(data, "mallCouponAmount", BigDecimal.class);
         if (couponAmount == null) {
@@ -340,20 +352,48 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
         Map<String, Object> result = new HashMap<>();
         result.put("order", order);
         result.put("orderItemList", orderItemList);
+        result.put("orderType","paying");
+
+        // 创建订单时,创建一条用户支付订单信息  金额信息不做处理
+        UserOrderPayment userOrderPayment = new UserOrderPayment();
+        userOrderPayment.setOpenType("ADAPAY");
+        userOrderPayment.setPaymentClient(orderParam.getPlatformType());
+        userOrderPayment.setOrderNo(order.getOrderSn());
+        userOrderPayment.setAdapayNo(order.getOrderSn());
+        userOrderPayment.setStatus(TradeStatusEnum.pending.getCode());
+
         if (order.getPayAmount().compareTo(BigDecimal.ZERO) == 0) {
             paySuccess(order.getId(),order.getPayType());
             order.setStatus(1);
+            result.put("orderType","success");
+            userOrderPayment.setStatus(TradeStatusEnum.succeeded.getCode());
         }
+        userOrderPaymentService.save(userOrderPayment);
         result.put("pay",data);
+
+        // 保存商品信息到管乐迷
+        OmsOrderDetail detail = detail(order.getOrderSn());
+
+        MallCreateOrderModel model = new MallCreateOrderModel();
+        model.setOrderNo(order.getOrderSn());
+        model.setOrderInfo(JSON.toJSONString(detail));
+        HttpResponseResult<Map> mapHttpResponseResult = webFeignService.mallSaveOrderInfo(model);
+        if (!mapHttpResponseResult.getStatus()) {
+            throw new BizException(mapHttpResponseResult.getMsg());
+        }
+
         return result;
     }
 
-    private Map feignMecCreateOrder(String couponId,String oldOrderNo, String orderSn, Long userId, BigDecimal amount) {
+    private Map feignMecCreateOrder(String couponId, String oldOrderNo, String orderSn, Integer teacherId, Integer userId, BigDecimal amount) {
         // 远程调用管乐迷订单记录
         MallCreateOrderModel model = new MallCreateOrderModel();
         model.setAmount(amount);
         model.setOrderNo(orderSn);
-        model.setUserId(userId.intValue());
+        if (!userId.equals(teacherId)) {
+            model.setTeacherId(teacherId);
+        }
+        model.setUserId(userId);
         model.setCouponIdList(StringUtil.toIntegerList(couponId));
         model.setOldOrderNo(oldOrderNo);
         HttpResponseResult<Map> mapHttpResponseResult = webFeignService.mallCreateOrder(model);
@@ -459,19 +499,22 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
         }
         OmsOrder cancelOrder = cancelOrderList.get(0);
         if (cancelOrder != null && (cancelOrder.getStatus() == 0 || cancelOrder.getStatus() == 6)) {
-
-            HttpResponseResult<OrderCancelModel> responseResult = webFeignService.cancelOrder(cancelOrder.getOrderSn());
-            if (!responseResult.getStatus()) {
-                throw new BizException("远程取消失败");
-            }
-            OrderCancelModel data = responseResult.getData();
-            if (!data.getSuccess()) {
-                throw new BizException("远程取消失败");
-            }
-            if (data.getStatus()) {
-                LOG.info("订单支付成功,修改订单状态");
-                orderSuccess(cancelOrder,cancelOrder.getPayAmount(),data.getPayChannel());
-                return;
+            UserOrderPayment userOrderPayment = userOrderPaymentService.getByOrderNoAndStatusPaying(
+                    cancelOrder.getOrderSn());
+            if (userOrderPayment != null) {
+                HttpResponseResult<OrderCancelModel> responseResult = webFeignService.cancelOrder(userOrderPayment.getAdapayNo());
+                if (!responseResult.getStatus()) {
+                    throw new BizException("远程取消失败");
+                }
+                OrderCancelModel data = responseResult.getData();
+                if (!data.getSuccess()) {
+                    throw new BizException("远程取消失败");
+                }
+                if (data.getStatus()) {
+                    LOG.info("订单支付成功,修改订单状态");
+                    orderSuccess(cancelOrder, cancelOrder.getPayAmount(), data.getPayChannel());
+                    return;
+                }
             }
 
             //修改订单状态为取消
@@ -627,22 +670,7 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
         }
     }
 
-    @Override
-    @Transactional
-    public HttpResponseResult orderPay(Map payReq) {
 
-        String orderNo = MapUtil.getStr(payReq,"orderNo");
-        OmsOrderDetail detail = detail(orderNo);
-        if (detail == null) {
-            throw new BizException("订单不存在");
-        }
-        if (detail.getStatus() != 0 && detail.getStatus() != 6) {
-            throw new BizException("订单已付款或已关闭");
-        }
-
-        // 远程调用支付接口
-        return webFeignService.executePayment(payReq);
-    }
 
 
     @Override
@@ -741,23 +769,79 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
     @Transactional
     public void paymentSucceededHandle(String orderNo, BigDecimal payAmount, String payChannel) {
         //订单完成
-        OmsOrderDetail detail = detail(orderNo);
+        UserOrderPayment orderPayment = userOrderPaymentService.getByAdapayNo(orderNo);
+        if (orderPayment == null) {
+            throw new BizException("订单支付信息未找到");
+        }
+        OmsOrderDetail detail = detail(orderPayment.getOrderNo());
         if (detail.getStatus() == 0) {
             orderSuccess(detail, payAmount, payChannel);
+
+            orderPayment.setStatus(TradeStatusEnum.succeeded.getCode());
+            userOrderPaymentService.saveOrUpdate(orderPayment);
             Map<String,Object> notifyMap = new HashMap<>();
             notifyMap.put("channelType", payChannel);
             notifyMap.put("tradeState", "1");
             notifyMap.put("totalMoney", payAmount);
-            notifyMap.put("merOrderNo", orderNo);
+            notifyMap.put("merOrderNo",orderNo);
             HttpResponseResult httpResponseResult = webFeignService.updateOrder(notifyMap);
             if (!httpResponseResult.getStatus()) {
                 throw new BizException(httpResponseResult.getMsg());
             }
         } else {
             LOG.error("汇付支付回调,订单状态异常。 req is {}", detail.getOrderSn());
+
+
+            orderRefund(orderPayment,detail.getPayAmount().toString());
         }
+
     }
 
+    /**
+     * 支付成功,业务退款
+     */
+    private void orderRefund(UserOrderPayment userOrderPayment,String refundAmount) {
+        UserOrderRefund userOrderRefund = userOrderRefundMapper.selectByPayOrderNo(userOrderPayment.getAdapayNo());
+        if (userOrderRefund != null && userOrderRefund.getStatus().equals("succeeded")) {
+            LOG.warn("支付金额已退回");
+            return;
+        }
+
+        String orderSn = generateOrderSn();
+
+        HttpResponseResult<Map<String,String>> httpResponseResult = webFeignService.getBaseUrl(userOrderPayment.getAdapayNo());
+        if (!httpResponseResult.getStatus()) {
+            throw new BizException("获取回调路径失败");
+        }
+        Map<String, String> data = httpResponseResult.getData();
+        String baseUrl = MapUtil.getStr(data,"baseUrl");
+        String transNo = MapUtil.getStr(data,"transNo");
+        // 金额退回
+        Map<String, Object> refundParams = new HashMap<>(10);
+        refundParams.put("refund_amt", refundAmount);
+        refundParams.put("refund_order_no", orderSn);
+        refundParams.put("notify_url",baseUrl + "/api-mall-portal/payment/callback");
+        refundParams.put("transNo",transNo);
+        HttpResponseResult<BaseResult<Map<String, Object>>> refund = webFeignService.refund(refundParams);
+        if (!refund.getStatus()) {
+            throw new BizException("退款失败");
+        }
+        BaseResult<Map<String, Object>> mapBaseResult = refund.getData();
+        userOrderRefund = new UserOrderRefund();
+        userOrderRefund.setOrderNo(orderSn);
+        userOrderRefund.setPayTransNo(transNo);
+        userOrderRefund.setRefundAmt(new BigDecimal(refundAmount));
+        userOrderRefund.setPayOrderNo(userOrderPayment.getOrderNo());
+        if (mapBaseResult.getStatus()) {
+            Map<String,Object> refundBill = mapBaseResult.getData();
+            userOrderRefund.setRefundAmt(new BigDecimal(MapUtil.getStr(refundBill,"refund_amt")));
+            userOrderRefund.setStatus(TradeStatusEnum.pending.getCode());
+        } else {
+            userOrderRefund.setStatus(TradeStatusEnum.failed.getCode());
+            userOrderRefund.setPayFailMsg("退款失败:" +mapBaseResult.getMsg());
+        }
+        userOrderRefundMapper.insert(userOrderRefund);
+    }
 
     /***
      * 处理回调-支付失败
@@ -768,14 +852,21 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
     @Override
     @Transactional
     public void paymentFailedHandle(String orderNo, Map<String, Object> notifyMap) {
-
-        OmsOrderDetail detail = detail(orderNo);
+        UserOrderPayment orderPayment = userOrderPaymentService.getByAdapayNo(orderNo);
+        if (orderPayment == null) {
+            throw new BizException("订单支付信息未找到");
+        }
+        OmsOrderDetail detail = detail(orderPayment.getOrderNo());
         if (null == detail) {
             LOG.error("汇付支付回调,订单未找到。 req is {}", orderNo);
             throw new BizException("订单未找到");
         }
         if (detail.getStatus() == 0) {
             cancelOrder(detail.getId(), "支付失败");
+
+            // 修改用户付款状态
+            orderPayment.setStatus(TradeStatusEnum.failed.getCode());
+            userOrderPaymentService.saveOrUpdate(orderPayment);
             HttpResponseResult httpResponseResult = webFeignService.updateOrder(notifyMap);
             if (!httpResponseResult.getStatus()) {
                 throw new BizException(httpResponseResult.getMsg());
@@ -785,6 +876,30 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
         }
     }
 
+    @Override
+    public List<OmsOrderDetail> list(List<String> adapayNoList) {
+        String adapayNos = adapayNoList.stream().collect(Collectors.joining(","));
+
+        List<OmsOrder> orderList = portalOrderDao.listByAdapayNo(adapayNoList,adapayNos);
+        //设置数据信息
+        List<Long> orderIds = orderList.stream().map(OmsOrder::getId).collect(Collectors.toList());
+        OmsOrderItemExample orderItemExample = new OmsOrderItemExample();
+        orderItemExample.createCriteria().andOrderIdIn(orderIds);
+        List<OmsOrderItem> orderItemList = orderItemMapper.selectByExample(orderItemExample);
+        List<OmsOrderDetail> orderDetailList = new ArrayList<>();
+        for (OmsOrder omsOrder : orderList) {
+            OmsOrderDetail orderDetail = new OmsOrderDetail();
+            BeanUtil.copyProperties(omsOrder, orderDetail);
+            List<OmsOrderItem> relatedItemList = orderItemList.stream()
+                                                              .filter(item -> item.getOrderId()
+                                                                                  .equals(orderDetail.getId()))
+                                                              .collect(Collectors.toList());
+            orderDetail.setOrderItemList(relatedItemList);
+            orderDetailList.add(orderDetail);
+        }
+        return orderDetailList;
+    }
+
     /**
      * 订单完成
      *
@@ -806,6 +921,44 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
         }
     }
 
+    /**
+     * 退款成功
+     */
+    @Override
+    @Transactional
+    public void paymentRefundSucceededHandle(String payTransNo, String refundAmount, String refundTransNo, String feeAmt) {
+
+        LOG.info("refund payTransNo is {}", payTransNo);
+        if (payTransNo == null) {
+            return;
+        }
+        UserOrderRefund userOrderRefund = userOrderRefundMapper.selectByPayTansNo(payTransNo);
+        userOrderRefund.setArrivalTime(new Date());
+        userOrderRefund.setStatus(TradeStatusEnum.succeeded.getCode());
+        userOrderRefund.setTransNo(refundTransNo);
+        userOrderRefund.setFeeAmt(new BigDecimal(feeAmt));
+        userOrderRefund.setRefundAmt(new BigDecimal(refundAmount));
+
+        userOrderRefundMapper.updateByPrimaryKeySelective(userOrderRefund);
+    }
+
+    /**
+     * 退款失败
+     */
+    @Override
+    @Transactional
+    public void paymentRefundFailedHandle(String payTransNo, String msg, String refundTransNo) {
+        if (payTransNo == null) {
+            return;
+        }
+        UserOrderRefund userOrderRefund = userOrderRefundMapper.selectByPayTansNo(payTransNo);
+        userOrderRefund.setArrivalTime(new Date());
+        userOrderRefund.setStatus(TradeStatusEnum.failed.getCode());
+        userOrderRefund.setPayFailMsg(msg);
+        userOrderRefund.setTransNo(refundTransNo);
+
+        userOrderRefundMapper.updateByPrimaryKeySelective(userOrderRefund);
+    }
 
     /**
      * 生成18位订单编号:8位日期+2位平台号码+2位支付方式+6位以上自增id

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

@@ -74,9 +74,8 @@ public class UmsMemberReceiveAddressServiceImpl implements UmsMemberReceiveAddre
 
     @Override
     public UmsMemberReceiveAddress getItem(Long id) {
-        UmsMember currentMember = memberService.getCurrentMember();
         UmsMemberReceiveAddressExample example = new UmsMemberReceiveAddressExample();
-        example.createCriteria().andMemberIdEqualTo(currentMember.getId()).andIdEqualTo(id);
+        example.createCriteria().andIdEqualTo(id);
         List<UmsMemberReceiveAddress> addressList = addressMapper.selectByExample(example);
         if(!CollectionUtils.isEmpty(addressList)){
             return addressList.get(0);

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

@@ -0,0 +1,56 @@
+package com.yonge.cooleshow.portal.service.impl;
+
+import com.yonge.cooleshow.mbg.mapper.UserOrderPaymentMapper;
+import com.yonge.cooleshow.mbg.model.UserOrderPayment;
+import com.yonge.cooleshow.portal.service.UserOrderPaymentService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * Description
+ *
+ * @author liujunchi
+ * @date 2022-04-24
+ */
+@Service
+public class UserOrderPaymentServiceImpl implements UserOrderPaymentService {
+
+    @Autowired
+    private UserOrderPaymentMapper userOrderPaymentMapper;
+
+
+
+    @Override
+    public void save(UserOrderPayment userOrderPayment) {
+        userOrderPaymentMapper.insert(userOrderPayment);
+    }
+
+    @Override
+    public void saveOrUpdate(UserOrderPayment userOrderPayment) {
+        if (userOrderPayment.getId() == null) {
+            userOrderPaymentMapper.insert(userOrderPayment);
+        } else {
+            userOrderPaymentMapper.updateByPrimaryKeySelective(userOrderPayment);
+        }
+    }
+
+
+    @Override
+    public List<UserOrderPayment> getByOrderNo(String orderSn) {
+        return userOrderPaymentMapper.selectByOrderNo(orderSn);
+    }
+
+
+    @Override
+    public UserOrderPayment getByOrderNoAndStatusPaying(String orderSn) {
+        return userOrderPaymentMapper.selectByOrderNoAndStatusPaying(orderSn);
+    }
+
+    @Override
+    public UserOrderPayment getByAdapayNo(String paymentNo) {
+        return userOrderPaymentMapper.selectByAdapayNo(paymentNo);
+    }
+}

+ 14 - 3
mec-mall/mall-portal/src/main/resources/config/mybatis/PortalOrderDao.xml

@@ -41,10 +41,8 @@
         FROM
             oms_order o
             LEFT JOIN oms_order_item ot ON o.id = ot.order_id
-        left join user_order_payment uop on uop.order_no_ = o.order_sn and uop.status_ = 'pending'
         WHERE
-            (o.status = 6 AND o.create_time &lt; date_add(NOW(), INTERVAL -#{orderMinute} MINUTE))
-            or (o.status = 0 and uop.create_time_ &lt; date_add(NOW(), INTERVAL -#{payMinute} MINUTE));
+            (o.status = 0 AND o.create_time &lt; date_add(NOW(), INTERVAL -#{payMinute} MINUTE))
     </select>
 
     <update id="updateSkuStock">
@@ -108,4 +106,17 @@
             #{item.productId}
         </foreach>
     </update>
+
+    <select id="listByAdapayNo" resultType="com.yonge.cooleshow.mbg.model.OmsOrder">
+        select oo.* from
+        user_order_payment uop
+        left join oms_order oo on oo.order_sn = uop.adapay_no_
+        <where>
+            uop.adapay_no_ in
+            <foreach collection="alapayNoList" separator="," item="item" close=")" open="(" >
+                #{item}
+            </foreach>
+        </where>
+        order by find_in_set(uop.adapay_no_,#{adapayNos})
+    </select>
 </mapper>

+ 1 - 1
mec-student/src/main/java/com/ym/mec/student/controller/StudentOrderController.java

@@ -305,7 +305,7 @@ public class StudentOrderController extends BaseController {
                     orderDetail.put("additionCourseInfo", studentPaymentOrderDetails.get(0).getGoodsIdList());
                 }
             }
-        } else if (orderByOrderNo.getGroupType().equals(GroupType.GOODS_SELL)) {
+        } else if (orderByOrderNo.getGroupType().equals(GroupType.GOODS_SELL)|| orderByOrderNo.getGroupType().equals(GroupType.MALL_SELL)) {
             orderDetail.put("detail", studentGoodsSellDao.getStudentGoodsSellDto(orderNo));
         } else if (orderByOrderNo.getGroupType().equals(GroupType.REPLACEMENT)) {
             orderDetail.put("detail", replacementInstrumentActivityDao.getInfo(Integer.parseInt(orderByOrderNo.getMusicGroupId())));

+ 24 - 0
mec-thirdparty/src/main/java/com/ym/mec/thirdparty/adapay/Payment.java

@@ -5,11 +5,15 @@ import java.util.*;
 
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
+import com.huifu.adapay.core.exception.BaseAdaPayException;
+import com.huifu.adapay.model.Refund;
+import com.ym.mec.thirdparty.adapay.entity.BaseResult;
 import com.ym.mec.thirdparty.adapay.entity.HfMerchantConfig;
 import com.ym.mec.thirdparty.exception.ThirdpartyException;
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.util.CollectionUtils;
 import org.springframework.util.DigestUtils;
 
 public class Payment {
@@ -139,4 +143,24 @@ public class Payment {
         paymentParams.remove("appId");
         return paymentParams;
     }
+
+    public static BaseResult<Map<String ,Object>> refundPayment(Map<String, Object> refundParams) {
+
+        Map<String, Object> res;
+        try {
+            res = Refund.create(refundParams.get("transNo").toString(), refundParams);
+        } catch (BaseAdaPayException e) {
+            return BaseResult.failed(e.getMessage());
+        }
+        if (CollectionUtils.isEmpty(res)) {
+            return BaseResult.failed("请求失败");
+        }
+        LOGGER.info("汇付[支付退款] Resp:{}", res);
+        String errorCode = (String) res.get("error_code");
+        if (null != errorCode) {
+            String errorMsg = (String) res.get("error_msg");
+            return BaseResult.failed(errorMsg);
+        }
+        return BaseResult.succeed(res);
+    }
 }

+ 131 - 0
mec-thirdparty/src/main/java/com/ym/mec/thirdparty/adapay/entity/BaseResult.java

@@ -0,0 +1,131 @@
+package com.ym.mec.thirdparty.adapay.entity;
+
+import org.springframework.http.HttpStatus;
+
+import java.util.Date;
+
+/**
+ * HttpResponse 返回结果
+ */
+public class BaseResult<T> {
+
+	private boolean status = true;
+	private String msg;
+	private T data;
+	private int code;
+	private Date nowTime = new Date();
+
+	public BaseResult(boolean status, int code, T data, String message) {
+		this.status = status;
+		this.msg = message;
+		this.data = data;
+		this.code = code;
+	}
+
+	public BaseResult(boolean status, HttpStatus resultCode, T data, String message) {
+		this.status = status;
+		this.msg = message;
+		this.data = data;
+		this.code = resultCode.value();
+	}
+
+	public BaseResult() {
+	}
+
+	public int getCode() {
+		return code;
+	}
+
+	public void setCode(int code) {
+		this.code = code;
+	}
+
+	public boolean getStatus() {
+		return status;
+	}
+
+	public void setStatus(boolean status) {
+		this.status = status;
+	}
+
+	public String getMsg() {
+		return msg;
+	}
+
+	public void setMsg(String msg) {
+		this.msg = msg;
+	}
+
+	public T getData() {
+		return data;
+	}
+
+	public void setData(T data) {
+		this.data = data;
+	}
+
+	public void success() {
+		this.status = true;
+	}
+
+	public void fail() {
+		this.status = false;
+	}
+
+	public Date getNowTime() {
+		return nowTime;
+	}
+
+	public void setNowTime(Date nowTime) {
+		this.nowTime = nowTime;
+	}
+
+
+	public static <T> BaseResult<T> succeed(T object) {
+		return getResponseData(true, HttpStatus.OK, object, "");
+	}
+
+	public static <T> BaseResult<T> succeed() {
+		return getResponseData(true, HttpStatus.OK, null, "");
+	}
+
+	public static <T> BaseResult<T> succeedData(T obj) {
+		return getResponseData(true, HttpStatus.OK, obj, "操作成功");
+	}
+
+	public static <T> BaseResult<T> warned(String message) {
+		return failed(HttpStatus.MULTI_STATUS, message);
+	}
+
+	public static <T> BaseResult<T> failed() {
+		return failed("");
+	}
+
+	public static <T> BaseResult<T> failed(String msg) {
+		return failed(HttpStatus.INTERNAL_SERVER_ERROR, msg);
+	}
+
+	public static <T> BaseResult<T> failed(HttpStatus statusCode, String msg) {
+		return getResponseData(false, statusCode, null, msg);
+	}
+
+	public static <T> BaseResult<T> failed(HttpStatus statusCode, T data, String msg) {
+		return getResponseData(false, statusCode, data, msg);
+	}
+	public static <T> BaseResult<T> failed(int code, T data, String msg) {
+		return new BaseResult<>(false, code, data, msg);
+	}
+
+	public static <T> BaseResult<T> status(boolean flag) {
+		return flag ? succeed() : failed("操作失败");
+	}
+
+	private static <T> BaseResult<T> getResponseData(boolean status, HttpStatus statusCode, T data, String message) {
+		BaseResult<T> obj = new BaseResult<T>();
+		obj.setStatus(status);
+		obj.setCode(statusCode.value());
+		obj.setData(data);
+		obj.setMsg(message);
+		return obj;
+	}
+}

+ 53 - 26
mec-web/src/main/java/com/ym/mec/web/controller/APIController.java

@@ -1,17 +1,16 @@
 package com.ym.mec.web.controller;
 
-import com.ym.mec.biz.dal.dto.PaymentParam;
 import com.ym.mec.biz.dal.dto.StudentVipGroupShowListDto;
-import com.ym.mec.biz.dal.entity.StudentPaymentOrder;
+import com.ym.mec.biz.dal.entity.*;
 import com.ym.mec.biz.dal.page.StudentVipGroupQueryInfo;
 import com.ym.mec.biz.service.*;
 import com.ym.mec.common.entity.HttpResponseResult;
 import com.ym.mec.common.entity.MallCreateOrderModel;
 import com.ym.mec.common.entity.OrderCancelModel;
+import com.ym.mec.thirdparty.adapay.Payment;
+import com.ym.mec.thirdparty.adapay.entity.BaseResult;
 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.springframework.beans.factory.annotation.Autowired;
@@ -23,12 +22,8 @@ import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.biz.dal.dao.EmployeeDao;
 import com.ym.mec.biz.dal.dao.SysUserCashAccountDao;
 import com.ym.mec.biz.dal.dao.TeacherDao;
-import com.ym.mec.biz.dal.entity.Employee;
-import com.ym.mec.biz.dal.entity.SysUserCashAccount;
-import com.ym.mec.biz.dal.entity.Teacher;
 import com.ym.mec.common.controller.BaseController;
 
-import java.util.Date;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -61,6 +56,9 @@ public class APIController extends BaseController {
 	private VipGroupService vipGroupService;
 
 	@Autowired
+	private SysConfigService sysConfigService;
+
+	@Autowired
 	private StudentPaymentOrderService studentPaymentOrderService;
 
 	@GetMapping("/createCashAccount")
@@ -135,6 +133,7 @@ public class APIController extends BaseController {
 
 
 
+	// 商城创建订单
 	@PostMapping("/mallCreateOrder")
 	public HttpResponseResult<Map> mallCreateOrder(@RequestBody MallCreateOrderModel model) {
 		try {
@@ -145,25 +144,22 @@ public class APIController extends BaseController {
 		}
 	}
 
-	@ApiOperation(value = "台牌支付")
-	@PostMapping("/executePayment")
-	@ApiImplicitParams({
-			@ApiImplicitParam(name = "amount", value = "支付金额", required = true, dataType = "BigDecimal"),
-			@ApiImplicitParam(name = "orderNo", value = "订单号", required = true, dataType = "String"),
-			@ApiImplicitParam(name = "payChannel", value = "支付方式(alipay-支付宝app支付)", required = true, dataType = "String"),
-	})
-	public Object executePayment(@RequestBody PaymentParam paymentParam) {
+
+	// 商城保存订单详情数据
+	@PostMapping("/mallSaveOrderInfo")
+	public HttpResponseResult<Map> mallSaveOrderInfo(@RequestBody MallCreateOrderModel model) {
 		try {
-			Map<String, Object> payment = orderPayOpsService.executePayment(paymentParam);
-			return succeed(payment);
+			studentPaymentOrderService.mallSaveOrderInfo(model);
+			return succeed();
 		} catch (Exception e) {
-			return failed(e.getMessage());
+			e.printStackTrace();
+			return failed();
 		}
 	}
 
-
+	// 商城支付成功/失败修改订单状态
 	@PostMapping("/updateOrder")
-	public HttpResponseResult notify(@RequestBody Map map) {
+	public HttpResponseResult updateOrder(@RequestBody Map map) {
 
 		try {
 			studentPaymentOrderService.updateOrder(map);
@@ -176,10 +172,8 @@ public class APIController extends BaseController {
 
 
 	/**
-	 * 取消订单接口
+	 * 商城取消订单接口
 	 *
-	 * @param orderNo
-	 * @return
 	 */
 	@PostMapping("/cancelOrder")
 	public HttpResponseResult<OrderCancelModel> cancelOrder(@RequestParam String orderNo) {
@@ -192,8 +186,7 @@ public class APIController extends BaseController {
 				cancelModel.setStatus(false);
 				return succeed(cancelModel);
 			}
-			cancelModel = studentPaymentOrderService.updateOrderStatus(new Date(), new HashMap<>(),
-																						 orderByOrderNo, false);
+			cancelModel = studentPaymentOrderService.cancelOrder(orderByOrderNo);
 			return succeed(cancelModel);
 		} catch (Exception e) {
 			e.printStackTrace();
@@ -201,4 +194,38 @@ public class APIController extends BaseController {
 		}
 	}
 
+
+	// 商城获取 退款数据
+	@GetMapping("/getRefundInfo")
+	public HttpResponseResult<Map<String,String>> getBaseUrl(@RequestParam String orderNo) {
+
+		try {
+			SysConfig baseApiUrl = sysConfigService.findByParamName("base_api_url");
+			StudentPaymentOrder orderByOrderNo = studentPaymentOrderService.findOrderByOrderNo(orderNo);
+			Map<String,String> result = new HashMap<>();
+			result.put("transNo",orderByOrderNo.getTransNo());
+			result.put("baseUrl",baseApiUrl.getParanValue());
+			;
+			return succeed(result);
+		} catch (Exception e) {
+			e.printStackTrace();
+			return failed();
+		}
+	}
+
+
+
+	// 商城获取 退款数据
+	@GetMapping("/refund")
+	public HttpResponseResult<BaseResult<Map<String, Object>>> refund(@RequestParam Map<String,Object> refundInfo) {
+
+		try {
+
+			BaseResult<Map<String, Object>> mapBaseResult = Payment.refundPayment(refundInfo);
+			return succeed(mapBaseResult);
+		} catch (Exception e) {
+			e.printStackTrace();
+			return failed();
+		}
+	}
 }