Эх сурвалжийг харах

完成后台申诉管理审核操作

huxz 8 жил өмнө
parent
commit
8e84ee50bb

+ 19 - 16
sso-manage-console-web/src/components/accounts/appeals/AppealHome.vue

@@ -166,11 +166,11 @@
           <div class="row">
             <div class="col-lg-6">
               <div class="message-label">新密码</div>
-              <div class="message-value" v-text="selectedAppeal.password">12345</div>
+              <div class="message-value" v-text="selectedAppeal.password"></div>
             </div>
             <div class="col-lg-6">
               <div class="message-label">电子邮箱</div>
-              <div class="message-value" v-text="selectedAppeal.contactEmail">12345</div>
+              <div class="message-value" v-text="selectedAppeal.contactEmail"></div>
             </div>
           </div>
         </div>
@@ -179,17 +179,17 @@
           <div class="row">
             <div class="col-lg-6">
               <div class="message-label">原手机号</div>
-              <div class="message-value" v-text="selectedAppeal.contactEmail">12345</div>
+              <div class="message-value" v-text="selectedAppeal.contactTel"></div>
             </div>
             <div class="col-lg-6">
               <div class="message-label">电子邮箱</div>
-              <div class="message-value" v-text="selectedAppeal.contactEmail">12345</div>
+              <div class="message-value" v-text="selectedAppeal.contactEmail"></div>
             </div>
           </div>
           <div class="row">
             <div class="col-lg-6">
               <div class="message-label">登录密码</div>
-              <div class="message-value" v-text="selectedAppeal.password">12345</div>
+              <div class="message-value" v-text="selectedAppeal.password"></div>
             </div>
           </div>
         </div>
@@ -206,60 +206,60 @@
           <div class="row">
             <div class="col-lg-6">
               <div class="message-label">企业UU</div>
-              <div class="message-value">12345</div>
+              <div class="message-value" v-text="selectedAppeal.spaceUU"></div>
             </div>
             <div class="col-lg-6">
               <div class="message-label">申诉来源</div>
-              <div class="message-value" v-text="selectedAppeal.fromApp || '无'">12345</div>
+              <div class="message-value" v-text="selectedAppeal.fromApp || '无'"></div>
             </div>
           </div>
           <div class="row">
             <div class="col-lg-6">
               <div class="message-label">企业名称</div>
-              <div class="message-value">12345</div>
+              <div class="message-value" v-text="selectedAppeal.spaceName"></div>
             </div>
             <div class="col-lg-6">
               <div class="message-label">法定代表人</div>
-              <div class="message-value">12345</div>
+              <div class="message-value" v-text="selectedAppeal.corporation"></div>
             </div>
           </div>
           <div class="row">
             <div class="col-lg-6">
               <div class="message-label">营业执照号</div>
-              <div class="message-value">12345</div>
+              <div class="message-value" v-text="selectedAppeal.businessCode"></div>
             </div>
             <div class="col-lg-6">
               <div class="message-label">营业执照附件</div>
-              <div class="message-value">12345</div>
+              <div class="message-value" v-text="selectedAppeal.businessCodeImage"></div>
             </div>
           </div>
           <div class="row">
             <div class="col-lg-6" style="width: 840px;">
               <div class="message-label">注册地址</div>
-              <div class="message-value">不同场景索引组件的用法不同,如城市选择的列表,根据城市首个拼音字母进行排列</div>
+              <div class="message-value" v-text="selectedAppeal.regAddress"></div>
             </div>
           </div>
           <!-- 申诉说明 -->
           <div class="row appeal-reason">
             <div class="message-label">申述说明</div>
-            <div class="message-value">不同场景索引组件的用法不同,如城市选择的列表,根据城市首个拼音字母进行排列,当手势下拉列表,该字母置顶,直到该字母下的城市全部滑完;对右边字母索引点击</div>
+            <div class="message-value" v-text="selectedAppeal.description"></div>
           </div>
         </div>
         <div style="border-bottom: 1px solid #E5E5E5;padding: 26px 0;">
           <div class="row">
             <div class="col-lg-6">
               <div class="message-label">管理员UU</div>
-              <div class="message-value">12345</div>
+              <div class="message-value" v-text="selectedAppeal.admin.userUU"></div>
             </div>
           </div>
           <div class="row">
             <div class="col-lg-6">
               <div class="message-label">管理员姓名</div>
-              <div class="message-value">12345</div>
+              <div class="message-value" v-text="selectedAppeal.admin.vipName"></div>
             </div>
             <div class="col-lg-6">
               <div class="message-label">管理员手机号</div>
-              <div class="message-value">12345</div>
+              <div class="message-value" v-text="selectedAppeal.admin.mobile"></div>
             </div>
           </div>
         </div>
@@ -448,6 +448,9 @@
         this.approveType = appeal.type
         const submitInfo = JSON.parse(appeal.submitInfo)
         this.selectedAppeal = _.defaultsDeep({}, appeal, submitInfo)
+        if (appeal.type === 'changeAdmin' && !this.selectedAppeal.admin) {
+          this.selectedAppeal.admin = {}
+        }
         this.isShowDialog = true
 
         console.log(this.selectedAppeal)

+ 2 - 2
sso-manage-console-web/src/components/accounts/enterprises/EnterpriseAdmin.vue

@@ -127,8 +127,8 @@
         this.changeAdminVisible = true
       },
       showRecords () {
-        // TODO 查看更换记录
-        this.$message.info('此功能暂未实现')
+        const routeLocation = {name: 'AppealHome', replace: true}
+        this.$router.push(routeLocation)
       },
       searchAndSelectAdmin () {
         const params = { spaceUU: this.enterprise.spaceUU, key: this.key, keyword: this.keyword }

+ 1 - 0
sso-manage-console-web/src/store/modules/enterprises.js

@@ -1,3 +1,4 @@
+import _ from 'lodash'
 import axios from '@/assets/js/axios'
 import * as types from '../mutation-types'
 

+ 82 - 2
sso-manage-console/src/main/java/com/uas/sso/sso/backend/service/impl/AppealServiceImpl.java

@@ -1,23 +1,31 @@
 package com.uas.sso.sso.backend.service.impl;
 
 import com.uas.sso.dao.AppealDao;
+import com.uas.sso.dao.UserDao;
+import com.uas.sso.dao.UserspaceDao;
 import com.uas.sso.entity.Appeal;
+import com.uas.sso.entity.User;
 import com.uas.sso.entity.Userspace;
 import com.uas.sso.sso.backend.exceptions.ValidationFailedException;
 import com.uas.sso.sso.backend.service.AppealService;
+import com.uas.sso.sso.backend.util.JacksonUtils;
 import java.sql.Timestamp;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
+import java.util.Map;
 import javax.persistence.criteria.CriteriaBuilder;
 import javax.persistence.criteria.CriteriaQuery;
 import javax.persistence.criteria.Predicate;
 import javax.persistence.criteria.Root;
+import javax.validation.constraints.NotNull;
+import org.apache.log4j.Logger;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.domain.Page;
 import org.springframework.data.domain.Pageable;
 import org.springframework.data.jpa.domain.Specification;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.Assert;
 import org.springframework.util.StringUtils;
 
@@ -29,11 +37,26 @@ import org.springframework.util.StringUtils;
 @Service
 public class AppealServiceImpl implements AppealService {
 
+    private static final Logger logger = Logger.getLogger(AppealServiceImpl.class);
+
+    private static final String RESET_PASS = "resetPassword";
+
+    private static final String VALID_MOBILE = "validAccount";
+
+    private static final String CHANGE_ADMIN = "changeAdmin";
+
     private final AppealDao appealDao;
 
+    private final UserDao userDao;
+
+    private final UserspaceDao spaceDao;
+
     @Autowired
-    public AppealServiceImpl(AppealDao appealDao) {
+    public AppealServiceImpl(AppealDao appealDao, UserDao userDao,
+            UserspaceDao spaceDao) {
         this.appealDao = appealDao;
+        this.userDao = userDao;
+        this.spaceDao = spaceDao;
     }
 
     @Override
@@ -78,6 +101,7 @@ public class AppealServiceImpl implements AppealService {
     }
 
     @Override
+    @Transactional(rollbackFor = RuntimeException.class)
     public void approveAppealRequest(Long appealId, Boolean isPass) {
         Assert.notNull(isPass, "审核状态不能为空");
         Appeal appeal = assertAppealExist(appealId);
@@ -87,7 +111,42 @@ public class AppealServiceImpl implements AppealService {
         appeal.setStatus((short) (isPass ? 2 : 3));
         appealDao.save(appeal);
 
-        // TODO 处理对应的用户信息
+        // 审核通过之后,更新用户和企业信息
+        if (isPass) {
+            Map map = JacksonUtils.fromJson(appeal.getSubmitInfo(), Map.class);
+            Assert.notNull(map, "申诉提交信息不能为空");
+
+            if (RESET_PASS.equals(appeal.getType()) || VALID_MOBILE.equals(appeal.getType())) {
+                User user = assertUserExist(appeal.getSubmitterUU());
+                user.setMobile(appeal.getMobile());
+
+                if (RESET_PASS.equals(appeal.getType())) {
+                    String password = (String) map.get("password");
+
+                    if (StringUtils.isEmpty(password) || password.length() < 32) {
+                        throw new ValidationFailedException("重置密码不存在或密码未被加密");
+                    }
+                    user.setPassword(password);
+                }
+                userDao.save(user);
+            } else if (CHANGE_ADMIN.equals(appeal.getType())) {
+                Long spaceUU = ((Integer) map.get("spaceUU")).longValue();
+                Assert.notNull(map, "更换管理员申诉企业UU不能为空");
+
+                Userspace space = assertSpaceExist(spaceUU);
+                User user = userDao.findByMobile(appeal.getMobile());
+                if (user == null) {
+                    throw new ValidationFailedException(
+                            String.format("拥有手机号[%s]的用户不存在", appeal.getMobile()));
+                }
+
+                space.setAdmin(user);
+                space.setAdminUU(user.getUserUU());
+                spaceDao.save(space);
+            } else {
+                logger.info("暂无支持申诉类型");
+            }
+        }
     }
 
     private Appeal assertAppealExist(Long appealId) {
@@ -97,4 +156,25 @@ public class AppealServiceImpl implements AppealService {
         }
         return appeal;
     }
+
+    private User assertUserExist(Long userUU) {
+        User user = userDao.findOne(userUU);
+        if (user == null) {
+            throw new ValidationFailedException(String.format("用户[%d]不存在", userUU));
+        }
+        return user;
+    }
+
+    /**
+     * 业务逻辑校验-企业UU对应企业是否存在
+     *
+     * @param spaceUu   企业UU
+     */
+    private Userspace assertSpaceExist(@NotNull Long spaceUu) {
+        Userspace space = spaceDao.findOne(spaceUu);
+        if (space == null) {
+            throw new ValidationFailedException(String.format("企业[%d]不存在", spaceUu));
+        }
+        return space;
+    }
 }

+ 70 - 0
sso-manage-console/src/main/java/com/uas/sso/sso/backend/util/JacksonUtils.java

@@ -0,0 +1,70 @@
+package com.uas.sso.sso.backend.util;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.JavaType;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import org.apache.log4j.Logger;
+
+/**
+ * JSON 工具类
+ *
+ * @author huxz
+ */
+public final class JacksonUtils {
+
+	private static final Logger logger = Logger.getLogger(JacksonUtils.class);
+
+	private static ObjectMapper objectMapper;
+
+	/**
+	 * 把JSON文本parse为JavaBean
+	 */
+	public static <T> T fromJson(String text, Class<T> clazz) {
+		if (objectMapper == null) {
+			objectMapper = new ObjectMapper();
+		}
+		try {
+			return objectMapper.readValue(text, clazz);
+		} catch (IOException e) {
+		    logger.error(e);
+		}
+		return null;
+	}
+
+	/**
+	 * 把JSON文本parse成JavaBean集合
+	 */
+	public static <T> List<T> fromJsonArray(String text, Class<T> clazz) {
+		if (objectMapper == null) {
+			objectMapper = new ObjectMapper();
+		}
+		JavaType javaType = objectMapper.getTypeFactory().constructParametricType(ArrayList.class, clazz);
+		try {
+			return objectMapper.readValue(text, javaType);
+		} catch (IOException e) {
+            logger.error(e);
+		}
+		return Collections.emptyList();
+	}
+
+	/**
+	 * 将JavaBean序列化为JSON文本
+	 */
+	public static String toJson(Object object) {
+		if (objectMapper == null) {
+			objectMapper = new ObjectMapper();
+		}
+		try {
+			return objectMapper.writeValueAsString(object);
+		} catch (JsonProcessingException e) {
+            logger.error(e);
+		}
+		return null;
+	}
+
+}