From 521f36fd44601ae02c9596639b7d5f97597952c6 Mon Sep 17 00:00:00 2001 From: Houpn Date: Thu, 6 Jul 2023 20:53:56 +0800 Subject: [PATCH 01/10] =?UTF-8?q?=E6=8F=90=E4=BA=A4=E5=88=9B=E5=BB=BA?= =?UTF-8?q?=E8=AE=A2=E5=8D=95=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/cc/hiver/core/dao/OrderDao.java | 19 +++ .../main/java/cc/hiver/core/entity/Order.java | 107 ++++++++++++++++ .../cc/hiver/core/service/OrderService.java | 31 +++++ .../core/serviceimpl/OrderServiceImpl.java | 99 +++++++++++++++ .../main/java/cc/hiver/core/vo/OrderVO.java | 95 +++++++++++++++ .../controller/manage/OrderController.java | 115 ++++++++++++++++++ 6 files changed, 466 insertions(+) create mode 100644 hiver-core/src/main/java/cc/hiver/core/dao/OrderDao.java create mode 100644 hiver-core/src/main/java/cc/hiver/core/entity/Order.java create mode 100644 hiver-core/src/main/java/cc/hiver/core/service/OrderService.java create mode 100644 hiver-core/src/main/java/cc/hiver/core/serviceimpl/OrderServiceImpl.java create mode 100644 hiver-core/src/main/java/cc/hiver/core/vo/OrderVO.java create mode 100644 hiver-modules/hiver-base/src/main/java/cc/hiver/base/controller/manage/OrderController.java diff --git a/hiver-core/src/main/java/cc/hiver/core/dao/OrderDao.java b/hiver-core/src/main/java/cc/hiver/core/dao/OrderDao.java new file mode 100644 index 00000000..546b0de7 --- /dev/null +++ b/hiver-core/src/main/java/cc/hiver/core/dao/OrderDao.java @@ -0,0 +1,19 @@ +package cc.hiver.core.dao; + +import cc.hiver.core.base.HiverBaseDao; +import cc.hiver.core.entity.Order; +import cc.hiver.core.entity.Order; +import org.springframework.data.jpa.repository.Modifying; +import org.springframework.data.jpa.repository.Query; + +import java.util.List; + +/** + * 用户数据处理层 + * + * @author Houpn + */ +public interface OrderDao extends HiverBaseDao { + + +} diff --git a/hiver-core/src/main/java/cc/hiver/core/entity/Order.java b/hiver-core/src/main/java/cc/hiver/core/entity/Order.java new file mode 100644 index 00000000..4d59937a --- /dev/null +++ b/hiver-core/src/main/java/cc/hiver/core/entity/Order.java @@ -0,0 +1,107 @@ +package cc.hiver.core.entity; + +import cc.hiver.core.base.HiverBaseEntity; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; +import org.hibernate.annotations.DynamicInsert; +import org.hibernate.annotations.DynamicUpdate; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.Table; +import java.util.Date; + +@Data +@Accessors(chain = true) +@Entity +@DynamicInsert +@DynamicUpdate +@Table(name = "t_order") +@TableName("t_order") +@EqualsAndHashCode(callSuper = true) +@ApiModel(value = "下单") +public class Order extends HiverBaseEntity { + + /** + * 订单号,默认前缀为XD + */ + @ApiModelProperty("订单号,默认前缀为XD") + @Column(name = "order_id", nullable = false) + private String orderId; + + /** + * 订单运送地址 + */ + @ApiModelProperty("订单运送地址") + @Column(name = "order_address") + private String orderAddress; + + /** + * 物流方式 + */ + @ApiModelProperty("物流方式") + @Column(name = "order_logistics") + private String orderLogistics; + + /** + * 商品信息描述 + */ + @ApiModelProperty("商品信息描述") + @Column(name = "order_describe") + private String orderDescribe; + + /** + * 订单单位数量 + */ + @Column(name = "order_num") + @ApiModelProperty("订单单位数量") + private Integer orderNum; + + /** + * 运送快递单号 + */ + @ApiModelProperty("运送快递单号") + @Column(name = "kd_order_id") + private String kdOrderId; + + /** + * 订单是否超时 + */ + @ApiModelProperty("订单是否超时") + @Column(name = "is_timeout") + private Boolean timeout; + + /** + * 订单状态 + */ + @ApiModelProperty("订单状态") + @Column(name = "order_status") + private Integer orderStatus; + + /** + * 订单佣金 + */ + @ApiModelProperty("订单佣金") + @Column(name = "order_bkge") + private Integer orderBkge; + + /** + * 抢单工编号 + */ + @ApiModelProperty("抢单工编号") + @Column(name = "order_by_worker") + private String orderByWorker; + + /** + * 被抢单时间 + */ + @ApiModelProperty("被抢单时间") + @Column(name = "order_by_workertime") + private Date orderByWorkertime; + +} diff --git a/hiver-core/src/main/java/cc/hiver/core/service/OrderService.java b/hiver-core/src/main/java/cc/hiver/core/service/OrderService.java new file mode 100644 index 00000000..fa7f2f9e --- /dev/null +++ b/hiver-core/src/main/java/cc/hiver/core/service/OrderService.java @@ -0,0 +1,31 @@ +package cc.hiver.core.service; + +import cc.hiver.core.base.HiverBaseService; +import cc.hiver.core.common.vo.SearchVo; +import cc.hiver.core.entity.Order; +import cc.hiver.core.entity.Order; +import org.springframework.cache.annotation.CacheConfig; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; + +import java.util.List; + +/** + * 用户接口 + * + * @author Houpn + */ +@CacheConfig(cacheNames = "order") +public interface OrderService extends HiverBaseService { + + /** + * 多条件分页获取用户 + * + * @param Order + * @param searchVo + * @param pageable + * @return + */ + Page findByCondition(Order Order, SearchVo searchVo, Pageable pageable); + +} diff --git a/hiver-core/src/main/java/cc/hiver/core/serviceimpl/OrderServiceImpl.java b/hiver-core/src/main/java/cc/hiver/core/serviceimpl/OrderServiceImpl.java new file mode 100644 index 00000000..c3678f91 --- /dev/null +++ b/hiver-core/src/main/java/cc/hiver/core/serviceimpl/OrderServiceImpl.java @@ -0,0 +1,99 @@ +package cc.hiver.core.serviceimpl; + +import cc.hiver.core.common.utils.SecurityUtil; +import cc.hiver.core.common.vo.SearchVo; +import cc.hiver.core.dao.OrderDao; +import cc.hiver.core.entity.Order; + +import cc.hiver.core.service.OrderService; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.StrUtil; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.data.jpa.domain.Specification; +import org.springframework.lang.Nullable; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.persistence.criteria.*; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 用户接口实现 + * + * @author houpn + */ +@Slf4j +@Service +@Transactional +public class OrderServiceImpl implements OrderService { + @Autowired + private OrderDao orderDao; + + @Autowired + private SecurityUtil securityUtil; + + @Override + public OrderDao getRepository() { + return orderDao; + } + + @Override + public Page findByCondition(Order order, SearchVo searchVo, Pageable pageable) { + return orderDao.findAll(new Specification() { + @Nullable + @Override + public Predicate toPredicate(Root root, CriteriaQuery cq, CriteriaBuilder cb) { + Path OrderIdField = root.get("orderId"); + Path norderLogisticsField = root.get("orderLogistics"); + Path kdOrderIdField = root.get("kdOrderId"); + Path timeoutField = root.get("timeout"); + Path orderStatusdField = root.get("orderStatus"); + Path orderByWorkerField = root.get("orderByWorker"); + Path createTimeField = root.get("createTime"); + + List list = new ArrayList<>(); + + if (StrUtil.isNotBlank(order.getOrderId())) { + list.add(cb.equal(OrderIdField, order.getOrderId())); + } + + // 精确搜索 + if (StrUtil.isNotBlank(order.getOrderLogistics())) { + list.add(cb.like(norderLogisticsField, '%' + order.getOrderLogistics() + '%')); + } + if (StrUtil.isNotBlank(order.getKdOrderId())) { + list.add(cb.like(kdOrderIdField, '%' + order.getKdOrderId() + '%')); + } + + //list.add(cb.equal(timeoutField, order.getTimeout())); + + // 状态 + if (order.getOrderStatus() != null) { + list.add(cb.equal(orderStatusdField, order.getOrderStatus())); + } + + if (StrUtil.isNotBlank(order.getOrderByWorker())) { + list.add(cb.like(orderByWorkerField, '%' + order.getOrderByWorker() + '%')); + } + // 创建时间 + if (StrUtil.isNotBlank(searchVo.getStartDate()) && StrUtil.isNotBlank(searchVo.getEndDate())) { + Date start = DateUtil.parse(searchVo.getStartDate()); + Date end = DateUtil.parse(searchVo.getEndDate()); + list.add(cb.between(createTimeField, start, DateUtil.endOfDay(end))); + } + + // 数据权限 + + Predicate[] arr = new Predicate[list.size()]; + cq.where(list.toArray(arr)); + return null; + } + }, pageable); + } +} diff --git a/hiver-core/src/main/java/cc/hiver/core/vo/OrderVO.java b/hiver-core/src/main/java/cc/hiver/core/vo/OrderVO.java new file mode 100644 index 00000000..dc4d6587 --- /dev/null +++ b/hiver-core/src/main/java/cc/hiver/core/vo/OrderVO.java @@ -0,0 +1,95 @@ +package cc.hiver.core.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotNull; +import java.io.Serializable; +import java.util.Date; + + +@Data +@ApiModel("保存 ") +public class OrderVO implements Serializable { + private static final long serialVersionUID = 1L; + + + /** + * 订单号,默认前缀为XD + */ + @NotNull(message = "orderId can not null") + @ApiModelProperty("订单号,默认前缀为XD") + private String orderId; + + + /** + * 订单运送地址 + */ + @ApiModelProperty("订单运送地址") + private String orderAddress; + + + /** + * 物流方式 + */ + @ApiModelProperty("物流方式") + private String orderLogistics; + + + /** + * 商品信息描述 + */ + @ApiModelProperty("商品信息描述") + private String orderDescribe; + + + /** + * 订单单位数量 + */ + @ApiModelProperty("订单单位数量") + private Integer orderNum; + + + /** + * 运送快递单号 + */ + @ApiModelProperty("运送快递单号") + private String kdOrderId; + + + /** + * 订单是否超时 + */ + @ApiModelProperty("订单是否超时") + private Boolean timeout; + + + /** + * 订单状态 + */ + @ApiModelProperty("订单状态") + private Integer orderStatus; + + + /** + * 订单佣金 + */ + @ApiModelProperty("订单佣金") + private Integer orderBkge; + + + /** + * 抢单工编号 + */ + @ApiModelProperty("抢单工编号") + private String orderByWorker; + + + /** + * 被抢单时间 + */ + @ApiModelProperty("被抢单时间") + private Date orderByWorkertime; + +} diff --git a/hiver-modules/hiver-base/src/main/java/cc/hiver/base/controller/manage/OrderController.java b/hiver-modules/hiver-base/src/main/java/cc/hiver/base/controller/manage/OrderController.java new file mode 100644 index 00000000..e95cd371 --- /dev/null +++ b/hiver-modules/hiver-base/src/main/java/cc/hiver/base/controller/manage/OrderController.java @@ -0,0 +1,115 @@ +package cc.hiver.base.controller.manage; + +import cc.hiver.base.async.AddMessage; +import cc.hiver.core.common.constant.CommonConstant; +import cc.hiver.core.common.constant.UserConstant; +import cc.hiver.core.common.redis.RedisTemplateHelper; +import cc.hiver.core.common.utils.*; +import cc.hiver.core.common.vo.PageVo; +import cc.hiver.core.common.vo.Result; +import cc.hiver.core.common.vo.SearchVo; +import cc.hiver.core.dao.mapper.DeleteMapper; +import cc.hiver.core.entity.*; +import cc.hiver.core.service.*; +import cc.hiver.core.service.mybatis.IUserRoleService; +import cc.hiver.core.vo.RoleDTO; +import cn.hutool.core.util.StrUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cache.annotation.CacheConfig; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.data.domain.Page; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.bind.annotation.*; + +import javax.persistence.EntityManager; +import javax.persistence.PersistenceContext; +import javax.validation.Valid; +import java.io.UnsupportedEncodingException; +import java.net.URLDecoder; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 用户管理接口 + * + * @author Yazhi Li + */ +@Slf4j +@RestController +@Api(tags = "订单接口") +@RequestMapping("/hiver/order") +@CacheConfig(cacheNames = "order") +@Transactional +public class OrderController { + public static final String ORDER = "order::"; + + @Autowired + private OrderService orderService; + + @Autowired + private DeleteMapper deleteMapper; + + @Autowired + private RedisTemplateHelper redisTemplate; + + @Autowired + private SecurityUtil securityUtil; + + @PersistenceContext + private EntityManager entityManager; + + + + + @RequestMapping(value = "/getByCondition", method = RequestMethod.GET) + @ApiOperation(value = "多条件分页获取订单列表") + public Result> getByCondition(Order order, + SearchVo searchVo, + PageVo pageVo) { + Page page = orderService.findByCondition(order, searchVo, PageUtil.initPage(pageVo)); + return new ResultUtil>().setData(page); + } + + + + @RequestMapping(value = "/delByIds", method = RequestMethod.POST) + @ApiOperation(value = "批量通过ids删除") + public Result delAllByIds(@RequestParam String[] ids) { + for (String id : ids) { + orderService.delete(id); + } + return ResultUtil.success("批量通过id删除数据成功"); + } + + @RequestMapping(value = "/admin/add", method = RequestMethod.POST) + @ApiOperation(value = "创建订单") + public Result add(@Valid Order u, + @RequestParam(required = false) String[] roleIds) { + + Order order = orderService.save(u); + + // 发送创建账号消息 + //addMessage.addSendMessage(user.getId()); + return ResultUtil.success("常见成功"); + } + + @RequestMapping(value = "/admin/edit", method = RequestMethod.POST) + @ApiOperation(value = "修改订单", notes = "需要通过下单编号获取订单信息") + @CacheEvict(key = "#u.username") + public Result edit(Order u, + @RequestParam(required = false) String[] roleIds) { + + orderService.update(u); + + return ResultUtil.success("修改成功"); + } + + +} From f23edf47f7c67e755468f365e8979046d9dba06a Mon Sep 17 00:00:00 2001 From: Houpn Date: Mon, 10 Jul 2023 16:15:41 +0800 Subject: [PATCH 02/10] =?UTF-8?q?=E6=8F=90=E4=BA=A4=E5=88=9B=E5=BB=BA?= =?UTF-8?q?=E8=AE=A2=E5=8D=95=E5=B7=A5=E7=AE=A1=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/common/constant/WorkerConstant.java | 24 ++++ .../main/java/cc/hiver/core/dao/OrderDao.java | 4 - .../java/cc/hiver/core/dao/WorkerDao.java | 8 ++ .../main/java/cc/hiver/core/entity/Order.java | 78 +++++++++-- .../java/cc/hiver/core/entity/Worker.java | 123 +++++++++++++++++ .../cc/hiver/core/service/OrderService.java | 2 +- .../cc/hiver/core/service/WorkerService.java | 29 ++++ .../core/serviceimpl/WorkerServiceImpl.java | 91 +++++++++++++ .../main/java/cc/hiver/core/vo/WorkerVO.java | 92 +++++++++++++ .../controller/manage/OrderController.java | 3 +- .../controller/manage/WorkerController.java | 126 ++++++++++++++++++ 11 files changed, 563 insertions(+), 17 deletions(-) create mode 100644 hiver-core/src/main/java/cc/hiver/core/common/constant/WorkerConstant.java create mode 100644 hiver-core/src/main/java/cc/hiver/core/dao/WorkerDao.java create mode 100644 hiver-core/src/main/java/cc/hiver/core/entity/Worker.java create mode 100644 hiver-core/src/main/java/cc/hiver/core/service/WorkerService.java create mode 100644 hiver-core/src/main/java/cc/hiver/core/serviceimpl/WorkerServiceImpl.java create mode 100644 hiver-core/src/main/java/cc/hiver/core/vo/WorkerVO.java create mode 100644 hiver-modules/hiver-base/src/main/java/cc/hiver/base/controller/manage/WorkerController.java diff --git a/hiver-core/src/main/java/cc/hiver/core/common/constant/WorkerConstant.java b/hiver-core/src/main/java/cc/hiver/core/common/constant/WorkerConstant.java new file mode 100644 index 00000000..2caf5638 --- /dev/null +++ b/hiver-core/src/main/java/cc/hiver/core/common/constant/WorkerConstant.java @@ -0,0 +1,24 @@ +package cc.hiver.core.common.constant; + +/** + * 用户常量 + * + * @author Yazhi Li + */ +public interface WorkerConstant { + + /** + * 抢单工正常抢单状态 + */ + Integer WORKER_STATUS_NORMAL = 1; + /** + * 抢单工不可接单状态(押金不足) + */ + Integer USER_STATUS_LOCK = 2; + + /** + * 抢单工禁用状态(管理员直接禁用) + */ + Integer USER_STATUS_DISABLE = 3; + +} diff --git a/hiver-core/src/main/java/cc/hiver/core/dao/OrderDao.java b/hiver-core/src/main/java/cc/hiver/core/dao/OrderDao.java index 546b0de7..e850ab8a 100644 --- a/hiver-core/src/main/java/cc/hiver/core/dao/OrderDao.java +++ b/hiver-core/src/main/java/cc/hiver/core/dao/OrderDao.java @@ -2,11 +2,7 @@ package cc.hiver.core.dao; import cc.hiver.core.base.HiverBaseDao; import cc.hiver.core.entity.Order; -import cc.hiver.core.entity.Order; -import org.springframework.data.jpa.repository.Modifying; -import org.springframework.data.jpa.repository.Query; -import java.util.List; /** * 用户数据处理层 diff --git a/hiver-core/src/main/java/cc/hiver/core/dao/WorkerDao.java b/hiver-core/src/main/java/cc/hiver/core/dao/WorkerDao.java new file mode 100644 index 00000000..8b68ba22 --- /dev/null +++ b/hiver-core/src/main/java/cc/hiver/core/dao/WorkerDao.java @@ -0,0 +1,8 @@ +package cc.hiver.core.dao; + +import cc.hiver.core.base.HiverBaseDao; +import cc.hiver.core.entity.Worker; + +public interface WorkerDao extends HiverBaseDao { + +} \ No newline at end of file diff --git a/hiver-core/src/main/java/cc/hiver/core/entity/Order.java b/hiver-core/src/main/java/cc/hiver/core/entity/Order.java index 4d59937a..707caaab 100644 --- a/hiver-core/src/main/java/cc/hiver/core/entity/Order.java +++ b/hiver-core/src/main/java/cc/hiver/core/entity/Order.java @@ -1,7 +1,12 @@ package cc.hiver.core.entity; -import cc.hiver.core.base.HiverBaseEntity; +import cc.hiver.core.common.utils.NameUtil; +import cc.hiver.core.common.utils.SnowFlakeUtil; +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @@ -9,11 +14,18 @@ import lombok.EqualsAndHashCode; import lombok.experimental.Accessors; import org.hibernate.annotations.DynamicInsert; import org.hibernate.annotations.DynamicUpdate; +import org.hibernate.annotations.NotFound; +import org.hibernate.annotations.NotFoundAction; +import org.springframework.data.annotation.CreatedBy; +import org.springframework.data.annotation.CreatedDate; +import org.springframework.data.annotation.LastModifiedBy; +import org.springframework.data.annotation.LastModifiedDate; +import org.springframework.data.jpa.domain.support.AuditingEntityListener; +import org.springframework.format.annotation.DateTimeFormat; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.Id; -import javax.persistence.Table; +import javax.persistence.*; +import javax.validation.constraints.Pattern; +import java.io.Serializable; import java.util.Date; @Data @@ -23,24 +35,32 @@ import java.util.Date; @DynamicUpdate @Table(name = "t_order") @TableName("t_order") -@EqualsAndHashCode(callSuper = true) @ApiModel(value = "下单") -public class Order extends HiverBaseEntity { +@EntityListeners(AuditingEntityListener.class) +@JsonIgnoreProperties(value = {"hibernateLazyInitializer", "handler", "fieldHandler"}) +public class Order implements Serializable { + + private static final long serialVersionUID = 1L; /** * 订单号,默认前缀为XD */ + @Id @ApiModelProperty("订单号,默认前缀为XD") - @Column(name = "order_id", nullable = false) - private String orderId; + @Column(name = "order_id", nullable = false,unique = true) + private String orderId = "XD" + SnowFlakeUtil.nextId().toString(); /** * 订单运送地址 */ - @ApiModelProperty("订单运送地址") + @ApiModelProperty("订单运送省市地址") @Column(name = "order_address") private String orderAddress; + @ApiModelProperty(value = "街道地址") + @Column(name = "order_street") + private String orderStreet; + /** * 物流方式 */ @@ -101,7 +121,45 @@ public class Order extends HiverBaseEntity { * 被抢单时间 */ @ApiModelProperty("被抢单时间") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") @Column(name = "order_by_workertime") private Date orderByWorkertime; + @ApiModelProperty(value = "手机") + @Pattern(regexp = NameUtil.regMobile, message = "11位手机号格式不正确") + private String mobile; + + @ApiModelProperty("订单创建人") + @CreatedBy + @TableField(fill = FieldFill.INSERT) + private String createBy; + + @CreatedDate + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @ApiModelProperty("订单创建时间") + private Date createTime; + + @ApiModelProperty("订单修改人") + @LastModifiedBy + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + + @LastModifiedDate + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @ApiModelProperty(value = "订单修改时间") + @TableField(fill = FieldFill.UPDATE) + private Date updateTime; + + + /** + * 订单工修改时间 + */ + @ManyToOne(targetEntity = Worker.class) + @NotFound(action= NotFoundAction.IGNORE) + @JoinColumn(name="order_by_worker",insertable=false, updatable=false) + private Worker worker; + } diff --git a/hiver-core/src/main/java/cc/hiver/core/entity/Worker.java b/hiver-core/src/main/java/cc/hiver/core/entity/Worker.java new file mode 100644 index 00000000..0f478d18 --- /dev/null +++ b/hiver-core/src/main/java/cc/hiver/core/entity/Worker.java @@ -0,0 +1,123 @@ +package cc.hiver.core.entity; + +import cc.hiver.core.common.utils.SnowFlakeUtil; +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; +import org.hibernate.annotations.DynamicInsert; +import org.hibernate.annotations.DynamicUpdate; +import org.springframework.data.annotation.CreatedBy; +import org.springframework.data.annotation.CreatedDate; +import org.springframework.data.annotation.LastModifiedBy; +import org.springframework.data.annotation.LastModifiedDate; +import org.springframework.data.jpa.domain.support.AuditingEntityListener; +import org.springframework.format.annotation.DateTimeFormat; + +import javax.persistence.*; +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +@Data +@Entity +@Accessors(chain = true) +@DynamicInsert +@DynamicUpdate +@Table(name = "t_worker") +@TableName("t_worker") +@ApiModel(value = "抢单工管理") +@EntityListeners(AuditingEntityListener.class) +@JsonIgnoreProperties(value = {"hibernateLazyInitializer", "handler", "fieldHandler"}) +public class Worker implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 抢单工编号 + */ + @Id + @ApiModelProperty("抢单工编号") + @Column(name = "worker_id", nullable = false) + private String workerId = "W"+SnowFlakeUtil.nextId().toString(); + + /** + * 抢单工名称 + */ + @ApiModelProperty("抢单工名称") + @Column(name = "worker_name") + private String workerName; + + /** + * 抢单工简介 + */ + @ApiModelProperty("抢单工简介") + @Column(name = "worker_describe") + private String workerDescribe; + + /** + * 缴押金总额 + */ + @Column(name = "depo_num") + @ApiModelProperty("缴押金总额") + private Integer depoNum; + + /** + * 押金余额 + */ + @ApiModelProperty("押金余额") + @Column(name = "depo_bal") + private Integer depoBal; + + /** + * 接单状态 1-可抢单 2-不可接单(押金不足状态) 3-已禁用(手工预置状态) + */ + @Column(name = "worker_status") + @ApiModelProperty("接单状态 1-可抢单 2-不可接单(押金不足状态) 3-已禁用(手工预置状态)") + private Integer workerStatus = 1; + + + @ApiModelProperty("订单工创建人") + @CreatedBy + @TableField(fill = FieldFill.INSERT) + private String createBy; + + @CreatedDate + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @ApiModelProperty("订单工创建时间") + private Date createTime; + + @ApiModelProperty("订单工修改人") + @LastModifiedBy + @TableField(fill = FieldFill.UPDATE) + private String updateBy; + + @LastModifiedDate + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @ApiModelProperty(value = "订单工修改时间") + @TableField(fill = FieldFill.UPDATE) + private Date updateTime; + + /** + * 联系方式 + */ + @Column(name = "mobile") + @ApiModelProperty("联系方式") + private String mobile; + + + /** + * 订单与抢单工映射关系 + */ + @OneToMany(targetEntity = Order.class,mappedBy = "orderByWorker") + private List order; + +} diff --git a/hiver-core/src/main/java/cc/hiver/core/service/OrderService.java b/hiver-core/src/main/java/cc/hiver/core/service/OrderService.java index fa7f2f9e..99d829ad 100644 --- a/hiver-core/src/main/java/cc/hiver/core/service/OrderService.java +++ b/hiver-core/src/main/java/cc/hiver/core/service/OrderService.java @@ -26,6 +26,6 @@ public interface OrderService extends HiverBaseService { * @param pageable * @return */ - Page findByCondition(Order Order, SearchVo searchVo, Pageable pageable); + Page findByCondition(Order order, SearchVo searchVo, Pageable pageable); } diff --git a/hiver-core/src/main/java/cc/hiver/core/service/WorkerService.java b/hiver-core/src/main/java/cc/hiver/core/service/WorkerService.java new file mode 100644 index 00000000..e8b18864 --- /dev/null +++ b/hiver-core/src/main/java/cc/hiver/core/service/WorkerService.java @@ -0,0 +1,29 @@ +package cc.hiver.core.service; + +import cc.hiver.core.base.HiverBaseService; +import cc.hiver.core.common.vo.SearchVo; +import cc.hiver.core.entity.Order; +import cc.hiver.core.entity.Worker; +import org.springframework.cache.annotation.CacheConfig; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; + +/** + * 用户接口 + * + * @author Houpn + */ +@CacheConfig(cacheNames = "worker") +public interface WorkerService extends HiverBaseService { + + /** + * 多条件分页获取抢单工 + * + * @param Worker + * @param searchVo + * @param pageable + * @return + */ + Page findByCondition(Worker worker, SearchVo searchVo, Pageable pageable); + +} diff --git a/hiver-core/src/main/java/cc/hiver/core/serviceimpl/WorkerServiceImpl.java b/hiver-core/src/main/java/cc/hiver/core/serviceimpl/WorkerServiceImpl.java new file mode 100644 index 00000000..48ac79d4 --- /dev/null +++ b/hiver-core/src/main/java/cc/hiver/core/serviceimpl/WorkerServiceImpl.java @@ -0,0 +1,91 @@ +package cc.hiver.core.serviceimpl; + +import cc.hiver.core.common.utils.SecurityUtil; +import cc.hiver.core.common.vo.SearchVo; +import cc.hiver.core.dao.WorkerDao; +import cc.hiver.core.entity.Worker; +import cc.hiver.core.service.WorkerService; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.StrUtil; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.data.jpa.domain.Specification; +import org.springframework.lang.Nullable; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.persistence.criteria.*; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +/** + * 用户接口实现 + * + * @author houpn + */ +@Slf4j +@Service +@Transactional +public class WorkerServiceImpl implements WorkerService { + @Autowired + private WorkerDao workerDao; + + @Autowired + private SecurityUtil securityUtil; + + @Override + public WorkerDao getRepository() { + return workerDao; + } + + @Override + public Page findByCondition(Worker worker, SearchVo searchVo, Pageable pageable) { + return workerDao.findAll(new Specification() { + @Nullable + @Override + public Predicate toPredicate(Root root, CriteriaQuery cq, CriteriaBuilder cb) { + Path workerIdField = root.get("workerId"); + Path workerNameField = root.get("workerName"); + Path workerStatusField = root.get("workerStatus"); + Path mobileField = root.get("mobile"); + Path createTimeField = root.get("createTime"); + + List list = new ArrayList<>(); + + if (StrUtil.isNotBlank(worker.getWorkerId())) { + list.add(cb.equal(workerIdField, worker.getWorkerId())); + } + + // 模糊搜素 + if (StrUtil.isNotBlank(worker.getWorkerName())) { + list.add(cb.like(workerNameField, '%' + worker.getWorkerName() + '%')); + } + + // 状态 + if (worker.getWorkerStatus() != null) { + list.add(cb.equal(workerStatusField, worker.getWorkerStatus())); + } + + // 模糊搜素 + if (StrUtil.isNotBlank(worker.getMobile())) { + list.add(cb.like(mobileField, '%' + worker.getMobile() + '%')); + } + // 创建时间 + if (StrUtil.isNotBlank(searchVo.getStartDate()) && StrUtil.isNotBlank(searchVo.getEndDate())) { + Date start = DateUtil.parse(searchVo.getStartDate()); + Date end = DateUtil.parse(searchVo.getEndDate()); + list.add(cb.between(createTimeField, start, DateUtil.endOfDay(end))); + } + + // 数据权限 + + Predicate[] arr = new Predicate[list.size()]; + cq.where(list.toArray(arr)); + return null; + } + }, pageable); + } +} diff --git a/hiver-core/src/main/java/cc/hiver/core/vo/WorkerVO.java b/hiver-core/src/main/java/cc/hiver/core/vo/WorkerVO.java new file mode 100644 index 00000000..dad5b00f --- /dev/null +++ b/hiver-core/src/main/java/cc/hiver/core/vo/WorkerVO.java @@ -0,0 +1,92 @@ +package cc.hiver.core.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotNull; +import java.util.Date; + + +@Data +@ApiModel("保存 ") +public class WorkerVO { + + /** + * 抢单工编号 + */ + @NotNull(message = "workerId can not null") + @ApiModelProperty("抢单工编号") + private String workerId; + + + /** + * 抢单工名称 + */ + @ApiModelProperty("抢单工名称") + private String workerName; + + + /** + * 抢单工简介 + */ + @ApiModelProperty("抢单工简介") + private String workerDescribe; + + + /** + * 缴押金总额 + */ + @ApiModelProperty("缴押金总额") + private Integer depoNum; + + + /** + * 押金余额 + */ + @ApiModelProperty("押金余额") + private Integer depoBal; + + + /** + * 接单状态 1-可抢单 2-不可接单(押金不足状态) 3-已禁用(手工预置状态) + */ + @ApiModelProperty("接单状态 1-可抢单 2-不可接单(押金不足状态) 3-已禁用(手工预置状态)") + private Integer workerStatus; + + + /** + * 订单工创建人 + */ + @ApiModelProperty("订单工创建人") + private String createBy; + + + /** + * 订单工创建时间 + */ + @ApiModelProperty("订单工创建时间") + private Date createTime; + + + /** + * 订单工修改人 + */ + @ApiModelProperty("订单工修改人") + private String updateBy; + + + /** + * 订单工修改时间 + */ + @ApiModelProperty("订单工修改时间") + private Date updateTime; + + + /** + * 联系方式 + */ + @ApiModelProperty("联系方式") + private String mobile; + +} diff --git a/hiver-modules/hiver-base/src/main/java/cc/hiver/base/controller/manage/OrderController.java b/hiver-modules/hiver-base/src/main/java/cc/hiver/base/controller/manage/OrderController.java index e95cd371..93af041e 100644 --- a/hiver-modules/hiver-base/src/main/java/cc/hiver/base/controller/manage/OrderController.java +++ b/hiver-modules/hiver-base/src/main/java/cc/hiver/base/controller/manage/OrderController.java @@ -97,12 +97,11 @@ public class OrderController { // 发送创建账号消息 //addMessage.addSendMessage(user.getId()); - return ResultUtil.success("常见成功"); + return ResultUtil.success("创建成功"); } @RequestMapping(value = "/admin/edit", method = RequestMethod.POST) @ApiOperation(value = "修改订单", notes = "需要通过下单编号获取订单信息") - @CacheEvict(key = "#u.username") public Result edit(Order u, @RequestParam(required = false) String[] roleIds) { diff --git a/hiver-modules/hiver-base/src/main/java/cc/hiver/base/controller/manage/WorkerController.java b/hiver-modules/hiver-base/src/main/java/cc/hiver/base/controller/manage/WorkerController.java new file mode 100644 index 00000000..606e0c10 --- /dev/null +++ b/hiver-modules/hiver-base/src/main/java/cc/hiver/base/controller/manage/WorkerController.java @@ -0,0 +1,126 @@ +package cc.hiver.base.controller.manage; + +import cc.hiver.core.common.constant.UserConstant; +import cc.hiver.core.common.constant.WorkerConstant; +import cc.hiver.core.common.redis.RedisTemplateHelper; +import cc.hiver.core.common.utils.PageUtil; +import cc.hiver.core.common.utils.ResultUtil; +import cc.hiver.core.common.utils.SecurityUtil; +import cc.hiver.core.common.vo.PageVo; +import cc.hiver.core.common.vo.Result; +import cc.hiver.core.common.vo.SearchVo; +import cc.hiver.core.dao.mapper.DeleteMapper; +import cc.hiver.core.entity.Worker; +import cc.hiver.core.service.WorkerService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cache.annotation.CacheConfig; +import org.springframework.data.domain.Page; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.bind.annotation.*; + +import javax.persistence.EntityManager; +import javax.persistence.PersistenceContext; +import javax.validation.Valid; + +/** + * 订单工管理接口 + * + * @author houpn + */ +@Slf4j +@RestController +@Api(tags = "订单工接口") +@RequestMapping("/hiver/worker") +@CacheConfig(cacheNames = "worker") +@Transactional +public class WorkerController { + public static final String WORKER = "worker::"; + + @Autowired + private WorkerService workerService; + + @Autowired + private DeleteMapper deleteMapper; + + @Autowired + private RedisTemplateHelper redisTemplate; + + @Autowired + private SecurityUtil securityUtil; + + @PersistenceContext + private EntityManager entityManager; + + + + + @RequestMapping(value = "/getByCondition", method = RequestMethod.GET) + @ApiOperation(value = "多条件分页获取订单列表") + public Result> getByCondition(Worker worker, + SearchVo searchVo, + PageVo pageVo) { + Page page = workerService.findByCondition(worker, searchVo, PageUtil.initPage(pageVo)); + return new ResultUtil>().setData(page); + } + + + + @RequestMapping(value = "/delByIds", method = RequestMethod.POST) + @ApiOperation(value = "批量通过ids删除") + public Result delAllByIds(@RequestParam String[] ids) { + for (String id : ids) { + workerService.delete(id); + } + return ResultUtil.success("批量通过id删除数据成功"); + } + + @RequestMapping(value = "/admin/add", method = RequestMethod.POST) + @ApiOperation(value = "创建抢单工") + public Result add(@Valid Worker u, + @RequestParam(required = false) String[] roleIds) { + + Worker worker = workerService.save(u); + + // 发送创建账号消息 + //addMessage.addSendMessage(user.getId()); + return ResultUtil.success("创建成功"); + } + + @RequestMapping(value = "/admin/edit", method = RequestMethod.POST) + @ApiOperation(value = "修改抢单工信息", notes = "需要通过下单编号获取订单信息") + public Result edit(Worker u, + @RequestParam(required = false) String[] roleIds) { + + workerService.update(u); + + return ResultUtil.success("修改成功"); + } + + @RequestMapping(value = "/admin/disable/{workerId}", method = RequestMethod.POST) + @ApiOperation(value = "后台人工禁用抢单工") + public Result disable(@ApiParam("用户唯一id标识") @PathVariable String workerId) { + Worker worker = workerService.get(workerId); + worker.setWorkerStatus(WorkerConstant.USER_STATUS_DISABLE); + workerService.update(worker); + // 手动更新缓存 + //redisTemplate.delete(WORKER + worker.getWorkerId()); + return ResultUtil.success("操作成功"); + } + + @RequestMapping(value = "/admin/enable/{workerId}", method = RequestMethod.POST) + @ApiOperation(value = "后台人工启用抢单工") + public Result enable(@ApiParam("抢单工唯一id标识") @PathVariable String workerId) { + Worker worker = workerService.get(workerId); + //这儿暂时有bug,启用的时候其实需要判定原状态是启用还是不可接单状态,需要进行逻辑判断 + worker.setWorkerStatus(WorkerConstant.WORKER_STATUS_NORMAL); + workerService.update(worker); + // 手动更新缓存 + //redisTemplate.delete(WORKER + worker.getWorkerId()); + return ResultUtil.success("操作成功"); + } + +} From 9fd77c8e9279ddbe3030f1bfdeb41b564f77a5fe Mon Sep 17 00:00:00 2001 From: Houpn Date: Tue, 11 Jul 2023 19:53:55 +0800 Subject: [PATCH 03/10] =?UTF-8?q?=E6=8F=90=E4=BA=A4=E7=89=A9=E6=B5=81?= =?UTF-8?q?=E7=AE=A1=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/cc/hiver/core/dao/OrderDao.java | 1 + .../main/java/cc/hiver/core/entity/Order.java | 4 +- .../java/cc/hiver/core/entity/Worker.java | 4 +- .../cc/hiver/core/service/OrderService.java | 5 +- .../core/serviceimpl/OrderServiceImpl.java | 8 +++ .../controller/manage/OrderController.java | 56 ++++++++++++++++++- 6 files changed, 71 insertions(+), 7 deletions(-) diff --git a/hiver-core/src/main/java/cc/hiver/core/dao/OrderDao.java b/hiver-core/src/main/java/cc/hiver/core/dao/OrderDao.java index e850ab8a..2fc26b11 100644 --- a/hiver-core/src/main/java/cc/hiver/core/dao/OrderDao.java +++ b/hiver-core/src/main/java/cc/hiver/core/dao/OrderDao.java @@ -11,5 +11,6 @@ import cc.hiver.core.entity.Order; */ public interface OrderDao extends HiverBaseDao { + Order findByOrderId(String orderId); } diff --git a/hiver-core/src/main/java/cc/hiver/core/entity/Order.java b/hiver-core/src/main/java/cc/hiver/core/entity/Order.java index 707caaab..649350e5 100644 --- a/hiver-core/src/main/java/cc/hiver/core/entity/Order.java +++ b/hiver-core/src/main/java/cc/hiver/core/entity/Order.java @@ -94,7 +94,7 @@ public class Order implements Serializable { */ @ApiModelProperty("订单是否超时") @Column(name = "is_timeout") - private Boolean timeout; + private String timeout; /** * 订单状态 @@ -155,7 +155,7 @@ public class Order implements Serializable { /** - * 订单工修改时间 + * 关联订单工 */ @ManyToOne(targetEntity = Worker.class) @NotFound(action= NotFoundAction.IGNORE) diff --git a/hiver-core/src/main/java/cc/hiver/core/entity/Worker.java b/hiver-core/src/main/java/cc/hiver/core/entity/Worker.java index 0f478d18..ef765275 100644 --- a/hiver-core/src/main/java/cc/hiver/core/entity/Worker.java +++ b/hiver-core/src/main/java/cc/hiver/core/entity/Worker.java @@ -116,8 +116,10 @@ public class Worker implements Serializable { /** * 订单与抢单工映射关系 + * + * 多端中的列键值《外键》指向一端 一对多的单向关联,我们还是推荐使用一张中间表来建立关系。 */ - @OneToMany(targetEntity = Order.class,mappedBy = "orderByWorker") + @OneToMany(targetEntity = Order.class,mappedBy = "orderByWorker",cascade = CascadeType.ALL,fetch = FetchType.EAGER) private List order; } diff --git a/hiver-core/src/main/java/cc/hiver/core/service/OrderService.java b/hiver-core/src/main/java/cc/hiver/core/service/OrderService.java index 99d829ad..55919e99 100644 --- a/hiver-core/src/main/java/cc/hiver/core/service/OrderService.java +++ b/hiver-core/src/main/java/cc/hiver/core/service/OrderService.java @@ -3,7 +3,6 @@ package cc.hiver.core.service; import cc.hiver.core.base.HiverBaseService; import cc.hiver.core.common.vo.SearchVo; import cc.hiver.core.entity.Order; -import cc.hiver.core.entity.Order; import org.springframework.cache.annotation.CacheConfig; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; @@ -21,11 +20,13 @@ public interface OrderService extends HiverBaseService { /** * 多条件分页获取用户 * - * @param Order + * @param * @param searchVo * @param pageable * @return */ Page findByCondition(Order order, SearchVo searchVo, Pageable pageable); + Order findByOrderId(String orderId); + } diff --git a/hiver-core/src/main/java/cc/hiver/core/serviceimpl/OrderServiceImpl.java b/hiver-core/src/main/java/cc/hiver/core/serviceimpl/OrderServiceImpl.java index c3678f91..1688026d 100644 --- a/hiver-core/src/main/java/cc/hiver/core/serviceimpl/OrderServiceImpl.java +++ b/hiver-core/src/main/java/cc/hiver/core/serviceimpl/OrderServiceImpl.java @@ -5,6 +5,7 @@ import cc.hiver.core.common.vo.SearchVo; import cc.hiver.core.dao.OrderDao; import cc.hiver.core.entity.Order; +import cc.hiver.core.entity.User; import cc.hiver.core.service.OrderService; import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.StrUtil; @@ -96,4 +97,11 @@ public class OrderServiceImpl implements OrderService { } }, pageable); } + + @Override + public Order findByOrderId(String orderId) { + return orderDao.findByOrderId(orderId); + } + + } diff --git a/hiver-modules/hiver-base/src/main/java/cc/hiver/base/controller/manage/OrderController.java b/hiver-modules/hiver-base/src/main/java/cc/hiver/base/controller/manage/OrderController.java index 93af041e..e9f3a4b4 100644 --- a/hiver-modules/hiver-base/src/main/java/cc/hiver/base/controller/manage/OrderController.java +++ b/hiver-modules/hiver-base/src/main/java/cc/hiver/base/controller/manage/OrderController.java @@ -66,8 +66,9 @@ public class OrderController { private EntityManager entityManager; - - + /** + * 该接口即可展示实时物流管理页面,可复用 + */ @RequestMapping(value = "/getByCondition", method = RequestMethod.GET) @ApiOperation(value = "多条件分页获取订单列表") public Result> getByCondition(Order order, @@ -111,4 +112,55 @@ public class OrderController { } + /** + * 需要进行如下判定: + * 1.当前抢单工的抢单状态需进行查验,非正常无法进行抢单 + * 2.正常状态下,判定当前抢单工押金余额是否充足,不足时需要将当前扛包工状态自动修正为不可接单状态,同时当前订单无法抢购。 + * 3.正常抢单情况下,需要在redis中设置抢单后的剩余押金金额,要存在抢单锁机制,实时更新余额 + */ + @RequestMapping(value = "/rush/order/{orderId}", method = RequestMethod.POST) + @ApiOperation(value = "抢单接口", notes = "需要通过下单编号获取订单信息后进行绑定") + public Result rush(Order u, + @RequestParam(required = false) String[] roleIds) { + + + orderService.update(u); + + return ResultUtil.success("抢单成功"); + } + + /** + * 需要进行如下判定:(订单/抢单工/抢单时间/是否超时) + * 1.定时任务轮训修正订单是否超时(当前抢单时间和当前时间做比较) + * 2.当前解绑操作暂定为 超时后手工解绑,创建订单人享有解绑权限,解绑后订单可重新进行抢单(但是否需要标注将原接单人不可见) + * + */ + @RequestMapping(value = "/unbind/order/{orderId}", method = RequestMethod.POST) + @ApiOperation(value = "解绑订单接口", notes = "需要通过下单编号获取订单信息后进行解绑") + public Result revoke(Order u, + @ApiParam("订单唯一id标识") @PathVariable String orderId) { + + Order o = orderService.findById(orderId); + + o.setOrderByWorker(""); + o.setOrderByWorkertime(null); + + orderService.update(o); + + return ResultUtil.success("解绑成功"); + } + + + /** + * 该接口即可展示实时物流管理页面,可复用 + */ + @RequestMapping(value = "/ow/getAllByCondition", method = RequestMethod.GET) + @ApiOperation(value = "多条件分页获取订单列表") + public Result> getAllByCondition(Order order, + SearchVo searchVo, + PageVo pageVo) { + Page page = orderService.findByCondition(order, searchVo, PageUtil.initPage(pageVo)); + return new ResultUtil>().setData(page); + } + } From 1c9e4e423657b00d2e4eac00745a27ae74c4f723 Mon Sep 17 00:00:00 2001 From: Houpn Date: Wed, 12 Jul 2023 16:06:28 +0800 Subject: [PATCH 04/10] =?UTF-8?q?=E6=8F=90=E4=BA=A4=E7=89=A9=E6=B5=81?= =?UTF-8?q?=E7=AE=A1=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/cc/hiver/core/entity/Worker.java | 4 +- .../cc/hiver/core/service/OrderService.java | 3 + .../core/serviceimpl/OrderServiceImpl.java | 57 +++++++++++++++++++ .../controller/manage/OrderController.java | 2 +- 4 files changed, 63 insertions(+), 3 deletions(-) diff --git a/hiver-core/src/main/java/cc/hiver/core/entity/Worker.java b/hiver-core/src/main/java/cc/hiver/core/entity/Worker.java index ef765275..445331fc 100644 --- a/hiver-core/src/main/java/cc/hiver/core/entity/Worker.java +++ b/hiver-core/src/main/java/cc/hiver/core/entity/Worker.java @@ -119,7 +119,7 @@ public class Worker implements Serializable { * * 多端中的列键值《外键》指向一端 一对多的单向关联,我们还是推荐使用一张中间表来建立关系。 */ - @OneToMany(targetEntity = Order.class,mappedBy = "orderByWorker",cascade = CascadeType.ALL,fetch = FetchType.EAGER) - private List order; + /*@OneToMany(targetEntity = Order.class,mappedBy = "orderByWorker",cascade = CascadeType.ALL,fetch = FetchType.EAGER) + private List order;*/ } diff --git a/hiver-core/src/main/java/cc/hiver/core/service/OrderService.java b/hiver-core/src/main/java/cc/hiver/core/service/OrderService.java index 55919e99..a7cdb396 100644 --- a/hiver-core/src/main/java/cc/hiver/core/service/OrderService.java +++ b/hiver-core/src/main/java/cc/hiver/core/service/OrderService.java @@ -29,4 +29,7 @@ public interface OrderService extends HiverBaseService { Order findByOrderId(String orderId); + Page findAllByCondition(Order order, SearchVo searchVo, Pageable pageable); + + } diff --git a/hiver-core/src/main/java/cc/hiver/core/serviceimpl/OrderServiceImpl.java b/hiver-core/src/main/java/cc/hiver/core/serviceimpl/OrderServiceImpl.java index 1688026d..e9badbe4 100644 --- a/hiver-core/src/main/java/cc/hiver/core/serviceimpl/OrderServiceImpl.java +++ b/hiver-core/src/main/java/cc/hiver/core/serviceimpl/OrderServiceImpl.java @@ -103,5 +103,62 @@ public class OrderServiceImpl implements OrderService { return orderDao.findByOrderId(orderId); } + @Override + public Page findAllByCondition(Order order, SearchVo searchVo, Pageable pageable) { + return orderDao.findAll(new Specification() { + @Nullable + @Override + public Predicate toPredicate(Root root, CriteriaQuery cq, CriteriaBuilder cb) { + Path OrderIdField = root.get("orderId"); + Path norderLogisticsField = root.get("orderLogistics"); + Path kdOrderIdField = root.get("kdOrderId"); + Path timeoutField = root.get("timeout"); + Path orderStatusdField = root.get("orderStatus"); + Path orderByWorkerField = root.get("orderByWorker"); + //抢单时间 + Path createTimeField = root.get("orderByWorkertime"); + + List list = new ArrayList<>(); + + if (StrUtil.isNotBlank(order.getOrderId())) { + list.add(cb.equal(OrderIdField, order.getOrderId())); + } + + // 精确搜索 + if (StrUtil.isNotBlank(order.getOrderLogistics())) { + list.add(cb.equal(norderLogisticsField, order.getOrderLogistics())); + } + if (StrUtil.isNotBlank(order.getKdOrderId())) { + list.add(cb.like(kdOrderIdField, order.getKdOrderId())); + } + + if (StrUtil.isNotBlank(order.getTimeout())) { + list.add(cb.equal(timeoutField, order.getTimeout())); + } + + // 状态 + if (order.getOrderStatus() != null) { + list.add(cb.equal(orderStatusdField, order.getOrderStatus())); + } + + if (StrUtil.isNotBlank(order.getOrderByWorker())) { + list.add(cb.equal(orderByWorkerField, order.getOrderByWorker())); + } + // 创建时间 + if (StrUtil.isNotBlank(searchVo.getStartDate()) && StrUtil.isNotBlank(searchVo.getEndDate())) { + Date start = DateUtil.parse(searchVo.getStartDate()); + Date end = DateUtil.parse(searchVo.getEndDate()); + list.add(cb.between(createTimeField, start, DateUtil.endOfDay(end))); + } + + // 数据权限 + + Predicate[] arr = new Predicate[list.size()]; + cq.where(list.toArray(arr)); + return null; + } + }, pageable); + } + } diff --git a/hiver-modules/hiver-base/src/main/java/cc/hiver/base/controller/manage/OrderController.java b/hiver-modules/hiver-base/src/main/java/cc/hiver/base/controller/manage/OrderController.java index e9f3a4b4..d6b0ef93 100644 --- a/hiver-modules/hiver-base/src/main/java/cc/hiver/base/controller/manage/OrderController.java +++ b/hiver-modules/hiver-base/src/main/java/cc/hiver/base/controller/manage/OrderController.java @@ -159,7 +159,7 @@ public class OrderController { public Result> getAllByCondition(Order order, SearchVo searchVo, PageVo pageVo) { - Page page = orderService.findByCondition(order, searchVo, PageUtil.initPage(pageVo)); + Page page = orderService.findAllByCondition(order, searchVo, PageUtil.initPage(pageVo)); return new ResultUtil>().setData(page); } From 6edff7e9cbd936ef9f8619b0c69ac338ddf58abb Mon Sep 17 00:00:00 2001 From: Houpn Date: Fri, 14 Jul 2023 11:36:59 +0800 Subject: [PATCH 05/10] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E7=89=A9=E6=B5=81?= =?UTF-8?q?=E7=AE=A1=E7=90=86=E6=A8=A1=E5=9D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/cc/hiver/core/dao/OrderDao.java | 6 ++-- .../core/entity/{Order.java => OrderXd.java} | 5 ++-- .../java/cc/hiver/core/entity/Worker.java | 2 -- .../cc/hiver/core/service/OrderService.java | 14 ++++------ .../cc/hiver/core/service/WorkerService.java | 1 - .../core/serviceimpl/OrderServiceImpl.java | 27 +++++++++--------- .../controller/manage/OrderController.java | 28 +++++++++---------- 7 files changed, 39 insertions(+), 44 deletions(-) rename hiver-core/src/main/java/cc/hiver/core/entity/{Order.java => OrderXd.java} (97%) diff --git a/hiver-core/src/main/java/cc/hiver/core/dao/OrderDao.java b/hiver-core/src/main/java/cc/hiver/core/dao/OrderDao.java index 2fc26b11..62e9383e 100644 --- a/hiver-core/src/main/java/cc/hiver/core/dao/OrderDao.java +++ b/hiver-core/src/main/java/cc/hiver/core/dao/OrderDao.java @@ -1,7 +1,7 @@ package cc.hiver.core.dao; import cc.hiver.core.base.HiverBaseDao; -import cc.hiver.core.entity.Order; +import cc.hiver.core.entity.OrderXd; /** @@ -9,8 +9,8 @@ import cc.hiver.core.entity.Order; * * @author Houpn */ -public interface OrderDao extends HiverBaseDao { +public interface OrderDao extends HiverBaseDao { - Order findByOrderId(String orderId); + OrderXd findByOrderId(String orderId); } diff --git a/hiver-core/src/main/java/cc/hiver/core/entity/Order.java b/hiver-core/src/main/java/cc/hiver/core/entity/OrderXd.java similarity index 97% rename from hiver-core/src/main/java/cc/hiver/core/entity/Order.java rename to hiver-core/src/main/java/cc/hiver/core/entity/OrderXd.java index 649350e5..7c4dad8f 100644 --- a/hiver-core/src/main/java/cc/hiver/core/entity/Order.java +++ b/hiver-core/src/main/java/cc/hiver/core/entity/OrderXd.java @@ -10,7 +10,6 @@ import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; -import lombok.EqualsAndHashCode; import lombok.experimental.Accessors; import org.hibernate.annotations.DynamicInsert; import org.hibernate.annotations.DynamicUpdate; @@ -38,7 +37,7 @@ import java.util.Date; @ApiModel(value = "下单") @EntityListeners(AuditingEntityListener.class) @JsonIgnoreProperties(value = {"hibernateLazyInitializer", "handler", "fieldHandler"}) -public class Order implements Serializable { +public class OrderXd implements Serializable { private static final long serialVersionUID = 1L; @@ -158,8 +157,8 @@ public class Order implements Serializable { * 关联订单工 */ @ManyToOne(targetEntity = Worker.class) - @NotFound(action= NotFoundAction.IGNORE) @JoinColumn(name="order_by_worker",insertable=false, updatable=false) private Worker worker; + } diff --git a/hiver-core/src/main/java/cc/hiver/core/entity/Worker.java b/hiver-core/src/main/java/cc/hiver/core/entity/Worker.java index 445331fc..f4d7c584 100644 --- a/hiver-core/src/main/java/cc/hiver/core/entity/Worker.java +++ b/hiver-core/src/main/java/cc/hiver/core/entity/Worker.java @@ -9,7 +9,6 @@ import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; -import lombok.EqualsAndHashCode; import lombok.experimental.Accessors; import org.hibernate.annotations.DynamicInsert; import org.hibernate.annotations.DynamicUpdate; @@ -23,7 +22,6 @@ import org.springframework.format.annotation.DateTimeFormat; import javax.persistence.*; import java.io.Serializable; import java.util.Date; -import java.util.List; @Data @Entity diff --git a/hiver-core/src/main/java/cc/hiver/core/service/OrderService.java b/hiver-core/src/main/java/cc/hiver/core/service/OrderService.java index a7cdb396..5c5b37fd 100644 --- a/hiver-core/src/main/java/cc/hiver/core/service/OrderService.java +++ b/hiver-core/src/main/java/cc/hiver/core/service/OrderService.java @@ -2,20 +2,18 @@ package cc.hiver.core.service; import cc.hiver.core.base.HiverBaseService; import cc.hiver.core.common.vo.SearchVo; -import cc.hiver.core.entity.Order; +import cc.hiver.core.entity.OrderXd; import org.springframework.cache.annotation.CacheConfig; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; -import java.util.List; - /** * 用户接口 * * @author Houpn */ -@CacheConfig(cacheNames = "order") -public interface OrderService extends HiverBaseService { +@CacheConfig(cacheNames = "orderxd") +public interface OrderService extends HiverBaseService { /** * 多条件分页获取用户 @@ -25,11 +23,11 @@ public interface OrderService extends HiverBaseService { * @param pageable * @return */ - Page findByCondition(Order order, SearchVo searchVo, Pageable pageable); + Page findByCondition(OrderXd order, SearchVo searchVo, Pageable pageable); - Order findByOrderId(String orderId); + OrderXd findByOrderId(String orderId); - Page findAllByCondition(Order order, SearchVo searchVo, Pageable pageable); + Page findAllByCondition(OrderXd order, SearchVo searchVo, Pageable pageable); } diff --git a/hiver-core/src/main/java/cc/hiver/core/service/WorkerService.java b/hiver-core/src/main/java/cc/hiver/core/service/WorkerService.java index e8b18864..4ea7795b 100644 --- a/hiver-core/src/main/java/cc/hiver/core/service/WorkerService.java +++ b/hiver-core/src/main/java/cc/hiver/core/service/WorkerService.java @@ -2,7 +2,6 @@ package cc.hiver.core.service; import cc.hiver.core.base.HiverBaseService; import cc.hiver.core.common.vo.SearchVo; -import cc.hiver.core.entity.Order; import cc.hiver.core.entity.Worker; import org.springframework.cache.annotation.CacheConfig; import org.springframework.data.domain.Page; diff --git a/hiver-core/src/main/java/cc/hiver/core/serviceimpl/OrderServiceImpl.java b/hiver-core/src/main/java/cc/hiver/core/serviceimpl/OrderServiceImpl.java index e9badbe4..b109b8cc 100644 --- a/hiver-core/src/main/java/cc/hiver/core/serviceimpl/OrderServiceImpl.java +++ b/hiver-core/src/main/java/cc/hiver/core/serviceimpl/OrderServiceImpl.java @@ -3,9 +3,8 @@ package cc.hiver.core.serviceimpl; import cc.hiver.core.common.utils.SecurityUtil; import cc.hiver.core.common.vo.SearchVo; import cc.hiver.core.dao.OrderDao; -import cc.hiver.core.entity.Order; -import cc.hiver.core.entity.User; +import cc.hiver.core.entity.OrderXd; import cc.hiver.core.service.OrderService; import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.StrUtil; @@ -45,15 +44,15 @@ public class OrderServiceImpl implements OrderService { } @Override - public Page findByCondition(Order order, SearchVo searchVo, Pageable pageable) { - return orderDao.findAll(new Specification() { + public Page findByCondition(OrderXd order, SearchVo searchVo, Pageable pageable) { + return orderDao.findAll(new Specification() { @Nullable @Override - public Predicate toPredicate(Root root, CriteriaQuery cq, CriteriaBuilder cb) { + public Predicate toPredicate(Root root, CriteriaQuery cq, CriteriaBuilder cb) { Path OrderIdField = root.get("orderId"); Path norderLogisticsField = root.get("orderLogistics"); Path kdOrderIdField = root.get("kdOrderId"); - Path timeoutField = root.get("timeout"); + Path timeoutField = root.get("timeout"); Path orderStatusdField = root.get("orderStatus"); Path orderByWorkerField = root.get("orderByWorker"); Path createTimeField = root.get("createTime"); @@ -72,7 +71,9 @@ public class OrderServiceImpl implements OrderService { list.add(cb.like(kdOrderIdField, '%' + order.getKdOrderId() + '%')); } - //list.add(cb.equal(timeoutField, order.getTimeout())); + if (StrUtil.isNotBlank(order.getTimeout())) { + list.add(cb.equal(timeoutField, order.getTimeout())); + } // 状态 if (order.getOrderStatus() != null) { @@ -99,17 +100,17 @@ public class OrderServiceImpl implements OrderService { } @Override - public Order findByOrderId(String orderId) { + public OrderXd findByOrderId(String orderId) { return orderDao.findByOrderId(orderId); } @Override - public Page findAllByCondition(Order order, SearchVo searchVo, Pageable pageable) { - return orderDao.findAll(new Specification() { + public Page findAllByCondition(OrderXd order, SearchVo searchVo, Pageable pageable) { + return orderDao.findAll(new Specification() { @Nullable @Override - public Predicate toPredicate(Root root, CriteriaQuery cq, CriteriaBuilder cb) { - Path OrderIdField = root.get("orderId"); + public Predicate toPredicate(Root root, CriteriaQuery cq, CriteriaBuilder cb) { + Path orderIdField = root.get("orderId"); Path norderLogisticsField = root.get("orderLogistics"); Path kdOrderIdField = root.get("kdOrderId"); Path timeoutField = root.get("timeout"); @@ -121,7 +122,7 @@ public class OrderServiceImpl implements OrderService { List list = new ArrayList<>(); if (StrUtil.isNotBlank(order.getOrderId())) { - list.add(cb.equal(OrderIdField, order.getOrderId())); + list.add(cb.equal(orderIdField, order.getOrderId())); } // 精确搜索 diff --git a/hiver-modules/hiver-base/src/main/java/cc/hiver/base/controller/manage/OrderController.java b/hiver-modules/hiver-base/src/main/java/cc/hiver/base/controller/manage/OrderController.java index d6b0ef93..d02bbad9 100644 --- a/hiver-modules/hiver-base/src/main/java/cc/hiver/base/controller/manage/OrderController.java +++ b/hiver-modules/hiver-base/src/main/java/cc/hiver/base/controller/manage/OrderController.java @@ -45,10 +45,10 @@ import java.util.stream.Collectors; @RestController @Api(tags = "订单接口") @RequestMapping("/hiver/order") -@CacheConfig(cacheNames = "order") +@CacheConfig(cacheNames = "orderxd") @Transactional public class OrderController { - public static final String ORDER = "order::"; + public static final String ORDER = "orderxd::"; @Autowired private OrderService orderService; @@ -71,11 +71,11 @@ public class OrderController { */ @RequestMapping(value = "/getByCondition", method = RequestMethod.GET) @ApiOperation(value = "多条件分页获取订单列表") - public Result> getByCondition(Order order, + public Result> getByCondition(OrderXd order, SearchVo searchVo, PageVo pageVo) { - Page page = orderService.findByCondition(order, searchVo, PageUtil.initPage(pageVo)); - return new ResultUtil>().setData(page); + Page page = orderService.findByCondition(order, searchVo, PageUtil.initPage(pageVo)); + return new ResultUtil>().setData(page); } @@ -91,10 +91,10 @@ public class OrderController { @RequestMapping(value = "/admin/add", method = RequestMethod.POST) @ApiOperation(value = "创建订单") - public Result add(@Valid Order u, + public Result add(@Valid OrderXd u, @RequestParam(required = false) String[] roleIds) { - Order order = orderService.save(u); + OrderXd order = orderService.save(u); // 发送创建账号消息 //addMessage.addSendMessage(user.getId()); @@ -103,7 +103,7 @@ public class OrderController { @RequestMapping(value = "/admin/edit", method = RequestMethod.POST) @ApiOperation(value = "修改订单", notes = "需要通过下单编号获取订单信息") - public Result edit(Order u, + public Result edit(OrderXd u, @RequestParam(required = false) String[] roleIds) { orderService.update(u); @@ -120,7 +120,7 @@ public class OrderController { */ @RequestMapping(value = "/rush/order/{orderId}", method = RequestMethod.POST) @ApiOperation(value = "抢单接口", notes = "需要通过下单编号获取订单信息后进行绑定") - public Result rush(Order u, + public Result rush(OrderXd u, @RequestParam(required = false) String[] roleIds) { @@ -137,10 +137,10 @@ public class OrderController { */ @RequestMapping(value = "/unbind/order/{orderId}", method = RequestMethod.POST) @ApiOperation(value = "解绑订单接口", notes = "需要通过下单编号获取订单信息后进行解绑") - public Result revoke(Order u, + public Result revoke(OrderXd u, @ApiParam("订单唯一id标识") @PathVariable String orderId) { - Order o = orderService.findById(orderId); + OrderXd o = orderService.findById(orderId); o.setOrderByWorker(""); o.setOrderByWorkertime(null); @@ -156,11 +156,11 @@ public class OrderController { */ @RequestMapping(value = "/ow/getAllByCondition", method = RequestMethod.GET) @ApiOperation(value = "多条件分页获取订单列表") - public Result> getAllByCondition(Order order, + public Result> getAllByCondition(OrderXd order, SearchVo searchVo, PageVo pageVo) { - Page page = orderService.findAllByCondition(order, searchVo, PageUtil.initPage(pageVo)); - return new ResultUtil>().setData(page); + Page page = orderService.findAllByCondition(order, searchVo, PageUtil.initPage(pageVo)); + return new ResultUtil>().setData(page); } } From fce088600866db5714aa092649cccb26a9ef2d06 Mon Sep 17 00:00:00 2001 From: Houpn Date: Tue, 18 Jul 2023 10:11:40 +0800 Subject: [PATCH 06/10] =?UTF-8?q?=E6=8F=90=E4=BA=A4=E8=AE=A2=E5=8D=95?= =?UTF-8?q?=E7=BC=93=E5=AD=98=E6=A8=A1=E5=9D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hiver-admin/pom.xml | 18 ++ .../src/main/resources/application.yml | 49 +++-- hiver-admin/src/main/resources/logback.xml | 174 ++++++++++++++++++ hiver-core/pom.xml | 4 + .../config/cache/CustomCacheResolver.java | 62 +++++++ .../core/config/cache/RedisCacheConfig.java | 52 +++++- .../controller/manage/OrderController.java | 8 + .../cc/hiver/base/handler/OrderXdHandler.java | 41 +++++ pom.xml | 5 + 9 files changed, 391 insertions(+), 22 deletions(-) create mode 100644 hiver-admin/src/main/resources/logback.xml create mode 100644 hiver-core/src/main/java/cc/hiver/core/config/cache/CustomCacheResolver.java create mode 100644 hiver-modules/hiver-base/src/main/java/cc/hiver/base/handler/OrderXdHandler.java diff --git a/hiver-admin/pom.xml b/hiver-admin/pom.xml index fb8d5b75..5aea8b10 100644 --- a/hiver-admin/pom.xml +++ b/hiver-admin/pom.xml @@ -66,6 +66,24 @@ org.springframework.boot spring-boot-starter-actuator + + io.netty + netty-resolver-dns-native-macos + 4.1.77.Final + osx-aarch_64 + + + + org.bgee.log4jdbc-log4j2 + log4jdbc-log4j2-jdbc4.1 + 1.16 + + + top.javatool + canal-spring-boot-starter + 1.2.1-RELEASE + + diff --git a/hiver-admin/src/main/resources/application.yml b/hiver-admin/src/main/resources/application.yml index 89141df5..ab92fae3 100644 --- a/hiver-admin/src/main/resources/application.yml +++ b/hiver-admin/src/main/resources/application.yml @@ -23,12 +23,15 @@ spring: timeout-per-shutdown-phase: 10S # 数据源 datasource: - url: jdbc:mysql://154.8.162.157:3306/hiver_shop?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=GMT%2B8&allowPublicKeyRetrieval=true + url: jdbc:log4jdbc:mysql://154.8.162.157:3306/hiver_shop?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=GMT%2B8&allowPublicKeyRetrieval=true + #url: jdbc:mysql://154.8.162.157:3306/hiver_shop?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=GMT%2B8&allowPublicKeyRetrieval=true username: reddoor # Jasypt加密 可到common-utils中找到JasyptUtil加解密工具类生成加密结果 格式为ENC(加密结果) 以下解密结果为123456 password: ENC(Zla4U4+yRLPhicvuX2TmiEgxEpzP4dk8BHzFDEtiEhwLQIIaftZrrEUJZce6efoe) type: com.alibaba.druid.pool.DruidDataSource - driver-class-name: com.mysql.jdbc.Driver + driver-class-name: net.sf.log4jdbc.sql.jdbcapi.DriverSpy + #driver-class-name: com.mysql.jdbc.Driver + # Druid StatViewServlet配置 druid: stat-view-servlet: @@ -58,10 +61,11 @@ spring: multi-statement-allow: true jpa: # 显示sql - show-sql: true + #show-sql: true # 自动生成表结构 关闭设为none hibernate: ddl-auto: update + database-platform: org.hibernate.dialect.MySQL5InnoDBDialect #设置数据库方言 记住必须要使用 MySQL5InnoDBDialect 指定数据库类型对应InnoDB ;如果使用MySQLDialect 则对应的是MyISAM # Redis 若设有密码自行添加配置password redis: host: 154.8.162.157 @@ -70,6 +74,16 @@ spring: port: 6379 # 超时时间 Duration类型 3秒 timeout: 3S + jedis: + pool: + max-active: 8 + max-wait: -1 + max-idle: 8 + min-idle: 0 + #Canal服务用于数据同步 + canal: + server: 154.8.162.157:11111 + destination: example # Elasticsearch data: elasticsearch: @@ -97,7 +111,7 @@ spring: # 加锁调度 acquireTriggersWithinLock: true # “容忍”触发器经过下一次触发时间的毫秒数 - misfireThreshold: 10000 + misfireThreshold: 500000 servlet: multipart: max-file-size: -1 @@ -304,8 +318,10 @@ management: OUT_OF_SERVICE: 200 FATAL: 200 UNKNOWN: 200 + enabled: false endpoints: web: + enabled-by-default: false #关闭所有监控端点 base-path: /hiver/actuator/ exposure: include: '*' @@ -336,15 +352,16 @@ mybatis-plus: # 日志 logging: - # 输出级别 - level: - root: info - file: - # 指定路径 - path: hiver-logs - logback: - rollingpolicy: - # 最大保存天数 - max-history: 7 - # 每个文件最大大小 - max-file-size: 5MB \ No newline at end of file + config: classpath:logback.xml +# 输出级别 +# level: +# root: info +# file: +# # 指定路径 +# path: hiver-logs +# logback: +# rollingpolicy: +# # 最大保存天数 +# max-history: 7 +# # 每个文件最大大小 +# max-file-size: 5MB \ No newline at end of file diff --git a/hiver-admin/src/main/resources/logback.xml b/hiver-admin/src/main/resources/logback.xml new file mode 100644 index 00000000..c0480f43 --- /dev/null +++ b/hiver-admin/src/main/resources/logback.xml @@ -0,0 +1,174 @@ + + + + + + + + + + + logback + + + + + + + + + + + + + + + + + + + + + + + + + + + + + debug + + + ${CONSOLE_LOG_PATTERN} + + UTF-8 + + + + + + + + ${OPEN_FILE_PATH}/log_debug.log + + ${OPEN_FILE_PATH}/debug/${FILE_PREFIX}-debug_%d{yyyy-MM-dd}-%i.log + 30 + + ${MAX_FILE_SIZE} + + + true + + %d{yyyy-MM-dd HH:mm:ss.SSS} %contextName [%thread] %-5level %logger{36} - %msg%n + utf-8 + + + + + DEBUG + + ACCEPT + + DENY + + + + + + + ${OPEN_FILE_PATH}/log_info.log + + ${OPEN_FILE_PATH}/info/${FILE_PREFIX}_%d{yyyy-MM-dd}-%i.log + 30 + + ${MAX_FILE_SIZE} + + + true + + %d{yyyy-MM-dd HH:mm:ss.SSS} %contextName [%thread] %-5level %logger{36} - %msg%n + utf-8 + + + + INFO + + ACCEPT + + DENY + + + + + + + ${OPEN_FILE_PATH}/log_warn.log + + ${OPEN_FILE_PATH}/warn/${FILE_PREFIX}_%d{yyyy-MM-dd}-%i.log + 30 + + ${MAX_FILE_SIZE} + + + true + + %d{yyyy-MM-dd HH:mm:ss.SSS} %contextName [%thread] %-5level %logger{36} - %msg%n + utf-8 + + + + WARN + + ACCEPT + + DENY + + + + + + + ${OPEN_FILE_PATH}/log_error.log + + + %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n + UTF-8 + + + + ${log.path}/error/log-error-%d{yyyy-MM-dd}.%i.log + + 100MB + + + 15 + + + + ERROR + ACCEPT + DENY + + + + + + + + + + + + + + + + + + + + diff --git a/hiver-core/pom.xml b/hiver-core/pom.xml index f3039e4e..04253911 100644 --- a/hiver-core/pom.xml +++ b/hiver-core/pom.xml @@ -138,5 +138,9 @@ org.seleniumhq.selenium selenium-java + + com.github.ben-manes.caffeine + caffeine + \ No newline at end of file diff --git a/hiver-core/src/main/java/cc/hiver/core/config/cache/CustomCacheResolver.java b/hiver-core/src/main/java/cc/hiver/core/config/cache/CustomCacheResolver.java new file mode 100644 index 00000000..d090170f --- /dev/null +++ b/hiver-core/src/main/java/cc/hiver/core/config/cache/CustomCacheResolver.java @@ -0,0 +1,62 @@ +package cc.hiver.core.config.cache; + +import org.springframework.beans.factory.InitializingBean; +import org.springframework.cache.Cache; +import org.springframework.cache.CacheManager; +import org.springframework.cache.interceptor.CacheOperationInvocationContext; +import org.springframework.cache.interceptor.CacheResolver; +import org.springframework.lang.Nullable; +import org.springframework.util.Assert; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.List; + +public class CustomCacheResolver implements CacheResolver, InitializingBean { + + @Nullable + private List cacheManagerList; + + public CustomCacheResolver(){ + } + public CustomCacheResolver(List cacheManagerList){ + this.cacheManagerList = cacheManagerList; + } + + public void setCacheManagerList(@Nullable List cacheManagerList) { + this.cacheManagerList = cacheManagerList; + } + public List getCacheManagerList() { + return cacheManagerList; + } + + @Override + public void afterPropertiesSet() { + Assert.notNull(this.cacheManagerList, "CacheManager is required"); + } + + @Override + public Collection resolveCaches(CacheOperationInvocationContext context) { + Collection cacheNames = getCacheNames(context); + if (cacheNames == null) { + return Collections.emptyList(); + } + Collection result = new ArrayList<>(); + for(CacheManager cacheManager : getCacheManagerList()){ + for (String cacheName : cacheNames) { + Cache cache = cacheManager.getCache(cacheName); + if (cache == null) { + throw new IllegalArgumentException("Cannot find cache named '" + + cacheName + "' for " + context.getOperation()); + } + result.add(cache); + } + } + return result; + } + + private Collection getCacheNames(CacheOperationInvocationContext context){ + return context.getOperation().getCacheNames(); + } +} diff --git a/hiver-core/src/main/java/cc/hiver/core/config/cache/RedisCacheConfig.java b/hiver-core/src/main/java/cc/hiver/core/config/cache/RedisCacheConfig.java index d7a207e0..74199ca0 100644 --- a/hiver-core/src/main/java/cc/hiver/core/config/cache/RedisCacheConfig.java +++ b/hiver-core/src/main/java/cc/hiver/core/config/cache/RedisCacheConfig.java @@ -4,22 +4,27 @@ import com.fasterxml.jackson.annotation.JsonAutoDetect; import com.fasterxml.jackson.annotation.PropertyAccessor; import com.fasterxml.jackson.databind.ObjectMapper; import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.cache.Cache; import org.springframework.cache.CacheManager; import org.springframework.cache.annotation.CachingConfigurerSupport; +import org.springframework.cache.caffeine.CaffeineCacheManager; import org.springframework.cache.interceptor.CacheErrorHandler; +import org.springframework.cache.interceptor.CacheResolver; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.redis.cache.RedisCacheConfiguration; import org.springframework.data.redis.cache.RedisCacheManager; import org.springframework.data.redis.connection.RedisConnectionFactory; -import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer; -import org.springframework.data.redis.serializer.RedisSerializationContext; -import org.springframework.data.redis.serializer.RedisSerializer; -import org.springframework.data.redis.serializer.StringRedisSerializer; +import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.serializer.*; +import java.io.Serializable; import java.time.Duration; +import java.util.ArrayList; +import java.util.List; /** * Redis缓存 @@ -32,14 +37,48 @@ public class RedisCacheConfig extends CachingConfigurerSupport { @Value("${hiver.cache.timeToLive:-1}") private Duration timeToLive; + @Autowired + RedisConnectionFactory factory; + + + @Override + public CacheResolver cacheResolver() { + // 通过Guava实现的自定义堆内存缓存管理器 + CacheManager caffeineCacheManager = new CaffeineCacheManager(); + CacheManager redisCacheManager = cacheManager(); + List list = new ArrayList<>(); + // 优先读取堆内存缓存 + list.add(caffeineCacheManager); + // 堆内存缓存读取不到该key时再读取redis缓存 + list.add(redisCacheManager); + return new CustomCacheResolver(list); + } + + + @Bean + public RedisTemplate redisCacheTemplate(LettuceConnectionFactory redisConnectionFactory){ + //初始化一个redis模板 + RedisTemplate template = new RedisTemplate<>(); + // key采用String的序列化方式 + template.setKeySerializer(new StringRedisSerializer()); + // value序列化方式采用jackson + template.setValueSerializer(new GenericJackson2JsonRedisSerializer()); + // hash的key也采用String的序列化方式 + template.setHashKeySerializer(new StringRedisSerializer()); + // hash的value序列化方式采用jackson + template.setHashValueSerializer(new GenericJackson2JsonRedisSerializer()); + template.setConnectionFactory(redisConnectionFactory); + return template; + } + /** * 自定义序列化方式 * - * @param factory + * @param * @return */ @Bean - public CacheManager cacheManager(RedisConnectionFactory factory) { + public CacheManager cacheManager() { RedisSerializer redisSerializer = new StringRedisSerializer(); Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class); @@ -92,4 +131,5 @@ public class RedisCacheConfig extends CachingConfigurerSupport { }; return cacheErrorHandler; } + } diff --git a/hiver-modules/hiver-base/src/main/java/cc/hiver/base/controller/manage/OrderController.java b/hiver-modules/hiver-base/src/main/java/cc/hiver/base/controller/manage/OrderController.java index d02bbad9..6dd0711e 100644 --- a/hiver-modules/hiver-base/src/main/java/cc/hiver/base/controller/manage/OrderController.java +++ b/hiver-modules/hiver-base/src/main/java/cc/hiver/base/controller/manage/OrderController.java @@ -41,6 +41,7 @@ import java.util.stream.Collectors; * * @author Yazhi Li */ + @Slf4j @RestController @Api(tags = "订单接口") @@ -117,6 +118,13 @@ public class OrderController { * 1.当前抢单工的抢单状态需进行查验,非正常无法进行抢单 * 2.正常状态下,判定当前抢单工押金余额是否充足,不足时需要将当前扛包工状态自动修正为不可接单状态,同时当前订单无法抢购。 * 3.正常抢单情况下,需要在redis中设置抢单后的剩余押金金额,要存在抢单锁机制,实时更新余额 + * + * 计划暂定使用延时双删策略,尽量保证最终一致性,但不是强一致性: + * 先进行缓存清除,再执行update,最后(延迟N秒)再执行缓存清除。 + * (延迟N秒)的时间要大于一次写操作的时间,一般为3-5秒。 + * 原因:如果延迟时间小于写入redis的时间,会导致请求1清除了缓存,但是请求2缓存还未写入的尴尬。。。 + * ps:一般写入的时间会远小于5秒 + * */ @RequestMapping(value = "/rush/order/{orderId}", method = RequestMethod.POST) @ApiOperation(value = "抢单接口", notes = "需要通过下单编号获取订单信息后进行绑定") diff --git a/hiver-modules/hiver-base/src/main/java/cc/hiver/base/handler/OrderXdHandler.java b/hiver-modules/hiver-base/src/main/java/cc/hiver/base/handler/OrderXdHandler.java new file mode 100644 index 00000000..a149c3e6 --- /dev/null +++ b/hiver-modules/hiver-base/src/main/java/cc/hiver/base/handler/OrderXdHandler.java @@ -0,0 +1,41 @@ +package cc.hiver.base.handler; + +import cc.hiver.core.entity.OrderXd; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Component; +import top.javatool.canal.client.annotation.CanalTable; +import top.javatool.canal.client.handler.EntryHandler; + +/** + * @author benjamin_5 + * @Description + * @date 2022/9/25 + */ +@CanalTable("bs_ecif") +@Component +@AllArgsConstructor +@Slf4j +public class OrderXdHandler implements EntryHandler { + + private final RedisTemplate redisTemplate; + + @Override + public void insert(OrderXd orderXd) { + log.info("[新增]"+orderXd.toString()); + redisTemplate.opsForValue().set("ORDER:"+orderXd.getOrderId(),orderXd); + } + + @Override + public void update(OrderXd before, OrderXd after) { + log.info("[更新]"+after.toString()); + redisTemplate.opsForValue().set("ORDER:"+after.getOrderId(),after); + } + + @Override + public void delete(OrderXd orderXd) { + log.info("[删除]"+orderXd); + redisTemplate.delete("ORDER:"+orderXd.getOrderId()); + } +} diff --git a/pom.xml b/pom.xml index bd08f5f7..61f94741 100644 --- a/pom.xml +++ b/pom.xml @@ -282,6 +282,11 @@ selenium-java ${selenuim.version} + + org.springframework.boot + spring-boot-starter-cache + ${spring.boot.version} + From 7d8150044fa6d12f17c08c9cc47ef9129994702b Mon Sep 17 00:00:00 2001 From: Houpn Date: Tue, 25 Jul 2023 22:27:11 +0800 Subject: [PATCH 07/10] =?UTF-8?q?=E6=8F=90=E4=BA=A4=E8=AE=A2=E5=8D=95?= =?UTF-8?q?=E7=BC=93=E5=AD=98=E6=A8=A1=E5=9D=97--=E5=BB=B6=E6=97=B6?= =?UTF-8?q?=E5=8F=8C=E5=88=A0=E7=AD=96=E7=95=A5=EF=BC=8C=E5=B0=BD=E9=87=8F?= =?UTF-8?q?=E4=BF=9D=E8=AF=81=E6=95=B0=E6=8D=AE=E6=9C=80=E7=BB=88=E4=B8=80?= =?UTF-8?q?=E8=87=B4=E6=80=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/resources/application.yml | 4 - .../annotation/ClearAndReloadCache.java | 13 ++++ .../common/aop/ClearAndReloadCacheAspect.java | 77 +++++++++++++++++++ .../core/config/cache/RedisCacheConfig.java | 10 +-- .../controller/manage/OrderController.java | 11 ++- .../cc/hiver/base/handler/OrderXdHandler.java | 12 +-- 6 files changed, 110 insertions(+), 17 deletions(-) create mode 100644 hiver-core/src/main/java/cc/hiver/core/common/annotation/ClearAndReloadCache.java create mode 100644 hiver-core/src/main/java/cc/hiver/core/common/aop/ClearAndReloadCacheAspect.java diff --git a/hiver-admin/src/main/resources/application.yml b/hiver-admin/src/main/resources/application.yml index ab92fae3..c0714115 100644 --- a/hiver-admin/src/main/resources/application.yml +++ b/hiver-admin/src/main/resources/application.yml @@ -80,10 +80,6 @@ spring: max-wait: -1 max-idle: 8 min-idle: 0 - #Canal服务用于数据同步 - canal: - server: 154.8.162.157:11111 - destination: example # Elasticsearch data: elasticsearch: diff --git a/hiver-core/src/main/java/cc/hiver/core/common/annotation/ClearAndReloadCache.java b/hiver-core/src/main/java/cc/hiver/core/common/annotation/ClearAndReloadCache.java new file mode 100644 index 00000000..dcb9c714 --- /dev/null +++ b/hiver-core/src/main/java/cc/hiver/core/common/annotation/ClearAndReloadCache.java @@ -0,0 +1,13 @@ +package cc.hiver.core.common.annotation; + +import java.lang.annotation.*; + +/** + *延时双删 + **/ +@Retention(RetentionPolicy.RUNTIME) +@Documented +@Target(ElementType.METHOD) +public @interface ClearAndReloadCache { + String name() default ""; +} diff --git a/hiver-core/src/main/java/cc/hiver/core/common/aop/ClearAndReloadCacheAspect.java b/hiver-core/src/main/java/cc/hiver/core/common/aop/ClearAndReloadCacheAspect.java new file mode 100644 index 00000000..d5c61df8 --- /dev/null +++ b/hiver-core/src/main/java/cc/hiver/core/common/aop/ClearAndReloadCacheAspect.java @@ -0,0 +1,77 @@ +package cc.hiver.core.common.aop; + +import cc.hiver.core.common.annotation.ClearAndReloadCache; +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.MethodSignature; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.StringRedisTemplate; +import org.springframework.stereotype.Component; + +import java.lang.reflect.Method; +import java.util.Set; + +@Aspect +@Component +public class ClearAndReloadCacheAspect { + +@Autowired +private StringRedisTemplate stringRedisTemplate; + +/** +* 切入点 +*切入点,基于注解实现的切入点 加上该注解的都是Aop切面的切入点 +* +*/ + +@Pointcut("@annotation(cc.hiver.core.common.annotation.ClearAndReloadCache)") +public void pointCut(){ + +} +/** +* 环绕通知 +* 环绕通知非常强大,可以决定目标方法是否执行,什么时候执行,执行时是否需要替换方法参数,执行完毕是否需要替换返回值。 +* 环绕通知第一个参数必须是org.aspectj.lang.ProceedingJoinPoint类型 +* @param proceedingJoinPoint +*/ +@Around("pointCut()") +public Object aroundAdvice(ProceedingJoinPoint proceedingJoinPoint){ + System.out.println("----------- 环绕通知 -----------"); + System.out.println("环绕通知的目标方法名:" + proceedingJoinPoint.getSignature().getName()); + + Signature signature1 = proceedingJoinPoint.getSignature(); + MethodSignature methodSignature = (MethodSignature)signature1; + Method targetMethod = methodSignature.getMethod();//方法对象 + ClearAndReloadCache annotation = targetMethod.getAnnotation(ClearAndReloadCache.class);//反射得到自定义注解的方法对象 + + String name = annotation.name();//获取自定义注解的方法对象的参数即name + Set keys = stringRedisTemplate.keys("*" + name + "*");//模糊定义key + stringRedisTemplate.delete(keys);//模糊删除redis的key值 + + //执行加入双删注解的改动数据库的业务 即controller中的方法业务 + Object proceed = null; + try { + proceed = proceedingJoinPoint.proceed(); + } catch (Throwable throwable) { + throwable.printStackTrace(); + } + + //开一个线程 延迟1秒(此处是1秒举例,可以改成自己的业务) + // 在线程中延迟删除 同时将业务代码的结果返回 这样不影响业务代码的执行 + new Thread(() -> { + try { + Thread.sleep(1000); + Set keys1 = stringRedisTemplate.keys("*" + name + "*");//模糊删除 + stringRedisTemplate.delete(keys1); + System.out.println("-----------1秒钟后,在线程中延迟删除完毕 -----------"); + } catch (InterruptedException e) { + e.printStackTrace(); + } + }).start(); + + return proceed;//返回业务代码的值 + } +} diff --git a/hiver-core/src/main/java/cc/hiver/core/config/cache/RedisCacheConfig.java b/hiver-core/src/main/java/cc/hiver/core/config/cache/RedisCacheConfig.java index 74199ca0..7044753d 100644 --- a/hiver-core/src/main/java/cc/hiver/core/config/cache/RedisCacheConfig.java +++ b/hiver-core/src/main/java/cc/hiver/core/config/cache/RedisCacheConfig.java @@ -41,7 +41,7 @@ public class RedisCacheConfig extends CachingConfigurerSupport { RedisConnectionFactory factory; - @Override + /*@Override public CacheResolver cacheResolver() { // 通过Guava实现的自定义堆内存缓存管理器 CacheManager caffeineCacheManager = new CaffeineCacheManager(); @@ -52,11 +52,11 @@ public class RedisCacheConfig extends CachingConfigurerSupport { // 堆内存缓存读取不到该key时再读取redis缓存 list.add(redisCacheManager); return new CustomCacheResolver(list); - } + }*/ - @Bean - public RedisTemplate redisCacheTemplate(LettuceConnectionFactory redisConnectionFactory){ + //@Bean + /*public RedisTemplate redisCacheTemplate(LettuceConnectionFactory redisConnectionFactory){ //初始化一个redis模板 RedisTemplate template = new RedisTemplate<>(); // key采用String的序列化方式 @@ -69,7 +69,7 @@ public class RedisCacheConfig extends CachingConfigurerSupport { template.setHashValueSerializer(new GenericJackson2JsonRedisSerializer()); template.setConnectionFactory(redisConnectionFactory); return template; - } + }*/ /** * 自定义序列化方式 diff --git a/hiver-modules/hiver-base/src/main/java/cc/hiver/base/controller/manage/OrderController.java b/hiver-modules/hiver-base/src/main/java/cc/hiver/base/controller/manage/OrderController.java index 6dd0711e..fb1fccd2 100644 --- a/hiver-modules/hiver-base/src/main/java/cc/hiver/base/controller/manage/OrderController.java +++ b/hiver-modules/hiver-base/src/main/java/cc/hiver/base/controller/manage/OrderController.java @@ -1,6 +1,7 @@ package cc.hiver.base.controller.manage; import cc.hiver.base.async.AddMessage; +import cc.hiver.core.common.annotation.ClearAndReloadCache; import cc.hiver.core.common.constant.CommonConstant; import cc.hiver.core.common.constant.UserConstant; import cc.hiver.core.common.redis.RedisTemplateHelper; @@ -18,9 +19,11 @@ import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; import lombok.extern.slf4j.Slf4j; +import org.hibernate.annotations.Cache; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cache.annotation.CacheConfig; import org.springframework.cache.annotation.CacheEvict; +import org.springframework.cache.annotation.Cacheable; import org.springframework.data.domain.Page; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.transaction.annotation.Transactional; @@ -49,7 +52,7 @@ import java.util.stream.Collectors; @CacheConfig(cacheNames = "orderxd") @Transactional public class OrderController { - public static final String ORDER = "orderxd::"; + public static final String ORDER = "ORDER::"; @Autowired private OrderService orderService; @@ -72,6 +75,7 @@ public class OrderController { */ @RequestMapping(value = "/getByCondition", method = RequestMethod.GET) @ApiOperation(value = "多条件分页获取订单列表") + @Cacheable(cacheNames = "get method") public Result> getByCondition(OrderXd order, SearchVo searchVo, PageVo pageVo) { @@ -95,7 +99,7 @@ public class OrderController { public Result add(@Valid OrderXd u, @RequestParam(required = false) String[] roleIds) { - OrderXd order = orderService.save(u); + orderService.save(u); // 发送创建账号消息 //addMessage.addSendMessage(user.getId()); @@ -128,6 +132,7 @@ public class OrderController { */ @RequestMapping(value = "/rush/order/{orderId}", method = RequestMethod.POST) @ApiOperation(value = "抢单接口", notes = "需要通过下单编号获取订单信息后进行绑定") + @ClearAndReloadCache(name = ORDER) public Result rush(OrderXd u, @RequestParam(required = false) String[] roleIds) { @@ -145,6 +150,7 @@ public class OrderController { */ @RequestMapping(value = "/unbind/order/{orderId}", method = RequestMethod.POST) @ApiOperation(value = "解绑订单接口", notes = "需要通过下单编号获取订单信息后进行解绑") + @ClearAndReloadCache(name = ORDER) public Result revoke(OrderXd u, @ApiParam("订单唯一id标识") @PathVariable String orderId) { @@ -152,6 +158,7 @@ public class OrderController { o.setOrderByWorker(""); o.setOrderByWorkertime(null); + o.setWorker(null); orderService.update(o); diff --git a/hiver-modules/hiver-base/src/main/java/cc/hiver/base/handler/OrderXdHandler.java b/hiver-modules/hiver-base/src/main/java/cc/hiver/base/handler/OrderXdHandler.java index a149c3e6..09f43e2d 100644 --- a/hiver-modules/hiver-base/src/main/java/cc/hiver/base/handler/OrderXdHandler.java +++ b/hiver-modules/hiver-base/src/main/java/cc/hiver/base/handler/OrderXdHandler.java @@ -13,13 +13,13 @@ import top.javatool.canal.client.handler.EntryHandler; * @Description * @date 2022/9/25 */ -@CanalTable("bs_ecif") -@Component -@AllArgsConstructor -@Slf4j +//@CanalTable("t_order") +//@Component +//@AllArgsConstructor +//@Slf4j public class OrderXdHandler implements EntryHandler { - private final RedisTemplate redisTemplate; + /*//private final RedisTemplate redisTemplate; @Override public void insert(OrderXd orderXd) { @@ -37,5 +37,5 @@ public class OrderXdHandler implements EntryHandler { public void delete(OrderXd orderXd) { log.info("[删除]"+orderXd); redisTemplate.delete("ORDER:"+orderXd.getOrderId()); - } + }*/ } From 6e74f5ccc9d9b35d6e86e5356c285707c7db2799 Mon Sep 17 00:00:00 2001 From: Houpn Date: Thu, 27 Jul 2023 09:12:45 +0800 Subject: [PATCH 08/10] =?UTF-8?q?=E6=8F=90=E4=BA=A4=E7=89=A9=E6=B5=81?= =?UTF-8?q?=E5=85=AC=E5=8F=B8=E7=AE=A1=E7=90=86=E6=A8=A1=E5=9D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/cc/hiver/core/entity/Worker.java | 7 ++ .../admin/LogiticsCompanyController.java | 90 +++++++++++++++++++ .../cc/hiver/app/dao/LogiticsCompanyDao.java | 33 +++++++ .../cc/hiver/app/entity/LogiticsCompany.java | 67 ++++++++++++++ .../app/service/LogiticsCompanyService.java | 44 +++++++++ .../LogiticsCompanyServiceImpl.java | 89 ++++++++++++++++++ .../cc/hiver/base/handler/OrderXdHandler.java | 10 +-- 7 files changed, 335 insertions(+), 5 deletions(-) create mode 100644 hiver-modules/hiver-app/src/main/java/cc/hiver/app/controller/admin/LogiticsCompanyController.java create mode 100644 hiver-modules/hiver-app/src/main/java/cc/hiver/app/dao/LogiticsCompanyDao.java create mode 100644 hiver-modules/hiver-app/src/main/java/cc/hiver/app/entity/LogiticsCompany.java create mode 100644 hiver-modules/hiver-app/src/main/java/cc/hiver/app/service/LogiticsCompanyService.java create mode 100644 hiver-modules/hiver-app/src/main/java/cc/hiver/app/serviceimpl/LogiticsCompanyServiceImpl.java diff --git a/hiver-core/src/main/java/cc/hiver/core/entity/Worker.java b/hiver-core/src/main/java/cc/hiver/core/entity/Worker.java index f4d7c584..99fdc0ec 100644 --- a/hiver-core/src/main/java/cc/hiver/core/entity/Worker.java +++ b/hiver-core/src/main/java/cc/hiver/core/entity/Worker.java @@ -120,4 +120,11 @@ public class Worker implements Serializable { /*@OneToMany(targetEntity = Order.class,mappedBy = "orderByWorker",cascade = CascadeType.ALL,fetch = FetchType.EAGER) private List order;*/ + /** + * 区域 + */ + @Column(name = "region") + @ApiModelProperty("办公区域") + private String region; + } diff --git a/hiver-modules/hiver-app/src/main/java/cc/hiver/app/controller/admin/LogiticsCompanyController.java b/hiver-modules/hiver-app/src/main/java/cc/hiver/app/controller/admin/LogiticsCompanyController.java new file mode 100644 index 00000000..a3232d9f --- /dev/null +++ b/hiver-modules/hiver-app/src/main/java/cc/hiver/app/controller/admin/LogiticsCompanyController.java @@ -0,0 +1,90 @@ +/* +Copyright [2022] [https://hiver.cc] + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + */ +package cc.hiver.app.controller.admin; + +import cc.hiver.app.entity.Company; +import cc.hiver.app.entity.LogiticsCompany; +import cc.hiver.app.service.CompanyService; +import cc.hiver.app.service.LogiticsCompanyService; +import cc.hiver.core.common.utils.PageUtil; +import cc.hiver.core.common.utils.ResultUtil; +import cc.hiver.core.common.vo.PageVo; +import cc.hiver.core.common.vo.Result; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Page; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * @author houpn + */ +@Slf4j +@RestController +@Api(tags = "物流管理公司接口") +@RequestMapping(value = "/hiver/app/logitics") +public class LogiticsCompanyController { + @Autowired + private LogiticsCompanyService companyService; + + @RequestMapping(value = "/getAll", method = RequestMethod.GET) + @ApiOperation(value = "获取全部数据") + public Result> getAll() { + List list = companyService.getAll(); + return new ResultUtil>().setData(list); + } + + @RequestMapping(value = "/add", method = RequestMethod.POST) + @ResponseBody + @ApiOperation(value = "添加") + public Result add(LogiticsCompany company) { + if (companyService.findByCompanyName(company.getCompanyName()) != null) { + return ResultUtil.error("公司名称已经存在"); + } + companyService.save(company); + return ResultUtil.success("添加成功"); + } + + @RequestMapping(value = "/edit", method = RequestMethod.PUT) + @ResponseBody + @ApiOperation(value = "编辑") + public Result edit(LogiticsCompany company) { + companyService.update(company); + return ResultUtil.success("编辑成功"); + } + + @RequestMapping(value = "/delByIds", method = RequestMethod.POST) + @ResponseBody + @ApiOperation(value = "通过id删除") + public Result delAllByIds(@RequestParam String[] ids) { + for (String id : ids) { + LogiticsCompany company = companyService.get(id); + companyService.delete(id); + } + return ResultUtil.success("删除成功"); + } + + @RequestMapping(value = "/getByCondition", method = RequestMethod.GET) + @ApiOperation(value = "多条件分页获取公司列表") + public Result> getByCondition(LogiticsCompany company, + PageVo pageVo) { + Page page = companyService.findByCondition(company, PageUtil.initPage(pageVo)); + return new ResultUtil>().setData(page); + } +} diff --git a/hiver-modules/hiver-app/src/main/java/cc/hiver/app/dao/LogiticsCompanyDao.java b/hiver-modules/hiver-app/src/main/java/cc/hiver/app/dao/LogiticsCompanyDao.java new file mode 100644 index 00000000..6b5a80e5 --- /dev/null +++ b/hiver-modules/hiver-app/src/main/java/cc/hiver/app/dao/LogiticsCompanyDao.java @@ -0,0 +1,33 @@ +/* +Copyright [2022] [https://hiver.cc] + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + */ +package cc.hiver.app.dao; + +import cc.hiver.app.entity.Company; +import cc.hiver.app.entity.LogiticsCompany; +import cc.hiver.core.base.HiverBaseDao; + +/** + * @author houpn + */ +public interface LogiticsCompanyDao extends HiverBaseDao { + /** + * 通过公司名称获得记录 + * + * @param companyName + * @return + */ + LogiticsCompany findByCompanyName(String companyName); +} diff --git a/hiver-modules/hiver-app/src/main/java/cc/hiver/app/entity/LogiticsCompany.java b/hiver-modules/hiver-app/src/main/java/cc/hiver/app/entity/LogiticsCompany.java new file mode 100644 index 00000000..6e43e888 --- /dev/null +++ b/hiver-modules/hiver-app/src/main/java/cc/hiver/app/entity/LogiticsCompany.java @@ -0,0 +1,67 @@ +/* +Copyright [2022] [https://hiver.cc] + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + */ +package cc.hiver.app.entity; + +import cc.hiver.core.base.HiverBaseEntity; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.hibernate.annotations.DynamicInsert; +import org.hibernate.annotations.DynamicUpdate; + +import javax.persistence.Entity; +import javax.persistence.Table; + +/** + * 公司实体类 + * + * @author Yazhi Li + */ +@Data +@Entity +@DynamicInsert +@DynamicUpdate +@Table(name = "t_lcompany") +@TableName("t_lcompany") +@ApiModel(value = "公司信息") +public class LogiticsCompany extends HiverBaseEntity { + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "公司名称") + private String companyName; + + @ApiModelProperty(value = "公司电话") + private String companyTel; + + @ApiModelProperty(value = "公司邮箱") + private String companyEmail; + + @ApiModelProperty(value = "所在地区") + private String companyAddress; + + @ApiModelProperty(value = "详细地址") + private String companyStreet; + + @ApiModelProperty(value = "联系人") + private String contacts; + + @ApiModelProperty(value = "联系人手机号") + private String mobile; + + @ApiModelProperty(value = "办公区域") + private String region; +} diff --git a/hiver-modules/hiver-app/src/main/java/cc/hiver/app/service/LogiticsCompanyService.java b/hiver-modules/hiver-app/src/main/java/cc/hiver/app/service/LogiticsCompanyService.java new file mode 100644 index 00000000..78826e7e --- /dev/null +++ b/hiver-modules/hiver-app/src/main/java/cc/hiver/app/service/LogiticsCompanyService.java @@ -0,0 +1,44 @@ +/* +Copyright [2022] [https://hiver.cc] + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + */ +package cc.hiver.app.service; + +import cc.hiver.app.entity.Company; +import cc.hiver.app.entity.LogiticsCompany; +import cc.hiver.core.base.HiverBaseService; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; + +/** + * @author Yazhi Li + */ +public interface LogiticsCompanyService extends HiverBaseService { + /** + * 多条件获取 + * + * @param company + * @param pageable + * @return + */ + Page findByCondition(LogiticsCompany company, Pageable pageable); + + /** + * 通过公司名称获得记录 + * + * @param companyName + * @return + */ + LogiticsCompany findByCompanyName(String companyName); +} diff --git a/hiver-modules/hiver-app/src/main/java/cc/hiver/app/serviceimpl/LogiticsCompanyServiceImpl.java b/hiver-modules/hiver-app/src/main/java/cc/hiver/app/serviceimpl/LogiticsCompanyServiceImpl.java new file mode 100644 index 00000000..da942bbf --- /dev/null +++ b/hiver-modules/hiver-app/src/main/java/cc/hiver/app/serviceimpl/LogiticsCompanyServiceImpl.java @@ -0,0 +1,89 @@ +/* +Copyright [2022] [https://hiver.cc] + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + */ +package cc.hiver.app.serviceimpl; + +import cc.hiver.app.dao.CompanyDao; +import cc.hiver.app.dao.LogiticsCompanyDao; +import cc.hiver.app.entity.Company; +import cc.hiver.app.entity.LogiticsCompany; +import cc.hiver.app.service.CompanyService; +import cc.hiver.app.service.LogiticsCompanyService; +import cc.hiver.core.base.HiverBaseDao; +import cn.hutool.core.util.StrUtil; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.data.jpa.domain.Specification; +import org.springframework.lang.Nullable; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.persistence.criteria.*; +import java.util.ArrayList; +import java.util.List; + +/** + * @author houpn + */ +@Slf4j +@Service +@Transactional +public class LogiticsCompanyServiceImpl implements LogiticsCompanyService { + @Autowired + private LogiticsCompanyDao companyDao; + + @Override + public HiverBaseDao getRepository() { + return companyDao; + } + + @Override + public Page findByCondition(LogiticsCompany company, Pageable pageable) { + return companyDao.findAll(new Specification() { + @Nullable + @Override + public Predicate toPredicate(Root root, CriteriaQuery cq, CriteriaBuilder cb) { + Path companyNameField = root.get("companyName"); + Path contactsField = root.get("contacts"); + Path mobileField = root.get("mobile"); + + List list = new ArrayList<>(); + + if (StrUtil.isNotBlank(company.getCompanyName())) { + list.add(cb.like(companyNameField, '%' + company.getCompanyName() + '%')); + } + + if (StrUtil.isNotBlank(company.getContacts())) { + list.add(cb.like(contactsField, '%' + company.getContacts() + '%')); + } + + if (StrUtil.isNotBlank(company.getMobile())) { + list.add(cb.like(mobileField, '%' + company.getMobile() + '%')); + } + + Predicate[] arr = new Predicate[list.size()]; + cq.where(list.toArray(arr)); + return null; + } + }, pageable); + } + + @Override + public LogiticsCompany findByCompanyName(String companyName) { + return companyDao.findByCompanyName(companyName); + } +} diff --git a/hiver-modules/hiver-base/src/main/java/cc/hiver/base/handler/OrderXdHandler.java b/hiver-modules/hiver-base/src/main/java/cc/hiver/base/handler/OrderXdHandler.java index 09f43e2d..5150232c 100644 --- a/hiver-modules/hiver-base/src/main/java/cc/hiver/base/handler/OrderXdHandler.java +++ b/hiver-modules/hiver-base/src/main/java/cc/hiver/base/handler/OrderXdHandler.java @@ -5,8 +5,6 @@ import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Component; -import top.javatool.canal.client.annotation.CanalTable; -import top.javatool.canal.client.handler.EntryHandler; /** * @author benjamin_5 @@ -17,9 +15,11 @@ import top.javatool.canal.client.handler.EntryHandler; //@Component //@AllArgsConstructor //@Slf4j +/* public class OrderXdHandler implements EntryHandler { - /*//private final RedisTemplate redisTemplate; + + //private final RedisTemplate redisTemplate; @Override public void insert(OrderXd orderXd) { @@ -37,5 +37,5 @@ public class OrderXdHandler implements EntryHandler { public void delete(OrderXd orderXd) { log.info("[删除]"+orderXd); redisTemplate.delete("ORDER:"+orderXd.getOrderId()); - }*/ -} + } +}*/ \ No newline at end of file From d9cfc3979f95607deb5800f06bc4a9b4128783e0 Mon Sep 17 00:00:00 2001 From: Houpn Date: Wed, 2 Aug 2023 15:27:41 +0800 Subject: [PATCH 09/10] =?UTF-8?q?=E6=8F=90=E4=BA=A4=E6=9C=AC=E5=9C=B0?= =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=86=85=E5=AE=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 + .../src/main/resources/application.yml | 3 +- hiver-admin/src/main/resources/logback.xml | 4 +- .../cc/hiver/core/common/utils/AsyncUtil.java | 2 +- .../hiver/core/common/utils/JasyptUtil.java | 4 +- .../java/cc/hiver/core/entity/OrderXd.java | 6 +++ .../cc/hiver/core/service/OrderService.java | 4 ++ .../core/serviceimpl/OrderServiceImpl.java | 49 ++++++++++++++++++- .../controller/manage/OrderController.java | 44 ++++++++++------- 9 files changed, 92 insertions(+), 25 deletions(-) diff --git a/.gitignore b/.gitignore index d05cdd4d..f1b8fab9 100644 --- a/.gitignore +++ b/.gitignore @@ -17,3 +17,4 @@ target build .idea .gradle +/hiver-admin/src/main/java/cc/hiver/Test.java diff --git a/hiver-admin/src/main/resources/application.yml b/hiver-admin/src/main/resources/application.yml index c0714115..1d726d8f 100644 --- a/hiver-admin/src/main/resources/application.yml +++ b/hiver-admin/src/main/resources/application.yml @@ -293,6 +293,7 @@ ignored: - /hiver/iot/sensorHelper/** - /hiver/goview/visual/** - /hiver/license/verifyLicense + - /hiver/order/** # 限流及黑名单不拦截的路径 limitUrls: - /**/*.js @@ -317,10 +318,10 @@ management: enabled: false endpoints: web: - enabled-by-default: false #关闭所有监控端点 base-path: /hiver/actuator/ exposure: include: '*' + enabled-by-default: false # 接口文档增强UI Swagger界面内容配置 knife4j: diff --git a/hiver-admin/src/main/resources/logback.xml b/hiver-admin/src/main/resources/logback.xml index c0480f43..1c31c645 100644 --- a/hiver-admin/src/main/resources/logback.xml +++ b/hiver-admin/src/main/resources/logback.xml @@ -166,7 +166,9 @@ - + diff --git a/hiver-core/src/main/java/cc/hiver/core/common/utils/AsyncUtil.java b/hiver-core/src/main/java/cc/hiver/core/common/utils/AsyncUtil.java index cc96530e..3b89dc2f 100644 --- a/hiver-core/src/main/java/cc/hiver/core/common/utils/AsyncUtil.java +++ b/hiver-core/src/main/java/cc/hiver/core/common/utils/AsyncUtil.java @@ -38,7 +38,7 @@ public class AsyncUtil { return false; } - @Scheduled(cron = "0 0 0 * * ?") + //@Scheduled(cron = "0 0 0 * * ?") public void refresh() { get = false; } diff --git a/hiver-core/src/main/java/cc/hiver/core/common/utils/JasyptUtil.java b/hiver-core/src/main/java/cc/hiver/core/common/utils/JasyptUtil.java index 27156aa1..5573f197 100644 --- a/hiver-core/src/main/java/cc/hiver/core/common/utils/JasyptUtil.java +++ b/hiver-core/src/main/java/cc/hiver/core/common/utils/JasyptUtil.java @@ -55,8 +55,8 @@ public class JasyptUtil { public static void main(String[] args) { // 加密 若修改了第一个参数加密password记得在配置文件同步修改 - System.out.println(encyptPwd("hiver", "1qazxsw2#")); + System.out.println(encyptPwd("hiver", "reddoor168")); // 解密 - System.out.println(decyptPwd("hiver", "9/BNjuqq4ycEMDxTcUmXan6Ss0/WkO6vPOKO5RF7oDn6TblyVB7PprWM6UnBd1Vr")); + System.out.println("-------"+decyptPwd("hiver", "1z9xKRjZhrCWwsQam8n7i125wZyX9ryuajRx6R7YPnznn6jEgv3COmbKIAGJkOld")); } } diff --git a/hiver-core/src/main/java/cc/hiver/core/entity/OrderXd.java b/hiver-core/src/main/java/cc/hiver/core/entity/OrderXd.java index 7c4dad8f..1e4285c2 100644 --- a/hiver-core/src/main/java/cc/hiver/core/entity/OrderXd.java +++ b/hiver-core/src/main/java/cc/hiver/core/entity/OrderXd.java @@ -152,6 +152,12 @@ public class OrderXd implements Serializable { @TableField(fill = FieldFill.UPDATE) private Date updateTime; + /** + * 订单区域 + */ + @ApiModelProperty("订单所属区域") + @Column(name = "region") + private String region; /** * 关联订单工 diff --git a/hiver-core/src/main/java/cc/hiver/core/service/OrderService.java b/hiver-core/src/main/java/cc/hiver/core/service/OrderService.java index 5c5b37fd..a72d3941 100644 --- a/hiver-core/src/main/java/cc/hiver/core/service/OrderService.java +++ b/hiver-core/src/main/java/cc/hiver/core/service/OrderService.java @@ -7,6 +7,8 @@ import org.springframework.cache.annotation.CacheConfig; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; +import java.util.List; + /** * 用户接口 * @@ -27,6 +29,8 @@ public interface OrderService extends HiverBaseService { OrderXd findByOrderId(String orderId); + List findByCondition(OrderXd order); + Page findAllByCondition(OrderXd order, SearchVo searchVo, Pageable pageable); diff --git a/hiver-core/src/main/java/cc/hiver/core/serviceimpl/OrderServiceImpl.java b/hiver-core/src/main/java/cc/hiver/core/serviceimpl/OrderServiceImpl.java index b109b8cc..c0fa54b4 100644 --- a/hiver-core/src/main/java/cc/hiver/core/serviceimpl/OrderServiceImpl.java +++ b/hiver-core/src/main/java/cc/hiver/core/serviceimpl/OrderServiceImpl.java @@ -21,7 +21,6 @@ import javax.persistence.criteria.*; import java.util.ArrayList; import java.util.Date; import java.util.List; -import java.util.stream.Collectors; /** * 用户接口实现 @@ -162,4 +161,52 @@ public class OrderServiceImpl implements OrderService { } + @Override + public List findByCondition(OrderXd order) { + return orderDao.findAll(new Specification() { + @Nullable + @Override + public Predicate toPredicate(Root root, CriteriaQuery cq, CriteriaBuilder cb) { + Path orderIdField = root.get("orderId"); + Path norderLogisticsField = root.get("orderLogistics"); + Path kdOrderIdField = root.get("kdOrderId"); + Path timeoutField = root.get("timeout"); + Path orderStatusdField = root.get("orderStatus"); + Path orderByWorkerField = root.get("orderByWorker"); + Path createTimeField = root.get("createTime"); + Path regionField = root.get("region"); + + List list = new ArrayList<>(); + + //区域条件 + if (StrUtil.isNotBlank(order.getRegion())) { + list.add(cb.equal(regionField,order.getRegion())); + } + //物流方式限制 + if (StrUtil.isNotBlank(order.getOrderLogistics())) { + list.add(cb.equal(norderLogisticsField,order.getOrderLogistics())); + } + + //订单工编号应该为空 + list.add(cb.or(cb.isNull(orderByWorkerField),cb.equal(orderByWorkerField,order.getOrderByWorker()))); + + + if (StrUtil.isNotBlank(order.getTimeout())) { + list.add(cb.equal(timeoutField, order.getTimeout())); + } + + // 状态 + if (order.getOrderStatus() != null) { + list.add(cb.equal(orderStatusdField, order.getOrderStatus())); + } + + // 数据权限 + Predicate[] arr = new Predicate[list.size()]; + cq.where(list.toArray(arr)); + return null; + } + }); + } + + } diff --git a/hiver-modules/hiver-base/src/main/java/cc/hiver/base/controller/manage/OrderController.java b/hiver-modules/hiver-base/src/main/java/cc/hiver/base/controller/manage/OrderController.java index fb1fccd2..4da79655 100644 --- a/hiver-modules/hiver-base/src/main/java/cc/hiver/base/controller/manage/OrderController.java +++ b/hiver-modules/hiver-base/src/main/java/cc/hiver/base/controller/manage/OrderController.java @@ -1,9 +1,6 @@ package cc.hiver.base.controller.manage; -import cc.hiver.base.async.AddMessage; import cc.hiver.core.common.annotation.ClearAndReloadCache; -import cc.hiver.core.common.constant.CommonConstant; -import cc.hiver.core.common.constant.UserConstant; import cc.hiver.core.common.redis.RedisTemplateHelper; import cc.hiver.core.common.utils.*; import cc.hiver.core.common.vo.PageVo; @@ -12,32 +9,21 @@ import cc.hiver.core.common.vo.SearchVo; import cc.hiver.core.dao.mapper.DeleteMapper; import cc.hiver.core.entity.*; import cc.hiver.core.service.*; -import cc.hiver.core.service.mybatis.IUserRoleService; -import cc.hiver.core.vo.RoleDTO; -import cn.hutool.core.util.StrUtil; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; import lombok.extern.slf4j.Slf4j; -import org.hibernate.annotations.Cache; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cache.annotation.CacheConfig; -import org.springframework.cache.annotation.CacheEvict; import org.springframework.cache.annotation.Cacheable; import org.springframework.data.domain.Page; -import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.*; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; import javax.validation.Valid; -import java.io.UnsupportedEncodingException; -import java.net.URLDecoder; -import java.util.ArrayList; -import java.util.Arrays; import java.util.List; -import java.util.stream.Collectors; /** * 用户管理接口 @@ -57,6 +43,9 @@ public class OrderController { @Autowired private OrderService orderService; + @Autowired + private WorkerService workerService; + @Autowired private DeleteMapper deleteMapper; @@ -75,7 +64,7 @@ public class OrderController { */ @RequestMapping(value = "/getByCondition", method = RequestMethod.GET) @ApiOperation(value = "多条件分页获取订单列表") - @Cacheable(cacheNames = "get method") + //@Cacheable(cacheNames = ORDER) public Result> getByCondition(OrderXd order, SearchVo searchVo, PageVo pageVo) { @@ -123,19 +112,18 @@ public class OrderController { * 2.正常状态下,判定当前抢单工押金余额是否充足,不足时需要将当前扛包工状态自动修正为不可接单状态,同时当前订单无法抢购。 * 3.正常抢单情况下,需要在redis中设置抢单后的剩余押金金额,要存在抢单锁机制,实时更新余额 * - * 计划暂定使用延时双删策略,尽量保证最终一致性,但不是强一致性: + * 一:计划暂定使用延时双删策略,尽量保证最终一致性,但不是强一致性: * 先进行缓存清除,再执行update,最后(延迟N秒)再执行缓存清除。 * (延迟N秒)的时间要大于一次写操作的时间,一般为3-5秒。 * 原因:如果延迟时间小于写入redis的时间,会导致请求1清除了缓存,但是请求2缓存还未写入的尴尬。。。 * ps:一般写入的时间会远小于5秒 + * 二:抢单过程需要进行分布式锁ID进行锁定,用于抢单,上述一是为了保证数据的最终一致性。 * */ @RequestMapping(value = "/rush/order/{orderId}", method = RequestMethod.POST) @ApiOperation(value = "抢单接口", notes = "需要通过下单编号获取订单信息后进行绑定") @ClearAndReloadCache(name = ORDER) - public Result rush(OrderXd u, - @RequestParam(required = false) String[] roleIds) { - + public Result rush(OrderXd u) { orderService.update(u); @@ -178,4 +166,22 @@ public class OrderController { return new ResultUtil>().setData(page); } + + /** + * 待抢单的订单类型 + * + * 该方法用于返回app端要抢单的展示列表信息 + * 1.需要根据订单工所在区域进行查询显示是否为所在区域订单信息 + * 2.显示的订单信息为未被抢单的订单信息 + * + * key值定义暂定以区域为类型进行查询 + * + * */ + @RequestMapping(value = "/app/getAll", method = RequestMethod.POST) + @ApiOperation(value = "获取全部订单列表") + @Cacheable(value="AllOrder",key="'Pending'") + public Result> getAll(@RequestBody OrderXd orderxd) { + List list = orderService.findByCondition(orderxd); + return new ResultUtil>().setData(list); + } } From 9541ec9d81541bc0935247762089c80d33fb33a2 Mon Sep 17 00:00:00 2001 From: Houpn Date: Wed, 2 Aug 2023 21:39:33 +0800 Subject: [PATCH 10/10] =?UTF-8?q?=E5=90=88=E5=B9=B6dev-houpn=E5=BC=80?= =?UTF-8?q?=E5=8F=91=E4=BB=A3=E7=A0=81=E5=88=B0dev?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/cc/hiver/base/controller/manage/OrderController.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/hiver-modules/hiver-base/src/main/java/cc/hiver/base/controller/manage/OrderController.java b/hiver-modules/hiver-base/src/main/java/cc/hiver/base/controller/manage/OrderController.java index 4da79655..f15ab652 100644 --- a/hiver-modules/hiver-base/src/main/java/cc/hiver/base/controller/manage/OrderController.java +++ b/hiver-modules/hiver-base/src/main/java/cc/hiver/base/controller/manage/OrderController.java @@ -122,7 +122,7 @@ public class OrderController { */ @RequestMapping(value = "/rush/order/{orderId}", method = RequestMethod.POST) @ApiOperation(value = "抢单接口", notes = "需要通过下单编号获取订单信息后进行绑定") - @ClearAndReloadCache(name = ORDER) + //@ClearAndReloadCache(name = ORDER) public Result rush(OrderXd u) { orderService.update(u); @@ -138,7 +138,7 @@ public class OrderController { */ @RequestMapping(value = "/unbind/order/{orderId}", method = RequestMethod.POST) @ApiOperation(value = "解绑订单接口", notes = "需要通过下单编号获取订单信息后进行解绑") - @ClearAndReloadCache(name = ORDER) + //@ClearAndReloadCache(name = ORDER) public Result revoke(OrderXd u, @ApiParam("订单唯一id标识") @PathVariable String orderId) {