From c9ccc6c8880c975e9b5c7318aa6129617a60d678 Mon Sep 17 00:00:00 2001 From: lbw Date: Wed, 5 Jan 2022 22:43:58 +0800 Subject: [PATCH] =?UTF-8?q?:sparkles:=20Introducing=20new=20features.=20cl?= =?UTF-8?q?ose=20#3505=20=E3=80=90=E5=85=AC=E4=BC=97=E5=8F=B7=E3=80=91?= =?UTF-8?q?=E5=85=AC=E4=BC=97=E5=8F=B7=E6=94=AF=E6=8C=81=E6=9B=B4=E6=94=B9?= =?UTF-8?q?=E5=A4=87=E6=B3=A8=E5=8F=8A=E7=94=A8=E6=88=B7=E7=9A=84=E6=A0=87?= =?UTF-8?q?=E7=AD=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../handler/JsonLongArrayTypeHandler.java | 56 +++++++++++++ .../controller/WxAccountFansController.java | 17 +--- .../pigx/mp/entity/WxAccountFans.java | 5 ++ .../pigx/mp/entity/vo/WxAccountFansVo.java | 23 ++++++ .../pigx/mp/handler/SubscribeHandler.java | 1 + .../pigx/mp/service/WxAccountFansService.java | 17 ++++ .../impl/WxAccountFansServiceImpl.java | 82 +++++++++++++++++++ 7 files changed, 186 insertions(+), 15 deletions(-) create mode 100644 pigx-common/pigx-common-data/src/main/java/com/pig4cloud/pigx/common/data/handler/JsonLongArrayTypeHandler.java create mode 100644 pigx-visual/pigx-mp-platform/src/main/java/com/pig4cloud/pigx/mp/entity/vo/WxAccountFansVo.java diff --git a/pigx-common/pigx-common-data/src/main/java/com/pig4cloud/pigx/common/data/handler/JsonLongArrayTypeHandler.java b/pigx-common/pigx-common-data/src/main/java/com/pig4cloud/pigx/common/data/handler/JsonLongArrayTypeHandler.java new file mode 100644 index 000000000..fc0f7abc4 --- /dev/null +++ b/pigx-common/pigx-common-data/src/main/java/com/pig4cloud/pigx/common/data/handler/JsonLongArrayTypeHandler.java @@ -0,0 +1,56 @@ +package com.pig4cloud.pigx.common.data.handler; + +import cn.hutool.core.convert.Convert; +import cn.hutool.core.util.ArrayUtil; +import cn.hutool.core.util.StrUtil; +import lombok.SneakyThrows; +import org.apache.ibatis.type.BaseTypeHandler; +import org.apache.ibatis.type.JdbcType; +import org.apache.ibatis.type.MappedJdbcTypes; +import org.apache.ibatis.type.MappedTypes; + +import java.sql.CallableStatement; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; + +/** + * Mybatis数组,符串互转 + *

+ * MappedJdbcTypes 数据库中的数据类型 MappedTypes java中的的数据类型 + * + * @author xuzihui + * @date 2019-11-20 + */ +@MappedTypes(value = { Long[].class }) +@MappedJdbcTypes(value = JdbcType.VARCHAR) +public class JsonLongArrayTypeHandler extends BaseTypeHandler { + + @Override + public void setNonNullParameter(PreparedStatement ps, int i, Long[] parameter, JdbcType jdbcType) + throws SQLException { + ps.setString(i, ArrayUtil.join(parameter, StrUtil.COMMA)); + } + + @Override + @SneakyThrows + public Long[] getNullableResult(ResultSet rs, String columnName) { + String reString = rs.getString(columnName); + return Convert.toLongArray(reString); + } + + @Override + @SneakyThrows + public Long[] getNullableResult(ResultSet rs, int columnIndex) { + String reString = rs.getString(columnIndex); + return Convert.toLongArray(reString); + } + + @Override + @SneakyThrows + public Long[] getNullableResult(CallableStatement cs, int columnIndex) { + String reString = cs.getString(columnIndex); + return Convert.toLongArray(reString); + } + +} diff --git a/pigx-visual/pigx-mp-platform/src/main/java/com/pig4cloud/pigx/mp/controller/WxAccountFansController.java b/pigx-visual/pigx-mp-platform/src/main/java/com/pig4cloud/pigx/mp/controller/WxAccountFansController.java index 8733e7251..7371f689d 100755 --- a/pigx-visual/pigx-mp-platform/src/main/java/com/pig4cloud/pigx/mp/controller/WxAccountFansController.java +++ b/pigx-visual/pigx-mp-platform/src/main/java/com/pig4cloud/pigx/mp/controller/WxAccountFansController.java @@ -16,7 +16,6 @@ */ package com.pig4cloud.pigx.mp.controller; -import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.pig4cloud.pigx.common.core.util.R; import com.pig4cloud.pigx.common.log.annotation.SysLog; @@ -47,7 +46,7 @@ public class WxAccountFansController { */ @GetMapping("/page") public R getWxAccountFansPage(Page page, WxAccountFans wxAccountFans) { - return R.ok(wxAccountFansService.page(page, Wrappers.query(wxAccountFans))); + return R.ok(wxAccountFansService.getFansWithTagPage(page, wxAccountFans)); } /** @@ -60,18 +59,6 @@ public class WxAccountFansController { return R.ok(wxAccountFansService.getById(id)); } - /** - * 新增微信公众号粉丝 - * @param wxAccountFans 微信公众号粉丝 - * @return R - */ - @SysLog("新增微信公众号粉丝") - @PostMapping - @PreAuthorize("@pms.hasPermission('mp_wxaccountfans_add')") - public R save(@RequestBody WxAccountFans wxAccountFans) { - return R.ok(wxAccountFansService.save(wxAccountFans)); - } - /** * 修改微信公众号粉丝 * @param wxAccountFans 微信公众号粉丝 @@ -81,7 +68,7 @@ public class WxAccountFansController { @PutMapping @PreAuthorize("@pms.hasPermission('mp_wxaccountfans_edit')") public R updateById(@RequestBody WxAccountFans wxAccountFans) { - return R.ok(wxAccountFansService.updateById(wxAccountFans)); + return R.ok(wxAccountFansService.updateFans(wxAccountFans)); } /** diff --git a/pigx-visual/pigx-mp-platform/src/main/java/com/pig4cloud/pigx/mp/entity/WxAccountFans.java b/pigx-visual/pigx-mp-platform/src/main/java/com/pig4cloud/pigx/mp/entity/WxAccountFans.java index f09226a46..bec95ec00 100755 --- a/pigx-visual/pigx-mp-platform/src/main/java/com/pig4cloud/pigx/mp/entity/WxAccountFans.java +++ b/pigx-visual/pigx-mp-platform/src/main/java/com/pig4cloud/pigx/mp/entity/WxAccountFans.java @@ -111,6 +111,11 @@ public class WxAccountFans extends Model { */ private String wxAccountName; + /** + * 标签ID列表 + */ + private Long[] tagIds; + /** * 创建时间 */ diff --git a/pigx-visual/pigx-mp-platform/src/main/java/com/pig4cloud/pigx/mp/entity/vo/WxAccountFansVo.java b/pigx-visual/pigx-mp-platform/src/main/java/com/pig4cloud/pigx/mp/entity/vo/WxAccountFansVo.java new file mode 100644 index 000000000..bff77adc0 --- /dev/null +++ b/pigx-visual/pigx-mp-platform/src/main/java/com/pig4cloud/pigx/mp/entity/vo/WxAccountFansVo.java @@ -0,0 +1,23 @@ +package com.pig4cloud.pigx.mp.entity.vo; + +import com.pig4cloud.pigx.mp.entity.WxAccountFans; +import com.pig4cloud.pigx.mp.entity.WxAccountTag; +import lombok.Data; + +import java.util.List; + +/** + * 粉丝Vo 对象 + * + * @author lengleng + * @date 2022/1/5 + */ +@Data +public class WxAccountFansVo extends WxAccountFans { + + /** + * 标签名称列表 + */ + private List tagList; + +} diff --git a/pigx-visual/pigx-mp-platform/src/main/java/com/pig4cloud/pigx/mp/handler/SubscribeHandler.java b/pigx-visual/pigx-mp-platform/src/main/java/com/pig4cloud/pigx/mp/handler/SubscribeHandler.java index 05fb4487b..c5ec6dcc1 100755 --- a/pigx-visual/pigx-mp-platform/src/main/java/com/pig4cloud/pigx/mp/handler/SubscribeHandler.java +++ b/pigx-visual/pigx-mp-platform/src/main/java/com/pig4cloud/pigx/mp/handler/SubscribeHandler.java @@ -75,6 +75,7 @@ public class SubscribeHandler extends AbstractHandler { wxAccountFans.setLanguage(wxMpUser.getLanguage()); wxAccountFans.setHeadimgUrl(wxMpUser.getHeadImgUrl()); wxAccountFans.setRemark(wxMpUser.getRemark()); + wxAccountFans.setTagIds(wxAccountFans.getTagIds()); WxAccount wxAccount = wxAccountMapper .selectOne(Wrappers.lambdaQuery().eq(WxAccount::getAppid, WxMpContextHolder.getAppId())); diff --git a/pigx-visual/pigx-mp-platform/src/main/java/com/pig4cloud/pigx/mp/service/WxAccountFansService.java b/pigx-visual/pigx-mp-platform/src/main/java/com/pig4cloud/pigx/mp/service/WxAccountFansService.java index d855f560f..bca5e497c 100755 --- a/pigx-visual/pigx-mp-platform/src/main/java/com/pig4cloud/pigx/mp/service/WxAccountFansService.java +++ b/pigx-visual/pigx-mp-platform/src/main/java/com/pig4cloud/pigx/mp/service/WxAccountFansService.java @@ -16,6 +16,8 @@ */ package com.pig4cloud.pigx.mp.service; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; import com.pig4cloud.pigx.mp.entity.WxAccountFans; @@ -34,4 +36,19 @@ public interface WxAccountFansService extends IService { */ Boolean syncAccountFans(String appId); + /** + * 分页查询粉丝 + * @param page 粉丝 + * @param wxAccountFans 查询条件 + * @return + */ + IPage getFansWithTagPage(Page page, WxAccountFans wxAccountFans); + + /** + * 更新粉丝信息 + * @param wxAccountFans 信息 + * @return + */ + Boolean updateFans(WxAccountFans wxAccountFans); + } diff --git a/pigx-visual/pigx-mp-platform/src/main/java/com/pig4cloud/pigx/mp/service/impl/WxAccountFansServiceImpl.java b/pigx-visual/pigx-mp-platform/src/main/java/com/pig4cloud/pigx/mp/service/impl/WxAccountFansServiceImpl.java index f145ce585..8c7435095 100755 --- a/pigx-visual/pigx-mp-platform/src/main/java/com/pig4cloud/pigx/mp/service/impl/WxAccountFansServiceImpl.java +++ b/pigx-visual/pigx-mp-platform/src/main/java/com/pig4cloud/pigx/mp/service/impl/WxAccountFansServiceImpl.java @@ -18,9 +18,11 @@ package com.pig4cloud.pigx.mp.service.impl; import cn.binarywang.tools.generator.ChineseNameGenerator; import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ArrayUtil; import cn.hutool.core.util.BooleanUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @@ -28,17 +30,24 @@ import com.pig4cloud.pigx.common.data.tenant.TenantBroker; import com.pig4cloud.pigx.mp.config.WxMpInitConfigRunner; import com.pig4cloud.pigx.mp.entity.WxAccount; import com.pig4cloud.pigx.mp.entity.WxAccountFans; +import com.pig4cloud.pigx.mp.entity.WxAccountTag; +import com.pig4cloud.pigx.mp.entity.vo.WxAccountFansVo; import com.pig4cloud.pigx.mp.mapper.WxAccountFansMapper; import com.pig4cloud.pigx.mp.mapper.WxAccountMapper; +import com.pig4cloud.pigx.mp.mapper.WxAccountTagMapper; import com.pig4cloud.pigx.mp.service.WxAccountFansService; import lombok.AllArgsConstructor; +import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; import me.chanjar.weixin.mp.api.WxMpService; import me.chanjar.weixin.mp.api.WxMpUserService; +import me.chanjar.weixin.mp.api.WxMpUserTagService; import me.chanjar.weixin.mp.bean.result.WxMpUser; import me.chanjar.weixin.mp.bean.result.WxMpUserList; +import org.springframework.beans.BeanUtils; import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import java.time.Instant; import java.time.LocalDateTime; @@ -61,8 +70,80 @@ public class WxAccountFansServiceImpl extends ServiceImpl wxAccountTags = wxAccountTagMapper.selectList(Wrappers.emptyWrapper()); + + // 翻页查询粉丝 + IPage fansPage = baseMapper.selectPage(page, Wrappers.query(wxAccountFans)); + List voList = fansPage.getRecords().stream().map(fans -> {// + WxAccountFansVo vo = new WxAccountFansVo(); + BeanUtils.copyProperties(fans, vo); + // 赋值 TAG_NAME + if (ArrayUtil.isNotEmpty(fans.getTagIds())) { + List tagList = wxAccountTags.stream() + .filter(tag -> tag.getWxAccountAppid().endsWith(fans.getWxAccountAppid()) // + && ArrayUtil.contains(fans.getTagIds(), tag.getTagId())) + .collect(Collectors.toList()); + vo.setTagList(tagList); + } + return vo; + }).collect(Collectors.toList()); + + page.setRecords(voList); + page.setTotal(fansPage.getTotal()); + return page; + } + + /** + * 更新粉丝信息 + * @param wxAccountFans 信息 + * @return + */ + @Override + @SneakyThrows + @Transactional(rollbackFor = Exception.class) + public Boolean updateFans(WxAccountFans wxAccountFans) { + baseMapper.updateById(wxAccountFans); + + // 获取操作微信接口类 + WxMpService wxMpService = WxMpInitConfigRunner.getMpServices().get(wxAccountFans.getWxAccountAppid()); + + if (StrUtil.isNotBlank(wxAccountFans.getRemark())) { + WxMpUserService wxMpUserService = wxMpService.getUserService(); + wxMpUserService.userUpdateRemark(wxAccountFans.getOpenid(), wxAccountFans.getRemark()); + + } + + // 更新用户标签 + WxMpUserTagService userTagService = wxMpService.getUserTagService(); + if (ArrayUtil.isNotEmpty(wxAccountFans.getTagIds())) { + // 移除原有标签 + List oldTag = userTagService.userTagList(wxAccountFans.getOpenid()); + for (Long tagId : oldTag) { + userTagService.batchUntagging(tagId, new String[] { wxAccountFans.getOpenid() }); + } + + // 添加新标签 + for (Long tagId : wxAccountFans.getTagIds()) { + + userTagService.batchTagging(tagId, new String[] { wxAccountFans.getOpenid() }); + } + } + return Boolean.TRUE; + } + /** * 获取公众号粉丝,生产建议异步 * @param appId @@ -145,6 +226,7 @@ public class WxAccountFansServiceImpl extends ServiceImpl