Browse Source

对接拼团数据1

master
wangfukang 2 days ago
parent
commit
0322930309
  1. 8
      hiver-admin/pom.xml
  2. 6
      hiver-admin/src/main/resources/application.yml
  3. 3
      hiver-core/pom.xml
  4. 3
      hiver-modules/hiver-app/pom.xml
  5. 4
      hiver-modules/hiver-base/pom.xml
  6. 4
      hiver-modules/hiver-mall/pom.xml
  7. 33
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/MallCouponController.java
  8. 3
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/MallDeliveryOrderController.java
  9. 15
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/ShopController.java
  10. 76
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/WechatPayController.java
  11. 4
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/WorkerController.java
  12. 4
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/entity/Shop.java
  13. 34
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/mq/CouponMqConfig.java
  14. 39
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/mq/CouponSendConsumer.java
  15. 2
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/mq/OrderAsyncConsumer.java
  16. 3
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/mq/OrderDelayConsumer.java
  17. 3
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/mq/SettlementConfirmConsumer.java
  18. 3
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/service/mybatis/MallDeliveryOrderService.java
  19. 3
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/service/mybatis/MallOrderService.java
  20. 4
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/ShopServiceImpl.java
  21. 14
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/ShopTakeawayServiceImpl.java
  22. 11
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/MallDeliveryOrderServiceImpl.java
  23. 19
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/MallOrderServiceImpl.java
  24. 16
      hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/utils/KeyUtils.java
  25. 4
      hiver-modules/hiver-social/pom.xml
  26. 91
      pom.xml

8
hiver-admin/pom.xml

@ -16,37 +16,30 @@
<dependency>
<groupId>cc.hiver</groupId>
<artifactId>hiver-base</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>cc.hiver</groupId>
<artifactId>hiver-file</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>cc.hiver</groupId>
<artifactId>hiver-quartz</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>cc.hiver</groupId>
<artifactId>hiver-social</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>cc.hiver</groupId>
<artifactId>hiver-app</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>cc.hiver</groupId>
<artifactId>hiver-open</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>cc.hiver</groupId>
<artifactId>hiver-mall</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<!-- 数据库连接池 -->
<dependency>
@ -83,7 +76,6 @@
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.3.7.RELEASE</version>
<executions>
<execution>
<goals>

6
hiver-admin/src/main/resources/application.yml

@ -34,6 +34,8 @@ spring:
driver-class-name: com.mysql.jdbc.Driver
# Druid StatViewServlet配置
druid:
test-on-borrow: true
validation-query: SELECT 1
stat-view-servlet:
# 默认true 内置监控页面首页/druid/index.html
enabled: true
@ -97,11 +99,11 @@ spring:
listener:
simple:
# 手动确认消息
acknowledge-mode: manual
acknowledge-mode: AUTO
# 开启重试
retry:
enabled: true
max-attempts: 3
max-attempts: 1
template:
retry:
enabled: true

3
hiver-core/pom.xml

@ -158,7 +158,6 @@
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.62</version>
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
@ -173,8 +172,6 @@
<dependency>
<groupId>com.github.binarywang</groupId>
<artifactId>weixin-java-mp</artifactId>
<version>4.6.0</version>
<scope>compile</scope>
</dependency>
</dependencies>
</project>

3
hiver-modules/hiver-app/pom.xml

@ -16,7 +16,6 @@
<dependency>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-spring-boot-starter</artifactId>
<version>1.26.0</version>
</dependency>
<!-- Druid 数据库连接池 -->
<dependency>
@ -27,12 +26,10 @@
<dependency>
<groupId>ch.ethz.ganymed</groupId>
<artifactId>ganymed-ssh2</artifactId>
<version>build210</version>
</dependency>
<dependency>
<groupId>com.jcraft</groupId>
<artifactId>jsch</artifactId>
<version>0.1.55</version>
</dependency>
</dependencies>
</project>

4
hiver-modules/hiver-base/pom.xml

@ -13,20 +13,16 @@
<dependency>
<groupId>cc.hiver</groupId>
<artifactId>hiver-mall</artifactId>
<version>1.0-SNAPSHOT</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.13</version>
</dependency>
<dependency>
<groupId>com.github.binarywang</groupId>
<artifactId>weixin-java-mp</artifactId>
<version>4.6.0</version>
</dependency>
</dependencies>

4
hiver-modules/hiver-mall/pom.xml

@ -15,7 +15,6 @@
<dependency>
<groupId>cc.hiver</groupId>
<artifactId>hiver-app</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
@ -31,8 +30,6 @@
<dependency>
<groupId>cc.hiver</groupId>
<artifactId>hiver-file</artifactId>
<version>1.0-SNAPSHOT</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
@ -41,7 +38,6 @@
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.83</version>
</dependency>
</dependencies>

33
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/MallCouponController.java

@ -4,18 +4,24 @@ import cc.hiver.core.common.utils.ResultUtil;
import cc.hiver.core.common.vo.Result;
import cc.hiver.mall.entity.MallCoupon;
import cc.hiver.mall.entity.MallUserCoupon;
import cc.hiver.mall.mq.CouponMqConfig;
import cc.hiver.mall.pojo.query.MallCouponQuery;
import cc.hiver.mall.service.mybatis.MallCouponService;
import cc.hiver.mall.service.mybatis.MallUserCouponService;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.metadata.IPage;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.math.BigDecimal;
import java.util.List;
@Slf4j
@RestController
@RequestMapping("/hiver/mall/coupon")
@Api(tags = "优惠券接口")
@ -27,6 +33,17 @@ public class MallCouponController {
@Autowired
private MallUserCouponService mallUserCouponService;
@Autowired
private RabbitTemplate rabbitTemplate;
@Data
public static class SendCouponReq {
private String userPhones;
private Integer giveNum;
private Integer type;
private String couponId;
}
@PostMapping("/add")
@ApiOperation(value = "添加/发行优惠券")
public Result<Object> addCoupon(@RequestBody MallCoupon coupon) {
@ -51,8 +68,20 @@ public class MallCouponController {
@PostMapping("/send")
@ApiOperation(value = "平台发放优惠券")
public Result<Object> send(@RequestParam String userPhones,@RequestParam Integer giveNum, @RequestParam Integer type,@RequestParam String couponId) {
mallUserCouponService.send(userPhones, type,couponId, giveNum);
return ResultUtil.success("发放成功");
try {
SendCouponReq req = new SendCouponReq();
req.setUserPhones(userPhones);
req.setGiveNum(giveNum);
req.setType(type);
req.setCouponId(couponId);
String message = JSON.toJSONString(req);
rabbitTemplate.convertAndSend(CouponMqConfig.COUPON_EXCHANGE, CouponMqConfig.COUPON_SEND_ROUTING_KEY, message);
return ResultUtil.success("发放任务已投递,后台排队处理中");
} catch (Exception e) {
log.error("推送优惠券发放MQ消息失败: {}", e.getMessage(), e);
return ResultUtil.error("发放任务投递失败: " + e.getMessage());
}
}
@GetMapping("/available")

3
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/MallDeliveryOrderController.java

@ -68,6 +68,7 @@ public class MallDeliveryOrderController {
result.put("size", page.getSize());
result.put("current", page.getCurrent());
result.put("pages", page.getPages());
result.put("zhipaiCount", page.getTotal());
//外卖、快递、跑腿待接数
result.put("orderCount", mallDeliveryOrderService.countOrdersByType(q.getRegionId()));
return new ResultUtil<Object>().setData(result);
@ -273,7 +274,7 @@ public class MallDeliveryOrderController {
public Result addDeliveryFee(@RequestParam String orderId,@RequestParam String deliveryId,
@RequestParam BigDecimal additionalFee,@RequestParam BigDecimal olditionalFee) {
try {
mallDeliveryOrderService.addDeliveryFee(orderId,deliveryId, additionalFee,olditionalFee);
//mallDeliveryOrderService.addDeliveryFee(orderId,deliveryId, additionalFee,olditionalFee);
return ResultUtil.success("配送费增加成功");
} catch (Exception e) {
log.error("增加配送费失败: {}", e.getMessage(), e);

15
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/ShopController.java

@ -250,8 +250,8 @@ public class ShopController {
continue;
}
}
if(s.getStatus() != 1){
//已禁用
if(s.getStatus() < 1){
continue;
}
if (CharSequenceUtil.isNotBlank(shop.getShopType())) {
@ -306,12 +306,20 @@ public class ShopController {
compareResult = shoprank1.compareTo(shoprank2);
}
if ("desc".equalsIgnoreCase(order)) {
return -compareResult;
compareResult = -compareResult;
}
return compareResult;
});
}
// 稳定排序:因为 1 是正常营业,2 是暂停营业,所以使用升序排序 (1 -> 2)
// 这样既保留了前面销量/评分的排序,又能确保暂停营业的(2)排在最后
allShops.sort((s1, s2) -> {
Integer status1 = s1.getStatus() == null ? 0 : s1.getStatus();
Integer status2 = s2.getStatus() == null ? 0 : s2.getStatus();
return status1.compareTo(status2);
});
int pageNumber = pageVo.getPageNumber() > 0 ? pageVo.getPageNumber() : 1;
int pageSize = pageVo.getPageSize() > 0 ? pageVo.getPageSize() : 10;
int fromIndex = (pageNumber - 1) * pageSize;
@ -361,7 +369,6 @@ public class ShopController {
return new ResultUtil<Page<Shop>>().setData(pageResult);
}
}
final Page<Shop> page = shopService.findByCondition(shop, PageUtil.initPage(pageVo));
final List<String> shopIdList = new ArrayList<>();

76
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/WechatPayController.java

@ -27,6 +27,7 @@ import javax.annotation.PostConstruct;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.math.BigDecimal;
import java.nio.charset.StandardCharsets;
import java.security.PrivateKey;
import java.util.Base64;
@ -94,8 +95,15 @@ public class WechatPayController {
@PostMapping("/unified-order")
public ResponseEntity<Map<String, String>> jsapiPay(@RequestBody Map<String, String> request) throws Exception {
String outTradeNo = "ORDER_" + request.get("outTradeNo");
String description = request.get("description");
String outTradeNo = request.get("outTradeNo");
if(description.equals("增加配送佣金")){
outTradeNo = "ORDERDE_" + outTradeNo;
}else{
outTradeNo = "ORDER_" + outTradeNo;
}
String openid = request.get("openid");
long amount = Long.parseLong(request.get("amount")); // 单位:分
@ -115,14 +123,64 @@ public class WechatPayController {
}
}
@PostMapping("/paySuccess")
public ResponseEntity<Map<String, String>> paySuccess(@RequestBody Map<String, String> request) throws Exception {
//订单支付成功逻辑
mallOrderService.paySuccess(request.get("outTradeNo"));
Map<String, String> payParams = new HashMap<>();
payParams.put("code","200");
payParams.put("message","支付成功订单更新");
return ResponseEntity.ok(payParams);
/**
* 微信支付异步回调通知接口 (API v3)
* 微信服务器会在支付成功后 POST 请求该接口
*/
@PostMapping("/notify")
public ResponseEntity<Map<String, String>> payNotify(@RequestBody Map<String, Object> request) {
Map<String, String> result = new HashMap<>();
try {
String eventType = (String) request.get("event_type");
log.info("接收到微信支付回调,事件类型:{}", eventType);
if ("TRANSACTION.SUCCESS".equals(eventType)) {
Map<String, Object> resource = (Map<String, Object>) request.get("resource");
String ciphertext = (String) resource.get("ciphertext");
String nonce = (String) resource.get("nonce");
String associatedData = (String) resource.get("associated_data");
// 使用 APIv3 密钥解密
String decryptedData = KeyUtils.decryptToString(associatedData, nonce, ciphertext, config.getApiV3Key());
log.info("微信支付回调解密成功");
Map<String, Object> dataMap = objectMapper.readValue(decryptedData, Map.class);
log.info(decryptedData);
String tradeState = (String) dataMap.get("trade_state");
if ("SUCCESS".equals(tradeState)) {
String outTradeNo = (String) dataMap.get("out_trade_no");
Map<String, Object> amountMap = (Map<String, Object>) dataMap.get("amount");
if (amountMap == null) {
throw new RuntimeException("支付回调金额信息缺失");
}
// 获取分单位的金额
Integer totalFeeCents = (Integer) amountMap.get("total");
// 转换为元 (如果需要) 或者直接用分存数据库
BigDecimal totalAmount = new BigDecimal(totalFeeCents).divide(new BigDecimal(100));
String orderId = outTradeNo;
// 发起支付时统一下单加了 "ORDER_" 前缀,所以这里截取回真实的 orderId
/*if (outTradeNo != null && outTradeNo.startsWith("ORDER_")) {
orderId = outTradeNo.substring(6);
}*/
// 更新数据库订单状态
mallOrderService.paySuccess(orderId,totalAmount);
log.info("订单支付成功状态更新完毕,orderId: {}", orderId);
}
}
// 微信支付 V3 明确要求成功时返回 code: SUCCESS
result.put("code", "SUCCESS");
result.put("message", "成功");
return ResponseEntity.ok(result);
} catch (Exception e) {
log.error("处理微信支付回调异常", e);
result.put("code", "FAIL");
result.put("message", "业务处理异常: " + e.getMessage());
// 如果返回非 2xx 状态码,微信会按照退避策略重新通知
return ResponseEntity.status(500).body(result);
}
}
public Map<String, String> buildPaySign(String prepayId) throws Exception {

4
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/controller/WorkerController.java

@ -202,7 +202,7 @@ public class WorkerController {
*/
@RequestMapping(value = "/onLine", method = RequestMethod.POST)
@ApiOperation(value = "配送员上线")
public Result<Object> onLine(String id) {
public Result<Object> onLine(@RequestParam("id") String id) {
try {
workerService.onLine(id);
return ResultUtil.success("上线成功");
@ -222,7 +222,7 @@ public class WorkerController {
*/
@RequestMapping(value = "/offLine", method = RequestMethod.POST)
@ApiOperation(value = "配送员下线")
public Result<Object> offLine(String id) {
public Result<Object> offLine(@RequestParam("id")String id) {
try {
workerService.offLine(id);
return ResultUtil.success("下线成功");

4
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/entity/Shop.java

@ -89,8 +89,8 @@ public class Shop extends HiverBaseEntity {
@ApiModelProperty(value = "截止日")
private String endTime;
@ApiModelProperty(value = "状态")
private int status;
@ApiModelProperty(value = "状态 0禁用 1启用 2暂停营业")
private Integer status;
@ApiModelProperty(value = "备注")
private String remark;

34
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/mq/CouponMqConfig.java

@ -0,0 +1,34 @@
package cc.hiver.mall.mq;
import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.DirectExchange;
import org.springframework.amqp.core.Queue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* 优惠券MQ配置
*/
@Configuration
public class CouponMqConfig {
public static final String COUPON_EXCHANGE = "mall.coupon.exchange";
public static final String COUPON_SEND_QUEUE = "mall.coupon.send.queue";
public static final String COUPON_SEND_ROUTING_KEY = "mall.coupon.send.routing.key";
@Bean
public DirectExchange couponExchange() {
return new DirectExchange(COUPON_EXCHANGE, true, false);
}
@Bean
public Queue couponSendQueue() {
return new Queue(COUPON_SEND_QUEUE, true);
}
@Bean
public Binding bindingCouponSendQueue() {
return BindingBuilder.bind(couponSendQueue()).to(couponExchange()).with(COUPON_SEND_ROUTING_KEY);
}
}

39
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/mq/CouponSendConsumer.java

@ -0,0 +1,39 @@
package cc.hiver.mall.mq;
import cc.hiver.mall.controller.MallCouponController.SendCouponReq;
import cc.hiver.mall.service.mybatis.MallUserCouponService;
import com.alibaba.fastjson.JSON;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
/**
* 优惠券发放MQ消费者
*/
@Slf4j
@Component
public class CouponSendConsumer {
@Autowired
private MallUserCouponService mallUserCouponService;
@RabbitListener(queues = CouponMqConfig.COUPON_SEND_QUEUE)
public void handleCouponSend(String message) {
log.info("【MQ优惠券消费者】接收到优惠券发放消息: {}", message);
try {
SendCouponReq req = JSON.parseObject(message, SendCouponReq.class);
if (req == null || req.getUserPhones() == null || req.getCouponId() == null) {
log.warn("【MQ优惠券消费者】消息参数异常, message={}", message);
return;
}
mallUserCouponService.send(req.getUserPhones(), req.getType(), req.getCouponId(), req.getGiveNum());
log.info("【MQ优惠券消费者】优惠券发放处理成功, 手机号: {}", req.getUserPhones());
} catch (Exception e) {
log.error("【MQ优惠券消费者】处理优惠券发放消息异常: {}", e.getMessage(), e);
throw new org.springframework.amqp.AmqpRejectAndDontRequeueException(e);
}
}
}

2
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/mq/OrderAsyncConsumer.java

@ -115,6 +115,7 @@ public class OrderAsyncConsumer {
log.info("【异步队列处理】微信模版推送成功,推送总人数:{}", targetOpenIds.size());
} catch (Exception e) {
log.error("【异步队列处理】微信推送异常(不影响主链路): {}", e.getMessage(), e);
throw new org.springframework.amqp.AmqpRejectAndDontRequeueException(e);
}
}
@ -152,6 +153,7 @@ public class OrderAsyncConsumer {
mallOrderService.updateSaleCacheIncrementalViaMq(shopId, regionId, items, shopSaleCount);
} catch (Exception e) {
log.error("【异步队列处理】缓存更新失败: {}", e.getMessage(), e);
throw new org.springframework.amqp.AmqpRejectAndDontRequeueException(e);
}
}
}

3
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/mq/OrderDelayConsumer.java

@ -67,6 +67,7 @@ public class OrderDelayConsumer {
}
} catch (Exception e) {
log.error("【订单延时处理】处理超时消息异常: {}", e.getMessage(), e);
throw new org.springframework.amqp.AmqpRejectAndDontRequeueException(e);
}
}
@ -123,7 +124,7 @@ public class OrderDelayConsumer {
Shop shop = shopMapper.selectById(order.getShopId());
if (shop != null && StringUtils.isNotBlank(shop.getClientId())) {
// 发送给商家端的 APP Push
jPushService.sendPushNotification(shop.getClientId(), "您的订单出餐已超时,请尽快处理!", orderId);
jPushService.sendPushNotification(shop.getClientId(), order.getNumberCode() + "订单出餐已超时,请尽快处理!", orderId);
}
}

3
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/mq/SettlementConfirmConsumer.java

@ -56,8 +56,7 @@ public class SettlementConfirmConsumer {
} catch (Exception e) {
log.error("【MQ结算消费者】处理结算消息异常: {}", e.getMessage(), e);
// 此处由于是简单的配置,如果出现异常会根据 application.yml 中的重试机制进行重试(max-attempts: 3)
throw new RuntimeException(e); // 抛出异常以触发重试或放入死信队列
throw new org.springframework.amqp.AmqpRejectAndDontRequeueException(e); // 拒绝且不重新入队
}
}
}

3
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/service/mybatis/MallDeliveryOrderService.java

@ -67,10 +67,9 @@ public interface MallDeliveryOrderService extends IService<MallDeliveryOrder> {
/**
* 用户增加配送费在现有 deliveryFee 基础上追加
* @param deliveryId 配送单ID
* @param additionalFee 追加的配送费金额
*/
void addDeliveryFee(String orderId,String deliveryId, BigDecimal additionalFee,BigDecimal olditionalFee);
void addDeliveryFee(MallOrder order,MallDeliveryOrder delivery, BigDecimal additionalFee,BigDecimal olditionalFee);
/**
* 重新指定配送员仅待接单状态可操作

3
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/service/mybatis/MallOrderService.java

@ -8,6 +8,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import org.apache.ibatis.annotations.Param;
import java.math.BigDecimal;
import java.util.Map;
/**
@ -38,7 +39,7 @@ public interface MallOrderService extends IService<MallOrder> {
/**
* 支付成功处理逻辑
*/
void paySuccess(String orderId);
void paySuccess(String orderId, BigDecimal totalFee);
/**
* 商家拒单触发自动退款

4
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/ShopServiceImpl.java

@ -45,7 +45,9 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.lang.Nullable;
import org.springframework.stereotype.Service;
@ -105,6 +107,8 @@ public class ShopServiceImpl implements ShopService {
@Override
public Page<Shop> findByCondition(Shop shop, Pageable pageable) {
Sort newSort = Sort.by(Sort.Direction.ASC, "status").and(pageable.getSort());
pageable = PageRequest.of(pageable.getPageNumber(), pageable.getPageSize(), newSort);
return shopDao.findAll(new Specification<Shop>() {
@Nullable
@Override

14
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/ShopTakeawayServiceImpl.java

@ -16,10 +16,11 @@ limitations under the License.
package cc.hiver.mall.serviceimpl;
import cc.hiver.mall.dao.mapper.ShopTakeawayMapper;
import cc.hiver.mall.entity.Shop;
import cc.hiver.mall.entity.ShopTakeaway;
import cc.hiver.mall.pojo.query.ShopTakeawayQuery;
import cc.hiver.mall.service.ShopTakeawayService;
import cc.hiver.mall.service.ShopService;
import cc.hiver.mall.service.ShopTakeawayService;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.extern.slf4j.Slf4j;
@ -74,6 +75,17 @@ public class ShopTakeawayServiceImpl extends ServiceImpl<ShopTakeawayMapper, Sh
public void updateByPrimaryKeySelective(ShopTakeaway shopTakeaway) {
shopTakeawayMapper.updateByPrimaryKeySelective(shopTakeaway);
ShopTakeaway old = shopTakeawayMapper.selectByPrimaryKey(shopTakeaway.getShopId());
if(shopTakeaway.getStatus() == 0){
//恢复营业
Shop shop = shopService.get(shopTakeaway.getShopId());
shop.setStatus(1);
shopService.update(shop);
}else if(shopTakeaway.getStatus() == 1){
//暂停营业
Shop shop = shopService.get(shopTakeaway.getShopId());
shop.setStatus(2);
shopService.update(shop);
}
if (old != null && old.getRegionId() != null) {
shopService.refreshShopCache(old.getShopId(), old.getRegionId());
}

11
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/MallDeliveryOrderServiceImpl.java

@ -488,8 +488,7 @@ public class MallDeliveryOrderServiceImpl extends ServiceImpl<MallDeliveryOrderM
*/
@Override
@Transactional(rollbackFor = Exception.class)
public void addDeliveryFee(String orderId,String deliveryId, java.math.BigDecimal additionalFee, java.math.BigDecimal olditionalFee) {
MallDeliveryOrder delivery = this.getById(deliveryId);
public void addDeliveryFee(MallOrder order,MallDeliveryOrder delivery, java.math.BigDecimal additionalFee, java.math.BigDecimal olditionalFee) {
if (delivery == null) {
throw new RuntimeException("配送单不存在");
}
@ -505,15 +504,15 @@ public class MallDeliveryOrderServiceImpl extends ServiceImpl<MallDeliveryOrderM
java.math.BigDecimal newOrderFee = olditionalFee.add(additionalFee);
LambdaUpdateWrapper<MallOrder> uwOrder = new LambdaUpdateWrapper<>();
uwOrder.eq(MallOrder::getId, orderId)
.set(MallOrder::getDeliveryFee, newOrderFee);
uwOrder.eq(MallOrder::getId, order.getId())
.set(MallOrder::getDeliveryFee, newOrderFee).set(MallOrder::getTotalAmount, order.getTotalAmount().add(additionalFee));
mallOrderService.update(uwOrder);
LambdaUpdateWrapper<MallDeliveryOrder> uw = new LambdaUpdateWrapper<>();
uw.eq(MallDeliveryOrder::getId, deliveryId)
uw.eq(MallDeliveryOrder::getId, delivery.getId())
.set(MallDeliveryOrder::getDeliveryFee, newFee);
this.update(uw);
log.info("配送单 {} 配送费增加 {},更新后为 {}", deliveryId, additionalFee, newFee);
log.info("配送单 {} 配送费增加 {},更新后为 {}", delivery.getId(), additionalFee, newFee);
}
/**

19
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/serviceimpl/mybatis/MallOrderServiceImpl.java

@ -13,6 +13,7 @@ import cc.hiver.mall.pojo.query.MallOrderPageQuery;
import cc.hiver.mall.pojo.vo.MallOrderVO;
import cc.hiver.mall.service.CommentService;
import cc.hiver.mall.service.ShopService;
import cc.hiver.mall.service.mybatis.MallDeliveryOrderService;
import cc.hiver.mall.service.mybatis.MallOrderGroupService;
import cc.hiver.mall.service.mybatis.MallOrderService;
import cc.hiver.mall.utils.MerchantOrderSeqUtil;
@ -83,6 +84,9 @@ public class MallOrderServiceImpl extends ServiceImpl<MallOrderMapper, MallOrder
@Autowired
private MallOrderGoodsMapper mallOrderGoodsMapper;
@Autowired
private MallDeliveryOrderService mallDeliveryOrderService;
@Autowired
JPushServiceImpl jPushService;
@ -469,7 +473,9 @@ public class MallOrderServiceImpl extends ServiceImpl<MallOrderMapper, MallOrder
@Override
@Transactional(rollbackFor = Exception.class)
public void paySuccess(String orderId) {
public void paySuccess(String orderId,BigDecimal totalFee) {
if (orderId != null && orderId.startsWith("ORDER_")) {
orderId = orderId.substring(6);
MallOrder order = this.getById(orderId);
if (order == null) throw new RuntimeException("订单不存在");
if (order.getStatus() != STATUS_WAIT_PAY) {
@ -541,6 +547,17 @@ public class MallOrderServiceImpl extends ServiceImpl<MallOrderMapper, MallOrder
mallOrderGroupService.checkAndActivateGroup(group.getId());
}
}
}else if(orderId != null && orderId.startsWith("ORDERDE_")){
orderId = orderId.substring(8);
MallOrder order = this.getById(orderId);
if(order.getOrderType() == ORDER_TYPE_FACETOFACE){
MallDeliveryOrder delivery = mallDeliveryOrderMapper.selectByGroupId(orderId);
mallDeliveryOrderService.addDeliveryFee(order,delivery, totalFee,order.getDeliveryFee());
}else{
MallDeliveryOrder delivery = mallDeliveryOrderMapper.selectById(orderId);
mallDeliveryOrderService.addDeliveryFee(order,delivery, totalFee,order.getDeliveryFee());
}
}
}
/**

16
hiver-modules/hiver-mall/src/main/java/cc/hiver/mall/utils/KeyUtils.java

@ -22,4 +22,20 @@ public class KeyUtils {
byte[] signed = sign.sign();
return Base64.getEncoder().encodeToString(signed);
}
public static String decryptToString(String associatedData, String nonce, String ciphertext, String apiV3Key) throws Exception {
try {
javax.crypto.Cipher cipher = javax.crypto.Cipher.getInstance("AES/GCM/NoPadding");
javax.crypto.spec.SecretKeySpec key = new javax.crypto.spec.SecretKeySpec(apiV3Key.getBytes("utf-8"), "AES");
javax.crypto.spec.GCMParameterSpec spec = new javax.crypto.spec.GCMParameterSpec(128, nonce.getBytes("utf-8"));
cipher.init(javax.crypto.Cipher.DECRYPT_MODE, key, spec);
if (associatedData != null && !associatedData.isEmpty()) {
cipher.updateAAD(associatedData.getBytes("utf-8"));
}
byte[] bytes = cipher.doFinal(Base64.getDecoder().decode(ciphertext));
return new String(bytes, "utf-8");
} catch (Exception e) {
throw new Exception("AES/GCM/NoPadding 解密失败", e);
}
}
}

4
hiver-modules/hiver-social/pom.xml

@ -11,14 +11,10 @@
<dependency>
<groupId>com.github.binarywang</groupId>
<artifactId>weixin-java-mp</artifactId>
<version>4.6.0</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>cc.hiver</groupId>
<artifactId>hiver-mall</artifactId>
<version>1.0-SNAPSHOT</version>
<scope>compile</scope>
</dependency>
</dependencies>
<modelVersion>4.0.0</modelVersion>

91
pom.xml

@ -50,8 +50,13 @@
<smart.flow.version>1.0.6</smart.flow.version>
<smart.license.version>2.0</smart.license.version>
<bouncycastle.version>1.67</bouncycastle.version>
<wx.java.mp.version>4.3.0</wx.java.mp.version>
<wx.java.mp.version>4.6.0</wx.java.mp.version>
<truelicense.version>1.33</truelicense.version>
<fastjson.version>1.2.83</fastjson.version>
<sa-token.version>1.26.0</sa-token.version>
<httpclient.version>4.5.13</httpclient.version>
<ganymed-ssh2.version>build210</ganymed-ssh2.version>
<jsch.version>0.1.55</jsch.version>
<!-- 测试 -->
<extentreports.testng.version>1.2.2</extentreports.testng.version>
<selenuim.version>4.1.4</selenuim.version>
@ -247,17 +252,98 @@
<artifactId>bcpkix-jdk15on</artifactId>
<version>${bouncycastle.version}</version>
</dependency>
<!-- 微信MP -->
<!-- 微信 SDK 相关 -->
<dependency>
<groupId>com.github.binarywang</groupId>
<artifactId>wx-java-mp-spring-boot-starter</artifactId>
<version>${wx.java.mp.version}</version>
</dependency>
<dependency>
<groupId>com.github.binarywang</groupId>
<artifactId>weixin-java-mp</artifactId>
<version>${wx.java.mp.version}</version>
</dependency>
<dependency>
<groupId>com.github.binarywang</groupId>
<artifactId>wx-java-miniapp-spring-boot-starter</artifactId>
<version>${wx.java.mp.version}</version>
</dependency>
<dependency>
<groupId>com.github.binarywang</groupId>
<artifactId>weixin-java-miniapp</artifactId>
<version>${wx.java.mp.version}</version>
</dependency>
<!-- Fastjson -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>${fastjson.version}</version>
</dependency>
<!-- HTTP Client -->
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>${httpclient.version}</version>
</dependency>
<!-- Sa-Token -->
<dependency>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-spring-boot-starter</artifactId>
<version>${sa-token.version}</version>
</dependency>
<!-- SSH Tools -->
<dependency>
<groupId>ch.ethz.ganymed</groupId>
<artifactId>ganymed-ssh2</artifactId>
<version>${ganymed-ssh2.version}</version>
</dependency>
<dependency>
<groupId>com.jcraft</groupId>
<artifactId>jsch</artifactId>
<version>${jsch.version}</version>
</dependency>
<!-- Project Modules Consistency -->
<dependency>
<groupId>cc.hiver</groupId>
<artifactId>hiver-core</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>cc.hiver</groupId>
<artifactId>hiver-mall</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>cc.hiver</groupId>
<artifactId>hiver-base</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>cc.hiver</groupId>
<artifactId>hiver-social</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>cc.hiver</groupId>
<artifactId>hiver-file</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>cc.hiver</groupId>
<artifactId>hiver-app</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>cc.hiver</groupId>
<artifactId>hiver-quartz</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>cc.hiver</groupId>
<artifactId>hiver-open</artifactId>
<version>${project.version}</version>
</dependency>
<!-- License -->
<dependency>
<groupId>de.schlichtherle.truelicense</groupId>
@ -311,6 +397,7 @@
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>${spring.boot.version}</version>
<configuration>
<excludes>
<exclude>

Loading…
Cancel
Save