Răsfoiți Sursa

Merge branch 'auto_update_account'

# Conflicts:
#	netflix-service/src/main/java/com/cyksj/service/mange/CmsAccountService.java
#	netflix-service/src/main/java/com/cyksj/service/mange/account/CmsAccountServiceImpl.java
#	netflix-web/src/main/java/com/cyksj/config/SaTokenConfigure.java
#	netflix-web/src/main/java/com/cyksj/web/controller/manage/account/CmsAccountController.java
zoujiajian 3 ani în urmă
părinte
comite
666b56a6dd

+ 13 - 0
netflix-dao/src/main/java/com/cyksj/mapper/manage/AutoUpdateAccountPwdLogMapper.java

@@ -0,0 +1,13 @@
+package com.cyksj.mapper.manage;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.cyksj.model.entity.AutoUpdateAccountPwdLog;
+
+/*
+ *项目名: netflix
+ *文件名: AutoUpdateAccountPwdLogMapper
+ *创建者: JavaZou
+ *创建时间:2023/3/31 16:57
+ */
+public interface AutoUpdateAccountPwdLogMapper extends BaseMapper<AutoUpdateAccountPwdLog> {
+}

+ 26 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/AutoUpdateAccountPwdLog.java

@@ -0,0 +1,26 @@
+package com.cyksj.model.entity;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/*
+ *项目名: netflix
+ *文件名: AutoUpdateAccountPwdLog
+ *创建者: JavaZou
+ *创建时间:2023/3/31 16:56
+ */
+@Getter
+@Setter
+public class AutoUpdateAccountPwdLog extends BaseEntity{
+	private Long accountId;
+
+	private String account;
+
+	private String oldPwd;
+
+	private String newPwd;
+
+	private String operateLocation;
+
+	private String operateIp;
+}

+ 66 - 0
netflix-dao/src/main/java/com/cyksj/model/response/ExpiredAccountRep.java

@@ -0,0 +1,66 @@
+package com.cyksj.model.response;
+
+import com.ejlchina.searcher.bean.DbField;
+import com.ejlchina.searcher.bean.DbIgnore;
+import com.ejlchina.searcher.bean.SearchBean;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.Date;
+
+/*
+ *项目名: netflix
+ *文件名: ExpiredAccountRep
+ *创建者: JavaZou
+ *创建时间:2023/2/16 15:14
+ */
+@Getter
+@Setter
+@SearchBean(tables = "groups_relation gr left join groups_trips gt on gt.id = gr.groups_id" +
+		" left join account a on a.id = gt.account_id",
+		where = "gr.status = 'validity'")
+public class ExpiredAccountRep {
+	/**
+	 * 账号id
+	 */
+	@DbField("a.id")
+	private Long accountId;
+
+	/**
+	 * 账号
+	 */
+	@DbField("a.account")
+	private String account;
+
+	/**
+	 * 密码
+	 */
+	@DbField("a.password")
+	private String password;
+
+	/**
+	 * 用户id
+	 */
+	@DbField("gr.user_id")
+	@JsonIgnore
+	private Long userId;
+
+	/**
+	 * 用户昵称
+	 */
+	@DbIgnore
+	private String nickname;
+
+	/**
+	 * 座位位置
+	 */
+	@DbField("gr.num")
+	private Integer num;
+
+	/**
+	 * 过期时间
+	 */
+	@DbField("gr.expiry_time")
+	private Date expiredTime;
+}

+ 68 - 0
netflix-dao/src/main/java/com/cyksj/model/response/OrderDonAccountRep.java

@@ -0,0 +1,68 @@
+package com.cyksj.model.response;
+
+import com.ejlchina.searcher.bean.DbField;
+import com.ejlchina.searcher.bean.DbIgnore;
+import com.ejlchina.searcher.bean.SearchBean;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.Date;
+
+/*
+ *项目名: netflix
+ *文件名: OrderDonRep
+ *创建者: JavaZou
+ *创建时间:2023/2/16 14:57
+ */
+@Getter
+@Setter
+@SearchBean(tables = "order_don od left join groups_relation gr on gr.id = od.relation_id" +
+		" left join groups_trips gt on gt.id = gr.groups_id" +
+		" left join account a on a.id = gt.account_id",
+		where = ":time: and od.status not in ('close','noPayment','refund')" +
+				" and gr.status = 'validity' and gr.expiry_time is not null")
+public class OrderDonAccountRep {
+	/**
+	 * 账号id
+	 */
+	@DbField("a.id")
+	private Long accountId;
+
+	/**
+	 * 账号
+	 */
+	@DbField("a.account")
+	private String account;
+
+	/**
+	 * 密码
+	 */
+	@DbField("a.password")
+	private String password;
+
+	/**
+	 * 用户id
+	 */
+	@DbField("gr.user_id")
+	@JsonIgnore
+	private Long userId;
+
+	/**
+	 * 用户昵称
+	 */
+	@DbIgnore
+	private String nickname;
+
+	/**
+	 * 座位位置
+	 */
+	@DbField("gr.num")
+	private Integer num;
+
+	/**
+	 * 过期时间
+	 */
+	@DbField("gr.expiry_time")
+	private Date expiredTime;
+}

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

@@ -33,4 +33,6 @@ public interface CmsAccountService extends IService<Account> {
 	 * 保存修改密码记录
 	 */
 	void saveRecord(Long operateUserId,Long accountId, String oldPassword, String newPassword, String type);
+
+	void recordAutoUpdatePwd(Long accountId, String account, String oldPwd, String newPwd, String operateIp);
 }

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

@@ -1,13 +1,19 @@
 package com.cyksj.service.mange.account;
 
+import cn.hutool.core.util.StrUtil;
+import cn.hutool.http.HttpUtil;
+import cn.hutool.json.JSONObject;
+import cn.hutool.json.JSONUtil;
 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.mapper.AccountMapper;
 import com.cyksj.mapper.AccountUpdatePasswordRecordMapper;
 import com.cyksj.mapper.manage.cms.CmsUserMapper;
+import com.cyksj.mapper.manage.AutoUpdateAccountPwdLogMapper;
 import com.cyksj.model.entity.Account;
 import com.cyksj.model.entity.AccountUpdatePasswordRecord;
+import com.cyksj.model.entity.AutoUpdateAccountPwdLog;
 import com.cyksj.model.entity.OrderDon;
 import com.cyksj.model.excel.ExcelAccountData;
 import com.cyksj.model.manage.views.AccountView;
@@ -35,6 +41,8 @@ public class CmsAccountServiceImpl extends ServiceImpl<AccountMapper, Account> i
 
 	private final CmsUserMapper cmsUserMapper;
 
+	private final AutoUpdateAccountPwdLogMapper autoUpdateAccountPwdLogMapper;
+
 	@Override
 	public IPage<ExpiredAccountDataView> getExpiredAccountView(Boolean isCorpWx, String customerService, Long goodsId, Long skuId, 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(isCorpWx, customerService, goodsId, skuId, account, renewStatus, handleStatus, cnAccount, usAccount, userId, startTime, endTime, now, new Page<>(offset, limit));
@@ -72,4 +80,38 @@ public class CmsAccountServiceImpl extends ServiceImpl<AccountMapper, Account> i
 		record.setType(type);
 		accountUpdatePasswordRecordMapper.insert(record);
 	}
+	@Override
+	public void recordAutoUpdatePwd(Long accountId, String account, String oldPwd, String newPwd, String operateIp) {
+		AutoUpdateAccountPwdLog log = new AutoUpdateAccountPwdLog();
+
+		log.setAccountId(accountId);
+		log.setAccount(account);
+		log.setOldPwd(oldPwd);
+		log.setNewPwd(newPwd);
+		log.setOperateLocation(getRealAddressByIP(operateIp));
+		log.setOperateIp(operateIp);
+
+		autoUpdateAccountPwdLogMapper.insert(log);
+	}
+
+	public String getRealAddressByIP(String ip) {
+		if (StrUtil.isBlank(ip)) {
+			return "unknown";
+		}
+		try {
+			String rspStr = HttpUtil.get("http://whois.pconline.com.cn/ipJson.jsp?ip=" + ip + "&json=true");
+			if (StrUtil.isEmpty(rspStr)) {
+				log.error("获取地理位置异常 {}", ip);
+				return "unknown";
+			}
+			JSONObject obj = JSONUtil.parseObj(rspStr);
+			String region = obj.getStr("pro");
+			String city = obj.getStr("city");
+			return String.format("%s %s", region, city);
+		} catch (Exception e) {
+			log.error("获取地理位置异常 {}", ip);
+		}
+
+		return "unknown";
+	}
 }

+ 4 - 1
netflix-web/src/main/java/com/cyksj/config/SaTokenConfigure.java

@@ -35,7 +35,10 @@ public class SaTokenConfigure implements WebMvcConfigurer {
 						"/manage/user/login",
 						"/manage/admin/send/template",
 						"/manage/admin/callback",
-						"/manage/coupon/get/classification"));
+						"/manage/coupon/get/classification",
+						"/manage/account/get/latest/orders",
+						"/manage/account/get/expired/accounts",
+						"/manage/account/put/account"));
 		//注解权限校验
 		registry.addInterceptor(new SaAnnotationInterceptor()).addPathPatterns("/**");
 	}

+ 87 - 2
netflix-web/src/main/java/com/cyksj/web/controller/manage/account/CmsAccountController.java

@@ -5,6 +5,7 @@ import cn.dev33.satoken.stp.StpUtil;
 import cn.hutool.core.date.DateTime;
 import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.util.StrUtil;
+import cn.hutool.extra.servlet.ServletUtil;
 import com.alibaba.excel.EasyExcel;
 import com.alibaba.excel.context.AnalysisContext;
 import com.alibaba.excel.event.AnalysisEventListener;
@@ -21,12 +22,20 @@ import com.cyksj.mapper.HomeGroupMapper;
 import com.cyksj.mapper.UserTicketClearedRecordMapper;
 import com.cyksj.model.entity.*;
 import com.cyksj.model.excel.ExcelImportAccountData;
+import com.cyksj.mapper.UserMapper;
+import com.cyksj.model.entity.Account;
+import com.cyksj.model.entity.GroupsTrips;
+import com.cyksj.model.entity.HomeGroup;
+import com.cyksj.model.entity.User;
+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.model.manage.views.GroupsRelationView;
 import com.cyksj.model.views.GoodsDonSkuView;
 import com.cyksj.model.views.UserTicketClearedRecordView;
+import com.cyksj.model.response.ExpiredAccountRep;
+import com.cyksj.model.response.OrderDonAccountRep;
 import com.cyksj.service.mange.CmsAccountService;
 import com.cyksj.service.mange.CmsGroupService;
 import com.cyksj.service.template.TemplateCommonService;
@@ -76,6 +85,8 @@ public class CmsAccountController {
 
 	private final UserTicketClearedRecordMapper userTicketClearedRecordMapper;
 
+	private final UserMapper userMapper;
+
     @GetMapping("/get")
     @SaCheckPermission("account:view")
     public Result<SearchResult<AccountView>> get(Long userId ,String nickName ,String submitAccount ,String expiryStartTime, String expiryEndTime) {
@@ -177,8 +188,9 @@ public class CmsAccountController {
 							account.setExpiryTime(DateUtil.parse(data.getExpiryTime(), "yyyy-MM-dd HH:mm:ss"));
 							flag = true;
 						}
-						if (StrUtil.isNotBlank(data.getPassword()) && !data.getPassword().equals(account.getPassword())) {
-							account.setPassword(data.getPassword());
+						String new_pass = data.getPassword();
+						if (StrUtil.isNotBlank(new_pass) && !new_pass.trim().equals(account.getPassword())) {
+							account.setPassword(new_pass.trim());
 							flag = true;
 							isUpdatePwd = true;
 							//发放模板消息
@@ -411,4 +423,77 @@ public class CmsAccountController {
 		SearchResult<AccountUpdatePasswordRecord> search = beanSearcher.search(AccountUpdatePasswordRecord.class, MapUtils.flatBuilder(request.getParameterMap()).build());
 		return GatewayResponse.SUCCESS.newBuilder().toResult(search);
 	}
+
+	/**
+	 * 拉取最近购买订单的列表
+	 */
+	@GetMapping("/get/latest/orders")
+	public Result<List<OrderDonAccountRep>> getLatestOrders() {
+		//最近五分钟
+		DateTime offFive = DateUtil.offsetMinute(DateTime.now(), -5);
+		List<OrderDonAccountRep> list = beanSearcher.searchAll(OrderDonAccountRep.class, MapUtils.builder()
+				.put("time", String.format("od.created_time >= '%s'", offFive))
+				.orderBy(ExpiredAccountRep::getAccountId)
+				.orderBy(ExpiredAccountRep::getNum)
+				.build());
+		list.forEach(data->{
+			User user = userMapper.selectById(data.getUserId());
+			data.setNickname(user != null ? user.getNickname() : "");
+		});
+		return GatewayResponse.SUCCESS.newBuilder().toResult(list);
+	}
+
+	/**
+	 * 15天要到期的账号列表
+	 */
+	@GetMapping("/get/expired/accounts")
+	public Result<List<ExpiredAccountRep>> getExpiredAccountsList() {
+		//十五天后
+		DateTime afterFif = DateUtil.offsetDay(DateTime.now(), 15);
+		List<ExpiredAccountRep> list = beanSearcher.searchAll(ExpiredAccountRep.class, MapUtils.builder()
+				.field(ExpiredAccountRep::getExpiredTime, afterFif).op(Operator.LessEqual)
+				.orderBy(ExpiredAccountRep::getAccountId)
+				.orderBy(ExpiredAccountRep::getNum)
+				.build());
+		list.forEach(data->{
+			User user = userMapper.selectById(data.getUserId());
+			data.setNickname(user != null ? user.getNickname() : "");
+		});
+		return GatewayResponse.SUCCESS.newBuilder().toResult(list);
+	}
+
+	/**
+	 * 修改账号密码 并发放模板消息
+	 */
+	@PutMapping("/put")
+	public Result<String> updateAccountPwd(@RequestBody Account accountReq) throws Exception {
+		if (accountReq.getId() == null || StrUtil.isEmpty(accountReq.getPassword())) {
+			return GatewayResponse.FAIL.newBuilder().toResult("缺少必填入参");
+		}
+		Account account = accountService.getById(accountReq.getId());
+		if (account == null) {
+			return GatewayResponse.FAIL.newBuilder().toResult("账号不存在");
+		}
+		Boolean flag = false;
+		String oldPwd = account.getPassword();
+		if (account != null) {
+			if (accountReq.getExpiryTime() != null) {
+				account.setExpiryTime(accountReq.getExpiryTime());
+				flag = true;
+			}
+			String new_pass = accountReq.getPassword();
+			if (StrUtil.isNotBlank(new_pass) && !new_pass.trim().equals(account.getPassword())) {
+				account.setPassword(new_pass.trim());
+				flag = true;
+				//发放模板消息
+				templateCommonService.sendAccountTemplateMsg(account);
+				//记录操作日志
+				accountService.recordAutoUpdatePwd(account.getId(), account.getAccount(), oldPwd, new_pass, ServletUtil.getClientIP(request));
+			}
+			if (flag) {
+				accountService.updateById(account);
+			}
+		}
+		return GatewayResponse.SUCCESS.newBuilder().toResult();
+	}
 }