Переглянути джерело

feat: 增加微信广告订单用户管理

zengweijie 3 роки тому
батько
коміт
e1aced2d80

+ 36 - 0
smsb-customer-manager-adapter/src/main/java/com/inspur/customer/web/controller/wechat/WechatAppletUserController.java

@@ -0,0 +1,36 @@
+package com.inspur.customer.web.controller.wechat;
+
+import com.alibaba.cola.dto.PageResponse;
+import com.alibaba.cola.dto.SingleResponse;
+import com.inspur.customer.client.wechat.IWechatAppletUserService;
+import com.inspur.customer.object.wechat.WechatAppletUserDto;
+import com.inspur.customer.search.wechat.WechatAppletUserQuery;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.dubbo.config.annotation.DubboReference;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * @author zengweijie
+ * @version 1.0
+ * @date 2022/11/8 15:01
+ **/
+@Slf4j
+@RestController
+@RequestMapping("/wechatAppletUser")
+public class WechatAppletUserController {
+    @DubboReference
+    private IWechatAppletUserService wechatAppletUserService;
+
+    @GetMapping("page")
+    public PageResponse<WechatAppletUserDto> queryPage(@RequestBody WechatAppletUserQuery query) {
+        return wechatAppletUserService.queryPage(query);
+    }
+
+    @GetMapping
+    public SingleResponse<WechatAppletUserDto> queryOne(WechatAppletUserQuery query) {
+        return SingleResponse.of(wechatAppletUserService.queryOne(query));
+    }
+}

+ 6 - 5
smsb-customer-manager-app/src/main/java/com/inspur/customer/service/wechat/WeChatServiceImpl.java

@@ -21,19 +21,20 @@ import javax.annotation.Resource;
  */
 @Slf4j
 @DubboService(interfaceClass = IWeChatService.class)
-public class WeChatServiceImpl implements IWeChatService{
+public class WeChatServiceImpl implements IWeChatService {
     @Resource
     private RestTemplate restTemplate;
 
     @Override
-    public String queryTicket(String appKey ,String userId ,String authorization) {
-        String url = String.format(HttpUrlConstant.QUERY_TICKET,userId , appKey);
+    public String queryTicket(String appKey, String userId, String authorization) {
+        String url = String.format(HttpUrlConstant.QUERY_TICKET, userId, appKey);
         HttpHeaders header = new HttpHeaders();
-        header.add("Authorization",authorization);
-        ResponseEntity<String> response = restTemplate.exchange(url , HttpMethod.GET,new HttpEntity<String>(header),String.class);
+        header.add("Authorization", authorization);
+        ResponseEntity<String> response = restTemplate.exchange(url, HttpMethod.GET, new HttpEntity<String>(header), String.class);
         log.info("获取二维码url: {}", url);
         return response.getBody();
     }
+
     @Override
     public String askUser(String userId) {
         return restTemplate.getForObject(String.format(HttpUrlConstant.ASK_USER, userId), String.class);

+ 57 - 0
smsb-customer-manager-app/src/main/java/com/inspur/customer/service/wechat/WechatAppletUserServiceImpl.java

@@ -0,0 +1,57 @@
+package com.inspur.customer.service.wechat;
+
+import com.alibaba.cola.dto.PageResponse;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.inspur.customer.client.wechat.IWechatAppletUserService;
+import com.inspur.customer.infrastructure.mapper.wechat.WechatAppletUserMapper;
+import com.inspur.customer.infrastructure.object.wechat.WechatAppletUser;
+import com.inspur.customer.object.wechat.WechatAppletUserDto;
+import com.inspur.customer.search.wechat.WechatAppletUserQuery;
+import com.inspur.customer.utils.BeanCopyUtils;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.dubbo.config.annotation.DubboService;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.Objects;
+
+/**
+ * @author zengweijie
+ * @version 1.0
+ * @date 2022/11/8 14:12
+ **/
+@Slf4j
+@DubboService(interfaceClass = IWechatAppletUserService.class)
+public class WechatAppletUserServiceImpl extends ServiceImpl<WechatAppletUserMapper, WechatAppletUser> implements IWechatAppletUserService {
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void change(WechatAppletUserDto dto) {
+        WechatAppletUser wechatAppletUser = super.getOne(Wrappers.lambdaQuery(WechatAppletUser.class).eq(WechatAppletUser::getOpenid, dto.getOpenid()));
+        if (wechatAppletUser != null) {
+            super.update(Wrappers.lambdaUpdate(WechatAppletUser.class)
+                .set(WechatAppletUser::getPhoneNumber, dto.getPhoneNumber())
+                .eq(WechatAppletUser::getOpenid, dto.getOpenid()));
+        } else {
+            super.save(BeanCopyUtils.copy(dto, WechatAppletUser.class));
+        }
+    }
+
+    @Override
+    public WechatAppletUserDto queryOne(WechatAppletUserQuery query) {
+        WechatAppletUser wechatAppletUser = super.getOne(Wrappers.lambdaQuery(WechatAppletUser.class)
+            .eq(Objects.nonNull(query.getPhoneNumber()), WechatAppletUser::getPhoneNumber, query.getPhoneNumber())
+            .eq(Objects.nonNull(query.getOpenid()), WechatAppletUser::getOpenid, query.getOpenid()));
+        return BeanCopyUtils.copyIfNotNull(wechatAppletUser, WechatAppletUserDto.class);
+    }
+
+    @Override
+    public PageResponse<WechatAppletUserDto> queryPage(WechatAppletUserQuery query) {
+        Page<WechatAppletUser> page = super.page(new Page<>(query.getPageIndex(), query.getPageSize()), Wrappers.lambdaQuery(WechatAppletUser.class)
+            .eq(Objects.nonNull(query.getOpenid()), WechatAppletUser::getOpenid, query.getOpenid())
+            .like(Objects.nonNull(query.getPhoneNumber()), WechatAppletUser::getPhoneNumber, query.getPhoneNumber()));
+
+        return PageResponse.of(BeanCopyUtils.copyList(page.getRecords(), WechatAppletUserDto.class), (int) page.getTotal(), query.getPageSize(), query.getPageIndex());
+    }
+}

+ 142 - 0
smsb-customer-manager-app/src/main/java/com/inspur/customer/utils/BeanCopyUtils.java

@@ -0,0 +1,142 @@
+package com.inspur.customer.utils;
+
+import com.google.common.collect.Lists;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.BeanUtils;
+import org.springframework.util.Assert;
+import org.springframework.util.CollectionUtils;
+
+import java.util.*;
+import java.util.function.BiConsumer;
+import java.util.function.Function;
+
+/**
+ * @author zengweijie
+ * @version 1.0
+ * @date 2022/9/20 13:51
+ **/
+@Slf4j
+public class BeanCopyUtils {
+    private BeanCopyUtils() {
+    }
+
+    public static <T, S> List<S> copyList(List<T> fromList, Class<S> toObj) {
+        return copyList(fromList, toObj, null);
+    }
+
+    public static <T, S> List<S> copyList(List<T> fromList, Class<S> toObj, BiConsumer<T, S> afterPropertyCopied) {
+        if (CollectionUtils.isEmpty(fromList)) {
+            return Collections.emptyList();
+        }
+        if (null == toObj) {
+            log.error("Utils-->copyList:toObj is null");
+            return Collections.emptyList();
+        }
+        List<S> toList = Lists.newArrayListWithCapacity(fromList.size());
+        fromList.forEach(f -> {
+            S t;
+            try {
+                t = toObj.getDeclaredConstructor().newInstance();
+            } catch (Exception e) {
+                log.error(e.getMessage(), e);
+                return;
+            }
+            BeanUtils.copyProperties(f, t);
+            toList.add(t);
+            Optional.ofNullable(afterPropertyCopied).ifPresent(c -> c.accept(f, t));
+        });
+        return toList;
+    }
+
+    public static <T, S> S copy(T t, Class<S> toObj) {
+        return copy(t, toObj, null);
+    }
+
+    public static <T, S> S copy(T t, Class<S> toObj, BiConsumer<T, S> afterPropertyCopied) {
+        Assert.notNull(toObj, "Utils-->copy:toObj is null");
+        try {
+            S s = toObj.getDeclaredConstructor().newInstance();
+            if (Objects.nonNull(t)) {
+                BeanUtils.copyProperties(t, s);
+            }
+            Optional.ofNullable(afterPropertyCopied).ifPresent(c -> c.accept(t, s));
+            return s;
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
+            throw new RuntimeException(e);// NOSONAR
+        }
+    }
+
+    public static <T, S> S copyIfNotNull(T t, Class<S> toObj) {
+        if (Objects.isNull(t)) {
+            return null;
+        }
+        return copy(t, toObj);
+    }
+
+    /**
+     * 从哈希表中获取指定键列表对应的值列表,并将列表元素转换为指定的目标类型
+     *
+     * @param keyList 键列表
+     * @param map     哈希表
+     * @param toObj   指定的目标类型反射
+     * @param <T>     值类型
+     * @param <S>     指定目标类型
+     * @param <K>     键类型
+     * @return 哈希表中对应键集的成员集
+     */
+    public static <T, S, K> List<S> getFromMap(List<K> keyList, Map<K, T> map, Class<S> toObj) {
+        return getFromMap(keyList, t -> t, map, toObj, null);
+    }
+
+    @Data
+    @Builder
+    @AllArgsConstructor
+    @NoArgsConstructor
+    public static class Entry<K, T> {
+        private K key;
+        private T value;
+    }
+
+    public static <T, S, K, V> List<S> getFromMap(List<K> keyList, Function<K, V> keyConverter, Map<V, T> map, Class<S> toObj, BiConsumer<Entry<K, T>, S> afterPropertyCopied) {
+        return getFromMap(keyList, keyConverter, map, toObj, afterPropertyCopied, null);
+    }
+
+    public static <T, S, K, V> List<S> getFromMap(List<K> keyList, Function<K, V> keyConverter, Map<V, T> map, Class<S> toObj
+        , BiConsumer<Entry<K, T>, S> afterPropertyCopied, BiConsumer<K, List<S>> onValueNotExists) {
+
+        if (CollectionUtils.isEmpty(keyList)) {
+            return Collections.emptyList();
+        }
+
+        if (null == toObj) {
+            log.error("Utils-->copyList:toObj is null");
+            return Collections.emptyList();
+        }
+
+        List<S> toList = Lists.newArrayListWithCapacity(keyList.size());
+
+        keyList.forEach(key -> {
+            S s;
+
+            try {
+                s = toObj.getDeclaredConstructor().newInstance();
+            } catch (Exception e) {
+                log.error(e.getMessage(), e);
+                return;
+            }
+
+            Optional.ofNullable(map.get(keyConverter.apply(key))).ifPresentOrElse(value -> {
+                BeanUtils.copyProperties(value, s);
+                Optional.ofNullable(afterPropertyCopied).ifPresent(c -> c.accept(Entry.<K, T>builder().key(key).value(value).build(), s));
+                toList.add(s);
+            }, () -> Optional.ofNullable(onValueNotExists).ifPresent(kListBiConsumer -> kListBiConsumer.accept(key, toList)));
+        });
+
+        return toList;
+    }
+}

+ 19 - 0
smsb-customer-manager-client/src/main/java/com/inspur/customer/client/wechat/IWechatAppletUserService.java

@@ -0,0 +1,19 @@
+package com.inspur.customer.client.wechat;
+
+import com.alibaba.cola.dto.PageResponse;
+import com.inspur.customer.object.wechat.WechatAppletUserDto;
+import com.inspur.customer.search.wechat.WechatAppletUserQuery;
+
+/**
+ * @author zengweijie
+ * @version 1.0
+ * @date 2022/11/8 14:13
+ **/
+public interface IWechatAppletUserService {
+
+    void change(WechatAppletUserDto dto);
+
+    WechatAppletUserDto queryOne(WechatAppletUserQuery query);
+
+    PageResponse<WechatAppletUserDto> queryPage(WechatAppletUserQuery query);
+}

+ 26 - 0
smsb-customer-manager-client/src/main/java/com/inspur/customer/object/wechat/WechatAppletUserDto.java

@@ -0,0 +1,26 @@
+package com.inspur.customer.object.wechat;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+
+/**
+ * @author zengweijie
+ * @version 1.0
+ * @date 2022/11/8 14:20
+ **/
+@Data
+@Builder
+@AllArgsConstructor
+@NoArgsConstructor
+public class WechatAppletUserDto implements Serializable {
+    private static final long serialVersionUID = -4789099819647373586L;
+    private Long id;
+
+    private String openid;
+
+    private String phoneNumber;
+}

+ 20 - 0
smsb-customer-manager-client/src/main/java/com/inspur/customer/search/wechat/WechatAppletUserQuery.java

@@ -0,0 +1,20 @@
+package com.inspur.customer.search.wechat;
+
+import com.alibaba.cola.dto.PageQuery;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * @author zengweijie
+ * @version 1.0
+ * @date 2022/11/8 14:31
+ **/
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class WechatAppletUserQuery extends PageQuery {
+    private static final long serialVersionUID = -5738131915725876985L;
+
+    private String openid;
+
+    private String phoneNumber;
+}

+ 14 - 0
smsb-customer-manager-infrastructure/src/main/java/com/inspur/customer/infrastructure/mapper/wechat/WechatAppletUserMapper.java

@@ -0,0 +1,14 @@
+package com.inspur.customer.infrastructure.mapper.wechat;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.inspur.customer.infrastructure.object.wechat.WechatAppletUser;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * @author zengweijie
+ * @version 1.0
+ * @date 2022/11/8 14:14
+ **/
+@Mapper
+public interface WechatAppletUserMapper extends BaseMapper<WechatAppletUser> {
+}

+ 28 - 0
smsb-customer-manager-infrastructure/src/main/java/com/inspur/customer/infrastructure/object/wechat/WechatAppletUser.java

@@ -0,0 +1,28 @@
+package com.inspur.customer.infrastructure.object.wechat;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * @author zengweijie
+ * @version 1.0
+ * @date 2022/11/8 13:42
+ **/
+@Data
+@TableName("wechat_applet_user")
+public class WechatAppletUser implements Serializable {
+    private static final long serialVersionUID = 2228544833202173914L;
+
+    @TableId(type = IdType.ASSIGN_ID)
+    private Long id;
+
+    private String openid;
+
+    @TableField("phone_number")
+    private String phoneNumber;
+}

+ 5 - 0
smsb-customer-manager-infrastructure/src/main/resources/mapper/wechat/WechatAppletUserMapper.xml

@@ -0,0 +1,5 @@
+<?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.inspur.customer.infrastructure.mapper.wechat.WechatAppletUserMapper">
+
+</mapper>