提交 911042ba authored 作者: zhu's avatar zhu

1.develop

上级 e403d0df
......@@ -46,6 +46,7 @@ public class SaTokenConfig implements WebMvcConfigurer {
.excludePathPatterns("/v1/system/home/patientMiniAppHome")
.excludePathPatterns("/v1/system/payment/payNotify")
.excludePathPatterns("/v1/system/payment/refundNotify")
.excludePathPatterns("/v1/system/sms/callback")
// swagger 放行
.excludePathPatterns("/webjars/**")
.excludePathPatterns("/doc.html")
......
......@@ -5,4 +5,9 @@ import lombok.Data;
@Data
public class Constant {
public static final String SMS_PREFIX = "sms_code_login_";
public static final String DOCTOR_ASKS = "DOCTOR_ASKS";
/**
* 订单未支付到期自动取消,15分钟
*/
public static final Integer ORDER_PAY_WAIT_TIME = 5*60*1000;
}
......@@ -11,8 +11,8 @@ package com.xwd.hospital.server.enums;
*/
public enum UseStateEnum {
USED("不可用"),
USEABLE("可用");
USED("USED"),
USEABLE("USEABLE");
UseStateEnum(String name) {
this.name = name;
......
......@@ -207,4 +207,15 @@ public class OrderController extends BaseController<OrderService, Order, OrderPa
public ApiResponse<Order> appraiseOrder(@RequestBody AppraiseDto appraiseDto, @AuthUser User user) {
return ApiResponse.ok( this.service.appraiseOrder(appraiseDto));
}
/**
* 患者取消订单
*
*/
@PostMapping("/cancelOrder")
@Operation(summary = "患者取消订单")
@ApiCommon
public ApiResponse<Order> cancelOrder(@RequestParam String orderNo, @AuthUser User user) {
return ApiResponse.ok( this.service.cancelOrder(orderNo));
}
}
......@@ -21,6 +21,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.xwd.hospital.server.annotation.ApiCommon;
import com.xwd.hospital.server.annotation.AuthUser;
import com.xwd.hospital.server.base.BaseController;
import com.xwd.hospital.server.constants.Constant;
import com.xwd.hospital.server.domain.User;
import com.xwd.hospital.server.rest.res.ApiCode;
import com.xwd.hospital.server.domain.Setting;
......@@ -87,5 +88,29 @@ public class SettingController extends BaseController<SettingService, Setting, S
return ApiResponse.ok(this.service.saveBatch(entityList));
}
@GetMapping("/queryDoctorAsks")
@Operation(summary = "查询医生医嘱配置")
public ApiResponse queryDoctorAsks(@AuthUser User user) {
return ApiResponse.ok(this.service.queryDoctorAsks());
}
/**
* 新增
*
* @param entity 要新增的对象
* @return 新增的对象
*/
@PostMapping("/addDoctorAsksSetting")
@Operation(summary = "新增医生医嘱配置")
public ApiResponse<Setting> addDoctorAsksSetting(@RequestBody Setting entity, @AuthUser User user) {
long count = this.service.count(Wrappers.<Setting>lambdaQuery().eq(Setting::getName, Constant.DOCTOR_ASKS))+1;
entity.setEditorId(user.getId());
entity.setEditorName(user.getUsername());
entity.setName(Constant.DOCTOR_ASKS);
entity.setCode(Constant.DOCTOR_ASKS+"_"+count);
entity.setDefault().validate(true);
this.service.save(entity);
return ApiResponse.ok(this.service.getById(entity.getId()));
}
}
......@@ -38,8 +38,8 @@ public class SmsController {
@Operation(summary = "绑定手机号码")
@PostMapping("/bindPhone")
@ApiCommon
public ApiResponse bindPhone(@RequestParam("phone") String phone) {
String proxyNumber = "17085298640";
public ApiResponse bindPhone(@RequestParam("proxyNumber") String proxyNumber,
@RequestParam("phone") String phone) {
return ApiResponse.ok(smsService.bindPhone(proxyNumber,phone));
}
......
......@@ -12,9 +12,28 @@ import java.util.Map;
public interface CallApiService {
/**
* XB模式
* @param headers
* @param body
* @param account
* @param sig
* @return
*/
@POST("/v20160818/rlxh/midNumBind/{account}")
Call<JsonObject> bindNumber(@HeaderMap Map<String, String> headers, @Body BindNumberReq body, @Path("account") String account, @Query("sig") String sig);
/**
* AXB模式
* @param headers
* @param body
* @param account
* @param sig
* @return
*/
@POST("/v20160818/rlxh/midNumUnBindForAXB/{account}")
Call<JsonObject> bindNumberForAXB(@HeaderMap Map<String, String> headers, @Body BindNumberReq body, @Path("account") String account, @Query("sig") String sig);
@FormUrlEncoded
@POST("/v20160818/rlxh/midNumUnBinding/{account}")
Call<JsonObject> unbindNumber(@HeaderMap Map<String, String> headers, @Body UnbindNumberReq body, @Path("account") String account, @Query("sig") String sig);
......
......@@ -15,4 +15,6 @@ import com.xwd.hospital.server.rest.req.SettingParam;
public interface SettingService extends BaseService<Setting> {
List<Setting> queryDoctorAsks();
}
package com.xwd.hospital.server.service;
import org.springframework.web.bind.annotation.RequestParam;
public interface SmsService {
/**
* 发送短信验证码
......
package com.xwd.hospital.server.service.impl;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.xwd.hospital.server.domain.Order;
import com.xwd.hospital.server.domain.UserCouponInfo;
import com.xwd.hospital.server.enums.CouponUseStateEnum;
import com.xwd.hospital.server.enums.OrderStateEnum;
import com.xwd.hospital.server.repository.OrderMapper;
import com.xwd.hospital.server.service.OrderService;
import com.xwd.hospital.server.service.UserCouponInfoService;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import java.util.Date;
import java.util.Set;
@Service
@Slf4j
public class DelayQueueService {
@Autowired
private RedisTemplate<String,String> redisTemplate;
@Resource
private OrderMapper orderMapper;
@Resource
private UserCouponInfoService userCouponInfoService;
private static final String DELAY_QUEUE_KEY = "order_delay_queue";
public void addToDelayQueue(String message, long delayTime) {
redisTemplate.opsForZSet().add(DELAY_QUEUE_KEY, message, System.currentTimeMillis() + delayTime);
}
public void pollAndProcessDelayedMessages() {
Set<String> messages = redisTemplate.opsForZSet().rangeByScore(DELAY_QUEUE_KEY, 0, System.currentTimeMillis());
for (String message : messages) {
// 处理消息
processMessage(message);
// 从延迟队列中删除已处理的消息
redisTemplate.opsForZSet().remove(DELAY_QUEUE_KEY, message);
}
}
private void processMessage(String message) {
// 未支付的订单取消
//message就是orderNo
//先查询订单状态
Order order = orderMapper.selectOne(Wrappers.lambdaQuery(Order.class).eq(Order::getOrderNo, message));
if (order == null) {
log.info("订单不存在: " + message);
return;
}
//判断订单是否是未支付状态
if (!order.getOrderState().equals(OrderStateEnum.TO_PAY)) {
log.info("订单已支付: " + message);
return;
}
//修改订单状态为取消
order.setOrderState(OrderStateEnum.CANCELED);
orderMapper.updateById(order);
//优惠券是否返回
//查询优惠券
if(null != order.getUserCouponId()){
UserCouponInfo userCouponInfo = userCouponInfoService.getById(order.getUserCouponId());
Date currentDate = new Date();
if(currentDate.after(userCouponInfo.getCouponStartDate())
&& currentDate.before(userCouponInfo.getCouponEndDate())){
userCouponInfo.setCouponUseState(CouponUseStateEnum.USEABLE);
userCouponInfo.setEditorId(1L);
userCouponInfoService.saveOrUpdate(userCouponInfo);
}
}
log.info("处理超时未支付订单------------: " + message);
}
}
......@@ -8,7 +8,6 @@
package com.xwd.hospital.server.service.impl;
import java.io.Serializable;
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.*;
......@@ -17,11 +16,11 @@ import cn.dev33.satoken.stp.StpUtil;
import cn.hutool.core.date.DateUtil;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.xwd.hospital.server.constants.Constant;
import com.xwd.hospital.server.domain.*;
import com.xwd.hospital.server.dto.*;
import com.xwd.hospital.server.enums.*;
import com.xwd.hospital.server.service.*;
import com.xwd.hospital.server.util.DateUtils;
import jakarta.annotation.Resource;
import com.baomidou.mybatisplus.core.enums.SqlMethod;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
......@@ -32,7 +31,6 @@ import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.xwd.hospital.server.repository.OrderMapper;
import com.xwd.hospital.server.repository.base.OrderBaseMapper;
import com.xwd.hospital.server.rest.req.OrderParam;
@Service
public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements OrderService {
......@@ -66,6 +64,8 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
private OrderPayService orderPayService;
@Resource
private PaymentService paymentService;
@Resource
private DelayQueueService delayQueueService;
@Override
public int updateAllFieldsById(Order entity) {
......@@ -250,6 +250,9 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
orderOperation.setEditorName(sysUser.getUsername());
orderOperationService.save(orderOperation);
//写入支付延时队列
delayQueueService.addToDelayQueue(order.getOrderNo(), Constant.ORDER_PAY_WAIT_TIME);
return order;
}
......@@ -319,6 +322,28 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
userCouponInfoService.saveOrUpdate(userCouponInfo);
}
}
}else if(order.getOrderState() == OrderStateEnum.TO_CONFIRM){//待确认订单
order.setOrderState(OrderStateEnum.CANCELED);
this.saveOrUpdate(order);
//优惠券是否返回
//查询优惠券
if(null != order.getUserCouponId()){
UserCouponInfo userCouponInfo = userCouponInfoService.getById(order.getUserCouponId());
Date currentDate = new Date();
if(currentDate.after(userCouponInfo.getCouponStartDate())
&& currentDate.before(userCouponInfo.getCouponEndDate())){
userCouponInfo.setCouponUseState(CouponUseStateEnum.USEABLE);
userCouponInfo.setEditorId(1L);
userCouponInfoService.saveOrUpdate(userCouponInfo);
}
}
//退款操作
//todo 全额退款
paymentService.refundPay(order.getOrderNo());
}
return order;
......@@ -414,7 +439,7 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
}
//todo 从小号列表中获取到合适的小号(sys_setting表)
List<Setting> settingList = settingService.list(Wrappers.<Setting>query().eq("code", SysSettingEnum.PROXY_PHONE).eq("remark",UseStateEnum.USEABLE.getName()));
List<Setting> settingList = settingService.list(Wrappers.<Setting>query().eq("name", SysSettingEnum.PROXY_PHONE));
if(null == settingList
|| settingList.size() == 0){
//暂无可用来绑定的小号
......
......@@ -13,6 +13,9 @@ import java.util.List;
import java.util.ArrayList;
import java.util.Collection;
import cn.hutool.core.collection.CollectionUtil;
import com.google.common.collect.Lists;
import com.xwd.hospital.server.constants.Constant;
import jakarta.annotation.Resource;
import com.baomidou.mybatisplus.core.enums.SqlMethod;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
......@@ -48,5 +51,12 @@ public class SettingServiceImpl extends ServiceImpl<SettingMapper, Setting> impl
return executeBatch(entityList, batchSize, (sqlSession, entity) -> sqlSession.insert(sqlStatement, entity));
}
@Override
public List<Setting> queryDoctorAsks() {
List<Setting> list = lambdaQuery().eq(Setting::getName, Constant.DOCTOR_ASKS).list();
if (CollectionUtil.isEmpty(list)){
return Lists.newArrayList();
}
return list;
}
}
package com.xwd.hospital.server.service.impl;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.google.gson.Gson;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.tencentcloudapi.common.Credential;
import com.tencentcloudapi.common.exception.TencentCloudSDKException;
......@@ -21,11 +19,9 @@ import com.xwd.hospital.server.enums.YesNoEnum;
import com.xwd.hospital.server.rest.thirdPartReq.BindNumberReq;
import com.xwd.hospital.server.rest.thirdPartReq.UnbindNumberReq;
import com.xwd.hospital.server.service.*;
import com.xwd.hospital.server.util.CallUtil;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import okhttp3.OkHttpClient;
import okhttp3.RequestBody;
import org.apache.commons.codec.binary.Base64;
import org.apache.commons.codec.digest.DigestUtils;
import org.springframework.beans.factory.annotation.Value;
......@@ -163,12 +159,12 @@ public class SmsServiceImpl implements SmsService {
BindNumberReq bindNumberReq = new BindNumberReq();
bindNumberReq.setMidNum(proxyNumber);//小号
bindNumberReq.setCalled(phoneNumber);//被叫号码
log.info("绑定消耗中,小号{},被叫号码{}",proxyNumber,phoneNumber);
Call<JsonObject> call = service.bindNumber(headers, bindNumberReq, account, sigAndAuth.get("sig"));
try {
Response<JsonObject> execute = call.execute();
mappingId = execute.body().get("mappingId").getAsString();
log.info(execute.body().toString());
log.info("绑定成功---------");
} catch (IOException e) {
throw new RuntimeException(e);
}
......@@ -238,7 +234,13 @@ public class SmsServiceImpl implements SmsService {
calledArea, caller,calledShow, connectTime, result,
releaseTime, account, mappingId, appId, callDuration,
userData, answerTime, smallNumberType, calldisplay);
log.info("容联通话回调:------");
log.info("容联通话回调处理:------------------start,mappingId{}",mappingId);
log.info("被叫振铃时间{},被叫真实号码{},企业本次通话唯一标识id{},主叫归属地{},主叫拨通虚拟号码时刻{},被叫归属地{},主叫号码{},小号{},被叫接通时刻{},通话状态{},通话结束时刻{},帐号编号{},绑定关系唯一Id{},应用id{},本次通话的时长{},用户自定义数据{},接通{},小号类型{},显真实号{}"
,alertingTime, called, recorderId, callerArea,
beginTime, calledArea, caller, calledShow, connectTime,
result, releaseTime, account, mappingId, appId,
callDuration, userData, answerTime, smallNumberType, calldisplay);
if(result.equals("0")){//通话成功
//根据mappingId查询phone_order_record表
PhoneOrderRecord record = phoneOrderRecordService.getOne(Wrappers.<PhoneOrderRecord>query().eq("mapping_id", mappingId));
......@@ -261,6 +263,7 @@ public class SmsServiceImpl implements SmsService {
}
}
log.info("容联通话回调处理:------------------end,mappingId{}",mappingId);
return true;
}
}
package com.xwd.hospital.server.task;
import cn.hutool.core.date.DateUtil;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.xwd.hospital.server.domain.UserCouponInfo;
import com.xwd.hospital.server.enums.CouponUseStateEnum;
import com.xwd.hospital.server.service.UserCouponInfoService;
import com.xwd.hospital.server.service.impl.DelayQueueService;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Async;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import java.util.Date;
import java.util.List;
@Component
@Async
@Slf4j
public class OrderTask {
@Resource
private DelayQueueService delayQueueService;
/**
* 每秒钟清理一次未支付订单
*/
@Scheduled(cron = "* * * * * *")
public void cancelUnpayOrder(){
log.info("清理超时未支付订单--------------------start");
delayQueueService.pollAndProcessDelayedMessages();
log.info("清理超时未支付订单--------------------end");
}
}
......@@ -49,8 +49,8 @@
pmq.title,
u.avatar,
s.service_price,
count(o.id) as orderCount,
count(ua.id) as fansCount
count(DISTINCT o.id) as orderCount,
count(DISTINCT ua.id) as fansCount
from pms_doctor_info di
inner join pms_medical_qualifications pmq on di.medical_qualification_id = pmq.id
inner join pms_hospital_info h on h.id = pmq.hospital_id
......@@ -88,8 +88,8 @@
di.introduction,
pmq.title,
u.avatar,
count(o.id) as orderCount,
count(ua.id) as fansCount
count(DISTINCT o.id) as orderCount,
count(DISTINCT ua.id) as fansCount
from pms_doctor_info di
inner join pms_medical_qualifications pmq on di.medical_qualification_id = pmq.id
inner join pms_hospital_info h on h.id = pmq.hospital_id
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论