Ver código fonte

管理老师订单

guomengjiao 3 meses atrás
pai
commit
7e7cb42447

+ 2 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/controller/info/OrderController.java

@@ -11,6 +11,7 @@ import com.ruoyi.common.enums.BusinessType;
 import com.ruoyi.common.utils.poi.ExcelUtil;
 import com.ruoyi.info.order.domain.bo.OrderBo;
 import com.ruoyi.info.order.domain.vo.OrderVo;
+import com.ruoyi.info.order.enums.CancellationMethod;
 import com.ruoyi.info.order.enums.OrderStatus;
 import com.ruoyi.info.order.service.IOrderService;
 import io.swagger.annotations.Api;
@@ -56,6 +57,7 @@ public class OrderController extends BaseController {
     public R<Map<String,  Object>> getEnum() {
         Map<String, Object> map = new HashMap<>();
         map.put("orderStatus", OrderStatus.toJsonArray());
+        map.put("cancellationMethod", CancellationMethod.toJsonArray());
         return R.ok(map);
     }
 

+ 18 - 0
ruoyi-api/src/main/java/com/ruoyi/api/controller/common/AbstractApiController.java

@@ -11,6 +11,7 @@ package com.ruoyi.api.controller.common;
 import cn.hutool.core.util.ObjectUtil;
 
 import com.ruoyi.common.core.domain.R;
+import com.ruoyi.common.core.domain.model.UserExtendInfo;
 import com.ruoyi.common.exception.ServiceException;
 import com.ruoyi.common.exception.user.ApiUserException;
 import com.ruoyi.framework.interceptor.UserContext;
@@ -60,6 +61,23 @@ public abstract class AbstractApiController {
         return UserContext.currentUser();
     }
 
+    protected Long getTeacherId() {
+        //isThrow 是否抛异常,不抛的话返回常量0
+        User user = UserContext.currentUser();
+        if (ObjectUtil.isNull(user)){
+            throw new ServiceException(ApiUserException.USER_NOT_EXISTS);
+        }
+        UserExtendInfo userExtendInfo = user.getUserExtendInfo();
+        if (ObjectUtil.isNull(userExtendInfo)){
+            throw new ServiceException(ApiUserException.USER_IS_NOT_TEACHER);
+        }
+        Long teacherId = userExtendInfo.getTeacherId();
+        if (ObjectUtil.isNull(teacherId)){
+            throw new ServiceException(ApiUserException.USER_IS_NOT_TEACHER);
+        }
+        return teacherId;
+    }
+
     /**
      * 响应返回结果
      *

+ 2 - 1
ruoyi-api/src/main/java/com/ruoyi/api/controller/info/ApiOrderController.java

@@ -11,6 +11,7 @@ import com.ruoyi.common.enums.FilePathSplicingType;
 import com.ruoyi.common.filepathsplicing.FilePathSplicing;
 import com.ruoyi.info.order.domain.bo.OrderBo;
 import com.ruoyi.info.order.domain.vo.OrderVo;
+import com.ruoyi.info.order.enums.CancellationMethod;
 import com.ruoyi.info.order.enums.OrderStatus;
 import com.ruoyi.info.order.service.IOrderService;
 import io.swagger.annotations.Api;
@@ -87,7 +88,7 @@ public class ApiOrderController extends AbstractApiController {
     public R<Void> cancel(@ApiParam("主键")
                               @NotNull(message = "主键不能为空")
                               @PathVariable("id") Long id) {
-        return toAjax(iOrderService.cancel(id, getUserId()) ? 1 : 0);
+        return toAjax(iOrderService.cancel(id, getUserId(), CancellationMethod.user_canceled) ? 1 : 0);
     }
 
 }

+ 102 - 0
ruoyi-api/src/main/java/com/ruoyi/api/controller/info/ApiTeacherOrderController.java

@@ -0,0 +1,102 @@
+package com.ruoyi.api.controller.info;
+
+import cn.hutool.core.util.ObjectUtil;
+import com.ruoyi.api.controller.common.AbstractApiController;
+import com.ruoyi.common.annotation.RepeatSubmit;
+import com.ruoyi.common.core.domain.PageQuery;
+import com.ruoyi.common.core.domain.R;
+import com.ruoyi.common.core.page.TableDataInfo;
+import com.ruoyi.common.core.validate.QueryGroup;
+import com.ruoyi.common.enums.FilePathSplicingType;
+import com.ruoyi.common.filepathsplicing.FilePathSplicing;
+import com.ruoyi.info.management.domain.bo.TeacherDepartmentRelBo;
+import com.ruoyi.info.management.domain.vo.TeacherDepartmentRelVo;
+import com.ruoyi.info.management.service.ITeacherDepartmentRelService;
+import com.ruoyi.info.order.domain.bo.OrderBo;
+import com.ruoyi.info.order.domain.vo.OrderVo;
+import com.ruoyi.info.order.enums.CancellationMethod;
+import com.ruoyi.info.order.enums.OrderStatus;
+import com.ruoyi.info.order.service.IOrderService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import lombok.RequiredArgsConstructor;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.validation.constraints.NotNull;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/**
+ * 订单Controller
+ *
+ * @author ruoyi
+ * @date 2025-09-20
+ */
+@Validated
+@Api(value = "管理老师端订单控制器", tags = {"管理老师端订单管理"})
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/api/teacher/order")
+public class ApiTeacherOrderController extends AbstractApiController {
+
+    private final IOrderService iOrderService;
+    private final ITeacherDepartmentRelService teacherDepartmentRelService;
+
+    /**
+     * 分页查询订单列表
+     */
+    @FilePathSplicing(type = FilePathSplicingType.RESPONSE)
+    @ApiOperation("查询订单列表")
+    @GetMapping("/page")
+    public TableDataInfo<OrderVo> page(@Validated(QueryGroup.class) OrderBo bo, PageQuery pageQuery) {
+        //获取老师科室
+        TeacherDepartmentRelBo teacherDepartmentRelBo = new TeacherDepartmentRelBo();
+        teacherDepartmentRelBo.setTeacherId(getTeacherId());
+        List<TeacherDepartmentRelVo> teacherDepartmentRelVos = teacherDepartmentRelService.queryList(teacherDepartmentRelBo);
+        if (ObjectUtil.isEmpty(teacherDepartmentRelVos)) {
+            return TableDataInfo.build();
+        }
+        bo.setHospitalDepartmentIds(teacherDepartmentRelVos.stream().map(TeacherDepartmentRelVo::getDepartmentId).collect(Collectors.toList()));
+        return iOrderService.queryPageList(bo, pageQuery);
+    }
+
+    @ApiOperation("枚举")
+    @GetMapping("/enum")
+    public R<Map<String,  Object>> getEnum() {
+        Map<String, Object> map = new HashMap<>();
+        map.put("orderStatus", OrderStatus.toJsonArray());
+        return R.ok(map);
+    }
+
+    /**
+     * 获取订单详细信息
+     */
+    @FilePathSplicing(type = FilePathSplicingType.RESPONSE)
+    @ApiOperation("获取订单详细信息")
+    @GetMapping("/info/{id}")
+    public R<OrderVo> getInfo(@ApiParam("主键")
+                                                  @NotNull(message = "主键不能为空")
+                                                  @PathVariable("id") Long id) {
+        return R.ok(iOrderService.queryById(id));
+    }
+
+    @ApiOperation("取消订单")
+    @RepeatSubmit()
+    @PostMapping("/cancel/{id}")
+    public R<Void> cancel(@ApiParam("主键")
+                              @NotNull(message = "主键不能为空")
+                              @PathVariable("id") Long id) {
+        return toAjax(iOrderService.cancel(id, null, CancellationMethod.teacher_canceled) ? 1 : 0);
+    }
+
+    @ApiOperation("分配护工")
+    @RepeatSubmit()
+    @PostMapping("/assignWorker")
+    public R<Void> assignWorker(@RequestBody OrderBo bo) {
+        return toAjax(iOrderService.assignWorker(bo, getTeacherId()) ? 1 : 0);
+    }
+}

+ 1 - 0
ruoyi-common/src/main/java/com/ruoyi/common/exception/user/ApiUserException.java

@@ -13,6 +13,7 @@ public enum ApiUserException implements IIntegerEnum {
 
     // TODO 注意检查错误码,保证系统内唯一
     USER_NOT_EXISTS(100001, "用户不存在"),
+    USER_IS_NOT_TEACHER(100002, "用户不是老师"),
 
     ;
 

+ 2 - 0
ruoyi-info/src/main/java/com/ruoyi/info/order/domain/bo/OrderBo.java

@@ -14,6 +14,7 @@ import org.springframework.format.annotation.DateTimeFormat;
 import javax.validation.constraints.NotNull;
 import java.math.BigDecimal;
 import java.util.Date;
+import java.util.List;
 
 /**
  * 订单业务对象 tb_order
@@ -65,6 +66,7 @@ public class OrderBo extends BaseEntity {
     @ApiModelProperty(value = "医院科室ID", required = true)
     @NotNull(message = "医院科室ID不能为空", groups = { AddGroup.class, EditGroup.class })
     private Long hospitalDepartmentId;
+    private List<Long> hospitalDepartmentIds;
 
     /**
      * 房床号

+ 3 - 0
ruoyi-info/src/main/java/com/ruoyi/info/order/domain/vo/OrderVo.java

@@ -243,4 +243,7 @@ public class OrderVo {
      */
     @ApiModelProperty("修改时间")
     private Date updateTime;
+
+    @ApiModelProperty("订单护工信息")
+    private OrderWorkerChangeRecordVo orderWorkerChangeRecord;
 }

+ 9 - 1
ruoyi-info/src/main/java/com/ruoyi/info/order/domain/vo/OrderWorkerChangeRecordVo.java

@@ -73,6 +73,12 @@ public class OrderWorkerChangeRecordVo {
     @ExcelProperty(value = "操作老师主键")
     @ApiModelProperty("操作老师主键")
     private Long operatingTeacherId;
+    @ExcelProperty(value = "操作老师名称")
+    @ApiModelProperty("操作老师名称")
+    private String operatingTeacherName;
+    @ExcelProperty(value = "操作老师手机号")
+    @ApiModelProperty("操作老师手机号")
+    private String operatingTeacherPhoneNumber;
 
     /**
      * 护工开始时间
@@ -88,5 +94,7 @@ public class OrderWorkerChangeRecordVo {
     @ApiModelProperty("护工结束时间")
     private Date workerEndTime;
 
-
+    @ExcelProperty(value = "创建时间")
+    @ApiModelProperty("创建时间")
+    private Date createTime;
 }

+ 1 - 0
ruoyi-info/src/main/java/com/ruoyi/info/order/enums/CancellationMethod.java

@@ -13,6 +13,7 @@ public enum CancellationMethod implements IIntegerEnum<Integer> {
 
     user_canceled(10, "用户取消"),
     platform_canceled(20, "平台取消"),
+    teacher_canceled(40, "管理老师取消"),
     auto_canceled(30, "未支付自动取消"),
     ;
 

+ 3 - 1
ruoyi-info/src/main/java/com/ruoyi/info/order/exception/OrderExceptionEnum.java

@@ -13,7 +13,9 @@ public enum OrderExceptionEnum implements IIntegerEnum {
     Order_IS_NOT_EXISTS(800001, "订单不存在"),
     Order_IS_NOT_YOURS(800002, "当前订单不是您本人的订单,不可取消!"),
     Order_STATUS_ERROR(800003, "订单不是待确认,不可取消!"),
-    ;
+    Order_WORKER_NOT_IN_HOSPITAL(800004, "当前护工的常驻医院不在本医院,不可分配!"),
+    Order_WORKER_NOT_ENABLE(800005, "当前护工状态不可接单,不可分配!"),
+    Order_STATUS_IS_NOT_ASSIGN(800006, "当前订单状态无法分配或更换护工!");
 
     private Integer code;
 

+ 4 - 1
ruoyi-info/src/main/java/com/ruoyi/info/order/service/IOrderService.java

@@ -6,6 +6,7 @@ import com.ruoyi.info.hospital.domain.vo.HospitalStatisticsVo;
 import com.ruoyi.info.order.domain.Order;
 import com.ruoyi.info.order.domain.bo.OrderBo;
 import com.ruoyi.info.order.domain.vo.OrderVo;
+import com.ruoyi.info.order.enums.CancellationMethod;
 
 import java.util.Collection;
 import java.util.List;
@@ -75,7 +76,7 @@ public interface IOrderService {
      */
     Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
 
-    boolean cancel(Long id, Long userId);
+    boolean cancel(Long id, Long userId, CancellationMethod cancellationMethod);
 
     TableDataInfo<OrderVo> queryAllPageList(OrderBo bo, PageQuery pageQuery);
 
@@ -84,4 +85,6 @@ public interface IOrderService {
     Integer querySumForHome();
 
     List<HospitalStatisticsVo> queryHospitalOrderStatistics();
+
+    boolean assignWorker(OrderBo bo, Long teacherId);
 }

+ 1 - 0
ruoyi-info/src/main/java/com/ruoyi/info/order/service/IOrderWorkerChangeRecordService.java

@@ -74,4 +74,5 @@ public interface IOrderWorkerChangeRecordService {
      */
     Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
 
+    OrderWorkerChangeRecordVo queryByOrderAndWorker(Long orderId, Long workerId);
 }

+ 61 - 4
ruoyi-info/src/main/java/com/ruoyi/info/order/service/impl/OrderServiceImpl.java

@@ -1,12 +1,14 @@
 package com.ruoyi.info.order.service.impl;
 
 import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.util.ObjectUtil;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.common.constant.UserConstants;
 import com.ruoyi.common.core.domain.PageQuery;
 import com.ruoyi.common.core.page.TableDataInfo;
 import com.ruoyi.common.exception.ServiceException;
@@ -19,14 +21,21 @@ import com.ruoyi.info.hospital.domain.vo.HospitalStatisticsVo;
 import com.ruoyi.info.hospital.domain.vo.HospitalVo;
 import com.ruoyi.info.hospital.service.IHospitalDepartmentService;
 import com.ruoyi.info.hospital.service.IHospitalService;
+import com.ruoyi.info.management.domain.vo.ManagementTeacherVo;
+import com.ruoyi.info.management.service.IManagementTeacherService;
+import com.ruoyi.info.nursing.domain.NursingWorker;
+import com.ruoyi.info.nursing.service.INursingWorkerService;
 import com.ruoyi.info.order.domain.Order;
 import com.ruoyi.info.order.domain.bo.OrderBo;
+import com.ruoyi.info.order.domain.bo.OrderWorkerChangeRecordBo;
 import com.ruoyi.info.order.domain.vo.OrderVo;
+import com.ruoyi.info.order.domain.vo.OrderWorkerChangeRecordVo;
 import com.ruoyi.info.order.enums.CancellationMethod;
 import com.ruoyi.info.order.enums.OrderStatus;
 import com.ruoyi.info.order.exception.OrderExceptionEnum;
 import com.ruoyi.info.order.mapper.OrderMapper;
 import com.ruoyi.info.order.service.IOrderService;
+import com.ruoyi.info.order.service.IOrderWorkerChangeRecordService;
 import com.ruoyi.info.patient.domain.Patient;
 import com.ruoyi.info.patient.domain.vo.PatientVo;
 import com.ruoyi.info.patient.service.IPatientService;
@@ -65,6 +74,9 @@ public class OrderServiceImpl implements IOrderService {
     private final IHospitalDepartmentService hospitalDepartmentService;
     private final IPatientService patientService;
     private final IUserService userService;
+    private final INursingWorkerService nursingWorkerService;
+    private final IOrderWorkerChangeRecordService orderWorkerChangeRecordService;
+    private final IManagementTeacherService managementTeacherService;
 
     /**
      * 查询订单分页
@@ -109,6 +121,7 @@ public class OrderServiceImpl implements IOrderService {
         lqw.eq(bo.getSellingPrice() != null, Order::getSellingPrice, bo.getSellingPrice());
         lqw.eq(bo.getTotalPrice() != null, Order::getTotalPrice, bo.getTotalPrice());
         lqw.eq(bo.getWorkerId() != null, Order::getWorkerId, bo.getWorkerId());
+        lqw.in(CollUtil.isNotEmpty(bo.getHospitalDepartmentIds()), Order::getHospitalDepartmentId, bo.getHospitalDepartmentIds());
         //日期
         buildTime(bo);
         lqw.ge(bo.getStartTime() != null, Order::getCreateTime, bo.getStartTime());
@@ -145,6 +158,16 @@ public class OrderServiceImpl implements IOrderService {
             vo.setUserName(user.getNickname());
             vo.setUserMobile(user.getMobile());
         }
+        //护工
+        if (ObjectUtil.isNotNull(vo.getWorkerId())) {
+            OrderWorkerChangeRecordVo orderWorkerChangeRecordVo = orderWorkerChangeRecordService.queryByOrderAndWorker(vo.getId(), vo.getWorkerId());
+            ManagementTeacherVo managementTeacherVo = managementTeacherService.queryById(orderWorkerChangeRecordVo.getOperatingTeacherId());
+            if (ObjectUtil.isNotNull(managementTeacherVo)) {
+                orderWorkerChangeRecordVo.setOperatingTeacherName(managementTeacherVo.getName());
+                orderWorkerChangeRecordVo.setOperatingTeacherPhoneNumber(managementTeacherVo.getPhoneNumber());
+            }
+            vo.setOrderWorkerChangeRecord(orderWorkerChangeRecordVo);
+        }
         return vo;
     }
 
@@ -250,16 +273,18 @@ public class OrderServiceImpl implements IOrderService {
     }
 
     @Override
-    public boolean cancel(Long id, Long userId) {
+    public boolean cancel(Long id, Long userId, CancellationMethod cancellationMethod) {
         Order order = loadById(id, true);
-        if (!order.getUserId().equals(userId)) {
-            throw new ServiceException(OrderExceptionEnum.Order_IS_NOT_YOURS);
+        if (CancellationMethod.user_canceled.equals(cancellationMethod)) {
+            if (!order.getUserId().equals(userId)) {
+                throw new ServiceException(OrderExceptionEnum.Order_IS_NOT_YOURS);
+            }
         }
         if (!OrderStatus.wait_confirmed.equals(order.getStatus())) {
             throw new ServiceException(OrderExceptionEnum.Order_STATUS_ERROR);
         }
         order.setStatus(OrderStatus.canceled);
-        order.setCancellationMethod(CancellationMethod.user_canceled);
+        order.setCancellationMethod(cancellationMethod);
         order.setCancellationTime(new Date());
         return baseMapper.updateById(order) > 0;
     }
@@ -303,6 +328,38 @@ public class OrderServiceImpl implements IOrderService {
         }).collect(Collectors.toList());
     }
 
+    @Transactional
+    @Override
+    public boolean assignWorker(OrderBo bo, Long teacherId) {
+        Order order = loadById(bo.getId(), true);
+        if (!OrderStatus.wait_confirmed.equals(order.getStatus()) && !OrderStatus.wait_service.equals(order.getStatus())
+        && !OrderStatus.in_progress.equals(order.getStatus())) {
+            throw new ServiceException(OrderExceptionEnum.Order_STATUS_IS_NOT_ASSIGN);
+        }
+        //判断护工
+        NursingWorker nursingWorker = nursingWorkerService.loadById(bo.getWorkerId(), true);
+        if (!nursingWorker.getHospitalId().equals(order.getHospitalId())) {
+            throw new ServiceException(OrderExceptionEnum.Order_WORKER_NOT_IN_HOSPITAL);
+        }
+        if (!nursingWorker.getEnableStatus().equals(UserConstants.NORMAL)) {
+            throw new ServiceException(OrderExceptionEnum.Order_WORKER_NOT_ENABLE);
+        }
+        order.setWorkerId(bo.getWorkerId());
+        if (OrderStatus.wait_confirmed.equals(order.getStatus())) {
+            order.setStatus(OrderStatus.wait_service);
+        }
+        //新增护工分配记录
+        OrderWorkerChangeRecordBo orderWorkerChangeRecordBo = new OrderWorkerChangeRecordBo();
+        orderWorkerChangeRecordBo.setOrderId(order.getId());
+        orderWorkerChangeRecordBo.setWorkerId(nursingWorker.getId());
+        orderWorkerChangeRecordBo.setWorkerName(nursingWorker.getName());
+        orderWorkerChangeRecordBo.setWorkerPhoneNumber(nursingWorker.getPhoneNumber());
+        orderWorkerChangeRecordBo.setSex(nursingWorker.getSex());
+        orderWorkerChangeRecordBo.setOperatingTeacherId(teacherId);
+        orderWorkerChangeRecordService.insertByBo(orderWorkerChangeRecordBo);
+        return baseMapper.updateById(order) > 0;
+    }
+
     private List<OrderVo> convertAllList(List<OrderVo> list, boolean queryPatient) {
         return list.stream().map(o -> {
             HospitalVo hospitalVo = JSONObject.parseObject(o.getHospitalInfo(), HospitalVo.class);

+ 10 - 0
ruoyi-info/src/main/java/com/ruoyi/info/order/service/impl/OrderWorkerChangeRecordServiceImpl.java

@@ -154,4 +154,14 @@ public class OrderWorkerChangeRecordServiceImpl implements IOrderWorkerChangeRec
         return baseMapper.deleteBatchIds(ids) > 0;
     }
 
+    @Override
+    public OrderWorkerChangeRecordVo queryByOrderAndWorker(Long orderId, Long workerId) {
+        return baseMapper.selectVoOne(new LambdaQueryWrapper<OrderWorkerChangeRecord>()
+            .eq(OrderWorkerChangeRecord::getOrderId, orderId)
+            .eq(OrderWorkerChangeRecord::getWorkerId, workerId)
+            .orderByDesc(OrderWorkerChangeRecord::getCreateTime)
+            .last("limit 1")
+        );
+    }
+
 }