diff --git a/xinelu-nurse-applet/src/main/java/com/xinelu/applet/controller/healthconsultation/HealthConsultationController.java b/xinelu-nurse-applet/src/main/java/com/xinelu/applet/controller/healthconsultation/HealthConsultationController.java new file mode 100644 index 0000000..e9c8b39 --- /dev/null +++ b/xinelu-nurse-applet/src/main/java/com/xinelu/applet/controller/healthconsultation/HealthConsultationController.java @@ -0,0 +1,84 @@ +package com.xinelu.applet.controller.healthconsultation; + +import com.xinelu.applet.service.healthconsultation.HealthConsultationService; +import com.xinelu.applet.vo.healthconsultation.HealthConsultationOrderDTO; +import com.xinelu.common.annotation.MobileRequestAuthorization; +import com.xinelu.common.annotation.RepeatSubmit; +import com.xinelu.common.core.controller.BaseController; +import com.xinelu.common.core.domain.AjaxResult; +import com.xinelu.common.core.page.TableDataInfo; +import com.xinelu.common.custominterface.Insert; +import com.xinelu.common.exception.ServiceException; +import com.xinelu.manage.domain.hospitalpersoninfo.HospitalPersonInfo; +import org.springframework.validation.BindingResult; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import java.math.BigDecimal; +import java.util.List; +import java.util.Objects; + +/** + * @Description APP及小程序健康咨询接口 + * @Author zh + * @Date 2023-03-07 + */ +@RestController +@RequestMapping("/nurseApp/healthConsultation") +public class HealthConsultationController extends BaseController { + @Resource + private HealthConsultationService healthConsultationService; + + /** + * 健康咨询-预约医生 + */ + @MobileRequestAuthorization + @GetMapping("/selectDepartment") + public TableDataInfo selectDepartment() { + return healthConsultationService.selectDepartment(); + } + + /** + * 健康咨询-预约医生-单查科室人员 + */ + @MobileRequestAuthorization + @GetMapping("/selectHospitalPerson") + public TableDataInfo selectHospitalPerson(Long departmentId) { + startPage(); + List list = healthConsultationService.selectHospitalPerson(departmentId); + return getDataTable(list); + } + + /** + * 健康咨询-信息确认 + */ + @MobileRequestAuthorization + @GetMapping("/informationConfirmation") + public AjaxResult informationConfirmation(Long patientId) { + if (Objects.isNull(patientId)) { + return AjaxResult.error("用户信息为空!"); + } + return healthConsultationService.informationConfirmation(patientId); + } + + + /** + * 手机App和微信小程序健康咨询确认订单方法 + * + * @param healthConsultationOrderDTO 健康咨询订单 + * @return 结果 + */ + @MobileRequestAuthorization + @RepeatSubmit + @PostMapping("/addHealthConsultationOrder") + public AjaxResult addHealthConsultationOrder(@Validated(Insert.class) @RequestBody HealthConsultationOrderDTO healthConsultationOrderDTO, BindingResult bindingResult) { + if (bindingResult.hasErrors()) { + throw new ServiceException(bindingResult.getAllErrors().get(0).getDefaultMessage()); + } + if (Objects.nonNull(healthConsultationOrderDTO.getTotalPrice()) && healthConsultationOrderDTO.getTotalPrice().compareTo(BigDecimal.ZERO) <= 0) { + return AjaxResult.error("预约金额不正确,无法下单,请输入正确的预约金额!"); + } + return healthConsultationService.insertHealthConsultationOrder(healthConsultationOrderDTO); + } +} diff --git a/xinelu-nurse-applet/src/main/java/com/xinelu/applet/mapper/healthconsultation/HealthConsultationMapper.java b/xinelu-nurse-applet/src/main/java/com/xinelu/applet/mapper/healthconsultation/HealthConsultationMapper.java new file mode 100644 index 0000000..27769d8 --- /dev/null +++ b/xinelu-nurse-applet/src/main/java/com/xinelu/applet/mapper/healthconsultation/HealthConsultationMapper.java @@ -0,0 +1,30 @@ +package com.xinelu.applet.mapper.healthconsultation; + +import com.xinelu.applet.vo.healthconsultation.HealthConsultationVO; +import com.xinelu.manage.domain.patientinfo.PatientInfo; + +import java.util.List; + +/** + * 健康咨询Mapper接口 + * + * @author 张恒 + * @date 2023-03-07 + */ +public interface HealthConsultationMapper { + + /** + * 健康咨询-信息确认 + * + * @param patientId 用户信息 + * @return PatientInfo + */ + PatientInfo selectPatientById(Long patientId); + + /** + * 查询科室信息管理列表 + * + * @return 科室信息管理集合 + */ + List selectHospitalDepartmentList(); +} diff --git a/xinelu-nurse-applet/src/main/java/com/xinelu/applet/service/healthconsultation/HealthConsultationService.java b/xinelu-nurse-applet/src/main/java/com/xinelu/applet/service/healthconsultation/HealthConsultationService.java new file mode 100644 index 0000000..469223f --- /dev/null +++ b/xinelu-nurse-applet/src/main/java/com/xinelu/applet/service/healthconsultation/HealthConsultationService.java @@ -0,0 +1,50 @@ +package com.xinelu.applet.service.healthconsultation; + + + +import com.xinelu.applet.vo.healthconsultation.HealthConsultationOrderDTO; +import com.xinelu.common.core.domain.AjaxResult; +import com.xinelu.common.core.page.TableDataInfo; +import com.xinelu.manage.domain.hospitalpersoninfo.HospitalPersonInfo; + +import java.util.List; + +/** + * @Description 健康咨询接口业务层 + * @Author zh + * @Date 2023-03-07 + */ +public interface HealthConsultationService { + + /** + * 健康咨询-预约医生 + * + * @return AjaxResult + */ + TableDataInfo selectDepartment(); + + /** + * 单查科室人员 + * + * @param departmentId 科室id + * @return AjaxResult + */ + List selectHospitalPerson(Long departmentId); + + /** + * 健康咨询-信息确认 + * + * @param patientId 用户信息 + * @return AjaxResult + */ + AjaxResult informationConfirmation(Long patientId); + + + /** + * 手机App和微信小程序健康咨询确认订单方法 + * + * @param healthConsultationOrderDTO 健康咨询订单 + * @return 结果 + */ + AjaxResult insertHealthConsultationOrder(HealthConsultationOrderDTO healthConsultationOrderDTO); +} diff --git a/xinelu-nurse-applet/src/main/java/com/xinelu/applet/service/healthconsultation/impl/HealthConsultationServiceImpl.java b/xinelu-nurse-applet/src/main/java/com/xinelu/applet/service/healthconsultation/impl/HealthConsultationServiceImpl.java new file mode 100644 index 0000000..be435a7 --- /dev/null +++ b/xinelu-nurse-applet/src/main/java/com/xinelu/applet/service/healthconsultation/impl/HealthConsultationServiceImpl.java @@ -0,0 +1,172 @@ +package com.xinelu.applet.service.healthconsultation.impl; + +import com.xinelu.applet.service.healthconsultation.HealthConsultationService; +import com.xinelu.applet.utils.AppointmentTimeUtil; +import com.xinelu.applet.vo.healthconsultation.HealthConsultationOrderDTO; +import com.xinelu.applet.vo.healthconsultation.HealthConsultationVO; +import com.xinelu.applet.vo.healthconsultation.PatientAndTimeVO; +import com.xinelu.applet.vo.specialdisease.WeekDaysVO; +import com.xinelu.common.core.domain.AjaxResult; +import com.xinelu.common.core.page.TableDataInfo; +import com.xinelu.common.enums.BuySourceEnum; +import com.xinelu.common.enums.GooodsOrderStatusEnum; +import com.xinelu.common.enums.OrderTypeEnum; +import com.xinelu.common.enums.PoserModuleTypeEnum; +import com.xinelu.common.exception.ServiceException; +import com.xinelu.common.utils.PageServiceUtil; +import com.xinelu.common.utils.StringUtils; +import com.xinelu.common.utils.bean.BeanUtils; +import com.xinelu.manage.domain.goodsOrder.GoodsOrder; +import com.xinelu.manage.domain.goodsOrderDetails.GoodsOrderDetails; +import com.xinelu.manage.domain.hospitalpersoninfo.HospitalPersonInfo; +import com.xinelu.manage.domain.patientinfo.PatientInfo; +import com.xinelu.manage.domain.poserInfo.PoserInfo; +import com.xinelu.manage.mapper.goodsOrder.GoodsOrderMapper; +import com.xinelu.manage.mapper.goodsOrderDetails.GoodsOrderDetailsMapper; +import com.xinelu.applet.mapper.healthconsultation.HealthConsultationMapper; +import com.xinelu.manage.mapper.hospitalpersoninfo.HospitalPersonInfoMapper; +import com.xinelu.manage.mapper.patientinfo.PatientInfoMapper; +import com.xinelu.manage.mapper.poserInfo.PoserInfoMapper; +import com.xinelu.manage.vo.patientinfo.PatientInfoVO; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.compress.utils.Lists; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +/** + * @Description 健康咨询接口业务层实现类 + * @Author zh + * @Date 2023-03-07 + */ +@Slf4j +@Service +public class HealthConsultationServiceImpl implements HealthConsultationService { + + @Resource + private PatientInfoMapper patientInfoMapper; + @Resource + private GoodsOrderMapper goodsOrderMapper; + @Resource + private GoodsOrderDetailsMapper goodsOrderDetailsMapper; + @Resource + private HealthConsultationMapper healthConsultationMapper; + @Resource + private PoserInfoMapper poserInfoMapper; + @Resource + private HospitalPersonInfoMapper hospitalPersonInfoMapper; + @Resource + private AppointmentTimeUtil appointmentTimeUtil; + @Resource + private PageServiceUtil pageServiceUtil; + + /** + * 健康咨询-预约医生 + * + * @return AjaxResult + */ + @Override + public TableDataInfo selectDepartment() { + //查询海报及科室 + List poserList = poserInfoMapper.selectPoserListByModuleTyp(PoserModuleTypeEnum.HEALTH_CONSUTION_MODULE.getInfo()); + pageServiceUtil.startPage(); + List healthConsultation = healthConsultationMapper.selectHospitalDepartmentList(); + if (CollectionUtils.isNotEmpty(healthConsultation)) { + healthConsultation.get(0).setPoserInfoList(poserList); + } + return pageServiceUtil.getDataTable(healthConsultation); + } + + /** + * 单查科室人员 + * + * @param departmentId 科室id + * @return AjaxResult + */ + @Override + public List selectHospitalPerson(Long departmentId) { + if (Objects.isNull(departmentId)) { + return new ArrayList<>(); + } + return hospitalPersonInfoMapper.selectHospitalPerson(departmentId); + } + + /** + * 健康咨询-信息确认 + * + * @param patientId 用户信息 + * @return AjaxResult + */ + @Override + public AjaxResult informationConfirmation(Long patientId) { + PatientAndTimeVO patientAndTime = new PatientAndTimeVO(); + PatientInfo patientInfo = healthConsultationMapper.selectPatientById(patientId); + if (Objects.isNull(patientInfo)) { + return AjaxResult.error("用户信息不存在!"); + } + LocalDate nowTime = LocalDate.now(); + //近七天的预约时间点数据集合 + List weekDaysList = Lists.newArrayList(); + appointmentTimeUtil.setWeekDayAndWeekDate(nowTime, weekDaysList); + patientAndTime.setAppointmentTimeList(weekDaysList); + patientAndTime.setPatientName(patientInfo.getPatientName()); + patientAndTime.setPhone(patientInfo.getPhone()); + return AjaxResult.success(patientAndTime); + } + + /** + * 手机App和微信小程序健康咨询确认订单方法 + * + * @param healthConsultationOrderDTO 健康咨询订单 + * @return 结果 + */ + @Transactional(rollbackFor = Exception.class) + @Override + public AjaxResult insertHealthConsultationOrder(HealthConsultationOrderDTO healthConsultationOrderDTO) { + //判断当前会员信息是否存在 + PatientInfoVO patientInfo = patientInfoMapper.getPatientInfoById(healthConsultationOrderDTO.getPatientId()); + if (Objects.isNull(patientInfo)) { + return AjaxResult.error("用户信息不存在,无法预约专家!"); + } + //根据id查询当前专家是否存在 + HospitalPersonInfo hospitalPersonInfo = hospitalPersonInfoMapper.selectHospitalPersonInfoById(healthConsultationOrderDTO.getHospitalPersonId()); + if (Objects.isNull(hospitalPersonInfo)) { + return AjaxResult.error("当前专家信息不存在,请重新预约!"); + } + //生成订单信息 + GoodsOrder goodsOrder = new GoodsOrder(); + BeanUtils.copyProperties(healthConsultationOrderDTO, goodsOrder); + String goodOrderNo = StringUtils.fillZeroByPatientId(healthConsultationOrderDTO.getPatientId(), 5) + System.nanoTime(); + goodsOrder.setOrderNo(goodOrderNo); + goodsOrder.setOrderStatus(GooodsOrderStatusEnum.WAIT_PAY.getInfo()); + goodsOrder.setDelFlag(0); + goodsOrder.setOrderType(OrderTypeEnum.HEALTH_CONSULTATION.getInfo()); + goodsOrder.setBuySource(BuySourceEnum.HEALTH_CONSULTATION.getInfo()); + goodsOrder.setCreateTime(LocalDateTime.now()); + goodsOrder.setOrderTime(LocalDateTime.now()); + goodsOrder.setOriginalTotalPrice(healthConsultationOrderDTO.getTotalPrice()); + int insertGoodsOrder = goodsOrderMapper.insertGoodsOrder(goodsOrder); + if (insertGoodsOrder <= 0) { + throw new ServiceException("预约订单新增信息失败,请联系管理员!"); + } + GoodsOrderDetails goodsOrderDetails = new GoodsOrderDetails(); + goodsOrderDetails.setGoodsOrderId(goodsOrder.getId()); + goodsOrderDetails.setOrderNo(goodOrderNo); + goodsOrderDetails.setGoodsName("健康咨询"); + goodsOrderDetails.setTotalPrice(healthConsultationOrderDTO.getTotalPrice()); + goodsOrderDetails.setDelFlag(0); + goodsOrderDetails.setCreateTime(LocalDateTime.now()); + int insertGoodsOrderDetails = goodsOrderDetailsMapper.insertGoodsOrderDetails(goodsOrderDetails); + if (insertGoodsOrderDetails <= 0) { + throw new ServiceException("预约订单明细新增信息失败,请联系管理员!"); + } + return AjaxResult.success(goodsOrderMapper.getGoodsOrderByOrderNo(goodOrderNo)); + } +} diff --git a/xinelu-nurse-applet/src/main/java/com/xinelu/applet/vo/healthconsultation/HealthConsultationOrderDTO.java b/xinelu-nurse-applet/src/main/java/com/xinelu/applet/vo/healthconsultation/HealthConsultationOrderDTO.java new file mode 100644 index 0000000..dc05cfa --- /dev/null +++ b/xinelu-nurse-applet/src/main/java/com/xinelu/applet/vo/healthconsultation/HealthConsultationOrderDTO.java @@ -0,0 +1,131 @@ +package com.xinelu.applet.vo.healthconsultation; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.xinelu.common.custominterface.Insert; +import com.xinelu.common.custominterface.Update; +import lombok.Data; +import org.hibernate.validator.constraints.Length; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.Date; + +/** + * @author ljh + * @version 1.0 + * Create by 2023/3/8 13:59 + */ +@Data +public class HealthConsultationOrderDTO implements Serializable { + private static final long serialVersionUID = 8664995394794180987L; + + /** + * 主键id + */ + private Long id; + + /** + * 商品订单表id + */ + private Long goodsOrderId; + + /** + * 订单编号 + */ + private String orderNo; + + /** + * 0:否,1:是 + */ + private Integer delFlag; + + /** + * 会员id + */ + @NotNull(message = "咨询人员信息不能为空!", groups = {Insert.class, Update.class}) + private Long patientId; + + /** + * 订单状态,待付款:WAIT_PAY,已付款:PAY,已取消:CANCEL,待收货:WAIT_RECEIVED,已收货:RECEIVED,待退款:WAIT_REFUND,已退款:REFUNDED,待退货:WAIT_RETURNED,已退货:RETURNED + */ + private String orderStatus; + + /** + * 订单总金额 + */ + @NotNull(message = "金额不能为空", groups = {Insert.class, Update.class}) + private BigDecimal totalPrice; + + /** + * 收货人 + */ + @NotBlank(message = "姓名不能为空", groups = {Insert.class, Update.class}) + @Length(max = 20, message = "姓名不能超过20位", groups = {Insert.class, Update.class}) + private String receiver; + + /** + * 联系电话 + */ + @NotBlank(message = "联系电话不能为空", groups = {Insert.class, Update.class}) + @Length(max = 11, message = "联系电话不能超过11位", groups = {Insert.class, Update.class}) + private String phone; + + /** + * 下单时间 + */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime orderTime; + /** + * 下单方式,手机App:MOBILE_APP,微信小程序:WECHAT_APPLET,支付宝小程序:ALI_PAY_APPLET + */ + @NotNull(message = "下单方式不能为空", groups = {Insert.class, Update.class}) + private String orderChannel; + + /** + * 护理站:NURSE_STATION,商城:SHOPPING_MALL,健康咨询:HEALTH_CONSULTATION + */ + private String buySource; + + /** + * 订单类型,积分兑换:INTEGRAL_EXCHANGE,直接购买:DIRECT_BUY,健康咨询:HEALTH_CONSULTATION + */ + private String orderType; + + /** + * 健康咨询人员表id,记录咨询订单中选择的医生,健康咨询订单使用 + */ + @NotNull(message = "请选择咨询的专家!", groups = {Insert.class, Update.class}) + private Long hospitalPersonId; + + /** + * 商品原始金额,即:商品数量 * 商品单价 + */ + private BigDecimal originalTotalPrice; + + /** + * 创建时间 + */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime createTime; + + /** + * 健康咨询预约时间,健康咨询订单使用 + **/ + @JsonFormat(pattern = "yyyy-MM-dd") + @NotNull(message = "服务日期不能为空", groups = {Insert.class, Update.class}) + private Date healthAppointDate; + + /** + * 健康咨询内容,健康咨询类型的订单使用 + */ + private String healthConsultationContent; + + /** + * 健康咨询专家,记录咨询订单中选择的医生姓名,健康咨询订单使用 + */ + @NotBlank(message = "请选择咨询的专家!", groups = {Insert.class, Update.class}) + private String hospitalPersonName; +} diff --git a/xinelu-nurse-applet/src/main/java/com/xinelu/applet/vo/healthconsultation/HealthConsultationVO.java b/xinelu-nurse-applet/src/main/java/com/xinelu/applet/vo/healthconsultation/HealthConsultationVO.java new file mode 100644 index 0000000..73f412b --- /dev/null +++ b/xinelu-nurse-applet/src/main/java/com/xinelu/applet/vo/healthconsultation/HealthConsultationVO.java @@ -0,0 +1,30 @@ +package com.xinelu.applet.vo.healthconsultation; + +import com.xinelu.manage.domain.poserInfo.PoserInfo; +import lombok.Data; + +import java.util.List; + +/** + * @Description 健康咨询返回值实体类 + * @Author zh + * @Date 2023-03-07 + */ +@Data +public class HealthConsultationVO { + + /** + * 科室id + */ + private Long departmentId; + + /** + * 科室名称 + */ + private String departmentName; + + /** + * 海报集合 + */ + List poserInfoList; +} diff --git a/xinelu-nurse-applet/src/main/java/com/xinelu/applet/vo/healthconsultation/PatientAndTimeVO.java b/xinelu-nurse-applet/src/main/java/com/xinelu/applet/vo/healthconsultation/PatientAndTimeVO.java new file mode 100644 index 0000000..f42770e --- /dev/null +++ b/xinelu-nurse-applet/src/main/java/com/xinelu/applet/vo/healthconsultation/PatientAndTimeVO.java @@ -0,0 +1,30 @@ +package com.xinelu.applet.vo.healthconsultation; + +import com.xinelu.applet.vo.specialdisease.WeekDaysVO; +import lombok.Data; + +import java.util.List; + +/** + * @Description 信息确认返回值实体类 + * @Author zh + * @Date 2023-03-07 + */ +@Data +public class PatientAndTimeVO { + + /** + * 用户姓名 + */ + private String patientName; + + /** + * 手机号码 + */ + private String phone; + + /** + * 近七天的预约时间点集合 + */ + List appointmentTimeList; +} diff --git a/xinelu-nurse-applet/src/main/resources/mapper/applet/healthconsultation/HealthConsultationMapper.xml b/xinelu-nurse-applet/src/main/resources/mapper/applet/healthconsultation/HealthConsultationMapper.xml new file mode 100644 index 0000000..f96089d --- /dev/null +++ b/xinelu-nurse-applet/src/main/resources/mapper/applet/healthconsultation/HealthConsultationMapper.xml @@ -0,0 +1,21 @@ + + + + + + + +