From a7501803a3ca43310e57a5dd912e5047919c2e43 Mon Sep 17 00:00:00 2001
From: 彭雪彬 <1724387007@qq.com>
Date: Tue, 15 Jul 2025 15:26:55 +0800
Subject: [PATCH] Merge branch 'xin' into pxb
---
oying-system/src/main/java/com/oying/modules/pc/store/service/StoreQualificationService.java | 2
oying-system/src/main/java/com/oying/modules/sh/rest/OrderController.java | 9
oying-system/src/main/java/com/oying/AppRun.java | 4
oying-system/src/main/java/com/oying/modules/pc/store/domain/dto/StoreAuditQueryCriteria.java | 29
oying-system/src/main/java/com/oying/modules/pc/common/core/constrant/Constants.java | 10
oying-system/src/main/java/com/oying/modules/sh/service/impl/OrderServiceImpl.java | 44
oying-system/src/main/java/com/oying/modules/pc/store/mapper/StoreMapper.java | 4
oying-system/src/main/java/com/oying/modules/sh/mapper/OrderMapper.java | 2
oying-system/src/main/java/com/oying/modules/pc/store/service/impl/StoreQueryServiceImpl.java | 25
oying-system/src/main/resources/mapper/pc/product/ProductAuditMapper.xml | 37 +
oying-system/src/main/java/com/oying/modules/pc/store/domain/dto/StoreRevisionRecord.java | 31
oying-system/src/main/java/com/oying/modules/pc/store/rest/StoreMerchantController.java | 96 +-
oying-system/src/main/resources/mapper/sh/OrderMapper.xml | 5
oying-system/src/main/java/com/oying/modules/message/rest/MessageOrderSellerController.java | 26
oying-system/src/main/java/com/oying/modules/pc/store/domain/dto/StoreFieldUpdateRequest.java | 6
oying-system/src/main/java/com/oying/modules/message/service/MessageOrderSellerService.java | 8
oying-system/src/main/java/com/oying/modules/pc/store/service/impl/StoreAuditServiceImpl.java | 122 +++
oying-system/src/main/java/com/oying/modules/pc/product/rest/ProductAuditController.java | 72 ++
oying-common/src/main/java/com/oying/utils/enums/OrderStatusEnum.java | 1
oying-system/src/main/java/com/oying/modules/pc/product/service/ProductMerchantService.java | 2
oying-system/src/main/java/com/oying/modules/pc/store/mapper/StoreAuditMapper.java | 22
oying-system/src/main/java/com/oying/modules/pc/product/domain/dto/ProductAuditQueryCriteria.java | 29
oying-system/src/main/java/com/oying/modules/pc/store/rest/StoreCustomerController.java | 4
oying-system/src/main/java/com/oying/modules/message/mapper/MessageOrderSellerMapper.java | 2
oying-system/src/main/java/com/oying/modules/pc/store/rest/StoreController.java | 5
oying-system/src/main/java/com/oying/modules/pc/product/mapper/ProductAuditMapper.java | 23
oying-system/src/main/java/com/oying/modules/message/domain/dto/MessageOrderSellerDTO.java | 5
oying-system/src/main/java/com/oying/modules/pc/store/service/impl/StoreMerchantServiceImpl.java | 229 ++++++
oying-system/src/main/java/com/oying/modules/sh/service/impl/OrderOperationLogServiceImpl.java | 50
oying-system/src/main/resources/mapper/pc/store/StoreAuditMapper.xml | 37 +
oying-system/src/main/java/com/oying/modules/pc/product/service/impl/ProductAuditServiceImpl.java | 114 +++
oying-system/src/main/java/com/oying/modules/pc/store/service/StoreService.java | 17
oying-system/src/main/java/com/oying/modules/pc/store/service/impl/StoreQualificationServiceImpl.java | 2
oying-system/src/main/java/com/oying/modules/sh/domain/request/StatusOrder.java | 18
oying-system/src/main/resources/mapper/pc/store/StoreMapper.xml | 32
oying-system/src/main/java/com/oying/modules/pc/store/rest/StoreAuditController.java | 73 ++
oying-system/src/main/java/com/oying/modules/pc/store/domain/enums/StoreStatusEnum.java | 6
oying-system/src/main/java/com/oying/modules/pc/store/domain/StoreAudit.java | 60 +
oying-system/src/main/resources/mapper/message/MessageOrderSellerMapper.xml | 5
oying-system/src/main/java/com/oying/modules/pc/common/core/constrant/AuditStatusEnum.java | 86 ++
oying-system/src/main/java/com/oying/modules/pc/store/domain/dto/StoreQueryCriteria.java | 5
oying-system/src/main/java/com/oying/modules/pc/store/domain/dto/StoreAuditData.java | 12
oying-system/src/main/java/com/oying/modules/pc/store/domain/enums/StoreChangeTypeEnum.java | 9
oying-system/src/main/java/com/oying/modules/sh/domain/vo/OrderResponse.java | 2
oying-system/src/main/java/com/oying/modules/sh/service/OrderService.java | 6
oying-system/src/main/java/com/oying/modules/pc/store/service/StoreAuditService.java | 78 ++
oying-system/src/main/java/com/oying/modules/pc/product/events/ProductAuditVerdictEvent.java | 14
oying-system/src/main/java/com/oying/modules/message/common/OrderStatusEnum.java | 52 +
oying-system/src/main/java/com/oying/modules/pc/product/service/impl/ProductMerchantServiceImpl.java | 62 +
oying-system/src/main/java/com/oying/modules/hwc/service/impl/CallbackServiceImpl.java | 3
oying-system/src/main/java/com/oying/modules/pc/product/service/ProductAuditService.java | 76 ++
oying-system/src/main/java/com/oying/modules/pc/store/service/impl/StoreServiceImpl.java | 173 ++--
oying-system/src/main/java/com/oying/modules/pc/product/domain/enums/ProductChangeTypeEnum.java | 7
oying-system/src/main/resources/config/application.yml | 2
oying-system/src/main/java/com/oying/modules/pc/product/domain/dto/ProductAuditData.java | 13
oying-system/src/main/java/com/oying/modules/pc/store/service/StoreMerchantService.java | 16
oying-system/src/main/java/com/oying/modules/pc/store/events/StoreAuditVerdictEvent.java | 14
oying-system/src/main/java/com/oying/modules/pc/store/domain/Store.java | 13
oying-system/src/main/java/com/oying/modules/pc/store/service/impl/StoreCreateServiceImpl.java | 6
oying-system/src/main/java/com/oying/modules/pc/product/domain/dto/ProductRevisionRecord.java | 32
oying-system/src/main/java/com/oying/modules/sh/service/OrderOperationLogService.java | 12
oying-system/src/main/java/com/oying/modules/pc/product/domain/ProductAudit.java | 59 +
oying-system/src/main/java/com/oying/modules/message/service/impl/MessageOrderSellerServiceImpl.java | 50 +
oying-system/src/main/java/com/oying/modules/pc/product/domain/enums/ProductStatusEnum.java | 6
64 files changed, 1,834 insertions(+), 242 deletions(-)
diff --git a/oying-common/src/main/java/com/oying/utils/enums/OrderStatusEnum.java b/oying-common/src/main/java/com/oying/utils/enums/OrderStatusEnum.java
index f7e4a21..b5e7f14 100644
--- a/oying-common/src/main/java/com/oying/utils/enums/OrderStatusEnum.java
+++ b/oying-common/src/main/java/com/oying/utils/enums/OrderStatusEnum.java
@@ -16,6 +16,7 @@
SIX(6, "骑手已取货,正在送货"),
SEVEN(7, "商品已送达"),
EIGHT(8, "订单已完成"),
+ NINE(9, "用户取消订单"),
UNKNOWN(99, "未知枚举");
private final Integer key;
diff --git a/oying-system/src/main/java/com/oying/AppRun.java b/oying-system/src/main/java/com/oying/AppRun.java
index df22a44..1616dd6 100644
--- a/oying-system/src/main/java/com/oying/AppRun.java
+++ b/oying-system/src/main/java/com/oying/AppRun.java
@@ -30,8 +30,8 @@
springApplication.addListeners(new ApplicationPidFileWriter());
springApplication.run(args);
log.info("---------------------------------------------");
- log.info("Local: {}", "http://localhost:8088");
- log.info("Swagger: {}", "http://localhost:8088/doc.html");
+ log.info("Local: {}", "http://localhost:8000");
+ log.info("Swagger: {}", "http://localhost:8000/doc.html");
log.info("---------------------------------------------");
}
diff --git a/oying-system/src/main/java/com/oying/modules/hwc/service/impl/CallbackServiceImpl.java b/oying-system/src/main/java/com/oying/modules/hwc/service/impl/CallbackServiceImpl.java
index 404251a..6915ba3 100644
--- a/oying-system/src/main/java/com/oying/modules/hwc/service/impl/CallbackServiceImpl.java
+++ b/oying-system/src/main/java/com/oying/modules/hwc/service/impl/CallbackServiceImpl.java
@@ -9,6 +9,7 @@
import com.oying.modules.sh.domain.vo.OrderResponse;
import com.oying.modules.sh.service.OrderReturnService;
import com.oying.modules.sh.service.OrderService;
+import com.oying.utils.enums.OrderStatusEnum;
import com.oying.utils.enums.PayStateEnum;
import com.oying.utils.enums.PayTypeEnum;
import lombok.RequiredArgsConstructor;
@@ -61,7 +62,7 @@
PayStateEnum stateEnum = PayStateEnum.NOTPAY;
if ("0".equals(map.get("pay_result"))) {
stateEnum = PayStateEnum.SUCCESS;
- orderService.paySuccess(order);
+ orderService.operationLog(order, OrderStatusEnum.TWO);
}
orderService.updatePayStatus(map.get("out_trade_no"), stateEnum, map.get("pay_info"), map.get("time_end"));
// 处理成功
diff --git a/oying-system/src/main/java/com/oying/modules/message/common/OrderStatusEnum.java b/oying-system/src/main/java/com/oying/modules/message/common/OrderStatusEnum.java
new file mode 100644
index 0000000..ea390f5
--- /dev/null
+++ b/oying-system/src/main/java/com/oying/modules/message/common/OrderStatusEnum.java
@@ -0,0 +1,52 @@
+package com.oying.modules.message.common;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+import java.util.Arrays;
+import java.util.Map;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+
+/**
+ * 订单状态枚举
+ *
+ * @author leomon
+ * @date 2025-05-20
+ */
+@Getter
+@AllArgsConstructor
+public enum OrderStatusEnum {
+
+ ZERO(0, "订单已提交"),
+ ONE(1, "支付成功"),
+ TWO(2, "商家已接单"),
+ THREE(3, "骑手已接单"),
+ FOUR(4, "商家已备货"),
+ FIVE(5, "骑手已到店"),
+ SIX(6, "骑手已取货"),
+ SEVEN(7, "商品已送达"),
+ EIGHT(8, "订单已完成"),
+ NINE(9, "订单已取消");
+
+ private final Integer key;
+ private final String value;
+
+ /* ========== 工具方法 ========== */
+
+ /** 根据 key 获取枚举 */
+ public static OrderStatusEnum of(Integer key) {
+ return key == null ? null : MAP.get(key);
+ }
+
+ /** 根据 key 获取描述 */
+ public static String descOf(Integer key) {
+ OrderStatusEnum e = of(key);
+ return e == null ? "" : e.getValue();
+ }
+
+ /** 反向映射,提升查找速度 */
+ private static final Map<Integer, OrderStatusEnum> MAP =
+ Arrays.stream(values())
+ .collect(Collectors.toMap(OrderStatusEnum::getKey, Function.identity()));
+}
\ No newline at end of file
diff --git a/oying-system/src/main/java/com/oying/modules/message/domain/dto/MessageOrderSellerDTO.java b/oying-system/src/main/java/com/oying/modules/message/domain/dto/MessageOrderSellerDTO.java
index f33e962..ac6906e 100644
--- a/oying-system/src/main/java/com/oying/modules/message/domain/dto/MessageOrderSellerDTO.java
+++ b/oying-system/src/main/java/com/oying/modules/message/domain/dto/MessageOrderSellerDTO.java
@@ -8,10 +8,13 @@
@Data
public class MessageOrderSellerDTO {
+ //加一个主键
+
+ private Integer id;
private Integer orderId;
- private String messageType;
+// private String messageType;
private String messageContent;
diff --git a/oying-system/src/main/java/com/oying/modules/message/mapper/MessageOrderSellerMapper.java b/oying-system/src/main/java/com/oying/modules/message/mapper/MessageOrderSellerMapper.java
index 510e800..18306cb 100644
--- a/oying-system/src/main/java/com/oying/modules/message/mapper/MessageOrderSellerMapper.java
+++ b/oying-system/src/main/java/com/oying/modules/message/mapper/MessageOrderSellerMapper.java
@@ -25,4 +25,6 @@
Boolean updateMessageOrderSellerRead(Integer orderId);
boolean saveMessageOrderSellerByOrderIdAndStoreId(MessageOrderSeller resources);
+
+ boolean updateReadStatusById(Integer id);
}
diff --git a/oying-system/src/main/java/com/oying/modules/message/rest/MessageOrderSellerController.java b/oying-system/src/main/java/com/oying/modules/message/rest/MessageOrderSellerController.java
index e73785e..0a972a6 100644
--- a/oying-system/src/main/java/com/oying/modules/message/rest/MessageOrderSellerController.java
+++ b/oying-system/src/main/java/com/oying/modules/message/rest/MessageOrderSellerController.java
@@ -102,16 +102,22 @@
}
//让前端标记已读
- @PostMapping("/read/{order_id}")
- @ApiOperation("让前端标记已读 按条")
- public R<String> getMessageOrderSellerRead(@PathVariable Integer order_id) {
- if(messageOrderSellerService.updateMessageOrderSellerRead(order_id)){
- return R.success("已读");
- }else{
- return R.fail("id不存在");
- }
-
-
+ //修改逻辑 主键为条件 而不是订单号,有些订单号可能重复 含多条信息 已弃用
+// @PostMapping("/readByorderid/{order_id}")
+// @ApiOperation("让前端标记已读 按条")
+// public R<String> getMessageOrderSellerRead(@PathVariable Integer order_id) {
+// if(messageOrderSellerService.updateMessageOrderSellerRead(order_id)){
+// return R.success("已读");
+// }else{
+// return R.fail("id不存在");
+// }
+// }
+ //让前端标记已读 主键为条件
+ @PostMapping("/read/{id}")
+ @ApiOperation("标记单条消息为已读(按主键 id)")
+ public R<String> markReadByPrimaryKey(@PathVariable Integer id) {
+ boolean updated = messageOrderSellerService.updateReadStatusById(id);
+ return updated ? R.success("已读") : R.fail("消息 id 不存在");
}
@Beta//重复值处理
//让后端队友更新我的表
diff --git a/oying-system/src/main/java/com/oying/modules/message/service/MessageOrderSellerService.java b/oying-system/src/main/java/com/oying/modules/message/service/MessageOrderSellerService.java
index ca3615e..db8686c 100644
--- a/oying-system/src/main/java/com/oying/modules/message/service/MessageOrderSellerService.java
+++ b/oying-system/src/main/java/com/oying/modules/message/service/MessageOrderSellerService.java
@@ -77,8 +77,8 @@
* </p>
* <p>
* 可选字段:
- * - messageType:消息类型 : 供流程使用 订单状态: 1-待取货 2-配送中 3-已完成 4-商家取消 5-骑手取消 6-客户取消 7-系统取消"
- * - messageContent:消息内容 : "订单已提交" :"支付成功" 商家已接单 骑手已接单"
+ * - messageType:消息类型 : 暂未使用
+ * - messageContent:消息内容 : "订单已提交" :"支付成功" 商家已接单 骑手已接单" 即com.oying.modules.message.common.OrderStatusEnum
* - link:链接
* - flag:标志字段(默认值为未读 0)
* </p>
@@ -88,4 +88,8 @@
*/
@Beta
boolean saveMessageOrderSellerByOrderIdAndStoreId(MessageOrderSeller resources);
+
+ boolean updateReadStatusById(Integer id);
+
+// public void saveMessage(MessageOrderSeller resources) ;
}
diff --git a/oying-system/src/main/java/com/oying/modules/message/service/impl/MessageOrderSellerServiceImpl.java b/oying-system/src/main/java/com/oying/modules/message/service/impl/MessageOrderSellerServiceImpl.java
index d5fc522..a248ec6 100644
--- a/oying-system/src/main/java/com/oying/modules/message/service/impl/MessageOrderSellerServiceImpl.java
+++ b/oying-system/src/main/java/com/oying/modules/message/service/impl/MessageOrderSellerServiceImpl.java
@@ -9,6 +9,7 @@
import com.oying.modules.message.service.MessageOrderSellerService;
import com.oying.modules.message.domain.dto.MessageOrderSellerQueryCriteria;
import com.oying.modules.message.mapper.MessageOrderSellerMapper;
+import lombok.extern.slf4j.Slf4j;
import org.apache.poi.util.Beta;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@@ -25,11 +26,15 @@
* @author 李萌
* @date 2025-05-20
**/
+@Slf4j
@Service
@RequiredArgsConstructor
public class MessageOrderSellerServiceImpl extends ServiceImpl<MessageOrderSellerMapper, MessageOrderSeller> implements MessageOrderSellerService {
private final MessageOrderSellerMapper messageOrderSellerMapper;
+
+
+
@Override
public PageResult<MessageOrderSeller> queryAll(MessageOrderSellerQueryCriteria criteria, Page<Object> page){
@@ -104,19 +109,56 @@
* </p>
* <p>
* 可选字段:
- * - messageType:消息类型 : 供流程使用 订单状态: 1-待取货 2-配送中 3-已完成 4-商家取消 5-骑手取消 6-客户取消 7-系统取消"
- * - messageContent:消息内容 : "订单已提交" :"支付成功" 商家已接单 骑手已接单"
+ * - messageType:消息类型 : 暂时不用
+ * - messageContent:消息内容 : "订单已提交" :"支付成功" 商家已接单 骑手已接单".......com.oying.modules.message.common.OrderStatusEnum
* - link:链接
* - flag:标志字段(默认值为未读 0)
* </p>
*
* @param resources MessageOrderSeller 对象,包含需要保存或更新的数据。
* @return true 表示保存成功,false 表示保存失败。
+ *
+ * 目前插入orderId storeId messageContent即可,其他保留---------
*/
- @Beta
@Override
public boolean saveMessageOrderSellerByOrderIdAndStoreId(MessageOrderSeller resources) {
- return messageOrderSellerMapper.saveMessageOrderSellerByOrderIdAndStoreId(resources);
+
+ try {
+ // 1. 判断重复的记录是否存在
+// // messageType此处不用
+ long count = this.lambdaQuery()
+ .eq(MessageOrderSeller::getOrderId, resources.getOrderId())
+ .eq(MessageOrderSeller::getStoreId, resources.getStoreId())
+ .eq(MessageOrderSeller::getMessageContent, resources.getMessageContent())
+ .eq(MessageOrderSeller::getFlag, 0) // 未读
+ .count();
+
+ //存在 不插入
+ if (count > 0) {
+ log.warn("消息已存在,跳过保存:{}",
+ resources);
+ return false;
+ }else{
+ return messageOrderSellerMapper.saveMessageOrderSellerByOrderIdAndStoreId(resources);
+ }
+
+ } catch (Exception e) {
+ log.error("保存消息异常",
+ e);
+ return false;
+ }
+
}
+
+
+
+
+ @Override
+ public boolean updateReadStatusById(Integer id) {
+ return messageOrderSellerMapper.updateReadStatusById(id);
+ }
+
+
+
}
diff --git a/oying-system/src/main/java/com/oying/modules/pc/common/core/constrant/AuditStatusEnum.java b/oying-system/src/main/java/com/oying/modules/pc/common/core/constrant/AuditStatusEnum.java
new file mode 100644
index 0000000..3463c7b
--- /dev/null
+++ b/oying-system/src/main/java/com/oying/modules/pc/common/core/constrant/AuditStatusEnum.java
@@ -0,0 +1,86 @@
+package com.oying.modules.pc.common.core.constrant;
+
+import lombok.Getter;
+
+import java.util.EnumSet;
+import java.util.Optional;
+
+@Getter
+public enum AuditStatusEnum {
+
+ DRAFT(1000, "草稿"),
+ PENDING(1001, "待审核"),
+ UNDER_REVIEW(1002, "审核中"),
+ REJECTED(1003, "拒绝"),
+ APPROVED(1004, "同意"),
+ CANCELLED(1005, "取消");
+
+ private final Integer value;
+ private final String reasonPhrase;
+
+ AuditStatusEnum(Integer value, String reasonPhrase) {
+ this.value = value;
+ this.reasonPhrase = reasonPhrase;
+ }
+
+ public static AuditStatusEnum get(Integer code) {
+ return getOrDefault(code, null);
+ }
+
+ public static AuditStatusEnum getOrDefault(Integer code, AuditStatusEnum defaultStatus) {
+ for (AuditStatusEnum value : values()) {
+ if (value.value.equals(code)) {
+ return value;
+ }
+ }
+ return defaultStatus;
+ }
+
+ public static boolean isApproved(Integer code) {
+ return Optional.ofNullable(get(code)).map(i -> i.equals(APPROVED)).orElse(false);
+ }
+
+ public static boolean isCompleted(Integer code) {
+ return EnumSet.of(REJECTED, APPROVED, CANCELLED).contains(get(code));
+ }
+
+ public static AuditStatusEnum get(String name) {
+ return AuditStatusEnum.valueOf(name);
+ }
+
+ public static EnumSet<AuditStatusEnum> getNext(AuditStatusEnum status) {
+ switch (status) {
+ case DRAFT:
+ return EnumSet.of(PENDING);
+ case PENDING:
+ return EnumSet.of(UNDER_REVIEW, APPROVED, REJECTED, CANCELLED);
+ case UNDER_REVIEW:
+ return EnumSet.of(APPROVED, REJECTED);
+ case APPROVED:
+ case REJECTED:
+ case CANCELLED:
+ default:
+ return EnumSet.noneOf(AuditStatusEnum.class);
+ }
+ }
+
+ public static boolean hasNext(AuditStatusEnum status) {
+ return !getNext(status).isEmpty();
+ }
+
+ public EnumSet<AuditStatusEnum> getNext() {
+ return getNext(this);
+ }
+
+ public boolean nextContains(AuditStatusEnum status) {
+ return getNext().contains(status);
+ }
+
+ public boolean nextContains(String status) {
+ return nextContains(get(status));
+ }
+
+ public boolean hasNext() {
+ return hasNext(this);
+ }
+}
diff --git a/oying-system/src/main/java/com/oying/modules/pc/common/core/constrant/Constants.java b/oying-system/src/main/java/com/oying/modules/pc/common/core/constrant/Constants.java
index 796bccf..4fa9083 100644
--- a/oying-system/src/main/java/com/oying/modules/pc/common/core/constrant/Constants.java
+++ b/oying-system/src/main/java/com/oying/modules/pc/common/core/constrant/Constants.java
@@ -47,4 +47,14 @@
* https请求
*/
public static final String HTTPS = "https://";
+
+ /**
+ * 否
+ */
+ public static final Integer NOT = 0;
+
+ /**
+ * 是
+ */
+ public static final Integer YES = 1;
}
diff --git a/oying-system/src/main/java/com/oying/modules/pc/product/domain/ProductAudit.java b/oying-system/src/main/java/com/oying/modules/pc/product/domain/ProductAudit.java
new file mode 100644
index 0000000..3451ed6
--- /dev/null
+++ b/oying-system/src/main/java/com/oying/modules/pc/product/domain/ProductAudit.java
@@ -0,0 +1,59 @@
+package com.oying.modules.pc.product.domain;
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.bean.copier.CopyOptions;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.oying.base.BaseEntity;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+* @description /
+* @author lzp
+* @date 2025-07-01
+**/
+@Getter
+@Setter
+@TableName("pc_product_audit")
+public class ProductAudit extends BaseEntity implements Serializable {
+
+ @TableId(value = "audit_id", type = IdType.AUTO)
+ @ApiModelProperty(value = "审核ID")
+ private Long auditId;
+
+ @NotNull
+ @ApiModelProperty(value = "商品ID")
+ private Long productId;
+
+ @NotBlank
+ @ApiModelProperty(value = "类型")
+ private String type;
+
+ @ApiModelProperty(value = "审核状态")
+ private Integer status;
+
+ @ApiModelProperty(value = "审核原因")
+ private String reason;
+
+ @ApiModelProperty(value = "审核人")
+ private String auditor;
+
+ @ApiModelProperty(value = "审核时间")
+ private Date auditTime;
+
+ @NotBlank
+ @ApiModelProperty(value = "审核内容")
+ private String data;
+
+ public void copy(ProductAudit source){
+ BeanUtil.copyProperties(source,this, CopyOptions.create().setIgnoreNullValue(true));
+ }
+}
diff --git a/oying-system/src/main/java/com/oying/modules/pc/product/domain/dto/ProductAuditData.java b/oying-system/src/main/java/com/oying/modules/pc/product/domain/dto/ProductAuditData.java
new file mode 100644
index 0000000..7f8f95d
--- /dev/null
+++ b/oying-system/src/main/java/com/oying/modules/pc/product/domain/dto/ProductAuditData.java
@@ -0,0 +1,13 @@
+package com.oying.modules.pc.product.domain.dto;
+
+import com.oying.modules.pc.store.domain.Store;
+import com.oying.modules.pc.store.domain.dto.StoreRevisionRecord;
+import lombok.Data;
+
+@Data
+public class ProductAuditData {
+
+ private Store store;
+ private StoreRevisionRecord revisionRecord;
+
+}
diff --git a/oying-system/src/main/java/com/oying/modules/pc/product/domain/dto/ProductAuditQueryCriteria.java b/oying-system/src/main/java/com/oying/modules/pc/product/domain/dto/ProductAuditQueryCriteria.java
new file mode 100644
index 0000000..940cc4b
--- /dev/null
+++ b/oying-system/src/main/java/com/oying/modules/pc/product/domain/dto/ProductAuditQueryCriteria.java
@@ -0,0 +1,29 @@
+package com.oying.modules.pc.product.domain.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+
+/**
+* @author lzp
+* @date 2025-07-01
+**/
+@Data
+public class ProductAuditQueryCriteria {
+
+ @NotNull
+ @ApiModelProperty(value = "商品ID")
+ private Long productId;
+
+ @NotBlank
+ @ApiModelProperty(value = "类型")
+ private String type;
+
+ @ApiModelProperty(value = "页码", example = "1")
+ private Integer page = 1;
+
+ @ApiModelProperty(value = "每页数据量", example = "10")
+ private Integer size = 10;
+}
diff --git a/oying-system/src/main/java/com/oying/modules/pc/product/domain/dto/ProductRevisionRecord.java b/oying-system/src/main/java/com/oying/modules/pc/product/domain/dto/ProductRevisionRecord.java
new file mode 100644
index 0000000..ae1e04a
--- /dev/null
+++ b/oying-system/src/main/java/com/oying/modules/pc/product/domain/dto/ProductRevisionRecord.java
@@ -0,0 +1,32 @@
+package com.oying.modules.pc.product.domain.dto;
+
+import com.oying.modules.pc.store.domain.StoreQualification;
+import com.oying.modules.pc.store.domain.dto.StoreQualificationUpdateRequest;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@Data
+public class ProductRevisionRecord {
+
+ @ApiModelProperty(value = "店铺ID")
+ private Long storeId;
+
+ @ApiModelProperty(value = "店铺名称")
+ private String storeName;
+
+ @ApiModelProperty(value = "资质")
+ private List<StoreQualification> qualifications = new ArrayList<>();
+
+ @ApiModelProperty(value = "删除的资质")
+ private List<Long> deletedQualificationIds = new ArrayList<>();
+
+ @ApiModelProperty(value = "修改的资质")
+ private List<StoreQualificationUpdateRequest> updatedQualifications = new ArrayList<>();
+
+ @ApiModelProperty(value = "新增的资质")
+ private List<StoreQualification> newQualifications = new ArrayList<>();
+
+}
diff --git a/oying-system/src/main/java/com/oying/modules/pc/product/domain/enums/ProductChangeTypeEnum.java b/oying-system/src/main/java/com/oying/modules/pc/product/domain/enums/ProductChangeTypeEnum.java
new file mode 100644
index 0000000..a7783c6
--- /dev/null
+++ b/oying-system/src/main/java/com/oying/modules/pc/product/domain/enums/ProductChangeTypeEnum.java
@@ -0,0 +1,7 @@
+package com.oying.modules.pc.product.domain.enums;
+
+public enum ProductChangeTypeEnum {
+
+ PUT_ON_SHELF
+
+}
diff --git a/oying-system/src/main/java/com/oying/modules/pc/product/domain/enums/ProductStatusEnum.java b/oying-system/src/main/java/com/oying/modules/pc/product/domain/enums/ProductStatusEnum.java
index 1972d20..82fc4e9 100644
--- a/oying-system/src/main/java/com/oying/modules/pc/product/domain/enums/ProductStatusEnum.java
+++ b/oying-system/src/main/java/com/oying/modules/pc/product/domain/enums/ProductStatusEnum.java
@@ -23,11 +23,15 @@
}
public static ProductStatusEnum get(Integer code) {
+ return getOrDefault(code, null);
+ }
+
+ public static ProductStatusEnum getOrDefault(Integer code, ProductStatusEnum productStatusEnum) {
for (ProductStatusEnum value : values()) {
if (value.value.equals(code)) {
return value;
}
}
- return null;
+ return productStatusEnum;
}
}
diff --git a/oying-system/src/main/java/com/oying/modules/pc/product/events/ProductAuditVerdictEvent.java b/oying-system/src/main/java/com/oying/modules/pc/product/events/ProductAuditVerdictEvent.java
new file mode 100644
index 0000000..7bc5cb6
--- /dev/null
+++ b/oying-system/src/main/java/com/oying/modules/pc/product/events/ProductAuditVerdictEvent.java
@@ -0,0 +1,14 @@
+package com.oying.modules.pc.product.events;
+
+import lombok.Data;
+
+@Data
+public class ProductAuditVerdictEvent {
+
+ private Long auditId;
+
+ public ProductAuditVerdictEvent(Long auditId) {
+ this.auditId = auditId;
+ }
+
+}
diff --git a/oying-system/src/main/java/com/oying/modules/pc/product/mapper/ProductAuditMapper.java b/oying-system/src/main/java/com/oying/modules/pc/product/mapper/ProductAuditMapper.java
new file mode 100644
index 0000000..dad7e69
--- /dev/null
+++ b/oying-system/src/main/java/com/oying/modules/pc/product/mapper/ProductAuditMapper.java
@@ -0,0 +1,23 @@
+package com.oying.modules.pc.product.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.oying.modules.pc.product.domain.ProductAudit;
+import com.oying.modules.pc.product.domain.dto.ProductAuditQueryCriteria;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * @author lzp
+ * @date 2025-07-01
+ **/
+@Mapper
+public interface ProductAuditMapper extends BaseMapper<ProductAudit> {
+
+ IPage<ProductAudit> findAll(@Param("criteria") ProductAuditQueryCriteria criteria, Page<Object> page);
+
+ List<ProductAudit> findAll(@Param("criteria") ProductAuditQueryCriteria criteria);
+}
diff --git a/oying-system/src/main/java/com/oying/modules/pc/product/rest/ProductAuditController.java b/oying-system/src/main/java/com/oying/modules/pc/product/rest/ProductAuditController.java
new file mode 100644
index 0000000..04d0bc8
--- /dev/null
+++ b/oying-system/src/main/java/com/oying/modules/pc/product/rest/ProductAuditController.java
@@ -0,0 +1,72 @@
+package com.oying.modules.pc.product.rest;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.oying.annotation.Log;
+import com.oying.modules.pc.product.domain.ProductAudit;
+import com.oying.modules.pc.product.domain.dto.ProductAuditQueryCriteria;
+import com.oying.modules.pc.product.service.ProductAuditService;
+import com.oying.utils.PageResult;
+import com.oying.utils.R;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import lombok.RequiredArgsConstructor;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * @author lzp
+ * @date 2025-07-01
+ **/
+@RestController
+@RequiredArgsConstructor
+@RequestMapping("/api/pc/product/audit")
+public class ProductAuditController {
+
+ private final ProductAuditService auditService;
+
+ @GetMapping
+ @ApiOperation("查询审批信息")
+ //@PreAuthorize("@el.check('productAudit:list')")
+ public ResponseEntity<?> queryProductAudit(ProductAuditQueryCriteria criteria) {
+ Page<Object> page = new Page<>(criteria.getPage(), criteria.getSize());
+ return ResponseEntity.ok(R.success(auditService.queryAll(criteria, page)));
+ }
+
+ @PostMapping
+ @Log("新增审批信息")
+ @ApiOperation("新增审批信息")
+ //@PreAuthorize("@el.check('productAudit:add')")
+ public ResponseEntity<Object> createProductAudit(@Validated @RequestBody ProductAudit resources) {
+ auditService.create(resources);
+ return ResponseEntity.status(HttpStatus.CREATED).build();
+ }
+
+ @PutMapping
+ @Log("修改审批信息")
+ @ApiOperation("修改审批信息")
+ //@PreAuthorize("@el.check('productAudit:edit')")
+ public ResponseEntity<Object> updateProductAudit(@Validated @RequestBody ProductAudit resources) {
+ auditService.update(resources, false);
+ return ResponseEntity.noContent().build();
+ }
+
+ @PostMapping(value = "/verdict")
+ @ApiOperation("处理审核")
+ public ResponseEntity<?> submitAuditVerdict(@RequestBody ProductAudit resources) {
+ auditService.processVerdict(resources);
+ return ResponseEntity.noContent().build();
+ }
+
+ @DeleteMapping
+ @Log("删除审批信息")
+ @ApiOperation("删除审批信息")
+ //@PreAuthorize("@el.check('productAudit:del')")
+ public ResponseEntity<Object> deleteProductAudit(@ApiParam(value = "传ID数组[]") @RequestBody List<Long> ids) {
+ auditService.deleteAll(ids);
+ return ResponseEntity.noContent().build();
+ }
+}
diff --git a/oying-system/src/main/java/com/oying/modules/pc/product/service/ProductAuditService.java b/oying-system/src/main/java/com/oying/modules/pc/product/service/ProductAuditService.java
new file mode 100644
index 0000000..66ce99d
--- /dev/null
+++ b/oying-system/src/main/java/com/oying/modules/pc/product/service/ProductAuditService.java
@@ -0,0 +1,76 @@
+package com.oying.modules.pc.product.service;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.oying.modules.pc.product.domain.ProductAudit;
+import com.oying.modules.pc.product.domain.dto.ProductAuditQueryCriteria;
+import com.oying.utils.PageResult;
+
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.util.List;
+
+/**
+ * @author lzp
+ * @description 服务接口
+ * @date 2025-07-01
+ **/
+public interface ProductAuditService extends IService<ProductAudit> {
+
+ /**
+ * 查询数据分页
+ *
+ * @param criteria 条件
+ * @param page 分页参数
+ * @return PageResult
+ */
+ PageResult<ProductAudit> queryAll(ProductAuditQueryCriteria criteria, Page<Object> page);
+
+ /**
+ * 查询所有数据不分页
+ *
+ * @param criteria 条件参数
+ * @return List<StoreRevisionDto>
+ */
+ List<ProductAudit> queryAll(ProductAuditQueryCriteria criteria);
+
+ /**
+ * 商品ID查询修订数据,
+ *
+ * @param productId 必须的参数,不能为null
+ * @return 查询到的结果
+ */
+ ProductAudit getByProductId(Long productId);
+
+ /**
+ * 创建
+ *
+ * @param resources /
+ */
+ void create(ProductAudit resources);
+
+ /**
+ * 编辑
+ *
+ * @param resources /
+ */
+ void update(ProductAudit resources, boolean isDirectUpdate);
+
+ /**
+ * 多选删除
+ *
+ * @param ids /
+ */
+ void deleteAll(List<Long> ids);
+
+ /**
+ * 导出数据
+ *
+ * @param all 待导出的数据
+ * @param response /
+ * @throws IOException /
+ */
+ void download(List<ProductAudit> all, HttpServletResponse response) throws IOException;
+
+ void processVerdict(ProductAudit resources);
+}
diff --git a/oying-system/src/main/java/com/oying/modules/pc/product/service/ProductMerchantService.java b/oying-system/src/main/java/com/oying/modules/pc/product/service/ProductMerchantService.java
index be935ff..6ff27c7 100644
--- a/oying-system/src/main/java/com/oying/modules/pc/product/service/ProductMerchantService.java
+++ b/oying-system/src/main/java/com/oying/modules/pc/product/service/ProductMerchantService.java
@@ -2,6 +2,7 @@
import com.oying.modules.pc.product.domain.dto.ProductMerchantCreateRequest;
import com.oying.modules.pc.product.domain.dto.ProductMerchantUpdateRequest;
+import com.oying.modules.pc.product.events.ProductAuditVerdictEvent;
import java.util.List;
@@ -14,5 +15,6 @@
void batchDelete(List<Long> ids);
void putOnShelf(Long productId);
void takeOffShelf(Long productId);
+ void handleAuditVerdictEvent(ProductAuditVerdictEvent event);
}
diff --git a/oying-system/src/main/java/com/oying/modules/pc/product/service/impl/ProductAuditServiceImpl.java b/oying-system/src/main/java/com/oying/modules/pc/product/service/impl/ProductAuditServiceImpl.java
new file mode 100644
index 0000000..6713397
--- /dev/null
+++ b/oying-system/src/main/java/com/oying/modules/pc/product/service/impl/ProductAuditServiceImpl.java
@@ -0,0 +1,114 @@
+package com.oying.modules.pc.product.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.oying.exception.BadRequestException;
+import com.oying.modules.pc.common.core.constrant.AuditStatusEnum;
+import com.oying.modules.pc.product.domain.ProductAudit;
+import com.oying.modules.pc.product.domain.dto.ProductAuditQueryCriteria;
+import com.oying.modules.pc.product.events.ProductAuditVerdictEvent;
+import com.oying.modules.pc.product.mapper.ProductAuditMapper;
+import com.oying.modules.pc.product.service.ProductAuditService;
+import com.oying.utils.FileUtil;
+import com.oying.utils.PageResult;
+import com.oying.utils.PageUtil;
+import lombok.RequiredArgsConstructor;
+import org.springframework.context.ApplicationEventPublisher;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author lzp
+ * @description 服务实现
+ * @date 2025-07-01
+ **/
+@Service
+@RequiredArgsConstructor
+public class ProductAuditServiceImpl extends ServiceImpl<ProductAuditMapper, ProductAudit> implements ProductAuditService {
+
+ private final ApplicationEventPublisher eventPublisher;
+
+ private final ProductAuditMapper productAuditMapper;
+
+ @Override
+ public PageResult<ProductAudit> queryAll(ProductAuditQueryCriteria criteria, Page<Object> page) {
+ return PageUtil.toPage(productAuditMapper.findAll(criteria, page));
+ }
+
+ @Override
+ public List<ProductAudit> queryAll(ProductAuditQueryCriteria criteria) {
+ return productAuditMapper.findAll(criteria);
+ }
+
+ @Override
+ public ProductAudit getByProductId(Long productId) {
+ LambdaQueryWrapper<ProductAudit> wrapper = new LambdaQueryWrapper<ProductAudit>()
+ .eq(ProductAudit::getProductId, productId);
+ return productAuditMapper.selectOne(wrapper);
+ }
+
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public void create(ProductAudit resources) {
+ productAuditMapper.insert(resources);
+ }
+
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public void update(ProductAudit resources, boolean isDirectUpdate) {
+ if (isDirectUpdate) {
+ productAuditMapper.updateById(resources);
+ } else {
+ ProductAudit existingRevision = this.getById(resources.getAuditor());
+ existingRevision.copy(resources);
+ productAuditMapper.updateById(existingRevision);
+ }
+ }
+
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public void processVerdict(ProductAudit resources) {
+ AuditStatusEnum newAuditStatus = AuditStatusEnum.get(resources.getStatus());
+ ProductAudit existingAudit = this.getById(resources.getAuditId());
+ AuditStatusEnum existingAuditStatus = AuditStatusEnum.getOrDefault(existingAudit.getStatus(), AuditStatusEnum.DRAFT);
+ if (!existingAuditStatus.nextContains(newAuditStatus)) {
+ throw new BadRequestException("审核状态错误");
+ }
+ existingAudit.copy(resources);
+ productAuditMapper.updateById(existingAudit);
+ eventPublisher.publishEvent(new ProductAuditVerdictEvent(existingAudit.getAuditId()));
+ }
+
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public void deleteAll(List<Long> ids) {
+ productAuditMapper.deleteBatchIds(ids);
+ }
+
+ @Override
+ public void download(List<ProductAudit> all, HttpServletResponse response) throws IOException {
+ List<Map<String, Object>> list = new ArrayList<>();
+ for (ProductAudit productAudit : all) {
+ Map<String, Object> map = new LinkedHashMap<>();
+ map.put("审核ID", productAudit.getAuditId());
+ map.put("商品ID", productAudit.getProductId());
+ map.put("审批ID", productAudit.getAuditId());
+ map.put("类型", productAudit.getType());
+ map.put("新数据", productAudit.getData());
+ map.put("创建人", productAudit.getCreateBy());
+ map.put("创建时间", productAudit.getCreateTime());
+ map.put("修改人", productAudit.getUpdateBy());
+ map.put("修改时间", productAudit.getUpdateTime());
+ list.add(map);
+ }
+ FileUtil.downloadExcel(list, response);
+ }
+}
diff --git a/oying-system/src/main/java/com/oying/modules/pc/product/service/impl/ProductMerchantServiceImpl.java b/oying-system/src/main/java/com/oying/modules/pc/product/service/impl/ProductMerchantServiceImpl.java
index 7540a58..583047a 100644
--- a/oying-system/src/main/java/com/oying/modules/pc/product/service/impl/ProductMerchantServiceImpl.java
+++ b/oying-system/src/main/java/com/oying/modules/pc/product/service/impl/ProductMerchantServiceImpl.java
@@ -3,32 +3,36 @@
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.util.ObjUtil;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
-import com.oying.exception.EntityExistException;
+import com.oying.exception.BadRequestException;
import com.oying.exception.EntityNotFoundException;
+import com.oying.modules.pc.common.core.constrant.AuditStatusEnum;
import com.oying.modules.pc.product.converter.ProductImageAssembler;
import com.oying.modules.pc.product.converter.ProductLabelAssembler;
import com.oying.modules.pc.product.domain.Product;
+import com.oying.modules.pc.product.domain.ProductAudit;
import com.oying.modules.pc.product.domain.ProductImage;
import com.oying.modules.pc.product.domain.ProductLabel;
import com.oying.modules.pc.product.domain.dto.ProductImageCreateRequest;
-import com.oying.modules.pc.product.domain.dto.ProductLabelCreateRequest;
import com.oying.modules.pc.product.domain.dto.ProductMerchantCreateRequest;
import com.oying.modules.pc.product.domain.dto.ProductMerchantUpdateRequest;
+import com.oying.modules.pc.product.domain.enums.ProductChangeTypeEnum;
import com.oying.modules.pc.product.domain.enums.ProductStatusEnum;
-import com.oying.modules.pc.product.service.ProductImageService;
-import com.oying.modules.pc.product.service.ProductLabelService;
-import com.oying.modules.pc.product.service.ProductMerchantService;
-import com.oying.modules.pc.product.service.ProductService;
+import com.oying.modules.pc.product.events.ProductAuditVerdictEvent;
+import com.oying.modules.pc.product.service.*;
import com.oying.modules.pc.utils.ImageUtils;
import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
+import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
import java.util.Optional;
+import java.util.Set;
import java.util.stream.Collectors;
+@Slf4j
@Service
@RequiredArgsConstructor
public class ProductMerchantServiceImpl implements ProductMerchantService {
@@ -36,6 +40,7 @@
private final ProductService productService;
private final ProductImageService productImageService;
private final ProductLabelService productLabelService;
+ private final ProductAuditService productAuditService;
@Override
@Transactional(rollbackFor = Exception.class)
@@ -71,6 +76,7 @@
@Transactional(rollbackFor = Exception.class)
public void update(ProductMerchantUpdateRequest request) {
Product existingProduct = this.findOrThrow(request.getProductId());
+ this.validateApprovedStatus(existingProduct.getStatus());
this.processImagesUpdate(request);
this.processLabelsUpdate(request);
BeanUtils.copyProperties(request, existingProduct);
@@ -80,6 +86,8 @@
@Override
@Transactional(rollbackFor = Exception.class)
public void updateImages(ProductMerchantUpdateRequest request) {
+ Product existingProduct = this.findOrThrow(request.getProductId());
+ this.validateApprovedStatus(existingProduct.getStatus());
this.findOrThrow(request.getProductId());
this.processImagesUpdate(request);
}
@@ -87,6 +95,8 @@
@Override
@Transactional(rollbackFor = Exception.class)
public void updateLabels(ProductMerchantUpdateRequest request) {
+ Product existingProduct = this.findOrThrow(request.getProductId());
+ this.validateApprovedStatus(existingProduct.getStatus());
this.findOrThrow(request.getProductId());
this.processImagesUpdate(request);
}
@@ -99,9 +109,14 @@
@Override
public void putOnShelf(Long productId) {
+ ProductAudit audit = new ProductAudit();
+ audit.setProductId(productId);
+ audit.setType(ProductChangeTypeEnum.PUT_ON_SHELF.name());
+ audit.setStatus(AuditStatusEnum.PENDING.getValue());
+ productAuditService.create(audit);
LambdaUpdateWrapper<Product> wrapper = new LambdaUpdateWrapper<Product>()
.eq(Product::getProductId, productId)
- .set(Product::getStatus, ProductStatusEnum.AVAILABLE.getValue());
+ .set(Product::getStatus, ProductStatusEnum.PENDING.getValue());
productService.update(wrapper);
}
@@ -111,6 +126,21 @@
.eq(Product::getProductId, productId)
.set(Product::getStatus, ProductStatusEnum.NO_AVAILABLE.getValue());
productService.update(wrapper);
+ }
+
+ @Override
+ @EventListener
+ @Transactional(rollbackFor = Exception.class)
+ public void handleAuditVerdictEvent(ProductAuditVerdictEvent event) {
+ try {
+ ProductAudit audit = productAuditService.getById(event.getAuditId());
+ ProductChangeTypeEnum changeType = ProductChangeTypeEnum.valueOf(audit.getType());
+ if (changeType == ProductChangeTypeEnum.PUT_ON_SHELF) {
+ this.handlePutOnShelfAuditEvent(audit);
+ }
+ } catch (Exception e) {
+ log.error("处理商品审核结果异常", e);
+ }
}
private Product findOrThrow(Long productId) {
@@ -146,4 +176,22 @@
productLabelService.batchCreate(newLabels);
}
}
+
+ private void handlePutOnShelfAuditEvent(ProductAudit audit) {
+ AuditStatusEnum auditStatus = AuditStatusEnum.get(audit.getStatus());
+ if (AuditStatusEnum.APPROVED.equals(auditStatus)) {
+ Product existingProduct = productService.getById(audit.getProductId());
+ existingProduct.setStatus(auditStatus.getValue());
+ productService.updateById(existingProduct);
+ }
+ }
+
+ private void validateApprovedStatus(Integer status) {
+ Set<ProductStatusEnum> statusEnumSet = CollectionUtil.newHashSet(ProductStatusEnum.PENDING,
+ ProductStatusEnum.UNDER_REVIEW, ProductStatusEnum.AVAILABLE);
+ ProductStatusEnum existingStatus = ProductStatusEnum.getOrDefault(status, ProductStatusEnum.DRAFT);
+ if (statusEnumSet.contains(existingStatus)) {
+ throw new BadRequestException("在售商品无法修改");
+ }
+ }
}
diff --git a/oying-system/src/main/java/com/oying/modules/pc/store/domain/Store.java b/oying-system/src/main/java/com/oying/modules/pc/store/domain/Store.java
index 8eb184c..5ba2fd9 100644
--- a/oying-system/src/main/java/com/oying/modules/pc/store/domain/Store.java
+++ b/oying-system/src/main/java/com/oying/modules/pc/store/domain/Store.java
@@ -18,6 +18,7 @@
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalTime;
+import java.util.Date;
import java.util.List;
/**
@@ -92,6 +93,9 @@
@ApiModelProperty(value = "营业结束时间")
private LocalTime closeTime;
+ @ApiModelProperty(value = "营业状态")
+ private Integer businessStatus;
+
@ApiModelProperty(value = "省级代码")
private String provinceCode;
@@ -128,9 +132,8 @@
@ApiModelProperty(value = "是否支持自提")
private Integer selfPickup;
- @NotNull
- @ApiModelProperty(value = "版本号")
- private Long version;
+ @ApiModelProperty(value = "审核状态")
+ private Integer auditStatus;
@TableField(exist = false)
@ApiModelProperty(value = "评分")
@@ -152,6 +155,10 @@
@ApiModelProperty(value = "月销售量")
private Integer monthlyUnitsSold = 0;
+ @NotNull
+ @ApiModelProperty(value = "版本号")
+ private Long version;
+
@TableField(exist = false)
@ApiModelProperty(value = "资质")
private List<StoreQualification> qualifications;
diff --git a/oying-system/src/main/java/com/oying/modules/pc/store/domain/StoreAudit.java b/oying-system/src/main/java/com/oying/modules/pc/store/domain/StoreAudit.java
new file mode 100644
index 0000000..e6a220e
--- /dev/null
+++ b/oying-system/src/main/java/com/oying/modules/pc/store/domain/StoreAudit.java
@@ -0,0 +1,60 @@
+package com.oying.modules.pc.store.domain;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.oying.base.BaseEntity;
+import cn.hutool.core.bean.BeanUtil;
+import io.swagger.annotations.ApiModelProperty;
+import cn.hutool.core.bean.copier.CopyOptions;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+import java.io.Serializable;
+import java.util.Date;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+* @description /
+* @author lzp
+* @date 2025-07-01
+**/
+@Getter
+@Setter
+@TableName("pc_store_audit")
+public class StoreAudit extends BaseEntity implements Serializable {
+
+ @TableId(value = "audit_id", type = IdType.AUTO)
+ @ApiModelProperty(value = "审核ID")
+ private Long auditId;
+
+ @NotNull
+ @ApiModelProperty(value = "店铺ID")
+ private Long storeId;
+
+ @NotBlank
+ @ApiModelProperty(value = "类型")
+ private String type;
+
+ @ApiModelProperty(value = "审核状态")
+ private Integer status;
+
+ @ApiModelProperty(value = "审核原因")
+ private String reason;
+
+ @ApiModelProperty(value = "审核人")
+ private String auditor;
+
+ @ApiModelProperty(value = "审核时间")
+ private Date auditTime;
+
+ @NotBlank
+ @ApiModelProperty(value = "审核内容")
+ private String data;
+
+ public void copy(StoreAudit source){
+ BeanUtil.copyProperties(source,this, CopyOptions.create().setIgnoreNullValue(true));
+ }
+}
diff --git a/oying-system/src/main/java/com/oying/modules/pc/store/domain/dto/StoreAuditData.java b/oying-system/src/main/java/com/oying/modules/pc/store/domain/dto/StoreAuditData.java
new file mode 100644
index 0000000..d60c325
--- /dev/null
+++ b/oying-system/src/main/java/com/oying/modules/pc/store/domain/dto/StoreAuditData.java
@@ -0,0 +1,12 @@
+package com.oying.modules.pc.store.domain.dto;
+
+import com.oying.modules.pc.store.domain.Store;
+import lombok.Data;
+
+@Data
+public class StoreAuditData {
+
+ private Store store;
+ private StoreRevisionRecord revisionRecord;
+
+}
diff --git a/oying-system/src/main/java/com/oying/modules/pc/store/domain/dto/StoreAuditQueryCriteria.java b/oying-system/src/main/java/com/oying/modules/pc/store/domain/dto/StoreAuditQueryCriteria.java
new file mode 100644
index 0000000..e5a05ed
--- /dev/null
+++ b/oying-system/src/main/java/com/oying/modules/pc/store/domain/dto/StoreAuditQueryCriteria.java
@@ -0,0 +1,29 @@
+package com.oying.modules.pc.store.domain.dto;
+
+import lombok.Data;
+import io.swagger.annotations.ApiModelProperty;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+
+/**
+* @author lzp
+* @date 2025-07-01
+**/
+@Data
+public class StoreAuditQueryCriteria {
+
+ @NotNull
+ @ApiModelProperty(value = "店铺ID")
+ private Long storeId;
+
+ @NotBlank
+ @ApiModelProperty(value = "类型")
+ private String type;
+
+ @ApiModelProperty(value = "页码", example = "1")
+ private Integer page = 1;
+
+ @ApiModelProperty(value = "每页数据量", example = "10")
+ private Integer size = 10;
+}
diff --git a/oying-system/src/main/java/com/oying/modules/pc/store/domain/dto/StoreFieldUpdateRequest.java b/oying-system/src/main/java/com/oying/modules/pc/store/domain/dto/StoreFieldUpdateRequest.java
index 848330e..0bc09b2 100644
--- a/oying-system/src/main/java/com/oying/modules/pc/store/domain/dto/StoreFieldUpdateRequest.java
+++ b/oying-system/src/main/java/com/oying/modules/pc/store/domain/dto/StoreFieldUpdateRequest.java
@@ -34,11 +34,17 @@
@NotNull(groups = UpdateStoreBusinessStatusGroup.class)
private Integer businessStatus;
+ @ApiModelProperty(value = "店铺logo图片")
+ private Long logoImageId;
+
public interface UpdateStoreLogoImageGroup{}
@NotBlank(groups = UpdateStoreLogoImageGroup.class)
private String logoImageUploadId;
+ @ApiModelProperty(value = "店铺封面图")
+ private Long coverImageId;
+
public interface UpdateStoreCoverImageGroup{}
@NotBlank(groups = UpdateStoreCoverImageGroup.class)
diff --git a/oying-system/src/main/java/com/oying/modules/pc/store/domain/dto/StoreQueryCriteria.java b/oying-system/src/main/java/com/oying/modules/pc/store/domain/dto/StoreQueryCriteria.java
index f2791d4..0009d3a 100644
--- a/oying-system/src/main/java/com/oying/modules/pc/store/domain/dto/StoreQueryCriteria.java
+++ b/oying-system/src/main/java/com/oying/modules/pc/store/domain/dto/StoreQueryCriteria.java
@@ -25,13 +25,15 @@
private Integer status;
+ private Integer businessStatus;
+
private String blurry;
private Double longitude; // 中心点经度
private Double latitude; // 中心点纬度
- private Integer radius = 10000; // 搜索半径(米)
+ private Integer radius = 50000000; // 搜索半径(米)
private Integer limit = 20; // 返回数量限制
@@ -48,6 +50,7 @@
baseKeyJoiner.add("platformCategoryId=" + platformCategoryId);
baseKeyJoiner.add("storeName=" + storeName);
baseKeyJoiner.add("status=" + status);
+ baseKeyJoiner.add("businessStatus=" + businessStatus);
baseKeyJoiner.add("blurry=" + blurry);
baseKeyJoiner.add("longitude=" + longitude);
baseKeyJoiner.add("latitude=" + latitude);
diff --git a/oying-system/src/main/java/com/oying/modules/pc/store/domain/dto/StoreRevisionRecord.java b/oying-system/src/main/java/com/oying/modules/pc/store/domain/dto/StoreRevisionRecord.java
new file mode 100644
index 0000000..94c7252
--- /dev/null
+++ b/oying-system/src/main/java/com/oying/modules/pc/store/domain/dto/StoreRevisionRecord.java
@@ -0,0 +1,31 @@
+package com.oying.modules.pc.store.domain.dto;
+
+import com.oying.modules.pc.store.domain.StoreQualification;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@Data
+public class StoreRevisionRecord {
+
+ @ApiModelProperty(value = "店铺ID")
+ private Long storeId;
+
+ @ApiModelProperty(value = "店铺名称")
+ private String storeName;
+
+ @ApiModelProperty(value = "资质")
+ private List<StoreQualification> qualifications = new ArrayList<>();
+
+ @ApiModelProperty(value = "删除的资质")
+ private List<Long> deletedQualificationIds = new ArrayList<>();
+
+ @ApiModelProperty(value = "修改的资质")
+ private List<StoreQualificationUpdateRequest> updatedQualifications = new ArrayList<>();
+
+ @ApiModelProperty(value = "新增的资质")
+ private List<StoreQualification> newQualifications = new ArrayList<>();
+
+}
diff --git a/oying-system/src/main/java/com/oying/modules/pc/store/domain/enums/StoreChangeTypeEnum.java b/oying-system/src/main/java/com/oying/modules/pc/store/domain/enums/StoreChangeTypeEnum.java
new file mode 100644
index 0000000..36d2bce
--- /dev/null
+++ b/oying-system/src/main/java/com/oying/modules/pc/store/domain/enums/StoreChangeTypeEnum.java
@@ -0,0 +1,9 @@
+package com.oying.modules.pc.store.domain.enums;
+
+public enum StoreChangeTypeEnum {
+
+ NEW_STORE,
+ STORE_UPDATE,
+ STORE_NAME_UPDATE
+
+}
diff --git a/oying-system/src/main/java/com/oying/modules/pc/store/domain/enums/StoreStatusEnum.java b/oying-system/src/main/java/com/oying/modules/pc/store/domain/enums/StoreStatusEnum.java
index 46706d8..127c0d8 100644
--- a/oying-system/src/main/java/com/oying/modules/pc/store/domain/enums/StoreStatusEnum.java
+++ b/oying-system/src/main/java/com/oying/modules/pc/store/domain/enums/StoreStatusEnum.java
@@ -23,11 +23,15 @@
}
public static StoreStatusEnum get(Integer code) {
+ return getOrDefault(code, null);
+ }
+
+ public static StoreStatusEnum getOrDefault(Integer code, StoreStatusEnum defaultStatus) {
for (StoreStatusEnum value : values()) {
if (value.value.equals(code)) {
return value;
}
}
- return null;
+ return defaultStatus;
}
}
diff --git a/oying-system/src/main/java/com/oying/modules/pc/store/events/StoreAuditVerdictEvent.java b/oying-system/src/main/java/com/oying/modules/pc/store/events/StoreAuditVerdictEvent.java
new file mode 100644
index 0000000..05d58c5
--- /dev/null
+++ b/oying-system/src/main/java/com/oying/modules/pc/store/events/StoreAuditVerdictEvent.java
@@ -0,0 +1,14 @@
+package com.oying.modules.pc.store.events;
+
+import lombok.Data;
+
+@Data
+public class StoreAuditVerdictEvent {
+
+ private Long auditId;
+
+ public StoreAuditVerdictEvent(Long auditId) {
+ this.auditId = auditId;
+ }
+
+}
diff --git a/oying-system/src/main/java/com/oying/modules/pc/store/mapper/StoreAuditMapper.java b/oying-system/src/main/java/com/oying/modules/pc/store/mapper/StoreAuditMapper.java
new file mode 100644
index 0000000..8280a8e
--- /dev/null
+++ b/oying-system/src/main/java/com/oying/modules/pc/store/mapper/StoreAuditMapper.java
@@ -0,0 +1,22 @@
+package com.oying.modules.pc.store.mapper;
+
+import com.oying.modules.pc.store.domain.StoreAudit;
+import com.oying.modules.pc.store.domain.dto.StoreAuditQueryCriteria;
+import java.util.List;
+import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Mapper;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+
+/**
+* @author lzp
+* @date 2025-07-01
+**/
+@Mapper
+public interface StoreAuditMapper extends BaseMapper<StoreAudit> {
+
+ IPage<StoreAudit> findAll(@Param("criteria") StoreAuditQueryCriteria criteria, Page<Object> page);
+
+ List<StoreAudit> findAll(@Param("criteria") StoreAuditQueryCriteria criteria);
+}
diff --git a/oying-system/src/main/java/com/oying/modules/pc/store/mapper/StoreMapper.java b/oying-system/src/main/java/com/oying/modules/pc/store/mapper/StoreMapper.java
index ae21034..25e8d41 100644
--- a/oying-system/src/main/java/com/oying/modules/pc/store/mapper/StoreMapper.java
+++ b/oying-system/src/main/java/com/oying/modules/pc/store/mapper/StoreMapper.java
@@ -10,6 +10,8 @@
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
+import java.io.Serializable;
+import java.util.Collection;
import java.util.List;
/**
@@ -35,4 +37,6 @@
List<Store> queryUserStores(@Param("userId") Long userId);
+ List<Store> queryByIds(@Param("ids") Collection<? extends Serializable> idList);
+
}
diff --git a/oying-system/src/main/java/com/oying/modules/pc/store/rest/StoreAuditController.java b/oying-system/src/main/java/com/oying/modules/pc/store/rest/StoreAuditController.java
new file mode 100644
index 0000000..f88d61c
--- /dev/null
+++ b/oying-system/src/main/java/com/oying/modules/pc/store/rest/StoreAuditController.java
@@ -0,0 +1,73 @@
+package com.oying.modules.pc.store.rest;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.oying.annotation.Log;
+import com.oying.modules.pc.store.domain.StoreAudit;
+import com.oying.modules.pc.store.domain.dto.StoreAuditQueryCriteria;
+import com.oying.modules.pc.store.service.StoreAuditService;
+import com.oying.utils.PageResult;
+import com.oying.utils.R;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import lombok.RequiredArgsConstructor;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * @author lzp
+ * @date 2025-07-01
+ **/
+@RestController
+@RequiredArgsConstructor
+@RequestMapping("/api/pc/store/audit")
+public class StoreAuditController {
+
+ private final StoreAuditService auditService;
+
+ @GetMapping
+ @ApiOperation("查询审批信息")
+ //@PreAuthorize("@el.check('storeAudit:list')")
+ public ResponseEntity<?> queryStoreAudit(StoreAuditQueryCriteria criteria) {
+ Page<Object> page = new Page<>(criteria.getPage(), criteria.getSize());
+ return ResponseEntity.ok(R.success(auditService.queryAll(criteria, page)));
+ }
+
+ @PostMapping
+ @Log("新增审批信息")
+ @ApiOperation("新增审批信息")
+ //@PreAuthorize("@el.check('storeAudit:add')")
+ public ResponseEntity<Object> createStoreAudit(@Validated @RequestBody StoreAudit resources) {
+ auditService.create(resources);
+ return new ResponseEntity<>(HttpStatus.CREATED);
+ }
+
+ @PutMapping
+ @Log("修改审批信息")
+ @ApiOperation("修改审批信息")
+ //@PreAuthorize("@el.check('storeAudit:edit')")
+ public ResponseEntity<Object> updateStoreAudit(@Validated @RequestBody StoreAudit resources) {
+ auditService.update(resources, false);
+ return ResponseEntity.noContent().build();
+ }
+
+ @PutMapping(value = "/verdict")
+ @ApiOperation("处理审核")
+ //@PreAuthorize("@el.check('merchant:store:create')")
+ public ResponseEntity<?> submitAuditVerdict(@RequestBody StoreAudit resources) {
+ auditService.processVerdict(resources);
+ return ResponseEntity.noContent().build();
+ }
+
+ @DeleteMapping
+ @Log("删除审批信息")
+ @ApiOperation("删除审批信息")
+ //@PreAuthorize("@el.check('storeAudit:del')")
+ public ResponseEntity<Object> deleteStoreAudit(@ApiParam(value = "传ID数组[]") @RequestBody List<Long> ids) {
+ auditService.deleteAll(ids);
+ return ResponseEntity.noContent().build();
+ }
+}
diff --git a/oying-system/src/main/java/com/oying/modules/pc/store/rest/StoreController.java b/oying-system/src/main/java/com/oying/modules/pc/store/rest/StoreController.java
index 552f567..3d421f3 100644
--- a/oying-system/src/main/java/com/oying/modules/pc/store/rest/StoreController.java
+++ b/oying-system/src/main/java/com/oying/modules/pc/store/rest/StoreController.java
@@ -54,6 +54,11 @@
return ResponseEntity.ok(R.success(storeService.getById(storeId)));
}
+ @GetMapping(value = "/{storeId}/name-check")
+ public ResponseEntity<?> checkStoreName(@RequestParam String storeName) {
+ return ResponseEntity.ok(R.success(storeService.existsStoreName(storeName)));
+ }
+
@PostMapping
@ApiOperation("创建店铺")
public ResponseEntity<?> create(@RequestBody StoreCreateRequest request) {
diff --git a/oying-system/src/main/java/com/oying/modules/pc/store/rest/StoreCustomerController.java b/oying-system/src/main/java/com/oying/modules/pc/store/rest/StoreCustomerController.java
index 59900e0..b98c44f 100644
--- a/oying-system/src/main/java/com/oying/modules/pc/store/rest/StoreCustomerController.java
+++ b/oying-system/src/main/java/com/oying/modules/pc/store/rest/StoreCustomerController.java
@@ -7,6 +7,7 @@
import com.oying.modules.pc.product.service.ProductService;
import com.oying.modules.pc.store.domain.Store;
import com.oying.modules.pc.store.domain.dto.StoreQueryCriteria;
+import com.oying.modules.pc.store.domain.enums.StoreStatusEnum;
import com.oying.modules.pc.store.service.StoreQualificationService;
import com.oying.modules.pc.store.service.StoreQueryService;
import com.oying.modules.pc.store.service.StoreService;
@@ -47,6 +48,7 @@
@ApiOperation("查询店铺")
public ResponseEntity<?> getStoresByPage(StoreQueryCriteria criteria) {
criteria.setLimit(1000);
+ criteria.setBusinessStatus(StoreStatusEnum.OPEN.getValue());
PageResult<Store> pagedStores = storeQueryService.findPagedStores(criteria);
pagedStores.getContent().forEach(store -> store.setProducts(this.getProductsByStoreId(store.getStoreId())));
return ResponseEntity.ok(R.success(pagedStores));
@@ -67,7 +69,7 @@
public ResponseEntity<?> getStoreDetailsById(@PathVariable("storeId") Long storeId) {
Store store = storeService.getById(storeId);
if (ObjUtil.isNotEmpty(store)) {
- store.setQualifications(storeQualificationService.queryByStoreId(storeId));
+ store.setQualifications(storeQualificationService.getByStoreId(storeId));
}
return ResponseEntity.ok(R.success(store));
}
diff --git a/oying-system/src/main/java/com/oying/modules/pc/store/rest/StoreMerchantController.java b/oying-system/src/main/java/com/oying/modules/pc/store/rest/StoreMerchantController.java
index 1c19479..4f5f2f0 100644
--- a/oying-system/src/main/java/com/oying/modules/pc/store/rest/StoreMerchantController.java
+++ b/oying-system/src/main/java/com/oying/modules/pc/store/rest/StoreMerchantController.java
@@ -2,20 +2,18 @@
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.bean.copier.CopyOptions;
+import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.collection.ListUtil;
import cn.hutool.core.util.ObjUtil;
import cn.hutool.core.util.ObjectUtil;
-import com.oying.modules.pc.store.domain.dto.StoreUpdateRequest;
-import com.oying.modules.pc.store.service.StoreQualificationService;
-import com.oying.utils.R;
+import com.oying.exception.BadRequestException;
import com.oying.modules.pc.store.domain.Store;
-import com.oying.modules.pc.store.domain.dto.StoreCreateRequest;
-import com.oying.modules.pc.store.domain.dto.StoreFieldUpdateRequest;
-import com.oying.modules.pc.store.domain.dto.StoreQueryCriteria;
-import com.oying.modules.pc.store.service.StoreCreateService;
-import com.oying.modules.pc.store.service.StoreService;
+import com.oying.modules.pc.store.domain.dto.*;
+import com.oying.modules.pc.store.domain.enums.StoreStatusEnum;
+import com.oying.modules.pc.store.service.*;
import com.oying.modules.pc.store.view.StoreMerchantView;
import com.oying.modules.pc.store.view.StoreSimpleView;
+import com.oying.utils.R;
import com.oying.utils.SecurityUtils;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
@@ -23,12 +21,12 @@
import org.springframework.beans.BeanUtils;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
-import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import java.util.List;
import java.util.Optional;
+import java.util.Set;
import java.util.stream.Collectors;
/**
@@ -46,12 +44,14 @@
private final StoreService storeService;
private final StoreCreateService storeCreateService;
private final StoreQualificationService storeQualificationService;
+ private final StoreQueryService storeQueryService;
+ private final StoreMerchantService storeMerchantService;
@GetMapping(value = "/list")
@ApiOperation("查询所有店铺")
//@PreAuthorize("@el.check('merchant:store:list')")
public ResponseEntity<?> getList() {
- List<Store> stores = Optional.ofNullable(storeService.queryUserStores(SecurityUtils.getCurrentUserId())).orElse(ListUtil.empty());
+ List<Store> stores = Optional.ofNullable(storeService.getUserStores(SecurityUtils.getCurrentUserId())).orElse(ListUtil.empty());
return ResponseEntity.ok(R.success(stores));
}
@@ -59,7 +59,7 @@
@ApiOperation("查询所有店铺")
//@PreAuthorize("@el.check('merchant:store:list')")
public ResponseEntity<?> getSimpleStores() {
- List<Store> stores = Optional.ofNullable(storeService.queryUserStores(SecurityUtils.getCurrentUserId())).orElse(ListUtil.empty());
+ List<Store> stores = Optional.ofNullable(storeService.getUserStores(SecurityUtils.getCurrentUserId())).orElse(ListUtil.empty());
List<StoreSimpleView> storeViewList = stores.stream().map(i -> {
StoreSimpleView view = new StoreSimpleView();
BeanUtil.copyProperties(i, view, CopyOptions.create().setIgnoreNullValue(true));
@@ -84,7 +84,7 @@
public ResponseEntity<?> getStoreDetailsById(@PathVariable Long storeId) {
Store store = storeService.getById(storeId);
if (ObjUtil.isNotEmpty(store)) {
- store.setQualifications(storeQualificationService.queryByStoreId(storeId));
+ store.setQualifications(storeQualificationService.getByStoreId(storeId));
}
return ResponseEntity.ok(R.success(store));
}
@@ -93,19 +93,27 @@
@ApiOperation("创建店铺")
//@PreAuthorize("@el.check('merchant:store:create')")
public ResponseEntity<?> create(@RequestBody StoreCreateRequest request) {
- return ResponseEntity.status(HttpStatus.CREATED).body(storeCreateService.create(request));
+ return ResponseEntity.status(HttpStatus.CREATED).body(storeMerchantService.createStore(request));
+ }
+
+ @PostMapping(value = "/{storeId}/audit/submit")
+ @ApiOperation("提交审核")
+ //@PreAuthorize("@el.check('merchant:store:create')")
+ public ResponseEntity<?> submitAudit(@PathVariable Long storeId) {
+ storeMerchantService.submitStoreAudit(storeId);
+ return ResponseEntity.noContent().build();
}
/**
* 修改店铺信息
*/
- @PostMapping(value = "/{storeId}")
+ @PutMapping(value = "/{storeId}")
@ApiOperation("修改店铺")
//@PreAuthorize("@el.check('merchant:store:update')" +
// " and @storeMerchantOwnershipService.check(#storeId)")
public ResponseEntity<?> update(@PathVariable("storeId") Long storeId, @RequestBody StoreUpdateRequest request) {
request.setStoreId(ObjectUtil.defaultIfNull(request.getStoreId(), storeId));
- storeService.update(request);
+ storeMerchantService.updateStore(request);
return ResponseEntity.noContent().build();
}
@@ -119,7 +127,8 @@
public ResponseEntity<?> updateLogo(@PathVariable("storeId") Long storeId,
@Validated(value = StoreFieldUpdateRequest.UpdateStoreLogoImageGroup.class)
@RequestBody StoreFieldUpdateRequest request) {
- storeService.updateLogo(storeId, request.getLogoImageUploadId(), request.getVersion());
+ Long logeImageId = Optional.ofNullable(request.getLogoImageId()).orElse(Long.getLong(request.getLogoImageUploadId()));
+ storeService.updateLogo(storeId, logeImageId, request.getVersion());
return ResponseEntity.noContent().build();
}
@@ -133,7 +142,11 @@
public ResponseEntity<?> updateName(@PathVariable("storeId") Long storeId,
@Validated(value = StoreFieldUpdateRequest.UpdateStoreNameGroup.class)
@RequestBody StoreFieldUpdateRequest request) {
- storeService.updateName(storeId, request.getStoreName(), request.getVersion());
+ StoreUpdateRequest updateRequest = new StoreUpdateRequest();
+ updateRequest.setStoreId(storeId);
+ updateRequest.setStoreName(request.getStoreName());
+ storeMerchantService.updateStore(updateRequest);
+ //storeMerchantService.saveRevisionStore(request, StoreRevisionTypeEnum.NAME_UPDATE);
return ResponseEntity.noContent().build();
}
@@ -156,8 +169,8 @@
*/
@PatchMapping(value = "/{storeId}/contactPhone")
@ApiOperation("修改店铺联系电话")
- @PreAuthorize("@el.check('merchant:store:list')" +
- " and @storeMerchantOwnershipService.check(#storeId)")
+ /*@PreAuthorize("@el.check('merchant:store:list')" +
+ " and @storeMerchantOwnershipService.check(#storeId)")*/
public ResponseEntity<?> updateContactPhone(@PathVariable("storeId") Long storeId,
@Validated(value = StoreFieldUpdateRequest.UpdateStoreContactPhoneGroup.class)
@RequestBody StoreFieldUpdateRequest request) {
@@ -170,8 +183,8 @@
*/
@PatchMapping(value = "/{storeId}/address")
@ApiOperation("修改店铺地址")
- @PreAuthorize("@el.check('merchant:store:address')" +
- " and @storeMerchantOwnershipService.check(#storeId)")
+ /*@PreAuthorize("@el.check('merchant:store:address')" +
+ " and @storeMerchantOwnershipService.check(#storeId)")*/
public ResponseEntity<?> updateAddress(@PathVariable("storeId") Long storeId,
@Validated(value = StoreFieldUpdateRequest.UpdateStoreAddressGroup.class)
@RequestBody StoreFieldUpdateRequest request) {
@@ -184,8 +197,8 @@
*/
@PatchMapping(value = "/{storeId}/location")
@ApiOperation("修改店铺坐标")
- @PreAuthorize("@el.check('merchant:store:location')" +
- " and @storeMerchantOwnershipService.check(#storeId)")
+ /*@PreAuthorize("@el.check('merchant:store:location')" +
+ " and @storeMerchantOwnershipService.check(#storeId)")*/
public ResponseEntity<?> updateLocation(@PathVariable("storeId") Long storeId,
@Validated(value = StoreFieldUpdateRequest.UpdateStoreLocationGroup.class)
@RequestBody StoreFieldUpdateRequest request) {
@@ -198,8 +211,8 @@
*/
@PatchMapping(value = "/{storeId}/radius")
@ApiOperation("修改店铺配送范围")
- @PreAuthorize("@el.check('merchant:store:radius')" +
- " and @storeMerchantOwnershipService.check(#storeId)")
+ /*@PreAuthorize("@el.check('merchant:store:radius')" +
+ " and @storeMerchantOwnershipService.check(#storeId)")*/
public ResponseEntity<?> updateRadius(@PathVariable("storeId") Long storeId,
@Validated(value = StoreFieldUpdateRequest.UpdateStoreRadiusGroup.class)
@RequestBody StoreFieldUpdateRequest request) {
@@ -212,8 +225,8 @@
*/
@PatchMapping(value = "/{storeId}/platformCategory")
@ApiOperation("修改店铺绑定的经营类目")
- @PreAuthorize("@el.check('merchant:store:platformCategory')" +
- " and @storeMerchantOwnershipService.check(#storeId)")
+ /*@PreAuthorize("@el.check('merchant:store:platformCategory')" +
+ " and @storeMerchantOwnershipService.check(#storeId)")*/
public ResponseEntity<?> updatePlatformCategory(@PathVariable("storeId") Long storeId,
@Validated(value = StoreFieldUpdateRequest.UpdateStorePlatformCategoryGroup.class)
@RequestBody StoreFieldUpdateRequest request) {
@@ -226,8 +239,8 @@
*/
@PatchMapping(value = "/{storeId}/businessHours")
@ApiOperation("修改店铺营业时间")
- @PreAuthorize("@el.check('merchant:store:businessHours')" +
- " and @storeMerchantOwnershipService.check(#storeId)")
+ /*@PreAuthorize("@el.check('merchant:store:businessHours')" +
+ " and @storeMerchantOwnershipService.check(#storeId)")*/
public ResponseEntity<?> updateBusinessHours(@PathVariable("storeId") Long storeId,
@Validated(value = StoreFieldUpdateRequest.UpdateStoreBusinessHoursGroup.class)
@RequestBody StoreFieldUpdateRequest request) {
@@ -240,8 +253,8 @@
*/
@PatchMapping(value = "/{storeId}/deliveryMinimum")
@ApiOperation("修改起送金额")
- @PreAuthorize("@el.check('merchant:store:deliveryMinimum')" +
- " and @storeMerchantOwnershipService.check(#storeId)")
+ /*@PreAuthorize("@el.check('merchant:store:deliveryMinimum')" +
+ " and @storeMerchantOwnershipService.check(#storeId)")*/
public ResponseEntity<?> updateDeliveryMinimum(@PathVariable("storeId") Long storeId,
@Validated(value = StoreFieldUpdateRequest.UpdateStoreDeliveryMinimumGroup.class)
@RequestBody StoreFieldUpdateRequest request) {
@@ -254,8 +267,8 @@
*/
@PatchMapping(value = "/{storeId}/deliveryFee")
@ApiOperation("修改配送费用")
- @PreAuthorize("@el.check('merchant:store:deliveryFee')" +
- " and @storeMerchantOwnershipService.check(#storeId)")
+ /*@PreAuthorize("@el.check('merchant:store:deliveryFee')" +
+ " and @storeMerchantOwnershipService.check(#storeId)")*/
public ResponseEntity<?> updateDeliveryFee(@PathVariable("storeId") Long storeId,
@Validated(value = StoreFieldUpdateRequest.UpdateStoreDeliveryFeeGroup.class)
@RequestBody StoreFieldUpdateRequest request) {
@@ -267,13 +280,22 @@
* 修改状态
*/
@PatchMapping(value = "/{storeId}/businessStatus")
- @ApiOperation("修改状态")
- @PreAuthorize("@el.check('merchant:store:businessStatus')" +
- " and @storeMerchantOwnershipService.check(#storeId)")
+ @ApiOperation("修改营业状态")
+ /*@PreAuthorize("@el.check('merchant:store:businessStatus')" +
+ " and @storeMerchantOwnershipService.check(#storeId)")*/
public ResponseEntity<?> businessStatus(@PathVariable("storeId") Long storeId,
@Validated(value = StoreFieldUpdateRequest.UpdateStoreBusinessStatusGroup.class)
@RequestBody StoreFieldUpdateRequest request) {
- storeService.updateStatus(storeId, request.getBusinessStatus(), request.getVersion());
+ //storeService.updateStatus(storeId, request.getBusinessStatus(), request.getVersion());
+ Store store = new Store();
+ store.setStoreId(storeId);
+ store.setStatus(request.getBusinessStatus());
+ store.setBusinessStatus(request.getBusinessStatus());
+ Set<Integer> statusEnumSet = CollectionUtil.newHashSet(StoreStatusEnum.OPEN.getValue(), StoreStatusEnum.CLOSED.getValue());
+ if (!statusEnumSet.contains(request.getBusinessStatus())) {
+ throw new BadRequestException("状态错误");
+ }
+ storeMerchantService.updateBusinessStatus(store);
return ResponseEntity.noContent().build();
}
}
diff --git a/oying-system/src/main/java/com/oying/modules/pc/store/service/StoreAuditService.java b/oying-system/src/main/java/com/oying/modules/pc/store/service/StoreAuditService.java
new file mode 100644
index 0000000..180c43a
--- /dev/null
+++ b/oying-system/src/main/java/com/oying/modules/pc/store/service/StoreAuditService.java
@@ -0,0 +1,78 @@
+package com.oying.modules.pc.store.service;
+
+import com.oying.modules.pc.store.domain.StoreAudit;
+import com.oying.modules.pc.store.domain.dto.StoreAuditQueryCriteria;
+
+import java.util.List;
+import java.io.IOException;
+import javax.servlet.http.HttpServletResponse;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.oying.utils.PageResult;
+
+/**
+* @description 服务接口
+* @author lzp
+* @date 2025-07-01
+**/
+public interface StoreAuditService extends IService<StoreAudit> {
+
+ /**
+ * 查询数据分页
+ * @param criteria 条件
+ * @param page 分页参数
+ * @return PageResult
+ */
+ PageResult<StoreAudit> queryAll(StoreAuditQueryCriteria criteria, Page<Object> page);
+
+ /**
+ * 查询所有数据不分页
+ * @param criteria 条件参数
+ * @return List<StoreRevisionDto>
+ */
+ List<StoreAudit> queryAll(StoreAuditQueryCriteria criteria);
+
+ /**
+ * 店铺ID查询修订数据,
+ *
+ * @param storeId 必须的参数,不能为null
+ * @return 查询到的结果
+ */
+ StoreAudit getByStoreId(Long storeId);
+
+ /**
+ * 是否有待审记录
+ *
+ * @param storeId 必须的参数,不能为null
+ * @return 查询到的结果
+ */
+ boolean hasPendingByStoreId(Long storeId);
+
+ /**
+ * 创建
+ * @param resources /
+ */
+ void create(StoreAudit resources);
+
+ /**
+ * 编辑
+ * @param resources /
+ */
+ void update(StoreAudit resources, boolean isDirectUpdate);
+
+ /**
+ * 多选删除
+ * @param ids /
+ */
+ void deleteAll(List<Long> ids);
+
+ /**
+ * 导出数据
+ * @param all 待导出的数据
+ * @param response /
+ * @throws IOException /
+ */
+ void download(List<StoreAudit> all, HttpServletResponse response) throws IOException;
+
+ void processVerdict(StoreAudit resources);
+}
diff --git a/oying-system/src/main/java/com/oying/modules/pc/store/service/StoreMerchantService.java b/oying-system/src/main/java/com/oying/modules/pc/store/service/StoreMerchantService.java
new file mode 100644
index 0000000..fdf0513
--- /dev/null
+++ b/oying-system/src/main/java/com/oying/modules/pc/store/service/StoreMerchantService.java
@@ -0,0 +1,16 @@
+package com.oying.modules.pc.store.service;
+
+import com.oying.modules.pc.store.domain.Store;
+import com.oying.modules.pc.store.domain.dto.StoreCreateRequest;
+import com.oying.modules.pc.store.domain.dto.StoreUpdateRequest;
+import com.oying.modules.pc.store.events.StoreAuditVerdictEvent;
+
+public interface StoreMerchantService {
+
+ Store createStore(StoreCreateRequest request);
+ void updateStore(StoreUpdateRequest request);
+ void updateBusinessStatus(Store resources);
+ void submitStoreAudit(Long storeId);
+ void handleStoreAudit(StoreAuditVerdictEvent event);
+
+}
diff --git a/oying-system/src/main/java/com/oying/modules/pc/store/service/StoreQualificationService.java b/oying-system/src/main/java/com/oying/modules/pc/store/service/StoreQualificationService.java
index 7e23f4e..c273757 100644
--- a/oying-system/src/main/java/com/oying/modules/pc/store/service/StoreQualificationService.java
+++ b/oying-system/src/main/java/com/oying/modules/pc/store/service/StoreQualificationService.java
@@ -44,7 +44,7 @@
* @param storeId 条件参数
* @return List<StoreQualification>
*/
- List<StoreQualification> queryByStoreId(Long storeId);
+ List<StoreQualification> getByStoreId(Long storeId);
/**
* 创建
diff --git a/oying-system/src/main/java/com/oying/modules/pc/store/service/StoreService.java b/oying-system/src/main/java/com/oying/modules/pc/store/service/StoreService.java
index f1c3e56..f5443f1 100644
--- a/oying-system/src/main/java/com/oying/modules/pc/store/service/StoreService.java
+++ b/oying-system/src/main/java/com/oying/modules/pc/store/service/StoreService.java
@@ -10,6 +10,7 @@
import java.math.BigDecimal;
import java.time.LocalTime;
import java.util.List;
+import java.util.Set;
/**
* 店铺基础信息Service接口
@@ -23,15 +24,25 @@
List<Store> queryAll(StoreQueryCriteria criteria);
+ List<Long> queryStoreIds(StoreQueryCriteria criteria);
+
Store getMerchantStore(Long merchantId);
- List<Store> queryUserStores(Long userId);
+ List<Store> getStoresByIds(Set<Long> ids);
+
+ List<Store> getUserStores(Long userId);
+
+ Store getOrThrow(Long storeId, Long version);
+
+ void create(Store resources);
Store create(StoreCreateRequest request);
+ boolean update(Store resources, boolean isDirectUpdate);
+
boolean update(StoreUpdateRequest request);
- boolean updateLogo(Long storeId, String logo, Long version);
+ boolean updateLogo(Long storeId, Long logoImageId, Long version);
boolean updateName(Long storeId, String storeName, Long version);
@@ -58,4 +69,6 @@
boolean existsByIdAndMerchantId(Long storeId, Long merchantId);
boolean existsStoreName(String storeName);
+
+ boolean bindUser(Long store);
}
diff --git a/oying-system/src/main/java/com/oying/modules/pc/store/service/impl/StoreAuditServiceImpl.java b/oying-system/src/main/java/com/oying/modules/pc/store/service/impl/StoreAuditServiceImpl.java
new file mode 100644
index 0000000..3411955
--- /dev/null
+++ b/oying-system/src/main/java/com/oying/modules/pc/store/service/impl/StoreAuditServiceImpl.java
@@ -0,0 +1,122 @@
+package com.oying.modules.pc.store.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.oying.exception.BadRequestException;
+import com.oying.modules.pc.common.core.constrant.AuditStatusEnum;
+import com.oying.modules.pc.store.domain.StoreAudit;
+import com.oying.modules.pc.store.domain.dto.StoreAuditQueryCriteria;
+import com.oying.modules.pc.store.events.StoreAuditVerdictEvent;
+import com.oying.modules.pc.store.mapper.StoreAuditMapper;
+import com.oying.modules.pc.store.service.StoreAuditService;
+import com.oying.utils.FileUtil;
+import com.oying.utils.PageResult;
+import com.oying.utils.PageUtil;
+import lombok.RequiredArgsConstructor;
+import org.springframework.context.ApplicationEventPublisher;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author lzp
+ * @description 服务实现
+ * @date 2025-07-01
+ **/
+@Service
+@RequiredArgsConstructor
+public class StoreAuditServiceImpl extends ServiceImpl<StoreAuditMapper, StoreAudit> implements StoreAuditService {
+
+ private final ApplicationEventPublisher eventPublisher;
+
+ private final StoreAuditMapper storeAuditMapper;
+
+ @Override
+ public PageResult<StoreAudit> queryAll(StoreAuditQueryCriteria criteria, Page<Object> page) {
+ return PageUtil.toPage(storeAuditMapper.findAll(criteria, page));
+ }
+
+ @Override
+ public List<StoreAudit> queryAll(StoreAuditQueryCriteria criteria) {
+ return storeAuditMapper.findAll(criteria);
+ }
+
+ @Override
+ public StoreAudit getByStoreId(Long storeId) {
+ LambdaQueryWrapper<StoreAudit> wrapper = new LambdaQueryWrapper<StoreAudit>()
+ .eq(StoreAudit::getStoreId, storeId);
+ return storeAuditMapper.selectOne(wrapper);
+ }
+
+ @Override
+ public boolean hasPendingByStoreId(Long storeId) {
+ LambdaQueryWrapper<StoreAudit> wrapper = new LambdaQueryWrapper<StoreAudit>()
+ .eq(StoreAudit::getStoreId, storeId)
+ .eq(StoreAudit::getStatus, AuditStatusEnum.PENDING.getValue());
+ return storeAuditMapper.selectCount(wrapper) > 0;
+ }
+
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public void create(StoreAudit resources) {
+ storeAuditMapper.insert(resources);
+ }
+
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public void update(StoreAudit resources, boolean isDirectUpdate) {
+ if (isDirectUpdate) {
+ storeAuditMapper.updateById(resources);
+ } else {
+ StoreAudit existingRevision = this.getById(resources.getAuditor());
+ existingRevision.copy(resources);
+ storeAuditMapper.updateById(existingRevision);
+ }
+ }
+
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public void processVerdict(StoreAudit resources) {
+ AuditStatusEnum newAuditStatus = AuditStatusEnum.get(resources.getStatus());
+ StoreAudit existingAudit = this.getById(resources.getAuditId());
+ AuditStatusEnum existingAuditStatus = AuditStatusEnum.getOrDefault(existingAudit.getStatus(), AuditStatusEnum.DRAFT);
+ if (!existingAuditStatus.nextContains(newAuditStatus)) {
+ throw new BadRequestException("审核状态错误");
+ }
+ existingAudit.copy(resources);
+ storeAuditMapper.updateById(existingAudit);
+ eventPublisher.publishEvent(new StoreAuditVerdictEvent(existingAudit.getAuditId()));
+ }
+
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public void deleteAll(List<Long> ids) {
+ storeAuditMapper.deleteBatchIds(ids);
+ }
+
+ @Override
+ public void download(List<StoreAudit> all, HttpServletResponse response) throws IOException {
+ List<Map<String, Object>> list = new ArrayList<>();
+ for (StoreAudit storeRevision : all) {
+ Map<String, Object> map = new LinkedHashMap<>();
+ map.put("审核ID", storeRevision.getAuditId());
+ map.put("店铺ID", storeRevision.getStoreId());
+ map.put("审批ID", storeRevision.getAuditId());
+ map.put("类型", storeRevision.getType());
+ map.put("新数据", storeRevision.getData());
+ map.put("创建人", storeRevision.getCreateBy());
+ map.put("创建时间", storeRevision.getCreateTime());
+ map.put("修改人", storeRevision.getUpdateBy());
+ map.put("修改时间", storeRevision.getUpdateTime());
+ list.add(map);
+ }
+ FileUtil.downloadExcel(list, response);
+ }
+}
diff --git a/oying-system/src/main/java/com/oying/modules/pc/store/service/impl/StoreCreateServiceImpl.java b/oying-system/src/main/java/com/oying/modules/pc/store/service/impl/StoreCreateServiceImpl.java
index a2f9b79..32437e1 100644
--- a/oying-system/src/main/java/com/oying/modules/pc/store/service/impl/StoreCreateServiceImpl.java
+++ b/oying-system/src/main/java/com/oying/modules/pc/store/service/impl/StoreCreateServiceImpl.java
@@ -3,7 +3,7 @@
import com.oying.modules.pc.store.domain.Store;
import com.oying.modules.pc.store.domain.dto.StoreCreateRequest;
import com.oying.modules.pc.store.service.StoreCreateService;
-import com.oying.modules.pc.store.service.StoreService;
+import com.oying.modules.pc.store.service.StoreMerchantService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
@@ -14,10 +14,10 @@
@RequiredArgsConstructor
public class StoreCreateServiceImpl implements StoreCreateService {
- private final StoreService storeService;
+ private final StoreMerchantService storeMerchantService;
@Transactional(rollbackFor = Exception.class)
public Store create(StoreCreateRequest request) {
- return storeService.create(request);
+ return storeMerchantService.createStore(request);
}
}
diff --git a/oying-system/src/main/java/com/oying/modules/pc/store/service/impl/StoreMerchantServiceImpl.java b/oying-system/src/main/java/com/oying/modules/pc/store/service/impl/StoreMerchantServiceImpl.java
new file mode 100644
index 0000000..f3ce233
--- /dev/null
+++ b/oying-system/src/main/java/com/oying/modules/pc/store/service/impl/StoreMerchantServiceImpl.java
@@ -0,0 +1,229 @@
+package com.oying.modules.pc.store.service.impl;
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.bean.copier.CopyOptions;
+import cn.hutool.core.collection.CollectionUtil;
+import cn.hutool.core.collection.ListUtil;
+import com.alibaba.fastjson2.JSON;
+import com.alibaba.fastjson2.JSONObject;
+import com.oying.exception.BadRequestException;
+import com.oying.modules.pc.common.ValueUpdate;
+import com.oying.modules.pc.common.core.constrant.AuditStatusEnum;
+import com.oying.modules.pc.store.converter.StoreAssembler;
+import com.oying.modules.pc.store.converter.StoreQualificationAssembler;
+import com.oying.modules.pc.store.domain.Store;
+import com.oying.modules.pc.store.domain.StoreAudit;
+import com.oying.modules.pc.store.domain.StoreQualification;
+import com.oying.modules.pc.store.domain.dto.*;
+import com.oying.modules.pc.store.domain.enums.StoreChangeTypeEnum;
+import com.oying.modules.pc.store.domain.enums.StoreStatusEnum;
+import com.oying.modules.pc.store.events.StoreAuditVerdictEvent;
+import com.oying.modules.pc.store.service.StoreAuditService;
+import com.oying.modules.pc.store.service.StoreMerchantService;
+import com.oying.modules.pc.store.service.StoreQualificationService;
+import com.oying.modules.pc.store.service.StoreService;
+import com.oying.service.BucketStorageService;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.context.event.EventListener;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+@Slf4j
+@Service
+@RequiredArgsConstructor
+public class StoreMerchantServiceImpl implements StoreMerchantService {
+
+ private final BucketStorageService bucketStorageService;
+ private final StoreService storeService;
+ private final StoreQualificationService qualificationService;
+ private final StoreAuditService auditService;
+
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public Store createStore(StoreCreateRequest request) {
+ Store store = StoreAssembler.to(request);
+ storeService.create(store);
+ this.processQualificationCreate(store, request.getQualificationList());
+ storeService.bindUser(store.getStoreId());
+ return store;
+ }
+
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public void updateStore(StoreUpdateRequest request) {
+ Store existingStore = storeService.getOrThrow(request.getStoreId(), request.getVersion());
+ AuditStatusEnum existingStatus = AuditStatusEnum.getOrDefault(existingStore.getAuditStatus(), AuditStatusEnum.DRAFT);
+ if (AuditStatusEnum.DRAFT.equals(existingStatus)) {
+ this.processStoreImagesUpdate(request, existingStore);
+ this.processQualificationUpdate(request.getDeletedQualificationIds(), request.getUpdatedQualifications(), request.getNewQualifications());
+ BeanUtil.copyProperties(request, existingStore, CopyOptions.create().setIgnoreNullValue(true));
+ storeService.update(existingStore, true);
+ } else if (AuditStatusEnum.APPROVED.equals(existingStatus)) {
+ Store newStore = new Store();
+ newStore.setQualifications(ListUtil.of());
+ BeanUtil.copyProperties(request, newStore, CopyOptions.create().setIgnoreNullValue(true));
+ List<StoreQualification> existingQualifications = qualificationService.getByStoreId(request.getStoreId());
+ if (CollectionUtil.isNotEmpty(request.getDeletedQualificationIds())) {
+ List<StoreQualification> filteredQualifications = existingQualifications.stream()
+ .filter(qualification -> !request.getDeletedQualificationIds().contains(qualification.getQualificationId()))
+ .collect(Collectors.toList());
+ newStore.getQualifications().addAll(filteredQualifications);
+ }
+ List<StoreQualification> updatedQualifications = ListUtil.of();
+ if (CollectionUtil.isNotEmpty(request.getUpdatedQualifications())) {
+ Set<Long> updatedQualificationIdSet = request.getUpdatedQualifications().stream().map(StoreQualificationUpdateRequest::getQualificationId).collect(Collectors.toSet());
+ List<StoreQualification> filteredQualifications = newStore.getQualifications().stream()
+ .filter(qualification -> !updatedQualificationIdSet.contains(qualification.getQualificationId()))
+ .collect(Collectors.toList());
+ newStore.setQualifications(filteredQualifications);
+ request.getUpdatedQualifications().forEach(i -> {
+ StoreQualification qualificationUpdate = new StoreQualification();
+ BeanUtil.copyProperties(i, qualificationUpdate, CopyOptions.create().setIgnoreNullValue(true));
+ newStore.getQualifications().add(qualificationUpdate);
+ updatedQualifications.add(qualificationUpdate);
+ });
+ }
+ if (CollectionUtil.isNotEmpty(request.getNewQualifications())) {
+ newStore.getQualifications().addAll(request.getNewQualifications());
+ }
+ StoreRevisionRecord revisionRecord = new StoreRevisionRecord();
+ BeanUtil.copyProperties(request, revisionRecord, CopyOptions.create().setIgnoreNullValue(true));
+ StoreAuditData auditData = new StoreAuditData();
+ auditData.setStore(newStore);
+ auditData.setRevisionRecord(revisionRecord);
+ this.createLatestModification(request.getStoreId(), StoreChangeTypeEnum.STORE_UPDATE, auditData);
+ }
+ }
+
+ @Override
+ public void updateBusinessStatus(Store resources) {
+ StoreStatusEnum businessStatus = StoreStatusEnum.getOrDefault(resources.getBusinessStatus(), StoreStatusEnum.DRAFT);
+ Store existingStore = storeService.getOrThrow(resources.getStoreId(), resources.getVersion());
+ AuditStatusEnum existingStatus = AuditStatusEnum.getOrDefault(existingStore.getAuditStatus(), AuditStatusEnum.DRAFT);
+ if (StoreStatusEnum.OPEN.equals(businessStatus) && !AuditStatusEnum.APPROVED.equals(existingStatus)) {
+ throw new BadRequestException("店铺未审核");
+ }
+ storeService.updateStatus(existingStore.getStoreId(), businessStatus.getValue(), existingStore.getVersion());
+ }
+
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public void submitStoreAudit(Long storeId) {
+ Store existingStore = storeService.getById(storeId);
+ // 更新店铺状态
+ existingStore.setStatus(AuditStatusEnum.PENDING.getValue());
+ existingStore.setAuditStatus(AuditStatusEnum.PENDING.getValue());
+ storeService.update(existingStore, true);
+ // 创建新的审核
+ existingStore.setQualifications(qualificationService.getByStoreId(existingStore.getStoreId()));
+ StoreRevisionRecord revisionRecord = new StoreRevisionRecord();
+ BeanUtil.copyProperties(existingStore, revisionRecord, CopyOptions.create().setIgnoreNullValue(true));
+ StoreAuditData auditData = new StoreAuditData();
+ auditData.setStore(existingStore);
+ auditData.setRevisionRecord(revisionRecord);
+ this.createLatestModification(existingStore.getStoreId(), StoreChangeTypeEnum.NEW_STORE, auditData);
+ }
+
+ @Override
+ @EventListener
+ @Transactional(rollbackFor = Exception.class)
+ public void handleStoreAudit(StoreAuditVerdictEvent event) {
+ try {
+ StoreAudit audit = auditService.getById(event.getAuditId());
+ StoreChangeTypeEnum changeType = StoreChangeTypeEnum.valueOf(audit.getType());
+ switch (changeType) {
+ case NEW_STORE:
+ this.handleNewStoreAuditEvent(audit);
+ return;
+ case STORE_UPDATE:
+ this.handleStoreUpdateAuditEvent(audit);
+ }
+ } catch (Exception e) {
+ log.error("处理店铺审核结果异常", e);
+ }
+ }
+
+ private void processQualificationCreate(Store store, List<StoreQualificationCreateRequest> qualificationRequests) {
+ if (CollectionUtil.isNotEmpty(qualificationRequests)) {
+ List<StoreQualification> storeQualificationList = qualificationRequests.stream().map(i -> {
+ i.setStoreId(store.getStoreId());
+ return StoreQualificationAssembler.to(i);
+ }).collect(Collectors.toList());
+ storeQualificationList.forEach(i -> i.setStoreId(store.getStoreId()));
+ qualificationService.batchCreate(storeQualificationList);
+ store.setQualifications(storeQualificationList);
+ }
+ }
+
+ private List<Long> getDeleteImageIds(List<ValueUpdate<Long>> imageValues) {
+ List<Long> deleteImageIds = new ArrayList<>();
+ for (ValueUpdate<Long> imageValue : imageValues) {
+ if (imageValue.isChangeAndOldValueNotEmpty()) {
+ deleteImageIds.add(imageValue.getOldValue());
+ }
+ }
+ return deleteImageIds;
+ }
+
+ private void processStoreImagesUpdate(StoreUpdateRequest request, Store existingStore) {
+ List<ValueUpdate<Long>> imageValues = ListUtil.toList(
+ new ValueUpdate<>(request.getLogoImageId(), existingStore.getLogoImageId()),
+ new ValueUpdate<>(request.getCoverImageId(), existingStore.getCoverImageId())
+ );
+ List<Long> ids = this.getDeleteImageIds(imageValues);
+ if (CollectionUtil.isNotEmpty(ids)) {
+ bucketStorageService.deleteAll(ids);
+ }
+ }
+
+ private void processQualificationUpdate(List<Long> ids, List<StoreQualificationUpdateRequest> updateRequests,
+ List<StoreQualification> newQualifications) {
+ if (CollectionUtil.isNotEmpty(ids)) {
+ qualificationService.deleteAll(ids);
+ }
+ if (CollectionUtil.isNotEmpty(updateRequests)) {
+ qualificationService.batchUpdate(updateRequests);
+ }
+ if (CollectionUtil.isNotEmpty(newQualifications)) {
+ qualificationService.batchCreate(newQualifications);
+ }
+ }
+
+ private void createLatestModification(Long storeId, StoreChangeTypeEnum changeType, StoreAuditData auditData) {
+ if (auditService.hasPendingByStoreId(storeId)) {
+ throw new BadRequestException("已有审核的内容");
+ }
+ StoreAudit storeAudit = new StoreAudit();
+ storeAudit.setStoreId(storeId);
+ storeAudit.setType(changeType.name());
+ storeAudit.setData(JSON.toJSONString(auditData));
+ storeAudit.setStatus(AuditStatusEnum.PENDING.getValue());
+ auditService.create(storeAudit);
+ }
+
+ private void handleNewStoreAuditEvent(StoreAudit audit) {
+ Store existingStore = storeService.getById(audit.getStoreId());
+ existingStore.setStatus(audit.getStatus());
+ existingStore.setAuditStatus(audit.getStatus());
+ storeService.updateById(existingStore);
+ }
+
+ private void handleStoreUpdateAuditEvent(StoreAudit audit) {
+ AuditStatusEnum auditStatus = AuditStatusEnum.get(audit.getStatus());
+ if (AuditStatusEnum.APPROVED.equals(auditStatus)) {
+ StoreAuditData data = JSONObject.parseObject(audit.getData(), StoreAuditData.class);
+ Store existingStore = storeService.getById(audit.getStoreId());
+ StoreRevisionRecord revisionRecord = data.getRevisionRecord();
+ BeanUtil.copyProperties(revisionRecord, existingStore, CopyOptions.create().setIgnoreNullValue(true));
+ storeService.updateById(existingStore);
+ this.processQualificationUpdate(revisionRecord.getDeletedQualificationIds(), revisionRecord.getUpdatedQualifications(),
+ revisionRecord.getNewQualifications());
+ }
+ }
+}
diff --git a/oying-system/src/main/java/com/oying/modules/pc/store/service/impl/StoreQualificationServiceImpl.java b/oying-system/src/main/java/com/oying/modules/pc/store/service/impl/StoreQualificationServiceImpl.java
index 10b5e26..63fcd32 100644
--- a/oying-system/src/main/java/com/oying/modules/pc/store/service/impl/StoreQualificationServiceImpl.java
+++ b/oying-system/src/main/java/com/oying/modules/pc/store/service/impl/StoreQualificationServiceImpl.java
@@ -57,7 +57,7 @@
}
@Override
- public List<StoreQualification> queryByStoreId(Long storeId) {
+ public List<StoreQualification> getByStoreId(Long storeId) {
LambdaQueryWrapper<StoreQualification> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(StoreQualification::getStoreId, storeId);
return storeQualificationMapper.selectList(wrapper);
diff --git a/oying-system/src/main/java/com/oying/modules/pc/store/service/impl/StoreQueryServiceImpl.java b/oying-system/src/main/java/com/oying/modules/pc/store/service/impl/StoreQueryServiceImpl.java
index 776807d..88e77e6 100644
--- a/oying-system/src/main/java/com/oying/modules/pc/store/service/impl/StoreQueryServiceImpl.java
+++ b/oying-system/src/main/java/com/oying/modules/pc/store/service/impl/StoreQueryServiceImpl.java
@@ -1,10 +1,9 @@
package com.oying.modules.pc.store.service.impl;
+
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.collection.ListUtil;
-import cn.hutool.core.util.NumberUtil;
import com.oying.modules.pc.store.domain.Store;
import com.oying.modules.pc.store.domain.dto.StoreQueryCriteria;
-import com.oying.modules.pc.store.mapper.StoreMapper;
import com.oying.modules.pc.store.service.StoreQueryService;
import com.oying.modules.pc.store.service.StoreService;
import com.oying.utils.PageResult;
@@ -27,7 +26,6 @@
private final RedisTemplate<Object, Object> redisTemplate;
private final StoreService storeService;
- private final StoreMapper storeMapper;
@Override
public PageResult<Store> findPagedStores(StoreQueryCriteria criteria) {
@@ -39,7 +37,7 @@
Long total = redisTemplate.opsForZSet().size(setKey);
if (total == null || total == 0) {
// 初始化缓存
- List<Long> ids = storeMapper.queryStoreIds(criteria);
+ List<Long> ids = storeService.queryStoreIds(criteria);
int index = 0;
for (Long id : ids) {
redisTemplate.opsForZSet().add(setKey, id, index++);
@@ -56,17 +54,32 @@
Set<Long> storeIds = Optional.ofNullable(redisTemplate.opsForZSet().range(setKey, offset, end))
.orElse(Collections.emptySet())
.stream()
- .map(i-> (Long) i)
+ .map(i -> (Long) i)
.collect(Collectors.toSet());
// 3. 获取详情数据]
List<Store> stores = Optional.of(storeIds)
.filter(CollectionUtil::isNotEmpty)
- .map(storeService::listByIds)
+ .map(storeService::getStoresByIds)
.orElse(ListUtil.toList());
+
+ stores.forEach(u -> u.setDeliveryDuration(distanceCalculation(criteria.getLatitude(), criteria.getLongitude(), u.getLatitude(), u.getLongitude())));
page.setContent(stores);
page.setTotalElements(total);
return page;
}
+
+ private Integer distanceCalculation(double lat1, double lon1, double lat2, double lon2) {
+ // 地球半径(千米)
+ final int R = 6371;
+ // 将纬度、经度从度转换为弧度
+ double latDistance = Math.toRadians(lat2 - lat1);
+ double lonDistance = Math.toRadians(lon2 - lon1);
+ double a = Math.sin(latDistance / 2) * Math.sin(latDistance / 2)
+ + Math.cos(Math.toRadians(lat1)) * Math.cos(Math.toRadians(lat2))
+ * Math.sin(lonDistance / 2) * Math.sin(lonDistance / 2);
+ double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
+ return new Double(R * c * 1000).intValue();
+ }
}
diff --git a/oying-system/src/main/java/com/oying/modules/pc/store/service/impl/StoreServiceImpl.java b/oying-system/src/main/java/com/oying/modules/pc/store/service/impl/StoreServiceImpl.java
index 8531306..253d66c 100644
--- a/oying-system/src/main/java/com/oying/modules/pc/store/service/impl/StoreServiceImpl.java
+++ b/oying-system/src/main/java/com/oying/modules/pc/store/service/impl/StoreServiceImpl.java
@@ -1,7 +1,5 @@
package com.oying.modules.pc.store.service.impl;
-import cn.hutool.core.collection.CollectionUtil;
-import cn.hutool.core.collection.ListUtil;
import cn.hutool.core.util.ObjUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
@@ -9,21 +7,15 @@
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.oying.exception.BadRequestException;
import com.oying.exception.EntityNotFoundException;
-import com.oying.modules.pc.common.ValueUpdate;
import com.oying.modules.pc.store.converter.StoreAssembler;
-import com.oying.modules.pc.store.converter.StoreQualificationAssembler;
import com.oying.modules.pc.store.domain.Store;
-import com.oying.modules.pc.store.domain.StoreQualification;
import com.oying.modules.pc.store.domain.StoreUser;
import com.oying.modules.pc.store.domain.dto.StoreCreateRequest;
-import com.oying.modules.pc.store.domain.dto.StoreQualificationCreateRequest;
import com.oying.modules.pc.store.domain.dto.StoreQueryCriteria;
import com.oying.modules.pc.store.domain.dto.StoreUpdateRequest;
import com.oying.modules.pc.store.mapper.StoreMapper;
import com.oying.modules.pc.store.mapper.StoreUserMapper;
-import com.oying.modules.pc.store.service.StoreQualificationService;
import com.oying.modules.pc.store.service.StoreService;
-import com.oying.service.BucketStorageService;
import com.oying.utils.PageResult;
import com.oying.utils.PageUtil;
import com.oying.utils.SecurityUtils;
@@ -35,11 +27,10 @@
import java.math.BigDecimal;
import java.time.LocalTime;
-import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
-import java.util.stream.Collectors;
+import java.util.Set;
/**
* 店铺Service业务层处理
@@ -54,8 +45,6 @@
private final StoreMapper storeMapper;
private final StoreUserMapper storeUserMapper;
- private final StoreQualificationService qualificationService;
- private final BucketStorageService bucketStorageService;
@Override
public PageResult<Store> queryByPage(StoreQueryCriteria criteria) {
@@ -69,13 +58,44 @@
}
@Override
+ public List<Long> queryStoreIds(StoreQueryCriteria criteria) {
+ return storeMapper.queryStoreIds(criteria);
+ }
+
+ @Override
public Store getMerchantStore(Long merchantId) {
return storeMapper.selectStoreByMerchantId(merchantId);
}
@Override
- public List<Store> queryUserStores(Long userId) {
+ public List<Store> getStoresByIds(Set<Long> ids) {
+ return storeMapper.queryByIds(ids);
+ }
+
+ @Override
+ public List<Store> getUserStores(Long userId) {
return storeMapper.queryUserStores(userId);
+ }
+
+ @Override
+ public Store getOrThrow(Long storeId, Long version) {
+ Objects.requireNonNull(storeId, String.format("方法 '%s' 调用失败:参数 'storeId'(店铺ID)不能为 null", "findOrThrow"));
+ LambdaQueryWrapper<Store> wrapper = new LambdaQueryWrapper<>();
+ wrapper.eq(Store::getStoreId, storeId);
+ if (ObjUtil.isNotEmpty(version)) {
+ wrapper.eq(Store::getVersion, version);
+ }
+ Store existingStore = storeMapper.selectOne(wrapper);
+ if (ObjUtil.isEmpty(existingStore)) {
+ throw new EntityNotFoundException(Store.class, "storeId", storeId.toString());
+ }
+ return existingStore;
+ }
+
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public void create(Store resources) {
+ storeMapper.insert(resources);
}
@Override
@@ -88,17 +108,26 @@
// 创建店铺
Store store = StoreAssembler.to(request);
storeMapper.insert(store);
- this.processQualificationCreate(store, request.getQualificationList());
- this.bindUser(store.getStoreId());
return store;
}
@Override
@Transactional(rollbackFor = Exception.class)
+ public boolean update(Store resources, boolean isDirectUpdate) {
+ LambdaUpdateWrapper<Store> wrapper = this.createLambdaUpdateWrapper(resources.getStoreId(), resources.getVersion());
+ if (isDirectUpdate) {
+ return this.update(resources, wrapper);
+ } else {
+ Store existingStore = this.getById(resources.getStoreId());
+ existingStore.copy(resources);
+ return this.update(existingStore, wrapper);
+ }
+ }
+
+ @Override
+ @Transactional(rollbackFor = Exception.class)
public boolean update(StoreUpdateRequest request) {
- Store existingStore = this.findOrThrow(request);
- this.processImagesUpdate(request, existingStore);
- this.processQualificationUpdate(request);
+ Store existingStore = this.getOrThrow(request.getStoreId(), request.getVersion());
existingStore.copy(StoreAssembler.to(request));
LambdaUpdateWrapper<Store> wrapper = this.createLambdaUpdateWrapper(existingStore.getStoreId(), existingStore.getVersion());
return this.update(existingStore, wrapper);
@@ -106,16 +135,16 @@
@Override
@Transactional(rollbackFor = Exception.class)
- public boolean updateLogo(Long storeId, String logo, Long version) {
- Store existingStore = this.findOrThrow(storeId, version);
+ public boolean updateLogo(Long storeId, Long logoImageId, Long version) {
+ Store existingStore = this.getOrThrow(storeId, version);
LambdaUpdateWrapper<Store> wrapper = this.createLambdaUpdateWrapper(storeId, existingStore.getVersion())
- .set(Store::getLogoImageId, logo);
+ .set(Store::getLogoImageId, logoImageId);
return update(wrapper);
}
@Override
public boolean updateName(Long storeId, String storeName, Long version) {
- Store existingStore = this.findOrThrow(storeId, version);
+ Store existingStore = this.getOrThrow(storeId, version);
LambdaUpdateWrapper<Store> wrapper = this.createLambdaUpdateWrapper(storeId, existingStore.getVersion())
.set(Store::getStoreName, storeName);
return update(wrapper);
@@ -123,7 +152,7 @@
@Override
public boolean updateDescription(Long storeId, String description, Long version) {
- Store existingStore = this.findOrThrow(storeId, version);
+ Store existingStore = this.getOrThrow(storeId, version);
LambdaUpdateWrapper<Store> wrapper = this.createLambdaUpdateWrapper(storeId, existingStore.getVersion())
.set(Store::getDescription, description);
return update(wrapper);
@@ -131,7 +160,7 @@
@Override
public boolean updateContactPhone(Long storeId, String contactPhone, Long version) {
- Store existingStore = this.findOrThrow(storeId, version);
+ Store existingStore = this.getOrThrow(storeId, version);
LambdaUpdateWrapper<Store> wrapper = this.createLambdaUpdateWrapper(storeId, existingStore.getVersion())
.set(Store::getContactPhone, contactPhone);
return update(wrapper);
@@ -139,7 +168,7 @@
@Override
public boolean updateAddress(Long storeId, String address, Long version) {
- Store existingStore = this.findOrThrow(storeId, version);
+ Store existingStore = this.getOrThrow(storeId, version);
LambdaUpdateWrapper<Store> wrapper = this.createLambdaUpdateWrapper(storeId, existingStore.getVersion())
.set(Store::getAddress, address);
return update(wrapper);
@@ -147,7 +176,7 @@
@Override
public boolean updateLocation(Long storeId, Double longitude, Double latitude, Long version) {
- Store existingStore = this.findOrThrow(storeId, version);
+ Store existingStore = this.getOrThrow(storeId, version);
LambdaUpdateWrapper<Store> wrapper = this.createLambdaUpdateWrapper(storeId, existingStore.getVersion())
.set(Store::getLongitude, longitude)
.set(Store::getLatitude, latitude);
@@ -156,7 +185,7 @@
@Override
public boolean updateRadius(Long storeId, Integer radius, Long version) {
- Store existingStore = this.findOrThrow(storeId, version);
+ Store existingStore = this.getOrThrow(storeId, version);
LambdaUpdateWrapper<Store> wrapper = this.createLambdaUpdateWrapper(storeId, existingStore.getVersion())
.set(Store::getRadius, radius);
return update(wrapper);
@@ -164,7 +193,7 @@
@Override
public boolean updatePlatformCategory(Long storeId, Long platformCategory, Long version) {
- Store existingStore = this.findOrThrow(storeId, version);
+ Store existingStore = this.getOrThrow(storeId, version);
LambdaUpdateWrapper<Store> wrapper = this.createLambdaUpdateWrapper(storeId, existingStore.getVersion())
.set(Store::getPlatformCategoryId, platformCategory);
return update(wrapper);
@@ -172,7 +201,7 @@
@Override
public boolean updateBusinessHours(Long storeId, LocalTime openTime, LocalTime endTime, Long version) {
- Store existingStore = this.findOrThrow(storeId, version);
+ Store existingStore = this.getOrThrow(storeId, version);
LambdaUpdateWrapper<Store> wrapper = this.createLambdaUpdateWrapper(storeId, existingStore.getVersion())
.set(Store::getOpenTime, openTime)
.set(Store::getCloseTime, endTime);
@@ -181,7 +210,7 @@
@Override
public boolean updateDeliveryMinimum(Long storeId, BigDecimal deliveryMinimum, Long version) {
- Store existingStore = this.findOrThrow(storeId, version);
+ Store existingStore = this.getOrThrow(storeId, version);
LambdaUpdateWrapper<Store> wrapper = this.createLambdaUpdateWrapper(storeId, existingStore.getVersion())
.set(Store::getDeliveryMinimum, deliveryMinimum);
return update(wrapper);
@@ -189,7 +218,7 @@
@Override
public boolean updateDeliveryFee(Long storeId, BigDecimal deliveryFee, Long version) {
- Store existingStore = this.findOrThrow(storeId, version);
+ Store existingStore = this.getOrThrow(storeId, version);
LambdaUpdateWrapper<Store> wrapper = this.createLambdaUpdateWrapper(storeId, existingStore.getVersion())
.set(Store::getDeliveryFee, deliveryFee);
return update(wrapper);
@@ -197,7 +226,7 @@
@Override
public boolean updateStatus(Long storeId, Integer status, Long version) {
- Store existingStore = this.findOrThrow(storeId, version);
+ Store existingStore = this.getOrThrow(storeId, version);
LambdaUpdateWrapper<Store> wrapper = this.createLambdaUpdateWrapper(storeId, existingStore.getVersion())
.set(Store::getStatus, status);
return update(wrapper);
@@ -214,32 +243,23 @@
}
@Override
- public boolean existsByIdAndMerchantId(Long storeId, Long merchantId) {
- if (storeId == null || merchantId == null) {
- return false;
- }
- Store store = getById(storeId);
- return Optional.ofNullable(store).map(i -> merchantId.equals(i.getMerchantId())).orElse(false);
- }
-
- private void processQualificationCreate(Store store, List<StoreQualificationCreateRequest> qualificationRequests) {
- if (CollectionUtil.isNotEmpty(qualificationRequests)) {
- List<StoreQualification> storeQualificationList = qualificationRequests.stream().map(i -> {
- i.setStoreId(store.getStoreId());
- return StoreQualificationAssembler.to(i);
- }).collect(Collectors.toList());
- storeQualificationList.forEach(i -> i.setStoreId(store.getStoreId()));
- qualificationService.batchCreate(storeQualificationList);
- }
- }
-
- private void bindUser(Long storeId) {
+ public boolean bindUser(Long storeId) {
StoreUser storeUser = new StoreUser();
storeUser.setStoreId(storeId);
storeUser.setUserId(SecurityUtils.getCurrentUserId());
storeUser.setRoleType("");
storeUser.setPermissions("");
storeUserMapper.insert(storeUser);
+ return true;
+ }
+
+ @Override
+ public boolean existsByIdAndMerchantId(Long storeId, Long merchantId) {
+ if (storeId == null || merchantId == null) {
+ return false;
+ }
+ Store store = getById(storeId);
+ return Optional.ofNullable(store).map(i -> merchantId.equals(i.getMerchantId())).orElse(false);
}
private LambdaUpdateWrapper<Store> createLambdaUpdateWrapper(Long storeId, Long version) {
@@ -250,55 +270,6 @@
updateWrapper.eq(Store::getVersion, version);
updateWrapper.set(Store::getVersion, version + 1);
}
- updateWrapper.set(Store::getUpdateBy, SecurityUtils.getCurrentUserId());
return updateWrapper;
- }
-
- private Store findOrThrow(StoreUpdateRequest request) {
- return this.findOrThrow(request.getStoreId(), request.getVersion());
- }
-
- private Store findOrThrow(Long storeId, Long version) {
- Objects.requireNonNull(storeId, String.format("方法 '%s' 调用失败:参数 'storeId'(店铺ID)不能为 null", "findOrThrow"));
- LambdaQueryWrapper<Store> wrapper = new LambdaQueryWrapper<>();
- wrapper.eq(Store::getStoreId, storeId);
- if (ObjUtil.isNotEmpty(version)) {
- wrapper.eq(Store::getVersion, version);
- }
- Store existingStore = storeMapper.selectOne(wrapper);
- if (ObjUtil.isEmpty(existingStore)) {
- throw new EntityNotFoundException(Store.class, "storeId", storeId.toString());
- }
- return existingStore;
- }
-
- private List<Long> getDeleteImageIds(List<ValueUpdate<Long>> imageValues) {
- List<Long> deleteImageIds = new ArrayList<>();
- for (ValueUpdate<Long> imageValue : imageValues) {
- if (imageValue.isChangeAndOldValueNotEmpty()) {
- deleteImageIds.add(imageValue.getOldValue());
- }
- }
- return deleteImageIds;
- }
-
- private void processImagesUpdate(StoreUpdateRequest request, Store existingStore) {
- List<ValueUpdate<Long>> imageValues = ListUtil.toList(
- new ValueUpdate<>(request.getLogoImageId(), existingStore.getLogoImageId()),
- new ValueUpdate<>(request.getCoverImageId(), existingStore.getCoverImageId())
- );
- bucketStorageService.deleteAll(this.getDeleteImageIds(imageValues));
- }
-
- private void processQualificationUpdate(StoreUpdateRequest request) {
- if (CollectionUtil.isNotEmpty(request.getDeletedQualificationIds())) {
- qualificationService.deleteAll(request.getDeletedQualificationIds());
- }
- if (CollectionUtil.isNotEmpty(request.getUpdatedQualifications())) {
- qualificationService.batchUpdate(request.getUpdatedQualifications());
- }
- if (CollectionUtil.isNotEmpty(request.getNewQualifications())) {
- qualificationService.batchCreate(request.getNewQualifications());
- }
}
}
diff --git a/oying-system/src/main/java/com/oying/modules/sh/domain/request/StatusOrder.java b/oying-system/src/main/java/com/oying/modules/sh/domain/request/StatusOrder.java
new file mode 100644
index 0000000..917fa28
--- /dev/null
+++ b/oying-system/src/main/java/com/oying/modules/sh/domain/request/StatusOrder.java
@@ -0,0 +1,18 @@
+package com.oying.modules.sh.domain.request;
+
+import com.oying.utils.enums.OrderStatusEnum;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * @author xin
+ * @description
+ * @date 2025/7/15 14:41
+ */
+@Getter
+@Setter
+public class StatusOrder {
+
+ private String orderNum;
+ private OrderStatusEnum status;
+}
diff --git a/oying-system/src/main/java/com/oying/modules/sh/domain/vo/OrderResponse.java b/oying-system/src/main/java/com/oying/modules/sh/domain/vo/OrderResponse.java
index 37d2760..b6fe370 100644
--- a/oying-system/src/main/java/com/oying/modules/sh/domain/vo/OrderResponse.java
+++ b/oying-system/src/main/java/com/oying/modules/sh/domain/vo/OrderResponse.java
@@ -3,6 +3,7 @@
import com.oying.modules.sh.domain.Order;
import com.oying.modules.sh.domain.OrderAddressSnapshot;
import com.oying.modules.sh.domain.OrderOperationLog;
+import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.Setter;
@@ -15,6 +16,7 @@
*/
@Getter
@Setter
+@AllArgsConstructor
public class OrderResponse {
private Order order;
diff --git a/oying-system/src/main/java/com/oying/modules/sh/mapper/OrderMapper.java b/oying-system/src/main/java/com/oying/modules/sh/mapper/OrderMapper.java
index 8172479..ffd2df6 100644
--- a/oying-system/src/main/java/com/oying/modules/sh/mapper/OrderMapper.java
+++ b/oying-system/src/main/java/com/oying/modules/sh/mapper/OrderMapper.java
@@ -28,7 +28,7 @@
void updatePayStatus(String orderNum, String payState, String payMessage, String payTime);
- void updateCloseStatus(String orderNum, String payState);
+ void updateCloseStatus(String orderNum, String payState, String payMessage);
void updateOrderStatus(String orderNum, Integer key, String value);
}
diff --git a/oying-system/src/main/java/com/oying/modules/sh/rest/OrderController.java b/oying-system/src/main/java/com/oying/modules/sh/rest/OrderController.java
index 2815777..97f9ac2 100644
--- a/oying-system/src/main/java/com/oying/modules/sh/rest/OrderController.java
+++ b/oying-system/src/main/java/com/oying/modules/sh/rest/OrderController.java
@@ -3,6 +3,7 @@
import com.oying.annotation.Log;
import com.oying.modules.sh.domain.Order;
import com.oying.modules.sh.domain.request.GeneratorOrder;
+import com.oying.modules.sh.domain.request.StatusOrder;
import com.oying.modules.sh.domain.request.SubmitOrder;
import com.oying.modules.sh.service.OrderService;
import com.oying.modules.sh.domain.dto.OrderQueryCriteria;
@@ -76,6 +77,14 @@
return new ResponseEntity<>(R.success(orderService.generatorOrder(generator)), HttpStatus.CREATED);
}
+ @PostMapping("status")
+ @Log("更新订单状态")
+ @ApiOperation("更新订单状态")
+ public ResponseEntity<Object> statusOrder(@Validated @RequestBody StatusOrder statusOrder) {
+ orderService.statusOrder(statusOrder);
+ return new ResponseEntity<>(R.success(), HttpStatus.CREATED);
+ }
+
@PostMapping("submit")
@Log("小程序:提交订单")
@ApiOperation("小程序:提交订单")
diff --git a/oying-system/src/main/java/com/oying/modules/sh/service/OrderOperationLogService.java b/oying-system/src/main/java/com/oying/modules/sh/service/OrderOperationLogService.java
index 482091c..c24638b 100644
--- a/oying-system/src/main/java/com/oying/modules/sh/service/OrderOperationLogService.java
+++ b/oying-system/src/main/java/com/oying/modules/sh/service/OrderOperationLogService.java
@@ -1,7 +1,5 @@
package com.oying.modules.sh.service;
-import com.oying.modules.sh.domain.Order;
-import com.oying.modules.sh.domain.OrderAddressSnapshot;
import com.oying.modules.sh.domain.OrderOperationLog;
import com.oying.modules.sh.domain.dto.OrderOperationLogQueryCriteria;
import java.util.List;
@@ -9,7 +7,9 @@
import javax.servlet.http.HttpServletResponse;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
+import com.oying.modules.sh.domain.vo.OrderResponse;
import com.oying.utils.PageResult;
+import com.oying.utils.enums.OrderStatusEnum;
/**
* @description 服务接口
@@ -34,15 +34,9 @@
List<OrderOperationLog> queryAll(OrderOperationLogQueryCriteria criteria);
/**
- * 创建
- * @param resources /
- */
- void create(OrderOperationLog resources);
-
- /**
* 创建
*/
- void create(Order order, OrderAddressSnapshot addressSnapshot);
+ void create(OrderResponse response, OrderStatusEnum statusEnum);
/**
* 编辑
diff --git a/oying-system/src/main/java/com/oying/modules/sh/service/OrderService.java b/oying-system/src/main/java/com/oying/modules/sh/service/OrderService.java
index 49f1dc7..73db9e8 100644
--- a/oying-system/src/main/java/com/oying/modules/sh/service/OrderService.java
+++ b/oying-system/src/main/java/com/oying/modules/sh/service/OrderService.java
@@ -11,10 +11,12 @@
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.oying.modules.sh.domain.request.GeneratorOrder;
+import com.oying.modules.sh.domain.request.StatusOrder;
import com.oying.modules.sh.domain.request.SubmitOrder;
import com.oying.modules.sh.domain.vo.OrderInfo;
import com.oying.modules.sh.domain.vo.OrderResponse;
import com.oying.utils.PageResult;
+import com.oying.utils.enums.OrderStatusEnum;
import com.oying.utils.enums.PayStateEnum;
/**
@@ -47,7 +49,7 @@
OrderResponse getByOrderNum(String orderNum);
- void paySuccess(OrderResponse order);
+ void operationLog(OrderResponse order, OrderStatusEnum stateEnum);
void updatePayStatus(String outTradeNo, PayStateEnum stateEnum, String payInfo, String timeEnd);
@@ -82,4 +84,6 @@
void download(List<Order> all, HttpServletResponse response) throws IOException;
void closeOrder(String orderNum);
+
+ void statusOrder(StatusOrder statusOrder);
}
diff --git a/oying-system/src/main/java/com/oying/modules/sh/service/impl/OrderOperationLogServiceImpl.java b/oying-system/src/main/java/com/oying/modules/sh/service/impl/OrderOperationLogServiceImpl.java
index d4b2546..3a1afcf 100644
--- a/oying-system/src/main/java/com/oying/modules/sh/service/impl/OrderOperationLogServiceImpl.java
+++ b/oying-system/src/main/java/com/oying/modules/sh/service/impl/OrderOperationLogServiceImpl.java
@@ -1,9 +1,9 @@
package com.oying.modules.sh.service.impl;
import com.alibaba.fastjson2.JSON;
-import com.oying.modules.sh.domain.Order;
-import com.oying.modules.sh.domain.OrderAddressSnapshot;
import com.oying.modules.sh.domain.OrderOperationLog;
+import com.oying.modules.sh.domain.vo.OrderResponse;
+import com.oying.modules.sh.mapper.OrderMapper;
import com.oying.utils.*;
import com.oying.utils.enums.OrderStatusEnum;
import lombok.RequiredArgsConstructor;
@@ -33,6 +33,7 @@
public class OrderOperationLogServiceImpl extends ServiceImpl<OrderOperationLogMapper, OrderOperationLog> implements OrderOperationLogService {
private final OrderOperationLogMapper orderOperationLogMapper;
+ private final OrderMapper orderMapper;
@Override
public PageResult<OrderOperationLog> queryAll(OrderOperationLogQueryCriteria criteria, Page<Object> page) {
@@ -51,27 +52,40 @@
@Override
@Transactional(rollbackFor = Exception.class)
- public void create(OrderOperationLog resources) {
- orderOperationLogMapper.insert(resources);
- }
-
- @Override
- @Transactional(rollbackFor = Exception.class)
- public void create(Order order, OrderAddressSnapshot addressSnapshot) {
- Map<String, Object> map = new LinkedHashMap<>();
- map.put("order", order);
- map.put("address", addressSnapshot);
+ public void create(OrderResponse response, OrderStatusEnum statusEnum) {
+ String userType = ConstantsKey.BUYER;
+ switch (statusEnum) {
+ case ZERO:
+ case ONE:
+ case EIGHT:
+ case NINE:
+ userType = ConstantsKey.BUYER;
+ break;
+ case TWO:
+ case FOUR:
+ userType = ConstantsKey.MERCHANT;
+ break;
+ case THREE:
+ case FIVE:
+ case SIX:
+ case SEVEN:
+ userType = ConstantsKey.RIDER;
+ break;
+ default:
+ }
String username = SecurityUtils.getCurrentUsername();
Timestamp time = new Timestamp(System.currentTimeMillis());
OrderOperationLog resources = new OrderOperationLog();
- resources.setOrderNum(order.getOrderNum());
+ resources.setOrderNum(response.getOrder().getOrderNum());
resources.setUsername(username);
- resources.setUserType(ConstantsKey.BUYER);
- resources.setOperation(OrderStatusEnum.ZERO.getKey());
- resources.setOperationDescribe(OrderStatusEnum.ZERO.getValue());
- resources.setRemark(username + ":" + time + ">" + OrderStatusEnum.ZERO.getValue() + ":" + order.getOrderNum());
- resources.setSnapshotData(JSON.toJSONString(map));
+ resources.setUserType(userType);
+ resources.setOperation(statusEnum.getKey());
+ resources.setOperationDescribe(statusEnum.getValue());
+ resources.setRemark(username + ":" + time + ">" + statusEnum.getValue() + ":" + response.getOrder().getOrderNum());
+ resources.setSnapshotData(JSON.toJSONString(response));
resources.setOperationTime(time);
+ orderOperationLogMapper.insert(resources);
+ orderMapper.updateOrderStatus(response.getOrder().getOrderNum(), statusEnum.getKey(), statusEnum.getValue());
}
@Override
diff --git a/oying-system/src/main/java/com/oying/modules/sh/service/impl/OrderServiceImpl.java b/oying-system/src/main/java/com/oying/modules/sh/service/impl/OrderServiceImpl.java
index be09c2c..1c4b0cb 100644
--- a/oying-system/src/main/java/com/oying/modules/sh/service/impl/OrderServiceImpl.java
+++ b/oying-system/src/main/java/com/oying/modules/sh/service/impl/OrderServiceImpl.java
@@ -12,6 +12,7 @@
import com.oying.modules.sh.domain.*;
import com.oying.modules.sh.domain.request.GeneratorOrder;
import com.oying.modules.sh.domain.request.ProductOrder;
+import com.oying.modules.sh.domain.request.StatusOrder;
import com.oying.modules.sh.domain.request.SubmitOrder;
import com.oying.modules.sh.domain.vo.OrderInfo;
import com.oying.modules.sh.domain.vo.OrderResponse;
@@ -173,7 +174,9 @@
productSnapshotService.saveBatch(snapshots);
order.setProductSnapshots(new HashSet<>(snapshots));
- operationLogService.create(order, addressSnapshot);
+ OrderResponse response = new OrderResponse(order, addressSnapshot, null);
+
+ operationLogService.create(response, OrderStatusEnum.ZERO);
return order;
}
@@ -235,18 +238,22 @@
@Override
@Transactional(rollbackFor = Exception.class)
- public OrderResponse getByOrderNum(String orderNum) {
- OrderResponse response = new OrderResponse();
- response.setOrder(orderMapper.getByOrderNum(orderNum));
- response.setAddress(addressSnapshotService.queryByOrderNum(orderNum));
- response.setOperation(operationLogService.getByOrderNum(orderNum));
- return response;
+ public void statusOrder(StatusOrder statusOrder) {
+ operationLog(getByOrderNum(statusOrder.getOrderNum()), statusOrder.getStatus());
}
@Override
@Transactional(rollbackFor = Exception.class)
- public void paySuccess(OrderResponse order) {
- orderMapper.updateOrderStatus(order.getOrder().getOrderNum(), OrderStatusEnum.TWO.getKey(), OrderStatusEnum.TWO.getValue());
+ public OrderResponse getByOrderNum(String orderNum) {
+ return new OrderResponse(orderMapper.getByOrderNum(orderNum),
+ addressSnapshotService.queryByOrderNum(orderNum),
+ operationLogService.getByOrderNum(orderNum));
+ }
+
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public void operationLog(OrderResponse order, OrderStatusEnum stateEnum) {
+ operationLogService.create(order, stateEnum);
}
@Override
@@ -258,25 +265,30 @@
@Override
@Transactional(rollbackFor = Exception.class)
public void closeOrder(String orderNum) {
- Order order = orderMapper.getByOrderNum(orderNum);
+ OrderResponse response = getByOrderNum(orderNum);
+ Order order = response.getOrder();
if (order == null) {
throw new BadRequestException("订单不存在");
+ }
+ if (!SecurityUtils.getCurrentUserId().equals(order.getUserId())) {
+ throw new BadRequestException("不能修改他人订单");
+ }
+ if (!order.getPayState().equals(PayStateEnum.NOTPAY.getKey())) {
+ throw new BadRequestException(PayStateEnum.getValue(order.getPayState()));
}
PayTypeEnum anEnum = PayTypeEnum.find(order.getPayType());
switch (anEnum) {
case HWC:
case HWC2:
JSONObject object = swiftPassService.query(orderNum, anEnum);
- if (object.getString("trade_state").equals(PayStateEnum.SUCCESS.getKey())) {
- throw new BadRequestException("订单已支付");
- }
- if (object.getString("trade_state").equals(PayStateEnum.CLOSED.getKey())) {
- throw new BadRequestException("订单已关闭");
+ if (object.getString("trade_state").equals(PayStateEnum.NOTPAY.getKey())) {
+ throw new BadRequestException(PayStateEnum.getValue(order.getPayState()));
}
swiftPassService.closeOrder(orderNum, anEnum);
break;
}
- orderMapper.updateCloseStatus(orderNum, PayStateEnum.CLOSED.getKey());
+ operationLogService.create(response, OrderStatusEnum.NINE);
+ orderMapper.updateCloseStatus(orderNum, PayStateEnum.CLOSED.getKey(), PayStateEnum.CLOSED.getValue());
}
@Override
diff --git a/oying-system/src/main/resources/config/application.yml b/oying-system/src/main/resources/config/application.yml
index 85e4332..b916632 100644
--- a/oying-system/src/main/resources/config/application.yml
+++ b/oying-system/src/main/resources/config/application.yml
@@ -34,7 +34,7 @@
redis:
#数据库索引
database: 0
- host: 192.168.18.13
+ host: 127.0.0.1
port: 6379
password:
#连接超时时间
diff --git a/oying-system/src/main/resources/mapper/message/MessageOrderSellerMapper.xml b/oying-system/src/main/resources/mapper/message/MessageOrderSellerMapper.xml
index 03ca27b..03a2b9c 100644
--- a/oying-system/src/main/resources/mapper/message/MessageOrderSellerMapper.xml
+++ b/oying-system/src/main/resources/mapper/message/MessageOrderSellerMapper.xml
@@ -63,6 +63,11 @@
set flag = 1
where order_id = #{orderId}
</update>
+ <update id="updateReadStatusById">
+ update message_order_seller
+ set flag = 1
+ where id = #{id}
+ </update>
</mapper>
diff --git a/oying-system/src/main/resources/mapper/pc/product/ProductAuditMapper.xml b/oying-system/src/main/resources/mapper/pc/product/ProductAuditMapper.xml
new file mode 100644
index 0000000..f36506a
--- /dev/null
+++ b/oying-system/src/main/resources/mapper/pc/product/ProductAuditMapper.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
+<mapper namespace="com.oying.modules.pc.product.mapper.ProductAuditMapper">
+ <resultMap id="BaseResultMap" type="com.oying.modules.pc.product.domain.ProductAudit">
+ <id column="audit_id" property="auditId"/>
+ <result column="product_id" property="productId"/>
+ <result column="type" property="type"/>
+ <result column="status" property="status"/>
+ <result column="data" property="data"/>
+ <result column="reason" property="reason"/>
+ <result column="auditor" property="auditor"/>
+ <result column="audit_time" property="auditTime"/>
+ <result column="create_by" property="createBy"/>
+ <result column="create_time" property="createTime"/>
+ <result column="update_by" property="updateBy"/>
+ <result column="update_time" property="updateTime"/>
+ </resultMap>
+
+ <sql id="Base_Column_List">
+ audit_id, product_id, type, status, reason, auditor, audit_time, data, create_by, create_time, update_by, update_time
+ </sql>
+
+ <select id="findAll" resultMap="BaseResultMap">
+ select
+ <include refid="Base_Column_List"/>
+ from pc_product_audit
+ <where>
+ <if test="criteria.productId != null">
+ and product_id = #{criteria.productId}
+ </if>
+ <if test="criteria.type != null and criteria.type != ''">
+ and type = #{criteria.type}
+ </if>
+ </where>
+ order by audit_id desc
+ </select>
+</mapper>
\ No newline at end of file
diff --git a/oying-system/src/main/resources/mapper/pc/store/StoreAuditMapper.xml b/oying-system/src/main/resources/mapper/pc/store/StoreAuditMapper.xml
new file mode 100644
index 0000000..12cfa20
--- /dev/null
+++ b/oying-system/src/main/resources/mapper/pc/store/StoreAuditMapper.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
+<mapper namespace="com.oying.modules.pc.store.mapper.StoreAuditMapper">
+ <resultMap id="BaseResultMap" type="com.oying.modules.pc.store.domain.StoreAudit">
+ <id column="audit_id" property="auditId"/>
+ <result column="store_id" property="storeId"/>
+ <result column="type" property="type"/>
+ <result column="status" property="status"/>
+ <result column="data" property="data"/>
+ <result column="reason" property="reason"/>
+ <result column="auditor" property="auditor"/>
+ <result column="audit_time" property="auditTime"/>
+ <result column="create_by" property="createBy"/>
+ <result column="create_time" property="createTime"/>
+ <result column="update_by" property="updateBy"/>
+ <result column="update_time" property="updateTime"/>
+ </resultMap>
+
+ <sql id="Base_Column_List">
+ audit_id, store_id, type, status, reason, auditor, audit_time, data, create_by, create_time, update_by, update_time
+ </sql>
+
+ <select id="findAll" resultMap="BaseResultMap">
+ select
+ <include refid="Base_Column_List"/>
+ from pc_store_audit
+ <where>
+ <if test="criteria.storeId != null">
+ and store_id = #{criteria.storeId}
+ </if>
+ <if test="criteria.type != null and criteria.type != ''">
+ and type = #{criteria.type}
+ </if>
+ </where>
+ order by audit_id desc
+ </select>
+</mapper>
\ No newline at end of file
diff --git a/oying-system/src/main/resources/mapper/pc/store/StoreMapper.xml b/oying-system/src/main/resources/mapper/pc/store/StoreMapper.xml
index ac3cb3d..ccbbecf 100644
--- a/oying-system/src/main/resources/mapper/pc/store/StoreMapper.xml
+++ b/oying-system/src/main/resources/mapper/pc/store/StoreMapper.xml
@@ -13,8 +13,12 @@
<result property="storeName" column="store_name"/>
<result property="businessScope" column="business_scope"/>
<result property="status" column="status"/>
+ <result property="businessStatus" column="business_status"/>
+ <result property="auditStatus" column="audit_status"/>
<result property="logoImageId" column="logo_image_id"/>
+ <result property="logoImageUrl" column="logo_image_url"/>
<result property="coverImageId" column="cover_image_id"/>
+ <result property="coverImageUrl" column="cover_image_url"/>
<result property="description" column="description"/>
<result property="tags" column="tags"/>
<result property="deliveryFee" column="delivery_fee"/>
@@ -28,25 +32,25 @@
<result property="geoHash" column="geo_hash"/>
<result property="coordinateSystem" column="coordinate_system"/>
<result property="radius" column="radius"/>
- <result column="returns" property="returns"/>
- <result column="self_pickup" property="selfPickup"/>
+ <result property="returns" column="returns" />
+ <result property="selfPickup" column="self_pickup"/>
<result property="createBy" column="create_by"/>
<result property="createTime" column="create_time"/>
<result property="updateBy" column="update_by"/>
<result property="updateTime" column="update_time"/>
- <result column="version" property="version"/>
+ <result property="version" column="version"/>
</resultMap>
<sql id="store_column_list">
- store_id, merchant_id, platform_category_id, store_type, store_code, store_name, business_scope, status, logo_image_id,
- cover_image_id, description, tags, delivery_fee, delivery_minimum, contact_phone, open_time, close_time,
+ store_id, merchant_id, platform_category_id, store_type, store_code, store_name, business_scope, status, business_status, audit_status, logo_image_id, logo_image_url,
+ cover_image_id, cover_image_url, description, tags, delivery_fee, delivery_minimum, contact_phone, open_time, close_time,
address, longitude, latitude, geo_hash, geo_point, coordinate_system, radius, returns, self_pickup, create_by, create_time, update_by, update_time, version
</sql>
<sql id="selectStoreVo">
select
- store_id, merchant_id, platform_category_id, store_type, store_code, store_name, business_scope, status, logo_image_id,
- cover_image_id, description, tags, delivery_fee, delivery_minimum, contact_phone, open_time, close_time,
+ store_id, merchant_id, platform_category_id, store_type, store_code, store_name, business_scope, status, business_status, audit_status, logo_image_id, logo_image_url,
+ cover_image_id, cover_image_url, description, tags, delivery_fee, delivery_minimum, contact_phone, open_time, close_time,
address, longitude, latitude, geo_hash, geo_point, coordinate_system, radius, returns, self_pickup, create_by, create_time, update_by, update_time, version from pc_store
</sql>
@@ -126,8 +130,8 @@
</if>
<!-- 营业状态 -->
- <if test="criteria.status != null">
- AND s.status = #{criteria.status}
+ <if test="criteria.businessStatus != null">
+ AND s.business_status = #{criteria.businessStatus}
</if>
<!-- 类目ID -->
@@ -140,6 +144,16 @@
</if>
</select>
+ <select id="queryByIds" resultMap="StoreResult">
+ SELECT
+ <include refid="store_column_list"/>
+ FROM pc_store
+ WHERE store_id IN
+ <foreach collection="ids" item="id" open="(" separator="," close=")">
+ #{id}
+ </foreach>
+ </select>
+
<select id="queryUserStores" parameterType="java.lang.Long" resultMap="StoreResult">
SELECT s.*
FROM sys_user_store u INNER JOIN pc_store s ON u.store_id = s.store_id
diff --git a/oying-system/src/main/resources/mapper/sh/OrderMapper.xml b/oying-system/src/main/resources/mapper/sh/OrderMapper.xml
index 61211e2..1f46c1c 100644
--- a/oying-system/src/main/resources/mapper/sh/OrderMapper.xml
+++ b/oying-system/src/main/resources/mapper/sh/OrderMapper.xml
@@ -136,13 +136,14 @@
<update id="updateCloseStatus">
update sh_order
- set pay_state = #{payState}
+ set pay_state = #{payState},
+ pay_message = #{payMessage}
where order_num = #{orderNum}
</update>
<update id="updateOrderStatus">
update sh_order
- set order_status = #{key},
+ set order_status = #{key},
order_status_describe = #{value}
where order_num = #{orderNum}
</update>
--
Gitblit v1.9.3