Commit d1a52aea by Wangmin

Merge remote-tracking branch 'origin/dev' into dev

parents ed6444ac d8659897
......@@ -35,6 +35,8 @@
<xxl-job.version>2.4.0</xxl-job.version>
<lombok.version>1.18.26</lombok.version>
<bouncycastle.version>1.72</bouncycastle.version>
<joda.time.version>2.9.9</joda.time.version>
<!-- 离线IP地址定位库 -->
<ip2region.version>2.7.0</ip2region.version>
......@@ -273,6 +275,12 @@
<version>${snakeyaml.version}</version>
</dependency>
<dependency>
<groupId>joda-time</groupId>
<artifactId>joda-time</artifactId>
<version>${joda.time.version}</version>
</dependency>
<!-- 加密包引入 -->
<dependency>
<groupId>org.bouncycastle</groupId>
......@@ -342,6 +350,7 @@
<version>${PeiZhen-Java.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
......@@ -356,7 +365,6 @@
<module>pz-accompany</module>
<module>pz-merchant</module>
<module>pz-applet</module>
<module>pz-chat</module>
</modules>
<packaging>pom</packaging>
......
......@@ -31,7 +31,7 @@ import javax.validation.constraints.NotNull;
@RestController
@RequestMapping("app/accompany")
@SaIgnore
public class EmployeesAccompanyController extends BaseController {
public class AccompanyEmployeesAccompanyController extends BaseController {
private final ITotalOrderService totalOrderService;
......
package com.pz.accompany;
import com.pz.common.core.controller.BaseController;
import com.pz.common.core.domain.PageQuery;
import com.pz.common.core.domain.R;
import com.pz.common.core.page.TableDataInfo;
import com.pz.common.core.validate.EditGroup;
import com.pz.merchant.domain.bo.EmployeesBo;
import com.pz.merchant.domain.bo.EmployeesListBo;
import com.pz.merchant.domain.bo.OrderBo;
import com.pz.merchant.domain.bo.SetEmployeeWorkingHourBo;
import com.pz.merchant.domain.vo.EmployeesListVo;
import com.pz.merchant.domain.vo.EmployeesVo;
import com.pz.merchant.domain.vo.OrderInfoVO;
import com.pz.merchant.domain.vo.TodayOrderListVo;
import com.pz.merchant.service.IEmployeesService;
import lombok.RequiredArgsConstructor;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.validation.constraints.NotNull;
/**
* 陪诊员信息
*
* @author WangMin
* @date 2023-09-11
*/
@Validated
@RequiredArgsConstructor
@RestController
@RequestMapping("/accompany/employees")
public class AccompanyEmployeesController extends BaseController {
private final IEmployeesService employeesService;
/**
* 修改陪诊员个人信息
*
* @param bo
* @return
*/
@PutMapping("/updateEmployees")
public R<Boolean> updateEmployees(EmployeesBo bo) {
return R.ok(employeesService.updateByBo(bo));
}
/**
* 陪诊员个人信息
*/
@GetMapping("/getEmployeesInfo")
public R<EmployeesVo> getEmployeesInfo() {
return R.ok(employeesService.queryByUserId(getUserId()));
}
}
......@@ -4,6 +4,8 @@ import com.pz.common.core.controller.BaseController;
import com.pz.common.core.domain.PageQuery;
import com.pz.common.core.domain.R;
import com.pz.common.core.page.TableDataInfo;
import com.pz.common.utils.StringUtils;
import com.pz.merchant.domain.bo.EmployeesBo;
import com.pz.merchant.domain.vo.EmployeesVo;
import com.pz.merchant.service.IEmployeesService;
import com.pz.system.domain.bo.IncomeBo;
......@@ -12,9 +14,14 @@ import com.pz.system.service.IIncomeService;
import lombok.RequiredArgsConstructor;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.sql.rowset.serial.SerialException;
import java.math.BigDecimal;
import java.util.Optional;
/**
* 陪诊员-财务收益
*
......@@ -25,7 +32,7 @@ import org.springframework.web.bind.annotation.RestController;
@RequiredArgsConstructor
@RestController
@RequestMapping("/accompany/employees")
public class EmployeesIncomeController extends BaseController {
public class AccompanyEmployeesIncomeController extends BaseController {
private final IEmployeesService iEmployeesService;
......@@ -51,4 +58,25 @@ public class EmployeesIncomeController extends BaseController {
}
/**
* 陪诊员提现
*
* @param bo
* @return
*/
@PutMapping("/withdrawEmployees")
public R<Boolean> withdrawEmployees(IncomeBo bo) {
Optional.ofNullable(iEmployeesService.queryByUserId(getUserId()))
.ifPresent(employeesVo -> {
//判断提现金额是否大于余额
if (bo.getAmount().compareTo(StringUtils.isNotBlank(employeesVo.getBalance()) ? new BigDecimal(employeesVo.getBalance()) : new BigDecimal("0.00")) > 0) {
try {
throw new SerialException("余额不足以本次提现");
} catch (SerialException e) {
throw new RuntimeException(e);
}
}
});
return R.ok(true);
}
}
......@@ -52,6 +52,11 @@
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
<dependency>
<groupId>com.pz</groupId>
<artifactId>pz-system</artifactId>
</dependency>
......
package com.pz.chat.controller;
import java.util.List;
import java.util.Arrays;
import com.pz.common.core.domain.entity.SysUser;
import com.pz.system.domain.SessionList;
import com.pz.system.mapper.SessionListMapper;
import com.pz.system.mapper.SysUserMapper;
import lombok.RequiredArgsConstructor;
import javax.servlet.http.HttpServletResponse;
import javax.validation.constraints.*;
package com.pz.web.controller.system;
import cn.dev33.satoken.annotation.SaCheckPermission;
import org.springframework.web.bind.annotation.*;
import org.springframework.validation.annotation.Validated;
import com.pz.common.annotation.RepeatSubmit;
import cn.dev33.satoken.annotation.SaIgnore;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.pz.common.annotation.Log;
import com.pz.common.annotation.RepeatSubmit;
import com.pz.common.core.controller.BaseController;
import com.pz.common.core.domain.PageQuery;
import com.pz.common.core.domain.R;
import com.pz.common.core.domain.entity.SysUser;
import com.pz.common.core.page.TableDataInfo;
import com.pz.common.core.validate.AddGroup;
import com.pz.common.core.validate.EditGroup;
import com.pz.common.enums.BusinessType;
import com.pz.common.utils.poi.ExcelUtil;
import com.pz.system.domain.vo.SessionListVo;
import com.pz.system.domain.SessionList;
import com.pz.system.domain.bo.SessionListBo;
import com.pz.system.service.ISessionListService;
import com.pz.common.core.page.TableDataInfo;
import com.pz.system.domain.vo.SessionListVo;
import com.pz.system.mapper.SessionListMapper;
import com.pz.system.mapper.SysUserMapper;
import lombok.RequiredArgsConstructor;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.validation.constraints.NotEmpty;
/**
* 会话列
......@@ -38,37 +33,47 @@ import com.pz.common.core.page.TableDataInfo;
@Validated
@RequiredArgsConstructor
@RestController
@RequestMapping("/system/list")
@RequestMapping("/system/session")
public class SessionListController extends BaseController {
private final SessionListMapper sessionListMapper;
private final SysUserMapper sysUserMapper;
/**
* 查询会话列列表
*/
@GetMapping("/list")
public TableDataInfo<SessionListVo> list(SessionListBo bo, PageQuery pageQuery) {
return sessionListMapper.selectVoPage(pageQuery.build(), Wrappers.<SessionList>lambdaQuery().eq(SessionList::getUserId, getUserId()));
}
/**
* 创建会话
*/
@SaCheckPermission("system:list:add")
@Log(title = "会话列", businessType = BusinessType.INSERT)
@RepeatSubmit()
@PostMapping()
@PostMapping("/createSession")
@SaIgnore
@Transactional
public R<Void> add(@Validated(AddGroup.class) @RequestBody SessionListBo bo) {
// 创建会话列表对象
SessionList sessionList = new SessionList();
sessionList.setUserId(bo.getUserId());
sessionList.setUnReadCount(0L);
sessionList.setListName(bo.getToUserName());
sessionList.setToUserId(bo.getToUserId());
// 插入会话列表记录
sessionListMapper.insert(sessionList);
// 判断对方和我建立会话没有? 没有也要建立
Integer SessionId = sessionListMapper.selectIdByUser(bo.getToUserId(), bo.getUserId());
if (SessionId == null || SessionId <= 0) {
SysUser user = sysUserMapper.selectUserById(bo.getUserId());
sessionList.setUserId(bo.getToUserId());
sessionList.setToUserId(bo.getUserId());
sessionList.setListName(user.getNickName());
sessionListMapper.insert(sessionList);
// 判断对方和我建立会话没有,如果没有则建立
boolean hasSession = sessionListMapper.selectIdByUser(bo.getToUserId(), bo.getUserId()) > 0;
if (!hasSession) {
// 新建会话列表对象
SessionList newSessionList = new SessionList();
newSessionList.setUserId(bo.getToUserId());
newSessionList.setToUserId(bo.getUserId());
// 插入新的会话列表记录
sessionListMapper.insert(newSessionList);
}
return R.ok();
}
......@@ -79,11 +84,11 @@ public class SessionListController extends BaseController {
*
* @param id 主键
*/
@SaCheckPermission("system:list:remove")
@Log(title = "会话列", businessType = BusinessType.DELETE)
@DeleteMapping("/{id}")
public R<Void> remove(@NotEmpty(message = "主键不能为空")
@PathVariable Long id) {
return toAjax(sessionListMapper.deleteById(id));
}
}
package com.pz.web.controller.system;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.pz.common.core.domain.entity.SysUser;
import com.pz.common.utils.DateUtils;
import com.pz.system.domain.Message;
import com.pz.system.domain.SessionList;
import com.pz.system.mapper.MessageMapper;
import com.pz.system.mapper.SessionListMapper;
import com.pz.system.mapper.SysUserMapper;
import com.pz.system.service.ISysUserService;
import com.pz.web.controller.websocket.SpringContextUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import javax.websocket.*;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
/**
* @author lisw
* @program ly-project
* @description 聊天
* @createDate 2021-05-30 11:32:39
* <p>
* 描述:
* 一对一聊天
* @ServerEndpoint 注解是一个类层次的注解,它的功能主要是将目前的类定义成一个websocket服务器端,
* 注解的值将被用于监听用户连接的终端访问URL地址,客户端可以通过这个URL来连接到WebSocket服务器端
*/
@Component
@Slf4j
@ServerEndpoint("/webSocketOneToOne/{sendId}/{roomId}")
public class WebSocketOneToOneController {
// 静态变量,用来记录当前在线连接数。应该把它设计成线程安全的。
private static int onlineCount;
//实现服务端与单一客户端通信的话,可以使用Map来存放,其中Key为用户标识
private static final Map<Long, WebSocketOneToOneController> connections = new ConcurrentHashMap<>();
public static Map<Long, List<Object>> sessionPool = new ConcurrentHashMap<>();
// 与某个客户端的连接会话,需要通过它来给客户端发送数据
private Session session;
private Long sendId;
private String roomId;
@Resource
private MessageMapper messageMapper;
@Resource
private SessionListMapper sessionListMapper;
/**
* 连接建立成功调用的方法
*
* @param session 可选的参数。session为与某个客户端的连接会话,需要通过它来给客户端发送数据
*/
@OnOpen
public void onOpen(@PathParam("sendId") Long sendId, @PathParam("roomId") String roomId, Session session) {
this.session = session;
this.sendId = sendId; //用户标识
this.roomId = roomId; //会话标识
List<Object> list = new ArrayList<>();
list.add(roomId);
list.add(session);
connections.put(sendId, this); //添加到map中
sessionPool.put(sendId, list); //创建会话
addOnlineCount(); // 在线数加
log.info("sendId:" + sendId + "roomId:" + roomId);
System.out.println(this.session);
System.out.println("有新连接加入!新用户:" + sendId + ",当前在线人数为" + getOnlineCount());
}
/**
* 连接关闭调用的方法
*/
@OnClose
public void onClose() {
connections.remove(sendId); // 从map中移除
subOnlineCount(); // 在线数减
System.out.println("有一连接关闭!当前在线人数为" + getOnlineCount());
}
/**
* 收到客户端消息后调用的方法
*
* @param message 客户端发送过来的消息
* @param session 可选的参数
*/
@OnMessage
public void onMessage(String message, Session session) {
String sessionId = this.session.getPathParameters().get("roomId");
System.out.println("来自客户端的消息:" + message);
JSONObject json = JSON.parseObject(message);
String msg = json.getString("content"); // 需要发送的信息
String requestId = json.getString("requestId");
int msgType = json.getIntValue("messageType");
String lastMessageTime = json.getString("lastMessageTime"); // 使用类型推断,如果不存在键"lastMessageTime",则为null
Long receiveId = json.getLong("receiveId"); // 发送对象的用户标识(接收者)
// 发送消息
send(msg, sendId, receiveId, roomId, msgType, requestId, lastMessageTime, sessionId);
}
/**
* 发生错误时调用
*
* @param session
* @param error
*/
@OnError
public void onError(Session session, Throwable error) {
System.out.println("发生错误");
error.printStackTrace();
}
private void sendMessage(SessionList sessionList, Message message) {
int res = messageMapper.insert(message);
if (res == 1) {
message.setStatus("-1");
}
WebSocketOneToOneController con = connections.get(message.getReceiver());
if (con != null && roomId.equals(con.roomId)) {
try {
con.session.getBasicRemote().sendText(JSON.toJSONString(message));
message.setIsRead("1");
messageMapper.updateById(message);
} catch (IOException e) {
// 处理发送消息异常
e.printStackTrace();
}
}
WebSocketOneToOneController confrom = connections.get(message.getSender());
if (confrom != null && roomId.equals(confrom.roomId)) {
try {
confrom.session.getBasicRemote().sendText(JSON.toJSONString(message));
} catch (IOException e) {
// 处理发送消息异常
e.printStackTrace();
}
}
}
/**
* @param msg 消息内容
* @param sendId 发送人
* @param receiveId 接收人
* @param roomId 房间ID
* @param msgType 消息类型
* @param requestId 消息请求ID
* @param lastMessageTime 最后一次的消息时间
*/
public void send(String msg, Long sendId, Long receiveId, String roomId, int msgType, String requestId, String lastMessageTime, String sessionId) {
Message message = new Message();
message.setContent(msg);
Date now = new Date();
message.setReceiver(receiveId);
message.setSender(sendId);
message.setContentType(msgType);
message.setIsRead("0");
message.setRequestId(requestId);
message.setType(0);
if (StringUtils.isNotBlank(lastMessageTime)) {
Date lastTime = DateUtils.stringToDate(lastMessageTime, "yyyy-MM-dd HH:mm");
long minute = (now.getTime() - lastTime.getTime()) / 1000 / 60;
log.info("此二人聊天,距离上一次聊天时间相差分钟数:" + minute);
if (minute > 5) {
message.setType(1);
}
}
if (messageMapper == null) {
this.messageMapper = (MessageMapper) SpringContextUtil.getBean("messageMapper");
}
if (sessionListMapper == null) {
this.sessionListMapper = (SessionListMapper) SpringContextUtil.getBean("sessionListMapper");
}
//获取本次会话信息
SessionList sessionList = sessionListMapper.selectById(Integer.parseInt(sessionId));
List<Object> list = sessionPool.get(sessionList.getToUserId());
try {
if (list == null || list.isEmpty()) {
//增加对方未读数
sessionListMapper.addUnReadCount(receiveId, sendId);
} else {
Integer toId = Integer.valueOf((String) list.get(0));
if (Integer.valueOf(sessionId).equals(toId)) {
//彼此都在会话中,直接发送消息
sendMessage(sessionList, message);
} else {
if (sessionId == null) {
//创建会话
SessionList tmpSessionList = new SessionList();
tmpSessionList.setUserId(sessionList.getToUserId());
tmpSessionList.setToUserId(sessionList.getUserId());
tmpSessionList.setUnReadCount(1L);
sessionListMapper.insert(tmpSessionList);
} else {
//增加对方未读数
sessionListMapper.addUnReadCount(receiveId, sendId);
}
sendMessage(sessionList, message);
}
}
} catch (Exception e) {
// 处理发送消息异常
e.printStackTrace();
}
}
public static synchronized int getOnlineCount() {
return onlineCount;
}
public static synchronized void addOnlineCount() {
WebSocketOneToOneController.onlineCount++;
}
public static synchronized void subOnlineCount() {
WebSocketOneToOneController.onlineCount--;
}
}
package com.pz.chat.util;
package com.pz.web.controller.websocket;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
......
package com.pz.web.controller.websocket;
import lombok.Data;
import javax.websocket.Session;
@Data
public class WebSocketData {
/**
* 当前连接
*/
private Session session;
/**
* 当前通讯ID
*/
private String communicationId;
}
......@@ -141,6 +141,7 @@ security:
# system 仅用于调试阶段
- /system/**
- /applet/**
- /websocket/**
# MyBatisPlus配置
# https://baomidou.com/config/
......
......@@ -50,7 +50,7 @@ public class AppletDepartmentController extends BaseController {
* 根据医院查询科室列表
*/
@GetMapping("/DepartmentByHospitalId")
public R<List<Department>> departmentByHospitalId(Integer hospitalId) {
public R<List<DepartmentVo>> departmentByHospitalId(Integer hospitalId) {
return R.ok(iDepartmentService.departmentByHospitalId(hospitalId));
}
}
package com.pz.applet;
import cn.dev33.satoken.annotation.SaCheckPermission;
import com.pz.common.annotation.Log;
import com.pz.common.annotation.RepeatSubmit;
import com.pz.common.core.controller.BaseController;
import com.pz.common.core.domain.PageQuery;
import com.pz.common.core.domain.R;
import com.pz.common.core.page.TableDataInfo;
import com.pz.common.core.validate.AddGroup;
import com.pz.common.core.validate.EditGroup;
import com.pz.common.enums.BusinessType;
import com.pz.common.utils.poi.ExcelUtil;
import com.pz.system.domain.bo.DoctorBo;
import com.pz.system.domain.vo.DoctorVo;
import com.pz.system.service.IDoctorService;
import lombok.RequiredArgsConstructor;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletResponse;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import java.util.Arrays;
import java.util.List;
/**
* 医生
*
* @author ruoyi
* @date 2023-09-07
*/
@Validated
@RequiredArgsConstructor
@RestController
@RequestMapping("/applet/doctor")
public class AppletDoctorController extends BaseController {
private final IDoctorService iDoctorService;
/**
* 查询医生列表
*/
@GetMapping("/list")
public TableDataInfo<DoctorVo> list(DoctorBo bo, PageQuery pageQuery) {
return iDoctorService.queryPageList(bo, pageQuery);
}
}
......@@ -41,13 +41,17 @@ public class AppletStoreApplyController extends BaseController {
/**
* 新增商城商户申请
*/
@SaCheckPermission("system:apply:add")
@Log(title = "商城商户申请", businessType = BusinessType.INSERT)
@RepeatSubmit()
@PostMapping()
public R<Void> add(@Validated(AddGroup.class) @RequestBody StoreApplyBo bo) {
return toAjax(iStoreApplyService.insertByBo(bo));
}
/**
* 查询商户状态
*/
@GetMapping("/status")
public R<StoreApplyVo> getStatus(){
return R.ok(iStoreApplyService.queryByUserId());
}
}
......@@ -59,8 +59,8 @@ public class AppletStoreGoodsController extends BaseController {
* 商城商品分类列表
*/
@GetMapping("/shopGoodsClassify")
public List<StoreApplyVo> shopGoodsClassify() {
return iStoreGoodsService.shopGoodsClassify();
public R<List<StoreApplyVo>> shopGoodsClassify() {
return R.ok(iStoreGoodsService.shopGoodsClassify());
}
/**
......
......@@ -13,6 +13,7 @@ import com.pz.common.core.domain.R;
import com.pz.common.core.domain.entity.SysDept;
import com.pz.common.core.domain.entity.SysRole;
import com.pz.common.core.domain.entity.SysUser;
import com.pz.common.core.domain.model.LoginUser;
import com.pz.common.core.page.TableDataInfo;
import com.pz.common.enums.BusinessType;
import com.pz.common.excel.ExcelResult;
......@@ -70,7 +71,8 @@ public class AppletSysUserController extends BaseController {
*/
@GetMapping("/getIdentity")
public R<UserIdentityVo> getIdentity() {
return R.ok(userService.checkUserIdentity(LoginHelper.getLoginUser().getUserId().intValue()));
LoginUser loginUser = LoginHelper.getLoginUser();
return R.ok(userService.checkUserIdentity(loginUser.getUserId().intValue()));
}
/**
......@@ -99,7 +101,6 @@ public class AppletSysUserController extends BaseController {
*/
@PutMapping
public R<Void> edit(@Validated @RequestBody SysUser user) {
user.setUserId(LoginHelper.getLoginUser().getUserId());
userService.checkUserAllowed(user);
userService.checkUserDataScope(user.getUserId());
if (!userService.checkUserNameUnique(user)) {
......
package com.pz.applet;
import cn.dev33.satoken.annotation.SaCheckPermission;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.github.binarywang.wxpay.bean.notify.WxPayNotifyResponse;
import com.github.binarywang.wxpay.bean.notify.WxPayOrderNotifyResult;
import com.github.binarywang.wxpay.bean.request.WxPayUnifiedOrderRequest;
import com.github.binarywang.wxpay.bean.result.BaseWxPayResult;
import com.github.binarywang.wxpay.exception.WxPayException;
import com.github.binarywang.wxpay.service.WxPayService;
import com.pz.common.annotation.Log;
import com.pz.common.annotation.RepeatSubmit;
import com.pz.common.core.controller.BaseController;
......@@ -10,21 +17,27 @@ import com.pz.common.core.page.TableDataInfo;
import com.pz.common.core.validate.AddGroup;
import com.pz.common.core.validate.EditGroup;
import com.pz.common.enums.BusinessType;
import com.pz.common.helper.LoginHelper;
import com.pz.common.utils.poi.ExcelUtil;
import com.pz.system.domain.bo.CreateOrderBo;
import com.pz.system.domain.bo.PaymentRecordBo;
import com.pz.system.domain.bo.TotalOrderBo;
import com.pz.system.domain.vo.PaymentRecordVo;
import com.pz.system.domain.vo.TotalOrderVo;
import com.pz.system.service.IPayService;
import com.pz.system.service.IPaymentRecordService;
import com.pz.system.service.ITotalOrderService;
import lombok.RequiredArgsConstructor;
import org.apache.commons.io.IOUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import java.math.BigDecimal;
import java.util.Arrays;
import java.util.List;
import java.util.Random;
......@@ -45,11 +58,14 @@ public class AppletTotalOrderController extends BaseController {
private final IPaymentRecordService iPaymentRecordService;
private final IPayService iPayService;
/**
* 查询总订单列表
*/
@GetMapping("/list")
public TableDataInfo<TotalOrderVo> list(TotalOrderBo bo, PageQuery pageQuery) {
bo.setUid(LoginHelper.getLoginUser().getUserId().intValue());
return iTotalOrderService.queryPageList(bo, pageQuery);
}
......@@ -119,4 +135,35 @@ public class AppletTotalOrderController extends BaseController {
public R<Void> cancelOrder(@Validated(AddGroup.class) @RequestBody TotalOrderBo recordBo) {
return toAjax(iTotalOrderService.cancelOrder(recordBo));
}
/**
* 订单支付
*/
@RepeatSubmit()
@PostMapping("/Orderpay")
public R<Object> Orderpay(@Validated(AddGroup.class) @RequestBody TotalOrderBo recordBo) {
return R.ok(iTotalOrderService.payOrder(recordBo));
}
/**
* 订单回调
*/
@ResponseBody
@PostMapping("/orderPayCallBack")
public R<Void> orderPayCallBack(HttpServletRequest request, HttpServletResponse response) {
try {
String xmlResult = IOUtils.toString(request.getInputStream(), request.getCharacterEncoding());
WxPayOrderNotifyResult result = iPayService.parseOrderNotifyResult(xmlResult);
// 加入自己处理订单的业务逻辑,需要判断订单是否已经支付过,否则可能会重复调用
/* String orderNum = result.getOutTradeNo();
iTotalOrderService.*/
return R.ok();
} catch (Exception e) {
System.out.println("微信回调结果异常,异常原因" + e.getMessage());
return R.fail();
}
}
}
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.pz</groupId>
<artifactId>PeiZhen-Java</artifactId>
<version>4.8.0</version>
</parent>
<artifactId>pz-chat</artifactId>
<description>
聊天服务模块
</description>
<dependencies>
<!-- 通用工具-->
<dependency>
<groupId>com.pz</groupId>
<artifactId>pz-common</artifactId>
</dependency>
<dependency>
<groupId>com.pz</groupId>
<artifactId>pz-sms</artifactId>
</dependency>
<dependency>
<groupId>com.pz</groupId>
<artifactId>pz-system</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
</dependencies>
</project>
package com.pz.chat.controller;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.pz.chat.util.CurPool;
import com.pz.chat.util.JsonUtils;
import com.pz.chat.util.SpringContextUtil;
import com.pz.common.core.domain.entity.SysUser;
import com.pz.system.domain.MsgInfo;
import com.pz.system.domain.SessionList;
import com.pz.system.mapper.MsgInfoMapper;
import com.pz.system.mapper.SessionListMapper;
import com.pz.system.mapper.SysUserMapper;
import com.pz.system.service.IMsgInfoService;
import com.pz.system.service.ISessionListService;
import com.pz.system.service.ISysUserService;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import javax.websocket.OnClose;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
@Component
@ServerEndpoint("/websocket/{userId}/{sessionId}")
public class ChatController {
@Resource
private SessionListMapper sessionListMapper;
@Resource
private SysUserMapper sysUserMapper;
@Resource
private MsgInfoMapper msgInfoMapper;
private Session session;
@OnOpen
public void onOpen(Session session, @PathParam(value = "userId") Integer userId, @PathParam(value = "sessionId") String sessionId) {
this.session = session;
// 打开连接时保存WebSocket的会话对象
CurPool.webSockets.put(userId, this);
// 将WebSocket对象放入WebSocket连接池中
List<Object> list = new ArrayList<>();
list.add(sessionId);
list.add(session);
// 将会话ID和会话对象放入会话池中
CurPool.sessionPool.put(userId, list);
}
@OnClose
public void onClose() {
// 断开连接删除用户删除session
Long userId = Long.parseLong(this.session.getRequestParameterMap().get("userId").get(0));
// 获取用户ID
CurPool.sessionPool.remove(userId);
CurPool.webSockets.remove(userId);
// 从会话池和连接池中移除WebSocket对象
if (sysUserMapper == null) {
this.sysUserMapper = (SysUserMapper) SpringContextUtil.getBean("sysUserMapper");
}
SysUser user = sysUserMapper.selectUserById(userId);
// 从用户池中移除用户
CurPool.curUserPool.remove(user.getNickName());
}
@OnMessage
public void onMessage(String message) {
String sessionId = this.session.getRequestParameterMap().get("sessionId").get(0);
// 获取会话ID
if (sessionId == null) {
System.out.println("sessionId 错误");
}
if (sessionListMapper == null) {
this.sessionListMapper = (SessionListMapper) SpringContextUtil.getBean("sessionListMapper");
}
// 根据会话ID注入SeesionListMapper
if (sysUserMapper == null) {
this.sysUserMapper = (SysUserMapper) SpringContextUtil.getBean("sysUserMapper");
}
// 根据会话ID注入UserMapper
if (msgInfoMapper == null) {
this.msgInfoMapper = (MsgInfoMapper) SpringContextUtil.getBean("msgInfoMapper");
}
SessionList sessionList = sessionListMapper.selectById(Long.parseLong(sessionId));
// 根据会话ID查询会话列表
SysUser user = sysUserMapper.selectUserById(sessionList.getUserId());
// 根据会话列表中的用户ID查询用户信息
MsgInfo msgInfo = new MsgInfo();
msgInfo.setContent(message);
msgInfo.setFromUserId(sessionList.getUserId());
msgInfo.setFromUserName(user.getNickName());
msgInfo.setToUserId(sessionList.getToUserId());
msgInfo.setToUserName(sessionList.getListName());
msgInfo.setUnReadFlag(0L);
// 创建消息对象,设置消息的内容、创建时间、发送方和接收方的信息
msgInfoMapper.insert(msgInfo);
// 将消息持久化到数据库中
List<Object> list = CurPool.sessionPool.get(sessionList.getToUserId());
// 根据接收方的用户ID从会话池中获取会话列表
if (list == null || list.isEmpty()) {
sessionListMapper.addUnReadCount(sessionList.getToUserId(), sessionList.getUserId());
// 用户不存在,更新未读消息数量
} else {
String id = sessionListMapper.selectIdByUser(sessionList.getToUserId(), sessionList.getUserId()) + "";
String o = list.get(0) + "";
if (id.equals(o)) {
sendTextMessage(sessionList.getToUserId(), JsonUtils.objectToJson(msgInfo));
// 会话存在,直接发送消息
} else {
if (StringUtils.isNotBlank(id)) {
SessionList tmpSessionList = new SessionList();
tmpSessionList.setUserId(sessionList.getToUserId());
tmpSessionList.setToUserId(sessionList.getUserId());
tmpSessionList.setListName(user.getNickName());
tmpSessionList.setUnReadCount(1L);
sessionListMapper.insert(tmpSessionList);
// 新增会话列表
} else {
sessionListMapper.addUnReadCount(sessionList.getToUserId(), sessionList.getUserId());
// 更新未读消息数量
}
List<SessionList> sessionLists = sessionListMapper.selectList(Wrappers.<SessionList>lambdaQuery().eq(SessionList::getUserId, sessionList.getToUserId()));
// 会话不存在,发送会话列表消息
sendTextMessage(sessionList.getToUserId(), JsonUtils.objectToJson(sessionLists));
}
}
// 输出收到的消息
System.out.println("【websocket消息】收到客户端消息:" + message);
}
public void sendTextMessage(Long userId, String message) {
Session session = (Session) CurPool.sessionPool.get(userId).get(1);
// 根据用户ID从会话池中获取会话对象
if (session != null) {
try {
session.getBasicRemote().sendText(message);
// 发送文本消息
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
package com.pz.chat.util;
import com.pz.chat.controller.ChatController;
import com.pz.common.core.domain.entity.SysUser;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
/**
* 统一管理session、websocket、curUser
*/
public class CurPool {
// public static CopyOnWriteArraySet<WebSocket> webSockets =new CopyOnWriteArraySet<>();
public static Map<Integer, ChatController> webSockets = new ConcurrentHashMap<>();
// list 里面第一个存sessionId,第二个存session
public static Map<Integer, List<Object>> sessionPool = new ConcurrentHashMap<>();
// 当前登录用户x
public static Map<String, SysUser> curUserPool = new ConcurrentHashMap<>();
}
......@@ -113,6 +113,17 @@
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
<dependency>
<groupId>joda-time</groupId>
<artifactId>joda-time</artifactId>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-extra</artifactId>
</dependency>
......
package com.pz.chat.util;
package com.pz.common;
import com.fasterxml.jackson.annotation.JsonInclude.Include;
import com.fasterxml.jackson.core.JsonProcessingException;
......
package com.pz.chat.config;
package com.pz.common.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
......
......@@ -54,16 +54,12 @@ public class SysUser extends BaseEntity {
/**
* 用户账号
*/
@Xss(message = "用户账号不能包含脚本字符")
@NotBlank(message = "用户账号不能为空")
@Size(min = 0, max = 30, message = "用户账号长度不能超过{max}个字符")
private String userName;
/**
* 用户昵称
*/
@Xss(message = "用户昵称不能包含脚本字符")
@NotBlank(message = "用户昵称不能为空")
@Size(min = 0, max = 30, message = "用户昵称长度不能超过{max}个字符")
private String nickName;
......
......@@ -15,12 +15,12 @@ import lombok.Getter;
public enum UserType {
/**
* pc端
* 普通用户
*/
SYS_USER("sys_user"),
/**
* app端
* 陪诊员
*/
APP_USER("app_user"),
......
......@@ -2,7 +2,10 @@ package com.pz.common.utils;
import lombok.AccessLevel;
import lombok.NoArgsConstructor;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.time.DateFormatUtils;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;
import java.lang.management.ManagementFactory;
import java.text.ParseException;
......@@ -12,6 +15,7 @@ import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.util.Date;
/**
......@@ -92,6 +96,20 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils {
}
/**
* 字符串转换成日期
* @param strDate 日期字符串
* @param pattern 日期的格式,如:DateUtils.DATE_TIME_PATTERN
*/
public static Date stringToDate(String strDate, String pattern) {
if (StringUtils.isBlank(strDate)){
return null;
}
DateTimeFormatter fmt = DateTimeFormat.forPattern(pattern);
return fmt.parseLocalDateTime(strDate).toDate();
}
/**
* 日期路径 即年/月/日 如20180808
*/
public static String dateTime() {
......
......@@ -98,4 +98,14 @@ public class Employees extends BaseEntity {
@TableLogic
private String delFlag;
/**
* 身份证号
*/
private String cardNo;
/**
* 手机号
*/
private String phone;
}
......@@ -22,109 +22,91 @@ public class EmployeesBo extends BaseEntity {
/**
*
*/
@NotNull(message = "不能为空", groups = { EditGroup.class })
private Integer id;
/**
* 陪诊员
*/
@NotBlank(message = "陪诊员 不能为空", groups = { AddGroup.class, EditGroup.class })
private String name;
/**
* 职业开始年份
*/
@NotBlank(message = "职业开始年份不能为空", groups = { AddGroup.class, EditGroup.class })
private String startYear;
/**
* 用户
*/
@NotNull(message = "用户不能为空", groups = { AddGroup.class, EditGroup.class })
private Integer uid;
/**
* 工作时段
*/
@NotBlank(message = "工作时段不能为空", groups = { AddGroup.class, EditGroup.class })
private String workingHours;
/**
* 状态
*/
@NotNull(message = "状态不能为空", groups = { AddGroup.class, EditGroup.class })
private Integer status;
/**
* 所属商户
*/
@NotNull(message = "所属商户不能为空", groups = { AddGroup.class, EditGroup.class })
private Integer companyId;
/**
* 身份证正面照
*/
@NotBlank(message = "身份证正面照不能为空", groups = { AddGroup.class, EditGroup.class })
private String cardFront;
/**
* 身份证反面照
*/
@NotBlank(message = "身份证反面照不能为空", groups = { AddGroup.class, EditGroup.class })
private String cardReverse;
/**
* 健康证
*/
@NotBlank(message = "健康证不能为空", groups = { AddGroup.class, EditGroup.class })
private String healthCertificate;
/**
* 经度
*/
@NotBlank(message = "经度不能为空", groups = { AddGroup.class, EditGroup.class })
private String lng;
/**
* 纬度
*/
@NotBlank(message = "纬度不能为空", groups = { AddGroup.class, EditGroup.class })
private String lat;
/**
* 城市
*/
@NotNull(message = "城市不能为空", groups = { AddGroup.class, EditGroup.class })
private Long cityId;
/**
* 当前身份
*/
@NotNull(message = "当前身份不能为空", groups = { AddGroup.class, EditGroup.class })
private Integer nowType;
/**
* 总收益
*/
@NotBlank(message = "总收益不能为空", groups = { AddGroup.class, EditGroup.class })
private String totalRevenue;
/**
* 当前余额
*/
@NotBlank(message = "当前余额不能为空", groups = { AddGroup.class, EditGroup.class })
private String balance;
/**
* 冻结余额
*/
@NotNull(message = "冻结余额不能为空", groups = { AddGroup.class, EditGroup.class })
private Long freezeBalance;
/**
* 取消订单次数
*/
@NotNull(message = "取消订单次数不能为空", groups = { AddGroup.class, EditGroup.class })
private Integer killOrder;
/**
......
......@@ -5,6 +5,7 @@ import com.alibaba.excel.annotation.ExcelProperty;
import com.pz.common.annotation.ExcelDictFormat;
import com.pz.common.convert.ExcelDictConvert;
import com.pz.system.domain.TotalOrder;
import com.pz.system.domain.vo.TotalOrderVo;
import lombok.Data;
import java.util.Date;
......@@ -123,5 +124,12 @@ public class EmployeesVo {
/**
* 最近好评
*/
private List<TotalOrder> totalOrderVo;
private List<TotalOrderVo> totalOrderVo;
/**
* 工作年限
*/
private Integer wrokYear;
private String phone;
}
......@@ -20,8 +20,12 @@ import com.pz.merchant.domain.bo.SetEmployeeWorkingHourBo;
import com.pz.merchant.domain.vo.*;
import com.pz.merchant.mapper.CompanyMapper;
import com.pz.merchant.service.ISonOrderService;
import com.pz.system.domain.Business;
import com.pz.system.domain.TotalOrder;
import com.pz.system.domain.bo.EmployeesCompanyBo;
import com.pz.system.domain.vo.BusinessVo;
import com.pz.system.domain.vo.TotalOrderVo;
import com.pz.system.mapper.BusinessMapper;
import com.pz.system.mapper.CityMapper;
import com.pz.system.mapper.SysUserMapper;
import com.pz.system.mapper.TotalOrderMapper;
......@@ -32,6 +36,7 @@ import com.pz.merchant.domain.Employees;
import com.pz.merchant.mapper.EmployeesMapper;
import com.pz.merchant.service.IEmployeesService;
import java.time.LocalDate;
import java.util.*;
/**
......@@ -50,6 +55,7 @@ public class EmployeesServiceImpl implements IEmployeesService {
private final CityMapper cityMapper;
private final TotalOrderMapper totalOrderMapper;
private final SonOrderServiceBuilder sonOrderServiceBuilder;
private final BusinessMapper businessMapper;
/**
* 查询陪诊员
......@@ -140,7 +146,7 @@ public class EmployeesServiceImpl implements IEmployeesService {
*/
SysUser sysUser = new SysUser();
sysUser.setUserId(bo.getUid().longValue());
sysUser.setPhonenumber(bo.getPhone());
//sysUser.setPhonenumber(bo.getPhone());
if (bo.getIdentity() == 2) {
Employees add = BeanUtil.toBean(bo, Employees.class);
add.setNowType(1);
......@@ -187,15 +193,20 @@ public class EmployeesServiceImpl implements IEmployeesService {
*/
@Override
public TableDataInfo<EmployeesVo> queryPageAppNeed(EmployeesBo bo, PageQuery pageQuery) {
// 获取当前日期
LocalDate currentDate = LocalDate.now();
// 获取当前年份
int year = currentDate.getYear();
Page<EmployeesVo> result = baseMapper.selectEmployees(bo, pageQuery.build());
Optional.ofNullable(result.getRecords()).ifPresent(EmployeesVo -> {
EmployeesVo.forEach(t -> {
List<TotalOrder> totalOrder = totalOrderMapper.selectList(Wrappers.<TotalOrder>lambdaQuery()
List<TotalOrderVo> totalOrder = totalOrderMapper.selectVoList(Wrappers.<TotalOrder>lambdaQuery()
.eq(TotalOrder::getEmId, t.getId())
.eq(TotalOrder::getIsSatisfaction, 1)
.orderByDesc(TotalOrder::getId)
.last("LIMIT 1"));
t.setTotalOrderVo(totalOrder);
t.setWrokYear(year - Integer.parseInt(t.getStartYear()));
});
});
return TableDataInfo.build(result);
......@@ -213,7 +224,7 @@ public class EmployeesServiceImpl implements IEmployeesService {
Page<EmployeesVo> result = baseMapper.selectEmployees(bo, pageQuery.build());
Optional.ofNullable(result.getRecords()).ifPresent(EmployeesVo -> {
EmployeesVo.forEach(t -> {
List<TotalOrder> totalOrder = totalOrderMapper.selectList(Wrappers.<TotalOrder>lambdaQuery()
List<TotalOrderVo> totalOrder = totalOrderMapper.selectVoList(Wrappers.<TotalOrder>lambdaQuery()
.eq(TotalOrder::getEmId, t.getId())
.eq(TotalOrder::getIsSatisfaction, 1)
.orderByDesc(TotalOrder::getId)
......@@ -231,10 +242,16 @@ public class EmployeesServiceImpl implements IEmployeesService {
@Override
public EmployeesVo queryByApp(Integer id) {
EmployeesVo employeesVo = baseMapper.selectEmployeesById(id);
List<TotalOrder> totalOrder = totalOrderMapper.selectList(Wrappers.<TotalOrder>lambdaQuery()
List<TotalOrderVo> totalOrder = totalOrderMapper.selectVoList(Wrappers.<TotalOrder>lambdaQuery()
.eq(TotalOrder::getEmId, employeesVo.getId())
.eq(TotalOrder::getIsSatisfaction, 1)
.orderByDesc(TotalOrder::getId));
for (TotalOrderVo order : totalOrder) {
BusinessVo businessVo = businessMapper.selectVoOne(new LambdaQueryWrapper<Business>().eq(Business::getId, order.getBusinessId()));
if (null != businessVo) {
order.setProject(businessVo.getName());
}
}
employeesVo.setTotalOrderVo(totalOrder);
return employeesVo;
}
......@@ -277,6 +294,11 @@ public class EmployeesServiceImpl implements IEmployeesService {
@Override
public EmployeesVo queryByUserId(Long userId) {
EmployeesVo employeesVo = baseMapper.selectVoOne(Wrappers.<Employees>lambdaQuery().eq(Employees::getUid, userId));
//获取所属商户
Optional.ofNullable(companyMapper.selectVoById(employeesVo.getCompanyId()))
.ifPresent(companyVo -> employeesVo.setCompanyName(companyVo.getName()));
return baseMapper.selectVoOne(Wrappers.<Employees>lambdaQuery().eq(Employees::getUid, userId));
}
......
......@@ -5,6 +5,8 @@ import com.pz.common.core.domain.BaseEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.math.BigDecimal;
/**
* 陪诊员/商户提现对象 income
......@@ -43,7 +45,7 @@ public class Income extends BaseEntity {
/**
* 提现金额
*/
private Long amount;
private BigDecimal amount;
/**
* 提现状态 0-待审核,1-成功提现,2-拒绝提现
*/
......
package com.pz.system.domain;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.pz.common.core.domain.BaseEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* @author lisw
* @program message
* @description
* @createDate 2021-08-18 17:03:58
**/
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("message")
public class Message extends BaseEntity {
private static final long serialVersionUID = 1L;
/**
* 主键ID
*/
@TableId
private Long id;
/**
* 是否显示时间
* 0:否 1:是
*/
private Integer type;
/**
* 消息内容
*/
private String content;
/**
* 内容类型 0文字1图片2视频 3礼物
*/
private Integer contentType;
/**
* 是否已读
*/
private String isRead;
/**
* 发送人
*/
private Long sender;
/**
* 接收人
*/
private Long receiver;
/**
* 发送消息请求ID
*/
private String requestId;
/**
* 是否已读
*/
private Boolean isLast;
/**
* 状态
*/
private String status;
/**
* 备注
*/
private String remark;
}
package com.pz.system.domain;
import com.baomidou.mybatisplus.annotation.*;
import com.pz.common.core.domain.BaseEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* 消息对象 msg_info
*
* @author ruoyi
* @date 2023-09-09
*/
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("msg_info")
public class MsgInfo extends BaseEntity {
private static final long serialVersionUID=1L;
/**
* 消息id
*/
@TableId(value = "id")
private Long id;
/**
* 消息发送者id
*/
private Long fromUserId;
/**
* 消息发送者名称
*/
private String fromUserName;
/**
* 消息接收者id
*/
private Long toUserId;
/**
* 消息接收者名称
*/
private String toUserName;
/**
* 消息内容
*/
private String content;
/**
* 是否已读(1 已读)
*/
private Long unReadFlag;
}
......@@ -13,9 +13,8 @@ import lombok.EqualsAndHashCode;
* @date 2023-09-09
*/
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("session_list")
public class SessionList extends BaseEntity {
public class SessionList {
private static final long serialVersionUID=1L;
......@@ -33,10 +32,6 @@ public class SessionList extends BaseEntity {
*/
private Long toUserId;
/**
* 会话名称
*/
private String listName;
/**
* 未读消息数
*/
private Long unReadCount;
......
......@@ -51,7 +51,7 @@ public class TotalOrder extends BaseEntity {
/**
* 订单价格
*/
private String payMoney;
private Double payMoney;
/**
* 订单状态
*/
......@@ -80,7 +80,7 @@ public class TotalOrder extends BaseEntity {
/**
* 退款金额
*/
private String refundAmount;
private Double refundAmount;
/**
* 删除标志(0代表存在 2代表删除)
*/
......
package com.pz.system.domain.bo;
import com.pz.common.core.domain.BaseEntity;
import com.pz.common.core.validate.AddGroup;
import com.pz.common.core.validate.EditGroup;
import lombok.Data;
import lombok.EqualsAndHashCode;
import javax.validation.constraints.NotBlank;
import java.util.List;
@Data
......@@ -15,6 +18,16 @@ public class CreateOrderBo extends BaseEntity {
private Integer businessId;
/**
* 经度
*/
private String lng;
/**
* 纬度
*/
private String lat;
/**
* 订单价格
*/
private Double payMoney;
......
......@@ -4,6 +4,7 @@ import com.pz.common.core.domain.BaseEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;
import javax.validation.constraints.*;
import java.math.BigDecimal;
/**
......@@ -45,7 +46,7 @@ public class IncomeBo extends BaseEntity {
/**
* 提现金额
*/
private Long amount;
private BigDecimal amount;
/**
* 提现状态 0-待审核,1-成功提现,2-拒绝提现
......
package com.pz.system.domain.bo;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.pz.common.core.domain.BaseEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* @author lisw
* @program message
* @description
* @createDate 2021-08-18 17:03:58
**/
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("message")
public class MessageBo extends BaseEntity {
private static final long serialVersionUID = 1L;
/**
* 主键ID
*/
@TableId
private Long id;
/**
* 是否显示时间
* 0:否 1:是
*/
private Integer type;
/**
* 消息内容
*/
private String content;
/**
* 内容类型 0文字1图片2视频 3礼物
*/
private Integer contentType;
/**
* 是否已读
*/
private String isRead;
/**
* 发送人
*/
private Long sender;
/**
* 接收人
*/
private Long receiver;
/**
* 发送消息请求ID
*/
private String requestId;
/**
* 是否已读
*/
private Boolean isLast;
/**
* 状态
*/
private String status;
/**
* 备注
*/
private String remark;
}
package com.pz.system.domain.bo;
import com.pz.common.core.domain.BaseEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;
import javax.validation.constraints.*;
/**
* 消息业务对象 msg_info
*
* @author ruoyi
* @date 2023-09-09
*/
@Data
@EqualsAndHashCode(callSuper = true)
public class MsgInfoBo extends BaseEntity {
/**
* 消息id
*/
private Long id;
/**
* 消息发送者id
*/
private Long fromUserId;
/**
* 消息发送者名称
*/
private String fromUserName;
/**
* 消息接收者id
*/
private Long toUserId;
/**
* 消息接收者名称
*/
private String toUserName;
/**
* 消息内容
*/
private String content;
/**
* 是否已读(1 已读)
*/
private Long unReadFlag;
}
......@@ -87,5 +87,7 @@ public class TotalOrderBo extends BaseEntity {
*/
private String refundAmount;
private String orderTitle;
private String openid;
}
......@@ -4,8 +4,11 @@ import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty;
import com.pz.common.annotation.ExcelDictFormat;
import com.pz.common.convert.ExcelDictConvert;
import com.pz.common.core.domain.BaseEntity;
import lombok.Data;
import java.math.BigDecimal;
/**
* 陪诊员/商户提现视图对象 income
......@@ -15,7 +18,7 @@ import lombok.Data;
*/
@Data
@ExcelIgnoreUnannotated
public class IncomeVo {
public class IncomeVo extends BaseEntity {
private static final long serialVersionUID = 1L;
......@@ -53,7 +56,7 @@ public class IncomeVo {
* 提现金额
*/
@ExcelProperty(value = "提现金额")
private Long amount;
private BigDecimal amount;
/**
* 提现状态 0-待审核,1-成功提现,2-拒绝提现
......
package com.pz.system.domain.vo;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.Data;
import java.io.Serializable;
@Data
public class MessageVo implements Serializable {
/**
* 主键ID
*/
@TableId
private Long id;
/**
* 是否显示时间
* 0:否 1:是
*/
private Integer type;
/**
* 消息内容
*/
private String content;
/**
* 内容类型 0文字1图片2视频 3礼物
*/
private Integer contentType;
/**
* 是否已读
*/
private String isRead;
/**
* 发送人
*/
private Long sender;
/**
* 接收人
*/
private Long receiver;
/**
* 发送消息请求ID
*/
private String requestId;
/**
* 是否已读
*/
private Boolean isLast;
/**
* 状态
*/
private String status;
/**
* 备注
*/
private String remark;
}
package com.pz.system.domain.vo;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty;
import com.pz.common.annotation.ExcelDictFormat;
import com.pz.common.convert.ExcelDictConvert;
import lombok.Data;
/**
* 消息视图对象 msg_info
*
* @author ruoyi
* @date 2023-09-09
*/
@Data
@ExcelIgnoreUnannotated
public class MsgInfoVo {
private static final long serialVersionUID = 1L;
/**
* 消息id
*/
@ExcelProperty(value = "消息id")
private Long id;
/**
* 消息发送者id
*/
@ExcelProperty(value = "消息发送者id")
private Long fromUserId;
/**
* 消息发送者名称
*/
@ExcelProperty(value = "消息发送者名称")
private String fromUserName;
/**
* 消息接收者id
*/
@ExcelProperty(value = "消息接收者id")
private Long toUserId;
/**
* 消息接收者名称
*/
@ExcelProperty(value = "消息接收者名称")
private String toUserName;
/**
* 消息内容
*/
@ExcelProperty(value = "消息内容")
private String content;
/**
* 是否已读(1 已读)
*/
@ExcelProperty(value = "是否已读", converter = ExcelDictConvert.class)
@ExcelDictFormat(readConverterExp = "1=,已=读")
private Long unReadFlag;
}
......@@ -176,4 +176,9 @@ public class TotalOrderVo {
*/
private String phone;
/**
* 陪护项目
*/
private String project;
}
......@@ -3,6 +3,7 @@ package com.pz.system.mapper;
import com.pz.system.domain.Information;
import com.pz.system.domain.vo.InformationVo;
import com.pz.common.core.mapper.BaseMapperPlus;
import org.apache.ibatis.annotations.Mapper;
/**
* 新闻资讯Mapper接口
......@@ -10,6 +11,7 @@ import com.pz.common.core.mapper.BaseMapperPlus;
* @author ruoyi
* @date 2023-09-07
*/
@Mapper
public interface InformationMapper extends BaseMapperPlus<InformationMapper, Information, InformationVo> {
}
package com.pz.system.mapper;
import com.pz.common.core.mapper.BaseMapperPlus;
import com.pz.system.domain.Information;
import com.pz.system.domain.Message;
import com.pz.system.domain.vo.InformationVo;
import com.pz.system.domain.vo.MessageVo;
import org.apache.ibatis.annotations.Mapper;
/**
* 聊天消息Mapper接口
*/
@Mapper
public interface MessageMapper extends BaseMapperPlus<MessageMapper, Message, MessageVo> {
}
package com.pz.system.mapper;
import com.pz.system.domain.MsgInfo;
import com.pz.system.domain.vo.MsgInfoVo;
import com.pz.common.core.mapper.BaseMapperPlus;
/**
* 消息Mapper接口
*
* @author ruoyi
* @date 2023-09-09
*/
public interface MsgInfoMapper extends BaseMapperPlus<MsgInfoMapper, MsgInfo, MsgInfoVo> {
}
......@@ -33,6 +33,13 @@ public interface ICityService {
List<CityVo> queryList(CityBo bo);
/**
* 小程序城市接口
* @param bo
* @return
*/
List<CityVo> queryAppList(CityBo bo);
/**
* 新增城市
*/
Boolean insertByBo(CityBo bo);
......
......@@ -32,7 +32,7 @@ public interface IDepartmentService {
* @param
* @return
*/
List<Department> departmentByHospitalId(Integer hospitalId);
List<DepartmentVo> departmentByHospitalId(Integer hospitalId);
/**
* 查询科室列表
......
package com.pz.system.service;
public interface IMessageService {
}
package com.pz.system.service;
import com.pz.system.domain.MsgInfo;
import com.pz.system.domain.vo.MsgInfoVo;
import com.pz.system.domain.bo.MsgInfoBo;
import com.pz.common.core.page.TableDataInfo;
import com.pz.common.core.domain.PageQuery;
import java.util.Collection;
import java.util.List;
/**
* 消息Service接口
*
* @author ruoyi
* @date 2023-09-09
*/
public interface IMsgInfoService {
/**
* 查询消息
*/
MsgInfoVo queryById(Long id);
/**
* 查询消息列表
*/
TableDataInfo<MsgInfoVo> queryPageList(MsgInfoBo bo, PageQuery pageQuery);
/**
* 查询消息列表
*/
List<MsgInfoVo> queryList(MsgInfoBo bo);
/**
* 新增消息
*/
Boolean insertByBo(MsgInfoBo bo);
/**
* 修改消息
*/
Boolean updateByBo(MsgInfoBo bo);
/**
* 校验并批量删除消息信息
*/
Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
}
package com.pz.system.service;
import com.github.binarywang.wxpay.bean.notify.WxPayOrderNotifyResult;
import com.github.binarywang.wxpay.bean.request.WxPayRefundQueryRequest;
import com.github.binarywang.wxpay.bean.request.WxPayRefundRequest;
import com.github.binarywang.wxpay.bean.request.WxPayUnifiedOrderRequest;
......@@ -86,7 +87,7 @@ public interface IPayService {
* 微信请求的接口,要求可以公网访问,要放开token校验
* @param xmlData 微信提交的请求参数
*/
String parseOrderNotifyResult(String xmlData) throws WxPayException;
WxPayOrderNotifyResult parseOrderNotifyResult(String xmlData) throws WxPayException;
/**
* 退款回调通知处理
......
......@@ -23,6 +23,12 @@ public interface IStoreApplyService {
StoreApplyVo queryById(Integer id);
/**
* 小程序查看商户申请状态
* @return
*/
StoreApplyVo queryByUserId();
/**
* 查询商城商户申请列表
*/
TableDataInfo<StoreApplyVo> queryPageList(StoreApplyBo bo, PageQuery pageQuery);
......
......@@ -70,6 +70,13 @@ public interface ITotalOrderService {
Boolean cancelOrder(TotalOrderBo bo);
/**
* 统一下单接口
* @param bo
* @return
*/
Object payOrder(TotalOrderBo bo);
/**
* 用户主动退款
*
* @param bo
......
......@@ -171,7 +171,7 @@ public class SysLoginService {
sysUser.setUserName(loginBo.getMobilePhone());
String nikeName = StringUtils.isNoneBlank(loginBo.getNikeName()) ? loginBo.getNikeName() : "用户" + RandomUtil.randomString(8);
sysUser.setNickName(nikeName);
sysUser.setUserType(UserType.APP_USER.getUserType());
sysUser.setUserType(UserType.SYS_USER.getUserType());
sysUser.setSex("2");
// 初始密码为123456
sysUser.setPassword(BCrypt.hashpw("123456"));
......
......@@ -58,6 +58,13 @@ public class CityServiceImpl implements ICityService {
return baseMapper.selectVoList(lqw);
}
@Override
public List<CityVo> queryAppList(CityBo bo) {
LambdaQueryWrapper<City> lqw = buildQueryWrapper(bo);
List<CityVo> cityVos = baseMapper.selectVoList(lqw);
return null;
}
private LambdaQueryWrapper<City> buildQueryWrapper(CityBo bo) {
LambdaQueryWrapper<City> lqw = Wrappers.lambdaQuery();
lqw.like(StringUtils.isNotBlank(bo.getName()), City::getName, bo.getName());
......
......@@ -86,7 +86,7 @@ public class DepartmentServiceImpl implements IDepartmentService {
}
@Override
public List<Department> departmentByHospitalId(Integer hospitalId) {
public List<DepartmentVo> departmentByHospitalId(Integer hospitalId) {
Hospital hospital = hospitalMapper.selectById(hospitalId);
// 去除方括号
String numbers = hospital.getDepartments().substring(1, hospital.getDepartments().length() - 1);
......@@ -99,15 +99,39 @@ public class DepartmentServiceImpl implements IDepartmentService {
for (String num : numberArray) {
integerList.add(Integer.parseInt(num.trim()));
}
List<Department> departments = baseMapper.selectList(new LambdaQueryWrapper<Department>().in(Department::getId, integerList));
List<DepartmentVo> departments = baseMapper.selectVoList(new LambdaQueryWrapper<Department>().in(Department::getId, integerList));
if (CollectionUtils.isNotEmpty(departments)) {
//查询所有菜单
List<DepartmentVo> allMenu = departments;
// 对父菜单进行排序
Collections.sort(allMenu, new Comparator<DepartmentVo>() {
@Override
public int compare(DepartmentVo o1, DepartmentVo o2) {
// 根据需要进行排序比较,可以根据实际情况修改
return Integer.compare(o1.getSortord(), o2.getSortord());
}
});
if(null != departments){
for (Department department : departments) {
department.setValue(department.getId());
department.setText(department.getTitle());
//根节点集合
List<DepartmentVo> rootMenu = new ArrayList<>();
for (DepartmentVo entity : allMenu) {
entity.setLabel(entity.getTitle());
entity.setValue(entity.getId());
entity.setText(entity.getTitle());
if (entity.getParentId() == 0) { //父节点是0的,为根节点。
rootMenu.add(entity);
}
}
//为根菜单设置子菜单,getClild是递归调用的
for (DepartmentVo entity : rootMenu) {
entity.setLabel(entity.getTitle());
/* 获取根节点下的所有子节点 使用getChild方法*/
List<DepartmentVo> childList = getChild(entity.getId().toString(), allMenu);
entity.setChildren(childList);//给根节点设置子节点
}
return rootMenu;
}
return departments;
}
......
package com.pz.system.service.impl;
import cn.hutool.core.bean.BeanUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.pz.system.domain.Department;
import com.pz.system.domain.Hospital;
import com.pz.system.domain.bo.DepartmentBo;
import com.pz.system.domain.vo.DepartmentVo;
import com.pz.system.mapper.DepartmentMapper;
import com.pz.system.mapper.HospitalMapper;
import com.pz.system.service.IDepartmentService;
import com.pz.system.service.IMessageService;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import java.util.*;
/**
* 科室Service业务层处理
*
* @author ruoyi
* @date 2023-09-07
*/
@RequiredArgsConstructor
@Service
public class MessageServiceImpl implements IMessageService {
}
package com.pz.system.service.impl;
import cn.hutool.core.bean.BeanUtil;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.pz.common.core.page.TableDataInfo;
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 lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import com.pz.system.domain.bo.MsgInfoBo;
import com.pz.system.domain.vo.MsgInfoVo;
import com.pz.system.domain.MsgInfo;
import com.pz.system.mapper.MsgInfoMapper;
import com.pz.system.service.IMsgInfoService;
import java.util.List;
import java.util.Map;
import java.util.Collection;
/**
* 消息Service业务层处理
*
* @author ruoyi
* @date 2023-09-09
*/
@RequiredArgsConstructor
@Service
public class MsgInfoServiceImpl implements IMsgInfoService {
private final MsgInfoMapper baseMapper;
/**
* 查询消息
*/
@Override
public MsgInfoVo queryById(Long id){
return baseMapper.selectVoById(id);
}
/**
* 查询消息列表
*/
@Override
public TableDataInfo<MsgInfoVo> queryPageList(MsgInfoBo bo, PageQuery pageQuery) {
LambdaQueryWrapper<MsgInfo> lqw = buildQueryWrapper(bo);
Page<MsgInfoVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
return TableDataInfo.build(result);
}
/**
* 查询消息列表
*/
@Override
public List<MsgInfoVo> queryList(MsgInfoBo bo) {
LambdaQueryWrapper<MsgInfo> lqw = buildQueryWrapper(bo);
return baseMapper.selectVoList(lqw);
}
private LambdaQueryWrapper<MsgInfo> buildQueryWrapper(MsgInfoBo bo) {
Map<String, Object> params = bo.getParams();
LambdaQueryWrapper<MsgInfo> lqw = Wrappers.lambdaQuery();
lqw.eq(bo.getFromUserId() != null, MsgInfo::getFromUserId, bo.getFromUserId());
lqw.like(StringUtils.isNotBlank(bo.getFromUserName()), MsgInfo::getFromUserName, bo.getFromUserName());
lqw.eq(bo.getToUserId() != null, MsgInfo::getToUserId, bo.getToUserId());
lqw.like(StringUtils.isNotBlank(bo.getToUserName()), MsgInfo::getToUserName, bo.getToUserName());
lqw.eq(StringUtils.isNotBlank(bo.getContent()), MsgInfo::getContent, bo.getContent());
lqw.eq(bo.getUnReadFlag() != null, MsgInfo::getUnReadFlag, bo.getUnReadFlag());
return lqw;
}
/**
* 新增消息
*/
@Override
public Boolean insertByBo(MsgInfoBo bo) {
MsgInfo add = BeanUtil.toBean(bo, MsgInfo.class);
validEntityBeforeSave(add);
boolean flag = baseMapper.insert(add) > 0;
if (flag) {
bo.setId(add.getId());
}
return flag;
}
/**
* 修改消息
*/
@Override
public Boolean updateByBo(MsgInfoBo bo) {
MsgInfo update = BeanUtil.toBean(bo, MsgInfo.class);
validEntityBeforeSave(update);
return baseMapper.updateById(update) > 0;
}
/**
* 保存前的数据校验
*/
private void validEntityBeforeSave(MsgInfo entity){
//TODO 做一些数据校验,如唯一约束
}
/**
* 批量删除消息
*/
@Override
public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
if(isValid){
//TODO 做一些业务上的校验,判断是否需要校验
}
return baseMapper.deleteBatchIds(ids) > 0;
}
}
......@@ -104,11 +104,11 @@ public class PayServiceImpl implements IPayService {
* @throws WxPayException
*/
@Override
public String parseOrderNotifyResult(String xmlData) throws WxPayException {
public WxPayOrderNotifyResult parseOrderNotifyResult(String xmlData) throws WxPayException {
// 参数解析
final WxPayOrderNotifyResult notifyResult = this.wxService.parseOrderNotifyResult(xmlData);
// TODO 根据自己业务场景需要构造返回对象
return WxPayNotifyResponse.success("成功");
return notifyResult;
}
/**
......
......@@ -63,7 +63,6 @@ public class SessionListServiceImpl implements ISessionListService {
LambdaQueryWrapper<SessionList> lqw = Wrappers.lambdaQuery();
lqw.eq(bo.getUserId() != null, SessionList::getUserId, bo.getUserId());
lqw.eq(bo.getToUserId() != null, SessionList::getToUserId, bo.getToUserId());
lqw.like(StringUtils.isNotBlank(bo.getListName()), SessionList::getListName, bo.getListName());
lqw.eq(bo.getUnReadCount() != null, SessionList::getUnReadCount, bo.getUnReadCount());
return lqw;
}
......
......@@ -10,6 +10,7 @@ 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.enums.UserType;
import com.pz.common.helper.LoginHelper;
import com.pz.system.domain.StoreInfo;
import com.pz.system.mapper.StoreInfoMapper;
import com.pz.system.mapper.SysUserMapper;
......@@ -52,6 +53,11 @@ public class StoreApplyServiceImpl implements IStoreApplyService {
return baseMapper.selectVoById(id);
}
@Override
public StoreApplyVo queryByUserId() {
return baseMapper.selectVoOne(new LambdaQueryWrapper<StoreApply>().eq(StoreApply::getUid,LoginHelper.getLoginUser().getUserId()));
}
/**
* 查询商城商户申请列表
*/
......@@ -107,6 +113,7 @@ public class StoreApplyServiceImpl implements IStoreApplyService {
public Boolean insertByBo(StoreApplyBo bo) {
StoreApply add = BeanUtil.toBean(bo, StoreApply.class);
validEntityBeforeSave(add);
bo.setUid(LoginHelper.getLoginUser().getUserId().intValue());
boolean flag = baseMapper.insert(add) > 0;
if (flag) {
bo.setId(add.getId());
......
......@@ -103,6 +103,21 @@ public class StoreGoodsServiceImpl implements IStoreGoodsService {
public TableDataInfo<StoreGoodsVo> shopAppShop(StoreGoodsBo bo, PageQuery pageQuery) {
LambdaQueryWrapper<StoreGoods> lqw = buildQueryWrapper(bo);
Page<StoreGoodsVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
Optional.ofNullable(result.getRecords()).ifPresent(storeGoodsVos -> {
storeGoodsVos.forEach(storeGoodsVo -> {
if (StringUtils.isNotBlank(storeGoodsVo.getTags())) {
List<Integer> ids = JsonUtils.parseArray(storeGoodsVo.getTags(), Integer.class);
//查询商品标签
storeGoodsVo.setList(goodsTagMapper.selectVoList(new LambdaQueryWrapper<StoreGoodsTag>().in(StoreGoodsTag::getId, ids)));
}
if (null != storeGoodsVo.getCategoryId()) {
Optional.ofNullable(storeGoodsCategoryMapper.selectVoById(storeGoodsVo.getCategoryId()))
.ifPresent(storeGoodsCategoryVo -> {
storeGoodsVo.setTypeName(storeGoodsCategoryVo.getTitle());
});
}
});
});
return TableDataInfo.build(result);
}
......@@ -110,6 +125,21 @@ public class StoreGoodsServiceImpl implements IStoreGoodsService {
public TableDataInfo<StoreGoodsVo> searchAppShop(StoreGoodsBo bo, PageQuery pageQuery) {
LambdaQueryWrapper<StoreGoods> lqw = buildQueryWrapper(bo);
Page<StoreGoodsVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
Optional.ofNullable(result.getRecords()).ifPresent(storeGoodsVos -> {
storeGoodsVos.forEach(storeGoodsVo -> {
if (StringUtils.isNotBlank(storeGoodsVo.getTags())) {
List<Integer> ids = JsonUtils.parseArray(storeGoodsVo.getTags(), Integer.class);
//查询商品标签
storeGoodsVo.setList(goodsTagMapper.selectVoList(new LambdaQueryWrapper<StoreGoodsTag>().in(StoreGoodsTag::getId, ids)));
}
if (null != storeGoodsVo.getCategoryId()) {
Optional.ofNullable(storeGoodsCategoryMapper.selectVoById(storeGoodsVo.getCategoryId()))
.ifPresent(storeGoodsCategoryVo -> {
storeGoodsVo.setTypeName(storeGoodsCategoryVo.getTitle());
});
}
});
});
return TableDataInfo.build(result);
}
......@@ -142,7 +172,7 @@ public class StoreGoodsServiceImpl implements IStoreGoodsService {
LambdaQueryWrapper<StoreGoods> lqw = Wrappers.lambdaQuery();
lqw.eq(bo.getCityId() != null, StoreGoods::getCityId, bo.getCityId());
lqw.eq(bo.getStoreId() != null, StoreGoods::getStoreId, bo.getStoreId());
lqw.eq(StringUtils.isNotBlank(bo.getTitle()), StoreGoods::getTitle, bo.getTitle());
lqw.like(StringUtils.isNotBlank(bo.getTitle()), StoreGoods::getTitle, bo.getTitle());
lqw.eq(StringUtils.isNotBlank(bo.getPrice()), StoreGoods::getPrice, bo.getPrice());
lqw.eq(StringUtils.isNotBlank(bo.getSalePrice()), StoreGoods::getSalePrice, bo.getSalePrice());
lqw.eq(StringUtils.isNotBlank(bo.getSmallCover()), StoreGoods::getSmallCover, bo.getSmallCover());
......
......@@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.github.binarywang.wxpay.bean.request.WxPayUnifiedOrderRequest;
import com.pz.common.core.domain.model.LoginUser;
import com.pz.common.core.page.TableDataInfo;
import com.pz.common.core.domain.PageQuery;
......@@ -13,6 +14,7 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.pz.common.enums.CommonOrderStatus;
import com.pz.common.enums.DBMYOrderStatus;
import com.pz.common.enums.ShopOrderStatus;
import com.pz.common.enums.TotalOrderStatus;
import com.pz.common.exception.ServiceException;
import com.pz.merchant.domain.vo.SonOrderVo;
import com.pz.merchant.service.ISonOrderService;
......@@ -22,6 +24,7 @@ import com.pz.system.domain.*;
import com.pz.system.domain.bo.CreateOrderBo;
import com.pz.system.domain.vo.AccompanyDemandVo;
import com.pz.system.mapper.*;
import com.pz.system.service.IPayService;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import com.pz.system.domain.bo.TotalOrderBo;
......@@ -29,6 +32,7 @@ import com.pz.system.domain.vo.TotalOrderVo;
import com.pz.system.service.ITotalOrderService;
import org.springframework.transaction.annotation.Transactional;
import java.math.BigDecimal;
import java.util.*;
/**
......@@ -68,17 +72,72 @@ public class TotalOrderServiceImpl implements ITotalOrderService {
private final StoreGoodsMapper storeGoodsMapper;
private final IPayService iPayService;
private final SysUserMapper sysUserMapper;
@Override
public TotalOrderVo queryById(Long id) {
return baseMapper.selectVoById(id);
}
/**
* 查询总订单
* 查询总订单详情
*/
@Override
public TotalOrderVo queryByAppId(Integer id) {
TotalOrderVo totalOrderVo = baseMapper.selectByOrderId(id);
if(totalOrderVo.getBusinessId() == 1){//预约陪诊
totalOrderVo.setServiceStatus(
yypzOrderMapper.selectOne(new LambdaQueryWrapper<YypzOrder>().eq(YypzOrder::getOrderId, totalOrderVo.getId())).getStatus()
);
}else if(totalOrderVo.getBusinessId() == 2){//代办挂号
totalOrderVo.setServiceStatus(
dbghOrderMapper.selectOne(new LambdaQueryWrapper<DbghOrder>().eq(DbghOrder::getOrderId, totalOrderVo.getId())).getStatus()
);
}else if(totalOrderVo.getBusinessId() == 3){//代办问诊
totalOrderVo.setServiceStatus(
dbwzOrderMapper.selectOne(new LambdaQueryWrapper<DbwzOrder>().eq(DbwzOrder::getOrderId, totalOrderVo.getId())).getStatus()
);
}else if(totalOrderVo.getBusinessId() == 4){//住院陪护
totalOrderVo.setServiceStatus(
zyphOrderMapper.selectOne(new LambdaQueryWrapper<ZyphOrder>().eq(ZyphOrder::getOrderId, totalOrderVo.getId())).getStatus()
);
}else if(totalOrderVo.getBusinessId() == 5){//代办买药
totalOrderVo.setServiceStatus(
dbmyOrderMapper.selectOne(new LambdaQueryWrapper<DbmyOrder>().eq(DbmyOrder::getOrderId, totalOrderVo.getId())).getStatus()
);
}else if(totalOrderVo.getBusinessId() == 6){//诊前挂号
totalOrderVo.setServiceStatus(
zqghOrderMapper.selectOne(new LambdaQueryWrapper<ZqghOrder>().eq(ZqghOrder::getOrderId, totalOrderVo.getId())).getStatus()
);
}else if(totalOrderVo.getBusinessId() == 0){//商城订单
StoreOrder storeOrder = storeOrderMapper.selectOne(new LambdaQueryWrapper<StoreOrder>().eq(StoreOrder::getOrderId, totalOrderVo.getId()));
totalOrderVo.setServiceStatus(
storeOrder.getStatus()
);
StoreGoods storeGoods = storeGoodsMapper.selectById(storeOrder.getOrderId());
List<StoreGoodsTag> storeGoodsTags = storeGoodsTagMapper.selectList(new LambdaQueryWrapper<StoreGoodsTag>().in(StoreGoodsTag::getId, getTages(storeGoods.getTags())).select(StoreGoodsTag::getTitle));
totalOrderVo.setTags(storeGoodsTags);
}
return totalOrderVo;
}
......@@ -219,27 +278,35 @@ public class TotalOrderServiceImpl implements ITotalOrderService {
baseMapper.insert(totalOrder);
bo.setOrderId(totalOrder.getId().intValue());
totalOrderVo.setOrderSn(orderSn);
totalOrderVo.setOrderSn(totalOrder.getId()+"");
totalOrderVo.setPayMoney(bo.getPayMoney());
if (bo.getBusinessId() == 1) {// 预约陪诊
YypzOrder yypzOrder = BeanUtil.toBean(bo, YypzOrder.class);
yypzOrder.setHid(bo.getHospitalId());
yypzOrderMapper.insert(yypzOrder);
} else if (bo.getBusinessId() == 2) {// 代办挂号
DbghOrder dbghOrder = BeanUtil.toBean(bo, DbghOrder.class);
dbghOrder.setHid(bo.getHospitalId());
dbghOrder.setDid(bo.getDepartmentId());
dbghOrderMapper.insert(dbghOrder);
} else if (bo.getBusinessId() == 3) {// 代办问诊
DbwzOrder dbwzOrder = BeanUtil.toBean(bo, DbwzOrder.class);
dbwzOrder.setDid(bo.getDepartmentId());
dbwzOrder.setVisitor(bo.getVisitorId());
dbwzOrderMapper.insert(dbwzOrder);
} else if (bo.getBusinessId() == 4) {// 住院陪护
ZyphOrder zyphOrder = BeanUtil.toBean(bo, ZyphOrder.class);
zyphOrder.setDid(bo.getDepartmentId());
zyphOrder.setVisitor(bo.getVisitorId());
zyphOrderMapper.insert(zyphOrder);
} else if (bo.getBusinessId() == 5) {// 代办买药
......@@ -274,11 +341,38 @@ public class TotalOrderServiceImpl implements ITotalOrderService {
@Override
public Boolean cancelOrder(TotalOrderBo bo) {
TotalOrder totalOrder = baseMapper.selectById(bo.getId());
if (totalOrder.getBusinessId() == 1) {// 预约陪诊
yypzOrderMapper.selectOne(new LambdaQueryWrapper<YypzOrder>().eq(YypzOrder::getOrderId, totalOrder));
if(null != totalOrder.getEmId() && totalOrder.getEmId() != 0){//预约陪诊
//yypzOrderMapper.selectOne(new LambdaQueryWrapper<YypzOrder>().eq(YypzOrder::getOrderId,totalOrder));
totalOrder.setStatus(TotalOrderStatus.CANCEL.getCode());
return baseMapper.updateById(totalOrder) > 0;
}else {
throw new ServiceException("该订单已分配给陪诊员,不允许取消订单!");
}
return baseMapper.updateById(totalOrder) > 0;
}
@Override
public Object payOrder(TotalOrderBo bo) {
LoginUser loginUser = LoginHelper.getLoginUser();
TotalOrder totalOrder = baseMapper.selectById(Integer.parseInt(bo.getOrderSn()));
Object payment = null;
int money = (int) (totalOrder.getPayMoney() * 100);
try {
WxPayUnifiedOrderRequest orderRequest = new WxPayUnifiedOrderRequest();
orderRequest.setBody(bo.getOrderTitle());
orderRequest.setOutTradeNo(totalOrder.getOrderSn());
orderRequest.setTotalFee(money);//元转成分
orderRequest.setOpenid(sysUserMapper.selectById(loginUser.getUserId()).getOpenId());
orderRequest.setSpbillCreateIp("127.0.0.1");
orderRequest.setNotifyUrl("http://127.0.0.1:8089/applet/totalOrder/orderPayCallBack");
orderRequest.setTradeType("JSAPI");
payment = iPayService.createOrder(orderRequest);
} catch (Exception e) {
throw new ServiceException("微信支付失败!");
}
return payment;
}
@Override
......
......@@ -64,19 +64,19 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
</select>
<select id="selectEmployees" resultType="com.pz.merchant.domain.vo.EmployeesVo">
SELECT e.id, s.avatar ,e.name,e.working_hours,(SUM(CASE WHEN o.is_satisfaction = 1 THEN 1 ELSE 0 END) / NULLIF(COUNT(o.is_satisfaction), 0)) * 100 AS satisfaction_rate
SELECT e.id, s.avatar as avatar,e.name,e.working_hours,(SUM(CASE WHEN o.is_satisfaction = 1 THEN 1 ELSE 0 END) / NULLIF(COUNT(o.is_satisfaction), 0)) * 100 AS satisfaction_rate
FROM employees e
left join total_order o on o.em_id = e.id
left join company c on c.id = e.company_id
left join sys_user s on s.user_id = e.uid
WHERE e.`status` = 1 and e.now_type= 1 and e.del_flag= 0
<if test="bo.companyId != null and bo.companyId != 0">
e.company_id = #{bo.companyId}
<if test="bo.companyId != null and bo.companyId != ''">
and e.company_id = #{bo.companyId}
</if>
GROUP BY
e.id,
e.`name`
<if test="bo.favorableRate != null">
<if test="bo.favorableRate != null and bo.favorableRate != ''">
HAVING
satisfaction_rate >= #{bo.favorableRate};
</if>
......
......@@ -8,7 +8,6 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<result property="id" column="id"/>
<result property="userId" column="user_id"/>
<result property="toUserId" column="to_user_id"/>
<result property="listName" column="list_name"/>
<result property="unReadCount" column="un_read_count"/>
</resultMap>
<update id="addUnReadCount">
......
......@@ -17,6 +17,7 @@
<result property="password" column="password"/>
<result property="status" column="status"/>
<result property="delFlag" column="del_flag"/>
<result property="openId" column="open_id"/>
<result property="loginIp" column="login_ip"/>
<result property="loginDate" column="login_date"/>
<result property="createBy" column="create_by"/>
......@@ -55,6 +56,7 @@
u.user_type,
u.email,
u.avatar,
u.open_id,
u.phonenumber,
u.password,
u.sex,
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment