|
@@ -1,6 +1,15 @@
|
|
|
package com.miaxis.order.service.impl;
|
|
|
|
|
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
|
|
+import com.fasterxml.jackson.databind.ObjectMapper;
|
|
|
+import com.github.wxpay.sdk.WXPay;
|
|
|
+import com.github.wxpay.sdk.WXPayConfig;
|
|
|
+import com.github.wxpay.sdk.WXPayConstants;
|
|
|
+import com.github.wxpay.sdk.WXPayUtil;
|
|
|
+import com.miaxis.common.config.AppConfig;
|
|
|
+import com.miaxis.common.config.WxPayConfigImpl;
|
|
|
+import com.miaxis.common.config.WxpayConfig;
|
|
|
+import com.miaxis.common.utils.XmlUtil;
|
|
|
import com.miaxis.exam.domain.ExamInfo;
|
|
|
import com.miaxis.exam.service.IExamInfoService;
|
|
|
import com.miaxis.examvip.domain.VipUserExam;
|
|
@@ -11,21 +20,31 @@ import com.miaxis.newgzpt.domain.GzptUserInfo;
|
|
|
import com.miaxis.newgzpt.domain.GzptUserInfoDel;
|
|
|
import com.miaxis.newgzpt.service.*;
|
|
|
import com.miaxis.order.domain.OrderInfo;
|
|
|
+import com.miaxis.order.domain.OrderSplit;
|
|
|
+import com.miaxis.order.dto.FzConfig;
|
|
|
import com.miaxis.order.dto.QuerySchoolOrderListDTO;
|
|
|
import com.miaxis.order.mapper.OrderInfoMapper;
|
|
|
import com.miaxis.order.service.IOrderInfoService;
|
|
|
+import com.miaxis.order.service.IOrderSplitService;
|
|
|
import com.miaxis.order.vo.OrderIncomeVo;
|
|
|
import com.miaxis.order.vo.QuerySchoolOrderDetailedVo;
|
|
|
import com.miaxis.order.vo.QuerySchoolOrderListVo;
|
|
|
import com.miaxis.userInfo.domain.UserVip;
|
|
|
import com.miaxis.userInfo.service.IUserVipService;
|
|
|
import com.miaxis.wx.domain.WxJsOrder;
|
|
|
+import lombok.extern.slf4j.Slf4j;
|
|
|
+import org.apache.commons.lang3.RandomStringUtils;
|
|
|
import org.springframework.beans.BeanUtils;
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
+import org.springframework.transaction.annotation.Transactional;
|
|
|
|
|
|
import java.util.Date;
|
|
|
import java.util.List;
|
|
|
+import java.util.Map;
|
|
|
+import java.util.TreeMap;
|
|
|
+
|
|
|
+import static com.miaxis.common.utils.OrderCodeFactory.getOrderCode;
|
|
|
|
|
|
/**
|
|
|
* 订单信息Service业务层处理
|
|
@@ -34,6 +53,7 @@ import java.util.List;
|
|
|
* @date 2022-06-01
|
|
|
*/
|
|
|
@Service
|
|
|
+@Slf4j
|
|
|
public class OrderInfoServiceImpl extends ServiceImpl<OrderInfoMapper, OrderInfo> implements IOrderInfoService {
|
|
|
@Autowired
|
|
|
private OrderInfoMapper orderInfoMapper;
|
|
@@ -47,6 +67,8 @@ public class OrderInfoServiceImpl extends ServiceImpl<OrderInfoMapper, OrderInfo
|
|
|
@Autowired
|
|
|
private IGzptUserInfoDelService userInfoDelService;
|
|
|
|
|
|
+ @Autowired
|
|
|
+ private IOrderSplitService orderSplitService;
|
|
|
|
|
|
@Autowired
|
|
|
private IGzptSchActivationService schActivationService;
|
|
@@ -63,6 +85,16 @@ public class OrderInfoServiceImpl extends ServiceImpl<OrderInfoMapper, OrderInfo
|
|
|
@Autowired
|
|
|
private IVipUserExamService vipUserExamService;
|
|
|
|
|
|
+ @Autowired
|
|
|
+ private WxpayConfig wxpayConfig;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private AppConfig appConfig;
|
|
|
+
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private FzConfig fzConfig;
|
|
|
+
|
|
|
/**
|
|
|
* 查询订单信息列表
|
|
|
*
|
|
@@ -95,6 +127,11 @@ public class OrderInfoServiceImpl extends ServiceImpl<OrderInfoMapper, OrderInfo
|
|
|
orderInfo.setLogincode(order.getLogincode());
|
|
|
orderInfo.setOutTradeNo(order.getOutTradeNo());
|
|
|
orderInfo.setTotal(order.getTotal());
|
|
|
+ orderInfo.setIsFz(order.getIsFz());
|
|
|
+ if(order.getIsFz()==1) { //需要分账
|
|
|
+ int amount = (int) Math.floor(orderInfo.getTotal() * 0.3);
|
|
|
+ orderInfo.setFzPrice(amount);
|
|
|
+ }
|
|
|
orderInfo.setTradeType(1);
|
|
|
orderInfo.setSuccessTime(order.getSuccessTime());
|
|
|
orderInfo.setPayType(payType);
|
|
@@ -896,6 +933,98 @@ public class OrderInfoServiceImpl extends ServiceImpl<OrderInfoMapper, OrderInfo
|
|
|
userVipService.save(uv);
|
|
|
this.save(orderInfo);
|
|
|
}
|
|
|
+ } else if ("科一特训包".equals(order.getGoodsName())) {
|
|
|
+ UserVip userVip = userVipService.getUserVipByUserId(order.getUserId());
|
|
|
+ if (userVip != null) {
|
|
|
+ //修改会员信息
|
|
|
+ Date km1SpDate = userVip.getSpSubject1();
|
|
|
+ if (km1SpDate != null && now.compareTo(km1SpDate)<0) { //科目一处理
|
|
|
+ long x = km1SpDate.getTime() + oneYearLong;
|
|
|
+ Date km1oneYear = new Date(x);
|
|
|
+ userVip.setSpSubject1(km1oneYear);
|
|
|
+ } else {
|
|
|
+ long x = now.getTime() + oneYearLong;
|
|
|
+ Date km1oneYear = new Date(x);
|
|
|
+ userVip.setSpSubject1(km1oneYear);
|
|
|
+ }
|
|
|
+ userVipService.updateById(userVip);
|
|
|
+ this.save(orderInfo);
|
|
|
+ } else {
|
|
|
+ //新增会员信息
|
|
|
+ UserVip uv = new UserVip();
|
|
|
+ uv.setUserId(order.getUserId());
|
|
|
+ uv.setUserName(order.getUserName());
|
|
|
+ long x = now.getTime() + oneYearLong;
|
|
|
+ Date oneYear = new Date(x);
|
|
|
+ uv.setSpSubject1(oneYear);
|
|
|
+ userVipService.save(uv);
|
|
|
+ this.save(orderInfo);
|
|
|
+ }
|
|
|
+ } else if ("科四特训包".equals(order.getGoodsName())) {
|
|
|
+ UserVip userVip = userVipService.getUserVipByUserId(order.getUserId());
|
|
|
+ if (userVip != null) {
|
|
|
+ //修改会员信息
|
|
|
+ Date km4SpDate = userVip.getSpSubject4();
|
|
|
+ if (km4SpDate != null && now.compareTo(km4SpDate)<0) { //科目一处理
|
|
|
+ long x = km4SpDate.getTime() + oneYearLong;
|
|
|
+ Date km4oneYear = new Date(x);
|
|
|
+ userVip.setSpSubject4(km4oneYear);
|
|
|
+ } else {
|
|
|
+ long x = now.getTime() + oneYearLong;
|
|
|
+ Date km4oneYear = new Date(x);
|
|
|
+ userVip.setSpSubject4(km4oneYear);
|
|
|
+ }
|
|
|
+ userVipService.updateById(userVip);
|
|
|
+ this.save(orderInfo);
|
|
|
+ } else {
|
|
|
+ //新增会员信息
|
|
|
+ UserVip uv = new UserVip();
|
|
|
+ uv.setUserId(order.getUserId());
|
|
|
+ uv.setUserName(order.getUserName());
|
|
|
+ long x = now.getTime() + oneYearLong;
|
|
|
+ Date oneYear = new Date(x);
|
|
|
+ uv.setSpSubject4(oneYear);
|
|
|
+ userVipService.save(uv);
|
|
|
+ this.save(orderInfo);
|
|
|
+ }
|
|
|
+ } else if ("科一科四特训包".equals(order.getGoodsName())) {
|
|
|
+ UserVip userVip = userVipService.getUserVipByUserId(order.getUserId());
|
|
|
+ if (userVip != null) {
|
|
|
+ //修改会员信息
|
|
|
+ Date km1Date = userVip.getSpSubject1();
|
|
|
+ Date km4Date = userVip.getSpSubject4();
|
|
|
+ if (km1Date != null && now.compareTo(km1Date)<0) { //科目一处理
|
|
|
+ long x = km1Date.getTime() + oneYearLong;
|
|
|
+ Date km1oneYear = new Date(x);
|
|
|
+ userVip.setSpSubject1(km1oneYear);
|
|
|
+ } else {
|
|
|
+ long x = now.getTime() + oneYearLong;
|
|
|
+ Date km1oneYear = new Date(x);
|
|
|
+ userVip.setSpSubject1(km1oneYear);
|
|
|
+ }
|
|
|
+ if (km4Date != null && now.compareTo(km4Date)<0) { //科目四处理
|
|
|
+ long x = km4Date.getTime() + oneYearLong;
|
|
|
+ Date km4oneYear = new Date(x);
|
|
|
+ userVip.setSpSubject4(km4oneYear);
|
|
|
+ } else {
|
|
|
+ long x = now.getTime() + oneYearLong;
|
|
|
+ Date km4oneYear = new Date(x);
|
|
|
+ userVip.setSpSubject4(km4oneYear);
|
|
|
+ }
|
|
|
+ userVipService.updateById(userVip);
|
|
|
+ this.save(orderInfo);
|
|
|
+ } else {
|
|
|
+ //新增会员信息
|
|
|
+ UserVip uv = new UserVip();
|
|
|
+ uv.setUserId(order.getUserId());
|
|
|
+ uv.setUserName(order.getUserName());
|
|
|
+ long x = now.getTime() + oneYearLong;
|
|
|
+ Date oneYear = new Date(x);
|
|
|
+ uv.setSpSubject1(oneYear);
|
|
|
+ uv.setSpSubject4(oneYear);
|
|
|
+ userVipService.save(uv);
|
|
|
+ this.save(orderInfo);
|
|
|
+ }
|
|
|
}
|
|
|
//如果是合作驾校插入消费记录表
|
|
|
int isShare = schPayConfigService.isSchPayConfigByUser(userInfo);
|
|
@@ -966,7 +1095,15 @@ public class OrderInfoServiceImpl extends ServiceImpl<OrderInfoMapper, OrderInfo
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-
|
|
|
+ /**
|
|
|
+ * 目前这个方法苹果支付用
|
|
|
+ * @param goodsName
|
|
|
+ * @param userId
|
|
|
+ * @param userName
|
|
|
+ * @param outTrandeNo
|
|
|
+ * @param total
|
|
|
+ * @param payType
|
|
|
+ */
|
|
|
@Override
|
|
|
public void writeVipDataToDb(String goodsName, Long userId, String userName, String outTrandeNo, Integer total, Integer payType) {
|
|
|
long oneYearLong = 1000 * 60 * 60 * 24 * 365l;
|
|
@@ -1384,6 +1521,98 @@ public class OrderInfoServiceImpl extends ServiceImpl<OrderInfoMapper, OrderInfo
|
|
|
userVipService.save(uv);
|
|
|
this.save(orderInfo);
|
|
|
}
|
|
|
+ } else if ("科一特训包".equals(goodsName)) {
|
|
|
+ UserVip userVip = userVipService.getUserVipByUserId(userId);
|
|
|
+ if (userVip != null) {
|
|
|
+ //修改会员信息
|
|
|
+ Date km1SpDate = userVip.getSpSubject1();
|
|
|
+ if (km1SpDate != null && now.compareTo(km1SpDate)<0) { //科目一处理
|
|
|
+ long x = km1SpDate.getTime() + oneYearLong;
|
|
|
+ Date km1oneYear = new Date(x);
|
|
|
+ userVip.setSpSubject1(km1oneYear);
|
|
|
+ } else {
|
|
|
+ long x = now.getTime() + oneYearLong;
|
|
|
+ Date km1oneYear = new Date(x);
|
|
|
+ userVip.setSpSubject1(km1oneYear);
|
|
|
+ }
|
|
|
+ userVipService.updateById(userVip);
|
|
|
+ this.save(orderInfo);
|
|
|
+ } else {
|
|
|
+ //新增会员信息
|
|
|
+ UserVip uv = new UserVip();
|
|
|
+ uv.setUserId(userId);
|
|
|
+ uv.setUserName(userName);
|
|
|
+ long x = now.getTime() + oneYearLong;
|
|
|
+ Date oneYear = new Date(x);
|
|
|
+ uv.setSpSubject1(oneYear);
|
|
|
+ userVipService.save(uv);
|
|
|
+ this.save(orderInfo);
|
|
|
+ }
|
|
|
+ } else if ("科四特训包".equals(goodsName)) {
|
|
|
+ UserVip userVip = userVipService.getUserVipByUserId(userId);
|
|
|
+ if (userVip != null) {
|
|
|
+ //修改会员信息
|
|
|
+ Date km4SpDate = userVip.getSpSubject4();
|
|
|
+ if (km4SpDate != null && now.compareTo(km4SpDate)<0) { //科目一处理
|
|
|
+ long x = km4SpDate.getTime() + oneYearLong;
|
|
|
+ Date km4oneYear = new Date(x);
|
|
|
+ userVip.setSpSubject4(km4oneYear);
|
|
|
+ } else {
|
|
|
+ long x = now.getTime() + oneYearLong;
|
|
|
+ Date km4oneYear = new Date(x);
|
|
|
+ userVip.setSpSubject4(km4oneYear);
|
|
|
+ }
|
|
|
+ userVipService.updateById(userVip);
|
|
|
+ this.save(orderInfo);
|
|
|
+ } else {
|
|
|
+ //新增会员信息
|
|
|
+ UserVip uv = new UserVip();
|
|
|
+ uv.setUserId(userId);
|
|
|
+ uv.setUserName(userName);
|
|
|
+ long x = now.getTime() + oneYearLong;
|
|
|
+ Date oneYear = new Date(x);
|
|
|
+ uv.setSpSubject4(oneYear);
|
|
|
+ userVipService.save(uv);
|
|
|
+ this.save(orderInfo);
|
|
|
+ }
|
|
|
+ } else if ("科一科四特训包".equals(goodsName)) {
|
|
|
+ UserVip userVip = userVipService.getUserVipByUserId(userId);
|
|
|
+ if (userVip != null) {
|
|
|
+ //修改会员信息
|
|
|
+ Date km1Date = userVip.getSpSubject1();
|
|
|
+ Date km4Date = userVip.getSpSubject4();
|
|
|
+ if (km1Date != null && now.compareTo(km1Date)<0) { //科目一处理
|
|
|
+ long x = km1Date.getTime() + oneYearLong;
|
|
|
+ Date km1oneYear = new Date(x);
|
|
|
+ userVip.setSpSubject1(km1oneYear);
|
|
|
+ } else {
|
|
|
+ long x = now.getTime() + oneYearLong;
|
|
|
+ Date km1oneYear = new Date(x);
|
|
|
+ userVip.setSpSubject1(km1oneYear);
|
|
|
+ }
|
|
|
+ if (km4Date != null && now.compareTo(km4Date)<0) { //科目四处理
|
|
|
+ long x = km4Date.getTime() + oneYearLong;
|
|
|
+ Date km4oneYear = new Date(x);
|
|
|
+ userVip.setSpSubject4(km4oneYear);
|
|
|
+ } else {
|
|
|
+ long x = now.getTime() + oneYearLong;
|
|
|
+ Date km4oneYear = new Date(x);
|
|
|
+ userVip.setSpSubject4(km4oneYear);
|
|
|
+ }
|
|
|
+ userVipService.updateById(userVip);
|
|
|
+ this.save(orderInfo);
|
|
|
+ } else {
|
|
|
+ //新增会员信息
|
|
|
+ UserVip uv = new UserVip();
|
|
|
+ uv.setUserId(userId);
|
|
|
+ uv.setUserName(userName);
|
|
|
+ long x = now.getTime() + oneYearLong;
|
|
|
+ Date oneYear = new Date(x);
|
|
|
+ uv.setSpSubject1(oneYear);
|
|
|
+ uv.setSpSubject4(oneYear);
|
|
|
+ userVipService.save(uv);
|
|
|
+ this.save(orderInfo);
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
}
|
|
@@ -1424,6 +1653,8 @@ public class OrderInfoServiceImpl extends ServiceImpl<OrderInfoMapper, OrderInfo
|
|
|
return orderInfoMapper.getIncomeList(schoolOrderListDTO);
|
|
|
}
|
|
|
|
|
|
+
|
|
|
+
|
|
|
/**
|
|
|
* 退款方法
|
|
|
* @param order
|
|
@@ -1891,4 +2122,124 @@ public class OrderInfoServiceImpl extends ServiceImpl<OrderInfoMapper, OrderInfo
|
|
|
schActivationService.delSchActivationByUserId(userId);
|
|
|
}
|
|
|
|
|
|
+ @Override
|
|
|
+ public List<OrderInfo> selectOrderInfoByWaitProfit() {
|
|
|
+ List<OrderInfo> orderList = orderInfoMapper.selectOrderInfoByWaitProfit();
|
|
|
+ return orderList;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ @Override
|
|
|
+ @Transactional
|
|
|
+ public boolean wxAddFenZhang(OrderInfo orderInfo) throws Exception {
|
|
|
+ //查询上级
|
|
|
+ String url = "https://api.mch.weixin.qq.com/pay/profitsharingaddreceiver";
|
|
|
+
|
|
|
+ String nonceStr = RandomStringUtils.randomAlphanumeric(32);
|
|
|
+ //获取本店铺信息
|
|
|
+
|
|
|
+ //用于签名
|
|
|
+ Map<String, String> sortMap = new TreeMap<String, String>();
|
|
|
+ sortMap.put("mch_id", wxpayConfig.getMerchantId());
|
|
|
+ sortMap.put("appid", appConfig.getAppid());
|
|
|
+ sortMap.put("nonce_str", nonceStr);
|
|
|
+ sortMap.put("sign_type", "HMAC-SHA256");
|
|
|
+ Map<String, String> receiverMap = new TreeMap<String, String>();
|
|
|
+
|
|
|
+
|
|
|
+ //分给固定的
|
|
|
+ receiverMap.put("type", fzConfig.getType()); //分帐给个人
|
|
|
+ receiverMap.put("account", fzConfig.getAccount());
|
|
|
+ receiverMap.put("relation_type", fzConfig.getRelationType()); //合作合伙
|
|
|
+ receiverMap.put("name", fzConfig.getName());
|
|
|
+
|
|
|
+ ObjectMapper objectMapper = new ObjectMapper();
|
|
|
+ String receiverMapJson = objectMapper.writeValueAsString(receiverMap);
|
|
|
+ sortMap.put("receiver", receiverMapJson);
|
|
|
+
|
|
|
+ WXPayConfig config = new WxPayConfigImpl();
|
|
|
+ String sign = WXPayUtil.generateSignature(sortMap, config.getKey(), WXPayConstants.SignType.HMACSHA256);
|
|
|
+ sortMap.put("sign", sign);
|
|
|
+
|
|
|
+ WXPay pay = new WXPay(config);
|
|
|
+ String xmlStr = pay.requestWithoutCert(url, sortMap, config.getHttpConnectTimeoutMs(), config.getHttpReadTimeoutMs());
|
|
|
+
|
|
|
+ Map<String, String> resMap = XmlUtil.xmlToMap(xmlStr);
|
|
|
+ if (!"SUCCESS".equals(resMap.get("return_code")) || !"SUCCESS".equals(resMap.get("result_code"))) {
|
|
|
+ // throw new CustomException("微信添加分账出错");
|
|
|
+ log.info("微信添加分账信息出错");
|
|
|
+ log.info(resMap.toString());
|
|
|
+ orderInfo.setIsFz(3);
|
|
|
+ this.updateById(orderInfo);
|
|
|
+ return false;
|
|
|
+ } else {
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 调用微信分账
|
|
|
+ *
|
|
|
+ * @return
|
|
|
+ * @throws Exception
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ @Transactional
|
|
|
+ public boolean wxProfitsharing(OrderInfo orderInfo) throws Exception {
|
|
|
+ String url = "https://api.mch.weixin.qq.com/secapi/pay/profitsharing";
|
|
|
+ String nonceStr = RandomStringUtils.randomAlphanumeric(32);
|
|
|
+ //用于签名
|
|
|
+ Map<String, String> sortMap = new TreeMap<String, String>();
|
|
|
+ sortMap.put("mch_id", wxpayConfig.getMerchantId());
|
|
|
+ sortMap.put("appid", appConfig.getAppid());
|
|
|
+ sortMap.put("nonce_str", nonceStr);
|
|
|
+ sortMap.put("sign_type", "HMAC-SHA256");
|
|
|
+ sortMap.put("transaction_id", orderInfo.getTransactionId());
|
|
|
+ String orderCode = getOrderCode(orderInfo.getUserId()); //商户分账单号
|
|
|
+ sortMap.put("out_order_no", orderCode);
|
|
|
+
|
|
|
+ Map<String, Object> receiverMap = new TreeMap<String, Object>();
|
|
|
+
|
|
|
+ receiverMap.put("type", "MERCHANT_ID");
|
|
|
+ receiverMap.put("account", "1616445600");
|
|
|
+ receiverMap.put("amount", orderInfo.getFzPrice());
|
|
|
+ receiverMap.put("description", "主播视频分账30%");
|
|
|
+
|
|
|
+ ObjectMapper objectMapper = new ObjectMapper();
|
|
|
+ String receiverMapJson = objectMapper.writeValueAsString(receiverMap);
|
|
|
+ sortMap.put("receivers", receiverMapJson);
|
|
|
+
|
|
|
+ WXPayConfig config = new WxPayConfigImpl();
|
|
|
+ String sign = WXPayUtil.generateSignature(sortMap, config.getKey(), WXPayConstants.SignType.HMACSHA256);
|
|
|
+ sortMap.put("sign", sign);
|
|
|
+
|
|
|
+ WXPay pay = new WXPay(config);
|
|
|
+ String xmlStr = pay.requestWithCert(url, sortMap, config.getHttpConnectTimeoutMs(), config.getHttpReadTimeoutMs());
|
|
|
+ Map<String, String> resMap = XmlUtil.xmlToMap(xmlStr);
|
|
|
+ if (!"SUCCESS".equals(resMap.get("return_code")) || !"SUCCESS".equals(resMap.get("result_code"))) {
|
|
|
+ //throw new CustomException("微信分账出错");
|
|
|
+ log.info("微信分账出错");
|
|
|
+ log.info(resMap.toString());
|
|
|
+ orderInfo.setIsFz(3);
|
|
|
+ this.updateById(orderInfo);
|
|
|
+ return false;
|
|
|
+ } else {
|
|
|
+ //更新成交订单表
|
|
|
+ orderInfo.setIsFz(2);
|
|
|
+ this.updateById(orderInfo);
|
|
|
+
|
|
|
+ OrderSplit orderSplit = new OrderSplit();
|
|
|
+ orderSplit.setOutSplitNo(orderCode);
|
|
|
+ orderSplit.setOutTradeNo(orderInfo.getOutTradeNo());
|
|
|
+ orderSplit.setAmount(orderInfo.getFzPrice());
|
|
|
+ orderSplit.setOpenId(fzConfig.getAccount());
|
|
|
+ orderSplit.setOpenIdType(1);
|
|
|
+ orderSplit.setDescription(fzConfig.getDescription());
|
|
|
+ return orderSplitService.save(orderSplit);
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
}
|