|
@@ -25,6 +25,7 @@ import com.kmall.admin.entity.vip.Mall2MemberPointsEntity;
|
|
|
import com.kmall.admin.entity.vip.Mall2PointsRulesEntity;
|
|
|
import com.kmall.admin.fromcomm.dao.SysConfigDao;
|
|
|
import com.kmall.admin.service.*;
|
|
|
+import com.kmall.admin.service.kmall2eccs.KtoEccsService;
|
|
|
import com.kmall.admin.service.mk.store.MkStoreCampMinusService;
|
|
|
import com.kmall.admin.service.mk.store.MkStoreTicketDiscountService;
|
|
|
import com.kmall.admin.utils.CalculateTax;
|
|
@@ -70,7 +71,6 @@ import java.math.BigDecimal;
|
|
|
import java.math.RoundingMode;
|
|
|
import java.net.InetAddress;
|
|
|
import java.net.URLDecoder;
|
|
|
-import java.text.DateFormat;
|
|
|
import java.text.ParseException;
|
|
|
import java.text.SimpleDateFormat;
|
|
|
import java.util.*;
|
|
@@ -174,6 +174,11 @@ public class OrderServiceImpl implements OrderService {
|
|
|
private OrderExceptionRecordService orderExceptionRecordService;
|
|
|
|
|
|
|
|
|
+ @Autowired
|
|
|
+ private KtoEccsService ktoEccsService;
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
@Override
|
|
|
public OrderEntity queryObject(Long id) {
|
|
|
return orderDao.queryObject(id);
|
|
@@ -713,6 +718,37 @@ public class OrderServiceImpl implements OrderService {
|
|
|
queryStorePromRealUpdateIsScan(order);
|
|
|
}
|
|
|
|
|
|
+
|
|
|
+ private synchronized void restoreInventory(OrderEntity order, String changeReason) {
|
|
|
+ Map<String, Object> map = new HashMap();
|
|
|
+ SysUserEntity user = ShiroUtils.getUserEntity();
|
|
|
+ map.put("orderId", order.getId());
|
|
|
+ List<OrderGoodsEntity> orderGoodsVoList = orderGoodsDao.queryList(map);
|
|
|
+ for (OrderGoodsEntity orderGoodsEntity : orderGoodsVoList) {
|
|
|
+ ProductStoreRelaEntity storeRelaEntity = productStoreRelaDao
|
|
|
+ .queryByGoodsIdAndStoreId(order.getStoreId().longValue(), orderGoodsEntity.getGoodsId().longValue());
|
|
|
+ if (null == storeRelaEntity || null == storeRelaEntity.getSellVolume()) {
|
|
|
+ storeRelaEntity.setSellVolume(0);
|
|
|
+ }
|
|
|
+ BigDecimal sellVolume = new BigDecimal(storeRelaEntity.getSellVolume() - orderGoodsEntity.getNumber());//销售量
|
|
|
+ if (sellVolume.compareTo(Constant.ZERO) < 0) {
|
|
|
+ sellVolume = Constant.ZERO;
|
|
|
+ }
|
|
|
+
|
|
|
+ Integer stockNum = 0;
|
|
|
+ GoodsEntity goodsEntity = goodsDao.queryObject(orderGoodsEntity.getGoodsId());
|
|
|
+ if (goodsEntity != null) {
|
|
|
+ stockNum = goodsEntity.getGoodsNumber();
|
|
|
+ //还原商户商品库存
|
|
|
+ resetGoodsStock(stockNum, storeRelaEntity, orderGoodsEntity, sellVolume, changeReason, user);
|
|
|
+ }
|
|
|
+ if (null != storeRelaEntity.getStockNum()) {
|
|
|
+ stockNum = storeRelaEntity.getStockNum();
|
|
|
+ resetStoreGoodsStock(stockNum, storeRelaEntity, orderGoodsEntity, sellVolume, changeReason, user);//还原门店库存
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
private synchronized void updateStock(OrderEntity order, String changeReason) {
|
|
|
Map<String, Object> map = new HashMap();
|
|
|
SysUserEntity user = ShiroUtils.getUserEntity();
|
|
@@ -788,6 +824,9 @@ public class OrderServiceImpl implements OrderService {
|
|
|
if (goodsEntity != null) {
|
|
|
goodsEntity.setGoodsNumber(stockNum + orderGoodsEntity.getNumber());
|
|
|
// goodsEntity.setSellVolume(Integer.parseInt(goodsSellVolume.toString()));
|
|
|
+ if("oms退单成功,恢复库存".equals(changeReason)){
|
|
|
+ goodsEntity.setToBeRestored(goodsEntity.getToBeRestored() - orderGoodsEntity.getNumber());
|
|
|
+ }
|
|
|
goodsDao.update(goodsEntity);
|
|
|
|
|
|
// storeRelaEntity.setSellVolume(Integer.parseInt(sellVolume.toString()));
|
|
@@ -825,6 +864,9 @@ public class OrderServiceImpl implements OrderService {
|
|
|
OrderGoodsEntity orderGoodsEntity, BigDecimal sellVolume, String changeReason, SysUserEntity user) {
|
|
|
storeRelaEntity.setSellVolume(Integer.parseInt(sellVolume.toString())); // 减退库存
|
|
|
storeRelaEntity.setStockNum(stockNum + orderGoodsEntity.getNumber());//库存数量
|
|
|
+ if("oms退单成功,恢复库存".equals(changeReason)){
|
|
|
+ storeRelaEntity.setToBeRestored(storeRelaEntity.getToBeRestored() - orderGoodsEntity.getNumber());
|
|
|
+ }
|
|
|
productStoreRelaDao.update(storeRelaEntity);
|
|
|
|
|
|
StoreMngChangeEntity storeMngChangeEntity = new StoreMngChangeEntity();
|
|
@@ -2023,11 +2065,15 @@ public class OrderServiceImpl implements OrderService {
|
|
|
resultObj.put("errmsg", "订单提交失败");
|
|
|
return resultObj;
|
|
|
}
|
|
|
+
|
|
|
+ List<OrderGoodsVo> orderGoodsVoList = new ArrayList<>();
|
|
|
+
|
|
|
for (GoodsEntity goodsDto : goodsEntities) {
|
|
|
|
|
|
OrderGoodsVo orderGoodsVo = setOrderGoodsVo(order, goodsDto);
|
|
|
//新增订单详情
|
|
|
orderGoodsDao.saveOrderGoodsVo(orderGoodsVo);
|
|
|
+ orderGoodsVoList.add(orderGoodsVo);
|
|
|
}
|
|
|
//清空预订单商品临时表
|
|
|
Map orderInfoMap = Maps.newHashMap();
|
|
@@ -2143,6 +2189,11 @@ public class OrderServiceImpl implements OrderService {
|
|
|
WebSocketServer.sendMessage(sessionId, order.getOrder_sn(), order.getStore_id()
|
|
|
+ "");
|
|
|
|
|
|
+ // 下单流程完成了,现在将下单的库存明细
|
|
|
+// orderGoodsVoList
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
return resultObj;
|
|
|
} catch (Exception e) {
|
|
|
e.printStackTrace();
|
|
@@ -2528,10 +2579,10 @@ public class OrderServiceImpl implements OrderService {
|
|
|
return orderDao.queryObjectByOrderSn(orderSn);
|
|
|
}
|
|
|
|
|
|
- // TODO 退款的代码
|
|
|
+ // 收银端退款的代码
|
|
|
@Override
|
|
|
@Transactional
|
|
|
- public synchronized R orderRefund(OrderEntity order, String sessionId) throws Exception {
|
|
|
+ public synchronized R orderRefund(OrderEntity order, String sessionId, SysUserEntity user) throws Exception {
|
|
|
String payFlag = order.getPayFlag();
|
|
|
|
|
|
if (Dict.payFlag.item_weixin.getItem().equals(payFlag)) {
|
|
@@ -2550,10 +2601,28 @@ public class OrderServiceImpl implements OrderService {
|
|
|
String refundResult = "";
|
|
|
if (orderInfo.getOrderStatus() != Integer.parseInt(Dict.orderStatus.item_0.getItem())) {
|
|
|
LOGGER.info("微信退款开始");
|
|
|
- refundResult = wxRefund(orderInfo, totalActualPrice);
|
|
|
- if (org.apache.commons.lang3.StringUtils.isNotBlank(refundResult)) {
|
|
|
- return R.error(refundResult);
|
|
|
+
|
|
|
+ WechatRefundApiResult result = WechatUtil.wxRefund(orderInfo.getOrderSn().toString(), totalActualPrice,
|
|
|
+ orderInfo.getActualPrice().doubleValue());
|
|
|
+ OrderRefundEntity orderRefund = new OrderRefundEntity();
|
|
|
+ orderRefund.setRefundId(result.getRefund_id());
|
|
|
+ orderRefund.setOutRefundNo(result.getOut_trade_no());
|
|
|
+ orderRefund.setRefundMoney(BigDecimal.valueOf(Long.valueOf(result.getRefund_fee())).divide(Constant.ONE_HUNDRED));
|
|
|
+ orderRefund.setRefundStatus(Integer.parseInt(Dict.RefundStatus.item_2.getItem()));//退款处理中
|
|
|
+ orderRefund.setModTime(new Date());
|
|
|
+ orderRefund.setRefundTime(new Date());
|
|
|
+ orderRefund.setOrderId(Integer.parseInt(order.getId() + ""));
|
|
|
+ orderRefund.setUserId(user.getUserId().intValue());
|
|
|
+ orderRefund.setRefundId(order.getUserId() + "");
|
|
|
+ orderRefund.setCreateTime(new Date());
|
|
|
+ List<OrderEntity> list = orderDao.queryObjectByMerchOrderSn(order.getMerchOrderSn());
|
|
|
+ if (list.size() > 1) {//多条订单
|
|
|
+ orderRefund.setRefundType(Integer.parseInt(Dict.RefundType.item_2.getItem()));//部分退款
|
|
|
+ } else {
|
|
|
+ orderRefund.setRefundType(Integer.parseInt(Dict.RefundType.item_1.getItem()));//用户全额退款
|
|
|
}
|
|
|
+
|
|
|
+
|
|
|
order.setPayStatus(Integer.parseInt(Dict.payStatus.item_5.getItem()));
|
|
|
order.setOrderStatus(Integer.parseInt(Dict.orderStatus.item_401.getItem()));
|
|
|
LOGGER.info("微信退款");
|
|
@@ -2563,27 +2632,49 @@ public class OrderServiceImpl implements OrderService {
|
|
|
PickUpCodeEntity pickUpCodeEntity = pickUpCodeService.queryObject(order.getOrderSn());
|
|
|
pickUpCodeEntity.setPickUpCodeStatus("3");
|
|
|
pickUpCodeService.update(pickUpCodeEntity);
|
|
|
- updateStock(order, "收银端退款");
|
|
|
+
|
|
|
+ // 判断该订单是否进入oms系统
|
|
|
+ if(!arrivedOms(order.getOrderSn())){
|
|
|
+ // oms无该订单,则直接退款
|
|
|
+ restoreInventory(order, "收银端退款");
|
|
|
+ orderRefund.setRestore(1);
|
|
|
+ } else{
|
|
|
+ // 如果oms有订单,统一进入锁库存情况
|
|
|
+ orderRefund.setRestore(0);
|
|
|
+ toBeRestoreInventory(order);
|
|
|
+ }
|
|
|
+
|
|
|
+ orderRefundDao.save(orderRefund);//退款记录
|
|
|
}
|
|
|
// 支付宝的退款代码
|
|
|
} else if (Dict.payFlag.item_alipay.getItem().equals(payFlag)) {
|
|
|
|
|
|
+ OrderEntity orderInfo = order;
|
|
|
+ if (null == orderInfo) {
|
|
|
+ return R.error("订单不存在");
|
|
|
+ }
|
|
|
+ if (orderInfo.getOrderStatus() == Integer.parseInt(Dict.orderStatus.item_401.getItem()) ||
|
|
|
+ orderInfo.getOrderStatus() == Integer.parseInt(Dict.orderStatus.item_402.getItem())) {
|
|
|
+ return R.error("订单已退款");
|
|
|
+ }
|
|
|
+
|
|
|
AliPayMicropayApiResult userRefund = AliPayUtil.aliTradeRefund(order.getOrderSn(), order.getActualPrice().toString(),
|
|
|
"用户退款", order.getStoreId() + "");
|
|
|
|
|
|
LOGGER.info(userRefund.getSubMsg());
|
|
|
- order.setPayStatus(Integer.parseInt(Dict.payStatus.item_5.getItem()));
|
|
|
- order.setOrderStatus(Integer.parseInt(Dict.orderStatus.item_401.getItem()));
|
|
|
+
|
|
|
OrderRefundEntity orderRefund = new OrderRefundEntity();
|
|
|
orderRefund.setRefundId(userRefund.getTradeNo());
|
|
|
orderRefund.setOutRefundNo(userRefund.getOutTradeNo());
|
|
|
- orderRefund
|
|
|
- .setRefundMoney(new BigDecimal(userRefund.getRefundFee()));
|
|
|
+ orderRefund.setRefundMoney(new BigDecimal(userRefund.getRefundFee()));
|
|
|
+
|
|
|
+
|
|
|
orderRefund.setRefundStatus(Integer.parseInt(Dict.RefundStatus.item_2.getItem()));//退款成功
|
|
|
orderRefund.setModTime(new Date());
|
|
|
orderRefund.setRefundTime(new Date());
|
|
|
orderRefund.setOrderId(Integer.parseInt(order.getId() + ""));
|
|
|
- orderRefund.setUserId(Integer.parseInt(order.getUserId() + ""));
|
|
|
+ orderRefund.setUserId(user.getUserId().intValue());
|
|
|
+ orderRefund.setRefundId(order.getUserId() + "");
|
|
|
orderRefund.setCreateTime(new Date());
|
|
|
List<OrderEntity> list = orderDao.queryObjectByMerchOrderSn(order.getMerchOrderSn());
|
|
|
if (list.size() > 1) {//多条订单
|
|
@@ -2591,19 +2682,114 @@ public class OrderServiceImpl implements OrderService {
|
|
|
} else {
|
|
|
orderRefund.setRefundType(Integer.parseInt(Dict.RefundType.item_1.getItem()));//用户全额退款
|
|
|
}
|
|
|
- orderRefundDao.save(orderRefund);//退款记录
|
|
|
|
|
|
+
|
|
|
+ order.setPayStatus(Integer.parseInt(Dict.payStatus.item_5.getItem()));
|
|
|
+ order.setOrderStatus(Integer.parseInt(Dict.orderStatus.item_401.getItem()));
|
|
|
orderDao.update(order);//修改为退款成功
|
|
|
// 修改取货码
|
|
|
PickUpCodeEntity pickUpCodeEntity = pickUpCodeService.queryObject(order.getOrderSn());
|
|
|
pickUpCodeEntity.setPickUpCodeStatus("3");
|
|
|
pickUpCodeService.update(pickUpCodeEntity);
|
|
|
- updateStock(order, "收银端退款");
|
|
|
+ // 判断该订单是否进入oms系统
|
|
|
+ if(!arrivedOms(order.getOrderSn())){
|
|
|
+ // oms无该订单,则直接退款
|
|
|
+ restoreInventory(order, "收银端退款");
|
|
|
+ orderRefund.setRestore(1);
|
|
|
+ } else{
|
|
|
+ // 如果oms有订单,统一进入锁库存情况
|
|
|
+ orderRefund.setRestore(0);
|
|
|
+ toBeRestoreInventory(order);
|
|
|
+ }
|
|
|
+
|
|
|
+ orderRefundDao.save(orderRefund);//退款记录
|
|
|
}
|
|
|
|
|
|
return R.ok("退款成功");
|
|
|
}
|
|
|
|
|
|
+ @Transactional
|
|
|
+ public void toBeRestoreInventory(OrderEntity order) {
|
|
|
+
|
|
|
+ Map<String, Object> map = new HashMap();
|
|
|
+ SysUserEntity user = ShiroUtils.getUserEntity();
|
|
|
+ map.put("orderId", order.getId());
|
|
|
+ List<OrderGoodsEntity> orderGoodsVoList = orderGoodsDao.queryList(map);
|
|
|
+ for (OrderGoodsEntity orderGoodsEntity : orderGoodsVoList) {
|
|
|
+ Integer restoreNumber = orderGoodsEntity.getNumber();
|
|
|
+ ProductStoreRelaEntity storeRelaEntity = productStoreRelaDao
|
|
|
+ .queryByGoodsIdAndStoreId(order.getStoreId().longValue(), orderGoodsEntity.getGoodsId().longValue());
|
|
|
+ Integer toBeRestored = storeRelaEntity.getToBeRestored();
|
|
|
+ if(toBeRestored == null){
|
|
|
+ toBeRestored = 0;
|
|
|
+ }
|
|
|
+ // 修改待退款的数量
|
|
|
+ storeRelaEntity.setToBeRestored(toBeRestored +restoreNumber);
|
|
|
+
|
|
|
+ GoodsEntity goodsEntity = goodsDao.queryObject(orderGoodsEntity.getGoodsId());
|
|
|
+
|
|
|
+ toBeRestored = goodsEntity.getToBeRestored();
|
|
|
+ if(toBeRestored == null){
|
|
|
+ toBeRestored = 0;
|
|
|
+ }
|
|
|
+ goodsEntity.setToBeRestored(toBeRestored+restoreNumber);
|
|
|
+
|
|
|
+
|
|
|
+ productStoreRelaDao.update(storeRelaEntity);
|
|
|
+ goodsDao.update(goodsEntity);
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 查询oms系统是否有该订单
|
|
|
+ * @param orderSn
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ private boolean arrivedOms(String orderSn) {
|
|
|
+
|
|
|
+ Map<String, String> sParaTemp = new TreeMap<String, String>();
|
|
|
+ sParaTemp.put("data","ZWCW2020122749351849");
|
|
|
+// 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();
|
|
|
+ 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();
|
|
|
+ }
|
|
|
+
|
|
|
+ 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);
|
|
|
+ }
|
|
|
+ if("oms无该订单".equals(result.getMsg())){
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ return true;
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
|
|
|
private String wxRefund(OrderEntity orderInfo, Double totalActualPrice) {
|
|
|
WechatRefundApiResult result = WechatUtil.wxRefund(orderInfo.getOrderSn().toString(), totalActualPrice,
|
|
@@ -2871,7 +3057,6 @@ public class OrderServiceImpl implements OrderService {
|
|
|
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);
|
|
|
// 同步访问,返回结果字符串
|
|
@@ -2924,6 +3109,33 @@ public class OrderServiceImpl implements OrderService {
|
|
|
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 恢复kmall退单冻结的库存
|
|
|
+ *
|
|
|
+ * @param orderSn
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ @Transactional
|
|
|
+ public void toBeRestored(String orderSn) {
|
|
|
+
|
|
|
+ // 查询该订单在库存是否已经释放过,避免重复恢复库存
|
|
|
+ OrderEntity orderInfo = orderDao.queryObjectByOrderSn(orderSn);
|
|
|
+ OrderRefundEntity orderRefundEntity = orderRefundService.queryObjectByOrderId(orderInfo.getId());
|
|
|
+ if(orderRefundEntity == null){
|
|
|
+ LOGGER.error("该订单无退款记录,订单号{}",orderSn);
|
|
|
+ throw new RuntimeException("该订单无退款记录,订单号:"+orderSn);
|
|
|
+ }
|
|
|
+ Integer restore = orderRefundEntity.getRestore();
|
|
|
+ if(restore == 1){
|
|
|
+ LOGGER.error("该订单库存记录已恢复过,订单号{}",orderSn);
|
|
|
+ throw new RuntimeException("该订单库存记录已恢复过,订单号:"+orderSn);
|
|
|
+ }
|
|
|
+ restoreInventory(orderInfo,"oms退单成功,恢复库存");
|
|
|
+ orderRefundEntity.setRestore(1);
|
|
|
+ orderRefundService.update(orderRefundEntity);
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
|
|
|
/**
|
|
|
* 设置订单数据
|