Sfoglia il codice sorgente

Merge branch 'master' into delete_account

zoujiajian 3 anni fa
parent
commit
4a85d95e17

+ 2 - 0
netflix-common/src/main/java/com/cyksj/common/constant/Constant.java

@@ -101,4 +101,6 @@ public interface Constant {
 	 * 授权扫码登录公众号
 	 */
 	String QR_CODE_WX_APP_ID = "qr_code_wx_app_id";
+
+	String CHANGE_GROUPS_TRIPS_ACCOUNT = "您好,您购买的%s,账号已替换,请登陆网站https://nf.video/查看最新账号密码【银河录像局】";
 }

+ 12 - 0
netflix-common/src/main/java/com/cyksj/common/util/SmsUtil.java

@@ -23,6 +23,8 @@ public class SmsUtil {
 
     private static final String PASSWORD = "key-1bf2a2f243e18be640b2428ddf03ded9";
 
+    private static final String LVSINCO_PASSWORD = "key-246cd85eb5603c3d4924531e5d5c4edc";
+
     private static final String TENCENT_SMS_SECRET_ID = "AKIDBB3jEqR0Y95zpfTix1vd6fMqAIahc4Ka";
 
     private static final String TENCENT_SMS_SECRET_KEY = "c6YtNm63rcQ1QdiGmEbmEPSTPF3e4KQK";
@@ -49,6 +51,16 @@ public class SmsUtil {
         System.out.println(execute.body());
     }
 
+    public static void sendLuoKey2Msg(String mobile, String msg) {
+        HttpRequest request = new HttpRequest(URL);
+        request.setMethod(Method.POST);
+        request.basicAuth("api", LVSINCO_PASSWORD);
+        request.form("mobile", mobile);
+        request.form("message", msg);
+        HttpResponse execute = request.execute();
+        System.out.println(execute.body());
+    }
+
     public static void sendTencent(String mobile, String msg) {
         try {
             /* 必要步骤:

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

@@ -0,0 +1,13 @@
+package com.cyksj.mapper.manage;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.cyksj.model.entity.GroupsTripsAccountReplaceRecord;
+
+/*
+ *项目名: netflix
+ *文件名: GroupsTripsAccountReplaceRecordMapper
+ *创建者: JavaZou
+ *创建时间:2023/5/8 14:00
+ */
+public interface GroupsTripsAccountReplaceRecordMapper extends BaseMapper<GroupsTripsAccountReplaceRecord> {
+}

+ 40 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/GroupsTripsAccountReplaceRecord.java

@@ -0,0 +1,40 @@
+package com.cyksj.model.entity;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.Date;
+
+/*
+ *项目名: netflix
+ *文件名: GroupsTripsAccountReplaceRecord
+ *创建者: JavaZou
+ *创建时间:2023/5/8 13:56
+ */
+@Getter
+@Setter
+public class GroupsTripsAccountReplaceRecord extends BaseEntity{
+	private Long groupsId;
+
+	private Long oldAccountId;
+
+	private String oldAccount;
+
+	private String oldPassword;
+
+	private Date oldStartTime;
+
+	private Date oldExpiryTime;
+
+	private Long newAccountId;
+
+	private String newAccount;
+
+	private String newPassword;
+
+	private Date newStartTime;
+
+	private Date newExpiryTime;
+
+	private String operator;
+}

+ 31 - 0
netflix-dao/src/main/java/com/cyksj/model/request/ReplaceTripsAccountReq.java

@@ -0,0 +1,31 @@
+package com.cyksj.model.request;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import javax.validation.constraints.NotEmpty;
+import javax.validation.constraints.NotNull;
+
+/*
+ *项目名: netflix
+ *文件名: ReplaceTripsAccountReq
+ *创建者: JavaZou
+ *创建时间:2023/5/8 13:35
+ */
+@Getter
+@Setter
+public class ReplaceTripsAccountReq {
+
+	private Long adminId;
+
+	@NotNull(message = "请选择对应车队")
+	private Long groupsId;
+
+	@NotEmpty(message = "替换账号不能为空")
+	private String account;
+
+	@NotEmpty(message = "替换账号密码不能为空")
+	private String password;
+
+	private String remark;
+}

+ 40 - 0
netflix-dao/src/main/java/com/cyksj/model/views/GroupsAccountView.java

@@ -0,0 +1,40 @@
+package com.cyksj.model.views;
+
+import com.ejlchina.searcher.bean.DbField;
+import com.ejlchina.searcher.bean.SearchBean;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.Date;
+
+/*
+ *项目名: netflix
+ *文件名: GroupsAccountView
+ *创建者: JavaZou
+ *创建时间:2023/5/8 13:47
+ */
+@Getter
+@Setter
+@SearchBean(tables = "groups_trips gt left join account a on a.id = gt.account_id")
+public class GroupsAccountView {
+	@DbField("gt.id")
+	private Long groupsId;
+
+	@DbField("gt.account_id")
+	private Long accountId;
+
+	@DbField("a.goods_id")
+	private Long goodsId;
+
+	@DbField("a.account")
+	private String account;
+
+	@DbField("a.password")
+	private String password;
+
+	@DbField("a.start_time")
+	private Date startTime;
+
+	@DbField("a.expiry_time")
+	private Date expiryTime;
+}

+ 3 - 5
netflix-service/src/main/java/com/cyksj/service/mange/CmsGroupService.java

@@ -1,12 +1,8 @@
 package com.cyksj.service.mange;
 
 import com.baomidou.mybatisplus.extension.service.IService;
-import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.cyksj.mapper.GroupsMapper;
 import com.cyksj.model.entity.GroupsTrips;
-import lombok.RequiredArgsConstructor;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.stereotype.Service;
+import com.cyksj.model.request.ReplaceTripsAccountReq;
 
 /**
  * @author chan
@@ -19,4 +15,6 @@ public interface CmsGroupService extends IService<GroupsTrips> {
     void close(Long groupId);
 
     void setAccount(GroupsTrips groupsTrips);
+
+    void replaceTripsAccount(ReplaceTripsAccountReq req);
 }

+ 116 - 0
netflix-service/src/main/java/com/cyksj/service/mange/group/CmsGroupServiceImpl.java

@@ -2,12 +2,23 @@ package com.cyksj.service.mange.group;
 
 import cn.hutool.core.date.DateField;
 import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.cyksj.common.constant.Constant;
 import com.cyksj.common.exception.BusinessRuntimeException;
+import com.cyksj.common.task.GlobalThreadPoolTaskExecutor;
+import com.cyksj.common.util.SmsUtil;
 import com.cyksj.mapper.*;
+import com.cyksj.mapper.manage.GroupsTripsAccountReplaceRecordMapper;
+import com.cyksj.mapper.manage.cms.CmsUserMapper;
+import com.cyksj.mapper.market.task.UserBindDetailMapper;
 import com.cyksj.model.entity.*;
+import com.cyksj.model.request.ReplaceTripsAccountReq;
+import com.cyksj.model.views.GroupsAccountView;
 import com.cyksj.service.mange.CmsGroupService;
+import com.ejlchina.searcher.BeanSearcher;
+import com.ejlchina.searcher.util.MapUtils;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
@@ -34,6 +45,20 @@ public class CmsGroupServiceImpl extends ServiceImpl<GroupsMapper,GroupsTrips> i
 
     private final AccountMapper accountMapper;
 
+    private final BeanSearcher beanSearcher;
+
+    private final GroupsTripsAccountReplaceRecordMapper replaceRecordMapper;
+
+    private final CmsUserMapper cmsUserMapper;
+
+    private final GoodsDonMapper goodsDonMapper;
+
+    private UserBindDetailMapper userBindDetailMapper;
+
+    private final UserMapper userMapper;
+
+    private static final GlobalThreadPoolTaskExecutor TASK_EXECUTOR = GlobalThreadPoolTaskExecutor.getInstance();
+
 
     @Override
     public GroupsTrips issuance(GroupsTrips groups) {
@@ -108,4 +133,95 @@ public class CmsGroupServiceImpl extends ServiceImpl<GroupsMapper,GroupsTrips> i
 
     }
 
+    @Override
+    @Transactional(rollbackFor = Throwable.class)
+    public void replaceTripsAccount(ReplaceTripsAccountReq req) {
+        Long groupsId = req.getGroupsId();
+        String account = req.getAccount().trim();
+        String password = req.getPassword().trim();
+        String remark = req.getRemark();
+        GroupsAccountView groupsAccountView = beanSearcher.searchFirst(GroupsAccountView.class, MapUtils.builder()
+                .field(GroupsAccountView::getGroupsId, groupsId)
+                .build());
+        if (groupsId == null) {
+            throw BusinessRuntimeException.getInstance("车队已不存在");
+        }
+        Long accountId = groupsAccountView.getAccountId();
+        if (accountId == null) {
+            throw BusinessRuntimeException.getInstance("该车队暂未配置账号");
+        }
+        Long goodsId = groupsAccountView.getGoodsId();
+        if (!account.contains("客服")) {
+            int count = accountMapper.selectCount(Wrappers.lambdaQuery(Account.class)
+                    .eq(Account::getAccount, account)
+                    .eq(Account::getGoodsId, goodsId));
+            if (count > 0) {
+                throw BusinessRuntimeException.getInstance("该平台下已生成该账号");
+            }
+        }
+        //新增账号
+        Account replace = new Account();
+        replace.setAccount(account);
+        replace.setPassword(password);
+        replace.setGoodsId(goodsId);
+
+        replace.setStartTime(groupsAccountView.getStartTime());
+        replace.setExpiryTime(groupsAccountView.getExpiryTime());
+        replace.setRemark(remark);
+        accountMapper.insert(replace);
+
+        //替换车队账号
+        this.update(null, Wrappers.lambdaUpdate(GroupsTrips.class)
+                .set(GroupsTrips::getAccountId, replace.getId())
+                .eq(GroupsTrips::getId, groupsId));
+
+        //删除旧的账号
+        accountMapper.deleteById(accountId);
+
+        //保存替换记录
+        GroupsTripsAccountReplaceRecord replaceRecord = new GroupsTripsAccountReplaceRecord();
+        replaceRecord.setGroupsId(groupsId);
+        replaceRecord.setOldAccountId(accountId);
+        replaceRecord.setOldAccount(groupsAccountView.getAccount());
+        replaceRecord.setOldPassword(groupsAccountView.getPassword());
+        replaceRecord.setOldStartTime(groupsAccountView.getStartTime());
+        replaceRecord.setOldExpiryTime(groupsAccountView.getExpiryTime());
+
+        Long adminId = req.getAdminId();
+        Optional.ofNullable(cmsUserMapper.selectById(adminId)).ifPresent(admin -> replaceRecord.setOperator(admin.getNickname()));
+
+        replaceRecord.setNewAccountId(replace.getId());
+        replaceRecord.setNewAccount(replace.getAccount());
+        replaceRecord.setNewPassword(replace.getPassword());
+        replaceRecord.setNewStartTime(replace.getStartTime());
+        replaceRecord.setNewExpiryTime(replace.getExpiryTime());
+
+        replaceRecordMapper.insert(replaceRecord);
+
+        TASK_EXECUTOR.execute(() -> sendChangeAccountMsg(groupsId, goodsId));;
+    }
+
+    private void sendChangeAccountMsg(Long groupsId,Long goodsId) {
+        GoodsDon goodsDon = goodsDonMapper.selectById(goodsId);
+        List<GroupsRelation> groupsRelations = beanSearcher.searchAll(GroupsRelation.class, MapUtils.builder().field(GroupsRelation::getGroupsId, groupsId).build());
+        groupsRelations.forEach(relation->{
+            Long userId = relation.getUserId();
+            User user = userMapper.selectById(userId);
+            String phone = null;
+            if (user != null) {
+                phone = user.getLoginPhone();
+                if (StrUtil.isEmpty(phone)) {
+                    UserBindDetail userBindDetail = userBindDetailMapper.selectById(userId);
+                    if (userBindDetail != null) {
+                        phone = userBindDetail.getPhone();
+                    }
+                }
+            }
+            if (StrUtil.isNotBlank(phone)) {
+                String title = goodsDon != null ? goodsDon.getTitle() : "车票";
+                SmsUtil.sendLuoKey2Msg(phone, String.format(Constant.CHANGE_GROUPS_TRIPS_ACCOUNT, title));
+            }
+
+        });
+    }
 }

+ 24 - 0
netflix-web/src/main/java/com/cyksj/web/controller/manage/group/CmsGroupController.java

@@ -1,6 +1,7 @@
 package com.cyksj.web.controller.manage.group;
 
 import cn.dev33.satoken.annotation.SaCheckPermission;
+import cn.dev33.satoken.stp.StpUtil;
 import cn.hutool.core.bean.BeanUtil;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.cyksj.common.annotation.Log;
@@ -12,7 +13,9 @@ import com.cyksj.enums.GatewayResponse;
 import com.cyksj.mapper.GroupsRelationMapper;
 import com.cyksj.model.entity.Account;
 import com.cyksj.model.entity.GroupsTrips;
+import com.cyksj.model.entity.GroupsTripsAccountReplaceRecord;
 import com.cyksj.model.request.AccountGroupsReq;
+import com.cyksj.model.request.ReplaceTripsAccountReq;
 import com.cyksj.model.views.GoodsDonSkuView;
 import com.cyksj.model.views.GroupsTripsWaitingView;
 import com.cyksj.service.mange.CmsAccountService;
@@ -156,4 +159,25 @@ public class CmsGroupController {
         groupService.setAccount(groupsTrips);
         return GatewayResponse.SUCCESS.newBuilder().toResult("车队配置新账号成功");
     }
+
+
+    /**
+     * 车队替换账号
+     */
+    @PutMapping("/account/replace")
+    public Result<String> replaceTripsAccount(@RequestBody ReplaceTripsAccountReq req) {
+        long adminId = StpUtil.getLoginIdAsLong();
+        req.setAdminId(adminId);
+        groupService.replaceTripsAccount(req);
+        return GatewayResponse.SUCCESS.newBuilder().toResult("车队替换账号成功");
+    }
+
+    /**
+     * 车队替换账号记录
+     */
+    @GetMapping("/get/account/replace/record")
+    public Result<SearchResult<GroupsTripsAccountReplaceRecord>> getAccountReplaceRecord() {
+        SearchResult<GroupsTripsAccountReplaceRecord> search = beanSearcher.search(GroupsTripsAccountReplaceRecord.class, MapUtils.flatBuilder(request.getParameterMap()).build());
+        return GatewayResponse.SUCCESS.newBuilder().toResult(search);
+    }
 }

File diff suppressed because it is too large
+ 0 - 0
netflix-web/src/main/resources/application-prd.yml


Some files were not shown because too many files changed in this diff