From 64d6368e540c75104df83d9cd3d3262c803365c1 Mon Sep 17 00:00:00 2001
From: Wangmin <wangmin.email@qq.com>
Date: Thu, 14 Sep 2023 21:09:43 +0800
Subject: [PATCH] 完善 取消订单业务

---
 pz-admin/src/main/resources/application.yml                                  |  2 +-
 pz-system/src/main/java/com/pz/merchant/service/ISonOrderService.java        |  3 +--
 pz-system/src/main/java/com/pz/system/service/impl/DbghOrderServiceImpl.java | 11 +++++++----
 pz-system/src/main/java/com/pz/system/service/impl/DbmyOrderServiceImpl.java | 71 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++----
 pz-system/src/main/java/com/pz/system/service/impl/DbwzOrderServiceImpl.java | 11 +++++++----
 pz-system/src/main/java/com/pz/system/service/impl/YypzOrderServiceImpl.java | 11 +++++++----
 pz-system/src/main/java/com/pz/system/service/impl/ZqghOrderServiceImpl.java |  5 +++++
 pz-system/src/main/java/com/pz/system/service/impl/ZyphOrderServiceImpl.java | 11 +++++++----
 8 files changed, 102 insertions(+), 23 deletions(-)

diff --git a/pz-admin/src/main/resources/application.yml b/pz-admin/src/main/resources/application.yml
index 15da1ef..ce7a63a 100644
--- a/pz-admin/src/main/resources/application.yml
+++ b/pz-admin/src/main/resources/application.yml
@@ -27,7 +27,7 @@ captcha:
 # 开发环境配置
 server:
   # 服务器的HTTP端口,默认为8080
-  port: 9524
+  port: 8089
   servlet:
     # 应用的访问路径
     context-path: /
diff --git a/pz-system/src/main/java/com/pz/merchant/service/ISonOrderService.java b/pz-system/src/main/java/com/pz/merchant/service/ISonOrderService.java
index c3c487e..4f67193 100644
--- a/pz-system/src/main/java/com/pz/merchant/service/ISonOrderService.java
+++ b/pz-system/src/main/java/com/pz/merchant/service/ISonOrderService.java
@@ -49,7 +49,6 @@ public interface ISonOrderService {
      * @param totalId 取消订单
      * @return 操作结果
      */
-    default boolean accompanyCancellationOfOrder(Integer totalId){
-        return true;}
+    boolean accompanyCancellationOfOrder(Integer totalId);
 
 }
diff --git a/pz-system/src/main/java/com/pz/system/service/impl/DbghOrderServiceImpl.java b/pz-system/src/main/java/com/pz/system/service/impl/DbghOrderServiceImpl.java
index 0c61ef7..8a83675 100644
--- a/pz-system/src/main/java/com/pz/system/service/impl/DbghOrderServiceImpl.java
+++ b/pz-system/src/main/java/com/pz/system/service/impl/DbghOrderServiceImpl.java
@@ -194,11 +194,12 @@ public class DbghOrderServiceImpl implements IDbghOrderService, ISonOrderService
         if (dbghOrder.getVisitTime() != null) {
             LocalDateTime visitTime = LocalDateTime.ofInstant(dbghOrder.getVisitTime().toInstant(), ZoneId.systemDefault());
             LocalDateTime currentDate = LocalDateTime.ofInstant(new Date().toInstant(), ZoneId.systemDefault());
+            // 取消次数
+            Integer cancelCount = RedisUtils.<Integer>getCacheMapValue(ISonOrderService.ORDER_CANCEL_CACHE_PREFIX, String.valueOf(emId));
             // 若在18小时前取消订单,需记录取消次数
+            cancel = cancelCount == null ? 1: cancelCount + 1;
             if (visitTime.isBefore(currentDate) || ChronoUnit.HOURS.between(visitTime, currentDate) <= 18) {
-                // 取消次数
-                Integer cancelCount = RedisUtils.<Integer>getCacheMapValue(ISonOrderService.ORDER_CANCEL_CACHE_PREFIX, String.valueOf(emId));
-                cancel = cancelCount == null ? 1 : cancelCount + 1;
+                cancel++;
             }
         }
         // 更新主订单数据
@@ -215,7 +216,9 @@ public class DbghOrderServiceImpl implements IDbghOrderService, ISonOrderService
         // 若取消次数大于3,则冻结用户账号
         if (cancel > 3) {
             if (employeesMapper.update(null,
-                Wrappers.<Employees>lambdaUpdate().set(Employees::getStatus, 2)
+                Wrappers.<Employees>lambdaUpdate()
+                    .set(Employees::getStatus, 2)
+                    .set(Employees::getKillOrder,cancel)
                     .eq(Employees::getId, emId)) < 0) {
                 throw new ServiceException("用户冻结失败");
             }
diff --git a/pz-system/src/main/java/com/pz/system/service/impl/DbmyOrderServiceImpl.java b/pz-system/src/main/java/com/pz/system/service/impl/DbmyOrderServiceImpl.java
index 46f609a..996374a 100644
--- a/pz-system/src/main/java/com/pz/system/service/impl/DbmyOrderServiceImpl.java
+++ b/pz-system/src/main/java/com/pz/system/service/impl/DbmyOrderServiceImpl.java
@@ -8,10 +8,17 @@ import com.pz.common.core.domain.PageQuery;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.pz.common.exception.ServiceException;
+import com.pz.common.utils.redis.RedisUtils;
+import com.pz.merchant.domain.Employees;
 import com.pz.merchant.domain.vo.SonOrderVo;
+import com.pz.merchant.mapper.EmployeesMapper;
 import com.pz.merchant.service.ISonOrderService;
 import com.pz.system.domain.DbwzOrder;
+import com.pz.system.domain.TotalOrder;
+import com.pz.system.domain.YypzOrder;
 import com.pz.system.domain.bo.AccompanyAddressBo;
+import com.pz.system.mapper.TotalOrderMapper;
 import lombok.RequiredArgsConstructor;
 import org.springframework.stereotype.Service;
 import com.pz.system.domain.bo.DbmyOrderBo;
@@ -21,10 +28,10 @@ import com.pz.system.mapper.DbmyOrderMapper;
 import com.pz.system.service.IDbmyOrderService;
 import org.springframework.transaction.annotation.Transactional;
 
-import java.util.List;
-import java.util.Map;
-import java.util.Collection;
-import java.util.Objects;
+import java.time.LocalDateTime;
+import java.time.ZoneId;
+import java.time.temporal.ChronoUnit;
+import java.util.*;
 
 /**
  * 代办买药订单Service业务层处理
@@ -37,6 +44,8 @@ import java.util.Objects;
 public class DbmyOrderServiceImpl implements IDbmyOrderService, ISonOrderService {
 
     private final DbmyOrderMapper baseMapper;
+    private final TotalOrderMapper totalOrderMapper;
+    private final EmployeesMapper employeesMapper;
 
     /**
      * 查询代办买药订单
@@ -180,4 +189,58 @@ public class DbmyOrderServiceImpl implements IDbmyOrderService, ISonOrderService
     public Object getSonOrderDetailDataByTotalId(Integer totalId) {
         return baseMapper.selectDbmyOrderDetailDataByTotalId(totalId);
     }
+
+    /**
+     * 陪诊员取消代办买药订单
+     *
+     * @param totalId 取消订单
+     * @return 操作结果
+     */
+    @Override
+    public boolean accompanyCancellationOfOrder(Integer totalId) {
+        TotalOrder totalOrder = totalOrderMapper.selectById(totalId);
+        Objects.requireNonNull(totalOrder, "主订单不存在");
+        Integer emId = totalOrder.getEmId();
+        if (emId == 0) {
+            throw new ServiceException("订单暂未分配陪诊员,拒绝该操作");
+        }
+        DbmyOrder dbmyOrder = baseMapper.selectOne(Wrappers.<DbmyOrder>lambdaQuery().eq(DbmyOrder::getOrderId, totalId));
+        Objects.requireNonNull(dbmyOrder, "子订单与主订单不一致!");
+        // 若设置了就诊时间,在取消订单时需要检查是否在18小时之前
+        int cancel = 0;
+        if (dbmyOrder.getOverTime() != null) {
+            LocalDateTime visitTime = LocalDateTime.ofInstant(dbmyOrder.getOverTime().toInstant(), ZoneId.systemDefault());
+            LocalDateTime currentDate = LocalDateTime.ofInstant(new Date().toInstant(), ZoneId.systemDefault());
+            // 取消次数
+            Integer cancelCount = RedisUtils.<Integer>getCacheMapValue(ISonOrderService.ORDER_CANCEL_CACHE_PREFIX, String.valueOf(emId));
+            // 若在18小时前取消订单,需记录取消次数
+            cancel = cancelCount == null ? 1: cancelCount + 1;
+            if (visitTime.isBefore(currentDate) || ChronoUnit.HOURS.between(visitTime, currentDate) <= 18) {
+                cancel++;
+            }
+        }
+        // 更新主订单数据
+        totalOrder.setEmId(0);
+        totalOrder.setSuborderStatus(0);
+        if (totalOrderMapper.updateById(totalOrder) < 0) {
+            throw new ServiceException("更新主订单失败");
+        }
+        // 更新子订单
+        dbmyOrder.setStatus(0);
+        if (baseMapper.updateById(dbmyOrder) < 0) {
+            throw new ServiceException("子订单更新失败");
+        }
+        // 若取消次数大于3,则冻结用户账号
+        if (cancel > 3) {
+            if (employeesMapper.update(null,
+                Wrappers.<Employees>lambdaUpdate()
+                    .set(Employees::getStatus, 2)
+                    .set(Employees::getKillOrder,cancel)
+                    .eq(Employees::getId, emId)) < 0) {
+                throw new ServiceException("用户冻结失败");
+            }
+        }
+        RedisUtils.setCacheMapValue(ISonOrderService.ORDER_CANCEL_CACHE_PREFIX, String.valueOf(emId), cancel);
+        return true;
+    }
 }
diff --git a/pz-system/src/main/java/com/pz/system/service/impl/DbwzOrderServiceImpl.java b/pz-system/src/main/java/com/pz/system/service/impl/DbwzOrderServiceImpl.java
index f89c69c..9646e4b 100644
--- a/pz-system/src/main/java/com/pz/system/service/impl/DbwzOrderServiceImpl.java
+++ b/pz-system/src/main/java/com/pz/system/service/impl/DbwzOrderServiceImpl.java
@@ -196,11 +196,12 @@ public class DbwzOrderServiceImpl implements IDbwzOrderService, ISonOrderService
         if (dbwzOrder.getVisitTime() != null) {
             LocalDateTime visitTime = LocalDateTime.ofInstant(dbwzOrder.getVisitTime().toInstant(), ZoneId.systemDefault());
             LocalDateTime currentDate = LocalDateTime.ofInstant(new Date().toInstant(), ZoneId.systemDefault());
+            // 取消次数
+            Integer cancelCount = RedisUtils.<Integer>getCacheMapValue(ISonOrderService.ORDER_CANCEL_CACHE_PREFIX, String.valueOf(emId));
             // 若在18小时前取消订单,需记录取消次数
+            cancel = cancelCount == null ? 1: cancelCount + 1;
             if (visitTime.isBefore(currentDate) || ChronoUnit.HOURS.between(visitTime, currentDate) <= 18) {
-                // 取消次数
-                Integer cancelCount = RedisUtils.<Integer>getCacheMapValue(ISonOrderService.ORDER_CANCEL_CACHE_PREFIX, String.valueOf(emId));
-                cancel = cancelCount == null ? 1 : cancelCount + 1;
+                cancel++;
             }
         }
         // 更新主订单数据
@@ -217,7 +218,9 @@ public class DbwzOrderServiceImpl implements IDbwzOrderService, ISonOrderService
         // 若取消次数大于3,则冻结用户账号
         if (cancel > 3) {
             if (employeesMapper.update(null,
-                Wrappers.<Employees>lambdaUpdate().set(Employees::getStatus, 2)
+                Wrappers.<Employees>lambdaUpdate()
+                    .set(Employees::getStatus, 2)
+                    .set(Employees::getKillOrder,cancel)
                     .eq(Employees::getId, emId)) < 0) {
                 throw new ServiceException("用户冻结失败");
             }
diff --git a/pz-system/src/main/java/com/pz/system/service/impl/YypzOrderServiceImpl.java b/pz-system/src/main/java/com/pz/system/service/impl/YypzOrderServiceImpl.java
index 4b19357..d4a7bad 100644
--- a/pz-system/src/main/java/com/pz/system/service/impl/YypzOrderServiceImpl.java
+++ b/pz-system/src/main/java/com/pz/system/service/impl/YypzOrderServiceImpl.java
@@ -199,11 +199,12 @@ public class YypzOrderServiceImpl implements IYypzOrderService, ISonOrderService
         if (yypzOrder.getVisitTime() != null) {
             LocalDateTime visitTime = LocalDateTime.ofInstant(yypzOrder.getVisitTime().toInstant(), ZoneId.systemDefault());
             LocalDateTime currentDate = LocalDateTime.ofInstant(new Date().toInstant(), ZoneId.systemDefault());
+            // 取消次数
+            Integer cancelCount = RedisUtils.<Integer>getCacheMapValue(ISonOrderService.ORDER_CANCEL_CACHE_PREFIX, String.valueOf(emId));
             // 若在18小时前取消订单,需记录取消次数
+            cancel = cancelCount == null ? 1: cancelCount + 1;
             if (visitTime.isBefore(currentDate) || ChronoUnit.HOURS.between(visitTime, currentDate) <= 18) {
-                // 取消次数
-                Integer cancelCount = RedisUtils.<Integer>getCacheMapValue(ISonOrderService.ORDER_CANCEL_CACHE_PREFIX, String.valueOf(emId));
-                cancel = cancelCount == null ? 1 : cancelCount + 1;
+                cancel++;
             }
         }
         // 更新主订单数据
@@ -220,7 +221,9 @@ public class YypzOrderServiceImpl implements IYypzOrderService, ISonOrderService
         // 若取消次数大于3,则冻结用户账号
         if (cancel > 3) {
             if (employeesMapper.update(null,
-                Wrappers.<Employees>lambdaUpdate().set(Employees::getStatus, 2)
+                Wrappers.<Employees>lambdaUpdate()
+                    .set(Employees::getStatus, 2)
+                    .set(Employees::getKillOrder,cancel)
                     .eq(Employees::getId, emId)) < 0) {
                 throw new ServiceException("用户冻结失败");
             }
diff --git a/pz-system/src/main/java/com/pz/system/service/impl/ZqghOrderServiceImpl.java b/pz-system/src/main/java/com/pz/system/service/impl/ZqghOrderServiceImpl.java
index 5fec0c7..2047ae3 100644
--- a/pz-system/src/main/java/com/pz/system/service/impl/ZqghOrderServiceImpl.java
+++ b/pz-system/src/main/java/com/pz/system/service/impl/ZqghOrderServiceImpl.java
@@ -153,4 +153,9 @@ public class ZqghOrderServiceImpl implements IZqghOrderService, ISonOrderService
         // return baseMapper.selectZqghOrderDetailDateByTotalId(totalId);
         return ISonOrderService.super.getSonOrderDetailDataByTotalId(totalId);
     }
+
+    @Override
+    public boolean accompanyCancellationOfOrder(Integer totalId) {
+        throw new UnsupportedOperationException("不支持该操作");
+    }
 }
diff --git a/pz-system/src/main/java/com/pz/system/service/impl/ZyphOrderServiceImpl.java b/pz-system/src/main/java/com/pz/system/service/impl/ZyphOrderServiceImpl.java
index 47c9555..1cc273c 100644
--- a/pz-system/src/main/java/com/pz/system/service/impl/ZyphOrderServiceImpl.java
+++ b/pz-system/src/main/java/com/pz/system/service/impl/ZyphOrderServiceImpl.java
@@ -203,11 +203,12 @@ public class ZyphOrderServiceImpl implements IZyphOrderService, ISonOrderService
         if (paseDateTime != null) {
             LocalDateTime visitTime = LocalDateTime.ofInstant(paseDateTime.toInstant(), ZoneId.systemDefault());
             LocalDateTime currentDate = LocalDateTime.ofInstant(new Date().toInstant(), ZoneId.systemDefault());
+            // 取消次数
+            Integer cancelCount = RedisUtils.<Integer>getCacheMapValue(ISonOrderService.ORDER_CANCEL_CACHE_PREFIX, String.valueOf(emId));
             // 若在18小时前取消订单,需记录取消次数
+            cancel = cancelCount == null ? 1: cancelCount + 1;
             if (visitTime.isBefore(currentDate) || ChronoUnit.HOURS.between(visitTime, currentDate) <= 18) {
-                // 取消次数
-                Integer cancelCount = RedisUtils.<Integer>getCacheMapValue(ISonOrderService.ORDER_CANCEL_CACHE_PREFIX, String.valueOf(emId));
-                cancel = cancelCount == null ? 1 : cancelCount + 1;
+                cancel++;
             }
         }
         // 更新主订单数据
@@ -224,7 +225,9 @@ public class ZyphOrderServiceImpl implements IZyphOrderService, ISonOrderService
         // 若取消次数大于3,则冻结用户账号
         if (cancel > 3) {
             if (employeesMapper.update(null,
-                Wrappers.<Employees>lambdaUpdate().set(Employees::getStatus, 2)
+                Wrappers.<Employees>lambdaUpdate()
+                    .set(Employees::getStatus, 2)
+                    .set(Employees::getKillOrder, cancel)
                     .eq(Employees::getId, emId)) < 0) {
                 throw new ServiceException("用户冻结失败");
             }
--
libgit2 0.26.0