提交 86fa6dd6 作者: xiaowang

Merge branch 'develop'

......@@ -76,6 +76,11 @@ spec:
secretKeyRef:
name: iuav-secret
key: WECHAT_APPLET_SECRET
- name: RABBITMQ_PASSWORD
valueFrom:
secretKeyRef:
name: iuav-secret
key: RABBITMQ_PASSWORD
volumes:
- name: log-of-app
hostPath:
......
......@@ -14,4 +14,4 @@ patches:
images:
- name: REGISTRY/NAMESPACE/IMAGE:TAG
newName: mmc-registry.cn-shenzhen.cr.aliyuncs.com/sharefly-dev/oms
newTag: ce4d28ea571f7394271384ad94b0f7a773fdc8a3
newTag: 5575ae098e3769d73fba04b7148e3b86547b06ed
......@@ -20,6 +20,11 @@
</properties>
<dependencies>
<dependency>
<groupId>org.redisson</groupId>
<artifactId>redisson-spring-boot-starter</artifactId>
<version>3.15.6</version>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.2</version>
......@@ -30,7 +35,7 @@
<artifactId>java-emoji-converter</artifactId>
<version>0.1.1</version>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpcore</artifactId>
......@@ -51,6 +56,18 @@
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<!-- RabbitMQ -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
<dependency>
<groupId>com.rabbitmq</groupId>
<artifactId>amqp-client</artifactId>
<version>5.5.0</version> <!-- 支持开源所有版本 -->
</dependency>
<!-- 使用okhttp-feign-连接池技术 -->
<dependency>
<groupId>io.github.openfeign</groupId>
......@@ -236,7 +253,14 @@
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.2</version>
<configuration>
<skipTests>true</skipTests>
</configuration>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
......
......@@ -15,6 +15,7 @@ public class TDateUtil {
public static final String THREE_MONTH = "threemonth";
public static final String SIX_MONTH = "sixmonth";
public static final String ONE_YEAR = "oneyear";
public static final String TYPE = "yyyyMMddHHmmss";
public static String getCurrentDate() {
SimpleDateFormat df = new SimpleDateFormat("yyyy/MM/dd HH:mm");// 设置日期格式
......
......@@ -14,7 +14,6 @@ import io.swagger.annotations.ApiResponses;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import springfox.documentation.annotations.ApiIgnore;
import javax.servlet.http.HttpServletRequest;
import java.util.List;
......@@ -26,46 +25,47 @@ import java.util.List;
@RestController
@RequestMapping("/user-address/")
@Api(tags = {"地址管理"})
public class UserAddressController extends BaseController{
public class UserAddressController extends BaseController {
@Autowired
private UserAddressService userAddressService;
/**
* 添加地址
*
* @param request
* @param param
* @return
*/
@ApiOperation(value = "新增用户地址")
@ApiResponses({ @ApiResponse(code = 200, message = "OK", response = ResultBody.class) })
@ApiResponses({@ApiResponse(code = 200, message = "OK", response = ResultBody.class)})
@PostMapping("insert")
public ResultBody insert(HttpServletRequest request, @RequestBody @Validated(Insert.class) UserAddressVO param) {
return userAddressService.insert(param,this.getCurrentAccount(request));
return userAddressService.insert(param, this.getCurrentAccount(request));
}
@ApiOperation(value = "编辑用户地址")
@ApiResponses({ @ApiResponse(code = 200, message = "OK", response = ResultBody.class) })
@ApiResponses({@ApiResponse(code = 200, message = "OK", response = ResultBody.class)})
@PostMapping("update")
public ResultBody update(@RequestBody @Validated(Update.class) UserAddressVO param, HttpServletRequest request) {
return userAddressService.update(param,this.getCurrentAccount(request));
return userAddressService.update(param, this.getCurrentAccount(request));
}
@ApiOperation(value = "删除用户地址-根据id")
@ApiResponses({ @ApiResponse(code = 200, message = "OK", response = ResultBody.class) })
@ApiResponses({@ApiResponse(code = 200, message = "OK", response = ResultBody.class)})
@GetMapping("deleteById")
public ResultBody deleteById(Integer id){
public ResultBody deleteById(Integer id) {
return userAddressService.deleteById(id);
}
@ApiOperation(value = "根据id查询地址")
@ApiResponses({ @ApiResponse(code = 200, message = "OK", response = UserAddressDTO.class) })
@ApiResponses({@ApiResponse(code = 200, message = "OK", response = UserAddressDTO.class)})
@GetMapping("getUserAddressInfo")
public UserAddressDTO getUserAddressInfo(@RequestParam Integer userAddressId){
return userAddressService.getUserAddressInfo(userAddressId);
public ResultBody getUserAddressInfo(@RequestParam Integer userAddressId) {
return ResultBody.success(userAddressService.getUserAddressInfo(userAddressId));
}
@ApiOperation(value = "查询用户地址列表-条件查询")
@ApiResponses({ @ApiResponse(code = 200, message = "OK", response = UserAddressDTO.class) })
@ApiResponses({@ApiResponse(code = 200, message = "OK", response = UserAddressDTO.class)})
@PostMapping("selectList")
public ResultBody<List<UserAddressDTO>> selectList(@RequestBody UserAddressQO param, HttpServletRequest request) {
return userAddressService.selectList(param, this.getCurrentAccount(request));
......
......@@ -5,6 +5,7 @@ import com.mmc.oms.common.publicinterface.Insert;
import com.mmc.oms.common.publicinterface.Update;
import com.mmc.oms.common.result.ResultBody;
import com.mmc.oms.controller.BaseController;
import com.mmc.oms.controller.demand.commit.NotRepeatSubmit;
import com.mmc.oms.model.vo.demand.CommonPaymentVO;
import com.mmc.oms.model.vo.demand.DemandReleaseOrderVO;
import com.mmc.oms.service.demand.DemandReleaseOrderService;
......@@ -16,10 +17,7 @@ import lombok.NoArgsConstructor;
import org.hibernate.validator.constraints.Length;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.*;
import springfox.documentation.annotations.ApiIgnore;
import javax.servlet.http.HttpServletRequest;
......@@ -55,6 +53,7 @@ public class DemandReleaseOrderController extends BaseController {
@ApiOperation(value = "订单支付")
@ApiResponses({@ApiResponse(code = 200, message = "OK", response = ResultBody.class)})
@PostMapping("/orderPayment")
@NotRepeatSubmit(value = 3000L)
public ResultBody orderPayment(@RequestBody @Validated CommonPaymentVO commonPaymentVO, HttpServletRequest request) {
return releaseOrderService.orderPayment(commonPaymentVO, request,this.getCurrentAccount(request).getUserAccountId());
}
......@@ -68,6 +67,24 @@ public class DemandReleaseOrderController extends BaseController {
}
@ApiOperation(value = "通过id删除订单")
@GetMapping("/getDeleteOrder")
public ResultBody getDelete(@ApiParam(value = "requirementsInfoId", required = true) @RequestParam Integer requirementsInfoId ){
return releaseOrderService.getDelete(requirementsInfoId);
}
@ApiOperation(value = "通过需求id获取支付编号")
@GetMapping("/getPaymentOrderNumber")
public String getOrderNumber(@ApiParam(value = "requirementsInfoId", required = true) @RequestParam Integer requirementsInfoId){
return releaseOrderService.getOrderNumber(requirementsInfoId);
}
......
package com.mmc.oms.controller.demand.commit;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* @Author small
* @Date 2023/8/26 16:34
* @Version 1.0
*/
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface NotRepeatSubmit {
long value();
}
package com.mmc.oms.controller.demand.commit;
import com.alibaba.fastjson.JSONObject;
import com.mmc.oms.common.result.ResultBody;
import com.mmc.oms.controller.BaseController;
import com.mmc.oms.dao.demand.DemandReleaseOrderDao;
import com.mmc.oms.entity.demand.GetOrderNumberDO;
import com.mmc.oms.entity.demand.GetOrderNumberDTO;
import com.mmc.oms.model.vo.demand.CommonPaymentVO;
import com.mmc.oms.model.vo.demand.UserPayInfoVO;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.CodeSignature;
import org.aspectj.lang.reflect.MethodSignature;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.http.*;
import org.springframework.stereotype.Component;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpServletRequest;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.TimeUnit;
/**
* @Author small
* @Date 2023/8/26 16:13
* @Version 1.0
*/
@Slf4j
@Component
@Aspect
public class NotRepeatSubmitConfig extends BaseController {
@Autowired
private RedissonClient redissonClient;
@Autowired
private DemandReleaseOrderDao releaseOrderDao;
@Autowired
private StringRedisTemplate stringRedisTemplate;
@Autowired
private RestTemplate restTemplate;
@Value("${payment.url}")
private String paymentApp;
@Pointcut("@within(notRepeatSubmit)||@annotation(notRepeatSubmit)")
public void pointcut(NotRepeatSubmit notRepeatSubmit) {
}
@Around(value = "pointcut(notRepeatSubmit)")
public Object around(ProceedingJoinPoint proceedingJoinPoint, NotRepeatSubmit notRepeatSubmit) throws Throwable {
log.info("提交之前---");
Object result = null;
long leaseTime = notRepeatSubmit.value();
log.info("leaseTime:" + leaseTime);
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request = attributes.getRequest();
Integer userAccountId = this.getCurrentAccount(request).getUserAccountId();
String accountUriLockKey = userAccountId + "-" + request.getServletPath();
// 设置锁定资源名称,accountUriLock改为userid+uri作为标识,作为测试写死
// String accountUriLockKey = "accountUriLock";
RLock accountUriLock = redissonClient.getLock(accountUriLockKey);
boolean tryLock;
MethodSignature signature = (MethodSignature) proceedingJoinPoint.getSignature();
Method method = signature.getMethod();
String name = method.getDeclaringClass().getName();
String[] parameterNames = signature.getParameterNames();
Map<String, Object> map = new HashMap<String, Object>();
Object[] values = proceedingJoinPoint.getArgs();
String[] names = ((CodeSignature) proceedingJoinPoint.getSignature()).getParameterNames();
for (int i = 0; i < names.length; i++) {
map.put(names[i], values[i]);
}
log.info(map+"");
CommonPaymentVO commonPaymentsVO = (CommonPaymentVO) map.get("commonPaymentVO");
//尝试获取分布式锁
//-1为永久 leaseTime 最多等待几秒 上锁以后leaseTime秒自动解锁
tryLock = accountUriLock.tryLock(-1, leaseTime, TimeUnit.MILLISECONDS);
log.info("tryLock:" + tryLock);
if (tryLock) {
try {
String orderNumber = commonPaymentsVO.getOrderNumber();
String json = stringRedisTemplate.opsForValue().get(orderNumber);
GetOrderNumberDTO getOrderNumberDTO = JSONObject.parseObject(json, GetOrderNumberDTO.class);
if (getOrderNumberDTO!=null){
GetOrderNumberDO getOrderNumberDO = new GetOrderNumberDO(getOrderNumberDTO);
if (getOrderNumberDTO.getRequirementsInfoId()!=null){
String orderNumber1 = releaseOrderDao.getOrderNumber(getOrderNumberDO.getRequirementsInfoId());
if (orderNumber1!=null){
UserPayInfoVO userPayInfoVO = queryUserPayInfo(orderNumber1, request);
if (userPayInfoVO.getTradeState()!="SUCCESS"){
releaseOrderDao.getDelete(getOrderNumberDO.getRequirementsInfoId());
}
}
int i = releaseOrderDao.selectOrderNumberDO(getOrderNumberDO.getRequirementsInfoId());
if (i!=0){
return ResultBody.error("当前需求已有人支付");
}
}
}
// 查询订单库存判断是否大于0
// 大于0表示还有库存可以更新订单库存将库存数字减一更新到数据库中
// 不大于0表示没有库存了本次请求就终止
log.info("正常提交:");
result = proceedingJoinPoint.proceed();
} catch (Exception e) {
log.info("主程序异常:" + e);
throw new Exception(e);
}
} else {
log.info("重复提交:" + accountUriLockKey);
}
log.info("提交之后---");
return result;
}
/**
* 通过订单编号查看是否支付成功
*
* @param orderNo
* @return
*/
public UserPayInfoVO queryUserPayInfo(String orderNo, HttpServletRequest request) {
String token = request.getHeader("token");
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
headers.add("token", token);
HttpEntity<String> entity = new HttpEntity<>(JSONObject.toJSONString(orderNo), headers);
ResponseEntity<UserPayInfoVO> exchange = restTemplate.exchange(paymentApp + "wechat/queryUserPayInfo?orderNo=" + orderNo, HttpMethod.GET, entity, UserPayInfoVO.class);
UserPayInfoVO body = exchange.getBody();
return body;
}
}
package com.mmc.oms.dao.demand;
import com.mmc.oms.common.result.ResultBody;
import com.mmc.oms.entity.demand.DemandReleaseOrderDO;
import com.mmc.oms.entity.demand.GetOrderNumberDO;
import com.mmc.oms.model.vo.demand.UserPayInfoVO;
import org.apache.ibatis.annotations.Mapper;
......@@ -20,4 +22,12 @@ public interface DemandReleaseOrderDao {
void updateOrderDemand(DemandReleaseOrderDO releaseOrderDO);
DemandReleaseOrderDO selectPhone(String orderNumber);
void insertService(GetOrderNumberDO getOrderNumberDO);
int selectOrderNumberDO(Integer requirementsInfoId);
void getDelete(Integer requirementsInfoId);
String getOrderNumber(Integer requirementsInfoId);
}
package com.mmc.oms.dao.demand;
import org.apache.ibatis.annotations.Mapper;
/**
* @Author small
* @Date 2023/8/19 15:28
* @Version 1.0
*/
@Mapper
public interface PublishServiceOrderDao {
}
package com.mmc.oms.dao.topup;
import com.mmc.oms.entity.topup.TopUpOrderDO;
import org.apache.ibatis.annotations.Mapper;
/**
* @Author LW
* @date 2023/8/23 14:22
* 概要:
*/
@Mapper
public interface TopUpOrderDao {
void insertTopUpOrder(TopUpOrderDO topUpOrderDO);
void updateTopUpOrderInfo(TopUpOrderDO topUpOrderDO);
}
package com.mmc.oms.entity.demand;
import com.mmc.oms.model.vo.demand.OrderRequestParamsVO;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.math.BigDecimal;
/**
* @Author small
* @Date 2023/8/19 17:03
* @Version 1.0
*/
@Builder
@Data
@AllArgsConstructor
@NoArgsConstructor
public class GetOrderNumberDO {
private Integer id;
private static final long serialVersionUID = 75097833899496576L;
@ApiModelProperty(value = "支付订单编号", example = "dadasdas")
private String paymentOrderNumber;
@ApiModelProperty(value = "微信需要支付金额", example = "100")
private BigDecimal weChatPay;
@ApiModelProperty(value = "用户id", example = "100", hidden = true)
private Integer userAccountId;
@ApiModelProperty(value = "服务id")
private Integer requirementsInfoId;
public GetOrderNumberDO(GetOrderNumberDTO getOrderNumberDTO){
this.paymentOrderNumber=getOrderNumberDTO.getPaymentOrderNumber();
this.weChatPay=getOrderNumberDTO.getWeChatPay();
this.userAccountId=getOrderNumberDTO.getUserAccountId();
this.requirementsInfoId= getOrderNumberDTO.getRequirementsInfoId();
}
public OrderRequestParamsVO orderRequestParamsVO() {
return OrderRequestParamsVO.builder().orderNo(this.paymentOrderNumber)
.description("发布服务需求支付").
orderPort(4)
.build();
}
}
package com.mmc.oms.entity.demand;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.math.BigDecimal;
/**
* @Author small
* @Date 2023/8/19 16:59
* @Version 1.0
*/
@Builder
@Data
@AllArgsConstructor
@NoArgsConstructor
public class GetOrderNumberDTO implements Serializable {
private static final long serialVersionUID = 75097833899496576L;
@ApiModelProperty(value = "制度订单编号", example = "dadasdas")
private String paymentOrderNumber;
@ApiModelProperty(value = "微信需要支付金额", example = "100")
private BigDecimal weChatPay;
@ApiModelProperty(value = "用户id", example = "100", hidden = true)
private Integer userAccountId;
@ApiModelProperty(value = "服务id")
private Integer requirementsInfoId;
}
package com.mmc.oms.entity.topup;
import com.mmc.oms.model.vo.demand.OrderRequestParamsVO;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.Date;
/**
* @Author LW
* @date 2023/8/19 13:38
* 概要:
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class TopUpOrderDO {
private Integer id;
private Integer version;
private Integer userAccountId;
private String orderNo;
private Integer amount;
private String tradeState;
private String tradeStateDesc;
private String description;
private Date createTime;
private Date updateTime;
public TopUpOrderDO(OrderRequestParamsVO orderRequestParamsVO, Integer userAccountId) {
this.userAccountId = userAccountId;
this.orderNo = orderRequestParamsVO.getOrderNo();
this.amount = orderRequestParamsVO.getAmount();
}
}
package com.mmc.oms.feign;
import com.mmc.oms.model.dto.mall.CooperationTagVO;
import com.mmc.oms.model.dto.user.UserAccountSimpleDTO;
import com.mmc.oms.model.qo.mall.BUserAccountQO;
//import io.swagger.annotations.ApiParam;
//import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.*;
import java.util.List;
import com.mmc.oms.common.result.ResultBody;
import com.mmc.oms.feign.hystrix.UserAppApiHystrix;
import com.mmc.oms.model.vo.wallet.TopUpOrderVO;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
/**
* @author: zj
* @Date: 2023/5/18 17:06
*/
//@FeignClient(url = "${userapp.url}", name = "cms-svc", fallback = UserAppApiHystrix.class)
@FeignClient(url = "${userapp.url}", name = "cms-svc", fallback = UserAppApiHystrix.class)
public interface UserAppApi {
/**
* 根据用户id获取基本信息
* @param userAccountId
* @return
*/
@RequestMapping(value = "user-account/feignGetUserSimpleInfo", method = RequestMethod.GET)
public UserAccountSimpleDTO feignGetUserSimpleInfo(@RequestParam Integer userAccountId, @RequestHeader("token") String token);
/**
* 根据地区信息查询用户id
* @param provinceCode
* @param cityCode
* @param districtCode
* @return
*/
@GetMapping("user-account/feignListUserAccountIds")
List<Integer> feignListUserAccountIds(@RequestParam Integer provinceCode, @RequestParam(required = false) Integer cityCode,
@RequestParam(required = false) Integer districtCode, @RequestHeader(value = "token", required = false) String token);
/**
* 获取用户集合列表页面
*
* @param bUserAccountQO 问:b用户帐户
* @return {@link List}<{@link UserAccountSimpleDTO}>
*/
@PostMapping("back-user/feignListBAccountPage")
List<UserAccountSimpleDTO> feignListBAccountPage( @RequestBody BUserAccountQO bUserAccountQO, @RequestHeader("token") String token);
/**
* 根据用户id查询用户信息
* @param ids
* @param token
* @return
*/
@PostMapping("user-account/feignListUserAccountByIds")
List<UserAccountSimpleDTO> feignListUserAccountByIds(@RequestBody List<Integer> ids, @RequestHeader("token") String token);
/**
* 查询推荐人信息
* @param userIds
* @return
*/
@PostMapping("user-account/feignListRcdUserInfo")
List<UserAccountSimpleDTO> feignListRcdUserInfo(@RequestBody List<Integer> userIds);
/**
* 查询上级id
* @param userAccountId
* @return
*/
@GetMapping("user-account/feignGetSuperiorRef")
Integer feignGetSuperiorRef(@RequestParam Integer userAccountId);
/**
* 查询上级推荐人信息
* @param userAccountId
* @return
*/
@GetMapping("user-account/feignGetUserRcdInfo")
UserAccountSimpleDTO feignGetUserRcdInfo(@RequestParam Integer userAccountId);
/**
* 用户合作标签
* @return
*/
@GetMapping("cooperation/feignListCooperationTag")
List<CooperationTagVO> feignListCooperationTag();
@PostMapping("pay/feignTopUpCash")
public ResultBody feignTopUpCash(@RequestBody TopUpOrderVO topUpOrderVO);
}
package com.mmc.oms.feign.config;
import com.mmc.oms.feign.hystrix.PmsAppApiHystrix;
import com.mmc.oms.feign.hystrix.UserAppApiHystrix;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
......@@ -14,8 +15,13 @@ import org.springframework.context.annotation.Configuration;
public class FeignConfiguration {
@Bean(name = "pmsAppApiHystrix")
public PmsAppApiHystrix PmsAppApi() {
public PmsAppApiHystrix pmsAppApi() {
return new PmsAppApiHystrix();
}
@Bean(name = "userAppApiHystrix")
public UserAppApiHystrix userAppApi() {
return new UserAppApiHystrix();
}
}
package com.mmc.oms.feign.hystrix;
import com.mmc.oms.common.result.ResultBody;
import com.mmc.oms.feign.UserAppApi;
import com.mmc.oms.model.dto.mall.CooperationTagVO;
import com.mmc.oms.model.dto.user.UserAccountSimpleDTO;
import com.mmc.oms.model.qo.mall.BUserAccountQO;
import com.mmc.oms.model.vo.wallet.TopUpOrderVO;
import lombok.extern.slf4j.Slf4j;
import java.util.List;
/**
* @author: zj
* @Date: 2023/5/18 17:08
*/
@Slf4j
public class UserAppApiHystrix implements UserAppApi {
@Override
public UserAccountSimpleDTO feignGetUserSimpleInfo(Integer userAccountId, String token) {
log.error("熔断:feignGetUserSimpleInfo:{}", userAccountId);
return null;
}
@Override
public List<Integer> feignListUserAccountIds(Integer provinceCode, Integer cityCode, Integer districtCode, String token) {
log.error("熔断:feignListUserAccountIds:{}, {}, {}", provinceCode, cityCode, districtCode);
return null;
}
@Override
public List<UserAccountSimpleDTO> feignListBAccountPage(BUserAccountQO bUserAccountQO, String token) {
log.error("熔断:feignListBAccountPage:{}", bUserAccountQO);
return null;
}
@Override
public List<UserAccountSimpleDTO> feignListUserAccountByIds(List<Integer> ids, String token) {
log.error("熔断:feignListUserAccountByIds:{}", ids);
return null;
}
@Override
public List<UserAccountSimpleDTO> feignListRcdUserInfo(List<Integer> userIds) {
log.error("熔断:feignListRcdUserInfo:{}", userIds);
return null;
}
@Override
public Integer feignGetSuperiorRef(Integer userAccountId) {
log.error("熔断:feignGetSuperiorRef:{}", userAccountId);
return null;
}
@Override
public UserAccountSimpleDTO feignGetUserRcdInfo(Integer userAccountId) {
log.error("熔断:feignGetUserRcdInfo:{}", userAccountId);
return null;
}
@Override
public List<CooperationTagVO> feignListCooperationTag() {
log.error("熔断:feignListCooperationTag:{}");
return null;
public ResultBody feignTopUpCash(TopUpOrderVO topUpOrderVO) {
log.error("熔断:UserAppApiHystrix.feignTopUpCash==error==>param:{}", topUpOrderVO);
return ResultBody.error("-1", "远程调用失败");
}
}
......@@ -18,10 +18,13 @@ import lombok.NoArgsConstructor;
public class CommonPaymentVO {
@ApiModelProperty(value = "订单编号",example = "R202307251459553408130")
@ApiModelProperty(value = "订单编号", example = "R202307251459553408130")
private String orderNumber;
@ApiModelProperty(value = "订单来源 0:产品商城 1:租赁订单 2:培训订单 3发布需求 ...其他后续加")
@ApiModelProperty(value = "订单来源 0:产品商城 1:租赁订单 2:培训订单 3发布需求 4服务需求发布 5充值 ...其他后续加")
private Integer orderPort;
@ApiModelProperty(value = "金额:单位(分)")
private Integer amount;
}
......@@ -26,4 +26,6 @@ public class OrderRequestParamsVO implements Serializable {
private Integer amount;
@ApiModelProperty(value = "订单来源 0:产品商城 1:租赁订单 2:培训订单 ...其他后续加")
private Integer orderPort;
@ApiModelProperty(value = "附加数据,在查询API和支付通知中原样返回,可作为自定义参数使用,实际情况下只有支付完成状态才会返回该字段。")
private String attach;
}
package com.mmc.oms.model.vo.wallet;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @Author LW
* @date 2023/8/23 13:37
* 概要:
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class TopUpOrderVO {
@ApiModelProperty(value = "支付用户的openid")
private String openid;
@ApiModelProperty(value = "订单编号")
private String orderNo;
@ApiModelProperty(value = "金额(分)")
private Integer amount;
@ApiModelProperty(value = "订单状态")
private String tradeState;
@ApiModelProperty(value = "交易状态描述")
private String tradeStateDesc;
}
package com.mmc.oms.mq.constant;
/**
* @author: lw
* @Date: 2023/8/23 11:26
*/
public class RabbitmqConstant {
public final static String USER_TOP_UP_DIRECT_EXCHANGE = "USER_TOP_UP_DIRECT_EXCHANGE";
public final static String USER_TOP_UP_DIRECT_QUEUE = "USER_TOP_UP_DIRECT_QUEUE";
public final static String USER_TOP_UP_ROUTING_KEY = "USER_TOP_UP_ROUTING_KEY";
}
package com.mmc.oms.mq.listener;
import com.alibaba.fastjson.JSONObject;
import com.mmc.oms.dao.topup.TopUpOrderDao;
import com.mmc.oms.entity.topup.TopUpOrderDO;
import com.mmc.oms.model.vo.wallet.TopUpOrderVO;
import com.mmc.oms.mq.constant.RabbitmqConstant;
import com.rabbitmq.client.Channel;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.messaging.handler.annotation.Payload;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
/**
* @Author LW
* @date 2023/6/29 10:35 概要:
*/
@Slf4j
@Component
public class MqConsumer {
@Resource
TopUpOrderDao topUpOrderDao;
@RabbitListener(queues = RabbitmqConstant.USER_TOP_UP_DIRECT_QUEUE)
public void subscribeDirectQueue(@Payload String topUpOrder, Channel channel, Message message) {
TopUpOrderVO topUpOrderVO = JSONObject.parseObject(topUpOrder, TopUpOrderVO.class);
log.info("<==========用户充值订单消费开始:订单信息是---->{}==========>", topUpOrderVO);
// 根据消费的消息修改充值订单的信息
TopUpOrderDO topUpOrderDO = new TopUpOrderDO();
topUpOrderDO.setTradeState(topUpOrderVO.getTradeState());
topUpOrderDO.setTradeStateDesc(topUpOrderVO.getTradeStateDesc());
topUpOrderDO.setOrderNo(topUpOrderVO.getOrderNo());
topUpOrderDao.updateTopUpOrderInfo(topUpOrderDO);
log.info("<==========用户充值订单消费结束==========>");
}
}
......@@ -19,4 +19,8 @@ public interface DemandReleaseOrderService {
ResultBody orderPayment(CommonPaymentVO commonPaymentVO, HttpServletRequest request, Integer userAccountId);
ResultBody getPublishPhone(CommonPaymentVO commonPaymentVO, HttpServletRequest request, Integer userAccountId);
ResultBody getDelete(Integer requirementsInfoId);
String getOrderNumber(Integer requirementsInfoId);
}
......@@ -13,6 +13,13 @@ spring:
jedis:
pool:
max-active: 2
#rabbitMQ
rabbitmq:
host: amqp-cn-zvp2ozhnj001.cn-shenzhen.amqp-0.vpc.mq.amqp.aliyuncs.com
port: 5672
username: MjphbXFwLWNuLXp2cDJvemhuajAwMTpMVEFJNEZ6Q3B5ckEzM1BlZ254V1M2WFY=
password: ${RABBITMQ_PASSWORD}
virtual-host: dev
main:
allow-circular-references: true
......
......@@ -16,6 +16,14 @@ spring:
main:
allow-circular-references: true
#rabbitMQ
rabbitmq:
host: amqp-cn-zvp2ozhnj001.cn-shenzhen.amqp-0.vpc.mq.amqp.aliyuncs.com
port: 5672
username: MjphbXFwLWNuLXp2cDJvemhuajAwMTpMVEFJNEZ6Q3B5ckEzM1BlZ254V1M2WFY=
password: ${RABBITMQ_PASSWORD}
virtual-host: prod
springfox:
documentation:
swagger-ui:
......
......@@ -37,4 +37,34 @@
<select id="selectPhone" resultType="com.mmc.oms.entity.demand.DemandReleaseOrderDO">
select publish_phone,requirements_info_id,user_account_id,order_number from demand_release_order where order_number = #{orderNumber}
</select>
<insert id="insertService" parameterType="com.mmc.oms.entity.demand.GetOrderNumberDO"
keyProperty="id" useGeneratedKeys="true">
INSERT INTO service_demand_order(payment_order_number, we_chat_pay, user_account_id, create_time,update_time,requirements_info_id)
VALUES (#{paymentOrderNumber}, #{weChatPay},#{userAccountId},NOW(),NOW(),#{requirementsInfoId});
</insert>
<select id="selectOrderNumberDO" resultType="java.lang.Integer">
SELECT
count(*)
FROM
service_demand_order
WHERE
requirements_info_id =#{requirementsInfoId}
</select>
<delete id="getDelete">
delete
from service_demand_order
where requirements_info_id = #{requirementsInfoId}
</delete>
<select id="getOrderNumber" resultType="java.lang.String">
SELECT
payment_order_number
FROM
service_demand_order
WHERE
requirements_info_id =#{requirementsInfoId}
</select>
</mapper>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.mmc.oms.dao.demand.PublishServiceOrderDao">
</mapper>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.mmc.oms.dao.topup.TopUpOrderDao">
<insert id="insertTopUpOrder">
insert into top_up_order (user_account_id,
order_no,
amount,
trade_state,
description)
values (#{userAccountId}, #{orderNo}, #{amount}, #{tradeState}, #{description})
</insert>
<update id="updateTopUpOrderInfo">
update top_up_order
set trade_state = #{tradeState},
trade_state_desc = #{tradeStateDesc}
where order_no = #{orderNo}
</update>
</mapper>
\ No newline at end of file
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论