|
@@ -1,8 +1,11 @@
|
|
|
package com.kmall.admin.service.impl;
|
|
|
|
|
|
+import com.alibaba.fastjson.JSON;
|
|
|
import com.alibaba.fastjson.JSONObject;
|
|
|
import com.google.common.collect.ImmutableBiMap;
|
|
|
import com.google.common.collect.Maps;
|
|
|
+import com.google.gson.Gson;
|
|
|
+import com.google.gson.internal.LinkedTreeMap;
|
|
|
import com.kmall.admin.dao.*;
|
|
|
import com.kmall.admin.dao.alarm.Mall2LowPriceWarningDao;
|
|
|
import com.kmall.admin.dao.mk.Mk2GoodsTopicPriceDao;
|
|
@@ -16,8 +19,6 @@ import com.kmall.admin.dao.vip.Mall2PointsRulesDao;
|
|
|
import com.kmall.admin.dto.*;
|
|
|
import com.kmall.admin.entity.*;
|
|
|
import com.kmall.admin.entity.OrderProcessRecordEntity;
|
|
|
-import com.kmall.admin.entity.alarm.Mall2LowPriceWarningEntity;
|
|
|
-import com.kmall.admin.entity.mk.Mk2GoodsTopicPriceEntity;
|
|
|
import com.kmall.admin.entity.mk.store.*;
|
|
|
import com.kmall.admin.entity.vip.Mall2MemberConsumptionRecordsEntity;
|
|
|
import com.kmall.admin.entity.vip.Mall2MemberPointsEntity;
|
|
@@ -27,9 +28,11 @@ import com.kmall.admin.service.*;
|
|
|
import com.kmall.admin.service.mk.store.MkStoreCampMinusService;
|
|
|
import com.kmall.admin.service.mk.store.MkStoreTicketDiscountService;
|
|
|
import com.kmall.admin.utils.CalculateTax;
|
|
|
+import com.kmall.admin.utils.data.response.ResponseMessage;
|
|
|
+import com.kmall.admin.utils.data.response.ResponseMessageData;
|
|
|
+import com.kmall.admin.utils.oms.OmsSign;
|
|
|
import com.kmall.admin.websocket.WebSocketServer;
|
|
|
import com.kmall.api.entity.*;
|
|
|
-import com.kmall.api.entity.mk.MkStoreTicketDiscountVo;
|
|
|
import com.kmall.common.utils.ResponseData;
|
|
|
import com.kmall.common.utils.wechat.WechatMicropayApiResult;
|
|
|
import com.kmall.common.utils.wechat.WechatReverseApiResult;
|
|
@@ -41,6 +44,7 @@ import com.kmall.manager.manager.express.sf.properties.SFUtil;
|
|
|
import com.kmall.manager.manager.express.sf.entity.SfRouteServiceResponseEntity;
|
|
|
import com.kmall.manager.manager.express.sf.entity.RouteEntity;
|
|
|
import com.kmall.manager.manager.express.sf.entity.RouteResponseEntity;
|
|
|
+import com.kmall.manager.manager.merch.OmsMerchProperties;
|
|
|
import com.kmall.manager.manager.print.ticket.TicketPrintUtil;
|
|
|
import com.kmall.manager.manager.wechat.WechatUtil;
|
|
|
import com.kmall.manager.manager.wechat.wxglobal.dto.WechatGlobalRefundApiResult;
|
|
@@ -54,7 +58,7 @@ import com.kmall.common.utils.*;
|
|
|
import com.kmall.common.utils.print.ticket.item.*;
|
|
|
import com.kmall.manager.manager.express.kdn.KdniaoUtil;
|
|
|
import com.kmall.common.utils.wechat.WechatRefundApiResult;
|
|
|
-import com.mysql.cj.util.TimeUtil;
|
|
|
+import okhttp3.Request;
|
|
|
import org.slf4j.Logger;
|
|
|
import org.slf4j.LoggerFactory;
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
@@ -62,7 +66,6 @@ import org.springframework.stereotype.Service;
|
|
|
import org.springframework.transaction.annotation.Transactional;
|
|
|
|
|
|
import java.io.IOException;
|
|
|
-import java.io.UnsupportedEncodingException;
|
|
|
import java.math.BigDecimal;
|
|
|
import java.math.RoundingMode;
|
|
|
import java.net.InetAddress;
|
|
@@ -70,10 +73,7 @@ import java.net.URLDecoder;
|
|
|
import java.text.DateFormat;
|
|
|
import java.text.ParseException;
|
|
|
import java.text.SimpleDateFormat;
|
|
|
-import java.time.LocalDate;
|
|
|
-import java.time.LocalDateTime;
|
|
|
import java.util.*;
|
|
|
-import java.util.concurrent.TimeUnit;
|
|
|
|
|
|
|
|
|
@Service("orderService")
|
|
@@ -82,6 +82,9 @@ public class OrderServiceImpl implements OrderService {
|
|
|
private final Logger LOGGER = LoggerFactory.getLogger(OrderServiceImpl.class);
|
|
|
|
|
|
@Autowired
|
|
|
+ private OmsMerchProperties omsMerchProperties;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
private OrderDao orderDao;
|
|
|
@Autowired
|
|
|
private ShippingDao shippingDao;
|
|
@@ -710,7 +713,7 @@ public class OrderServiceImpl implements OrderService {
|
|
|
queryStorePromRealUpdateIsScan(order);
|
|
|
}
|
|
|
|
|
|
- private void updateStock(OrderEntity order, String changeReason) {
|
|
|
+ private synchronized void updateStock(OrderEntity order, String changeReason) {
|
|
|
Map<String, Object> map = new HashMap();
|
|
|
SysUserEntity user = ShiroUtils.getUserEntity();
|
|
|
map.put("orderId", order.getId());
|
|
@@ -2061,8 +2064,11 @@ public class OrderServiceImpl implements OrderService {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- OrderEntity orderEntity = queryObject(order.getId());
|
|
|
- orderDao.update(orderEntity);
|
|
|
+// OrderEntity orderEntity = queryObject(order.getId());
|
|
|
+// TODO 到时候要注释掉,测试用而已
|
|
|
+// orderEntity.setOrderStatus(Integer.parseInt(Dict.orderStatus.item_201.getItem()));
|
|
|
+// orderEntity.setPayStatus(Integer.parseInt(Dict.payStatus.item_2.getItem()));
|
|
|
+// orderDao.update(orderEntity);
|
|
|
resultObj.put("shopName", store.getStoreName()); // 根据门店编号查询
|
|
|
resultObj.put("userName", user.getUsername());
|
|
|
|
|
@@ -2528,11 +2534,7 @@ public class OrderServiceImpl implements OrderService {
|
|
|
public synchronized R orderRefund(OrderEntity order, String sessionId) throws Exception {
|
|
|
String payFlag = order.getPayFlag();
|
|
|
|
|
|
- boolean needUpdateStock = true;
|
|
|
- if (Dict.payFlag.item_cash.getItem().equals(payFlag)) {
|
|
|
- order.setPayStatus(Integer.parseInt(Dict.payStatus.item_4.getItem()));
|
|
|
- // TODO 微信的退款代码
|
|
|
- } else if (Dict.payFlag.item_weixin.getItem().equals(payFlag)) {
|
|
|
+ if (Dict.payFlag.item_weixin.getItem().equals(payFlag)) {
|
|
|
OrderEntity orderInfo = order;
|
|
|
if (null == orderInfo) {
|
|
|
return R.error("订单不存在");
|
|
@@ -2555,6 +2557,13 @@ public class OrderServiceImpl implements OrderService {
|
|
|
order.setPayStatus(Integer.parseInt(Dict.payStatus.item_5.getItem()));
|
|
|
order.setOrderStatus(Integer.parseInt(Dict.orderStatus.item_401.getItem()));
|
|
|
LOGGER.info("微信退款");
|
|
|
+
|
|
|
+ orderDao.update(order);//修改为退款成功
|
|
|
+ // 修改取货码
|
|
|
+ PickUpCodeEntity pickUpCodeEntity = pickUpCodeService.queryObject(order.getOrderSn());
|
|
|
+ pickUpCodeEntity.setPickUpCodeStatus("3");
|
|
|
+ pickUpCodeService.update(pickUpCodeEntity);
|
|
|
+ updateStock(order, "收银端退款");
|
|
|
}
|
|
|
// 支付宝的退款代码
|
|
|
} else if (Dict.payFlag.item_alipay.getItem().equals(payFlag)) {
|
|
@@ -2583,13 +2592,15 @@ public class OrderServiceImpl implements OrderService {
|
|
|
orderRefund.setRefundType(Integer.parseInt(Dict.RefundType.item_1.getItem()));//用户全额退款
|
|
|
}
|
|
|
orderRefundDao.save(orderRefund);//退款记录
|
|
|
+
|
|
|
+ orderDao.update(order);//修改为退款成功
|
|
|
+ // 修改取货码
|
|
|
+ PickUpCodeEntity pickUpCodeEntity = pickUpCodeService.queryObject(order.getOrderSn());
|
|
|
+ pickUpCodeEntity.setPickUpCodeStatus("3");
|
|
|
+ pickUpCodeService.update(pickUpCodeEntity);
|
|
|
+ updateStock(order, "收银端退款");
|
|
|
}
|
|
|
- orderDao.update(order);//修改为退款成功
|
|
|
- // 修改取货码
|
|
|
- PickUpCodeEntity pickUpCodeEntity = pickUpCodeService.queryObject(order.getOrderSn());
|
|
|
- pickUpCodeEntity.setPickUpCodeStatus("3");
|
|
|
- pickUpCodeService.update(pickUpCodeEntity);
|
|
|
- updateStock(order, "收银端退款");
|
|
|
+
|
|
|
return R.ok("退款成功");
|
|
|
}
|
|
|
|
|
@@ -2670,30 +2681,28 @@ public class OrderServiceImpl implements OrderService {
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
- public List<OrderEntity> queryLastDayOrder() {
|
|
|
+ public List<OrderEntity> queryLastDayOrder(String comparedDate) {
|
|
|
|
|
|
Map<String, Object> map = new HashMap<>();
|
|
|
+//
|
|
|
+// DateFormat dateFmt = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//格式化一下时间
|
|
|
+//
|
|
|
+// Date dNow = new Date(); //当前时间
|
|
|
+//
|
|
|
+// Date dBefore = new Date();
|
|
|
+//
|
|
|
+// Calendar calendar = Calendar.getInstance(); //得到日历
|
|
|
+//
|
|
|
+// calendar.setTime(dNow);//把当前时间赋给日历
|
|
|
+//
|
|
|
+// calendar.add(Calendar.DAY_OF_MONTH, -1); //设置为前一天
|
|
|
+//
|
|
|
+// dBefore = calendar.getTime(); //得到前一天的时间
|
|
|
|
|
|
- DateFormat dateFmt = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//格式化一下时间
|
|
|
-
|
|
|
- Date dNow = new Date(); //当前时间
|
|
|
-
|
|
|
- Date dBefore = new Date();
|
|
|
-
|
|
|
- Calendar calendar = Calendar.getInstance(); //得到日历
|
|
|
-
|
|
|
- calendar.setTime(dNow);//把当前时间赋给日历
|
|
|
-
|
|
|
- calendar.add(Calendar.DAY_OF_MONTH, -1); //设置为前一天
|
|
|
-
|
|
|
- dBefore = calendar.getTime(); //得到前一天的时间
|
|
|
-
|
|
|
- String defaultStartDate = dateFmt.format(dBefore); //格式化前一天
|
|
|
-
|
|
|
- defaultStartDate = defaultStartDate.substring(0, 10) + " 00:00:00";
|
|
|
+ String defaultStartDate = comparedDate + " 00:00:00";
|
|
|
|
|
|
|
|
|
- String defaultEndDate = defaultStartDate.substring(0, 10) + " 23:59:59";
|
|
|
+ String defaultEndDate = comparedDate + " 23:59:59";
|
|
|
|
|
|
|
|
|
map.put("startTime", defaultStartDate);
|
|
@@ -2812,16 +2821,16 @@ public class OrderServiceImpl implements OrderService {
|
|
|
// 获取实际支付价格
|
|
|
String postTaxPrice = taxDetailDto.getPostTaxPrice();
|
|
|
// 获取总税额
|
|
|
- String taxStr = taxDetailDto.getTax();
|
|
|
+ String taxStr = taxDetailDto.getPreTax();
|
|
|
// 税前金额
|
|
|
BigDecimal tax = new BigDecimal(taxStr);
|
|
|
BigDecimal pretaxPrice = new BigDecimal(postTaxPrice).subtract(tax).setScale(2, RoundingMode.HALF_UP);
|
|
|
// 计算综合税率
|
|
|
BigDecimal taxRate = tax.divide(pretaxPrice, 4, RoundingMode.HALF_UP);
|
|
|
// 消费税率
|
|
|
- BigDecimal saleTaxRate = new BigDecimal(taxDetailDto.getSaleTaxRate()).divide(new BigDecimal(100),2,RoundingMode.HALF_UP);
|
|
|
+ BigDecimal saleTaxRate = new BigDecimal(taxDetailDto.getPreSaleTax()).divide(new BigDecimal(100),2,RoundingMode.HALF_UP);
|
|
|
// 综合税率
|
|
|
- BigDecimal vatRate = new BigDecimal(taxDetailDto.getVatRate()).divide(new BigDecimal(100),2,RoundingMode.HALF_UP);
|
|
|
+ BigDecimal vatRate = new BigDecimal(taxDetailDto.getPreVat()).divide(new BigDecimal(100),2,RoundingMode.HALF_UP);
|
|
|
// 消费税 = (明细商品总价 / (1-消费税税率)) * 消费税税率
|
|
|
// 增值税 = (明细商品总价 + 消费税) * 增值税税率
|
|
|
// 订单该商品总税费 = (商品消费税 + 商品增值税)* 0.7
|
|
@@ -2838,8 +2847,8 @@ public class OrderServiceImpl implements OrderService {
|
|
|
// 不需要算消费税,增值税计算
|
|
|
vat = pretaxPrice.multiply(vatRate).multiply(discountRate).setScale(2, RoundingMode.HALF_UP);
|
|
|
}
|
|
|
- taxDetailDto.setPreSaleTax(saleTax.toString());
|
|
|
- taxDetailDto.setPreVat(vat.toString());
|
|
|
+ taxDetailDto.setPreSaleTax(saleTax.compareTo(BigDecimal.ZERO)==0?saleTax.toString():"-"+saleTax.toString());
|
|
|
+ taxDetailDto.setPreVat(vat.compareTo(BigDecimal.ZERO)==0?vat.toString():"-"+vat.toString());
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -2848,6 +2857,73 @@ public class OrderServiceImpl implements OrderService {
|
|
|
return result;
|
|
|
}
|
|
|
|
|
|
+ @Override
|
|
|
+ public List<String> queryInveResponse(String orderSn) throws IOException {
|
|
|
+ Map<String, String> sParaTemp = new TreeMap<String, String>();
|
|
|
+ sParaTemp.put("data",orderSn);
|
|
|
+ sParaTemp.put("merchId",omsMerchProperties.getMerchSn());
|
|
|
+ String timestamp = String.valueOf(System.currentTimeMillis()/1000);
|
|
|
+ sParaTemp.put("timestamp", timestamp);
|
|
|
+ //生成要请求给oms秘钥
|
|
|
+// String sign = OmsSign.sign(sParaTemp,cus.getWaybill().get("secret-key"));
|
|
|
+ LOGGER.info("md5混淆码参数:" + omsMerchProperties.getMd5Salt());
|
|
|
+ String sign = OmsSign.sign(sParaTemp,omsMerchProperties.getMd5Salt());
|
|
|
+ sParaTemp.put("sign", sign);
|
|
|
+ //构建Request
|
|
|
+ String url = omsMerchProperties.getQueryInveResponseUrl();
|
|
|
+// url = "http://127.0.0.1:8680/al/queryInveResponse";
|
|
|
+ Request request = com.kmall.admin.utils.oms.OkHttpUtils.buildRequest(url, JSON.toJSONString(sParaTemp));
|
|
|
+ LOGGER.info("oms的请求报文:" + request);
|
|
|
+ // 同步访问,返回结果字符串
|
|
|
+ String responseString = null;
|
|
|
+ try {
|
|
|
+
|
|
|
+ responseString = com.kmall.admin.utils.oms.OkHttpUtils.post(request);
|
|
|
+
|
|
|
+ } catch (Exception e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ throw e;
|
|
|
+ }
|
|
|
+
|
|
|
+ LOGGER.info("oms的响应报文"+responseString);
|
|
|
+ //解析响应数据
|
|
|
+ Gson gson = new Gson();
|
|
|
+ ResponseMessage result = gson.fromJson(responseString, ResponseMessage.class);
|
|
|
+ if(result == null){
|
|
|
+ String info = "解析响应数据Result失败";
|
|
|
+ LOGGER.error("--- {}", info);
|
|
|
+ throw new RuntimeException(info);
|
|
|
+ }
|
|
|
+ ResponseMessageData data = result.getData();
|
|
|
+ List rows = data.getRows();
|
|
|
+ List<String> resultMessage = new LinkedList<>();
|
|
|
+ for (Object row : rows) {
|
|
|
+ if(row instanceof ArrayList){
|
|
|
+ for (Object o : ((ArrayList<?>) row)) {
|
|
|
+ if(o instanceof LinkedTreeMap){
|
|
|
+ String cusReturnInfo = (String) ((LinkedTreeMap<?, ?>) o).get("cusReturnInfo");
|
|
|
+ resultMessage.add(cusReturnInfo);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+// cusReturnInfo -> [Code:2600;Desc:放行]
|
|
|
+ return resultMessage;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 查询所有状态为201的订单。且下单时间超过5分钟的订单
|
|
|
+ *
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public List<OrderEntity> queryAll201Order() {
|
|
|
+ SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
|
|
|
+ String date = format.format(new Date());
|
|
|
+ return orderDao.queryAll201Order(date);
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
|
|
|
/**
|
|
|
* 设置订单数据
|