Commit 90c0e26b authored by shangtx's avatar shangtx

feat: 首页通知和新系统参数常量

parent def21683
package com.onsiteservice.admin.controller.home;
import com.onsiteservice.admin.service.home.dto.HomeNoticePageDTO;
import com.onsiteservice.common.annotation.dict.Dict;
import com.onsiteservice.common.annotation.user.CurrentUserId;
import com.onsiteservice.constant.constant.DictConstants;
import com.onsiteservice.entity.home.HomeNotice;
import com.onsiteservice.admin.service.home.HomeNoticeService;
import com.onsiteservice.core.result.Result;
import com.onsiteservice.dao.common.page.PageInfoVO;
import com.onsiteservice.dao.common.page.PageParams;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.NonNull;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import springfox.documentation.annotations.ApiIgnore;
import javax.annotation.Resource;
import javax.validation.constraints.Positive;
import static com.onsiteservice.core.result.ResultGenerator.success;
import static com.onsiteservice.core.result.ResultGenerator.fail;
/**
* @author 商天翔
* @date 2022-07-20 16:19
* @description HomeNoticeController控制类
*/
@ApiIgnore
@Api(tags = "HomeNoticeController")
@RestController
@RequestMapping("/home/notice")
@Validated
public class HomeNoticeController {
@Resource
private HomeNoticeService homeNoticeService;
@Dict(name = "releaseStatus", code = DictConstants.NOTICE_RELEASE_STATUS)
@ApiOperation(value = "分页查询列表", notes = "作者: 商天翔")
@PostMapping("/page")
public Result<PageInfoVO> getPage(@RequestBody @NonNull @Validated HomeNoticePageDTO param) {
return success(homeNoticeService.getPage(param), "获取分页列表");
}
@ApiOperation(value = "根据id查询", notes = "作者: 商天翔")
@GetMapping("/{id}")
public Result<HomeNotice> getDetails(@PathVariable @Positive Long id) {
return success(homeNoticeService.getHomeNoticeMapper().selectByPrimaryKey(id), "根据id获取详情");
}
@ApiOperation(value = "新增或修改", notes = "作者: 商天翔")
@PostMapping("/save-or-update")
public Result saveOrUpdate(@RequestBody @NonNull @Validated HomeNotice homeNotice, @CurrentUserId Long userId) {
return success(homeNoticeService.saveOrUpdate(homeNotice, userId), homeNotice.getId() == null ? "新增成功" : "修改成功");
}
@ApiOperation(value = "根据id删除", notes = "作者: 商天翔")
@DeleteMapping("/{id}")
public Result deleteById(@PathVariable @Positive Long id) {
return success(homeNoticeService.getHomeNoticeMapper().deleteByPrimaryKey(id), "删除成功");
}
}
......@@ -2,13 +2,17 @@ package com.onsiteservice.admin.listener;
import com.onsiteservice.common.socket.SocketHandler;
import com.onsiteservice.constant.constant.SysConstants;
import com.onsiteservice.service.order.dto.PayNoticeVO;
import org.springframework.amqp.rabbit.annotation.Queue;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.data.util.Pair;
import org.springframework.stereotype.Component;
import org.springframework.web.socket.TextMessage;
import javax.annotation.Resource;
import java.util.List;
import java.util.Map;
/**
* 管理端事件通知
......@@ -20,9 +24,13 @@ public class OrderListener {
@Resource
private SocketHandler socketHandler;
private static final String USER_ID = "id";
// 1 用户已付款
private static final String TYPE = "type";
@RabbitHandler
public void notice(Integer type) {
socketHandler.sendMessageToAll(new TextMessage("有新订单"));
public void notice(PayNoticeVO param) {
socketHandler.sendMessageToUser(param.getId(), new TextMessage(param.getType()));
}
}
package com.onsiteservice.admin.mapper.home;
import com.onsiteservice.dao.common.page.PageParams;
import org.apache.ibatis.annotations.Param;
import java.util.List;
import java.util.Map;
/**
* @author 商天翔
* @date 2022-07-20 16:19
* @description HomeNoticeBizMapper业务接口
*/
public interface HomeNoticeBizMapper {
List<Map> getPage(@Param("param") PageParams param);
}
package com.onsiteservice.admin.service.home;
import com.onsiteservice.dao.util.EntityUtils;
import com.onsiteservice.entity.home.HomeNotice;
import com.onsiteservice.dao.mapper.home.HomeNoticeMapper;
import com.onsiteservice.admin.mapper.home.HomeNoticeBizMapper;
import com.onsiteservice.dao.common.AbstractMapper;
import com.onsiteservice.dao.common.page.PageParams;
import com.onsiteservice.dao.common.page.PageInfoVO;
import com.github.pagehelper.PageHelper;
import lombok.Getter;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
/**
* @author 商天翔
* @date 2022-07-20 16:19
* @description HomeNoticeService服务类
*/
@Service
@Transactional(rollbackFor = Exception.class)
public class HomeNoticeService {
@Resource
@Getter
private HomeNoticeMapper homeNoticeMapper;
@Resource
private HomeNoticeBizMapper homeNoticeBizMapper;
/**
* 分页查询列表
*/
public PageInfoVO getPage(PageParams param) {
PageHelper.startPage(param.getPage(), param.getSize());
return new PageInfoVO(homeNoticeBizMapper.getPage(param));
}
/**
* 保存或更新方法
*/
public int saveOrUpdate(HomeNotice homeNotice, Long userId) {
if (homeNotice.getId() == null) {
EntityUtils.insert(homeNotice,userId);
return homeNoticeMapper.insertSelective(homeNotice);
} else {
EntityUtils.update(homeNotice,userId);
return homeNoticeMapper.updateByPrimaryKeySelective(homeNotice);
}
}
}
package com.onsiteservice.admin.service.home.dto;
import com.onsiteservice.dao.common.page.PageParams;
import lombok.Data;
@Data
public class HomeNoticePageDTO extends PageParams {
String title;
}
<?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.onsiteservice.admin.mapper.home.HomeNoticeBizMapper">
<select id="getPage" resultType="java.util.Map">
select t.*
from home_notice t
<where>
and t.deleted = 0
<if test="param.title != null">
and t.title like "%"#{param.title}"%"
</if>
</where>
order by
<choose>
<when test="param.sort != null and param.sort != ''">
${param.sort} ${param.order}
</when>
<otherwise>
t.id desc
</otherwise>
</choose>
</select>
</mapper>
package com.onsiteservice.service.order.dto;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Data
public class PayNoticeVO implements Serializable {
// 用户id
private String id;
// 类型 1 支付成功
private String type;
}
......@@ -11,6 +11,7 @@ import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
/**
......@@ -41,7 +42,7 @@ public class SmsUtils {
*
* @@return 返回失败信息
*/
//@Async // 如果在mq里就不需要再异步线程了否则响应数据返回时间不确定
@Async // 如果在mq里就不需要再异步线程了否则响应数据返回时间不确定
public String send(String sign, String templateCode, String templateParam, String... phoneNums) throws ClientException {
if (phoneNums.length > 1000) {
return "最大发送数量不能超过1000";
......
......@@ -77,5 +77,8 @@ public class DictConstants {
// 订单状态
public final static String ORDER_STATUS = "BIZ0002";
// 通知发布状态
public final static String NOTICE_RELEASE_STATUS = "BIZ0003";
}
......@@ -20,4 +20,14 @@ public class SysParamConstants {
* 订单支付超时时间
*/
public final static String ORDER_PAY_TIMEOUT = "ORDER_PAY_TIMEOUT";
/**
* 温馨提示
*/
public final static String USER_PROMPT = "USER_PROMPT";
/**
* 用户协议
*/
public final static String AGREEMENT = "AGREEMENT";
}
......@@ -43,19 +43,6 @@ public class HomeNotice implements Serializable {
@ApiModelProperty("发布状态 1.新建 2.已发布 3.已撤销")
private Integer releaseStatus;
/**
* 发布时间
*/
@Column(name = "release_time")
@ApiModelProperty("发布时间")
private Date releaseTime;
/**
* 备注
*/
@ApiModelProperty("备注")
private String remark;
/**
* 显示排序号 数字越大优先级越高
*/
......
......@@ -5,6 +5,7 @@ import com.onsiteservice.common.order.vo.OrderPayVO;
import com.onsiteservice.common.order.vo.ServiceOrderLogVO;
import com.onsiteservice.common.order.vo.ServiceOrderVO;
import com.onsiteservice.constant.constant.BizConstants;
import com.onsiteservice.constant.constant.SysConstants;
import com.onsiteservice.constant.constant.SysParamConstants;
import com.onsiteservice.constant.enums.BizCodeEnum;
import com.onsiteservice.constant.enums.ServiceOrderOpSourceEnum;
......@@ -19,6 +20,7 @@ import com.onsiteservice.dao.component.RecordComponent;
import com.onsiteservice.dao.mapper.pay.PayChannelWechatMapper;
import com.onsiteservice.dao.mapper.service.*;
import com.onsiteservice.dao.mapper.sys.SysParamMapper;
import com.onsiteservice.dao.mapper.sys.SysUserMapper;
import com.onsiteservice.dao.mapper.user.UserMapper;
import com.onsiteservice.entity.address.ServiceAddress;
import com.onsiteservice.entity.category.ServiceCategory;
......@@ -30,15 +32,16 @@ import com.onsiteservice.entity.sys.SysParam;
import com.onsiteservice.entity.user.User;
import com.onsiteservice.miniapp.controller.order.dto.CancelServiceOrderDTO;
import com.onsiteservice.miniapp.controller.order.dto.PageServiceOrderDTO;
import com.onsiteservice.miniapp.controller.order.dto.PayServiceOrderDTO;
import com.onsiteservice.miniapp.controller.order.dto.ReserveServiceOrderDTO;
import com.onsiteservice.miniapp.service.weixin.pay.WechatNativePay;
import com.onsiteservice.service.order.ServiceOrderService;
import com.onsiteservice.util.AttrCopyUtils;
import com.onsiteservice.util.RandomUtils;
import com.onsiteservice.util.aliyun.SmsUtils;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.tuple.Pair;
import org.springframework.amqp.core.AmqpTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
......@@ -66,7 +69,6 @@ public class ServiceOrderBizService extends AbstractMapper<ServiceOrder> {
@Autowired
private SmsUtils smsUtils;
@Resource
private ServiceOrderMapper serviceOrderMapper;
@Resource
......@@ -75,24 +77,24 @@ public class ServiceOrderBizService extends AbstractMapper<ServiceOrder> {
private ServiceOrderLogMapper serviceOrderLogMapper;
@Resource
private ServiceOrderService serviceOrderService;
@Resource
private ServiceAddressMapper serviceAddressMapper;
@Resource
private ServiceSubclassMapper serviceSubclassMapper;
@Resource
private ServiceCategoryMapper serviceCategoryMapper;
@Resource
private UserMapper userMapper;
@Autowired
private RecordComponent recordComponent;
@Resource
private PayChannelWechatMapper payChannelWechatMapper;
@Resource
private SysParamMapper sysParamMapper;
@Resource
private SysUserMapper sysUserMapper;
@Resource
private AmqpTemplate amqpTemplate;
public ServiceOrderVO selectById(Long id, Long userId) {
......@@ -202,7 +204,6 @@ public class ServiceOrderBizService extends AbstractMapper<ServiceOrder> {
return result;
}
public void paySuccess(String outTradeNo, String orderNo) {
log.info("支付成功 outTradeNo: {}, orderNo: {}", outTradeNo, orderNo);
......@@ -215,6 +216,34 @@ public class ServiceOrderBizService extends AbstractMapper<ServiceOrder> {
if (result == 1) {
recordComponent.recordProcess(order.getId(), ServiceOrderStatusEnum.PAY.getStatus(), ServiceOrderStatusEnum.PAY.getMsg(), ServiceOrderOpSourceEnum.MINI_APP, null, null, null);
}
// 通知客服
var logCondition = new ServiceOrderLog();
logCondition.setOrderId(order.getId());
logCondition.setProcessId(ServiceOrderStatusEnum.SEND.getStatus());
var orderLog = serviceOrderLogMapper.selectOne(logCondition);
if (orderLog != null) {
if(ServiceOrderOpSourceEnum.WEB.getId().equals(orderLog.getSource())) {
var sysUser = sysUserMapper.selectByPrimaryKey(orderLog.getHostId());
if(StringUtils.isNotEmpty(sysUser.getPhone())) {
try {
smsUtils.send("", "", "", sysUser.getPhone());
amqpTemplate.convertAndSend(SysConstants.Queue.ADMIN_ORDER, Pair.of(sysUser.getId(), 1));
} catch (Exception e) {
e.printStackTrace();
log.error("订单{} 支付成功短信发送失败", orderNo);
}
}
}
if(ServiceOrderOpSourceEnum.MINI_APP.getId().equals(orderLog.getSource())) {
var user = userMapper.selectByPrimaryKey(orderLog.getHostId());
try {
smsUtils.send("", "", "", user.getPhone());
} catch (Exception e) {
e.printStackTrace();
log.error("订单{} 支付成功短信发送失败", orderNo);
}
}
}
}
......@@ -245,17 +274,17 @@ public class ServiceOrderBizService extends AbstractMapper<ServiceOrder> {
* 生成支付参数
*/
public OrderPayVO pay(Long orderId, Long userId, HttpServletRequest request) {
if(userId == null) {
if (userId == null) {
throw new ServiceException("用户未登录");
}
var order = selectByPrimaryKey(orderId);
if(!order.getAccountNo().equals(userId)) {
if (!order.getAccountNo().equals(userId)) {
throw new ServiceException("用户错误");
}
if(new Date().compareTo(order.getCancelTime()) > 0) {
if (new Date().compareTo(order.getCancelTime()) > 0) {
throw new ServiceException("支付超时");
}
if(!order.getOrderStatus().equals(ServiceOrderStatusEnum.SEND.getStatus())) {
if (!order.getOrderStatus().equals(ServiceOrderStatusEnum.SEND.getStatus())) {
throw new ServiceException("不能支付的订单状态");
}
var payChannel = payChannelWechatMapper.selectAll().get(0);
......@@ -300,8 +329,6 @@ public class ServiceOrderBizService extends AbstractMapper<ServiceOrder> {
return result;
}*/
private List<ServiceOrderVO> buildServiceOrderVO(List<ServiceOrder> serviceOrderList) {
List<Integer> subclassIdList = serviceOrderList.parallelStream().map(ServiceOrder::getSubclassId).collect(Collectors.toList());
List<ServiceSubclass> serviceSubclassList = serviceSubclassMapper.selectByIdList(subclassIdList);
......
......@@ -23,10 +23,10 @@ import java.util.*;
*/
public class CodeGenerator {
//以下几个选项根据项目的实际情况修改
public static final String CURRENT_MODULE_NAME = "mini-app"; // 业务模块名称 根据项目修改
public static final String CURRENT_MODULE_NAME = "admin"; // 业务模块名称 根据项目修改
public static final String BASE_PACKAGE = "com.onsiteservice"; // 业务基础模块包名称 根据项目修改
public static final String CURRENT_PACKAGE = BASE_PACKAGE + ".miniapp"; // 业务模块包名称 根据项目修改
private static final String AUTHOR = "潘维吉"; // @author
public static final String CURRENT_PACKAGE = BASE_PACKAGE + ".admin"; // 业务模块包名称 根据项目修改
private static final String AUTHOR = "商天翔"; // @author
public static final Boolean IS_GEN_PAGE = false; // 是否生成分页dao层代码
public static final Boolean IS_GEN_SAVE_OR_UPDATE = true; // 是否生成保存或更新方法
......@@ -34,15 +34,15 @@ public class CodeGenerator {
//TODO 根据数据库表 自动生成CRUD和分页接口
public static void main(String[] args) {
String[] tables = new String[]{"service_order", "service_address", "service_category", "service_subclass"}; // 输入表名 支持多表 模块目录情况批量代码生成确保表前缀一致 否则建议分批生成
String[] tables = new String[]{"home_notice"}; // 输入表名 支持多表 模块目录情况批量代码生成确保表前缀一致 否则建议分批生成
if (!ask(tables)) {
return;
}
genCode(tables); // 默认按照表前缀分模块目录
// genCode(tables); // 默认按照表前缀分模块目录
List.of(tables).forEach(item -> { // 以下方法是根据不同需求生成不同的代码
// genModelAndMapper(item, false); // 生成Model实体类、通用Mapper接口和XML文件 当数据库表字段变化或只需实体类等 可设置只生成实体类
// genControllerAndService(item); // 只生成Controller、Service层
// genCustomMapperAndXML(item); // 只生成自定义业务Mapper接口和XML
genControllerAndService(item); // 只生成Controller、Service层
genCustomMapperAndXML(item); // 只生成自定义业务Mapper接口和XML
});
// genCodeByCustomModelName("输入表名","输入自定义Model名称");
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment