Merge remote-tracking branch 'origin/master'
This commit is contained in:
@@ -1,5 +1,6 @@
|
|||||||
package com.czg.controller.admin;
|
package com.czg.controller.admin;
|
||||||
|
|
||||||
|
import com.czg.account.dto.WxMsgSubDTO;
|
||||||
import com.czg.account.dto.calltable.*;
|
import com.czg.account.dto.calltable.*;
|
||||||
import com.czg.account.entity.CallConfig;
|
import com.czg.account.entity.CallConfig;
|
||||||
import com.czg.account.entity.CallQueue;
|
import com.czg.account.entity.CallQueue;
|
||||||
@@ -135,8 +136,8 @@ public class CallTableController {
|
|||||||
*/
|
*/
|
||||||
@SaAdminCheckPermission(value = "callTable:queue:list", name = "获取叫号队列")
|
@SaAdminCheckPermission(value = "callTable:queue:list", name = "获取叫号队列")
|
||||||
@GetMapping("queue")
|
@GetMapping("queue")
|
||||||
public CzgResult<Page<CallQueue>> getQueue(Long callTableId, Integer state) {
|
public CzgResult<Page<CallQueue>> getQueue(Long callTableId, Integer state, String openId) {
|
||||||
return CzgResult.success(callTableService.getQueue(StpKit.USER.getShopId(), callTableId, state));
|
return CzgResult.success(callTableService.getQueue(StpKit.USER.getShopId(), openId, callTableId, state));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -173,4 +174,15 @@ public class CallTableController {
|
|||||||
public CzgResult<Boolean> updateConfig(@RequestBody UpdateConfigDTO configDTO) {
|
public CzgResult<Boolean> updateConfig(@RequestBody UpdateConfigDTO configDTO) {
|
||||||
return CzgResult.success(callTableService.updateConfig(StpKit.USER.getShopId(), configDTO));
|
return CzgResult.success(callTableService.updateConfig(StpKit.USER.getShopId(), configDTO));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 消息订阅
|
||||||
|
* @return 是否成功
|
||||||
|
*/
|
||||||
|
@PostMapping("subMsg")
|
||||||
|
public CzgResult<?> subMsg(
|
||||||
|
@Validated @RequestBody CallSubMsgDTO subMsgDTO
|
||||||
|
) {
|
||||||
|
return CzgResult.success(callTableService.subMsg(subMsgDTO));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -100,9 +100,6 @@ public class HandoverRecordController {
|
|||||||
//@SaAdminCheckPermission("handoverRecord:handover")
|
//@SaAdminCheckPermission("handoverRecord:handover")
|
||||||
public CzgResult<Long> handover(@RequestParam Integer isPrint) {
|
public CzgResult<Long> handover(@RequestParam Integer isPrint) {
|
||||||
Long id = handoverRecordService.handover();
|
Long id = handoverRecordService.handover();
|
||||||
if (isPrint == 1){
|
|
||||||
rabbitPublisher.sendHandoverPrintMsg(id.toString());
|
|
||||||
}
|
|
||||||
return CzgResult.success(id);
|
return CzgResult.success(id);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -3,14 +3,10 @@ package com.czg.controller.admin;
|
|||||||
import com.czg.account.dto.user.SysUserAddDTO;
|
import com.czg.account.dto.user.SysUserAddDTO;
|
||||||
import com.czg.account.dto.user.SysUserEditDTO;
|
import com.czg.account.dto.user.SysUserEditDTO;
|
||||||
import com.czg.account.dto.user.SysUserEditPwdDTO;
|
import com.czg.account.dto.user.SysUserEditPwdDTO;
|
||||||
import com.czg.account.entity.SysUser;
|
|
||||||
import com.czg.account.entity.SysUsersRoles;
|
|
||||||
import com.czg.account.service.SysUserService;
|
import com.czg.account.service.SysUserService;
|
||||||
import com.czg.account.vo.SysUserDetailVO;
|
import com.czg.account.vo.SysUserDetailVO;
|
||||||
import com.czg.annotation.SaAdminCheckPermission;
|
|
||||||
import com.czg.annotation.SaAdminCheckRole;
|
import com.czg.annotation.SaAdminCheckRole;
|
||||||
import com.czg.resp.CzgResult;
|
import com.czg.resp.CzgResult;
|
||||||
import com.czg.sa.StpKit;
|
|
||||||
import com.mybatisflex.core.paginate.Page;
|
import com.mybatisflex.core.paginate.Page;
|
||||||
import jakarta.annotation.Resource;
|
import jakarta.annotation.Resource;
|
||||||
import jakarta.servlet.http.HttpServletResponse;
|
import jakarta.servlet.http.HttpServletResponse;
|
||||||
@@ -40,7 +36,7 @@ public class SysController {
|
|||||||
// @SaAdminCheckPermission("sysUser:list")
|
// @SaAdminCheckPermission("sysUser:list")
|
||||||
@SaAdminCheckRole("admin")
|
@SaAdminCheckRole("admin")
|
||||||
@GetMapping
|
@GetMapping
|
||||||
public CzgResult<Page<SysUser>> list(String key, String startTime, String endTime, Integer status) {
|
public CzgResult<Page<SysUserDetailVO>> list(String key, String startTime, String endTime, Integer status) {
|
||||||
return CzgResult.success(sysUserService.getPage(key, startTime, endTime, status));
|
return CzgResult.success(sysUserService.getPage(key, startTime, endTime, status));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,81 @@
|
|||||||
|
package com.czg.controller.user;
|
||||||
|
|
||||||
|
|
||||||
|
import com.czg.account.dto.calltable.CallSubMsgDTO;
|
||||||
|
import com.czg.account.dto.calltable.CallTableNumDTO;
|
||||||
|
import com.czg.account.dto.calltable.CallTablePage;
|
||||||
|
import com.czg.account.dto.calltable.TakeNumberDTO;
|
||||||
|
import com.czg.account.entity.CallQueue;
|
||||||
|
import com.czg.account.service.CallTableService;
|
||||||
|
import com.czg.annotation.SaAdminCheckPermission;
|
||||||
|
import com.czg.resp.CzgResult;
|
||||||
|
import com.czg.sa.StpKit;
|
||||||
|
import com.mybatisflex.core.paginate.Page;
|
||||||
|
import jakarta.annotation.Resource;
|
||||||
|
import org.springframework.validation.annotation.Validated;
|
||||||
|
import org.springframework.web.bind.annotation.*;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 小程序叫号管理
|
||||||
|
* @author Administrator
|
||||||
|
*/
|
||||||
|
@RestController
|
||||||
|
@RequestMapping("/user/callTable")
|
||||||
|
public class UCallTableController {
|
||||||
|
@Resource
|
||||||
|
private CallTableService callTableService;
|
||||||
|
/**
|
||||||
|
* 获取叫号号码
|
||||||
|
*/
|
||||||
|
@PostMapping("takeNumber")
|
||||||
|
public CzgResult<CallTableNumDTO> takeNumber(@Validated @RequestBody TakeNumberDTO takeNumberDTO) {
|
||||||
|
return CzgResult.success(callTableService.takeNumber(StpKit.USER.getShopId(), takeNumberDTO));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取叫号队列
|
||||||
|
*
|
||||||
|
* @param callTableId 桌型id
|
||||||
|
* @param state 状态 -1已取消 0排队中 1叫号中 2已入座 3 已过号
|
||||||
|
* @return 分页数据
|
||||||
|
*/
|
||||||
|
@GetMapping("queue")
|
||||||
|
public CzgResult<Page<CallQueue>> getQueue(@RequestParam String openId, Long callTableId, Integer state) {
|
||||||
|
return CzgResult.success(callTableService.getQueue(StpKit.USER.getShopId(), openId, callTableId, state));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 叫号桌型获取
|
||||||
|
*
|
||||||
|
* @param callTableId 叫号桌型id
|
||||||
|
* @param state 0禁用 1使用
|
||||||
|
* @return 分页数据
|
||||||
|
*/
|
||||||
|
@GetMapping
|
||||||
|
public CzgResult<CallTablePage> get(Long callTableId, Integer state) {
|
||||||
|
return CzgResult.success(callTableService.get(StpKit.USER.getShopId(), callTableId, state));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 根据店铺id和openId获取当前叫号号码
|
||||||
|
* @param queueId 队列id
|
||||||
|
* @return 状态
|
||||||
|
*/
|
||||||
|
@GetMapping("/queue/detail")
|
||||||
|
public CzgResult<?> getStatus(@RequestParam String openId, @RequestParam(required = false) Long queueId) {
|
||||||
|
return CzgResult.success(callTableService.getStatus(StpKit.USER.getShopId(), openId, queueId));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 消息订阅
|
||||||
|
* @return 是否成功
|
||||||
|
*/
|
||||||
|
@PostMapping("subMsg")
|
||||||
|
public CzgResult<Boolean> subMsg(
|
||||||
|
@Validated @RequestBody CallSubMsgDTO subMsgDTO
|
||||||
|
) {
|
||||||
|
return CzgResult.success(callTableService.subMsg(subMsgDTO));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
@@ -15,6 +15,7 @@ import cn.dev33.satoken.stp.SaTokenInfo;
|
|||||||
import cn.dev33.satoken.stp.StpLogic;
|
import cn.dev33.satoken.stp.StpLogic;
|
||||||
import cn.hutool.core.util.StrUtil;
|
import cn.hutool.core.util.StrUtil;
|
||||||
import com.czg.exception.ApiNotPrintException;
|
import com.czg.exception.ApiNotPrintException;
|
||||||
|
import com.czg.exception.CzgException;
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@@ -43,6 +44,7 @@ public class MyStpLogic {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* 校验员工权限
|
* 校验员工权限
|
||||||
|
*
|
||||||
* @param code 权限码
|
* @param code 权限码
|
||||||
*/
|
*/
|
||||||
public void checkStaffPermission(String code) {
|
public void checkStaffPermission(String code) {
|
||||||
@@ -53,7 +55,7 @@ public class MyStpLogic {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* @param id 登录账号id
|
* @param id 登录账号id
|
||||||
* @param shopName 店铺名称
|
* @param shopName 店铺名称
|
||||||
* @param shopId 店铺id
|
* @param shopId 店铺id
|
||||||
* @param loginType 登录类型枚举
|
* @param loginType 登录类型枚举
|
||||||
* @param isAdmin 是否为管理员账号
|
* @param isAdmin 是否为管理员账号
|
||||||
@@ -93,6 +95,7 @@ public class MyStpLogic {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* 获取当前店铺用户名,仅后台可用
|
* 获取当前店铺用户名,仅后台可用
|
||||||
|
*
|
||||||
* @return 店铺名称
|
* @return 店铺名称
|
||||||
*/
|
*/
|
||||||
public String getShopName() {
|
public String getShopName() {
|
||||||
@@ -113,6 +116,10 @@ public class MyStpLogic {
|
|||||||
Long shopId;
|
Long shopId;
|
||||||
int errType;
|
int errType;
|
||||||
if ("admin".equals(logic.getLoginType())) {
|
if ("admin".equals(logic.getLoginType())) {
|
||||||
|
if (logic.getSession() == null) {
|
||||||
|
logout();
|
||||||
|
throw new CzgException("请重新登录");
|
||||||
|
}
|
||||||
Object info = logic.getSession().get("shopId");
|
Object info = logic.getSession().get("shopId");
|
||||||
shopId = info instanceof Long l ? l : null;
|
shopId = info instanceof Long l ? l : null;
|
||||||
errType = 0;
|
errType = 0;
|
||||||
|
|||||||
@@ -0,0 +1,27 @@
|
|||||||
|
package com.czg.account.dto.calltable;
|
||||||
|
|
||||||
|
import jakarta.validation.constraints.NotEmpty;
|
||||||
|
import jakarta.validation.constraints.NotNull;
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Administrator
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
public class CallSubMsgDTO {
|
||||||
|
/**
|
||||||
|
* 店铺id
|
||||||
|
*/
|
||||||
|
@NotNull
|
||||||
|
private Long shopId;
|
||||||
|
/**
|
||||||
|
* 队列id
|
||||||
|
*/
|
||||||
|
@NotNull
|
||||||
|
private Long queueId;
|
||||||
|
/**
|
||||||
|
* openId
|
||||||
|
*/
|
||||||
|
@NotEmpty
|
||||||
|
private String openId;
|
||||||
|
}
|
||||||
@@ -21,4 +21,5 @@ public class CallTableNumDTO {
|
|||||||
* 号码
|
* 号码
|
||||||
*/
|
*/
|
||||||
private String callNum;
|
private String callNum;
|
||||||
|
private Long queueId;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -30,4 +30,8 @@ public class TakeNumberDTO extends BaseCallTableDTO{
|
|||||||
* 姓名
|
* 姓名
|
||||||
*/
|
*/
|
||||||
private String name;
|
private String name;
|
||||||
|
/**
|
||||||
|
* openId
|
||||||
|
*/
|
||||||
|
private String openId;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -24,7 +24,7 @@ public class FreeDineConfigEditDTO {
|
|||||||
/**
|
/**
|
||||||
* 充值倍数
|
* 充值倍数
|
||||||
*/
|
*/
|
||||||
@Min(1)
|
@Min(value = 2, message = "充值倍数不能小于2")
|
||||||
private Integer rechargeTimes;
|
private Integer rechargeTimes;
|
||||||
/**
|
/**
|
||||||
* 满多少可用
|
* 满多少可用
|
||||||
|
|||||||
@@ -4,11 +4,24 @@ import com.czg.account.entity.ShopUser;
|
|||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
import lombok.EqualsAndHashCode;
|
import lombok.EqualsAndHashCode;
|
||||||
|
|
||||||
|
import java.math.BigDecimal;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Administrator
|
* @author Administrator
|
||||||
*/
|
*/
|
||||||
@EqualsAndHashCode(callSuper = true)
|
@EqualsAndHashCode(callSuper = true)
|
||||||
@Data
|
@Data
|
||||||
public class ShopUserDTO extends ShopUser {
|
public class ShopUserDTO extends ShopUser {
|
||||||
|
/**
|
||||||
|
* 优惠券数量
|
||||||
|
*/
|
||||||
private Long couponNum;
|
private Long couponNum;
|
||||||
|
/**
|
||||||
|
* 订单数量
|
||||||
|
*/
|
||||||
|
private Long orderNumber;
|
||||||
|
/**
|
||||||
|
* 充值金额
|
||||||
|
*/
|
||||||
|
private BigDecimal rechargeAmount;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -32,7 +32,7 @@ public class SysUserEditPwdDTO {
|
|||||||
/**
|
/**
|
||||||
* 密码
|
* 密码
|
||||||
*/
|
*/
|
||||||
@Size(min = 1, message = "密码不为空")
|
@NotBlank(message = "确认密码不为空")
|
||||||
private String password;
|
private String password;
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ import com.mybatisflex.annotation.Column;
|
|||||||
import com.mybatisflex.annotation.Id;
|
import com.mybatisflex.annotation.Id;
|
||||||
import com.mybatisflex.annotation.KeyType;
|
import com.mybatisflex.annotation.KeyType;
|
||||||
import com.mybatisflex.annotation.Table;
|
import com.mybatisflex.annotation.Table;
|
||||||
|
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
import java.math.BigDecimal;
|
import java.math.BigDecimal;
|
||||||
import java.time.LocalDateTime;
|
import java.time.LocalDateTime;
|
||||||
@@ -30,9 +31,6 @@ public class FreeDineConfig implements Serializable {
|
|||||||
@Serial
|
@Serial
|
||||||
private static final long serialVersionUID = 1L;
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
@Id(keyType = KeyType.Auto)
|
|
||||||
private Long id;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 是否启用
|
* 是否启用
|
||||||
*/
|
*/
|
||||||
@@ -71,6 +69,7 @@ public class FreeDineConfig implements Serializable {
|
|||||||
/**
|
/**
|
||||||
* 门店id
|
* 门店id
|
||||||
*/
|
*/
|
||||||
|
@Id
|
||||||
private Long shopId;
|
private Long shopId;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -90,4 +89,7 @@ public class FreeDineConfig implements Serializable {
|
|||||||
*/
|
*/
|
||||||
private String childShopIdList;
|
private String childShopIdList;
|
||||||
|
|
||||||
|
public Integer getMultiple() {
|
||||||
|
return rechargeTimes == null ? 2 : rechargeTimes;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -34,7 +34,6 @@ public class SysUsersRoles implements Serializable {
|
|||||||
/**
|
/**
|
||||||
* 角色ID
|
* 角色ID
|
||||||
*/
|
*/
|
||||||
@Id
|
|
||||||
private Long roleId;
|
private Long roleId;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -29,11 +29,15 @@ public interface CallTableService extends IService<CallTable> {
|
|||||||
|
|
||||||
boolean updateInfo(Long shopId, UpdateCallQueueDTO updateCallQueueDTO);
|
boolean updateInfo(Long shopId, UpdateCallQueueDTO updateCallQueueDTO);
|
||||||
|
|
||||||
Page<CallQueue> getQueue(Long shopId, Long callTableId, Integer state);
|
Page<CallQueue> getQueue(Long shopId, String openId, Long callTableId, Integer state);
|
||||||
|
|
||||||
Page<CallRecordVO> getCallRecord(Long shopId, Integer callTableId);
|
Page<CallRecordVO> getCallRecord(Long shopId, Integer callTableId);
|
||||||
|
|
||||||
CallConfig getConfig(Long shopId);
|
CallConfig getConfig(Long shopId);
|
||||||
|
|
||||||
boolean updateConfig(Long shopId, UpdateConfigDTO configDTO);
|
boolean updateConfig(Long shopId, UpdateConfigDTO configDTO);
|
||||||
|
|
||||||
|
boolean subMsg(CallSubMsgDTO subMsgDTO);
|
||||||
|
|
||||||
|
Object getStatus(Long shopId, String openId, Long queueId);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -25,7 +25,7 @@ public interface SysUserService extends IService<SysUser> {
|
|||||||
|
|
||||||
Boolean removeUserAndRole(Long id);
|
Boolean removeUserAndRole(Long id);
|
||||||
|
|
||||||
Page<SysUser> getPage(String key, String startTime, String endTime, Integer status);
|
Page<SysUserDetailVO> getPage(String key, String startTime, String endTime, Integer status);
|
||||||
|
|
||||||
Boolean edit(SysUserEditDTO sysUserEditDTO);
|
Boolean edit(SysUserEditDTO sysUserEditDTO);
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,47 @@
|
|||||||
|
package com.czg.account.vo;
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Administrator
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
public class CallQueueInfoVO {
|
||||||
|
/**
|
||||||
|
* 叫号队列id,queueId
|
||||||
|
*/
|
||||||
|
private Long id;
|
||||||
|
/**
|
||||||
|
* 桌型名称
|
||||||
|
*/
|
||||||
|
private String tableName;
|
||||||
|
/**
|
||||||
|
* 桌型备注
|
||||||
|
*/
|
||||||
|
private String tableNote;
|
||||||
|
/**
|
||||||
|
* 等待人数
|
||||||
|
*/
|
||||||
|
private Integer waitingCount;
|
||||||
|
/**
|
||||||
|
* 等待时间
|
||||||
|
*/
|
||||||
|
private Integer waitTime;
|
||||||
|
/**
|
||||||
|
* -1已取消 0排队中 1叫号中 2已入座 3 已过号
|
||||||
|
*/
|
||||||
|
private Integer state;
|
||||||
|
/**
|
||||||
|
* 叫号号码
|
||||||
|
*/
|
||||||
|
private String callNum;
|
||||||
|
private String shopState;
|
||||||
|
/**
|
||||||
|
* 店铺名称
|
||||||
|
*/
|
||||||
|
private String shopName;
|
||||||
|
/**
|
||||||
|
* logo
|
||||||
|
*/
|
||||||
|
private String logo;
|
||||||
|
}
|
||||||
@@ -163,11 +163,11 @@
|
|||||||
<artifactId>dubbo-spring-boot-starter</artifactId>
|
<artifactId>dubbo-spring-boot-starter</artifactId>
|
||||||
<version>${dubbo-spring.version}</version>
|
<version>${dubbo-spring.version}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
<!-- https://mvnrepository.com/artifact/com.alibaba.cloud/spring-cloud-starter-alibaba-seata -->
|
<!-- https://mvnrepository.com/artifact/io.seata/seata-spring-boot-starter -->
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.alibaba.cloud</groupId>
|
<groupId>io.seata</groupId>
|
||||||
<artifactId>spring-cloud-starter-alibaba-seata</artifactId>
|
<artifactId>seata-spring-boot-starter</artifactId>
|
||||||
<version>2023.0.3.2</version>
|
<version>${seata.version}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
|
|||||||
@@ -1,9 +1,13 @@
|
|||||||
package com.czg.service.account.mapper;
|
package com.czg.service.account.mapper;
|
||||||
|
|
||||||
import com.czg.account.dto.calltable.CallRecordVO;
|
import com.czg.account.dto.calltable.CallRecordVO;
|
||||||
|
import com.czg.account.vo.CallQueueInfoVO;
|
||||||
import com.mybatisflex.core.BaseMapper;
|
import com.mybatisflex.core.BaseMapper;
|
||||||
import com.czg.account.entity.CallQueue;
|
import com.czg.account.entity.CallQueue;
|
||||||
import com.mybatisflex.core.paginate.Page;
|
import com.mybatisflex.core.paginate.Page;
|
||||||
|
import org.apache.ibatis.annotations.Param;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 叫号排号队列表 映射层。
|
* 叫号排号队列表 映射层。
|
||||||
@@ -16,4 +20,5 @@ public interface CallQueueMapper extends BaseMapper<CallQueue> {
|
|||||||
Page<CallRecordVO> selectCallRecord();
|
Page<CallRecordVO> selectCallRecord();
|
||||||
long selectCallRecord_COUNT();
|
long selectCallRecord_COUNT();
|
||||||
|
|
||||||
|
List<CallQueueInfoVO> selectInfoByOpenId(@Param("shopId") Long shopId, @Param("openId") String openId, @Param("today") String today, @Param("queueId") Long queueId);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +1,11 @@
|
|||||||
package com.czg.service.account.mapper;
|
package com.czg.service.account.mapper;
|
||||||
|
|
||||||
import com.czg.account.entity.SysUser;
|
import com.czg.account.entity.SysUser;
|
||||||
|
import com.czg.account.vo.SysUserDetailVO;
|
||||||
import com.mybatisflex.core.BaseMapper;
|
import com.mybatisflex.core.BaseMapper;
|
||||||
|
import org.apache.ibatis.annotations.Param;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 系统用户 映射层。
|
* 系统用户 映射层。
|
||||||
@@ -11,4 +15,5 @@ import com.mybatisflex.core.BaseMapper;
|
|||||||
*/
|
*/
|
||||||
public interface SysUserMapper extends BaseMapper<SysUser> {
|
public interface SysUserMapper extends BaseMapper<SysUser> {
|
||||||
|
|
||||||
|
List<SysUserDetailVO> page(@Param("key") String key, @Param("startTime") String startTime, @Param("endTime") String endTime, @Param("status") Integer status);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ import cn.hutool.extra.qrcode.QrConfig;
|
|||||||
import com.czg.account.dto.calltable.*;
|
import com.czg.account.dto.calltable.*;
|
||||||
import com.czg.account.entity.*;
|
import com.czg.account.entity.*;
|
||||||
import com.czg.account.service.*;
|
import com.czg.account.service.*;
|
||||||
|
import com.czg.account.vo.CallQueueInfoVO;
|
||||||
import com.czg.config.RabbitPublisher;
|
import com.czg.config.RabbitPublisher;
|
||||||
import com.czg.config.RedisCst;
|
import com.czg.config.RedisCst;
|
||||||
import com.czg.exception.ApiNotPrintException;
|
import com.czg.exception.ApiNotPrintException;
|
||||||
@@ -15,6 +16,7 @@ import com.czg.resp.CzgResult;
|
|||||||
import com.czg.service.account.mapper.CallQueueMapper;
|
import com.czg.service.account.mapper.CallQueueMapper;
|
||||||
import com.czg.service.account.mapper.CallTableMapper;
|
import com.czg.service.account.mapper.CallTableMapper;
|
||||||
import com.czg.service.account.util.FunUtil;
|
import com.czg.service.account.util.FunUtil;
|
||||||
|
import com.czg.service.account.util.WechatMiniMsgUtil;
|
||||||
import com.czg.system.dto.SysParamsDTO;
|
import com.czg.system.dto.SysParamsDTO;
|
||||||
import com.czg.system.service.SysParamsService;
|
import com.czg.system.service.SysParamsService;
|
||||||
import com.czg.utils.JoinQueryWrapper;
|
import com.czg.utils.JoinQueryWrapper;
|
||||||
@@ -28,10 +30,7 @@ import org.apache.dubbo.config.annotation.DubboService;
|
|||||||
import org.springframework.data.redis.core.StringRedisTemplate;
|
import org.springframework.data.redis.core.StringRedisTemplate;
|
||||||
|
|
||||||
import java.io.ByteArrayOutputStream;
|
import java.io.ByteArrayOutputStream;
|
||||||
import java.util.ArrayList;
|
import java.util.*;
|
||||||
import java.util.Base64;
|
|
||||||
import java.util.Collections;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.concurrent.atomic.AtomicReference;
|
import java.util.concurrent.atomic.AtomicReference;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
@@ -62,6 +61,8 @@ public class CallTableServiceImpl extends ServiceImpl<CallTableMapper, CallTable
|
|||||||
private CallQueueMapper callQueueMapper;
|
private CallQueueMapper callQueueMapper;
|
||||||
@Resource
|
@Resource
|
||||||
private RabbitPublisher rabbitPublisher;
|
private RabbitPublisher rabbitPublisher;
|
||||||
|
@Resource
|
||||||
|
private WechatMiniMsgUtil miniMsgUtil;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public CallTablePage get(Long shopId, Long callTableId, Integer state) {
|
public CallTablePage get(Long shopId, Long callTableId, Integer state) {
|
||||||
@@ -222,7 +223,7 @@ public class CallTableServiceImpl extends ServiceImpl<CallTableMapper, CallTable
|
|||||||
rabbitPublisher.printCallNumTicket(callQueue.getId());
|
rabbitPublisher.printCallNumTicket(callQueue.getId());
|
||||||
|
|
||||||
return new CallTableNumDTO().setTableName(callTable.getName()).setTableNote(callTable.getNote())
|
return new CallTableNumDTO().setTableName(callTable.getName()).setTableNote(callTable.getNote())
|
||||||
.setCallNum(callQueue.getCallNum());
|
.setCallNum(callQueue.getCallNum()).setQueueId(callQueue.getId());
|
||||||
}
|
}
|
||||||
|
|
||||||
private String getCallNumber(Long shopId, CallTable callTable) {
|
private String getCallNumber(Long shopId, CallTable callTable) {
|
||||||
@@ -322,8 +323,8 @@ public class CallTableServiceImpl extends ServiceImpl<CallTableMapper, CallTable
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
// wxMiniUtils.sendCurrentOrNearCallMsg(shopInfo.getShopName(), getStrByState(Integer.valueOf(callQueue.getState())),
|
miniMsgUtil.sendCurrentOrNearCallMsg(shopInfo.getShopName(), getStrByState(callQueue.getState()),
|
||||||
// callQueue.getCallNum(), current.isEmpty() ? "" : current.get(0).getCallNum(), "排号信息", callQueue.getOpenId(), false);
|
callQueue.getCallNum(), current.isEmpty() ? "" : current.getFirst().getCallNum(), "排号信息", callQueue.getOpenId(), false);
|
||||||
|
|
||||||
CallConfig config = getConfig(shopId);
|
CallConfig config = getConfig(shopId);
|
||||||
// 临近用户提醒
|
// 临近用户提醒
|
||||||
@@ -334,11 +335,20 @@ public class CallTableServiceImpl extends ServiceImpl<CallTableMapper, CallTable
|
|||||||
.page(new Page<>(config.getNearNum(), 1)).getRecords();
|
.page(new Page<>(config.getNearNum(), 1)).getRecords();
|
||||||
if (!nearList.isEmpty()) {
|
if (!nearList.isEmpty()) {
|
||||||
CallQueue nearQueue = nearList.getFirst();
|
CallQueue nearQueue = nearList.getFirst();
|
||||||
// wxMiniUtils.sendCurrentOrNearCallMsg(shopInfo.getShopName(), getStrByState(Integer.valueOf(nearQueue.getState())),
|
miniMsgUtil.sendCurrentOrNearCallMsg(shopInfo.getShopName(), getStrByState(nearQueue.getState()),
|
||||||
// nearQueue.getCallNum(), current.isEmpty() ? "" : current.get(0).getCallNum(), "排号信息", nearQueue.getOpenId(), true);
|
nearQueue.getCallNum(), current.isEmpty() ? "" : current.getFirst().getCallNum(), "排号信息", nearQueue.getOpenId(), true);
|
||||||
}
|
}
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
private String getStrByState(Integer state) {
|
||||||
|
return switch (state) {
|
||||||
|
case -1 -> "已取消";
|
||||||
|
case 0 -> "排队中";
|
||||||
|
case 1 -> "已到号";
|
||||||
|
case 3 -> "已过号";
|
||||||
|
default -> "";
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean updateInfo(Long shopId, UpdateCallQueueDTO updateCallQueueDTO) {
|
public boolean updateInfo(Long shopId, UpdateCallQueueDTO updateCallQueueDTO) {
|
||||||
@@ -455,7 +465,7 @@ public class CallTableServiceImpl extends ServiceImpl<CallTableMapper, CallTable
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Page<CallQueue> getQueue(Long shopId, Long callTableId, Integer state) {
|
public Page<CallQueue> getQueue(Long shopId, String openId, Long callTableId, Integer state) {
|
||||||
List<Long> tableIds;
|
List<Long> tableIds;
|
||||||
if (callTableId != null) {
|
if (callTableId != null) {
|
||||||
tableIds = Collections.singletonList(callTableId);
|
tableIds = Collections.singletonList(callTableId);
|
||||||
@@ -479,6 +489,10 @@ public class CallTableServiceImpl extends ServiceImpl<CallTableMapper, CallTable
|
|||||||
query.in(CallQueue::getState, 0, 1);
|
query.in(CallQueue::getState, 0, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (StrUtil.isNotBlank(openId)) {
|
||||||
|
query.eq(CallQueue::getOpenId, openId);
|
||||||
|
}
|
||||||
|
|
||||||
Page<CallQueue> pageInfo = callQueueService.page(PageUtil.buildPage(), query
|
Page<CallQueue> pageInfo = callQueueService.page(PageUtil.buildPage(), query
|
||||||
.orderBy(CallQueue::getCreateTime, true)
|
.orderBy(CallQueue::getCreateTime, true)
|
||||||
.orderBy(CallQueue::getState, false));
|
.orderBy(CallQueue::getState, false));
|
||||||
@@ -543,4 +557,60 @@ public class CallTableServiceImpl extends ServiceImpl<CallTableMapper, CallTable
|
|||||||
tbCallConfig.setId(config.getId());
|
tbCallConfig.setId(config.getId());
|
||||||
return callConfigService.updateById(tbCallConfig);
|
return callConfigService.updateById(tbCallConfig);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean subMsg(CallSubMsgDTO subMsgDTO) {
|
||||||
|
CallQueue queue = callQueueService.getOne(new QueryWrapper()
|
||||||
|
.eq(CallQueue::getShopId, subMsgDTO.getShopId())
|
||||||
|
.eq(CallQueue::getId, subMsgDTO.getQueueId()));
|
||||||
|
if (queue == null) {
|
||||||
|
throw new ApiNotPrintException("您未排号请先排号");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (queue.getOpenId() != null && queue.getOpenId().equals(subMsgDTO.getOpenId()) && queue.getSubState() == 1) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (StrUtil.isNotBlank(queue.getOpenId()) && queue.getSubState() == 1) {
|
||||||
|
throw new ApiNotPrintException("此号码已被其他用户订阅");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!subMsgDTO.getOpenId().equals(queue.getOpenId()) && queue.getSubState() == 0) {
|
||||||
|
long count = callQueueService.queryChain()
|
||||||
|
// .eq(CallQueue::getPhone, takeNumberDTO.getPhone())
|
||||||
|
.eq(CallQueue::getOpenId, subMsgDTO.getOpenId())
|
||||||
|
.eq(CallQueue::getShopId, subMsgDTO.getShopId())
|
||||||
|
.eq(CallQueue::getCreateDay, DateUtil.date().toString("yyyy-MM-dd"))
|
||||||
|
.in(CallQueue::getState, 0, 1)
|
||||||
|
.ne(CallQueue::getIsPostpone, 2)
|
||||||
|
.eq(CallQueue::getCallTableId, queue.getCallTableId()).count();
|
||||||
|
if (count > 0) {
|
||||||
|
throw new ApiNotPrintException("您已订阅其他号码,请勿重复订阅");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
queue.setSubState(1);
|
||||||
|
queue.setOpenId(subMsgDTO.getOpenId());
|
||||||
|
return callQueueService.updateById(queue);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Object getStatus(Long shopId, String openId, Long queueId) {
|
||||||
|
List<CallQueueInfoVO> callQueueInfoVOS = callQueueMapper.selectInfoByOpenId(shopId, openId, DateUtil.date().toString("yyyy-MM-dd"), null);
|
||||||
|
if (callQueueInfoVOS.isEmpty()) {
|
||||||
|
callQueueInfoVOS = callQueueMapper.selectInfoByOpenId(shopId, openId, DateUtil.date().toString("yyyy-MM-dd"), queueId);
|
||||||
|
}
|
||||||
|
if (!callQueueInfoVOS.isEmpty()) {
|
||||||
|
CallQueueInfoVO callQueueInfoVO = callQueueInfoVOS.getFirst();
|
||||||
|
CallQueue callQueue = new CallQueue();
|
||||||
|
callQueue.setOpenId(openId);
|
||||||
|
callQueue.setId(callQueueInfoVO.getId());
|
||||||
|
callQueueService.updateById(callQueue);
|
||||||
|
}
|
||||||
|
ShopInfo shopInfo = shopInfoService.getById(shopId);
|
||||||
|
HashMap<String, Object> data = new HashMap<>();
|
||||||
|
data.put("shopInfo", shopInfo);
|
||||||
|
data.put("queueInfo", callQueueInfoVOS.isEmpty() ? null : callQueueInfoVOS.getFirst());
|
||||||
|
return data;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -31,6 +31,7 @@ import org.springframework.cache.annotation.Cacheable;
|
|||||||
import org.springframework.transaction.annotation.Transactional;
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
|
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
|
import java.time.LocalDateTime;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
@@ -66,10 +67,10 @@ public class ShopInfoServiceImpl extends ServiceImpl<ShopInfoMapper, ShopInfo> i
|
|||||||
if (shopInfo == null) {
|
if (shopInfo == null) {
|
||||||
throw new ApiNotPrintException("店铺不存在");
|
throw new ApiNotPrintException("店铺不存在");
|
||||||
}
|
}
|
||||||
if ((DateUtil.date().toLocalDateTime().isAfter(shopInfo.getExpireTime())) || shopInfo.getStatus() != StatusEnum.ENABLED.value()) {
|
if ((DateUtil.date().toLocalDateTime().isAfter(shopInfo.getExpireTime()))) {
|
||||||
throw new ApiNotPrintException("店铺已过期,请联系商家");
|
throw new ApiNotPrintException("店铺已过期,请联系商家");
|
||||||
}
|
}
|
||||||
if (StatusEnum.DISABLE.value() == shopInfo.getOnSale()) {
|
if (StatusEnum.DISABLE.value() == shopInfo.getOnSale() || shopInfo.getStatus() != StatusEnum.ENABLED.value()) {
|
||||||
throw new ApiNotPrintException("店铺已停业,请联系商家");
|
throw new ApiNotPrintException("店铺已停业,请联系商家");
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -98,7 +99,13 @@ public class ShopInfoServiceImpl extends ServiceImpl<ShopInfoMapper, ShopInfo> i
|
|||||||
if (merchantRegister.getStatus() == 1) {
|
if (merchantRegister.getStatus() == 1) {
|
||||||
throw new CzgException("激活码已使用");
|
throw new CzgException("激活码已使用");
|
||||||
}
|
}
|
||||||
shopInfo.setExpireTime(DateUtil.offsetMonth(DateUtil.date(), merchantRegister.getPeriodMonth()).toLocalDateTime());
|
|
||||||
|
// 续期
|
||||||
|
if (shopInfo.getExpireTime() != null && shopInfo.getExpireTime().isAfter(LocalDateTime.now())) {
|
||||||
|
shopInfo.setExpireTime(DateUtil.offsetMonth(DateUtil.date(shopInfo.getExpireTime()), merchantRegister.getPeriodMonth()).toLocalDateTime());
|
||||||
|
}else {
|
||||||
|
shopInfo.setExpireTime(DateUtil.offsetMonth(DateUtil.date(), merchantRegister.getPeriodMonth()).toLocalDateTime());
|
||||||
|
}
|
||||||
merchantRegister.setStatus(1);
|
merchantRegister.setStatus(1);
|
||||||
merchantRegister.setShopId(shopInfo.getId());
|
merchantRegister.setShopId(shopInfo.getId());
|
||||||
merchantRegisterService.updateById(merchantRegister);
|
merchantRegisterService.updateById(merchantRegister);
|
||||||
|
|||||||
@@ -17,10 +17,13 @@ import com.czg.account.vo.SysUserDetailVO;
|
|||||||
import com.czg.exception.ApiNotPrintException;
|
import com.czg.exception.ApiNotPrintException;
|
||||||
import com.czg.exception.CzgException;
|
import com.czg.exception.CzgException;
|
||||||
import com.czg.sa.StpKit;
|
import com.czg.sa.StpKit;
|
||||||
|
import com.czg.service.RedisService;
|
||||||
import com.czg.service.account.mapper.SysRoleMapper;
|
import com.czg.service.account.mapper.SysRoleMapper;
|
||||||
import com.czg.service.account.mapper.SysUserMapper;
|
import com.czg.service.account.mapper.SysUserMapper;
|
||||||
import com.czg.service.account.mapper.SysUsersRolesMapper;
|
import com.czg.service.account.mapper.SysUsersRolesMapper;
|
||||||
import com.czg.utils.PageUtil;
|
import com.czg.utils.PageUtil;
|
||||||
|
import com.github.pagehelper.PageHelper;
|
||||||
|
import com.github.pagehelper.PageInfo;
|
||||||
import com.mybatisflex.core.paginate.Page;
|
import com.mybatisflex.core.paginate.Page;
|
||||||
import com.mybatisflex.core.query.QueryWrapper;
|
import com.mybatisflex.core.query.QueryWrapper;
|
||||||
import com.mybatisflex.spring.service.impl.ServiceImpl;
|
import com.mybatisflex.spring.service.impl.ServiceImpl;
|
||||||
@@ -47,6 +50,8 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
|
|||||||
private SysRoleMapper sysRoleMapper;
|
private SysRoleMapper sysRoleMapper;
|
||||||
@Resource
|
@Resource
|
||||||
private SysUsersRolesMapper sysUsersRolesMapper;
|
private SysUsersRolesMapper sysUsersRolesMapper;
|
||||||
|
@Resource
|
||||||
|
private RedisService redisService;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public SysUser addUser(String nickname, String accountName, String accountPwd, String phone, Long roleId) {
|
public SysUser addUser(String nickname, String accountName, String accountPwd, String phone, Long roleId) {
|
||||||
@@ -96,24 +101,9 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Page<SysUser> getPage(String key, String startTime, String endTime, Integer status) {
|
public Page<SysUserDetailVO> getPage(String key, String startTime, String endTime, Integer status) {
|
||||||
QueryWrapper queryWrapper = new QueryWrapper();
|
PageHelper.startPage(PageUtil.buildPageHelp());
|
||||||
if (StrUtil.isNotBlank(key)) {
|
return PageUtil.convert(new PageInfo<>(mapper.page(key, startTime, endTime, status)));
|
||||||
queryWrapper.and(column(SysUser::getAccount).like(key).or(column(SysUser::getNickName).like(key)));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (StrUtil.isNotBlank(startTime)) {
|
|
||||||
queryWrapper.ge(SysUser::getCreateTime, DateUtil.parse(startTime));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (StrUtil.isNotBlank(endTime)) {
|
|
||||||
queryWrapper.le(SysUser::getCreateTime, DateUtil.parse(endTime));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (status != null) {
|
|
||||||
queryWrapper.eq(SysUser::getStatus, status);
|
|
||||||
}
|
|
||||||
return page(PageUtil.buildPage(), queryWrapper);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -177,8 +167,8 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void download(String key, String startTime, String endTime, Integer status, HttpServletResponse response) throws IOException {
|
public void download(String key, String startTime, String endTime, Integer status, HttpServletResponse response) throws IOException {
|
||||||
Page<SysUser> sysUserPage = getPage(key, startTime, endTime, status);
|
Page<SysUserDetailVO> sysUserPage = getPage(key, startTime, endTime, status);
|
||||||
List<SysUser> records = sysUserPage.getRecords();
|
List<SysUserDetailVO> records = sysUserPage.getRecords();
|
||||||
|
|
||||||
// 1. 创建 ExcelWriter
|
// 1. 创建 ExcelWriter
|
||||||
// true 表示使用 XLSX 格式
|
// true 表示使用 XLSX 格式
|
||||||
@@ -232,7 +222,10 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
|
|||||||
}
|
}
|
||||||
|
|
||||||
sysUser.setPassword(SecureUtil.md5(sysUser.getId() + sysUserEditPwdDTO.getPassword()));
|
sysUser.setPassword(SecureUtil.md5(sysUser.getId() + sysUserEditPwdDTO.getPassword()));
|
||||||
|
boolean isUp = updateById(sysUser);
|
||||||
return updateById(sysUser);
|
if (isUp) {
|
||||||
|
redisService.del(STR."token:admin:session:\{sysUser.getId()}");
|
||||||
|
}
|
||||||
|
return isUp;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -10,16 +10,12 @@ import com.alipay.api.DefaultAlipayClient;
|
|||||||
import com.alipay.api.internal.util.AlipayEncrypt;
|
import com.alipay.api.internal.util.AlipayEncrypt;
|
||||||
import com.alipay.api.request.AlipaySystemOauthTokenRequest;
|
import com.alipay.api.request.AlipaySystemOauthTokenRequest;
|
||||||
import com.alipay.api.response.AlipaySystemOauthTokenResponse;
|
import com.alipay.api.response.AlipaySystemOauthTokenResponse;
|
||||||
import com.czg.exception.ApiNotPrintException;
|
|
||||||
import com.czg.resp.CzgResult;
|
import com.czg.resp.CzgResult;
|
||||||
import com.czg.system.dto.SysParamsDTO;
|
import com.czg.system.dto.SysParamsDTO;
|
||||||
import com.czg.system.service.SysParamsService;
|
import com.czg.system.service.SysParamsService;
|
||||||
import jakarta.annotation.PostConstruct;
|
|
||||||
import jakarta.annotation.Resource;
|
|
||||||
import lombok.SneakyThrows;
|
import lombok.SneakyThrows;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.apache.dubbo.config.annotation.DubboReference;
|
import org.apache.dubbo.config.annotation.DubboReference;
|
||||||
import org.springframework.beans.factory.annotation.Value;
|
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -35,61 +31,6 @@ public class AlipayUtil {
|
|||||||
@DubboReference
|
@DubboReference
|
||||||
private SysParamsService sysParamsService;
|
private SysParamsService sysParamsService;
|
||||||
|
|
||||||
/**
|
|
||||||
* 网关地址 线上:https://openapi.alipay.com/gateway.do 沙箱:https://openapi.alipaydev.com/gateway.do
|
|
||||||
*/
|
|
||||||
// @Value("${alipay.serverUrl}")
|
|
||||||
private String serverUrl;
|
|
||||||
/**
|
|
||||||
* 应用ID
|
|
||||||
*/
|
|
||||||
// @Value("${alipay.appId}")
|
|
||||||
private String appId;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 应用私钥
|
|
||||||
*/
|
|
||||||
// @Value("${alipay.privateKey}")
|
|
||||||
private String privateKey;
|
|
||||||
/**
|
|
||||||
* 支付宝公钥
|
|
||||||
*/
|
|
||||||
// @Value("${alipay.alipayPublicKey}")
|
|
||||||
private String alipayPublicKey;
|
|
||||||
/**
|
|
||||||
* 支付宝公钥
|
|
||||||
*/
|
|
||||||
// @Value("${alipay.encryptKey}")
|
|
||||||
private String encryptKey;
|
|
||||||
|
|
||||||
// @Value("${alipay.account.appId}")
|
|
||||||
private String accountAppId;
|
|
||||||
// @Value("${alipay.account.privateKey}")
|
|
||||||
private String accountPrivateKey;
|
|
||||||
// @Value("${alipay.account.publicKey}")
|
|
||||||
private String accountPublicKey;
|
|
||||||
|
|
||||||
// @PostConstruct
|
|
||||||
// private void init() {
|
|
||||||
// CzgResult<SysParamsDTO> aliGateway = sysParamsService.getParamsByCode("ali_gateway");
|
|
||||||
// CzgResult<SysParamsDTO> aliMiniAppId = sysParamsService.getParamsByCode("ali_mini_app_id");
|
|
||||||
// CzgResult<SysParamsDTO> aliMiniPrivateKey = sysParamsService.getParamsByCode("ali_mini_private_key");
|
|
||||||
// CzgResult<SysParamsDTO> aliMiniPublicKey = sysParamsService.getParamsByCode("ali_mini_public_key");
|
|
||||||
// CzgResult<SysParamsDTO> aliAccountAppId = sysParamsService.getParamsByCode("ali_account_app_id");
|
|
||||||
// CzgResult<SysParamsDTO> aliAccountPrivateKey = sysParamsService.getParamsByCode("ali_account_private_key");
|
|
||||||
// CzgResult<SysParamsDTO> aliAccountPublicKey = sysParamsService.getParamsByCode("ali_account_public_key");
|
|
||||||
// CzgResult<SysParamsDTO> aliEncryptKey = sysParamsService.getParamsByCode("ali_encrypt_key");
|
|
||||||
// serverUrl = aliGateway.getData().getParamValue();
|
|
||||||
// appId = aliMiniAppId.getData().getParamValue();
|
|
||||||
// privateKey = aliMiniPrivateKey.getData().getParamValue();
|
|
||||||
// alipayPublicKey = aliMiniPublicKey.getData().getParamValue();
|
|
||||||
// encryptKey = aliEncryptKey.getData().getParamValue();
|
|
||||||
// accountAppId = aliAccountAppId.getData().getParamValue();
|
|
||||||
// accountPrivateKey = aliAccountPrivateKey.getData().getParamValue();
|
|
||||||
// accountPublicKey = aliAccountPublicKey.getData().getParamValue();
|
|
||||||
// log.info("支付宝工具类初始化成功, {}", this);
|
|
||||||
// }
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 创建支付宝客户端
|
* 创建支付宝客户端
|
||||||
*
|
*
|
||||||
@@ -97,6 +38,20 @@ public class AlipayUtil {
|
|||||||
*/
|
*/
|
||||||
@SneakyThrows
|
@SneakyThrows
|
||||||
public AlipayClient createClient(boolean isAccount) {
|
public AlipayClient createClient(boolean isAccount) {
|
||||||
|
CzgResult<SysParamsDTO> aliGateway = sysParamsService.getParamsByCode("ali_gateway");
|
||||||
|
CzgResult<SysParamsDTO> aliMiniAppId = sysParamsService.getParamsByCode("ali_mini_app_id");
|
||||||
|
CzgResult<SysParamsDTO> aliMiniPrivateKey = sysParamsService.getParamsByCode("ali_mini_private_key");
|
||||||
|
CzgResult<SysParamsDTO> aliMiniPublicKey = sysParamsService.getParamsByCode("ali_mini_public_key");
|
||||||
|
CzgResult<SysParamsDTO> aliAccountAppId = sysParamsService.getParamsByCode("ali_account_app_id");
|
||||||
|
CzgResult<SysParamsDTO> aliAccountPrivateKey = sysParamsService.getParamsByCode("ali_account_private_key");
|
||||||
|
CzgResult<SysParamsDTO> aliAccountPublicKey = sysParamsService.getParamsByCode("ali_account_public_key");
|
||||||
|
String serverUrl = aliGateway.getData().getParamValue();
|
||||||
|
String appId = aliMiniAppId.getData().getParamValue();
|
||||||
|
String privateKey = aliMiniPrivateKey.getData().getParamValue();
|
||||||
|
String alipayPublicKey = aliMiniPublicKey.getData().getParamValue();
|
||||||
|
String accountAppId = aliAccountAppId.getData().getParamValue();
|
||||||
|
String accountPrivateKey = aliAccountPrivateKey.getData().getParamValue();
|
||||||
|
String accountPublicKey = aliAccountPublicKey.getData().getParamValue();
|
||||||
AlipayConfig alipayConfig = new AlipayConfig();
|
AlipayConfig alipayConfig = new AlipayConfig();
|
||||||
//设置网关地址
|
//设置网关地址
|
||||||
alipayConfig.setServerUrl(serverUrl);
|
alipayConfig.setServerUrl(serverUrl);
|
||||||
@@ -141,27 +96,30 @@ public class AlipayUtil {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public String getMobile(String encryptedData) {
|
public String getMobile(String encryptedData) {
|
||||||
if(StrUtil.isEmpty(encryptedData)){
|
if (StrUtil.isEmpty(encryptedData)) {
|
||||||
throw new RuntimeException("加密数据不能为空");
|
throw new RuntimeException("加密数据不能为空");
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
|
CzgResult<SysParamsDTO> aliEncryptKey = sysParamsService.getParamsByCode("ali_encrypt_key");
|
||||||
|
String encryptKey = aliEncryptKey.getData().getParamValue();
|
||||||
|
|
||||||
log.info("解密前的数据,返回结果:{}", encryptedData);
|
log.info("解密前的数据,返回结果:{}", encryptedData);
|
||||||
String resp = AlipayEncrypt.decryptContent(encryptedData, "AES", encryptKey, "UTF-8");
|
String resp = AlipayEncrypt.decryptContent(encryptedData, "AES", encryptKey, "UTF-8");
|
||||||
log.info("解密后的数据,返回结果:{}", resp);
|
log.info("解密后的数据,返回结果:{}", resp);
|
||||||
boolean isJson = JSONUtil.isTypeJSON(resp);
|
boolean isJson = JSONUtil.isTypeJSON(resp);
|
||||||
if(!isJson){
|
if (!isJson) {
|
||||||
throw new AlipayApiException("解密后的数据不是json格式");
|
throw new AlipayApiException("解密后的数据不是json格式");
|
||||||
}
|
}
|
||||||
JSONObject jsonObject = JSONUtil.parseObj(resp);
|
JSONObject jsonObject = JSONUtil.parseObj(resp);
|
||||||
String code = jsonObject.getStr("code");
|
String code = jsonObject.getStr("code");
|
||||||
String msg = jsonObject.getStr("msg");
|
String msg = jsonObject.getStr("msg");
|
||||||
String mobile = jsonObject.getStr("mobile");
|
String mobile = jsonObject.getStr("mobile");
|
||||||
if("10000".equals(code)){
|
if ("10000".equals(code)) {
|
||||||
return mobile;
|
return mobile;
|
||||||
}else{
|
} else {
|
||||||
throw new AlipayApiException(code,msg);
|
throw new AlipayApiException(code, msg);
|
||||||
}
|
}
|
||||||
}catch (AlipayApiException e){
|
} catch (AlipayApiException e) {
|
||||||
log.error("获取支付宝用户的手机号码失败,错误码:{},错误信息:{}", e.getErrCode(), e.getErrMsg());
|
log.error("获取支付宝用户的手机号码失败,错误码:{},错误信息:{}", e.getErrCode(), e.getErrMsg());
|
||||||
throw new RuntimeException(e);
|
throw new RuntimeException(e);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -13,7 +13,6 @@ import com.czg.system.dto.SysParamsDTO;
|
|||||||
import com.czg.system.enums.SysParamCodeEnum;
|
import com.czg.system.enums.SysParamCodeEnum;
|
||||||
import com.czg.system.service.SysParamsService;
|
import com.czg.system.service.SysParamsService;
|
||||||
import com.google.gson.JsonObject;
|
import com.google.gson.JsonObject;
|
||||||
import jakarta.annotation.PostConstruct;
|
|
||||||
import jakarta.annotation.Resource;
|
import jakarta.annotation.Resource;
|
||||||
import jakarta.validation.constraints.NotBlank;
|
import jakarta.validation.constraints.NotBlank;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
@@ -38,16 +37,6 @@ public class WechatAuthUtil {
|
|||||||
@Resource
|
@Resource
|
||||||
private AliOssUtil aliOssUtil;
|
private AliOssUtil aliOssUtil;
|
||||||
|
|
||||||
// @Value("${wx.appId}")
|
|
||||||
private String appId;
|
|
||||||
// @Value("${wx.secrete}")
|
|
||||||
private String secrete;
|
|
||||||
|
|
||||||
// @Value("${wx.account.appId}")
|
|
||||||
private String accountAppId;
|
|
||||||
// @Value("${wx.account.secrete}")
|
|
||||||
private String accountSecrete;
|
|
||||||
|
|
||||||
private static final String TOKEN_URL = "https://api.weixin.qq.com/cgi-bin/token";
|
private static final String TOKEN_URL = "https://api.weixin.qq.com/cgi-bin/token";
|
||||||
private static final String QR_CODE_URL = "https://api.weixin.qq.com/wxa/getwxacode";
|
private static final String QR_CODE_URL = "https://api.weixin.qq.com/wxa/getwxacode";
|
||||||
|
|
||||||
@@ -68,20 +57,11 @@ public class WechatAuthUtil {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// @PostConstruct
|
|
||||||
// public void init() {
|
|
||||||
// CzgResult<SysParamsDTO> wxMiniAppId = sysParamsService.getParamsByCode("wx_mini_app_id");
|
|
||||||
// CzgResult<SysParamsDTO> wxMiniSecrete = sysParamsService.getParamsByCode("wx_mini_secrete");
|
|
||||||
// CzgResult<SysParamsDTO> wxAccountAppId = sysParamsService.getParamsByCode("wx_account_app_id");
|
|
||||||
// CzgResult<SysParamsDTO> wxAccountSecrete = sysParamsService.getParamsByCode("wx_account_secrete");
|
|
||||||
// appId = wxMiniAppId.getData().getParamValue();
|
|
||||||
// secrete = wxMiniSecrete.getData().getParamValue();
|
|
||||||
// accountAppId = wxAccountAppId.getData().getParamValue();
|
|
||||||
// accountSecrete = wxAccountSecrete.getData().getParamValue();
|
|
||||||
// log.info("微信工具类初始化成功, appId: {}, secrete: {}, accountAppId: {}, accountSecrete: {}", appId, secrete, accountAppId, accountSecrete);
|
|
||||||
// }
|
|
||||||
|
|
||||||
public String getAccountOpenId(String code) {
|
public String getAccountOpenId(String code) {
|
||||||
|
CzgResult<SysParamsDTO> wxAccountAppId = sysParamsService.getParamsByCode("wx_account_app_id");
|
||||||
|
CzgResult<SysParamsDTO> wxAccountSecrete = sysParamsService.getParamsByCode("wx_account_secrete");
|
||||||
|
String accountAppId = wxAccountAppId.getData().getParamValue();
|
||||||
|
String accountSecrete = wxAccountSecrete.getData().getParamValue();
|
||||||
String requestUrl = "https://api.weixin.qq.com/sns/oauth2/access_token?";
|
String requestUrl = "https://api.weixin.qq.com/sns/oauth2/access_token?";
|
||||||
Map<String, Object> requestUrlParam = new HashMap<>();
|
Map<String, Object> requestUrlParam = new HashMap<>();
|
||||||
// https://mp.weixin.qq.com/wxopen/devprofile?action=get_profile&token=164113089&lang=zh_CN
|
// https://mp.weixin.qq.com/wxopen/devprofile?action=get_profile&token=164113089&lang=zh_CN
|
||||||
@@ -102,6 +82,10 @@ public class WechatAuthUtil {
|
|||||||
|
|
||||||
//获取小程序token
|
//获取小程序token
|
||||||
private String getAccessToken() {
|
private String getAccessToken() {
|
||||||
|
CzgResult<SysParamsDTO> wxMiniAppId = sysParamsService.getParamsByCode("wx_mini_app_id");
|
||||||
|
CzgResult<SysParamsDTO> wxMiniSecrete = sysParamsService.getParamsByCode("wx_mini_secrete");
|
||||||
|
String appId = wxMiniAppId.getData().getParamValue();
|
||||||
|
String secrete = wxMiniSecrete.getData().getParamValue();
|
||||||
String url = String.format("%s?grant_type=client_credential&appid=%s&secret=%s", TOKEN_URL, appId, secrete);
|
String url = String.format("%s?grant_type=client_credential&appid=%s&secret=%s", TOKEN_URL, appId, secrete);
|
||||||
String response = HttpUtil.get(url);
|
String response = HttpUtil.get(url);
|
||||||
com.alibaba.fastjson.JSONObject jsonResponse = com.alibaba.fastjson.JSONObject.parseObject(response);
|
com.alibaba.fastjson.JSONObject jsonResponse = com.alibaba.fastjson.JSONObject.parseObject(response);
|
||||||
@@ -114,8 +98,6 @@ public class WechatAuthUtil {
|
|||||||
/**
|
/**
|
||||||
* 生成 小程序码 跳转对应页面
|
* 生成 小程序码 跳转对应页面
|
||||||
*
|
*
|
||||||
* @param params
|
|
||||||
* @return
|
|
||||||
*/
|
*/
|
||||||
public String getFetchQrCode(Map<String, Object> params) throws Exception {
|
public String getFetchQrCode(Map<String, Object> params) throws Exception {
|
||||||
String url = aliOssUtil.upload(fetchQrCode(params), aliOssUtil.getPath("shopVip", "png"));
|
String url = aliOssUtil.upload(fetchQrCode(params), aliOssUtil.getPath("shopVip", "png"));
|
||||||
@@ -127,7 +109,7 @@ public class WechatAuthUtil {
|
|||||||
private InputStream fetchQrCode(Map<String, Object> params) {
|
private InputStream fetchQrCode(Map<String, Object> params) {
|
||||||
JsonObject jsonObject = new JsonObject();
|
JsonObject jsonObject = new JsonObject();
|
||||||
//路径
|
//路径
|
||||||
jsonObject.addProperty("path", sysParamsService.getSysParamValue(SysParamCodeEnum.WX_MINI_VIP_URL.getCode())+"?shopId="+params.get("shopId"));
|
jsonObject.addProperty("path", sysParamsService.getSysParamValue(SysParamCodeEnum.WX_MINI_VIP_URL.getCode()) + "?shopId=" + params.get("shopId"));
|
||||||
//是否需要透明底色,为 true 时,生成透明底色的小程序码
|
//是否需要透明底色,为 true 时,生成透明底色的小程序码
|
||||||
jsonObject.addProperty("is_hyaline", true);
|
jsonObject.addProperty("is_hyaline", true);
|
||||||
//正式版为 release,体验版为 trial,开发版为 develop
|
//正式版为 release,体验版为 trial,开发版为 develop
|
||||||
@@ -144,6 +126,10 @@ public class WechatAuthUtil {
|
|||||||
|
|
||||||
|
|
||||||
public JSONObject getSession(String code) {
|
public JSONObject getSession(String code) {
|
||||||
|
CzgResult<SysParamsDTO> wxMiniSecrete = sysParamsService.getParamsByCode("wx_mini_secrete");
|
||||||
|
CzgResult<SysParamsDTO> wxMiniAppId = sysParamsService.getParamsByCode("wx_mini_app_id");
|
||||||
|
String appId = wxMiniAppId.getData().getParamValue();
|
||||||
|
String secrete = wxMiniSecrete.getData().getParamValue();
|
||||||
String requestUrl = "https://api.weixin.qq.com/sns/jscode2session";
|
String requestUrl = "https://api.weixin.qq.com/sns/jscode2session";
|
||||||
Map<String, Object> requestUrlParam = new HashMap<>();
|
Map<String, Object> requestUrlParam = new HashMap<>();
|
||||||
// https://mp.weixin.qq.com/wxopen/devprofile?action=get_profile&token=164113089&lang=zh_CN
|
// https://mp.weixin.qq.com/wxopen/devprofile?action=get_profile&token=164113089&lang=zh_CN
|
||||||
|
|||||||
@@ -0,0 +1,256 @@
|
|||||||
|
package com.czg.service.account.util;
|
||||||
|
|
||||||
|
import cn.hutool.core.codec.Base64;
|
||||||
|
import cn.hutool.core.util.ObjectUtil;
|
||||||
|
import cn.hutool.core.util.StrUtil;
|
||||||
|
import cn.hutool.crypto.symmetric.AES;
|
||||||
|
import cn.hutool.http.HttpRequest;
|
||||||
|
import cn.hutool.http.HttpUtil;
|
||||||
|
import com.alibaba.fastjson2.JSON;
|
||||||
|
import com.alibaba.fastjson2.JSONObject;
|
||||||
|
import com.czg.config.RedisCst;
|
||||||
|
import com.czg.resp.CzgResult;
|
||||||
|
import com.czg.service.RedisService;
|
||||||
|
import com.czg.system.dto.SysParamsDTO;
|
||||||
|
import com.czg.system.enums.SysParamCodeEnum;
|
||||||
|
import com.czg.system.service.SysParamsService;
|
||||||
|
import com.google.gson.JsonObject;
|
||||||
|
import jakarta.annotation.Resource;
|
||||||
|
import jakarta.validation.constraints.NotBlank;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.apache.dubbo.config.annotation.DubboReference;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
import java.io.InputStream;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.LinkedHashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Administrator
|
||||||
|
*/
|
||||||
|
@Slf4j
|
||||||
|
@Component
|
||||||
|
public class WechatMiniMsgUtil {
|
||||||
|
@DubboReference(check = false)
|
||||||
|
private SysParamsService sysParamsService;
|
||||||
|
@Resource
|
||||||
|
private RedisService redisService;
|
||||||
|
@Resource
|
||||||
|
private AliOssUtil aliOssUtil;
|
||||||
|
|
||||||
|
private static final String TOKEN_URL = "https://api.weixin.qq.com/cgi-bin/token";
|
||||||
|
private static final String QR_CODE_URL = "https://api.weixin.qq.com/wxa/getwxacode";
|
||||||
|
|
||||||
|
|
||||||
|
static LinkedHashMap<String, String> linkedHashMap = new LinkedHashMap<>();
|
||||||
|
|
||||||
|
static {
|
||||||
|
|
||||||
|
linkedHashMap.put("40001", "获取 access_token 时 AppSecret 错误,或者 access_token 无效。请开发者认真比对 AppSecret 的正确性,或查看是否正在为恰当的公众号调用接口");
|
||||||
|
linkedHashMap.put("40003", "不合法的 OpenID ,请开发者确认 OpenID (该用户)是否已关注公众号,或是否是其他公众号的 OpenID");
|
||||||
|
linkedHashMap.put("40014", "不合法的 access_token ,请开发者认真比对 access_token 的有效性(如是否过期),或查看是否正在为恰当的公众号调用接口");
|
||||||
|
linkedHashMap.put("40037", "不合法的 template_id");
|
||||||
|
linkedHashMap.put("43101", "用户未订阅消息");
|
||||||
|
linkedHashMap.put("43107", "订阅消息能力封禁");
|
||||||
|
linkedHashMap.put("43108", "并发下发消息给同一个粉丝");
|
||||||
|
linkedHashMap.put("45168", "命中敏感词");
|
||||||
|
linkedHashMap.put("47003", "参数错误");
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public JSONObject sendTempMsg(String tempId, String toUserOpenId, Map<String, Object> data, String note) {
|
||||||
|
log.info("开始发送" + note + "模板消息, 接收用户openId: {}, 消息数据: {}", toUserOpenId, data);
|
||||||
|
String token= getAccessToken();
|
||||||
|
|
||||||
|
JSONObject object1=new JSONObject();
|
||||||
|
|
||||||
|
object1.put("template_id", tempId);
|
||||||
|
object1.put("touser", toUserOpenId);
|
||||||
|
object1.put("data",data);
|
||||||
|
|
||||||
|
object1.put("miniprogram_state","trial");
|
||||||
|
object1.put("lang","zh_CN");
|
||||||
|
|
||||||
|
String response= HttpRequest.post("https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token=".concat(token)).body(object1.toString()).execute().body();
|
||||||
|
log.info("微信模板消息发送成功,相应内容:{}",response);
|
||||||
|
JSONObject resObj= JSONObject.parseObject(response);
|
||||||
|
if(ObjectUtil.isNotEmpty(resObj)&&ObjectUtil.isNotNull(resObj)&&"0".equals(resObj.get("errcode")+"")){
|
||||||
|
return resObj;
|
||||||
|
}
|
||||||
|
|
||||||
|
throw new RuntimeException(linkedHashMap.getOrDefault(resObj.get("errcode") + "", "未知错误"));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void sendCurrentOrNearCallMsg(String shopName, String state, String callNum, String currentNum, String note, String openId, boolean isNear) {
|
||||||
|
CzgResult<SysParamsDTO> callNear = sysParamsService.getParamsByCode("wx_mini_msg_call_near");
|
||||||
|
CzgResult<SysParamsDTO> callCurrent = sysParamsService.getParamsByCode("wx_mini_msg_call_current");
|
||||||
|
|
||||||
|
Map<String, Object> data = new HashMap<String, Object>() {{
|
||||||
|
put("thing1", new HashMap<String, Object>() {{
|
||||||
|
put("value", shopName);
|
||||||
|
}});
|
||||||
|
put("phrase2", new HashMap<String, Object>() {{
|
||||||
|
put("value", state);
|
||||||
|
}});
|
||||||
|
put("character_string3", new HashMap<String, Object>() {{
|
||||||
|
put("value", callNum);
|
||||||
|
}});
|
||||||
|
put("character_string4", new HashMap<String, Object>() {{
|
||||||
|
put("value", currentNum);
|
||||||
|
}});
|
||||||
|
put("thing5", new HashMap<String, Object>() {{
|
||||||
|
put("value", note);
|
||||||
|
}});
|
||||||
|
}};
|
||||||
|
try {
|
||||||
|
sendTempMsg(isNear ? callNear.getData().getParamValue() : callCurrent.getData().getParamValue(), openId, data, "排队到号");
|
||||||
|
} catch (Exception e) {
|
||||||
|
log.error("发送失败, openId:{}, msg: {}", openId, e.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void sendPassCallMsg(String shopName, String state, String callNum, String currentNum, String note, String openId) {
|
||||||
|
CzgResult<SysParamsDTO> callPass = sysParamsService.getParamsByCode("wx_mini_msg_call_pass");
|
||||||
|
|
||||||
|
Map<String, Object> data = new HashMap<String, Object>() {{
|
||||||
|
put("thing1", new HashMap<String, Object>() {{
|
||||||
|
put("value", shopName);
|
||||||
|
}});
|
||||||
|
put("character_string2", new HashMap<String, Object>() {{
|
||||||
|
put("value", callNum);
|
||||||
|
}});
|
||||||
|
put("character_string3", new HashMap<String, Object>() {{
|
||||||
|
put("value", currentNum);
|
||||||
|
}});
|
||||||
|
put("phrase4", new HashMap<String, Object>() {{
|
||||||
|
put("value", state);
|
||||||
|
}});
|
||||||
|
put("thing5", new HashMap<String, Object>() {{
|
||||||
|
put("value", note);
|
||||||
|
}});
|
||||||
|
}};
|
||||||
|
try {
|
||||||
|
sendTempMsg(callPass.getData().getParamValue(), openId, data, "过号");
|
||||||
|
} catch (Exception e) {
|
||||||
|
log.error("发送失败, openId:{}, msg: {}", openId, e.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getAccountOpenId(String code) {
|
||||||
|
CzgResult<SysParamsDTO> wxAccountAppId = sysParamsService.getParamsByCode("wx_account_app_id");
|
||||||
|
CzgResult<SysParamsDTO> wxAccountSecrete = sysParamsService.getParamsByCode("wx_account_secrete");
|
||||||
|
String accountAppId = wxAccountAppId.getData().getParamValue();
|
||||||
|
String accountSecrete = wxAccountSecrete.getData().getParamValue();
|
||||||
|
String requestUrl = "https://api.weixin.qq.com/sns/oauth2/access_token?";
|
||||||
|
Map<String, Object> requestUrlParam = new HashMap<>();
|
||||||
|
// https://mp.weixin.qq.com/wxopen/devprofile?action=get_profile&token=164113089&lang=zh_CN
|
||||||
|
//小程序appId
|
||||||
|
requestUrlParam.put("appid", accountAppId);
|
||||||
|
//小程序secret
|
||||||
|
requestUrlParam.put("secret", accountSecrete);
|
||||||
|
//小程序端返回的code
|
||||||
|
requestUrlParam.put("code", code);
|
||||||
|
//默认参数
|
||||||
|
requestUrlParam.put("grant_type", "authorization_code");
|
||||||
|
log.info("微信获取openid请求报文:{}", requestUrlParam);
|
||||||
|
//发送post请求读取调用微信接口获取openid用户唯一标识
|
||||||
|
String resp = HttpUtil.post(requestUrl, requestUrlParam);
|
||||||
|
log.info("响应报文{}", resp);
|
||||||
|
return JSONObject.parseObject(resp).getString("openid");
|
||||||
|
}
|
||||||
|
|
||||||
|
//获取小程序token
|
||||||
|
private String getAccessToken() {
|
||||||
|
CzgResult<SysParamsDTO> wxMiniAppId = sysParamsService.getParamsByCode("wx_mini_app_id");
|
||||||
|
CzgResult<SysParamsDTO> wxMiniSecrete = sysParamsService.getParamsByCode("wx_mini_secrete");
|
||||||
|
String appId = wxMiniAppId.getData().getParamValue();
|
||||||
|
String secrete = wxMiniSecrete.getData().getParamValue();
|
||||||
|
String url = String.format("%s?grant_type=client_credential&appid=%s&secret=%s", TOKEN_URL, appId, secrete);
|
||||||
|
String response = HttpUtil.get(url);
|
||||||
|
JSONObject jsonResponse = JSONObject.parseObject(response);
|
||||||
|
if (!jsonResponse.containsKey("access_token")) {
|
||||||
|
throw new RuntimeException("Failed to retrieve access token: " + response);
|
||||||
|
}
|
||||||
|
return jsonResponse.getString("access_token");
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 生成 小程序码 跳转对应页面
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public String getFetchQrCode(Map<String, Object> params) throws Exception {
|
||||||
|
String url = aliOssUtil.upload(fetchQrCode(params), aliOssUtil.getPath("shopVip", "png"));
|
||||||
|
redisService.set(RedisCst.SHOP_VIP_CODE + params.get("shopId"), url);
|
||||||
|
return url;
|
||||||
|
}
|
||||||
|
|
||||||
|
//生成页面地址
|
||||||
|
private InputStream fetchQrCode(Map<String, Object> params) {
|
||||||
|
JsonObject jsonObject = new JsonObject();
|
||||||
|
//路径
|
||||||
|
jsonObject.addProperty("path", sysParamsService.getSysParamValue(SysParamCodeEnum.WX_MINI_VIP_URL.getCode()) + "?shopId=" + params.get("shopId"));
|
||||||
|
//是否需要透明底色,为 true 时,生成透明底色的小程序码
|
||||||
|
jsonObject.addProperty("is_hyaline", true);
|
||||||
|
//正式版为 release,体验版为 trial,开发版为 develop
|
||||||
|
if (params.containsKey("env_version")) {
|
||||||
|
jsonObject.addProperty("env_version", "trial");
|
||||||
|
}
|
||||||
|
String accessToken = getAccessToken();
|
||||||
|
String url = String.format("%s?access_token=%s", QR_CODE_URL, accessToken);
|
||||||
|
return HttpUtil.createPost(url)
|
||||||
|
.body(jsonObject.toString(), "application/json")
|
||||||
|
.execute()
|
||||||
|
.bodyStream();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public JSONObject getSession(String code) {
|
||||||
|
CzgResult<SysParamsDTO> wxMiniSecrete = sysParamsService.getParamsByCode("wx_mini_secrete");
|
||||||
|
CzgResult<SysParamsDTO> wxMiniAppId = sysParamsService.getParamsByCode("wx_mini_app_id");
|
||||||
|
String appId = wxMiniAppId.getData().getParamValue();
|
||||||
|
String secrete = wxMiniSecrete.getData().getParamValue();
|
||||||
|
String requestUrl = "https://api.weixin.qq.com/sns/jscode2session";
|
||||||
|
Map<String, Object> requestUrlParam = new HashMap<>();
|
||||||
|
// https://mp.weixin.qq.com/wxopen/devprofile?action=get_profile&token=164113089&lang=zh_CN
|
||||||
|
//小程序appId
|
||||||
|
requestUrlParam.put("appid", appId);
|
||||||
|
//小程序secret
|
||||||
|
requestUrlParam.put("secret", secrete);
|
||||||
|
//小程序端返回的code
|
||||||
|
requestUrlParam.put("js_code", code);
|
||||||
|
//默认参数
|
||||||
|
requestUrlParam.put("grant_type", "authorization_code");
|
||||||
|
//发送post请求读取调用微信接口获取openid用户唯一标识
|
||||||
|
String resp = HttpUtil.post(requestUrl, requestUrlParam);
|
||||||
|
JSONObject jsonObject = JSON.parseObject(resp);
|
||||||
|
log.info("微信获取openid响应报文:{}", resp);
|
||||||
|
return jsonObject;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getSessionKey(String code, String key) {
|
||||||
|
JSONObject session = getSession(code);
|
||||||
|
String info = session.getString(key);
|
||||||
|
if (StrUtil.isBlank(info)) {
|
||||||
|
throw new RuntimeException(key + "获取失败");
|
||||||
|
}
|
||||||
|
return info;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getSessionKeyOrOpenId(String code, boolean isAccount) {
|
||||||
|
return getSessionKey(code, "openid");
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String decrypt(String sessionKey, @NotBlank(message = "数据不能为空") String encryptedData, String iv) {
|
||||||
|
// Base64 解码
|
||||||
|
byte[] keyBytes = Base64.decode(sessionKey);
|
||||||
|
byte[] encryptedBytes = Base64.decode(encryptedData);
|
||||||
|
byte[] ivBytes = Base64.decode(iv);
|
||||||
|
|
||||||
|
// 使用 Hutool 进行 AES-CBC 解密
|
||||||
|
AES aes = new AES("CBC", "PKCS5Padding", keyBytes, ivBytes);
|
||||||
|
byte[] decryptedBytes = aes.decrypt(encryptedBytes);
|
||||||
|
|
||||||
|
return new String(decryptedBytes, java.nio.charset.StandardCharsets.UTF_8);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -17,4 +17,59 @@
|
|||||||
left join tb_call_table on tb_call_queue.call_table_id = tb_call_table.id
|
left join tb_call_table on tb_call_queue.call_table_id = tb_call_table.id
|
||||||
${qwSql}
|
${qwSql}
|
||||||
</select>
|
</select>
|
||||||
|
<select id="selectInfoByOpenId" resultType="com.czg.account.vo.CallQueueInfoVO">
|
||||||
|
SELECT
|
||||||
|
d.shop_name,
|
||||||
|
d.logo,
|
||||||
|
d.status AS shop_state,
|
||||||
|
a.call_num,
|
||||||
|
a.id, -- 用户的排队记录ID
|
||||||
|
a.state,
|
||||||
|
a.user_id, -- 用户ID
|
||||||
|
b.name AS table_name, -- 桌子名称
|
||||||
|
b.note AS table_note, -- 桌子备注
|
||||||
|
(
|
||||||
|
SELECT COUNT(1)
|
||||||
|
FROM tb_call_queue c
|
||||||
|
WHERE
|
||||||
|
c.call_table_id = a.call_table_id
|
||||||
|
and c.shop_id=a.shop_id -- 同一张桌子
|
||||||
|
AND c.create_time < a.create_time -- 在当前用户之前排队
|
||||||
|
AND c.state IN (0, 1) -- 排队中或等待中的人
|
||||||
|
AND c.create_day=#{today}
|
||||||
|
) AS waiting_count, -- 前面有几个人
|
||||||
|
(
|
||||||
|
SELECT COUNT(1) * b.wait_time
|
||||||
|
FROM tb_call_queue c
|
||||||
|
WHERE
|
||||||
|
c.call_table_id = a.call_table_id
|
||||||
|
AND c.shop_id=a.shop_id -- 同一张桌子
|
||||||
|
AND c.create_time < a.create_time -- 在当前用户之前排队
|
||||||
|
AND c.state IN (0, 1) -- 排队中或等待中的人
|
||||||
|
AND c.create_day=#{today}
|
||||||
|
) AS wait_time -- 预计等待时间
|
||||||
|
FROM
|
||||||
|
tb_call_queue a
|
||||||
|
LEFT JOIN
|
||||||
|
tb_shop_info d ON a.shop_id = d.id
|
||||||
|
LEFT JOIN
|
||||||
|
tb_call_table b ON a.call_table_id = b.id
|
||||||
|
WHERE
|
||||||
|
a.shop_id = #{shopId}
|
||||||
|
AND a.create_day = #{today} -- 替换为目标日期
|
||||||
|
|
||||||
|
<if test="queueId != null">
|
||||||
|
and a.id = #{queueId} and (a.open_id = #{openId} or a.open_id is null)
|
||||||
|
</if>
|
||||||
|
|
||||||
|
<if test="queueId == null">
|
||||||
|
and a.open_id = #{openId} -- 替换为目标用户的 open_id
|
||||||
|
</if>
|
||||||
|
|
||||||
|
and a.state in (0, 1)
|
||||||
|
GROUP BY
|
||||||
|
a.id, a.user_id, b.name, b.note, b.wait_time
|
||||||
|
ORDER BY
|
||||||
|
a.create_time asc
|
||||||
|
</select>
|
||||||
</mapper>
|
</mapper>
|
||||||
|
|||||||
@@ -20,5 +20,6 @@
|
|||||||
a.create_time <= #{endTime}
|
a.create_time <= #{endTime}
|
||||||
</if>
|
</if>
|
||||||
</where>
|
</where>
|
||||||
|
order by a.create_time desc
|
||||||
</select>
|
</select>
|
||||||
</mapper>
|
</mapper>
|
||||||
|
|||||||
@@ -41,7 +41,7 @@
|
|||||||
<select id="selectAssetsSummary" resultType="com.czg.account.dto.user.userinfo.UserInfoAssetsSummaryDTO">
|
<select id="selectAssetsSummary" resultType="com.czg.account.dto.user.userinfo.UserInfoAssetsSummaryDTO">
|
||||||
select sum(IFNULL(b.amount, 0)) as amount,
|
select sum(IFNULL(b.amount, 0)) as amount,
|
||||||
sum(IFNULL(b.account_points, 0)) as points,
|
sum(IFNULL(b.account_points, 0)) as points,
|
||||||
sum(IFNULL(c.id, 0)) as couponNum
|
count(c.id) as couponNum
|
||||||
from tb_user_info as a
|
from tb_user_info as a
|
||||||
left join tb_shop_user as b on a.id = b.user_id
|
left join tb_shop_user as b on a.id = b.user_id
|
||||||
left join tb_shop_activate_coupon_record as c
|
left join tb_shop_activate_coupon_record as c
|
||||||
@@ -50,11 +50,13 @@
|
|||||||
</select>
|
</select>
|
||||||
<select id="selectPageByKeyAndIsVip" resultType="com.czg.account.dto.shopuser.ShopUserDTO">
|
<select id="selectPageByKeyAndIsVip" resultType="com.czg.account.dto.shopuser.ShopUserDTO">
|
||||||
SELECT
|
SELECT
|
||||||
a.*, count(c.id) couponNum
|
a.*, count(c.id) couponNum, count(d.id) orderNumber, IFNULL(sum(f.amount), 0) rechargeAmount
|
||||||
FROM
|
FROM
|
||||||
tb_shop_user a
|
tb_shop_user a
|
||||||
LEFT JOIN tb_user_info b ON b.id = a.user_id
|
LEFT JOIN tb_user_info b ON b.id = a.user_id
|
||||||
left join tb_shop_activate_coupon_record c on c.shop_user_id=a.id and c.`status`=0
|
left join tb_shop_activate_coupon_record c on c.shop_user_id=a.id and c.`status`=0
|
||||||
|
left join tb_order_info as d on d.user_id=a.user_id and d.shop_id=a.shop_id
|
||||||
|
left join tb_shop_user_flow as f on f.user_id=a.user_id and f.shop_id=a.shop_id and f.biz_code in ('cashIn', 'wechatIn', 'alipayIn')
|
||||||
|
|
||||||
where a.shop_id=#{shopId}
|
where a.shop_id=#{shopId}
|
||||||
<if test="isVip != null">
|
<if test="isVip != null">
|
||||||
|
|||||||
@@ -4,4 +4,25 @@
|
|||||||
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
||||||
<mapper namespace="com.czg.service.account.mapper.SysUserMapper">
|
<mapper namespace="com.czg.service.account.mapper.SysUserMapper">
|
||||||
|
|
||||||
|
<select id="page" resultType="com.czg.account.vo.SysUserDetailVO">
|
||||||
|
select a.*, b.role_id from sys_user as a
|
||||||
|
left join sys_users_roles as b on a.id=b.user_id
|
||||||
|
<where>
|
||||||
|
<if test="key != null and key != ''">
|
||||||
|
and (a.nick_name like concat('%', #{key}, '%') or a.account like concat('%', #{key}, '%'))
|
||||||
|
</if>
|
||||||
|
<if test="startTime != null and startTime != ''">
|
||||||
|
and a.create_time >= #{startTime}
|
||||||
|
</if>
|
||||||
|
|
||||||
|
<if test="endTime != null and endTime != ''">
|
||||||
|
and a.create_time <= #{endTime}
|
||||||
|
</if>
|
||||||
|
|
||||||
|
<if test="status != null">
|
||||||
|
and a.status=#{status}
|
||||||
|
</if>
|
||||||
|
</where>
|
||||||
|
order by a.create_time desc
|
||||||
|
</select>
|
||||||
</mapper>
|
</mapper>
|
||||||
|
|||||||
@@ -162,7 +162,7 @@ public interface PrinterImpl {
|
|||||||
StringBuilder builder = new StringBuilder()
|
StringBuilder builder = new StringBuilder()
|
||||||
.append(getFormatLabel(handoverRecord.getShopName(), signLabelInfo.center, signLabelInfo.f)).append(signLabelInfo.br)
|
.append(getFormatLabel(handoverRecord.getShopName(), signLabelInfo.center, signLabelInfo.f)).append(signLabelInfo.br)
|
||||||
.append(getFormatLabel("交班小票", signLabelInfo.l,signLabelInfo.center)).append(signLabelInfo.br)
|
.append(getFormatLabel("交班小票", signLabelInfo.l,signLabelInfo.center)).append(signLabelInfo.br)
|
||||||
.append("交班时间: ").append(handoverRecord.getHandoverTime()).append(signLabelInfo.br)
|
.append("交班时间: ").append(DateUtil.format(handoverRecord.getHandoverTime(), "yyyy-MM-dd HH:mm:ss")).append(signLabelInfo.br)
|
||||||
.append("收银员: ").append(handoverRecord.getStaffName()).append(signLabelInfo.br)
|
.append("收银员: ").append(handoverRecord.getStaffName()).append(signLabelInfo.br)
|
||||||
.append("当班总收入: ").append(handoverRecord.getHandAmount()).append(signLabelInfo.br)
|
.append("当班总收入: ").append(handoverRecord.getHandAmount()).append(signLabelInfo.br)
|
||||||
.append("现金收入: ").append(handoverRecord.getCashAmount()).append(signLabelInfo.br)
|
.append("现金收入: ").append(handoverRecord.getCashAmount()).append(signLabelInfo.br)
|
||||||
@@ -303,7 +303,7 @@ public interface PrinterImpl {
|
|||||||
data.append(getFormatLabel(StrUtil.format("原价:{}", toPlainStr(printInfoDTO.getOriginalAmount())), signLabelInfo.s))
|
data.append(getFormatLabel(StrUtil.format("原价:{}", toPlainStr(printInfoDTO.getOriginalAmount())), signLabelInfo.s))
|
||||||
.append(signLabelInfo.br);
|
.append(signLabelInfo.br);
|
||||||
// data.append(StrUtil.format("<S>原价:{}</S><BR>", toPlainStr(printInfoDTO.getOriginalAmount())));
|
// data.append(StrUtil.format("<S>原价:{}</S><BR>", toPlainStr(printInfoDTO.getOriginalAmount())));
|
||||||
data.append(getFormatLabel(StrUtil.format("折扣:-{}", toPlainStr(printInfoDTO.getDiscountAmount())), signLabelInfo.s))
|
data.append(getFormatLabel(StrUtil.format("优惠:-{}", toPlainStr(printInfoDTO.getDiscountAmount())), signLabelInfo.s))
|
||||||
.append(signLabelInfo.br);
|
.append(signLabelInfo.br);
|
||||||
// data.append(StrUtil.format("<S>折扣:-{}</S><BR>", toPlainStr(printInfoDTO.getDiscountAmount())));
|
// data.append(StrUtil.format("<S>折扣:-{}</S><BR>", toPlainStr(printInfoDTO.getDiscountAmount())));
|
||||||
}
|
}
|
||||||
@@ -330,12 +330,13 @@ public interface PrinterImpl {
|
|||||||
data.append(getFormatLabel(StrUtil.format("积分:{}", printInfoDTO.getIntegral()), signLabelInfo.s))
|
data.append(getFormatLabel(StrUtil.format("积分:{}", printInfoDTO.getIntegral()), signLabelInfo.s))
|
||||||
.append(signLabelInfo.br);
|
.append(signLabelInfo.br);
|
||||||
// data.append(StrUtil.format("<S>积分:{}</S><BR>", printInfoDTO.getIntegral()));
|
// data.append(StrUtil.format("<S>积分:{}</S><BR>", printInfoDTO.getIntegral()));
|
||||||
}
|
data.append(getFormatLabel(StrUtil.format("余额:{}", toPlainStr(printInfoDTO.getBalance())), signLabelInfo.s))
|
||||||
data.append(getFormatLabel(StrUtil.format("余额:{}", toPlainStr(printInfoDTO.getBalance())), signLabelInfo.s))
|
.append(signLabelInfo.br);
|
||||||
.append(signLabelInfo.br);
|
|
||||||
// data.append(StrUtil.format("<S>余额:{}</S><BR>", toPlainStr(printInfoDTO.getBalance())));
|
// data.append(StrUtil.format("<S>余额:{}</S><BR>", toPlainStr(printInfoDTO.getBalance())));
|
||||||
data.append(getFormatLabel("--------------------------------", signLabelInfo.s))
|
data.append(getFormatLabel("--------------------------------", signLabelInfo.s))
|
||||||
.append(signLabelInfo.br);
|
.append(signLabelInfo.br);
|
||||||
|
}
|
||||||
|
|
||||||
// data.append("<S>--------------------------------</S><BR>");
|
// data.append("<S>--------------------------------</S><BR>");
|
||||||
if (StrUtil.isNotBlank(printInfoDTO.getRemark())) {
|
if (StrUtil.isNotBlank(printInfoDTO.getRemark())) {
|
||||||
data.append(getFormatLabel(StrUtil.format("备注:{}", printInfoDTO.getRemark()), signLabelInfo.l, signLabelInfo.bold))
|
data.append(getFormatLabel(StrUtil.format("备注:{}", printInfoDTO.getRemark()), signLabelInfo.l, signLabelInfo.bold))
|
||||||
|
|||||||
@@ -319,8 +319,8 @@ public class OrderInfoServiceImpl extends ServiceImpl<OrderInfoMapper, OrderInfo
|
|||||||
BigDecimalDTO packAmount = new BigDecimalDTO(BigDecimal.ZERO);
|
BigDecimalDTO packAmount = new BigDecimalDTO(BigDecimal.ZERO);
|
||||||
processOrderDetails2(orderDetails, prodCouponMap, prodCouponAmount, totalAmount, packAmount, param.isAllPack(), param.getUserAllPack(), param.isVipPrice());
|
processOrderDetails2(orderDetails, prodCouponMap, prodCouponAmount, totalAmount, packAmount, param.isAllPack(), param.getUserAllPack(), param.isVipPrice());
|
||||||
//总商品支付金额 不包含打包费 用来计算后续
|
//总商品支付金额 不包含打包费 用来计算后续
|
||||||
log.info("支付前置,商品金额{} 商品优惠券金额{} 总金额{}", totalAmount, prodCouponAmount, totalAmount.getPrice().add(orderInfo.getPackFee()));
|
|
||||||
if (prodCouponAmount.getPrice().compareTo(param.getProductCouponDiscountAmount()) != 0) {
|
if (prodCouponAmount.getPrice().compareTo(param.getProductCouponDiscountAmount()) != 0) {
|
||||||
|
log.info("支付计算金额不正确:商品券抵扣金额为:{},传递为:{}", prodCouponAmount.getPrice(), param.getProductCouponDiscountAmount());
|
||||||
throw new ValidateException("生成支付订单失败,商品优惠券优惠金额不正确");
|
throw new ValidateException("生成支付订单失败,商品优惠券优惠金额不正确");
|
||||||
}
|
}
|
||||||
orderInfo.setOriginAmount(totalAmount.getPrice().add(packAmount.getPrice()).add(orderInfo.getSeatAmount()));
|
orderInfo.setOriginAmount(totalAmount.getPrice().add(packAmount.getPrice()).add(orderInfo.getSeatAmount()));
|
||||||
@@ -352,16 +352,15 @@ public class OrderInfoServiceImpl extends ServiceImpl<OrderInfoMapper, OrderInfo
|
|||||||
// throw new ValidateException("生成支付订单失败,积分抵扣金额不正确");
|
// throw new ValidateException("生成支付订单失败,积分抵扣金额不正确");
|
||||||
// }
|
// }
|
||||||
// }
|
// }
|
||||||
log.info("支付前置2,订单金额{} ", newTotalAmount);
|
|
||||||
newTotalAmount = newTotalAmount.subtract(param.getPointsDiscountAmount());
|
newTotalAmount = newTotalAmount.subtract(param.getPointsDiscountAmount());
|
||||||
log.info("支付前置3,订单金额{} ", newTotalAmount);
|
|
||||||
//抹零
|
//抹零
|
||||||
newTotalAmount = newTotalAmount.subtract(param.getRoundAmount());
|
newTotalAmount = newTotalAmount.subtract(param.getRoundAmount());
|
||||||
log.info("支付前置4,订单金额{} ", newTotalAmount);
|
|
||||||
//校验最终金额(订单金额 (扣除各类折扣)+打包费 餐位费)
|
//校验最终金额(订单金额 (扣除各类折扣)+打包费 餐位费)
|
||||||
newTotalAmount = newTotalAmount.add(packAmount.getPrice()).add(orderInfo.getSeatAmount());
|
newTotalAmount = newTotalAmount.add(packAmount.getPrice()).add(orderInfo.getSeatAmount());
|
||||||
log.info("支付前置5,订单金额{} ", newTotalAmount);
|
|
||||||
if (newTotalAmount.compareTo(param.getOrderAmount()) != 0) {
|
if (newTotalAmount.compareTo(param.getOrderAmount()) != 0) {
|
||||||
|
log.info("支付计算金额不正确,订单Id:{},最终计算金额为:{},打包费:{},餐位费:{},商品券金额:{},满减券金额:{},积分抵扣金额:{},抹零金额:{}",
|
||||||
|
orderInfo.getId(), newTotalAmount, packAmount.getPrice(), orderInfo.getSeatAmount(), param.getProductCouponDiscountAmount(),
|
||||||
|
discountAmount.getPrice(), param.getPointsDiscountAmount(), param.getRoundAmount());
|
||||||
throw new ValidateException("生成支付订单失败,订单金额不正确");
|
throw new ValidateException("生成支付订单失败,订单金额不正确");
|
||||||
}
|
}
|
||||||
orderInfo.setPackFee(packAmount.getPrice());
|
orderInfo.setPackFee(packAmount.getPrice());
|
||||||
|
|||||||
@@ -44,7 +44,6 @@ import com.czg.utils.AssertUtil;
|
|||||||
import com.czg.utils.MD5Util;
|
import com.czg.utils.MD5Util;
|
||||||
import com.mybatisflex.core.query.QueryWrapper;
|
import com.mybatisflex.core.query.QueryWrapper;
|
||||||
import com.mybatisflex.core.update.UpdateChain;
|
import com.mybatisflex.core.update.UpdateChain;
|
||||||
import io.seata.spring.annotation.GlobalTransactional;
|
|
||||||
import jakarta.annotation.Resource;
|
import jakarta.annotation.Resource;
|
||||||
import jakarta.validation.constraints.NotBlank;
|
import jakarta.validation.constraints.NotBlank;
|
||||||
import lombok.NonNull;
|
import lombok.NonNull;
|
||||||
@@ -87,6 +86,8 @@ public class PayServiceImpl implements PayService {
|
|||||||
private ShopCouponService couponService;
|
private ShopCouponService couponService;
|
||||||
@DubboReference
|
@DubboReference
|
||||||
private MemberPointsService pointsService;
|
private MemberPointsService pointsService;
|
||||||
|
@DubboReference
|
||||||
|
private FreeDineConfigService freeConfigService;
|
||||||
@Resource
|
@Resource
|
||||||
private CzgPayService czgPayService;
|
private CzgPayService czgPayService;
|
||||||
@Resource
|
@Resource
|
||||||
@@ -147,6 +148,11 @@ public class PayServiceImpl implements PayService {
|
|||||||
throw new ValidateException("充值金额不正确");
|
throw new ValidateException("充值金额不正确");
|
||||||
}
|
}
|
||||||
if (payParam.getOrderId() != null) {
|
if (payParam.getOrderId() != null) {
|
||||||
|
FreeDineConfig freeConfig = freeConfigService.getById(payParam.getShopId());
|
||||||
|
AssertUtil.isNull(freeConfig, "该店铺未启用霸王餐");
|
||||||
|
if (!freeConfig.getEnable()) {
|
||||||
|
throw new CzgException("该店铺未启用霸王餐");
|
||||||
|
}
|
||||||
OrderInfo orderInfo = orderInfoService.getById(payParam.getOrderId());
|
OrderInfo orderInfo = orderInfoService.getById(payParam.getOrderId());
|
||||||
AssertUtil.isNull(orderInfo, "订单不存在");
|
AssertUtil.isNull(orderInfo, "订单不存在");
|
||||||
//获取商品信息 计算金额 需要传入优惠券 减去优惠券
|
//获取商品信息 计算金额 需要传入优惠券 减去优惠券
|
||||||
@@ -156,7 +162,12 @@ public class PayServiceImpl implements PayService {
|
|||||||
//最终打包费
|
//最终打包费
|
||||||
BigDecimalDTO packAmount = new BigDecimalDTO(BigDecimal.ZERO);
|
BigDecimalDTO packAmount = new BigDecimalDTO(BigDecimal.ZERO);
|
||||||
orderInfoService.processOrderDetails2(orderDetails, null, null, totalAmount, packAmount, payParam.isAllPack(), null, true);
|
orderInfoService.processOrderDetails2(orderDetails, null, null, totalAmount, packAmount, payParam.isAllPack(), null, true);
|
||||||
BigDecimal payAmount = (totalAmount.getPrice().add(packAmount.getPrice())).multiply(BigDecimal.TWO);
|
BigDecimal total = totalAmount.getPrice().add(packAmount.getPrice());
|
||||||
|
if (total.compareTo(freeConfig.getRechargeThreshold()) < 0) {
|
||||||
|
throw new CzgException("霸王餐满" + freeConfig.getRechargeThreshold() + "可用,当前订单金额为" + total);
|
||||||
|
}
|
||||||
|
BigDecimal payAmount = (totalAmount.getPrice().add(packAmount.getPrice())).multiply(new BigDecimal(freeConfig.getMultiple()));
|
||||||
|
log.info("霸王餐应支付金额:{},充值金额为:{}", payAmount, payParam.getAmount());
|
||||||
if (payAmount.compareTo(payParam.getAmount()) != 0) {
|
if (payAmount.compareTo(payParam.getAmount()) != 0) {
|
||||||
throw new ValidateException("霸王餐支付金额不正确");
|
throw new ValidateException("霸王餐支付金额不正确");
|
||||||
}
|
}
|
||||||
@@ -341,7 +352,6 @@ public class PayServiceImpl implements PayService {
|
|||||||
@Override
|
@Override
|
||||||
@Transactional
|
@Transactional
|
||||||
public CzgResult<Object> cashPayVip(VipPayParamDTO payParam) {
|
public CzgResult<Object> cashPayVip(VipPayParamDTO payParam) {
|
||||||
boolean isFree = checkPayVip(payParam);
|
|
||||||
ShopUser shopUser = shopUserService.getById(payParam.getShopUserId());
|
ShopUser shopUser = shopUserService.getById(payParam.getShopUserId());
|
||||||
AssertUtil.isNull(shopUser, "充值失败 该店铺用户不存在");
|
AssertUtil.isNull(shopUser, "充值失败 该店铺用户不存在");
|
||||||
ShopInfo shopInfo = shopInfoService.getById(payParam.getShopId());
|
ShopInfo shopInfo = shopInfoService.getById(payParam.getShopId());
|
||||||
@@ -360,11 +370,6 @@ public class PayServiceImpl implements PayService {
|
|||||||
updateInfo.setJoinTime(LocalDateTime.now());
|
updateInfo.setJoinTime(LocalDateTime.now());
|
||||||
updateInfo.setId(payParam.getShopUserId());
|
updateInfo.setId(payParam.getShopUserId());
|
||||||
shopUserService.updateById(updateInfo);
|
shopUserService.updateById(updateInfo);
|
||||||
// UpdateChain.of(ShopUser.class)
|
|
||||||
// .set(ShopUser::getIsVip, 1)
|
|
||||||
// .set(ShopUser::getJoinTime, LocalDateTime.now())
|
|
||||||
// .eq(ShopUser::getId, payParam.getShopUserId())
|
|
||||||
// .update();
|
|
||||||
}
|
}
|
||||||
ShopUserMoneyEditDTO shopUserMoneyEditDTO = new ShopUserMoneyEditDTO()
|
ShopUserMoneyEditDTO shopUserMoneyEditDTO = new ShopUserMoneyEditDTO()
|
||||||
.setId(shopUser.getId())
|
.setId(shopUser.getId())
|
||||||
@@ -372,20 +377,10 @@ public class PayServiceImpl implements PayService {
|
|||||||
.setType(1)
|
.setType(1)
|
||||||
.setRemark("现金充值")
|
.setRemark("现金充值")
|
||||||
.setBizEnum(ShopUserFlowBizEnum.CASH_IN);
|
.setBizEnum(ShopUserFlowBizEnum.CASH_IN);
|
||||||
if (isFree) {
|
|
||||||
shopUserMoneyEditDTO.setBizEnum(ShopUserFlowBizEnum.FREE_IN);
|
|
||||||
UpdateChain.of(OrderInfo.class).eq(OrderInfo::getId, payParam.getOrderId())
|
|
||||||
.set(OrderInfo::getStatus, OrderStatusEnums.DONE.getCode())
|
|
||||||
.set(OrderInfo::getIsFreeDine, 1)
|
|
||||||
.set(OrderInfo::getPayAmount, 0)
|
|
||||||
.update();
|
|
||||||
}
|
|
||||||
//更新会员余额 并生成流水
|
//更新会员余额 并生成流水
|
||||||
Long flowId = shopUserService.updateMoney(shopUser.getShopId(), shopUserMoneyEditDTO);
|
Long flowId = shopUserService.updateMoney(shopUser.getShopId(), shopUserMoneyEditDTO);
|
||||||
if (!isFree) {
|
//会员活动
|
||||||
//会员活动
|
shopActivateService.giveActivate(shopUser, payParam.getAmount(), payParam.getActivateId(), flowId);
|
||||||
shopActivateService.giveActivate(shopUser, payParam.getAmount(), payParam.getActivateId(), flowId);
|
|
||||||
}
|
|
||||||
return CzgResult.success();
|
return CzgResult.success();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -557,8 +552,7 @@ public class PayServiceImpl implements PayService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@GlobalTransactional
|
@Transactional
|
||||||
// @Transactional
|
|
||||||
public CzgResult<Object> refundOrderBefore(OrderInfoRefundDTO param) {
|
public CzgResult<Object> refundOrderBefore(OrderInfoRefundDTO param) {
|
||||||
OrderInfo orderInfo = orderInfoService.getById(param.getOrderId());
|
OrderInfo orderInfo = orderInfoService.getById(param.getOrderId());
|
||||||
ShopInfo shopInfo = shopInfoService.getById(orderInfo.getShopId());
|
ShopInfo shopInfo = shopInfoService.getById(orderInfo.getShopId());
|
||||||
@@ -569,7 +563,7 @@ public class PayServiceImpl implements PayService {
|
|||||||
isPay = false;
|
isPay = false;
|
||||||
refPayOrderNo = "";
|
refPayOrderNo = "";
|
||||||
}
|
}
|
||||||
if(isPay){
|
if (isPay) {
|
||||||
if (shopInfo.getIsReturnPwd().equals(1)) {
|
if (shopInfo.getIsReturnPwd().equals(1)) {
|
||||||
AssertUtil.isBlank(shopInfo.getOperationPwd(), "请设置操作密码后使用");
|
AssertUtil.isBlank(shopInfo.getOperationPwd(), "请设置操作密码后使用");
|
||||||
if (!SecureUtil.md5(param.getPwd()).equals(shopInfo.getOperationPwd())) {
|
if (!SecureUtil.md5(param.getPwd()).equals(shopInfo.getOperationPwd())) {
|
||||||
|
|||||||
@@ -78,8 +78,8 @@
|
|||||||
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
|
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.alibaba.cloud</groupId>
|
<groupId>io.seata</groupId>
|
||||||
<artifactId>spring-cloud-starter-alibaba-seata</artifactId>
|
<artifactId>seata-spring-boot-starter</artifactId>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
|
|||||||
Reference in New Issue
Block a user