|
@@ -31,7 +31,7 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
|
|
import com.szwl.service.es.EsTOrderService;
|
|
|
import com.szwl.utils.HuifuUtils;
|
|
|
import com.szwl.utils.IDGenerator;
|
|
|
-//import com.szwl.utils.shouqianba.HttpProxy;
|
|
|
+import com.szwl.utils.shouqianba.HttpProxy;
|
|
|
import com.szwl.weixin.util.HttpUtils;
|
|
|
import com.wechat.pay.java.core.Config;
|
|
|
import com.wechat.pay.java.service.payments.nativepay.model.Amount;
|
|
@@ -101,18 +101,12 @@ public class TOrderServiceImpl extends ServiceImpl<TOrderMapper, TOrder> impleme
|
|
|
@Resource
|
|
|
TAlipayConfigService alipayConfigService;
|
|
|
|
|
|
+ @Autowired
|
|
|
+ TSqbConfigService sqbConfigService;
|
|
|
|
|
|
@Autowired
|
|
|
private TOrderDetailsService orderDetailsService;
|
|
|
|
|
|
- private static final String SZ_ACCESS_TOKEN_KEY = "sz_wechat_access_token";
|
|
|
- private static final String SC_ACCESS_TOKEN_KEY = "sc_wechat_access_token";
|
|
|
-
|
|
|
- /**
|
|
|
- * 缓存1个半小时(90分钟)
|
|
|
- */
|
|
|
- private static final long EXPIRATION_TIME = 90 * 60;
|
|
|
-
|
|
|
@Override
|
|
|
public synchronized String initSn(Long equipmentId) {
|
|
|
StringBuilder number = new StringBuilder();
|
|
@@ -446,7 +440,7 @@ public class TOrderServiceImpl extends ServiceImpl<TOrderMapper, TOrder> impleme
|
|
|
} catch (Exception e){
|
|
|
log.info("异步回调开始,参数,request={}", respData, e);
|
|
|
}
|
|
|
- return "退款失败";
|
|
|
+ return "";
|
|
|
}
|
|
|
|
|
|
@Override
|
|
@@ -523,6 +517,16 @@ public class TOrderServiceImpl extends ServiceImpl<TOrderMapper, TOrder> impleme
|
|
|
if (paySuccess.equals("success")) {
|
|
|
order.setIsNotified("1");
|
|
|
}
|
|
|
+ // 推送微信订单
|
|
|
+ TAdmin admin = R.getDataIfSuccess(szwlFeign.getAdmin(String.valueOf(order.getAdminId())));
|
|
|
+ // 判断是否开启订单推送功能
|
|
|
+ if(admin != null && StringUtils.isNotEmpty(admin.getOrderNotice()) && admin.getOrderNotice().equals("1")) {
|
|
|
+ String openId = R.getDataIfSuccess(szwlFeign.getOpenId(order.getAdminId()));
|
|
|
+ // 获取openId
|
|
|
+ if(StringUtils.isNotEmpty(openId)) {
|
|
|
+ orderService.sendWechatMessage(openId, equipment, order, admin.getCompanyType());
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
orderService.updateById(order);
|
|
|
try {
|
|
@@ -552,9 +556,6 @@ public class TOrderServiceImpl extends ServiceImpl<TOrderMapper, TOrder> impleme
|
|
|
} catch (Exception e) {
|
|
|
e.printStackTrace();
|
|
|
}
|
|
|
-// if(StringUtils.isEmpty(accessToken)) {
|
|
|
-// accessToken = getAccessToken(companyType);
|
|
|
-// }
|
|
|
// 推送消息
|
|
|
// 模板参数
|
|
|
Map<String, WeChatTemplateMsg> sendMag = new HashMap();
|
|
@@ -591,12 +592,501 @@ public class TOrderServiceImpl extends ServiceImpl<TOrderMapper, TOrder> impleme
|
|
|
sendBody.put("template_id", HuifuConstant.SC_TEMPLATE_ID);
|
|
|
}
|
|
|
sendMessage(accessToken, restTemplate, sendBody);
|
|
|
-// if (StringUtils.isNotEmpty(messageCode) && messageCode.equals("40001")) {
|
|
|
-// // 获取到新的accessToken
|
|
|
-// accessToken = getAccessToken(companyType);
|
|
|
-// messageCode = sendMessage(accessToken, restTemplate, sendBody);
|
|
|
-// log.info("微信推送结果:{}","messageCode : " + messageCode);
|
|
|
-// }
|
|
|
+ }
|
|
|
+
|
|
|
+ public String sqCardPay(String orderNo, BigDecimal amount, String productName, String authCode, TSqbConfig sqbConfig, String userName, String ip) {
|
|
|
+ HttpProxy hp = new HttpProxy(ShouQianBaConstant.API_DOMAIN);
|
|
|
+ try {
|
|
|
+ CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
|
|
|
+ // 异步调用支付接口
|
|
|
+ String payResult = hp.pay(
|
|
|
+ ip, sqbConfig.getTerminalSn(), sqbConfig.getNewTerminalKey(), orderNo, authCode, amount.toString(), productName, userName);
|
|
|
+ log.info("支付结果:{}", payResult);
|
|
|
+ return payResult;
|
|
|
+ });
|
|
|
+ try {
|
|
|
+ Thread.sleep(3000);
|
|
|
+ } catch (InterruptedException e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ }
|
|
|
+ long startTimestampMs = System.currentTimeMillis();
|
|
|
+ String orderStatus = "";
|
|
|
+ while (System.currentTimeMillis() - startTimestampMs < ShouQianBaConstant.REMAINING_TIME) {
|
|
|
+ String query = hp.query(
|
|
|
+ sqbConfig.getTerminalSn(), sqbConfig.getNewTerminalKey(), orderNo);
|
|
|
+ log.info("查询结果:{}", query);
|
|
|
+ JSONObject queryJsonObject = JSON.parseObject(query);
|
|
|
+ orderStatus = queryJsonObject.getJSONObject("biz_response").getJSONObject("data")
|
|
|
+ .getString("order_status");
|
|
|
+ if (orderStatus.equals(ShouQianBaConstant.PAID)) {
|
|
|
+ log.info("订单支付成功:{}", orderNo);
|
|
|
+ JSONObject bizResponse = queryJsonObject.getJSONObject("biz_response");
|
|
|
+ // 付款时间
|
|
|
+ String channelFinishTime = bizResponse.getJSONObject("data").getString("channel_finish_time");
|
|
|
+ // 收钱吧订单号
|
|
|
+ String sn = bizResponse.getJSONObject("data").getString("sn");
|
|
|
+ LambdaQueryWrapper<TOrder> queryWrapper = Wrappers.lambdaQuery();
|
|
|
+ queryWrapper.eq(TOrder::getSn, orderNo);
|
|
|
+ queryWrapper.eq(TOrder::getStatus, 0);
|
|
|
+ TOrder order = getOne(queryWrapper);
|
|
|
+ if (order != null) {
|
|
|
+ order.setStatus(1);
|
|
|
+ order.setTrxNo(sn);
|
|
|
+ Date date = new Date();
|
|
|
+ try {
|
|
|
+ date = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(channelFinishTime);
|
|
|
+ } catch (ParseException e) {
|
|
|
+ // 忽略时间转换错误
|
|
|
+ }
|
|
|
+ order.setPayDate(date);
|
|
|
+ // 更新订单明细状态
|
|
|
+ LambdaQueryWrapper<TOrderDetails> lambdaQueryWrapper = new LambdaQueryWrapper<>();
|
|
|
+ lambdaQueryWrapper.eq(TOrderDetails::getOrderSn, orderNo);
|
|
|
+ List<TOrderDetails> orderDetails = orderDetailsService.list(lambdaQueryWrapper);
|
|
|
+ for (TOrderDetails orderDetail : orderDetails) {
|
|
|
+ orderDetail.setRefundStatus("1");
|
|
|
+ orderDetailsService.updateById(orderDetail);
|
|
|
+ }
|
|
|
+ // 发送支付成功消息给设备
|
|
|
+ TEquipment equipment = R.getDataIfSuccess(szwlFeign.findEquipmentByClientId(order.getClientId()));
|
|
|
+ JSONObject kindData = new JSONObject();
|
|
|
+ kindData.put("sn", order.getSn());
|
|
|
+ kindData.put("productName", order.getProductName());
|
|
|
+ if (!order.getIsNotified().equals("1")) {
|
|
|
+ String paySuccess = equipmentService.sentMessage(equipment.getClientId(), PushUtils.buildJson("pay_success", kindData.toString()).toString());
|
|
|
+ if (paySuccess.equals("success")) {
|
|
|
+ order.setIsNotified("1");
|
|
|
+ }
|
|
|
+ // 推送微信订单
|
|
|
+ TAdmin admin = R.getDataIfSuccess(szwlFeign.getAdmin(String.valueOf(order.getAdminId())));
|
|
|
+ // 判断是否开启订单推送功能
|
|
|
+ if(admin != null && StringUtils.isNotEmpty(admin.getOrderNotice()) && admin.getOrderNotice().equals("1")) {
|
|
|
+ String openId = R.getDataIfSuccess(szwlFeign.getOpenId(order.getAdminId()));
|
|
|
+ // 获取openId
|
|
|
+ if(StringUtils.isNotEmpty(openId)) {
|
|
|
+ orderService.sendWechatMessage(openId, equipment, order, admin.getCompanyType());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ orderService.updateById(order);
|
|
|
+ try {
|
|
|
+ // 保存订单信息到ES
|
|
|
+ if(order.getProductNumber()==null||order.getProductNumber()==0){
|
|
|
+ order.setProductNumber(1);
|
|
|
+ }
|
|
|
+ orderFeign.saveToEs(order);
|
|
|
+ }catch (Exception e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ } else if (!orderStatus.equals(ShouQianBaConstant.CREATED) && !orderStatus.equals(ShouQianBaConstant.PAY_ERROR)) {
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ try {
|
|
|
+ Thread.sleep(3000);
|
|
|
+ } catch (InterruptedException e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return orderStatus;
|
|
|
+ } catch (Exception e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ }
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public JsonMessage sqbCardPay(String authCode, String frpCode, String clientId, String ip, Map<String, String> productNameMap, HttpServletRequest request) {
|
|
|
+ if(productNameMap==null){
|
|
|
+ return JsonMessage.error("数据出错");
|
|
|
+ }
|
|
|
+ StringBuilder note = new StringBuilder();
|
|
|
+ StringBuilder productName = new StringBuilder();
|
|
|
+ String productNo = "";
|
|
|
+ Map<String, Integer> productMap = new HashMap<>();
|
|
|
+ int productNumber = 0;
|
|
|
+
|
|
|
+ TEquipment equipment = R.getDataIfSuccess(szwlFeign.findEquipmentByClientId(clientId));
|
|
|
+ if(equipment==null||equipment.getId()==null){
|
|
|
+ return JsonMessage.error("找不到设备");
|
|
|
+ }
|
|
|
+ BigDecimal price = new BigDecimal("0.00");
|
|
|
+ TEquipmentDesc equipmentDesc = R.getDataIfSuccess(szwlFeign.findEquipmentById(equipment.getId()));
|
|
|
+ if(equipmentDesc==null||equipmentDesc.getEquipmentId()==null||equipmentDesc.getPayType()==null||equipmentDesc.getPayType().equals("0")){
|
|
|
+ for (String key : productNameMap.keySet()) {
|
|
|
+ String entryValue = String.valueOf(productNameMap.get(key));
|
|
|
+ List<String> value = JSON.parseArray(entryValue, String.class);
|
|
|
+ List<TPromoCode> promoCodeList = new ArrayList<>();
|
|
|
+ //1,校验优惠码
|
|
|
+ if(value.size()>0){
|
|
|
+ for(String code:value){
|
|
|
+ if(!code.equals("0")){
|
|
|
+ TPromoCode promoCode = new TPromoCode();
|
|
|
+ ResponseModel<TPromoCode> tPromoCodeResponseModel = szwlFeign.selectTPromoCode(code, equipment.getAdminId().toString());
|
|
|
+ TPromoCode tPromoCode = tPromoCodeResponseModel.getData();
|
|
|
+ promoCode = tPromoCode;
|
|
|
+ if (tPromoCode == null||tPromoCode.getId()==null) {
|
|
|
+ //不存在
|
|
|
+ return JsonMessage.success("1");
|
|
|
+ }
|
|
|
+ Date lastUseDate = null;
|
|
|
+ if (promoCode != null) {
|
|
|
+ lastUseDate = promoCode.getLastUseDate();
|
|
|
+ }
|
|
|
+
|
|
|
+ if (lastUseDate != null && lastUseDate.getTime() < ((new Date()).getTime())) {
|
|
|
+ promoCode.setIsUse("2");
|
|
|
+ szwlFeign.updatePromoCode(String.valueOf(promoCode.getId()),"2");
|
|
|
+ //过期
|
|
|
+ return JsonMessage.success("4");
|
|
|
+ }
|
|
|
+ if (promoCode.getId() == null) {
|
|
|
+ //不存在
|
|
|
+ return JsonMessage.success("1");
|
|
|
+ }
|
|
|
+ if (promoCode.getIsUse().equals("1")) {
|
|
|
+ //被使用
|
|
|
+ return JsonMessage.success("2");
|
|
|
+ }
|
|
|
+ if(!promoCode.getAdminId().equals("1")){
|
|
|
+ if (!String.valueOf(equipment.getAdminId()).equals(promoCode.getAdminId())) {
|
|
|
+ return JsonMessage.success("3");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (promoCode.getDiscount() == null) {
|
|
|
+ //旧优惠码
|
|
|
+ return JsonMessage.success("0");
|
|
|
+ }
|
|
|
+ if (promoCode.getDiscount() != null && promoCode.getDiscount() == 0) {
|
|
|
+ //0折
|
|
|
+ return JsonMessage.success("0");
|
|
|
+ }
|
|
|
+ promoCodeList.add(promoCode);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ String[] productNum = key.split("-");
|
|
|
+ String productNamea = productNum[0];
|
|
|
+ String num = productNum[1];
|
|
|
+ productMap.put(productNamea,Integer.valueOf(num));
|
|
|
+ productNumber += Integer.parseInt(num);
|
|
|
+ productName.append(productNamea).append("x").append(num).append(",");
|
|
|
+ TProduct product = R.getDataIfSuccess(szwlFeign.getProduct(String.valueOf(equipment.getId()), productNamea));
|
|
|
+ if (product == null) {
|
|
|
+ return JsonMessage.error("找不到商品");
|
|
|
+ }
|
|
|
+ note.append(productNamea).append("-").append(product.getNo()).append(":");
|
|
|
+ BigDecimal productPrice = product.getRmbPrice();
|
|
|
+ productNo = product.getNo();
|
|
|
+ if(promoCodeList.size()>0){
|
|
|
+ //有优惠码
|
|
|
+ BigDecimal onePrice = new BigDecimal("0.00");
|
|
|
+ int i;
|
|
|
+ for( i = 0;i<promoCodeList.size();i++){
|
|
|
+ BigDecimal discount = BigDecimal.valueOf(promoCodeList.get(i).getDiscount()).setScale(2, RoundingMode.HALF_DOWN);
|
|
|
+ BigDecimal price1 = productPrice.multiply(discount).divide(new BigDecimal(10)).setScale(2, RoundingMode.HALF_DOWN);
|
|
|
+ price = price.add(price1);
|
|
|
+ onePrice = onePrice.add(price1);
|
|
|
+ }
|
|
|
+ if(i<Integer.parseInt(num)){
|
|
|
+ int a = Integer.parseInt(num)-i;
|
|
|
+ BigDecimal price2 = productPrice.multiply(new BigDecimal(a)).setScale(2, RoundingMode.HALF_DOWN);
|
|
|
+ price =price.add(price2);
|
|
|
+ onePrice = onePrice.add(price2);
|
|
|
+ }
|
|
|
+ note.append(onePrice).append("-").append(num).append(",");
|
|
|
+ }else {
|
|
|
+ //1,type=0,原始设定,没有第二件半价
|
|
|
+ int a = Integer.parseInt(num);
|
|
|
+ BigDecimal price2 = productPrice.multiply(new BigDecimal(a)).setScale(2, RoundingMode.HALF_DOWN);
|
|
|
+ price =price.add(price2);
|
|
|
+ note.append(price2).append("-").append(num).append(",");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }else {
|
|
|
+ for (String key : productNameMap.keySet()) {
|
|
|
+ String[] productNum = key.split("-");
|
|
|
+ String productNamea = productNum[0];
|
|
|
+ String num = productNum[1];
|
|
|
+ productMap.put(productNamea,Integer.valueOf(num));
|
|
|
+ TProduct product = R.getDataIfSuccess(szwlFeign.getProduct(String.valueOf(equipment.getId()), productNamea));
|
|
|
+ productNo = product.getNo();
|
|
|
+ BigDecimal productPrice = product.getRmbPrice();
|
|
|
+ productName.append(productNamea).append("x").append(num).append(",");
|
|
|
+ note.append(productNamea).append("-").append(product.getNo()).append(":");
|
|
|
+ switch (num) {
|
|
|
+ case "1":
|
|
|
+ //1个 0个半价
|
|
|
+ price =price.add(productPrice);
|
|
|
+ note.append(price).append("-").append(num).append(",");
|
|
|
+ break;
|
|
|
+ case "2":
|
|
|
+ //2个 1个半价
|
|
|
+ price =price.add(productPrice);
|
|
|
+ price =price.add(productPrice.multiply(new BigDecimal(5)).divide(new BigDecimal(10)).setScale(2, RoundingMode.HALF_DOWN));
|
|
|
+ note.append(price).append("-").append(num).append(",");
|
|
|
+ break;
|
|
|
+ case "3":
|
|
|
+ //3个 1个半价
|
|
|
+ price =price.add(productPrice);
|
|
|
+ price =price.add(productPrice.multiply(new BigDecimal(5)).divide(new BigDecimal(10)).setScale(2, RoundingMode.HALF_DOWN));
|
|
|
+ price =price.add(productPrice);
|
|
|
+ note.append(price).append("-").append(num).append(",");
|
|
|
+ break;
|
|
|
+ case "4":
|
|
|
+ //4个 2个半价
|
|
|
+ price =price.add(productPrice);
|
|
|
+ price =price.add(productPrice.multiply(new BigDecimal(5)).divide(new BigDecimal(10)).setScale(2, RoundingMode.HALF_DOWN));
|
|
|
+ price =price.add(productPrice);
|
|
|
+ price =price.add(productPrice.multiply(new BigDecimal(5)).divide(new BigDecimal(10)).setScale(2, RoundingMode.HALF_DOWN));
|
|
|
+ note.append(price).append("-").append(num).append(",");
|
|
|
+ break;
|
|
|
+ case "5":
|
|
|
+ //5个 2个半价
|
|
|
+ price =price.add(productPrice);
|
|
|
+ price =price.add(productPrice.multiply(new BigDecimal(5)).divide(new BigDecimal(10)).setScale(2, RoundingMode.HALF_DOWN));
|
|
|
+ price =price.add(productPrice);
|
|
|
+ price =price.add(productPrice.multiply(new BigDecimal(5)).divide(new BigDecimal(10)).setScale(2, RoundingMode.HALF_DOWN));
|
|
|
+ price =price.add(productPrice);
|
|
|
+ note.append(price).append("-").append(num).append(",");
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ Long equipmentId = equipment.getId();
|
|
|
+ //查找商品
|
|
|
+ if (BigDecimal.ZERO.compareTo(price) >= 0) {
|
|
|
+ return JsonMessage.error("商品价格异常");
|
|
|
+ }
|
|
|
+ Long client6 = Long.parseLong(clientId.substring(clientId.length() - 6));
|
|
|
+ String sn = orderService.initSn(client6);
|
|
|
+ //获取分销 关联设备
|
|
|
+ TAdmin admin = R.getDataIfSuccess(szwlFeign.getAdmin(String.valueOf(equipment.getAdminId())));
|
|
|
+ // 获取收钱吧配置
|
|
|
+ LambdaQueryWrapper<TSqbConfig> sqbConfigQuery = Wrappers.lambdaQuery();
|
|
|
+ sqbConfigQuery.eq(TSqbConfig::getAdminId, admin.getId());
|
|
|
+ TSqbConfig sqbConfig = sqbConfigService.getOne(sqbConfigQuery);
|
|
|
+ if (sqbConfig == null) {
|
|
|
+ return JsonMessage.error("商户未配置");
|
|
|
+ }
|
|
|
+ // 查询是否签到,没有的话就进行签到
|
|
|
+ if (StringUtils.isNotEmpty(sqbConfig.getCheckin()) && sqbConfig.getCheckin().equals("0")) {
|
|
|
+ HttpProxy hp = new HttpProxy(ShouQianBaConstant.API_DOMAIN_CONFIG);
|
|
|
+ org.json.JSONObject terminal = hp.checkin(sqbConfig.getDeviceId(), sqbConfig.getTerminalSn(), sqbConfig.getTerminalKey());
|
|
|
+ if (terminal == null) {
|
|
|
+ return JsonMessage.error("签到失败");
|
|
|
+ }
|
|
|
+ String newTerminalKey = terminal.getString("terminal_key");
|
|
|
+ sqbConfig.setNewTerminalKey(newTerminalKey);
|
|
|
+ sqbConfigService.updateById(sqbConfig);
|
|
|
+ }
|
|
|
+
|
|
|
+ String companyType = admin.getCompanyType();
|
|
|
+ BigDecimal amount = price.setScale(2, RoundingMode.HALF_DOWN);
|
|
|
+ amount = amount.multiply(new BigDecimal(100)).setScale(0);
|
|
|
+ String appid = "";
|
|
|
+ TOrder order = new TOrder();
|
|
|
+ order.setId(IDGenerator.orderID());
|
|
|
+ order.setCreateDate(new Date());
|
|
|
+ order.setModifyDate(new Date());
|
|
|
+ order.setAdminId(admin.getId());
|
|
|
+ order.setSn(sn);
|
|
|
+ if(productNumber == 1) {
|
|
|
+ productName.delete(productName.length() - 3, productName.length());
|
|
|
+ } else {
|
|
|
+ productName.deleteCharAt(productName.length() - 1);
|
|
|
+ }
|
|
|
+ order.setProductName(productName.toString());
|
|
|
+ order.setPrice(price);
|
|
|
+ order.setClientId(equipment.getClientId());
|
|
|
+ order.setEquipmentId(equipmentId);
|
|
|
+ order.setFrpCode(frpCode);
|
|
|
+ order.setProductNumber(productNumber);
|
|
|
+ order.setStatus(0);
|
|
|
+ String payPlatform = "4";
|
|
|
+ order.setPayPlatform(payPlatform);
|
|
|
+ order.setCompanyType(companyType);
|
|
|
+ order.setMachineType(equipment.getMachineType());
|
|
|
+ order.setProductNo(productNo);
|
|
|
+ order.setNote(note.toString());
|
|
|
+
|
|
|
+ // 订单明细表
|
|
|
+ TOrderDetails orderDetails = new TOrderDetails();
|
|
|
+ orderDetails.setAdminId(admin.getId());
|
|
|
+ orderDetails.setEquipmentId(equipmentId);
|
|
|
+ orderDetails.setCreateDate(new Date());
|
|
|
+ orderDetails.setCompanyType(companyType);
|
|
|
+ orderDetails.setRefundStatus("0");
|
|
|
+ orderDetails.setMachineType(equipment.getMachineType());
|
|
|
+ // 添加到订单明细表
|
|
|
+ for (String key : productMap.keySet()) {
|
|
|
+ Integer productNum = productMap.get(key);
|
|
|
+ TProduct product = R.getDataIfSuccess(szwlFeign.getProduct(String.valueOf(equipment.getId()), key));
|
|
|
+ orderDetails.setProductNo(product.getNo());
|
|
|
+ orderDetails.setProductName(key);
|
|
|
+ orderDetails.setPrice(product.getRmbPrice());
|
|
|
+ orderDetails.setProductNumber(productNum);
|
|
|
+ orderDetails.setAmount(product.getRmbPrice().multiply(new BigDecimal(productNum)));
|
|
|
+ orderDetails.setId(HuifuUtils.initDetailsId());
|
|
|
+ orderDetails.setOrderSn(sn);
|
|
|
+ orderDetailsService.save(orderDetails);
|
|
|
+ }
|
|
|
+ orderService.save(order);
|
|
|
+ String productName1 = "";
|
|
|
+ if(productNumber > 1) {
|
|
|
+ productName1 = "棉花糖";
|
|
|
+ } else {
|
|
|
+ productName1 = productName.toString();
|
|
|
+ }
|
|
|
+ String result;
|
|
|
+ try {
|
|
|
+ result = sqCardPay(
|
|
|
+ sn, amount, productName1,authCode, sqbConfig, admin.getUsername(), ip
|
|
|
+ );
|
|
|
+ } catch (Exception e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ return JsonMessage.error("申请支付失败");
|
|
|
+ }
|
|
|
+ // 微信支付支付申请返回支付二维码图片
|
|
|
+ if (result.equals(ShouQianBaConstant.PAID)) {
|
|
|
+ JSONObject kindData = new JSONObject();
|
|
|
+ kindData.put("sn", sn);
|
|
|
+ return JsonMessage.success(kindData.toString());
|
|
|
+ } else {
|
|
|
+ return JsonMessage.error(result);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public ResponseModel sqbRefund(TOrder torder) {
|
|
|
+ // 退款金额: refusePrice
|
|
|
+ BigDecimal refusePrice = torder.getPrice().setScale(2, RoundingMode.HALF_DOWN);
|
|
|
+ // 退款数量: refundNumber
|
|
|
+ Integer refundNumber = torder.getProductNumber();
|
|
|
+ // 退款明细:note
|
|
|
+ String note = torder.getNote();
|
|
|
+ String[] refundDetails = note.split(",");
|
|
|
+ Map<String, Integer> refundMap = new HashMap<>();
|
|
|
+ for (String refundDetail : refundDetails) {
|
|
|
+ String[] keyValue = refundDetail.split("-");
|
|
|
+ String key = keyValue[0];
|
|
|
+ String value = keyValue[1];
|
|
|
+ refundMap.put(key, Integer.valueOf(value));
|
|
|
+ }
|
|
|
+
|
|
|
+ if(refusePrice.compareTo(new BigDecimal("0.00"))<=0){
|
|
|
+ return R.fail(ResponseCodesEnum.A0001,"退款金额非法");
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ TOrder order = orderService.getById(torder.getId());
|
|
|
+ if(order.getRefundQuantity() != null && order.getRefundQuantity()>0) {
|
|
|
+ order.setRefundQuantity(refundNumber + order.getRefundQuantity());
|
|
|
+ } else {
|
|
|
+ order.setRefundQuantity(refundNumber);
|
|
|
+ }
|
|
|
+
|
|
|
+ if(refusePrice.compareTo(order.getPrice()) > 0) {
|
|
|
+ return R.fail(ResponseCodesEnum.A0001,"退款金额非法");
|
|
|
+ }
|
|
|
+
|
|
|
+ if(order.getRefundAmount() != null && order.getRefundAmount().add(refusePrice).compareTo(order.getPrice()) > 0) {
|
|
|
+ return R.fail(ResponseCodesEnum.A0001,"退款金额非法");
|
|
|
+ }
|
|
|
+
|
|
|
+ if (order.getStatus().equals("0")) {
|
|
|
+ return R.fail(ResponseCodesEnum.A0002,"订单非支付状态");
|
|
|
+ }
|
|
|
+
|
|
|
+ // 获取收钱吧配置
|
|
|
+ LambdaQueryWrapper<TSqbConfig> sqbConfigQuery = Wrappers.lambdaQuery();
|
|
|
+ sqbConfigQuery.eq(TSqbConfig::getAdminId, order.getAdminId());
|
|
|
+ TSqbConfig sqbConfig = sqbConfigService.getOne(sqbConfigQuery);
|
|
|
+ if (sqbConfig == null) {
|
|
|
+ return R.fail(ResponseCodesEnum.A0002,"商户未配置");
|
|
|
+ }
|
|
|
+
|
|
|
+ LambdaQueryWrapper<TOrderDetails> wrapper = new LambdaQueryWrapper<>();
|
|
|
+ wrapper.eq(TOrderDetails::getOrderSn, order.getSn());
|
|
|
+ List<TOrderDetails> orderDetails = orderDetailsService.list(wrapper);
|
|
|
+ HttpProxy hp = new HttpProxy(ShouQianBaConstant.API_DOMAIN);
|
|
|
+ try {
|
|
|
+ String amount = refusePrice.multiply(new BigDecimal(100)).setScale(0).toString();
|
|
|
+ String refund = hp.refund(sqbConfig.getTerminalSn(), sqbConfig.getNewTerminalKey(), order.getSn(), amount);
|
|
|
+ log.info("退款结果:{}", refund);
|
|
|
+ JSONObject jsonObject = JSON.parseObject(refund);
|
|
|
+ String resultCode = jsonObject.getString("result_code");
|
|
|
+ log.info("下单结果码:{}", resultCode);
|
|
|
+ if (resultCode.equals("200")) {
|
|
|
+ String bizResultCode = jsonObject.getJSONObject("biz_response").getString("result_code");
|
|
|
+ log.info("下单业务结果码:{}", bizResultCode);
|
|
|
+ if (bizResultCode.equals(ShouQianBaConstant.REFUND_SUCCESS)) {
|
|
|
+ String orderStatus = jsonObject.getJSONObject("biz_response").getJSONObject("data").getString("order_status");
|
|
|
+ log.info("订单状态:{}", orderStatus);
|
|
|
+ if (orderStatus.equals(ShouQianBaConstant.REFUNDED) || orderStatus.equals(ShouQianBaConstant.PARTIAL_REFUNDED)) {
|
|
|
+ // 退款序列号
|
|
|
+ String refundRequestNo = jsonObject.getJSONObject("biz_response").getJSONObject("data").getString("refund_request_no");
|
|
|
+ // 退款成功
|
|
|
+ // 已退款
|
|
|
+ if(order.getRefundQuantity() < order.getProductNumber()) {
|
|
|
+ order.setStatus(1);
|
|
|
+ } else {
|
|
|
+ order.setStatus(3);
|
|
|
+ }
|
|
|
+ orderService.updateById(order);
|
|
|
+ // 修改订单明细
|
|
|
+ for (TOrderDetails orderDetail : orderDetails) {
|
|
|
+ String orderDetailId = orderDetail.getId();
|
|
|
+ Integer productNumber = refundMap.get(orderDetailId);
|
|
|
+ if(productNumber != null) {
|
|
|
+ // 退款数量
|
|
|
+ orderDetail.setRefundQuantity(productNumber);
|
|
|
+ // 退款状态
|
|
|
+ if(productNumber < orderDetail.getProductNumber()) {
|
|
|
+ // 部分退款
|
|
|
+ orderDetail.setRefundStatus("2");
|
|
|
+ } else {
|
|
|
+ // 全部退款
|
|
|
+ orderDetail.setRefundStatus("3");
|
|
|
+ }
|
|
|
+ // 退款金额
|
|
|
+ orderDetail.setRefundAmount(orderDetail.getPrice().multiply(new BigDecimal(productNumber)));
|
|
|
+ orderDetailsService.updateById(orderDetail);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ // 已退款金额
|
|
|
+ BigDecimal refundAmount = order.getRefundAmount();
|
|
|
+ BigDecimal price = order.getPrice();
|
|
|
+ if(refundAmount != null) {
|
|
|
+ if (price.compareTo(refundAmount) == 0) {
|
|
|
+ order.setRefundAmount(refundAmount);
|
|
|
+ } else {
|
|
|
+ order.setRefundAmount(refundAmount.add(refusePrice));
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ order.setRefundAmount(refusePrice);
|
|
|
+ }
|
|
|
+ // 退款时间
|
|
|
+ order.setRefundDate(new Date());
|
|
|
+ order.setModifyDate(new Date());
|
|
|
+ order.setRefundTrxNo(refundRequestNo);
|
|
|
+ try {
|
|
|
+ orderFeign.saveToEs(order);
|
|
|
+ }catch (Exception e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ }finally {
|
|
|
+ orderService.updateById(order);
|
|
|
+ }
|
|
|
+ return R.ok("申请退款已成功");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ } catch (Exception e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ }
|
|
|
+ return R.fail(ResponseCodesEnum.B0001,"申请退款失败,请联系管理员");
|
|
|
}
|
|
|
|
|
|
/**
|