提交 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);
}
package com.mmc.oms.service.demand.Impl;
import com.alibaba.fastjson.JSONObject;
import com.mmc.oms.common.RedisConstant;
import com.mmc.oms.common.ResultEnum;
import com.mmc.oms.common.json.JsonUtil;
import com.mmc.oms.common.result.ResultBody;
import com.mmc.oms.common.util.CodeUtil;
import com.mmc.oms.common.util.TDateUtil;
import com.mmc.oms.controller.demand.util.EmojiUtils;
import com.mmc.oms.dao.demand.DemandReleaseOrderDao;
import com.mmc.oms.dao.demand.PublishServiceOrderDao;
import com.mmc.oms.dao.topup.TopUpOrderDao;
import com.mmc.oms.entity.demand.DemandReleaseOrderDO;
import com.mmc.oms.model.dto.mall.ProductSpecPriceDTO;
import com.mmc.oms.model.dto.order.OrderInfoDTO;
import com.mmc.oms.entity.demand.GetOrderNumberDO;
import com.mmc.oms.entity.demand.GetOrderNumberDTO;
import com.mmc.oms.entity.topup.TopUpOrderDO;
import com.mmc.oms.model.vo.demand.CommonPaymentVO;
import com.mmc.oms.model.vo.demand.DemandReleaseOrderVO;
import com.mmc.oms.model.vo.demand.OrderRequestParamsVO;
import com.mmc.oms.model.vo.demand.UserPayInfoVO;
import com.mmc.oms.service.demand.DemandReleaseOrderService;
import io.swagger.annotations.ApiModelProperty;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.data.redis.core.HashOperations;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.http.*;
import org.springframework.stereotype.Service;
import org.springframework.util.MultiValueMap;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.interceptor.TransactionAspectSupport;
import org.springframework.web.client.RestClientException;
import org.springframework.web.client.RestTemplate;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.math.BigDecimal;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
......@@ -39,6 +44,11 @@ import java.util.Map;
@Service
public class DemandReleaseOrderServiceImpl implements DemandReleaseOrderService {
@Autowired
private PublishServiceOrderDao serviceOrderDao;
@Autowired
private DemandReleaseOrderDao releaseOrderDao;
......@@ -51,6 +61,9 @@ public class DemandReleaseOrderServiceImpl implements DemandReleaseOrderService
@Autowired
private StringRedisTemplate stringRedisTemplate;
@Resource
private TopUpOrderDao topUpOrderDao;
@Override
public ResultBody publish(DemandReleaseOrderVO demandReleaseOrderVO, HttpServletRequest request) {
DemandReleaseOrderDO requirementsInfoDO = new DemandReleaseOrderDO(demandReleaseOrderVO);
......@@ -59,10 +72,86 @@ public class DemandReleaseOrderServiceImpl implements DemandReleaseOrderService
}
@Override
@Transactional(rollbackFor = Exception.class)
public ResultBody orderPayment(CommonPaymentVO commonPaymentVO, HttpServletRequest request, Integer userAccountId) {
String token = request.getHeader("token");
switch (commonPaymentVO.getOrderPort().toString()) {
case "3":
return orderPost(commonPaymentVO, token);
case "4":
//发布服务需求支付
return publishServicePay(commonPaymentVO, token, userAccountId);
case "5":
return topUpOrder(commonPaymentVO, token, userAccountId);
default:
return ResultBody.error("无效的订单类型操作!");
}
}
@Transactional(rollbackFor = Exception.class)
public ResultBody topUpOrder(CommonPaymentVO commonPaymentVO, String token, Integer userAccountId) {
// 生成充值订单编号 规则T加时间戳加用户id加随机数4位
ResultBody resultBody = null;
try {
String TOrderNo = "T" + TDateUtil.getDateStr(new Date(), TDateUtil.TYPE) + userAccountId + CodeUtil.getRandomNum(4);
OrderRequestParamsVO orderRequestParamsVO = new OrderRequestParamsVO();
orderRequestParamsVO.setAmount(commonPaymentVO.getAmount());
orderRequestParamsVO.setOrderNo(TOrderNo);
orderRequestParamsVO.setDescription("云享金充值");
orderRequestParamsVO.setOrderPort(5);
orderRequestParamsVO.setAttach("TOP_UP");
TopUpOrderDO topUpOrderDO = new TopUpOrderDO(orderRequestParamsVO, userAccountId);
topUpOrderDO.setTradeState("WAIT");
topUpOrderDO.setDescription("充值云享金");
// 充值订单记录至充值订单表
topUpOrderDao.insertTopUpOrder(topUpOrderDO);
resultBody = releaseOrder(orderRequestParamsVO, token);
if (!"200".equals(resultBody.getCode())) {
throw new RuntimeException("调用微信支付方法失败!");
}
} catch (RuntimeException e) {
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
} finally {
return resultBody;
}
}
/**
* 服务需求发布
*
* @param commonPaymentVO
* @param token
* @param userAccountId
* @return
*/
private ResultBody publishServicePay(CommonPaymentVO commonPaymentVO, String token,Integer userAccountId) {
if ("4".equals(commonPaymentVO.getOrderPort().toString())){
String orderNumber = commonPaymentVO.getOrderNumber();
String json = stringRedisTemplate.opsForValue().get(orderNumber);
GetOrderNumberDTO getOrderNumberDTO = JSONObject.parseObject(json, GetOrderNumberDTO.class);
GetOrderNumberDO getOrderNumberDO = new GetOrderNumberDO(getOrderNumberDTO);
if (getOrderNumberDTO.getRequirementsInfoId()!=null){
int i = releaseOrderDao.selectOrderNumberDO(getOrderNumberDO.getRequirementsInfoId());
if (i!=0){
return ResultBody.error("当前需求已有人支付");
}
}
releaseOrderDao.insertService(getOrderNumberDO);
BigDecimal paramMoney = getOrderNumberDO.getWeChatPay();
BigDecimal multiply = paramMoney.multiply(new BigDecimal(100));
int i = multiply.intValue();
OrderRequestParamsVO orderRequestParamsVO = getOrderNumberDO.orderRequestParamsVO();
orderRequestParamsVO.setAmount(i);
ResultBody resultBody = releaseOrder(orderRequestParamsVO, token);
stringRedisTemplate.opsForValue().set(getOrderNumberDO.getPaymentOrderNumber()+getOrderNumberDO.getUserAccountId(), JsonUtil.parseObjToJson(getOrderNumberDO));
return resultBody;
}
return ResultBody.success();
}
if ("3".equals(commonPaymentVO.getOrderPort().toString())){
private ResultBody orderPost(CommonPaymentVO commonPaymentVO, String token) {
if ("3".equals(commonPaymentVO.getOrderPort().toString())) {
DemandReleaseOrderDO demandReleaseOrderDO = releaseOrderDao.orderPayment(commonPaymentVO.getOrderNumber());
BigDecimal paramMoney = demandReleaseOrderDO.getParamMoney();
BigDecimal multiply = paramMoney.multiply(new BigDecimal(100));
......@@ -70,13 +159,13 @@ public class DemandReleaseOrderServiceImpl implements DemandReleaseOrderService
OrderRequestParamsVO orderRequestParamsVO = demandReleaseOrderDO.buildOrderRequestParamsVO();
orderRequestParamsVO.setAmount(i);
BigDecimal practicalMoney = demandReleaseOrderDO.getPracticalMoney();
if (practicalMoney!=null){
return ResultBody.error(ResultEnum.THE_CURRENT_DEMAND_IS_PAID);
if (practicalMoney != null) {
return ResultBody.error(ResultEnum.THE_CURRENT_DEMAND_IS_PAID);
}
if (i!=0){
return releaseOrder(orderRequestParamsVO, token);
}else if(i==0){
return ResultBody.error(ResultEnum.NO_PAYMENT_REQUIRED);
if (i != 0) {
return releaseOrder(orderRequestParamsVO, token);
} else if (i == 0) {
return ResultBody.error(ResultEnum.NO_PAYMENT_REQUIRED);
}
}
return ResultBody.success();
......@@ -84,7 +173,8 @@ public class DemandReleaseOrderServiceImpl implements DemandReleaseOrderService
@Override
public ResultBody getPublishPhone(CommonPaymentVO commonPaymentVO, HttpServletRequest request, Integer userAccountId) {
public ResultBody getPublishPhone(CommonPaymentVO commonPaymentVO, HttpServletRequest request, Integer
userAccountId) {
String token = request.getHeader("token");
HttpHeaders headers = new HttpHeaders();
headers.add("token", token);
......@@ -92,20 +182,32 @@ public class DemandReleaseOrderServiceImpl implements DemandReleaseOrderService
ResponseEntity<UserPayInfoVO> exchange = restTemplate.exchange(paymentUrl + "/wechat/queryUserPayInfo" + "?orderNo=" + commonPaymentVO.getOrderNumber(), HttpMethod.GET, entity, UserPayInfoVO.class);
UserPayInfoVO body = exchange.getBody();
if ( body.getWxNotifyPayerTotal()!=null){
if (body.getWxNotifyPayerTotal() != null) {
BigDecimal divide = BigDecimal.valueOf(Long.valueOf(body.getWxNotifyPayerTotal())).divide(new BigDecimal(100));
DemandReleaseOrderDO requirementsInfoDO = new DemandReleaseOrderDO(body,divide);
DemandReleaseOrderDO requirementsInfoDO = new DemandReleaseOrderDO(body, divide);
releaseOrderDao.updateOrderDemand(requirementsInfoDO);
DemandReleaseOrderDO demandReleaseOrderDO = releaseOrderDao.selectPhone(requirementsInfoDO.getOrderNumber());
stringRedisTemplate.opsForValue().set(demandReleaseOrderDO.getRequirementsInfoId().toString(), JsonUtil.parseObjToJson(demandReleaseOrderDO));
return ResultBody.success(demandReleaseOrderDO.getPublishPhone());
return ResultBody.success(demandReleaseOrderDO.getPublishPhone());
}
return ResultBody.success();
}
@Override
public ResultBody getDelete(Integer requirementsInfoId) {
releaseOrderDao.getDelete(requirementsInfoId);
return ResultBody.success();
}
@Override
public String getOrderNumber(Integer requirementsInfoId) {
String orderNumber = releaseOrderDao.getOrderNumber(requirementsInfoId);
return orderNumber;
}
public ResultBody releaseOrder(OrderRequestParamsVO orderRequestParamsVO, String token) {
boolean emoji = EmojiUtils.containsEmoji(orderRequestParamsVO.getDescription());
if (emoji==true){
boolean emoji = EmojiUtils.containsEmoji(orderRequestParamsVO.getDescription());
if (emoji == true) {
orderRequestParamsVO.setDescription(EmojiUtils.emojiConverter2Html(orderRequestParamsVO.getDescription()));
}
HttpHeaders headers = new HttpHeaders();
......@@ -113,10 +215,10 @@ public class DemandReleaseOrderServiceImpl implements DemandReleaseOrderService
headers.add("token", token);
HttpEntity<String> entity = new HttpEntity<>(JSONObject.toJSONString(orderRequestParamsVO), headers);
ResponseEntity<Object> exchange = null;
Map<String , Object> map = new HashMap<>();
Map<String, Object> map = new HashMap<>();
try {
exchange = restTemplate.exchange(paymentUrl + "wechat/pay", HttpMethod.POST, entity, Object.class);
map.put("Ok", exchange.getBody());
map.put("Ok", exchange.getBody());
} catch (RestClientException e) {
return ResultBody.error(ResultEnum.THIRD_PARTY_ERRORS);
}
......
......@@ -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 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论