Ver código fonte

fix 账号批量修改密码

zoujiajian 3 anos atrás
pai
commit
c42d70cbcd

+ 1 - 0
netflix-common/src/main/java/com/cyksj/common/constant/TemplateEnum.java

@@ -20,6 +20,7 @@ public enum TemplateEnum {
 	EMPTY_PRD_TEMPLATE("正式环境空车位通知模板", "T88yYYsfhBIKALWGmGTY2ZJGWHx91pcAtinoRGZ0krw", " "),
 	SPOTIFY_ENV_TEMPLATE("Spotify注册测试环境模板", "gsGFRefPlGKfvNoqB5Vd43ZOsmCsZNsH4UDWefWG0sg", " "),
 	SPOTIFY_PRD_TEMPLATE("Spotify注册正式环境模板", "VPQ3cYd_OMYpyHzyaa1X5oOeWh9ZcgwZlrBw_cGqEIA", " "),
+	PLAT_ACCOUNT_UPDATE_PRD_TEMPLATE("账号修改密码正式环境通知模板", "gJI4NwaTF4Xljq0ry_vg_-P_e1cMbnoM8KhGgepW-GM", " "),
 
 	;
 	private String desc;

+ 26 - 0
netflix-dao/src/main/java/com/cyksj/model/excel/ExcelAccountTemplateData.java

@@ -0,0 +1,26 @@
+package com.cyksj.model.excel;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.Date;
+
+/*
+ *项目名: netflix
+ *文件名: ExcelAccountTemplateData
+ *创建者: JavaZou
+ *创建时间:2022/12/27 14:10
+ */
+@Getter
+@Setter
+public class ExcelAccountTemplateData {
+	@ExcelProperty("账号")
+	private String account;
+
+	@ExcelProperty("密码")
+	private String password;
+
+	@ExcelProperty("续费时间")
+	private Date expiryTime;
+}

+ 48 - 0
netflix-dao/src/main/java/com/cyksj/model/excel/ExcelManageAccountData.java

@@ -0,0 +1,48 @@
+package com.cyksj.model.excel;
+
+import com.alibaba.excel.annotation.ExcelIgnore;
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.ejlchina.searcher.bean.DbField;
+import com.ejlchina.searcher.bean.SearchBean;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.Date;
+
+/*
+ *项目名: netflix
+ *文件名: ExcelManageAccountData
+ *创建者: JavaZou
+ *创建时间:2022/12/27 13:59
+ */
+@Getter
+@Setter
+@SearchBean(tables = "account a left join goods_don g on a.goods_id = g.id " +
+		"left join groups_trips gt on gt.account_id = a.id " +
+		"left join goods_don_sku gdk on gdk.id = gt.sku_id")
+public class ExcelManageAccountData {
+
+	@ExcelIgnore
+	@DbField("a.id")
+	private Long id;
+
+	@ExcelProperty("平台")
+	@DbField("g.title")
+	private String title;
+
+	@ExcelProperty("规格")
+	@DbField("gdk.spec_val")
+	private String specVal;
+
+	@ExcelProperty("账号")
+	@DbField("a.account")
+	private String account;
+
+	@ExcelProperty("密码")
+	@DbField("a.password")
+	private String password;
+
+	@ExcelProperty("到期时间")
+	@DbField("a.expiry_time")
+	private Date expiryTime;
+}

+ 8 - 1
netflix-dao/src/main/java/com/cyksj/model/manage/views/AccountView.java

@@ -16,7 +16,8 @@ import java.util.Date;
 @Getter
 @Setter
 @SearchBean(tables = "account a left join goods_don g on a.goods_id = g.id " +
-        "left join groups_trips gt on gt.account_id = a.id")
+        "left join groups_trips gt on gt.account_id = a.id " +
+        "left join goods_don_sku gdk on gdk.id = gt.sku_id")
 public class AccountView {
 
     @DbField("a.id")
@@ -70,4 +71,10 @@ public class AccountView {
     @DbField("a.remark")
     private String remark;
 
+    /**
+     * 规格
+     */
+    @DbField("gdk.spec_val")
+    private String specVal;
+
 }

+ 5 - 0
netflix-dao/src/main/java/com/cyksj/model/manage/views/GroupsRelationView.java

@@ -3,6 +3,7 @@ package com.cyksj.model.manage.views;
 import com.cyksj.model.entity.GroupsRelation;
 import com.ejlchina.searcher.bean.DbField;
 import com.ejlchina.searcher.bean.SearchBean;
+import com.fasterxml.jackson.annotation.JsonIgnore;
 import lombok.Getter;
 import lombok.Setter;
 
@@ -22,6 +23,10 @@ public class GroupsRelationView {
     @DbField("gr.id")
     private Long id;
 
+    @DbField("gt.account_id")
+    @JsonIgnore
+    private Long accountId;
+
     @DbField("g.id")
     private Long goodsId;
 

+ 2 - 0
netflix-service/src/main/java/com/cyksj/service/mange/CmsAccountService.java

@@ -22,4 +22,6 @@ public interface CmsAccountService extends IService<Account> {
 	List<OrderDon> getNoAppleOneOrderDon(List<Long> skuIds, Date yesZeroDate, Date thisZeroDate, List<String> noOrderStatus);
 
 	List<ExcelAccountData> getExpiredAccountViewNoPage(Integer goodsId, String account, Boolean renewStatus, Boolean handleStatus, String cnAccount, String usAccount, Integer userId, String startDate, String endDate, String toString);
+
+	void sendAccountTemplateMsg(Account account) throws Exception;
 }

+ 49 - 0
netflix-service/src/main/java/com/cyksj/service/mange/account/CmsAccountServiceImpl.java

@@ -1,14 +1,27 @@
 package com.cyksj.service.mange.account;
 
+import cn.hutool.core.date.DateTime;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.cyksj.common.EnvCommonService;
+import com.cyksj.common.constant.TemplateEnum;
+import com.cyksj.common.util.Jsons;
 import com.cyksj.mapper.AccountMapper;
+import com.cyksj.mapper.UserMapper;
+import com.cyksj.model.dto.WxMpTemplateData;
+import com.cyksj.model.dto.WxMpTemplateMessage;
 import com.cyksj.model.entity.Account;
 import com.cyksj.model.entity.OrderDon;
+import com.cyksj.model.entity.User;
 import com.cyksj.model.excel.ExcelAccountData;
+import com.cyksj.model.manage.views.GroupsRelationView;
 import com.cyksj.model.views.ExpiredAccountDataView;
 import com.cyksj.service.mange.CmsAccountService;
+import com.cyksj.service.wechat.WeChatService;
+import com.ejlchina.searcher.BeanSearcher;
+import com.ejlchina.searcher.param.Operator;
+import com.ejlchina.searcher.util.MapUtils;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
@@ -26,6 +39,14 @@ import java.util.List;
 public class CmsAccountServiceImpl extends ServiceImpl<AccountMapper, Account> implements CmsAccountService {
 	private final AccountMapper accountMapper;
 
+	private final WeChatService weChatService;
+
+	private final BeanSearcher beanSearcher;
+
+	private final EnvCommonService envCommonService;
+
+	private final UserMapper userMapper;
+
 	@Override
 	public IPage<ExpiredAccountDataView> getExpiredAccountView(Integer goodsId, String account, Boolean renewStatus, Boolean handleStatus, String cnAccount, String usAccount, Integer userId, String startTime, String endTime, String now, Long offset, Long limit) {
 		return accountMapper.getExpiredAccountView(goodsId, account, renewStatus, handleStatus, cnAccount, usAccount, userId, startTime, endTime, now, new Page<>(offset, limit));
@@ -36,6 +57,34 @@ public class CmsAccountServiceImpl extends ServiceImpl<AccountMapper, Account> i
 		return accountMapper.getExpiredAccountViewNoPage(goodsId, account, renewStatus, handleStatus, cnAccount, usAccount, userId, startTime, endTime, now);
 	}
 
+	@Override
+	public void sendAccountTemplateMsg(Account account) throws Exception {
+		List<GroupsRelationView> relations = beanSearcher.searchList(GroupsRelationView.class, MapUtils.builder()
+				.field(GroupsRelationView::getAccountId, account.getId()).op(Operator.Equal)
+				.field(GroupsRelationView::getStatus, "validity").op(Operator.Equal)
+				.build());
+		String url = String.format("%sauth/weChat?url=%syinhe/web/mine", envCommonService.getHost(), envCommonService.getDomain());
+		log.info("开始发送账号修改密码模板消息,大小:{}", relations.size());
+		for (GroupsRelationView relation : relations) {
+			TemplateEnum templateEnum = TemplateEnum.PLAT_ACCOUNT_UPDATE_PRD_TEMPLATE;
+			User user = userMapper.selectById(relation.getUserId());
+			if (user != null) {
+				WxMpTemplateMessage templateMessage = new WxMpTemplateMessage()
+						.setToUser(user.getOpenId())
+						.setTemplateId(templateEnum.getTemplateId())
+						.setUrl(url);
+				WxMpTemplateMessage.TemplateData data = templateMessage.getData();
+				data.setFirst(new WxMpTemplateData("Netflix账号密码更改提醒"));
+				data.setKeyword1(new WxMpTemplateData("工单提醒"));
+				data.setKeyword2(new WxMpTemplateData("修改完成"));
+				data.setKeyword3(new WxMpTemplateData(DateTime.now().toString("YYYY-MM-mm HH:mm:ss")));
+				data.setKeyword4(new WxMpTemplateData("您好,您的账号密码已经更新,请到我的车票查看,长期用户请选择拼车/年付"));
+				data.setRemark(new WxMpTemplateData("点击查看我的车票,如您不是在公众号购买,请在浏览器登录查看我的车票"));
+				weChatService.sendTemplateMessage(weChatService.getAccessToken(), Jsons.toJson(templateMessage));
+			}
+		}
+	}
+
 	@Override
 	public List<Account> getNoAppleOneAccount(String appleOne) {
 		return accountMapper.getNoAppleOneAccount(appleOne);

+ 78 - 0
netflix-web/src/main/java/com/cyksj/web/controller/manage/account/CmsAccountController.java

@@ -3,7 +3,12 @@ package com.cyksj.web.controller.manage.account;
 import cn.hutool.core.date.DateTime;
 import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.util.StrUtil;
+import com.alibaba.excel.EasyExcel;
+import com.alibaba.excel.context.AnalysisContext;
+import com.alibaba.excel.event.AnalysisEventListener;
+import com.alibaba.excel.support.ExcelTypeEnum;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.cyksj.common.exception.BusinessRuntimeException;
 import com.cyksj.dto.Result;
 import com.cyksj.enums.GatewayResponse;
 import com.cyksj.mapper.GroupsMapper;
@@ -11,20 +16,26 @@ import com.cyksj.mapper.HomeGroupMapper;
 import com.cyksj.model.entity.Account;
 import com.cyksj.model.entity.GroupsTrips;
 import com.cyksj.model.entity.HomeGroup;
+import com.cyksj.model.excel.ExcelAccountTemplateData;
+import com.cyksj.model.excel.ExcelManageAccountData;
 import com.cyksj.model.manage.request.ReqAccountIncrExpiryTime;
 import com.cyksj.model.manage.views.AccountView;
 import com.cyksj.service.mange.CmsAccountService;
+import com.cyksj.web.util.EasyExcelUtils;
 import com.ejlchina.searcher.BeanSearcher;
 import com.ejlchina.searcher.SearchResult;
 import com.ejlchina.searcher.param.Operator;
 import com.ejlchina.searcher.util.MapBuilder;
 import com.ejlchina.searcher.util.MapUtils;
 import lombok.RequiredArgsConstructor;
+import lombok.SneakyThrows;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
 
 import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
 import java.util.List;
 
 /**
@@ -77,6 +88,73 @@ public class CmsAccountController {
         return GatewayResponse.SUCCESS.newBuilder().toResult(search);
     }
 
+    /**
+     * 导出账号
+     */
+    @GetMapping("/export/account")
+    public void exportAccount(Long userId, String nickName, String submitAccount, String expiryStartTime, String expiryEndTime, HttpServletResponse response) {
+        MapBuilder mapBuilder = MapUtils.flatBuilder(request.getParameterMap());
+        if (StrUtil.isNotEmpty(expiryStartTime) || StrUtil.isNotEmpty(expiryEndTime)) {
+            mapBuilder.field(AccountView::getExpiryTime, expiryStartTime, expiryEndTime)
+                    .op(Operator.Between);
+        }
+
+        if (userId != null || StringUtils.isNotBlank(nickName) || StringUtils.isNotBlank(submitAccount)) {
+            List<Long> accountIds = homeGroupMapper.getAccountIdsByUserIdOrNickNameOrSubmitAccount(userId, nickName, submitAccount);
+            if (accountIds.isEmpty()) {
+                throw BusinessRuntimeException.getInstance("暂无数据!");
+            }
+
+            mapBuilder.field(AccountView::getId, accountIds).op(Operator.InList);
+        }
+        List<ExcelManageAccountData> list = beanSearcher.searchAll(ExcelManageAccountData.class, mapBuilder.build());
+
+        EasyExcelUtils.createExcelStreamMutilByEasyExcel(response, ExcelManageAccountData.class, list, "账号列表", "账号列表", ExcelTypeEnum.XLSX, null);
+    }
+
+    /**
+     * 下载导入模板
+     */
+    @GetMapping("/get/account/template")
+    public void getAccountTemplate(HttpServletResponse response) {
+        EasyExcelUtils.createTemplateExcel(response, ExcelAccountTemplateData.class, "账号导入模板", "账号导入模板", ExcelTypeEnum.XLSX, null);
+    }
+
+    /**
+     * 导入账号,修改密码
+     */
+    @PostMapping("/import/account")
+    public Result<String> importAccount(Long goodsId, MultipartFile file) throws Exception {
+        EasyExcel.read(file.getInputStream(), ExcelAccountTemplateData.class, new AnalysisEventListener<ExcelAccountTemplateData>() {
+            @SneakyThrows
+            @Override
+            public void invoke(ExcelAccountTemplateData data, AnalysisContext analysisContext) {
+                if (StrUtil.isNotBlank(data.getAccount())) {
+                    Account account = accountService.getOne(Wrappers.lambdaQuery(Account.class)
+                            .eq(Account::getGoodsId, goodsId)
+                            .eq(Account::getAccount, data.getAccount()));
+                    if (account != null) {
+                        if (StrUtil.isNotBlank(data.getPassword()) && !data.getPassword().equals(account.getPassword())) {
+                            account.setPassword(data.getPassword());
+                            if (data.getExpiryTime() != null) {
+                                account.setExpiryTime(data.getExpiryTime());
+                            }
+                            accountService.updateById(account);
+                            //发放模板消息
+                            accountService.sendAccountTemplateMsg(account);
+                        }
+                    }
+                }
+            }
+
+            @Override
+            public void doAfterAllAnalysed(AnalysisContext analysisContext) {
+
+            }
+        }).sheet().doRead();
+        return GatewayResponse.SUCCESS.newBuilder().toResult("导入成功");
+    }
+
     @PostMapping("/post")
     public Result<String> add(@RequestBody Account account){
         accountService.save(account);