添加计粉代码

master
bynt 6 months ago
parent e269fa19ec
commit ba821a8372

@ -142,6 +142,11 @@
<artifactId>common-idempotent</artifactId>
</dependency>
<dependency>
<groupId>com.alipay.sdk</groupId>
<artifactId>alipay-easysdk</artifactId>
</dependency>
</dependencies>

@ -0,0 +1,26 @@
package com.baiye.constant;
/**
*
*
* @author Enzo
* @date : 2021/6/16
*/
public class PayConstants {
private PayConstants() {
}
/**
*
*/
public static final String PAY_TITLE = "回跟营销系统支付订单:";
/**
* key
*/
public static final String OUT_TRADE_NO = "out_trade_no";
}

@ -0,0 +1,100 @@
package com.baiye.constant;
/**
* @author Enzo
* @date 2024-3-27
*/
public interface WeChatRequestConstants {
/**
*
*/
String GET_QR_CODE = "/api/qrCodeLogin/";
/**
*
*/
String GLOBAL_SETTING = "/api/global-settings/";
/**
*
*/
String GET_PUSH_LOGIN = "/api/pushLogin/";
/**
*
*/
String CREATE_EQUIPMENT= "/api/addToScanRobotInfo/";
/**
* 退
*/
String WE_CHAT_LOGOUT = "/wechat/v1/batchLogout";
/**
*
*/
String WE_CHAT_SEND_TXT = "/wechat/v1/sendtext";
/**
*
*/
String WE_CHAT_SEND_PICTURE = "/wechat/v1/sendurlpic";
/**
* gif
*/
String WE_CHAT_SEND_GIF = "/wechat/v1/sendGif";
/**
*
*/
String WE_CHAT_SEND_VIDEO = "/wechat/v1/sendCdnVideoMsg";
/**
*
*/
String WE_CHAT_FRIEND_INFORMATION = "/wechat/v1/friendinfo";
/**
*
*/
String WE_CHAT_GET_CONTACT = "/wechat/v1/getAllContact";
/**
*
*/
String WE_CHAT_SYNC_CONTACT = "/wechat/v1/syncContact";
/**
*
*/
String WE_CHAT_ADD_FRIEND = "/wechat/v1/addfriends";
/**
* 线
*/
String WE_CHAT_STATUS = "/wechat/v1/wecatstatus";
/**
*
*/
String WE_SEND_TEXT = "/wechat/v1/sendtext";
/**
*
*/
String WE_SEND_PIC = "/wechat/v1/sendurlpic";
/**
* gif
*/
String WE_SEND_GIF = "/wechat/v1/sendGif";
}

@ -0,0 +1,57 @@
package com.baiye.modules.distribute.controller;
import com.baiye.modules.distribute.dto.AliPayPcDTO;
import com.baiye.modules.distribute.entity.PayOrder;
import com.baiye.modules.distribute.service.AliPayService;
import com.baiye.result.R;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest;
import java.util.Map;
/**
* @author Enzo
*/
@Tag(name = "支付宝支付")
@Slf4j
@RestController
@RequestMapping(value = "/pay/aliPay")
@AllArgsConstructor
public class AliPayController {
private final AliPayService aliPayService;
@Operation(summary = "创建pc订单")
@PostMapping(value = "/pcPay")
public R<Map<String, Object>> pcPay(@Validated @RequestBody AliPayPcDTO aliPayPcDTO) {
return R.ok(aliPayService.aliPayPc(aliPayPcDTO));
}
@Operation(summary = "订单号查找")
@GetMapping(value = "/find/order")
public R<PayOrder> frontRcvResponse(@RequestParam("orderNo") String orderNo) {
return R.ok(aliPayService.findOrderByNo(orderNo));
}
/**
* pc
*
* @param request request
* @return
*/
@Operation(summary = "订单回调")
@RequestMapping(value = "/pay-notify", produces = "text/html;charset=utf-8")
public String frontRcvResponse(HttpServletRequest request) {
return aliPayService.pcNotifyResponse(request);
}
}

@ -0,0 +1,45 @@
package com.baiye.modules.distribute.controller;
import com.baiye.domain.PageParam;
import com.baiye.domain.PageResult;
import com.baiye.modules.distribute.qo.AccountQo;
import com.baiye.modules.distribute.qo.PayOrderQo;
import com.baiye.modules.distribute.service.LoginEquipmentService;
import com.baiye.modules.distribute.vo.AddFriendVo;
import com.baiye.modules.distribute.vo.PayOrderVO;
import com.baiye.modules.distribute.vo.WeChatAccountVO;
import com.baiye.result.R;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @author Enzo
* @date : 2024/4/1
*/
@Tag(name = "微信设备")
@Slf4j
@RestController
@RequestMapping(value = "/equipment")
@AllArgsConstructor
public class LoginEquipmentController {
private LoginEquipmentService loginEquipmentService;
@GetMapping("/page")
@Operation(summary = "分页查询记录")
public R<PageResult<WeChatAccountVO>> getClueRecordPage(@Validated PageParam pageParam, AccountQo qo) {
return R.ok(loginEquipmentService.queryPage(pageParam, qo));
}
}

@ -0,0 +1,36 @@
package com.baiye.modules.distribute.controller;
import com.baiye.domain.PageParam;
import com.baiye.domain.PageResult;
import com.baiye.modules.distribute.qo.PayOrderQo;
import com.baiye.modules.distribute.service.PayOrderService;
import com.baiye.modules.distribute.vo.PayOrderVO;
import com.baiye.result.R;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @author Enzo
* @date
*/
@RequiredArgsConstructor
@RestController
@Tag(name = "订单记录")
@RequestMapping("/pay/order")
public class PayOrderController {
private final PayOrderService payOrderService;
@GetMapping("/page")
@Operation(summary = "分页查询记录")
public R<PageResult<PayOrderVO>> getClueRecordPage(@Validated PageParam pageParam, PayOrderQo qo) {
return R.ok(payOrderService.queryPage(pageParam, qo));
}
}

@ -0,0 +1,83 @@
package com.baiye.modules.distribute.controller;
import com.baiye.domain.PageParam;
import com.baiye.domain.PageResult;
import com.baiye.modules.distribute.dto.CreateCodeDTO;
import com.baiye.modules.distribute.dto.PushCodeDTO;
import com.baiye.modules.distribute.dto.WeChatAddFriendDTO;
import com.baiye.modules.distribute.qo.AccountQo;
import com.baiye.modules.distribute.service.WeChatService;
import com.baiye.modules.distribute.vo.AddFriendVo;
import com.baiye.modules.distribute.vo.WeChatAccountVO;
import com.baiye.result.R;
import com.baiye.security.util.SecurityUtils;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
/**
* @author Enzo
* @date : 2024/3/27
*/
@RestController
@Tag(name = "微信账号")
@RequiredArgsConstructor
@RequestMapping("/wechat")
public class WeChatController {
private final WeChatService weChatService;
@GetMapping("/page")
@Operation(summary = "分页查询账号")
public R<PageResult<WeChatAccountVO>> getClueRecordPage(@Validated PageParam pageParam, AccountQo qo) {
return R.ok(weChatService.queryPage(pageParam, qo));
}
@GetMapping("/global/setting")
@Operation(summary = "全局设置")
public R<String> getClueRecordPage(String callbackUrl) {
return R.ok(weChatService.globalSetting(callbackUrl));
}
@PostMapping("/createCode")
@Operation(description = "创建二维码")
public R<Object> createCode(@RequestBody CreateCodeDTO createCodeDTO) {
return R.ok(weChatService.createQrCode(createCodeDTO));
}
@Operation(description = "弹窗登录接口")
@PostMapping("/push/code")
public R<Object> pushCode(@Validated @RequestBody PushCodeDTO pushCodeDTO) {
return R.ok(weChatService.pushCode(pushCodeDTO));
}
@Operation(description = "添加好友")
@PostMapping("/addFriend")
public R<Object> addFriend(@Validated @RequestBody WeChatAddFriendDTO weChatFriendDTO) {
return R.ok(weChatService.addFriend(weChatFriendDTO));
}
@GetMapping("/create/equipment")
@Operation(summary = "创建设备")
public R<String> createEquipment(Integer num,Integer packageType) {
return Boolean.TRUE.equals(weChatService.createEquipment(num, packageType, SecurityUtils.getCurrentUserId())) ? R.ok() : R.failed("创建设备失败");
}
@GetMapping("/friend/page")
@Operation(summary = "添加好友记录")
public R<PageResult<AddFriendVo>> getData(@Validated PageParam pageParam, AccountQo qo) {
return R.ok(weChatService.queryDateData(pageParam, qo));
}
}

@ -0,0 +1,36 @@
package com.baiye.modules.distribute.controller;
import cn.hutool.json.JSONUtil;
import com.baiye.modules.distribute.service.WechatCallbackService;
import com.baiye.result.R;
import com.baiye.result.WeChatResponse;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @author Enzo
* @date 2022-8-11
*/
@Slf4j
@RestController
@RequestMapping("/api/wechat")
@RequiredArgsConstructor
public class WechatCallbackController {
private final WechatCallbackService wechatCallbackService;
/**
*
*/
@PostMapping("/callback")
public R<String> wechatCallback(@RequestBody WeChatResponse weChatResponse) {
log.info("================== the response {} ==================", JSONUtil.toJsonStr(weChatResponse));
wechatCallbackService.analyticalData(weChatResponse);
return R.ok();
}
}

@ -0,0 +1,23 @@
package com.baiye.modules.distribute.converter;
import com.baiye.modules.distribute.entity.PayOrder;
import com.baiye.modules.distribute.vo.PayOrderVO;
import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;
/**
* @author Enzo
* @date : 2024/3/28
*/
@Mapper
public interface PayOrderConverter {
PayOrderConverter INSTANCE = Mappers.getMapper(PayOrderConverter.class);
/**
* vo
* @param payOrder
* @return
*/
PayOrderVO entityToVo(PayOrder payOrder);
}

@ -0,0 +1,23 @@
package com.baiye.modules.distribute.converter;
import com.baiye.modules.distribute.entity.WeChatAccount;
import com.baiye.modules.distribute.vo.WeChatAccountVO;
import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;
/**
* @author Enzo
* @date : 2024/3/29
*/
@Mapper
public interface WeChatAccountConverter {
WeChatAccountConverter INSTANCE = Mappers.getMapper(WeChatAccountConverter.class);
/**
* vo
* @param weChatAccount
* @return
*/
WeChatAccountVO entityToVo(WeChatAccount weChatAccount);
}

@ -0,0 +1,34 @@
package com.baiye.modules.distribute.dto;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotNull;
import java.io.Serializable;
/**
* @author Enzo
* @date : 2022/3/16
*/
@Data
@NoArgsConstructor
public class AliPayPcDTO implements Serializable {
private static final long serialVersionUID = 6500373305956248683L;
@NotNull(message = "套餐类型不能为空")
private Integer packageType;
@NotNull(message = "数量不能为空")
@Min(value = 1,message = "最小为1")
private Integer num;
@NotNull(message = "续费类型不能为空")
private Boolean isRenew;
private Integer robotId;
private String remark;
}

@ -0,0 +1,21 @@
package com.baiye.modules.distribute.dto;
import lombok.Data;
/**
* @author Enzo
* @date : 2024/3/27
*/
@Data
public class CreateCodeDTO {
private String robotId;
private String wxId;
private String cityInfo;
private String changedUid;
private String robotVersion;
}

@ -0,0 +1,33 @@
package com.baiye.modules.distribute.dto;
import lombok.*;
import java.util.List;
/**
* @author Enzo
* @date : 2024/4/1
*/
@Data
public class EquipmentDTO {
private Integer status;
private List<RoBotDTO> data;
/**
*
*/
@AllArgsConstructor
@NoArgsConstructor
@ToString
@Getter
@Setter
public static class RoBotDTO {
private String robotAccount;
private Integer robotId;
}
}

@ -0,0 +1,18 @@
package com.baiye.modules.distribute.dto;
import lombok.Data;
/**
* @author Enzo
* @date : 2024/3/27
*/
@Data
public class PushCodeDTO {
private String robotId;
private String wxId;
private String cityInfo;
}

@ -0,0 +1,32 @@
package com.baiye.modules.distribute.dto;
import lombok.Data;
import lombok.NonNull;
/**
* @author Enzo
* @date : 2022/6/27
*/
@Data
public class WeChatAddFriendDTO {
@NonNull
private String wechat;
@NonNull
private Integer type;
@NonNull
private String tagetWxId;
@NonNull
private String helloContent;
@NonNull
private String appKey;
@NonNull
private String appSecret;
}

@ -0,0 +1,42 @@
package com.baiye.modules.distribute.dto;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
/**
* @author Enzo
* @date : 2022/6/27
*/
@Data
public class WeChatFriendDTO {
@Schema(title = "机器人微信ID")
private String robotWxId;
@Schema(title = "添加好友方式")
private Integer addFriendType;
@Schema(title = "省")
private String province;
@Schema(title = "城市")
private String city;
@Schema(title = "昵称")
private String nickName;
@Schema(title = "性别")
private Integer sex;
@Schema(title = "通过时间")
private Long addAcceptTime;
@Schema(title = "微信ID")
private String alias;
@Schema(title = "头像")
private String bigHeadImgUrl;
}

@ -0,0 +1,24 @@
package com.baiye.modules.distribute.dto;
import lombok.Data;
import java.io.Serializable;
/**
* @author Enzo
* @date : 2022/6/30
*/
@Data
public class WeChatUserLoginDTO implements Serializable {
private String pit;
private String wxId;
private String nickname;
private String bigHeadImgUrl;
}

@ -0,0 +1,47 @@
package com.baiye.modules.distribute.entity;
import com.baiye.entity.BaseEntity;
import com.baiye.extend.mybatis.plus.alias.TableAlias;
import com.baiye.validation.group.UpdateGroup;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Getter;
import lombok.Setter;
import javax.validation.constraints.NotNull;
import java.util.Date;
/**
* @author Enzo
* @date : 2024/4/1
*/
@Getter
@Setter
@TableAlias("le")
@TableName(value = "tb_login_equipment")
public class LoginEquipment extends BaseEntity {
@TableId(type = IdType.AUTO)
@Schema(title = "id")
@NotNull(message = "id", groups = {UpdateGroup.class})
private Long id;
@Schema(name = "user_id")
private Long userId;
@Schema(name = "pit")
private String pit;
@Schema(name = "robot_id")
private Integer robotId;
@Schema(name = "device_number")
private String deviceNumber;
@Schema(name = "expiration_time")
private Date expirationTime;
}

@ -0,0 +1,72 @@
package com.baiye.modules.distribute.entity;
import cn.hutool.core.date.DatePattern;
import com.baiye.entity.BaseEntity;
import com.baiye.extend.mybatis.plus.alias.TableAlias;
import com.baiye.validation.group.UpdateGroup;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Getter;
import lombok.Setter;
import javax.validation.constraints.NotNull;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
/**
* @author Enzo
* @date 2021-10-28
*/
@Getter
@Setter
@TableAlias("po")
@TableName(value = "tb_pay_order")
public class PayOrder extends BaseEntity implements Serializable {
private static final long serialVersionUID = 2056458673691527927L;
@TableId(type = IdType.AUTO)
@Schema(title = "id")
@NotNull(message = "id", groups = {UpdateGroup.class})
private Long id;
@Schema(name = "pay_type")
private Integer payType;
@Schema(name = "order_no")
private String orderNo;
@Schema(name = "status")
private Integer status;
@Schema(name = "num")
private Integer num;
@Schema(name = "purchaser")
private String purchaser;
@Schema(name = "pay_time")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = DatePattern.NORM_DATETIME_PATTERN, timezone = "GMT+8")
private Date payTime;
@Schema(name = "amount")
private BigDecimal amount;
@Schema(name = "user_id")
private Long userId;
@Schema(name = "robot_id")
private Integer robotId;
@Schema(name = "is_renew")
private Boolean isRenew;
}

@ -0,0 +1,76 @@
package com.baiye.modules.distribute.entity;
import com.baiye.entity.LogicDeletedBaseEntity;
import com.baiye.extend.mybatis.plus.alias.TableAlias;
import com.baiye.validation.group.UpdateGroup;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import javax.validation.constraints.NotNull;
import java.util.Date;
/**
* @author Enzo
* @date : 2024/3/26
*/
@Getter
@Setter
@ToString
@TableAlias("wa")
@TableName(value = "tb_wechat_account")
public class WeChatAccount extends LogicDeletedBaseEntity {
@TableId(type = IdType.AUTO)
@Schema(title = "id")
@NotNull(message = "微信ID", groups = {UpdateGroup.class})
private Long id;
@Schema(title = "用户id")
private Long userId;
@Schema(title = "设备信息")
private String deviceInformation;
@Schema(title = "用户名称")
private String username;
@Schema(title = "用户id")
private String nickname;
@Schema(title = "城市信息")
private String cityInfo;
@Schema(title = "登录类型")
private Integer loginType;
@Schema(name = "登录时间")
private Date loginDate;
@Schema(name = "头像")
private String headerUrl;
@Schema(name = "微信ID")
private String wxId;
@Schema(name = "性别")
private Integer sex;
@Schema(name = "拥有者")
private Long ownerId;
@Schema(title = "在线状态")
private Integer status;
@Schema(title = "备注")
private String remark;
@Schema(title = "微信号")
private String weChatNo;
}

@ -0,0 +1,39 @@
package com.baiye.modules.distribute.entity;
import com.baiye.extend.mybatis.plus.alias.TableAlias;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.io.Serializable;
/**
*
* @author Enzo
*
*
*/
@Data
@TableAlias("we")
@TableName("tb_wechat_equipment")
@Schema(title = "微信账号设备")
public class WeChatEquipment implements Serializable {
@TableId
private Long id;
/**
* ID
*/
@Schema(title = "用户id")
private Long accountId;
/**
* Code
*/
@Schema(title = "设备id")
private String equipmentId;
}

@ -0,0 +1,53 @@
package com.baiye.modules.distribute.entity;
import com.baiye.extend.mybatis.plus.alias.TableAlias;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.io.Serializable;
/**
* @author Enzo
* @date : 2024/4/2
*/
@Data
@TableAlias("we")
@TableName("tb_wechat_friend")
@Schema(title = "微信好友记录")
public class WeChatFriedRecord implements Serializable {
@TableId
private Long id;
@Schema(title = "机器人微信ID")
private String robotWxId;
@Schema(title = "添加好友方式")
private Integer addFriendType;
@Schema(title = "省")
private String province;
@Schema(title = "城市")
private String city;
@Schema(title = "昵称")
private String nickName;
@Schema(title = "性别")
private Integer sex;
@Schema(title = "通过时间")
private Long addAcceptTime;
@Schema(title = "微信ID")
private String alias;
@Schema(title = "头像")
private String bigHeadImgUrl;
}

@ -0,0 +1,53 @@
package com.baiye.modules.distribute.mapper;
import com.baiye.domain.PageParam;
import com.baiye.domain.PageResult;
import com.baiye.extend.mybatis.plus.conditions.query.LambdaQueryWrapperX;
import com.baiye.extend.mybatis.plus.mapper.ExtendMapper;
import com.baiye.extend.mybatis.plus.toolkit.WrappersX;
import com.baiye.modules.distribute.entity.LoginEquipment;
import com.baiye.modules.distribute.entity.WeChatAccount;
import com.baiye.modules.distribute.qo.AccountQo;
import com.baiye.modules.distribute.vo.WeChatAccountVO;
import com.baiye.modules.distribute.vo.WeChatAddFriendVo;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
* @author Enzo
* @date 2024-4-1
*/
@Mapper
public interface LoginEquipmentMapper extends ExtendMapper<LoginEquipment> {
default PageResult<WeChatAccountVO> queryPage(PageParam pageParam, AccountQo qo) {
IPage<WeChatAccountVO> page = this.prodPage(pageParam);
LambdaQueryWrapperX<WeChatAccount> wrapperX = WrappersX.lambdaQueryX(WeChatAccount.class);
if (StringUtils.isNotBlank(qo.getStartTime()) && StringUtils.isNotBlank(qo.getEndTime())) {
wrapperX.between(WeChatAccount::getCreateTime, qo.getStartTime(), qo.getEndTime());
}
wrapperX.likeIfPresent(WeChatAccount::getUsername, qo.getUsername()).eqIfPresent(WeChatAccount::getUserId, qo.getUserId());
this.selectByPage(page, qo.getStartTime(), qo.getEndTime(), qo.getUsername(), qo.getUserId());
return new PageResult<>(page.getRecords(), page.getTotal());
}
IPage<WeChatAccountVO> selectByPage(IPage<WeChatAccountVO> page,
@Param("startTime") String startTime, @Param("endTime") String endTime, @Param("username") String username,@Param("userId") Long userId);
/**
*
*
* @param dayNum
* @param wxId
* @return
*/
List<WeChatAddFriendVo> queryByDate(@Param("dayNum") Integer dayNum, @Param("wxId") String wxId);
}

@ -0,0 +1,58 @@
package com.baiye.modules.distribute.mapper;
import com.baiye.domain.PageParam;
import com.baiye.domain.PageResult;
import com.baiye.extend.mybatis.plus.conditions.query.LambdaQueryWrapperX;
import com.baiye.extend.mybatis.plus.mapper.ExtendMapper;
import com.baiye.extend.mybatis.plus.toolkit.WrappersX;
import com.baiye.modules.distribute.converter.PayOrderConverter;
import com.baiye.modules.distribute.entity.PayOrder;
import com.baiye.modules.distribute.qo.PayOrderQo;
import com.baiye.modules.distribute.vo.PayOrderVO;
import com.baiye.notify.converter.UserAnnouncementConverter;
import com.baiye.notify.model.entity.UserAnnouncement;
import com.baiye.notify.model.vo.UserAnnouncementPageVO;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
/**
* @author Enzo
* @date 2024-4-1
*/
@Mapper
public interface PayOrderMapper extends ExtendMapper<PayOrder> {
/**
*
*
* @param orderNo
* @return
*/
default List<PayOrder> findByOrderNumber(String orderNo) {
LambdaQueryWrapperX<PayOrder> wrapperX = new LambdaQueryWrapperX<>();
return this.selectList(wrapperX.eq(PayOrder::getOrderNo, orderNo).orderByDesc(PayOrder::getId));
}
/**
*
*
* @param pageParam
* @param qo
* @return
*/
default PageResult<PayOrderVO> queryPage(PageParam pageParam, PayOrderQo qo) {
IPage<PayOrder> page = this.prodPage(pageParam);
LambdaQueryWrapperX<PayOrder> wrapperX = WrappersX.lambdaQueryX(PayOrder.class);
if (StringUtils.isNotBlank(qo.getStartTime()) && StringUtils.isNotBlank(qo.getEndTime())) {
wrapperX.between(PayOrder::getCreateTime, qo.getStartTime(), qo.getEndTime());
}
wrapperX.eqIfPresent(PayOrder::getOrderNo, qo.getOrderNo()).eqIfPresent(PayOrder::getUserId, qo.getUserId()).orderByDesc(PayOrder::getId);
this.selectPage(page, wrapperX);
IPage<PayOrderVO> voPage = page.convert(PayOrderConverter.INSTANCE::entityToVo);
return new PageResult<>(voPage.getRecords(), voPage.getTotal());
}
}

@ -0,0 +1,60 @@
package com.baiye.modules.distribute.mapper;
import cn.hutool.core.collection.CollUtil;
import com.baiye.constant.DefaultNumberConstants;
import com.baiye.domain.PageParam;
import com.baiye.domain.PageResult;
import com.baiye.extend.mybatis.plus.conditions.query.LambdaQueryWrapperX;
import com.baiye.extend.mybatis.plus.mapper.ExtendMapper;
import com.baiye.extend.mybatis.plus.toolkit.WrappersX;
import com.baiye.modules.distribute.converter.WeChatAccountConverter;
import com.baiye.modules.distribute.entity.WeChatAccount;
import com.baiye.modules.distribute.qo.AccountQo;
import com.baiye.modules.distribute.vo.WeChatAccountVO;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
/**
* @author Enzo
* @date 2024-3-27
*/
@Mapper
public interface WeChatAccountMapper extends ExtendMapper<WeChatAccount> {
/**
* id
*
* @param wxId
* @return
*/
default WeChatAccount findByWxId(String wxId) {
List<WeChatAccount> selectList = this.selectList(WrappersX.lambdaQueryX(WeChatAccount.class).eqIfPresent
(WeChatAccount::getWxId, wxId).eqIfPresent(WeChatAccount::getDeleted, DefaultNumberConstants.ZERO_NUMBER).orderByDesc(WeChatAccount::getId));
if (CollUtil.isNotEmpty(selectList)) {
return selectList.get(DefaultNumberConstants.ZERO_NUMBER);
}
return new WeChatAccount();
}
/**
*
*
* @param pageParam
* @param qo
* @return
*/
default PageResult<WeChatAccountVO> queryPage(PageParam pageParam, AccountQo qo) {
IPage<WeChatAccount> page = this.prodPage(pageParam);
LambdaQueryWrapperX<WeChatAccount> wrapperX = WrappersX.lambdaQueryX(WeChatAccount.class);
if (StringUtils.isNotBlank(qo.getStartTime()) && StringUtils.isNotBlank(qo.getEndTime())) {
wrapperX.between(WeChatAccount::getCreateTime, qo.getStartTime(), qo.getEndTime());
}
wrapperX.likeIfPresent(WeChatAccount::getUsername, qo.getUsername()).eqIfPresent(WeChatAccount::getOwnerId, qo.getUserId()).orderByDesc(WeChatAccount::getId);
this.selectPage(page, wrapperX);
IPage<WeChatAccountVO> voPage = page.convert(WeChatAccountConverter.INSTANCE::entityToVo);
return new PageResult<>(voPage.getRecords(), voPage.getTotal());
}
}

@ -0,0 +1,15 @@
package com.baiye.modules.distribute.mapper;
import com.baiye.extend.mybatis.plus.mapper.ExtendMapper;
import com.baiye.modules.distribute.entity.WeChatFriedRecord;
import org.apache.ibatis.annotations.Mapper;
/**
* @author Enzo
* @date : 2024/4/2
*/
@Mapper
public interface WeChatFriendMapper extends ExtendMapper<WeChatFriedRecord> {
}

@ -0,0 +1,30 @@
package com.baiye.modules.distribute.qo;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
/**
* @author Enzo
* @date : 2024/3/29
*/
@Data
public class AccountQo {
@Parameter(description = "开始时间")
private String startTime;
@Parameter(description = "结束时间")
private String endTime;
@Parameter(description = "用户昵称")
private String username;
@Schema(title = "用户ID")
private Long userId;
@Schema(title = "微信id")
private Long wxId;
}

@ -0,0 +1,21 @@
package com.baiye.modules.distribute.qo;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@Data
public class PayOrderQo {
@Schema(title = "订单号")
private String orderNo;
@Parameter(description = "开始时间")
private String startTime;
@Parameter(description = "结束时间")
private String endTime;
@Schema(title = "用户ID")
private Long userId;
}

@ -0,0 +1,42 @@
package com.baiye.modules.distribute.service;
import com.baiye.extend.mybatis.plus.service.ExtendService;
import com.baiye.modules.distribute.dto.AliPayPcDTO;
import com.baiye.modules.distribute.entity.PayOrder;
import com.baiye.modules.distribute.entity.WeChatAccount;
import com.baiye.result.R;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Map;
/**
* @author Enzo
* @date : 2021/6/16
*/
public interface AliPayService extends ExtendService<PayOrder> {
/**
* pc
* @param aliPayPcDTO
* @return
*/
Map<String,Object> aliPayPc(AliPayPcDTO aliPayPcDTO);
/**
*
*
* @param request
* @return
*/
String pcNotifyResponse(HttpServletRequest request);
/**
*
* @param orderNo
* @return
*/
PayOrder findOrderByNo(String orderNo);
}

@ -0,0 +1,51 @@
package com.baiye.modules.distribute.service;
import com.baiye.domain.PageParam;
import com.baiye.domain.PageResult;
import com.baiye.extend.mybatis.plus.service.ExtendService;
import com.baiye.modules.distribute.entity.LoginEquipment;
import com.baiye.modules.distribute.qo.AccountQo;
import com.baiye.modules.distribute.vo.AddFriendVo;
import com.baiye.modules.distribute.vo.WeChatAccountVO;
import com.baiye.modules.distribute.vo.WeChatAddFriendVo;
import java.util.List;
/**
* @author Enzo
* @date : 2024/4/1
*/
public interface LoginEquipmentService extends ExtendService<LoginEquipment> {
/**
*
* @param pageParam
* @param qo
* @return
*/
PageResult<WeChatAccountVO> queryPage(PageParam pageParam, AccountQo qo);
/**
* ID
* @param pit
* @return
*/
LoginEquipment queryByRobot(String pit);
/**
*
* @param dayNum
* @param wxId
* @return
*/
List<WeChatAddFriendVo> queryByDate(Integer dayNum, String wxId);
/**
*
* @param robotId
* @return
*/
LoginEquipment queryByRobotId(Integer robotId);
}

@ -0,0 +1,23 @@
package com.baiye.modules.distribute.service;
import com.baiye.domain.PageParam;
import com.baiye.domain.PageResult;
import com.baiye.extend.mybatis.plus.service.ExtendService;
import com.baiye.modules.distribute.entity.PayOrder;
import com.baiye.modules.distribute.qo.PayOrderQo;
import com.baiye.modules.distribute.vo.PayOrderVO;
/**
* @author Enzo
* @date : 2024/3/28
*/
public interface PayOrderService extends ExtendService<PayOrder> {
/**
*
* @param pageParam
* @param qo
* @return
*/
PageResult<PayOrderVO> queryPage(PageParam pageParam, PayOrderQo qo);
}

@ -0,0 +1,95 @@
package com.baiye.modules.distribute.service;
import com.baiye.domain.PageParam;
import com.baiye.domain.PageResult;
import com.baiye.extend.mybatis.plus.service.ExtendService;
import com.baiye.modules.distribute.dto.CreateCodeDTO;
import com.baiye.modules.distribute.dto.PushCodeDTO;
import com.baiye.modules.distribute.dto.WeChatAddFriendDTO;
import com.baiye.modules.distribute.dto.WeChatUserLoginDTO;
import com.baiye.modules.distribute.entity.WeChatAccount;
import com.baiye.modules.distribute.qo.AccountQo;
import com.baiye.modules.distribute.vo.AddFriendVo;
import com.baiye.modules.distribute.vo.WeChatAccountVO;
/**
* @author Enzo
* @date 2023/9/5
*/
public interface WeChatService extends ExtendService<WeChatAccount> {
/**
*
*
* @param createCodeDTO
* @return
*/
String createQrCode(CreateCodeDTO createCodeDTO);
/**
*
*
* @param weChatFriendDTO
* @return
*/
Boolean addFriend(WeChatAddFriendDTO weChatFriendDTO);
/**
*
* @param pageParam
* @param qo
* @return
*/
PageResult<WeChatAccountVO> queryPage(PageParam pageParam, AccountQo qo);
/**
*
*
* @param num
* @param packageType
* @param userId
* @return
*/
Boolean createEquipment(Integer num, Integer packageType, Long userId);
/**
*
* @param pushCodeDTO
* @return
*/
String pushCode(PushCodeDTO pushCodeDTO);
/**
*
* @param callbackUrl
* @return
*/
String globalSetting(String callbackUrl);
/**
*
* @param userLoginDTO
* @param status
* @return
*/
Boolean weChatAccountLoginByRespon(WeChatUserLoginDTO userLoginDTO, Integer status);
/**
*
* @param pageParam
* @param qo
* @return
*/
PageResult<AddFriendVo> queryDateData(PageParam pageParam, AccountQo qo);
/**
*
*
* @param robotId
* @param payType
* @return
*/
Boolean equipmentRenewal(Integer robotId, Integer payType);
}

@ -0,0 +1,17 @@
package com.baiye.modules.distribute.service;
import com.baiye.result.WeChatResponse;
/**
* @author Enzo
* @date : 2024/4/1
*/
public interface WechatCallbackService {
/**
*
* @param body
*/
void analyticalData(WeChatResponse body);
}

@ -0,0 +1,18 @@
package com.baiye.modules.distribute.service;
import com.baiye.extend.mybatis.plus.service.ExtendService;
import com.baiye.modules.distribute.dto.WeChatFriendDTO;
import com.baiye.modules.distribute.entity.WeChatFriedRecord;
/**
* @author Enzo
* @date : 2024/4/2
*/
public interface WechatFriendService extends ExtendService<WeChatFriedRecord> {
/**
*
* @param weChatFriendDTO
*/
void addFriendByResponse(WeChatFriendDTO weChatFriendDTO);
}

@ -0,0 +1,189 @@
package com.baiye.modules.distribute.service.impl;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.text.CharSequenceUtil;
import cn.hutool.core.text.StrPool;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.NumberUtil;
import com.alipay.easysdk.factory.Factory;
import com.alipay.easysdk.kernel.util.ResponseChecker;
import com.alipay.easysdk.payment.page.models.AlipayTradePagePayResponse;
import com.baiye.constant.DefaultNumberConstants;
import com.baiye.constant.PayConstants;
import com.baiye.constant.enums.ResponseCode;
import com.baiye.exception.BadRequestException;
import com.baiye.extend.mybatis.plus.service.impl.ExtendServiceImpl;
import com.baiye.modules.distribute.dto.AliPayPcDTO;
import com.baiye.modules.distribute.entity.PayOrder;
import com.baiye.modules.distribute.mapper.PayOrderMapper;
import com.baiye.modules.distribute.service.AliPayService;
import com.baiye.modules.distribute.service.WeChatService;
import com.baiye.security.util.SecurityUtils;
import com.baiye.system.properties.AliPayProperties;
import com.google.common.collect.Maps;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.servlet.http.HttpServletRequest;
import java.math.BigDecimal;
import java.nio.charset.StandardCharsets;
import java.time.LocalTime;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* @author Enzo
*/
@Slf4j
@Service
@RequiredArgsConstructor
public class AliPayServiceImpl extends ExtendServiceImpl<PayOrderMapper, PayOrder> implements AliPayService {
@Value("${snowflake.workerId}")
private int workerId;
@Value("${snowflake.datacenterId}")
private int datacenterId;
private final AliPayProperties aliPay;
private final WeChatService weChatService;
@Override
@Transactional(rollbackFor = Exception.class)
public String pcNotifyResponse(HttpServletRequest request) {
log.info("================ the pay notify enter date as {} ================", DateUtil.date());
//获取支付宝GET过来反馈信息
Map<String, String> params = new HashMap<>(DefaultNumberConstants.SIXTEEN_NUMBER);
// 处理乱码问题
checkParam(request, params);
Boolean flag;
try {
flag = Factory.Payment.Common().verifyNotify(params);
//商户订单号
String orderNo = new String(request.getParameter(PayConstants.OUT_TRADE_NO).getBytes(StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8);
//前台回调验证签名 v1 or v2
if (flag != null && flag) {
log.info("========== order verify signature success the orderNumber as {} ==========", orderNo);
List<PayOrder> orderList = baseMapper.findByOrderNumber(orderNo);
if (CollUtil.isNotEmpty(orderList) && orderList.get(DefaultNumberConstants.ZERO_NUMBER).getStatus() == DefaultNumberConstants.ZERO_NUMBER) {
PayOrder order = orderList.get(DefaultNumberConstants.ZERO_NUMBER);
log.info("========== the order notify success date as {} ==========", DateUtil.date());
order.setPayTime(DateUtil.date());
order.setStatus(DefaultNumberConstants.ONE_NUMBER);
if (Boolean.TRUE.equals(order.getIsRenew())){
// 创建设备
weChatService.createEquipment(order.getNum(), order.getPayType(), order.getUserId());
}
if (Boolean.TRUE.equals(order.getIsRenew())){
// 设备设备
weChatService.equipmentRenewal(order.getRobotId(), order.getPayType());
}
return this.updateById(order) ? ResponseCode.SUCCESS.getDesc() : ResponseCode.FAILURE.getDesc();
}
}
} catch (Exception e) {
log.error("the pc response error time {}", LocalTime.now());
throw new BadRequestException(ResponseCode.CALLBACK_FAILED.getDesc());
}
return ResponseCode.FAILURE.getDesc();
}
private void checkParam(HttpServletRequest request, Map<String, String> params) {
Map<String, String[]> requestParams = request.getParameterMap();
if (CollectionUtils.isNotEmpty(requestParams.keySet())) {
for (Map.Entry<String, String[]> stringEntry : requestParams.entrySet()) {
String[] values = stringEntry.getValue();
String valueStr = CharSequenceUtil.EMPTY;
for (int i = 0; i < values.length; i++) {
valueStr = (i == values.length - 1) ? valueStr + values[i] : valueStr + values[i] + StrPool.COMMA;
}
/* //乱码解决,这段代码在出现乱码时使用
valueStr = new String(valueStr.getBytes
(StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8);*/
params.put(stringEntry.getKey(), valueStr);
}
}
}
@Override
public Map<String, Object> aliPayPc(AliPayPcDTO aliPayPcDTO) {
Map<String, Object> map = Maps.newHashMap();
BigDecimal amount = new BigDecimal(DefaultNumberConstants.ZERO_NUMBER);
Integer num = aliPayPcDTO.getNum();
Integer robotId = aliPayPcDTO.getRobotId();
Boolean isRenew = aliPayPcDTO.getIsRenew();
Integer packageType = aliPayPcDTO.getPackageType();
if (packageType == DefaultNumberConstants.ONE_NUMBER) {
amount = new BigDecimal(DefaultNumberConstants.THIRTY);
}
if (packageType == DefaultNumberConstants.TWO_NUMBER) {
// 九折
amount = NumberUtil.mul(NumberUtil.mul
(String.valueOf(DefaultNumberConstants.THIRTY), String.valueOf(DefaultNumberConstants.THREE_NUMBER)), 0.9);
}
if (packageType == DefaultNumberConstants.THREE_NUMBER) {
// 八折
amount = NumberUtil.mul(NumberUtil.mul
(String.valueOf(DefaultNumberConstants.THIRTY), String.valueOf(DefaultNumberConstants.TWELVE_NUMBER)), 0.8);
}
// amount = NumberUtil.mul(amount, num);
amount = new BigDecimal("0.01");
// 查询记录
try {
// 雪花算法id
String orderNo = String.valueOf(IdUtil.getSnowflake(workerId, datacenterId).nextId());
// 生成返回对象
AlipayTradePagePayResponse response = Factory.Payment.Page().pay(PayConstants.PAY_TITLE + orderNo, orderNo, String.valueOf(amount), aliPay.getReturnUrl());
if (ResponseChecker.success(response)) {
boolean result = savePayOrder(num, isRenew, robotId, packageType, amount, orderNo);
log.info("============= the save order result {} =============", result);
map.put("payUrl", response.getBody());
map.put("orderNo", orderNo);
return map;
}
} catch (Exception e) {
log.error("the order failed purchaser {} time {}", aliPayPcDTO.getRemark(), LocalTime.now());
throw new BadRequestException(ResponseCode.ALI_PAY_ERROR.getDesc());
}
throw new BadRequestException(ResponseCode.ALI_PAY_ERROR.getDesc());
}
private Boolean savePayOrder(Integer num, Boolean isRenew, Integer robotId, Integer packageType, BigDecimal amount, String orderNo) {
PayOrder order = new PayOrder();
order.setNum(num);
order.setAmount(amount);
order.setRobotId(robotId);
order.setIsRenew(isRenew);
order.setOrderNo(orderNo);
order.setPayType(packageType);
order.setUserId(SecurityUtils.getCurrentUserId());
order.setStatus(DefaultNumberConstants.ZERO_NUMBER);
return this.save(order);
}
@Override
public PayOrder findOrderByNo(String orderNo) {
List<PayOrder> payOrderList = baseMapper.findByOrderNumber(orderNo);
if (CollUtil.isNotEmpty(payOrderList)) {
return payOrderList.get(DefaultNumberConstants.ZERO_NUMBER);
}
return new PayOrder();
}
}

@ -0,0 +1,62 @@
package com.baiye.modules.distribute.service.impl;
import cn.hutool.core.util.ObjectUtil;
import com.baiye.domain.PageParam;
import com.baiye.domain.PageResult;
import com.baiye.extend.mybatis.plus.service.impl.ExtendServiceImpl;
import com.baiye.extend.mybatis.plus.toolkit.WrappersX;
import com.baiye.modules.distribute.entity.LoginEquipment;
import com.baiye.modules.distribute.mapper.LoginEquipmentMapper;
import com.baiye.modules.distribute.qo.AccountQo;
import com.baiye.modules.distribute.service.LoginEquipmentService;
import com.baiye.modules.distribute.vo.WeChatAccountVO;
import com.baiye.modules.distribute.vo.WeChatAddFriendVo;
import com.baiye.security.util.SecurityUtils;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* @author Enzo
* @date : 2024/4/1
*/
@Service
@RequiredArgsConstructor
public class LoginEquipmentServiceImpl extends ExtendServiceImpl<LoginEquipmentMapper, LoginEquipment> implements
LoginEquipmentService {
@Override
public PageResult<WeChatAccountVO> queryPage(PageParam pageParam, AccountQo qo) {
qo.setUserId(SecurityUtils.getCurrentUserId());
return baseMapper.queryPage(pageParam, qo);
}
@Override
public LoginEquipment queryByRobot(String pit) {
LoginEquipment loginEquipment = baseMapper.selectOne
(WrappersX.lambdaQueryX(LoginEquipment.class).eq(LoginEquipment::getPit, pit));
if (ObjectUtil.isNotNull(loginEquipment) && ObjectUtil.isNotNull(loginEquipment.getUserId())) {
return loginEquipment;
}
return new LoginEquipment();
}
@Override
public List<WeChatAddFriendVo> queryByDate(Integer dayNum, String wxId) {
return baseMapper.queryByDate(dayNum, wxId);
}
@Override
public LoginEquipment queryByRobotId(Integer robotId) {
LoginEquipment loginEquipment = baseMapper.selectOne
(WrappersX.lambdaQueryX(LoginEquipment.class).eq(LoginEquipment::getRobotId, robotId));
if (ObjectUtil.isNotNull(loginEquipment) && ObjectUtil.isNotNull(loginEquipment.getUserId())) {
return loginEquipment;
}
return new LoginEquipment();
}
}

@ -0,0 +1,29 @@
package com.baiye.modules.distribute.service.impl;
import com.baiye.domain.PageParam;
import com.baiye.domain.PageResult;
import com.baiye.extend.mybatis.plus.service.impl.ExtendServiceImpl;
import com.baiye.modules.distribute.entity.PayOrder;
import com.baiye.modules.distribute.mapper.PayOrderMapper;
import com.baiye.modules.distribute.qo.PayOrderQo;
import com.baiye.modules.distribute.service.PayOrderService;
import com.baiye.modules.distribute.vo.PayOrderVO;
import com.baiye.security.util.SecurityUtils;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
/**
* @author Enzo
* @date : 2024/3/28
*/
@Slf4j
@Service
@RequiredArgsConstructor
public class PayOrderServiceImpl extends ExtendServiceImpl<PayOrderMapper, PayOrder> implements PayOrderService {
@Override
public PageResult<PayOrderVO> queryPage(PageParam pageParam, PayOrderQo qo) {
qo.setUserId(SecurityUtils.getCurrentUserId());
return baseMapper.queryPage(pageParam, qo);
}
}

@ -0,0 +1,235 @@
package com.baiye.modules.distribute.service.impl;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.date.DatePattern;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.text.CharSequenceUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.http.HttpStatus;
import cn.hutool.http.HttpUtil;
import cn.hutool.json.JSONUtil;
import com.baiye.constant.DefaultNumberConstants;
import com.baiye.constant.ResponseConstant;
import com.baiye.constant.WeChatRequestConstants;
import com.baiye.constant.WechatCallbackConstant;
import com.baiye.constant.enums.ResponseCode;
import com.baiye.domain.PageParam;
import com.baiye.domain.PageResult;
import com.baiye.enums.PackageEnum;
import com.baiye.exception.BadRequestException;
import com.baiye.extend.mybatis.plus.service.impl.ExtendServiceImpl;
import com.baiye.modules.distribute.dto.*;
import com.baiye.modules.distribute.entity.LoginEquipment;
import com.baiye.modules.distribute.entity.WeChatAccount;
import com.baiye.modules.distribute.mapper.WeChatAccountMapper;
import com.baiye.modules.distribute.qo.AccountQo;
import com.baiye.modules.distribute.service.LoginEquipmentService;
import com.baiye.modules.distribute.service.WeChatService;
import com.baiye.modules.distribute.vo.AddFriendVo;
import com.baiye.modules.distribute.vo.WeChatAccountVO;
import com.baiye.modules.distribute.vo.WeChatAddFriendVo;
import com.baiye.result.WeChatResponse;
import com.baiye.security.util.SecurityUtils;
import com.baiye.system.properties.WeChatProperties;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Lists;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
* @author Enzo
* @date 2024-3-27
*/
@Slf4j
@Service
@RequiredArgsConstructor
public class WeChatServiceImpl extends ExtendServiceImpl<WeChatAccountMapper, WeChatAccount> implements WeChatService {
private final WeChatProperties weChatProperties;
private final LoginEquipmentService loginEquipmentService;
@Override
public String createQrCode(CreateCodeDTO createCodeDTO) {
Map<String, Object> beanToMap = BeanUtil.beanToMap(createCodeDTO);
String getQrCodeResult = HttpUtil.get
(weChatProperties.getGatewayHost().concat(WeChatRequestConstants.GET_QR_CODE)
.concat(weChatProperties.getAppKey()), beanToMap);
if (StringUtils.isNotBlank(getQrCodeResult)) {
WeChatResponse weChatResponse = JSONUtil.toBean(getQrCodeResult, WeChatResponse.class);
return weChatResponse.getMsg();
}
throw new BadRequestException("创建失败");
}
@Override
public Boolean addFriend(WeChatAddFriendDTO weChatFriendDTO) {
Map<String, Object> map = BeanUtil.beanToMap(weChatFriendDTO);
String addedFriendResult = HttpUtil.post(weChatProperties.getGatewayHost().concat
(WeChatRequestConstants.WE_CHAT_ADD_FRIEND).concat(weChatProperties.getAppKey()), map);
if (addedFriendResult.contains(ResponseCode.SUCCESS.getDesc())) {
WeChatResponse weChatResponse = JSONUtil.toBean(addedFriendResult, WeChatResponse.class);
if (weChatResponse.getStatus() == HttpStatus.HTTP_OK) {
return Boolean.TRUE;
}
}
return Boolean.FALSE;
}
@Override
public PageResult<WeChatAccountVO> queryPage(PageParam pageParam, AccountQo qo) {
qo.setUserId(SecurityUtils.getCurrentUserId());
return baseMapper.queryPage(pageParam, qo);
}
@Override
public Boolean createEquipment(Integer num, Integer packageType, Long userId) {
Map<String, Object> map = ImmutableMap.of("num", num);
String createEquipmentResult = HttpUtil.get
(weChatProperties.getGatewayHost().concat(WeChatRequestConstants.CREATE_EQUIPMENT)
.concat(weChatProperties.getAppKey()), map);
if (StringUtils.isNotBlank(createEquipmentResult)) {
WeChatResponse weChatResponse = JSONUtil.toBean(createEquipmentResult, WeChatResponse.class);
if (weChatResponse.getStatus() == ResponseConstant.SUCCESS) {
Integer dayNum = PackageEnum.find(packageType);
if (dayNum > DefaultNumberConstants.ZERO_NUMBER) {
EquipmentDTO dto = BeanUtil.toBean(weChatResponse.getData(), EquipmentDTO.class);
DateTime dateTime = DateUtil.offsetDay(DateUtil.date(), dayNum);
for (EquipmentDTO.RoBotDTO botDTO : dto.getData()) {
// 创建账号
LoginEquipment equipment = new LoginEquipment();
equipment.setUserId(userId);
equipment.setExpirationTime(dateTime);
equipment.setRobotId(botDTO.getRobotId());
equipment.setDeviceNumber(botDTO.getRobotAccount());
loginEquipmentService.save(equipment);
}
}
return Boolean.TRUE;
}
}
return Boolean.FALSE;
}
@Override
public String pushCode(PushCodeDTO pushCodeDTO) {
Map<String, Object> beanToMap = BeanUtil.beanToMap(pushCodeDTO);
String pushQrCodeResult = HttpUtil.get
(weChatProperties.getGatewayHost().concat(WeChatRequestConstants.GET_PUSH_LOGIN)
.concat(weChatProperties.getAppKey()), beanToMap);
if (StringUtils.isNotBlank(pushQrCodeResult)) {
WeChatResponse weChatResponse = JSONUtil.toBean(pushQrCodeResult, WeChatResponse.class);
return weChatResponse.getMsg();
}
return CharSequenceUtil.EMPTY;
}
@Override
public String globalSetting(String callbackUrl) {
List<String> strings = Lists.newArrayList(callbackUrl);
Map<String, Object> map = ImmutableMap.of("callbackUrls", strings);
String globalSetting = HttpUtil.post
(weChatProperties.getGatewayHost().concat
(WeChatRequestConstants.GLOBAL_SETTING).concat(weChatProperties.getAppKey()), JSONUtil.toJsonStr(map));
if (StringUtils.isNotBlank(globalSetting)) {
WeChatResponse weChatResponse = JSONUtil.toBean(globalSetting, WeChatResponse.class);
return weChatResponse.getMsg();
}
return CharSequenceUtil.EMPTY;
}
@Override
public Boolean weChatAccountLoginByRespon(WeChatUserLoginDTO userLoginDTO, Integer status) {
LoginEquipment loginEquipment = loginEquipmentService.queryByRobot(userLoginDTO.getPit());
if (ObjectUtil.isNotNull(loginEquipment) && ObjectUtil.isNotNull(loginEquipment.getId())) {
WeChatAccount byWxId = this.baseMapper.findByWxId(userLoginDTO.getWxId());
if (ObjectUtil.isNotNull(byWxId) && ObjectUtil.isNotNull(byWxId.getId())) {
byWxId = new WeChatAccount();
BeanUtil.copyProperties(userLoginDTO, byWxId);
byWxId.setHeaderUrl(userLoginDTO.getBigHeadImgUrl());
byWxId.setUserId(loginEquipment.getUserId());
return this.save(byWxId);
}
byWxId.setStatus(status == WechatCallbackConstant.LOGIN_SUCCESS ?
DefaultNumberConstants.ONE_NUMBER : DefaultNumberConstants.MINUS_ONE_NUMBER);
return this.updateById(byWxId);
}
return Boolean.FALSE;
}
@Override
public PageResult<AddFriendVo> queryDateData(PageParam pageParam, AccountQo qo) {
qo.setUserId(SecurityUtils.getCurrentUserId());
List<AddFriendVo> addFriendVos = Lists.newArrayList();
PageResult<WeChatAccountVO> accountVo = baseMapper.queryPage(pageParam, qo);
for (WeChatAccountVO vo : accountVo.getRecords()) {
AddFriendVo addFriendVo = new AddFriendVo();
BeanUtil.copyProperties(vo, addFriendVo);
// 查询数据天数据
List<WeChatAddFriendVo> weChatAddFriendVos =
loginEquipmentService.queryByDate(DefaultNumberConstants.MINUS_FIFTEEN_NUMBER, vo.getWxId());
// 转为map
Map<String, List<WeChatAddFriendVo>> map = weChatAddFriendVos.stream().collect
(Collectors.groupingBy(WeChatAddFriendVo::getDayStr));
Integer newFriendsInitiativeNum = DefaultNumberConstants.ZERO_NUMBER;
Integer newPassiveNum = DefaultNumberConstants.ZERO_NUMBER;
List<AddFriendVo.FriendDTO> newArrayList = Lists.newArrayList();
for (int i = 0; i < DefaultNumberConstants.FIFTEEN_NUMBER; i++) {
// 时间格式
String dateTime = DateUtil.format(DateUtil.offsetDay(DateUtil.date(), -i), DatePattern.NORM_DATE_PATTERN);
AddFriendVo.FriendDTO dto = new AddFriendVo.FriendDTO();
dto.setDayStr(dateTime);
if (map.containsKey(dateTime)) {
List<WeChatAddFriendVo> voList = map.get(dateTime);
Map<Integer, WeChatAddFriendVo> voMap =
voList.stream().collect(Collectors.toMap
(WeChatAddFriendVo::getAddFriendType, chatAddFriendVo -> chatAddFriendVo));
if (voMap.get(DefaultNumberConstants.ONE_NUMBER) != null) {
WeChatAddFriendVo weChatAddFriendVo = voMap.get(DefaultNumberConstants.ONE_NUMBER);
Integer num = weChatAddFriendVo.getNum();
newFriendsInitiativeNum += num;
dto.setNewDayFriendsInitiativeNum(num);
}
if (voMap.get(DefaultNumberConstants.TWO_NUMBER) != null) {
WeChatAddFriendVo weChatAddFriendVo = voMap.get(DefaultNumberConstants.TWO_NUMBER);
Integer num = weChatAddFriendVo.getNum();
newPassiveNum += num;
dto.setNewDayPassiveNum(num);
}
}
newArrayList.add(dto);
addFriendVo.setList(newArrayList);
}
addFriendVo.setNewFriendsInitiativeNum(newFriendsInitiativeNum);
addFriendVo.setNewPassiveNum(newPassiveNum);
addFriendVos.add(addFriendVo);
}
return new PageResult<>(addFriendVos, accountVo.getTotal());
}
@Override
public Boolean equipmentRenewal(Integer robotId, Integer payType) {
// TODO 设备续费
Integer dayNum = PackageEnum.find(payType);
if (dayNum > DefaultNumberConstants.ZERO_NUMBER) {
LoginEquipment loginEquipment = loginEquipmentService.queryByRobotId(robotId);
if (ObjectUtil.isNotNull(loginEquipment) && ObjectUtil.isNotNull(loginEquipment.getId())) {
DateTime dateTime = DateUtil.offsetDay(loginEquipment.getExpirationTime(), dayNum);
loginEquipment.setExpirationTime(dateTime);
return loginEquipmentService.updateById(loginEquipment);
}
}
return Boolean.FALSE;
}
}

@ -0,0 +1,82 @@
package com.baiye.modules.distribute.service.impl;
import cn.hutool.json.JSONUtil;
import com.baiye.constant.DefaultNumberConstants;
import com.baiye.constant.WechatCallbackConstant;
import com.baiye.modules.distribute.dto.WeChatFriendDTO;
import com.baiye.modules.distribute.dto.WeChatUserLoginDTO;
import com.baiye.modules.distribute.entity.LoginEquipment;
import com.baiye.modules.distribute.service.LoginEquipmentService;
import com.baiye.modules.distribute.service.WeChatService;
import com.baiye.modules.distribute.service.WechatCallbackService;
import com.baiye.modules.distribute.service.WechatFriendService;
import com.baiye.notify.event.StationNotifyPushEvent;
import com.baiye.notify.model.domain.AnnouncementNotifyInfo;
import com.baiye.result.WeChatResponse;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Service;
import java.time.LocalDateTime;
import java.util.Collections;
/**
* @author Enzo
* @date : 2024/4/1
*/
@Slf4j
@Service
@RequiredArgsConstructor
public class WechatCallbackServiceImpl implements WechatCallbackService {
private final WeChatService weChatService;
private final ApplicationContext publisher;
private final WechatFriendService wechatFriendService;
private final LoginEquipmentService loginEquipmentService;
@Override
public void analyticalData(WeChatResponse weChatResponse) {
Integer status = weChatResponse.getStatus();
switch (status) {
case WechatCallbackConstant.LOGIN_OUT:
case WechatCallbackConstant.LOGIN_SUCCESS:
wechatLogin(weChatResponse);
break;
case WechatCallbackConstant.LOGIN_FAIL:
// 登录失败接口
break;
case WechatCallbackConstant.THROUGH_FRIENDS:
viaFriendRequest(weChatResponse);
break;
default:
}
}
private void viaFriendRequest(WeChatResponse weChatResponse) {
WeChatFriendDTO weChatFriendDTO =
JSONUtil.toBean(JSONUtil.toJsonStr(weChatResponse.getData()), WeChatFriendDTO.class);
wechatFriendService.addFriendByResponse(weChatFriendDTO);
}
public void wechatLogin(WeChatResponse weChatResponse) {
WeChatUserLoginDTO userLoginDTO =
JSONUtil.toBean(JSONUtil.toJsonStr(weChatResponse.getData()), WeChatUserLoginDTO.class);
weChatService.weChatAccountLoginByRespon(userLoginDTO, weChatResponse.getStatus());
LoginEquipment robot = loginEquipmentService.queryByRobot(userLoginDTO.getPit());
AnnouncementNotifyInfo notifyInfo = new AnnouncementNotifyInfo();
notifyInfo.setTitle("新消息通知");
notifyInfo.setMessageKey(String.valueOf(robot.getId()));
notifyInfo.setContent("您有一条新线索请及时查收!");
notifyInfo.setCreateTime(LocalDateTime.now());
notifyInfo.setMessageType(DefaultNumberConstants.ONE_NUMBER);
// 发送消息
publisher.publishEvent(new StationNotifyPushEvent(notifyInfo, Collections.singletonList(robot.getUserId())));
}
}

@ -0,0 +1,38 @@
package com.baiye.modules.distribute.service.impl;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
import com.baiye.extend.mybatis.plus.service.impl.ExtendServiceImpl;
import com.baiye.extend.mybatis.plus.toolkit.WrappersX;
import com.baiye.modules.distribute.dto.WeChatFriendDTO;
import com.baiye.modules.distribute.entity.WeChatFriedRecord;
import com.baiye.modules.distribute.mapper.WeChatFriendMapper;
import com.baiye.modules.distribute.service.WechatFriendService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* @author Enzo
* @date : 2024/3/28
*/
@Slf4j
@Service
@RequiredArgsConstructor
public class WechatFriendServiceImpl extends ExtendServiceImpl<WeChatFriendMapper, WeChatFriedRecord> implements WechatFriendService {
@Override
public void addFriendByResponse(WeChatFriendDTO weChatFriendDTO) {
List<WeChatFriedRecord> weChatFriedRecords =
this.baseMapper.selectList(WrappersX.lambdaQueryX(WeChatFriedRecord.class).eq
(WeChatFriedRecord::getRobotWxId, weChatFriendDTO.getRobotWxId()).eq(WeChatFriedRecord::getAlias, weChatFriendDTO.getAlias()));
if (CollUtil.isEmpty(weChatFriedRecords)) {
WeChatFriedRecord weChatFriedRecord = new WeChatFriedRecord();
BeanUtil.copyProperties(weChatFriendDTO,weChatFriedRecord);
this.baseMapper.insert(weChatFriedRecord);
}
}
}

@ -0,0 +1,49 @@
package com.baiye.modules.distribute.vo;
import com.baiye.constant.DefaultNumberConstants;
import lombok.*;
import java.util.List;
/**
* @author Enzo
* @date : 2024/4/3
*/
@Data
public class AddFriendVo {
private Integer robotId;
private String robotWxId;
private String robotWxNick;
private String headerUrl;
private Integer newFriendsInitiativeNum;
private Integer newPassiveNum;
private List<FriendDTO> list;
/**
* list
*/
@AllArgsConstructor
@NoArgsConstructor
@ToString
@Getter
@Setter
public static class FriendDTO {
private String dayStr;
private Integer newDayFriendsInitiativeNum = DefaultNumberConstants.ZERO_NUMBER;
private Integer newDayPassiveNum = DefaultNumberConstants.ZERO_NUMBER;
}
}

@ -0,0 +1,45 @@
package com.baiye.modules.distribute.vo;
import cn.hutool.core.date.DatePattern;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.time.LocalDateTime;
import java.util.Date;
@Data
public class PayOrderVO {
@Schema(name = "pay_type")
private Integer payType;
@Schema(name = "order_number")
private String orderNumber;
@Schema(name = "status")
private Integer status;
@Schema(name = "purchaser")
private String purchaser;
@Schema(name = "pay_time")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = DatePattern.NORM_DATETIME_PATTERN, timezone = "GMT+8")
private Date payTime;
@Schema(name = "amount")
private Double amount;
@Schema(name = "user_id")
private Long userId;
@Schema(title = "创建时间")
private LocalDateTime createTime;
@Schema(title = "修改时间")
private LocalDateTime updateTime;
}

@ -0,0 +1,79 @@
package com.baiye.modules.distribute.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.time.LocalDateTime;
import java.util.Date;
/**
* @author Enzo
* @date : 2024/3/26
*/
@Data
public class WeChatAccountVO {
@Schema(title = "用户id")
private Long userId;
@Schema(title = "设备信息")
private String deviceInformation;
@Schema(title = "用户名称")
private String username;
@Schema(title = "用户id")
private String nickname;
@Schema(title = "城市信息")
private String cityInfo;
@Schema(title = "登录类型")
private Integer loginType;
@Schema(name = "登录时间")
private Date loginDate;
@Schema(name = "头像")
private String headerUrl;
@Schema(name = "微信ID")
private String wxId;
@Schema(name = "性别")
private Integer sex;
@Schema(name = "拥有者")
private Long ownerId;
@Schema(title = "创建时间")
private LocalDateTime createTime;
@Schema(title = "修改时间")
private LocalDateTime updateTime;
@Schema(title = "在线状态")
private Integer status;
@Schema(title = "备注")
private String remark;
@Schema(title = "微信号")
private String weChatNo;
@Schema(title = "设备号")
private Integer robotId;
private String deviceNumber;
@Schema(title = "过期时间")
private LocalDateTime expirationTime;
}

@ -0,0 +1,18 @@
package com.baiye.modules.distribute.vo;
import lombok.Data;
/**
* @author Enzo
* @date : 2024/4/3
*/
@Data
public class WeChatAddFriendVo {
private String dayStr;
private Integer num;
private Integer addFriendType;
}

@ -0,0 +1,40 @@
package com.baiye.properties;
import com.alipay.easysdk.factory.Factory;
import com.alipay.easysdk.kernel.Config;
import com.baiye.system.properties.AliPayProperties;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Component;
/**
* @author Enzo
*/
@Component
@Configuration
@EnableConfigurationProperties({AliPayProperties.class})
public class PayConfig {
private final AliPayProperties aliPay;
public PayConfig(AliPayProperties aliPay) {
this.aliPay = aliPay;
Config config = new Config();
config.protocol = aliPay.getProtocol();
config.gatewayHost = aliPay.getGatewayHost();
config.signType = aliPay.getSignType();
config.appId = aliPay.getAppId();
/**
*
*/
config.merchantPrivateKey = aliPay.getMerchantPrivateKey();
config.alipayPublicKey = aliPay.getAliPayPublicKey();
config.notifyUrl = aliPay.getNotifyUrl();
config.encryptKey = aliPay.getEncryptKey();
Factory.setOptions(config);
}
public AliPayProperties getConfig(){
return aliPay;
}
}

@ -1,6 +1,6 @@
spring:
datasource:
url: jdbc:mysql://39.100.77.21:3306/ad_distribute?rewriteBatchedStatements=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&allowMultiQueries=true
url: jdbc:mysql://39.100.77.21:3306/marketing-platform?rewriteBatchedStatements=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&allowMultiQueries=true
username: root
password: y7z7noq2
redis:
@ -11,6 +11,25 @@ spring:
database: 7
alipay:
protocol: https
# 不需要加/gateway.do这是新旧SDK的区别切记
# gatewayHost: openapi.alipaydev.com
gatewayHost: openapi.alipay.com
signType: RSA2
# 填APPID
appId: 2021003125644167
# 填应用私钥注意是应用私钥不要填成公钥了_(:з」∠)_
merchantPrivateKey: MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCNIuelR5MHMY3vtl2KEgWUbhHMHuBwxHMVONuUYKlt4grOGJtaPKitgh9MxrvaxmAvH0LilQQKd5T07os9jC2XpNmH0BA6rNVNgBwjWNllqKo+jT8OiKvog9uBuZYfHdkLRhjObrTkSo97jO5Y32591GZHG+cQ/5bgMC0KXlQMOv5piLqUfKYDJ5pWBdS5gqcCkUABZsrW+C8nD7lvOuVglN1AGQiXQzj+Iu3K5xcUg+d3q0nWXhKPpotSolFGSakLEqUja/MnsILVHVw8MYMuq6LxzQ7DQ5fCzMPMIF5kYTynsAV5SoE90ilj1vmmI4aa7dc+9OmG/vXyFuoOEK1bAgMBAAECggEAH0K/9EfqNQmw2ouWJGLhgYLvxjqAk/mvU+AIItFWNdR/eC7TGiWdZvEPZb4PFeIio81Uz0MaZgceozHC/Zry7kfBNufK8HQfus7JbLrdTDsTmk9GzD1RdmreT9l/etztmiWokPDMeFRbe443rM+wdYZ6MP3pLEawcG+7SjSigSKrcpltAJ49NhHyfJxnnCye4mM8PevVGXe4nGv/vKJbAfzl5V8MsSY+SVktj6jOUTSa6nypISvQElyv8jeNH/bTDjg0DOHzL4tUHaVbTqHhtqbNo3n9VuKz4shVAp3I+9PpcTQTueTsM9L0Y+j84bV3VZlTIGGzDUD4qWDhUKPJ4QKBgQDQFNB2vLDJLeGfn+SnCncnr/wQo1xJez+deBqJXoDhDWDuZVcWNaEOWgfDronm8dIedWMYHD//WN0GtA5foAUdlaNq/jeKdJFgzJ/hoOtOveHY1OWqJHiJ/YMRBMuLn/E4Jit7q215JU6Jur1T+70HxrUFTQfY8GWdMvSDFHCKDwKBgQCto24hqgcEDKoR3/sm5sUKqYZTHLeQbniM0D5EcOkBNw7UXGYQSbz7mJ34XQKTfrOL71A+LkjxdMfs5q56yxeOQxR4EBO/Fpz8xPRlud5uIp4eTQVJ8I01meZyvojkF6mO5C4tbcXJOpnpU8ohoeTRu7th0oUYObGUYmn0qzuj9QKBgDCOOtsKSwKXF0hFanjkQ0vakCpdxIJNJVoclayqhc5+bbkTos/G8e9EaP1rtDhVA6Ah6l7M8M4oMWOIDraXw7nUmk60RcekTexVs5VWFLLKMnKDs5gRbKNeqgAFq23Ig+SDW7A/H4uefgY7skRvwPuYjdNP113zMvMM2evgkCZXAoGAP5przvz/EOaqrV2EG93QM3WhdHRCcS9mDP6CsINDdmR6lCM8Z577EJX4128KcIiqsAl7NSuzIG8MhKSDKQuXl07PAqOw+AAKhTSH6XNKHMGldaf01f69WvMCzOkqL5LTUzoWCCH7nxhOJH/CvMsWjBTeMJjyk8seVyIteaf3crkCgYEAmY8OC+Vdo/yop+ooedCnvBC7GVMfcqR6+rIQ+ZnKom7jhByIN6w7eEVAnmNa9dCv/pig7HaYbitWmCNf9tbqFfcdY6e5Svele3amgDM9iqtdJ9Rf1PpDPZw+gmjRIxGs6W8wnl1Sqvpk8pFUA/2xlT6sXpfxra9N09LS0ttU+cU=
# 填支付宝公钥,注意不是生成的应用公钥
aliPayPublicKey: MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAyvegkGCrz1i5/K7VzQxvoZm4G73pSPNu9R5ET8YonIuDVoHkHaYvQQizLdRkTyBsYIik8FXsSDmVsw5MLMQ7OAlZ97nQBkz5TxOX6Px766nUpSVoWXoAz6cpIlWnwgir4t1ph88Ph56l+qmqW3gUj/U6MIuzjxBJlijTMHl96its95Nd4cEFx4j+sFuRYob6D0kcemC7xEFuty7bdupda51Z56GYI1YjuUTryTlFOHZbOSThc2ZMzNC1gPG25bn2Lx6sDuPByk4KW4rQ2v7mSfeUuZZRdjtVSC0WV2M2Cv5L8eLFvZRgNYnXrUJYhnRpT+OBAvJZXaWU2nv/bNe/UQIDAQAB
# 回调地址
notifyUrl: http://39.100.77.21:8088/pay/aliPay/pay-notify
# 支付宝成功支付跳转页面
returnUrl: http://39.100.77.21:8001/dashboard
# 可设置AES密钥调用AES加解密相关接口时需要可选
encryptKey:
springdoc:
swagger-ui:

@ -1,6 +1,6 @@
spring:
datasource:
url: jdbc:mysql://localhost:3306/ad_distribute?rewriteBatchedStatements=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&allowMultiQueries=true
url: jdbc:mysql://localhost:3306/marketing-platform?rewriteBatchedStatements=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&allowMultiQueries=true
username: root
password: 7f2vvawx
redis:
@ -15,3 +15,21 @@ ballcat:
openapi:
enabled: false
alipay:
protocol: https
# 不需要加/gateway.do这是新旧SDK的区别切记
# gatewayHost: openapi.alipaydev.com
gatewayHost: openapi.alipay.com
signType: RSA2
# 填APPID
appId: 2021003125644167
# 填应用私钥注意是应用私钥不要填成公钥了_(:з」∠)_
merchantPrivateKey: MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCNIuelR5MHMY3vtl2KEgWUbhHMHuBwxHMVONuUYKlt4grOGJtaPKitgh9MxrvaxmAvH0LilQQKd5T07os9jC2XpNmH0BA6rNVNgBwjWNllqKo+jT8OiKvog9uBuZYfHdkLRhjObrTkSo97jO5Y32591GZHG+cQ/5bgMC0KXlQMOv5piLqUfKYDJ5pWBdS5gqcCkUABZsrW+C8nD7lvOuVglN1AGQiXQzj+Iu3K5xcUg+d3q0nWXhKPpotSolFGSakLEqUja/MnsILVHVw8MYMuq6LxzQ7DQ5fCzMPMIF5kYTynsAV5SoE90ilj1vmmI4aa7dc+9OmG/vXyFuoOEK1bAgMBAAECggEAH0K/9EfqNQmw2ouWJGLhgYLvxjqAk/mvU+AIItFWNdR/eC7TGiWdZvEPZb4PFeIio81Uz0MaZgceozHC/Zry7kfBNufK8HQfus7JbLrdTDsTmk9GzD1RdmreT9l/etztmiWokPDMeFRbe443rM+wdYZ6MP3pLEawcG+7SjSigSKrcpltAJ49NhHyfJxnnCye4mM8PevVGXe4nGv/vKJbAfzl5V8MsSY+SVktj6jOUTSa6nypISvQElyv8jeNH/bTDjg0DOHzL4tUHaVbTqHhtqbNo3n9VuKz4shVAp3I+9PpcTQTueTsM9L0Y+j84bV3VZlTIGGzDUD4qWDhUKPJ4QKBgQDQFNB2vLDJLeGfn+SnCncnr/wQo1xJez+deBqJXoDhDWDuZVcWNaEOWgfDronm8dIedWMYHD//WN0GtA5foAUdlaNq/jeKdJFgzJ/hoOtOveHY1OWqJHiJ/YMRBMuLn/E4Jit7q215JU6Jur1T+70HxrUFTQfY8GWdMvSDFHCKDwKBgQCto24hqgcEDKoR3/sm5sUKqYZTHLeQbniM0D5EcOkBNw7UXGYQSbz7mJ34XQKTfrOL71A+LkjxdMfs5q56yxeOQxR4EBO/Fpz8xPRlud5uIp4eTQVJ8I01meZyvojkF6mO5C4tbcXJOpnpU8ohoeTRu7th0oUYObGUYmn0qzuj9QKBgDCOOtsKSwKXF0hFanjkQ0vakCpdxIJNJVoclayqhc5+bbkTos/G8e9EaP1rtDhVA6Ah6l7M8M4oMWOIDraXw7nUmk60RcekTexVs5VWFLLKMnKDs5gRbKNeqgAFq23Ig+SDW7A/H4uefgY7skRvwPuYjdNP113zMvMM2evgkCZXAoGAP5przvz/EOaqrV2EG93QM3WhdHRCcS9mDP6CsINDdmR6lCM8Z577EJX4128KcIiqsAl7NSuzIG8MhKSDKQuXl07PAqOw+AAKhTSH6XNKHMGldaf01f69WvMCzOkqL5LTUzoWCCH7nxhOJH/CvMsWjBTeMJjyk8seVyIteaf3crkCgYEAmY8OC+Vdo/yop+ooedCnvBC7GVMfcqR6+rIQ+ZnKom7jhByIN6w7eEVAnmNa9dCv/pig7HaYbitWmCNf9tbqFfcdY6e5Svele3amgDM9iqtdJ9Rf1PpDPZw+gmjRIxGs6W8wnl1Sqvpk8pFUA/2xlT6sXpfxra9N09LS0ttU+cU=
# 填支付宝公钥,注意不是生成的应用公钥
aliPayPublicKey: MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAyvegkGCrz1i5/K7VzQxvoZm4G73pSPNu9R5ET8YonIuDVoHkHaYvQQizLdRkTyBsYIik8FXsSDmVsw5MLMQ7OAlZ97nQBkz5TxOX6Px766nUpSVoWXoAz6cpIlWnwgir4t1ph88Ph56l+qmqW3gUj/U6MIuzjxBJlijTMHl96its95Nd4cEFx4j+sFuRYob6D0kcemC7xEFuty7bdupda51Z56GYI1YjuUTryTlFOHZbOSThc2ZMzNC1gPG25bn2Lx6sDuPByk4KW4rQ2v7mSfeUuZZRdjtVSC0WV2M2Cv5L8eLFvZRgNYnXrUJYhnRpT+OBAvJZXaWU2nv/bNe/UQIDAQAB
# 回调地址
notifyUrl: https://baiyee.vip/pay/aliPay/pay-notify
# 支付宝成功支付跳转页面
returnUrl: https://baiyee.vip/dashboard
# 可设置AES密钥调用AES加解密相关接口时需要可选
encryptKey:

@ -30,7 +30,7 @@ mybatis-plus:
ballcat:
security:
# 前端传输密码的 AES 加密密钥
password-secret-key: '==marketing-platform='
password-secret-key: 'market-platform='
oauth2:
authorizationserver:
# 登陆验证码是否开启
@ -52,6 +52,9 @@ ballcat:
- /favicon.ico
- /captcha/**
- /outside/**
- /wechat/global/setting
- /pay/aliPay/pay-notify
- /api/wechat/callback
# 项目 redis 缓存的 key 前缀
redis:
key-prefix: 'marketing:'
@ -97,3 +100,7 @@ elasticjob:
snowflake:
workerId: 10
datacenterId: 10
wechat:
gatewayHost: http://43.143.56.20:1620
appKey: Dn4emsLhVFaZ4aw2sQSmWoh2oz0n1taa

@ -0,0 +1,52 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.baiye.modules.distribute.mapper.LoginEquipmentMapper">
<sql id="Base_Alias_Column_List">
wa.username,
wa.nickname,
wa.city_info,
wa.login_type,
wa.header_url,
wa.wx_id,
wa.sex,
wa.status,
wa.we_chat_no,
wa.remark,
wa.create_time,
wa.update_time,
le.robot_id,
le.device_number,
le.expiration_time
</sql>
<select id="selectByPage" resultType="com.baiye.modules.distribute.vo.WeChatAccountVO">
SELECT
<include refid="Base_Alias_Column_List"/>
FROM
tb_login_equipment le left join
tb_wechat_equipment we on we.equipment_id = le.id
LEFT join tb_wechat_account wa on wa.id = we.account_id
where le.user_id = #{userId}
<if test="username != null">
AND wa.username LIKE concat('%',#{username,jdbcType=VARCHAR},'%')
</if>
<if test="startTime != null">
and wa.create_time &gt;= #{startTime,jdbcType=TIMESTAMP}
</if>
<if test="endTime != null">
and wa.create_time &lt;= #{endTime,jdbcType=TIMESTAMP}
</if>
</select>
<select id="queryByDate" resultType="com.baiye.modules.distribute.vo.WeChatAddFriendVo">
SELECT DATE_FORMAT(create_time, '%Y-%m-%d') dayStr
, count(1) as num
, add_friend_type
FROM tb_wechat_friend
WHERE DATE_SUB(CURDATE(), INTERVAL #{dayNum} DAY) &lt;= date (create_time) and robot_wx_id = #{wxId}
GROUP BY dayStr, add_friend_type
ORDER BY dayStr
</select>
</mapper>

@ -17,6 +17,11 @@ public class DefaultNumberConstants {
*/
public static final int MINUS_THREE_NUMBER = -3;
/**
*
*/
public static final int MINUS_FIFTEEN_NUMBER = -15;
/**
* -2
*/

@ -0,0 +1,46 @@
package com.baiye.constant;
import lombok.Getter;
/**
* @author Enzo
* @date : 2024/4/1
*/
@Getter
public class WechatCallbackConstant {
private WechatCallbackConstant() {
}
/**
*
*/
public static final int SCAN_CODE = 222;
/**
*
*/
public static final int LOGIN_SUCCESS = 201;
/**
*
*/
public static final int LOGIN_FAIL = 212;
/**
* 退
*/
public static final int LOGIN_OUT = 210;
/**
*
*/
public static final int THROUGH_FRIENDS = 1003;
}

@ -0,0 +1,225 @@
package com.baiye.constant.enums;
import lombok.Getter;
/**
* @author q
*/
@Getter
public enum ResponseCode {
/**
*
*/
SUCCESS("1", "success"),
/**
*
*/
FAILURE("0", "failure "),
/**
*
*/
RECHARGE_SUCCESS("1020", "充值成功"),
/**
*
*/
PHONE_NUMBER_IS_INCORRECT("1022", "手机号码不正确"),
/**
*
*/
VERIFICATION_CODE_PARAMETER_ERROR("1023", "验证码错误"),
/**
*
*/
VERIFICATION_NOT_EXIST_HAS_EXPIRED("1024", "验证码不存在或已过期"),
/**
*
*/
READ_FILE_ERROR("1021", "读取文件失败"),
/**
*
*/
PARAMETER_ERROR("1001", "参数错误"),
/**
*
*/
USER_INFORMATION_ERROR("1002", "用户信息错误"),
/**
*
*/
ACCOUNT_DISABLED("1025", "账户已被禁用"),
/**
*
*/
PACKAGE_ERROR("1026", "套餐不存在或已过期"),
/**
*
*/
ALI_PAY_ERROR("1016", "支付宝支付失败"),
/**
*
*/
CALLBACK_FAILED("1017", "支付宝支付回调失败"),
/**
*
*/
ACCOUNT_EXPIRED("1020", "账号已过期,无法激活"),
/**
*
*/
CALL_ERROR("1014", "呼叫失败"),
/**
* axb
*/
AXB_CONFIGURATION_ERROR("1015", "axb参数配置错误"),
/**
*
*/
DECRYPTION_FAILED("1012", "数据解析失败"),
/**
* 100%,
*/
RATIO_FAILED("1013", "比率不足100%,无法分配"),
/**
* axb
*/
WRONG_USER_NAME_PASSWORD("1016", "用户名或密码不正确"),
/**
*
*/
INSUFFICIENT_ACCOUNT_BALANCE("1019", "账户余额不足"),
/**
*
*/
CONNECTION_SUCCEEDED("1027", "连接成功"),
/**
*
*/
FAILED_GET_QR_CODE("1028", "获取二维码失败"),
/**
*
*/
FAILED_GET_TEMPLATE("1029", "获取模板失败,请先配置发送模板"),
/**
*
*/
TEMPLATE_CHANGE_ERROR("1031", "发送消息至少配置一条!"),
/**
*
*/
FAILED_ADD_FRIEND("1032", "添加好友失败!"),
/**
* 线
*/
ACCOUNT_NOT_LOGGED_OR_NOT_ONLINE("1030", "当前账户未登录或不在线"),
/**
*
*/
UPDATE_COMBO_FRIEND("1033", "修改套餐失败!"),
/**
*
*/
SEND_MAIL_FRIEND("1034", "发送邮件失败!"),
/**
*
*/
SEND_MAIL_NUM_FRIEND("1035", "发送数量不足100!"),
/**
* 11005
*/
USER_DISABLED("11004", "用户被禁用"),
/**
*
*/
USER_LOCKED("11005", "用户被锁定"),
/**
*
*/
USER_PASSWORD_ERROR("11006", "用户名或密码错误"),
/**
*
*/
USER_PASSWORD_EXPIRED("11007", "用户密码过期"),
/**
*
*/
USER_ACCOUNT_EXPIRED("11008", "用户账号已过期"),
/**
*
*/
USER_NOT_EXIST("11009", "没有该用户"),
/**
*
*/
USER_LOGIN_FAIL("11010", "用户登录失败"),
/**
*
*/
VERIFY_CODE_ERROR("11011", "验证码错误"),
/**
*
*/
UPDATE_USER_ERROR("11012", "修改用户信息失败"),
/**
*
*/
DATA_CONVERSION_FAILURE("11013", "兑换数据失败,请再次重试"),
/**
*
*/
SEND_MAIL_MAX_NUM_FRIEND("1036", "发送数量超出最大范围!"),
/**
*
*/
BATCH_NUMBER_ALREADY_EXISTS("1037", "该批次号已经存在!"),
/**
*
*/
NON_SUPER_ADMINISTRATORS_CANNOT_MODIFY_DATA("1018", "非管理员不能修改数据");
private final String code;
private final String desc;
ResponseCode(String code, String desc) {
this.code = code;
this.desc = desc;
}
}

@ -4,8 +4,8 @@ import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* @author wjt
* @date 2023/12/7
* @author Enzo
* @date 2024-4-1
*/
@Getter
@AllArgsConstructor

@ -1,46 +0,0 @@
/*
* Copyright 2019-2020 Zheng Jie
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.baiye.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* <p>
* Redis key
* </p>
*
* @author Zheng Jie
* @date 2020-05-02
*/
@Getter
@AllArgsConstructor
public enum ClueSourceEnum {
/**
*
*/
TABLE_UPLOAD("table upload", "表单上传"),
/**
*
*/
STORE_DISTRIBUTION("store distribution:", "门店分发");
private final String key;
private final String description;
}

@ -1,45 +0,0 @@
package com.baiye.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* @author Enzo
* @date : 2023/5/16
*/
@Getter
@AllArgsConstructor
public enum MailRequestEnum {
/**
*
*/
MM("MM", "dmp::manual::"),
/**
*
*/
GG("GG", "mail::gender::"),
/**
*
*/
BY("BY", "dmp::request::");
private final String type;
private final String cacheName;
public static MailRequestEnum find(String str) {
for (MailRequestEnum dataScopeEnum : MailRequestEnum.values()) {
if (dataScopeEnum.getCacheName().equalsIgnoreCase(str)) {
return dataScopeEnum;
}
}
return null;
}
}

@ -0,0 +1,43 @@
package com.baiye.enums;
import com.baiye.constant.DefaultNumberConstants;
import lombok.AllArgsConstructor;
import lombok.Getter;
import java.util.Objects;
/**
* @author Enzo
* @date : 2024/4/1
*/
@Getter
@AllArgsConstructor
public enum PackageEnum {
/**
*
*/
MONTH(1, 30),
/**
*
*/
QUARTER(2, 90),
/**
*
*/
YEAR(3, 365);
private final Integer type;
private final Integer num;
public static Integer find(Integer val) {
for (PackageEnum packageEnum : PackageEnum.values()) {
if (Objects.equals(packageEnum.getType(), val)) {
return packageEnum.getNum();
}
}
return DefaultNumberConstants.MINUS_ONE_NUMBER;
}
}

@ -5,7 +5,6 @@ import cn.hutool.core.date.DateUtil;
import cn.hutool.core.text.StrPool;
import cn.hutool.core.util.ObjectUtil;
import com.baiye.constant.DefaultNumberConstants;
import com.baiye.enums.MailRequestEnum;
import com.google.common.collect.Lists;
import com.google.common.collect.Sets;
import lombok.extern.slf4j.Slf4j;
@ -22,7 +21,6 @@ import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.util.*;
import java.util.List;
import java.util.concurrent.TimeUnit;
@Component
@ -698,24 +696,6 @@ public class RedisUtils {
log.debug("--------------------------------------------");
}
/**
*
*
* @param prefix
* @param ids
*/
public String acquisitionBatch(String cacheType) {
String format = DateUtil.format(DateUtil.date(), DatePattern.PURE_DATE_PATTERN);
Integer num = (Integer) get(cacheType.concat(format));
Integer batch = ObjectUtil.isNull(num) ?
DefaultNumberConstants.ONE_NUMBER : num + DefaultNumberConstants.ONE_NUMBER;
// 保存批次号
set(cacheType.concat(format), batch, DefaultNumberConstants.ONE_NUMBER, TimeUnit.DAYS);
String parameter = MailRequestEnum.find(cacheType).getType();
return parameter.concat(StrPool.DASHED).
concat(format).concat(StrPool.DASHED).concat(String.valueOf(batch));
}
/**
*

@ -0,0 +1,29 @@
package com.baiye.result;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import java.io.Serializable;
/**
* @author Enzo
* @date : 2022/6/23
*/
@Getter
@Setter
@ToString
public class WeChatResponse<T extends Serializable> implements Serializable {
private static final long serialVersionUID = 6763956796736587193L;
private T data;
private String msg;
private Integer status;
private Boolean success;
}

@ -14,39 +14,40 @@ import java.util.Map;
/**
*
*
* @author huyuanzhi
* @param <T>
* @author huyuanzhi
*/
@Slf4j
@Component
@AllArgsConstructor
public class NotifyInfoDelegateHandler<T extends NotifyInfo> {
private final List<NotifyInfoHandler<T>> notifyInfoHandlers;
private Map<Class<?>, NotifyInfoHandler<T>> handlerMap;
@PostConstruct
public void init() {
handlerMap = new HashMap<>(notifyInfoHandlers.size());
for (NotifyInfoHandler<T> handler : notifyInfoHandlers) {
handlerMap.put(handler.getNotifyClass(), handler);
}
}
/**
*
* @param userIdList
* @param info
*/
public void handle(List<Long> userIdList, T info) {
Assert.notNull(info, "event message cant be null!");
NotifyInfoHandler<T> notifyInfoHandler = handlerMap.get(info.getClass());
if (notifyInfoHandler == null) {
log.warn("no notifyHandler bean for class:{},please check!", info.getClass().getName());
return;
}
notifyInfoHandler.handle(userIdList, info);
}
private final List<NotifyInfoHandler<T>> notifyInfoHandlers;
private Map<Class<?>, NotifyInfoHandler<T>> handlerMap;
@PostConstruct
public void init() {
handlerMap = new HashMap<>(notifyInfoHandlers.size());
for (NotifyInfoHandler<T> handler : notifyInfoHandlers) {
handlerMap.put(handler.getNotifyClass(), handler);
}
}
/**
*
*
* @param userIdList
* @param info
*/
public void handle(List<Long> userIdList, T info) {
Assert.notNull(info, "event message cant be null!");
NotifyInfoHandler<T> notifyInfoHandler = handlerMap.get(info.getClass());
if (notifyInfoHandler == null) {
log.warn("no notifyHandler bean for class:{},please check!", info.getClass().getName());
return;
}
notifyInfoHandler.handle(userIdList, info);
}
}

@ -2,7 +2,6 @@ package com.baiye.notify.handler;
import com.baiye.notify.model.domain.NotifyInfo;
import com.baiye.system.model.entity.SysUser;
import java.util.List;

@ -0,0 +1,30 @@
package com.baiye.system.properties;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
/**
* @author Enzo
*/
@Data
@ConfigurationProperties(prefix = "alipay")
public class AliPayProperties {
private String protocol;
private String gatewayHost;
private String signType;
private String appId;
private String merchantPrivateKey;
private String aliPayPublicKey;
private String notifyUrl;
private String encryptKey;
private String returnUrl;
}

@ -0,0 +1,23 @@
package com.baiye.system.properties;
import lombok.Getter;
import lombok.Setter;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
/**
* @author Enzo
* @date : 2022/6/24
*/
@Getter
@Setter
@Component
@ConfigurationProperties(prefix = "wechat")
public class WeChatProperties {
private String gatewayHost;
private String appKey;
}

@ -3,8 +3,8 @@ package com.baiye.system.model.dto;
import lombok.Data;
/**
* @author wjt
* @date 2023/9/15
* @author Enzo
* @date 2024-4-1
*/
@Data
public class SysUserNameRoleDTO {

@ -51,6 +51,7 @@
<mybatis-plus.version>3.5.3.1</mybatis-plus.version>
<mybatis.version>3.5.10</mybatis.version>
<poi.version>4.1.2</poi.version>
<alipay.version>2.2.0</alipay.version>
<zip4j.version>1.3.2</zip4j.version>
<rocketmq.version>2.2.0</rocketmq.version>
<software.amazon.awssdk.version>2.20.70</software.amazon.awssdk.version>
@ -403,6 +404,15 @@
<version>${zip4j.version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.alipay.sdk/alipay-easysdk -->
<dependency>
<groupId>com.alipay.sdk</groupId>
<artifactId>alipay-easysdk</artifactId>
<version>${alipay.version}</version>
</dependency>
</dependencies>
</dependencyManagement>

Loading…
Cancel
Save